From 511bcda179ea3437a0ff9e4106e4782aabf5f38f Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Tue, 14 Jun 2022 11:46:46 +0200 Subject: [PATCH 01/43] Update docker image version. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c2d264e8..7b751b9cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: - '8.14' ocaml_version: - '4.07-flambda' - - '4.12-flambda' + - '4.14-flambda' target: [ local, opam, quick ] fail-fast: true From 1610c2d9382f9139fe238f41ecd747861968f260 Mon Sep 17 00:00:00 2001 From: Arthur Adjedj Date: Tue, 14 Jun 2022 15:12:51 +0200 Subject: [PATCH 02/43] Remove mutual inductiveness from whne def (#711) * Fix : Remove mutual inductiveness from whne def --- pcuic/theories/PCUICNormal.v | 37 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/pcuic/theories/PCUICNormal.v b/pcuic/theories/PCUICNormal.v index 990faf564..f0121c2e1 100644 --- a/pcuic/theories/PCUICNormal.v +++ b/pcuic/theories/PCUICNormal.v @@ -39,24 +39,7 @@ Section Normal. Context (flags : RedFlags.t). Context (Σ : global_env). - (* Relative to reduction flags *) - Inductive whnf (Γ : context) : term -> Type := - | whnf_ne t : whne Γ t -> whnf Γ t - | whnf_sort s : whnf Γ (tSort s) - | whnf_prod na A B : whnf Γ (tProd na A B) - | whnf_lam na A B : whnf Γ (tLambda na A B) - | whnf_cstrapp i n u v : whnf Γ (mkApps (tConstruct i n u) v) - | whnf_indapp i u v : whnf Γ (mkApps (tInd i u) v) - | whnf_fixapp mfix idx v : - match unfold_fix mfix idx with - | Some (rarg, body) => nth_error v rarg = None - | None => True - end -> - whnf Γ (mkApps (tFix mfix idx) v) - | whnf_cofixapp mfix idx v : whnf Γ (mkApps (tCoFix mfix idx) v) - (* | whnf_prim p : whnf Γ (tPrim p) *) - - with whne (Γ : context) : term -> Type := + Inductive whne (Γ : context) : term -> Type := | whne_rel i : option_map decl_body (nth_error Γ i) = Some None -> whne Γ (tRel i) @@ -119,6 +102,24 @@ Section Normal. RedFlags.iota flags = false -> whne Γ (tProj p c). + + (* Relative to reduction flags *) + Inductive whnf (Γ : context) : term -> Type := + | whnf_ne t : whne Γ t -> whnf Γ t + | whnf_sort s : whnf Γ (tSort s) + | whnf_prod na A B : whnf Γ (tProd na A B) + | whnf_lam na A B : whnf Γ (tLambda na A B) + | whnf_cstrapp i n u v : whnf Γ (mkApps (tConstruct i n u) v) + | whnf_indapp i u v : whnf Γ (mkApps (tInd i u) v) + | whnf_fixapp mfix idx v : + match unfold_fix mfix idx with + | Some (rarg, body) => nth_error v rarg = None + | None => True + end -> + whnf Γ (mkApps (tFix mfix idx) v) + | whnf_cofixapp mfix idx v : whnf Γ (mkApps (tCoFix mfix idx) v) + (* | whnf_prim p : whnf Γ (tPrim p) *). + Lemma whne_mkApps : forall Γ t args, whne Γ t -> From 74b9db2f96606eca2bb5523d672d7f4f32c51d47 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 17 Jun 2022 10:12:34 +0200 Subject: [PATCH 03/43] Fill one admitted proof in Firstorder, remove dead code --- pcuic/theories/PCUICCanonicity.v | 197 ------------------- pcuic/theories/PCUICExchange.v | 260 ------------------------- pcuic/theories/PCUICFirstorder.v | 179 +++++++++++++---- safechecker/theories/PCUICSafeReduce.v | 128 ------------ template-coq/theories/common/uGraph.v | 40 ---- 5 files changed, 143 insertions(+), 661 deletions(-) delete mode 100644 pcuic/theories/PCUICExchange.v diff --git a/pcuic/theories/PCUICCanonicity.v b/pcuic/theories/PCUICCanonicity.v index 56b1e9ace..f852089a4 100644 --- a/pcuic/theories/PCUICCanonicity.v +++ b/pcuic/theories/PCUICCanonicity.v @@ -556,205 +556,8 @@ Qed. - subst concl; eapply typing_spine_more_inv in sp; try lia. Qed. - (* Lemma app_fix_prod_indarg Σ mfix idx args na dom codom decl : - wf Σ.1 -> - Σ ;;; [] |- mkApps (tFix mfix idx) args : tProd na dom codom -> - nth_error mfix idx = Some decl -> - #|args| = decl.(rarg) -> - ∑ ind u indargs, dom = mkApps (tInd ind u) indargs * - isType Σ [] (mkApps (tInd ind u) indargs) * - (check_recursivity_kind Σ.1 (inductive_mind ind) Finite). - Proof. - intros wfΣ tapp. - eapply inversion_mkApps in tapp as [A [Hfix Hargs]]; eauto. - eapply inversion_Fix in Hfix;eauto. - destruct Hfix as [decl [fixg [Hnth [Hist [_ [wf cum]]]]]]. - rewrite /wf_fixpoint in wf. *) - End Spines. -(* -Section Normalization. - Context {cf:checker_flags} (Σ : global_env_ext). - Context {wfΣ : wf Σ}. - - Section reducible. - Lemma reducible Γ t : sum (∑ t', red1 Σ Γ t t') (forall t', red1 Σ Γ t t' -> False). - Proof. - Local Ltac lefte := left; eexists; econstructor; eauto. - Local Ltac leftes := left; eexists; econstructor; solve [eauto]. - Local Ltac righte := right; intros t' red; depelim red; solve_discr; eauto 2. - induction t in Γ |- * using term_forall_list_ind. - (*all:try solve [righte]. - - destruct (nth_error Γ n) eqn:hnth. - destruct c as [na [b|] ty]; [lefte|righte]. - * rewrite hnth; reflexivity. - * rewrite hnth /= // in e. - * righte. rewrite hnth /= // in e. - - admit. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 (Γ ,, vass n t1)) as [[? ?]|]; [|righte]. - leftes. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 (Γ ,, vass n t1)) as [[? ?]|]; [|righte]. - leftes. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt3 (Γ ,, vdef n t1 t2)) as [[? ?]|]; [|]. - leftes. lefte. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 Γ) as [[? ?]|]; [leftes|]. - destruct (PCUICParallelReductionConfluence.view_lambda_fix_app t1 t2). - * rewrite [tApp _ _](mkApps_app _ _ [a]). - destruct (unfold_fix mfix i) as [[rarg body]|] eqn:unf. - destruct (is_constructor rarg (l ++ [a])) eqn:isc; [leftes|]; eauto. - right => t' red; depelim red; solve_discr; eauto. - rewrite mkApps_app in H. noconf H. eauto. - rewrite mkApps_app in H. noconf H. eauto. - eapply (f_equal (@length _)) in H1. rewrite /= app_length /= // in H1; lia. - eapply (f_equal (@length _)) in H1. rewrite /= app_length /= // in H1; lia. - righte; try (rewrite mkApps_app in H; noconf H); eauto. - eapply (f_equal (@length _)) in H1. rewrite /= app_length /= // in H1; lia. - eapply (f_equal (@length _)) in H1. rewrite /= app_length /= // in H1; lia. - * admit. - * righte. destruct args using rev_case; solve_discr; noconf H. - rewrite H in i. eapply negb_False; eauto. - rewrite mkApps_app; eapply isFixLambda_app_mkApps' => //. - - admit. - - admit. - - admit. - - admit. - - admit.*) - - Qed. - End reducible. - - Lemma reducible' Γ t : sum (∑ t', red1 Σ Γ t t') (normal Σ Γ t). - Proof. - Ltac lefte := left; eexists; econstructor; eauto. - Ltac leftes := left; eexists; econstructor; solve [eauto]. - Ltac righte := right; (solve [repeat (constructor; eauto)])||(repeat constructor). - induction t in Γ |- * using term_forall_list_ind. - all:try solve [righte]. - - destruct (nth_error Γ n) eqn:hnth. - destruct c as [na [b|] ty]; [lefte|]. - * rewrite hnth; reflexivity. - * right. do 2 constructor; rewrite hnth /= //. - * righte. rewrite hnth /= //. - - admit. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 (Γ ,, vass n t1)) as [[? ?]|]; [|]. - leftes. right; solve[constructor; eauto]. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 (Γ ,, vass n t1)) as [[? ?]|]; [leftes|leftes]. - - destruct (IHt1 Γ) as [[? ?]|]; [lefte|]. - destruct (IHt2 Γ) as [[? ?]|]; [leftes|]. - destruct (PCUICParallelReductionConfluence.view_lambda_fix_app t1 t2). - * rewrite [tApp _ _](mkApps_app _ _ [a]). - destruct (unfold_fix mfix i) as [[rarg body]|] eqn:unf. - destruct (is_constructor rarg (l ++ [a])) eqn:isc; [leftes|]; eauto. - right; constructor. rewrite mkApps_app. constructor. admit. admit. admit. - * admit. - * admit. - - admit. - - admit. - - admit. - - admit. - - admit. - Qed. - - Lemma normalizer {Γ t ty} : - Σ ;;; Γ |- t : ty -> - ∑ nf, (red Σ.1 Γ t nf) * normal Σ Γ nf. - Proof. - intros Hty. - unshelve epose proof (PCUICSN.normalisation Σ Γ t (iswelltyped _ _ _ ty Hty)). - clear ty Hty. - move: t H. eapply Fix_F. - intros x IH. - destruct (reducible' Γ x) as [[t' red]|nred]. - specialize (IH t'). forward IH by (constructor; auto). - destruct IH as [nf [rednf norm]]. - exists nf; split; auto. now transitivity t'. - exists x. split; [constructor|assumption]. - Qed. - - Derive Signature for neutral normal. - - Lemma typing_var {Γ n ty} : Σ ;;; Γ |- (tVar n) : ty -> False. - Proof. intros Hty; depind Hty; eauto. Qed. - - Lemma typing_evar {Γ n l ty} : Σ ;;; Γ |- (tEvar n l) : ty -> False. - Proof. intros Hty; depind Hty; eauto. Qed. - - Definition axiom_free Σ := - forall c decl, declared_constant Σ c decl -> cst_body decl <> None. - - Lemma neutral_empty t ty : axiom_free Σ -> Σ ;;; [] |- t : ty -> neutral Σ [] t -> False. - Proof. - intros axfree typed ne. - pose proof (PCUICClosed.subject_closed wfΣ typed) as cl. - depind ne. - - now simpl in cl. - - now eapply typing_var in typed. - - now eapply typing_evar in typed. - - eapply inversion_Const in typed as [decl [wfd [declc [cu cum]]]]; eauto. - specialize (axfree _ _ declc). specialize (H decl). - destruct (cst_body decl); try congruence. - now specialize (H t declc eq_refl). - - simpl in cl; move/andP: cl => [clf cla]. - eapply inversion_App in typed as [na [A [B [Hf _]]]]; eauto. - - simpl in cl; move/andP: cl => [/andP[_ clc] _]. - eapply inversion_Case in typed; pcuicfo eauto. - - eapply inversion_Proj in typed; pcuicfo auto. - Qed. - - Lemma ind_normal_constructor t i u args : - axiom_free Σ -> - Σ ;;; [] |- t : mkApps (tInd i u) args -> normal Σ [] t -> construct_cofix_discr (head t). - Proof. - intros axfree Ht capp. destruct capp. - - eapply neutral_empty in H; eauto. - - eapply inversion_Sort in Ht as (? & ? & ? & ? & ?); auto. - eapply ws_cumul_pb_Sort_l_inv in c as (? & ? & ?). - eapply invert_red_mkApps_tInd in r as (? & eq & ?); eauto; eauto. - solve_discr. - - eapply inversion_Prod in Ht as (? & ? & ? & ? & ?); auto. - eapply ws_cumul_pb_Sort_l_inv in c as (? & ? & ?). - eapply invert_red_mkApps_tInd in r as (? & eq & ?); eauto; eauto. - solve_discr. - - eapply inversion_Lambda in Ht as (? & ? & ? & ? & ?); auto. - eapply ws_cumul_pb_Prod_l_inv in c as (? & ? & ? & (? & ?) & ?); auto. - eapply invert_red_mkApps_tInd in r as (? & eq & ?); eauto; eauto. - solve_discr. - - now rewrite head_mkApps /= /head /=. - - eapply PCUICValidity.inversion_mkApps in Ht as (? & ? & ?); auto. - eapply inversion_Ind in t as (? & ? & ? & decli & ? & ?); auto. - eapply PCUICSpine.typing_spine_strengthen in t0; eauto. - pose proof (on_declared_inductive wfΣ as decli) [onind oib]. - rewrite oib.(ind_arity_eq) in t0. - rewrite !subst_instance_it_mkProd_or_LetIn in t0. - eapply typing_spine_arity_mkApps_Ind in t0; eauto. - eexists; split; [sq|]; eauto. - now do 2 eapply isArity_it_mkProd_or_LetIn. - - admit. (* wf of fixpoints *) - - now rewrite /head /=. - Qed. - - Lemma red_normal_constructor t i u args : - axiom_free Σ -> - Σ ;;; [] |- t : mkApps (tInd i u) args -> - ∑ hnf, (red Σ.1 [] t hnf) * construct_cofix_discr (head hnf). - Proof. - intros axfree Ht. destruct (normalizer Ht) as [nf [rednf capp]]. - exists nf; split; auto. - eapply subject_reduction in Ht; eauto. - now eapply ind_normal_constructor. - Qed. - -End Normalization. -*) - (** Evaluation is a subrelation of reduction: *) Tactic Notation "redt" uconstr(y) := eapply (CRelationClasses.transitivity (R:=red _ _) (y:=y)). diff --git a/pcuic/theories/PCUICExchange.v b/pcuic/theories/PCUICExchange.v deleted file mode 100644 index 4c028d39a..000000000 --- a/pcuic/theories/PCUICExchange.v +++ /dev/null @@ -1,260 +0,0 @@ - -(* Distributed under the terms of the MIT license. *) -From Coq Require Import Morphisms. -From MetaCoq.Template Require Import config utils. -From MetaCoq.PCUIC Require Import PCUICAst PCUICAstUtils PCUICCases PCUICInduction - PCUICLiftSubst PCUICUnivSubst PCUICEquality PCUICTyping PCUICWeakeningEnv - PCUICClosed PCUICReduction PCUICPosition PCUICGeneration - PCUICSigmaCalculus PCUICRename PCUICOnFreeVars. - -Require Import ssreflect ssrbool. -From Equations Require Import Equations. - -Implicit Types cf : checker_flags. - -(* l, r, p -> r, l, p *) -Definition exchange_renaming l r p := - fun i => - if p <=? i then - if p + r <=? i then - if p + r + l <=? i then i - else i - r - else i + l - else i. - -Variant exchange_renaming_spec l r p i : nat -> Type := -| exch_below : i < p -> exchange_renaming_spec l r p i i -| exch_right : p <= i < p + r -> exchange_renaming_spec l r p i (i + l) -| exch_left : p + r <= i < p + r + l -> exchange_renaming_spec l r p i (i - r) -| exch_above : p + r + l <= i -> exchange_renaming_spec l r p i i. - -Lemma exchange_renamingP l r p i : - exchange_renaming_spec l r p i (exchange_renaming l r p i). -Proof. - unfold exchange_renaming. - case: leb_spec_Set; [|constructor; auto]. - elim: leb_spec_Set; [|constructor; auto]. - elim: leb_spec_Set; [|constructor; auto]. - intros. - constructor 4; auto. -Qed. - -Lemma shiftn_exchange_renaming n l r p : - shiftn n (exchange_renaming l r p) =1 - exchange_renaming l r (n + p). -Proof. - intros i. - case: exchange_renamingP. - * case: shiftnP; try lia. - case: exchange_renamingP; lia. - * case: shiftnP; try lia. - case: exchange_renamingP; lia. - * case: shiftnP; try lia. - case: exchange_renamingP; lia. - * case: shiftnP; try lia. - case: exchange_renamingP; lia. -Qed. - -Lemma exchange_renaming_lift_renaming l r p i k : - i < p -> - exchange_renaming l r p (lift_renaming (S i) 0 k) = - lift_renaming (S i) 0 - (shiftn (p - S i) (exchange_renaming l r 0) k). -Proof. - intros ip. - rewrite shiftn_exchange_renaming. - rewrite /lift_renaming /=. - case: exchange_renamingP; try lia; intros Hp. - all: case: exchange_renamingP; lia. -Qed. - -Definition exchange_contexts Γ Γl Γr Δ := - (Γ ,,, rename_context (strengthen 0 #|Γl|) Γr ,,, - rename_context (lift_renaming #|Γr| 0) Γl ,,, - rename_context (exchange_renaming #|Γl| #|Γr| 0) Δ). - -Definition exchange_rename Γl Γr Δ i := - if Δ <=? i then - if Δ + Γr <=? i then - if Δ + Γr + Γl <=? i then ren_id - else (lift_renaming Γr (Γl - S (i - Γr - Δ))) - else (shiftn (Γr - S (i - Δ)) (strengthen 0 Γl)) - else (exchange_renaming Γl Γr (Δ - S i)). - -Lemma lookup_exchange_contexts Γ Γl Γr Δ i : - nth_error (exchange_contexts Γ Γl Γr Δ) (exchange_renaming #|Γl| #|Γr| #|Δ| i) = - option_map (map_decl (rename (exchange_rename #|Γl| #|Γr| #|Δ| i))) - (nth_error (Γ ,,, Γl,,, Γr,,, Δ) i). -Proof. - rewrite /exchange_renaming /exchange_contexts /exchange_rename. - case: (leb_spec_Set #|Δ| i) => hΔ. - * case: leb_spec_Set => hΓr. - + case: leb_spec_Set => hΓl. - - do 6 (rewrite nth_error_app_ge; len; try lia => //). - assert (i - #|Δ| - #|Γl| - #|Γr| = i - #|Δ| - #|Γr| - #|Γl|) as -> by lia. - now rewrite rename_ren_id map_decl_id option_map_id. - - rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_rename_context. - assert (i - #|Δ| - #|Γr| = i - #|Γr| - #|Δ|) as -> by lia. - apply option_map_ext => //. - intros d. apply map_decl_ext => t. - now rewrite shiftn_lift_renaming Nat.add_0_r. - + rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_app_ge; len; try lia => //. - rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_rename_context. - assert (i + #|Γl| - #|Δ| - #|Γl| = i - #|Δ|) as -> by lia. - reflexivity. - * rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_app_lt; len; try lia => //. - rewrite nth_error_rename_context. - now rewrite shiftn_exchange_renaming Nat.add_0_r. -Qed. - -(* -Lemma exchange_renaming_add Γl Γr Δ n : - exchange_renaming Γl Γr Δ n = n + exchange_renaming Γl Γr Δ 0. -Proof. - case: exchange_renamingP; case: exchange_renamingP; simpl; try lia. - - intros. - *) - -Lemma exchange_rename_Δ Γl Γr Δ i (k : nat) : - (* noccur_between_ctx 0 Γl Γr -> *) - i < Δ -> - (* From the i-prefix of Γ Γl Γr Δ to Γ Γr Γl Δ *) - exchange_renaming Γl Γr Δ (S i + k) = - S (i + exchange_renaming Γl Γr (Δ - S i) k). -Proof. - rewrite /exchange_renaming. - repeat nat_compare_specs; lia. -Qed. - -Lemma exchange_rename_Γr Γl Γr Δ i (k : nat) : - (* noccur_between_ctx 0 Γl Γr -> *) - Δ <= i < Δ + Γr -> - k < Γr - S (i - Δ) \/ Γr - S (i - Δ) + Γl <= k -> - (* From the i-prefix of Γ Γl Γr Δ to Γ Γr Γl Δ *) - exchange_renaming Γl Γr Δ (S i + k) = - S (i + Γl + strengthen (Γr - S (i - Δ)) Γl k). -Proof. - rewrite /exchange_renaming /strengthen. - repeat nat_compare_specs. -Qed. -(* -Lemma exchange_rename_Γl Γl Γr Δ i (k : nat) : - (* noccur_between_ctx 0 Γl Γr -> *) - Δ + Γr <= i < Δ + Γr + Γl -> - (* From the i-prefix of Γ Γl Γr Δ to Γ Γr Γl Δ *) - exchange_renaming Γl Γr Δ (S i + k) = - S (i + exchange_renaming Γl Γr (Δ - S i) k). -Proof. - rewrite /exchange_renaming. - repeat nat_compare_specs; lia. -Qed. *) - - -Lemma exchange_lift_rename {Γ Γl Γr Δ : context} {i d} : - noccur_between_ctx 0 #|Γl| Γr -> - nth_error (Γ,,, Γl,,, Γr,,, Δ) i = Some d -> - rename_decl (fun k => exchange_renaming #|Γl| #|Γr| #|Δ| (S (i + k))) d = - rename_decl (fun k => S (exchange_renaming #|Γl| #|Γr| #|Δ| i + exchange_rename #|Γl| #|Γr| #|Δ| i k)) d. -Proof. - intros nocc hlen. - move: hlen. - case: lookup_declP => // d' Hi hnth [=]; intros ->; [|move: hnth; len in Hi]. - { apply map_decl_ext, rename_ext => k. - rewrite {2}/exchange_renaming /exchange_rename. nat_compare_specs. - now apply exchange_rename_Δ. } - case: lookup_declP => // d' Hi' hnth [=]; intros ->; [|move: hnth; len in Hi']. - { eapply nth_error_noccur_between_ctx in nocc; eauto. - simpl in nocc. move: nocc. - apply rename_decl_ext_cond => k Hk. - rewrite {2}/exchange_renaming /exchange_rename. - repeat nat_compare_specs. - rewrite shiftn_strengthen_rel Nat.add_0_r //. - now rewrite exchange_rename_Γr. } - case: lookup_declP => // d' Hi'' hnth [=]; intros ->; [|move: hnth; len in Hi'']. - { apply map_decl_ext, rename_ext => k. - rewrite /exchange_renaming /exchange_rename /lift_renaming; - repeat nat_compare_specs. } - { move/nth_error_Some_length => hlen. - apply map_decl_ext, rename_ext => k. - rewrite /exchange_renaming /exchange_rename; repeat nat_compare_specs. - now unfold ren_id. } -Qed. - -Lemma exchange_urenaming P Γ Γl Γr Δ : - noccur_between_ctx 0 #|Γl| Γr -> - urenaming P - (exchange_contexts Γ Γl Γr Δ) - (Γ ,,, Γl ,,, Γr ,,, Δ) - (exchange_renaming #|Γl| #|Γr| #|Δ|). -Proof. - intros nocc i d hpi hnth. - rewrite lookup_exchange_contexts hnth => /=. - eexists; split; eauto. - pose proof (exchange_lift_rename nocc hnth). - rewrite !rename_compose /lift_renaming /=. - destruct d as [na [b|] ty]; noconf H; simpl in *. - - split => //. - split => //. - f_equal. - rewrite !rename_compose. - rewrite /lift_renaming /= //. - - split => //. -Qed. - - -Lemma exchange_wf_local {cf: checker_flags} {Σ : global_env_ext} {wfΣ : wf Σ} {Γ Γl Γr Δ} : - noccur_between_ctx 0 #|Γl| Γr -> - wf_local Σ (Γ ,,, Γl ,,, Γr ,,, Δ) -> - wf_local Σ (exchange_contexts Γ Γl Γr Δ). -Proof. - intros nocc wf. - pose proof (env_prop_wf_local _ _ typing_rename_prop _ wfΣ _ wf). - simpl in X. rewrite /exchange_contexts. - eapply All_local_env_app_inv in X as [XΓ XΓ']. - apply wf_local_app_ind => //. - - rewrite rename_context_lift_context /strengthen /=. - eapply weakening_wf_local_eq; eauto with wf. - * admit. - * now len. - - intros wfstr. - apply All_local_env_fold. - eapply (All_local_env_impl_ind XΓ'). - intros Δ' t [T|] IH; unfold lift_typing; simpl. - * intros Hf. red. - eapply meta_conv_all. 2: reflexivity. - 2-3:now rewrite shiftn_exchange_renaming. - apply Hf. split. - + apply wf_local_app; auto. - apply All_local_env_fold in IH. apply IH. - + setoid_rewrite shiftn_exchange_renaming. apply exchange_urenaming. - - intros [s Hs]; exists s. red. - rewrite -/(lift_context #|Γ''| 0 Δ). - rewrite Nat.add_0_r !lift_rename. apply Hs. - split. - + apply wf_local_app; auto. - apply All_local_env_fold in IH. apply IH. - + apply (weakening_renaming Γ Δ Γ''). -Qed. - -Lemma exchange_typing `{cf : checker_flags} {Σ : global_env_ext} {wfΣ : wf Σ} {Γ Γ' Γ''} {t T} : - wf_local Σ (Γ ,,, Γ'') -> - Σ ;;; Γ ,,, Γ' |- t : T -> - Σ ;;; Γ ,,, Γ'' ,,, lift_context #|Γ''| 0 Γ' |- lift #|Γ''| #|Γ'| t : lift #|Γ''| #|Γ'| T. -Proof. - intros wfext Ht. - rewrite !lift_rename. - eapply (env_prop_typing _ _ typing_rename_prop); eauto. - split. - - eapply weakening_wf_local; eauto with pcuic. - - now apply weakening_renaming. -Qed. diff --git a/pcuic/theories/PCUICFirstorder.v b/pcuic/theories/PCUICFirstorder.v index 3c466a053..6bda76a50 100644 --- a/pcuic/theories/PCUICFirstorder.v +++ b/pcuic/theories/PCUICFirstorder.v @@ -66,14 +66,13 @@ Section firstorder. Definition firstorder_mutind (mind : mutual_inductive_body) := (* if forallb (fun decl => firstorder_type decl.(decl_type)) mind.(ind_params) then *) + (mind.(ind_finite) == Finite) && forallb (firstorder_oneind mind) mind.(ind_bodies) (* else repeat false (length mind.(ind_bodies)). *). Definition firstorder_ind (i : inductive) := match lookup_env Σ.1 (inductive_mind i) with - | Some (InductiveDecl mind) => - check_recursivity_kind (lookup_env Σ) (inductive_mind i) Finite && - firstorder_mutind mind + | Some (InductiveDecl mind) => firstorder_mutind mind | _ => false end. @@ -145,11 +144,12 @@ Proof using Type. red. sq. unfold PCUICEnvironment.fst_ctx in *. rewrite d1 in H |- *. solve_all. - unfold firstorder_mutind in H0. - rewrite d2. eapply forallb_nth_error in H0; tea. + unfold firstorder_mutind in H. + rewrite d2. move/andP: H => [ind H0]. + eapply forallb_nth_error in H0; tea. erewrite d2 in H0. cbn in H0. unfold firstorder_oneind in H0. solve_all. - destruct (ind_sort oind) eqn:E2; inv H1. + destruct (ind_sort oind) eqn:E2; inv H0. eapply PCUICInductives.declared_inductive_type in d. rewrite d. rewrite E2. now rewrite destArity_it_mkProd_or_LetIn. @@ -262,36 +262,43 @@ Proof using Type. move=> n. destruct a; cbn. f_equal. apply hp. apply IHΓ. Qed. -Lemma plookup_env_lookup_env Σ kn b : +Arguments firstorder_mutind : clear implicits. + +Lemma plookup_env_lookup_env {Σ : global_env_ext} kn b : plookup_env (firstorder_env Σ) kn = Some b -> - ∑ decl, lookup_env Σ kn = Some decl × + ∑ Σ' decl, lookup_env Σ kn = Some decl × + extends_decls Σ' Σ × match decl with | ConstantDecl _ => b = false | InductiveDecl mind => - b = check_recursivity_kind (lookup_env Σ) kn Finite && - firstorder_mutind (Σb := firstorder_env Σ) mind + b = firstorder_mutind (firstorder_env' (declarations Σ')) mind end. Proof using. destruct Σ as [[univs Σ] ext]. induction Σ; cbn => //. destruct a as [kn' d] => //. cbn. case: eqb_specT. - * intros ->. eexists; split => //. - destruct d => //. cbn in H. rewrite eqb_refl in H. congruence. admit. - (* intros neq h. specialize (IHΣ h) as [decl [Hdecl ?]]. - eexists; split => //. exact Hdecl. - destruct decl => //. cbn. - rewrite /lookup_env /=. rewrite y. f_equal. - unfold check_recursivity_kind. case: eqb_spec => //. - unfold firstorder_mutind. unfold firstorder_oneind. - eapply forallb_ext. intros x. f_equal. - eapply forallb_ext. intros cstr. unfold firstorder_con. - eapply alli_ext => i' [] => /= _ _ ty. - unfold firstorder_type. - admit. - - cbn. -*) -Admitted. + * intros ->. + destruct d => //; cbn; rewrite eqb_refl => [=] <-; + exists {| universes := univs; declarations := Σ |}. + eexists; split => //. cbn. split => //. + red. split => //. eexists (_ :: []); cbn; trea. + eexists; split => //. cbn; split => //. + red. split => //. eexists (_ :: []); cbn; trea. + * intros neq h. + destruct d => //. cbn in h. + move: h. case: eqb_specT=> // _ h'. + unfold firstorder_env in IHΣ. cbn in IHΣ. + specialize (IHΣ h') as [Σ' [decl [Hdecl [ext' ?]]]]. + exists Σ', decl; split => //. split => //. + destruct ext' as [equ [Σ'' eq]]. split => //. + eexists (_ :: Σ''). cbn in *. rewrite eq. trea. + move: h. cbn. apply neqb in neq. rewrite (negbTE neq). + intros h'; specialize (IHΣ h') as [Σ' [decl [Hdecl [ext' ?]]]]. + exists Σ', decl; split => //. split => //. + destruct ext' as [equ [Σ'' eq]]. split => //. + eexists (_ :: Σ''). cbn in *. rewrite eq. trea. +Qed. Lemma firstorder_spine_let {Σ : global_env_ext} {wfΣ : wf Σ} {Γ na a A B args T'} : firstorder_spine Σ Γ (B {0 := a}) args T' -> @@ -329,6 +336,101 @@ Proof using Type. now eapply isType_ws_cumul_pb_refl. eauto. Qed. +Arguments firstorder_type : clear implicits. + +(* Lemma firstorder_env'_app x y : + firstorder_env' (x ++ y) = firstorder_env' x ++ firstorder_env' y. +Proof. + induction x in y |- *; cbn => //. + destruct a => //. destruct g => //. cbn. f_equal; eauto. + cbn; f_equal; eauto. + f_equal. f_equal. eauto. *) + +Import PCUICGlobalMaps. + +Lemma fresh_global_app decls decls' kn : + fresh_global kn (decls ++ decls') -> + fresh_global kn decls /\ fresh_global kn decls'. +Proof. + induction decls => /= //. + - intros f; split => //. + - intros f; depelim f. + specialize (IHdecls f) as []. + split; eauto. constructor => //. +Qed. + +Lemma plookup_env_Some_not_fresh g kn b : + plookup_env (firstorder_env' g) kn = Some b -> + ~ PCUICGlobalMaps.fresh_global kn g. +Proof. + induction g; cbn => //. + destruct a => //. destruct g0 => //. + - cbn. + case: eqb_spec. + + move=> -> [=]. + intros neq hf. depelim hf. now cbn in H. + + move=> neq hl hf. + apply IHg => //. now depelim hf. + - cbn. + case: eqb_spec. + + move=> -> [=]. + intros neq hf. depelim hf. now cbn in H. + + move=> neq hl hf. + apply IHg => //. now depelim hf. +Qed. + +Lemma plookup_env_extends {Σ Σ' : global_env} kn b : + extends_decls Σ' Σ -> + wf Σ -> + plookup_env (firstorder_env' (declarations Σ')) kn = Some b -> + plookup_env (firstorder_env' (declarations Σ)) kn = Some b. +Proof. + intros [equ [Σ'' eq]]. rewrite eq. + clear equ. intros []. clear o. + rewrite eq in o0. clear eq. move: o0. + generalize (declarations Σ'). clear Σ'. + induction Σ''. + - cbn => //. + - cbn. destruct a => //. intros gs ong. + depelim ong. specialize (IHΣ'' _ ong). + destruct g => //. + * intros hl. specialize (IHΣ'' hl). + eapply plookup_env_Some_not_fresh in hl. + cbn. case: eqb_spec. + + intros <-. apply fresh_global_app in f as []. + contradiction. + + now intros neq. + * intros hl. specialize (IHΣ'' hl). + eapply plookup_env_Some_not_fresh in hl. + cbn. case: eqb_spec. + + intros <-. apply fresh_global_app in f as []. + contradiction. + + now intros neq. +Qed. + +Lemma firstorder_mutind_ext {Σ Σ' : global_env_ext} m : + extends_decls Σ' Σ -> + wf Σ -> + firstorder_mutind (firstorder_env' (declarations Σ')) m -> + firstorder_mutind (firstorder_env Σ) m. +Proof. + intros [equ [Σ'' eq]] wf. + unfold firstorder_env. rewrite eq. + unfold firstorder_mutind. + move/andP => [] -> /=. apply forallb_impl => x _. + unfold firstorder_oneind. + move/andP => [] h -> /=; rewrite andb_true_r. + eapply forallb_impl; tea => c _. + unfold firstorder_con. + eapply alli_impl => i [] _ _ ty. + unfold firstorder_type. + destruct decompose_app => // /=. + destruct t => //. destruct ind => //. + destruct plookup_env eqn:hl => //. destruct b => //. + eapply (plookup_env_extends (Σ:=Σ)) in hl. 2:split; eauto. + rewrite eq in hl. rewrite hl //. apply wf. +Qed. + Lemma firstorder_args {Σ : global_env_ext} {wfΣ : wf Σ} { mind cbody i n ui args u pandi oind} : declared_constructor Σ (i, n) mind oind cbody -> PCUICArities.typing_spine Σ [] (type_of_constructor mind cbody (i, n) ui) args (mkApps (tInd i u) pandi) -> @@ -350,25 +452,27 @@ Proof using Type. { clear Hspine. destruct Hdecl as [[d1 d3] d2]. pose proof d3 as Hdecl. unfold firstorder_ind in Hind. rewrite d1 in Hind. solve_all. clear a. + move/andP: Hind => [indf H0]. eapply forallb_nth_error in H0 as H'. erewrite d3 in H'. unfold firstorder_oneind in H'. cbn in H'. rtoProp. - eapply nth_error_forallb in H1. 2: eauto. - unfold firstorder_con in H1. - revert H1. cbn. + eapply nth_error_forallb in H. 2: eauto. + unfold firstorder_con in H. + revert H. cbn. unfold cstr_concl. rewrite PCUICUnivSubst.subst_instance_mkApps subst_mkApps. rewrite subst_instance_length app_length. unfold cstr_concl_head. rewrite PCUICInductives.subst_inds_concl_head. now eapply nth_error_Some_length in Hdecl. rewrite -app_length. - generalize (cstr_args cbody ++ ind_params mind)%list. clear -d1 H H0 Hdecl. + generalize (cstr_args cbody ++ ind_params mind)%list. + clear -wfΣ d1 indf H1 H0 Hdecl. (* generalize conclusion to mkApps tInd args *) intros c. change (list context_decl) with context in c. move: (map (subst (inds _ _ _) _) _). intros args. - rewrite (alli_subst_instance _ ui (fun k t => firstorder_type #|ind_bodies mind| k t)). + rewrite (alli_subst_instance _ ui (fun k t => firstorder_type _ #|ind_bodies mind| k t)). { intros k t. rewrite /firstorder_type. rewrite -PCUICUnivSubstitutionConv.subst_instance_decompose_app /=. @@ -424,7 +528,7 @@ Proof using Type. rewrite Nat.add_0_r in fot. eapply Nat.ltb_lt in fot. cbn. rewrite nth_error_inds. lia. cbn. econstructor. - { rewrite /firstorder_ind d1 H H0 //. } + { rewrite /firstorder_ind d1 /= /firstorder_mutind indf H0 //. } intros x. rewrite /subst1 PCUICLiftSubst.subst_it_mkProd_or_LetIn subst_mkApps /=. len. rewrite -subst_app_context' // PCUICSigmaCalculus.subst_context_decompo. @@ -458,8 +562,9 @@ Proof using Type. constructor. { unfold firstorder_ind. destruct ind. cbn in *. destruct plookup_env eqn:hp => //. - eapply plookup_env_lookup_env in hp as [decl [eq ]]. - rewrite eq. destruct decl; subst b => //. } + eapply plookup_env_lookup_env in hp as [Σ' [decl [eq [ext he]]]]. + rewrite eq. destruct decl; subst b => //. + eapply (firstorder_mutind_ext (Σ' := (empty_ext Σ'))); tea. } intros x. rewrite /subst1 PCUICLiftSubst.subst_it_mkProd_or_LetIn subst_mkApps /=; len. rewrite -subst_app_context' // PCUICSigmaCalculus.subst_context_decompo. eapply X. now len. len. @@ -560,7 +665,8 @@ Proof using Type. red in Hfo. unfold firstorder_ind in Hfo. rewrite Hlookup in Hfo. eapply andb_true_iff in Hfo as [Hfo _]. - eapply check_recursivity_kind_inj in Hty; eauto. congruence. + rewrite /check_recursivity_kind Hlookup in Hty. + apply eqb_eq in Hfo, Hty. congruence. - destruct t; inv Hhead. + exfalso. now eapply invert_ind_ind in Hty. + apply inversion_mkApps in Hty as Hcon; auto. @@ -593,7 +699,8 @@ Proof using Type. red in Hfo. unfold firstorder_ind in Hfo. rewrite Hlookup in Hfo. eapply andb_true_iff in Hfo as [Hfo _]. - eapply check_recursivity_kind_inj in Hty; eauto. congruence. + rewrite /check_recursivity_kind Hlookup in Hty. + apply eqb_eq in Hfo, Hty. congruence. Qed. End cf. diff --git a/safechecker/theories/PCUICSafeReduce.v b/safechecker/theories/PCUICSafeReduce.v index 22c0a4f1f..655c7231d 100644 --- a/safechecker/theories/PCUICSafeReduce.v +++ b/safechecker/theories/PCUICSafeReduce.v @@ -1116,44 +1116,6 @@ Corollary R_Acc_aux : End reducewf. - (* Equations reduce_stack_full (Γ : context) (t : term) (π : stack) - (h : forall Σ (wfΣ : abstract_env_ext_rel X Σ), welltyped Σ Γ (zip (t,π))) : - { t' : term * stack | forall Σ (wfΣ : abstract_env_ext_rel X Σ), Req Σ Γ t' (t, π) /\ Pr t' π /\ Pr' t' } := - reduce_stack_full Γ t π h := - Fix_F (R := fun t t' => forall Σ (wfΣ : abstract_env_ext_rel X Σ), R Σ Γ t t') - (fun x => (forall Σ (wfΣ : abstract_env_ext_rel X Σ), welltyped Σ Γ (zip x)) - -> { t' : term * stack | forall Σ (wfΣ : abstract_env_ext_rel X Σ), Req Σ Γ t' x /\ Pr t' (snd x) /\ Pr' t' }) - (fun t' f => _) (x := (t, π)) _ _. - Next Obligation. - eapply _reduce_stack. - - assumption. - - intros t' π' h'. - eapply f. - + assumption. - + intros. specialize (h' _ wfΣ). simple inversion h'. - * cbn in H1. cbn in H2. - inversion H1. subst. inversion H2. subst. clear H1 H2. - intros. - destruct (hΣ _ wfΣ) as [wΣ]. - eapply cored_welltyped. - ++ eassumption. - ++ eapply H; eauto. - ++ eauto. - * cbn in H1. cbn in H2. - inversion H1. subst. inversion H2. subst. clear H1 H2. - intros. cbn. rewrite H3. eauto. - Defined. - Next Obligation. - revert h. generalize (t, π). - refine (Acc_intro_generator - (R:=fun x y => forall Σ (wfΣ : abstract_env_ext_rel X Σ), R Σ Γ x y) - (P:=fun x => forall Σ (wfΣ : abstract_env_ext_rel X Σ), welltyped Σ Γ (zip x)) - (fun x y Px Hy => _) 1000 _); intros. - - simpl in *. eapply welltyped_R_pres; eauto. - - destruct (abstract_env_ext_exists X) as [[Σ wfΣ]]. - destruct (hΣ _ wfΣ) as [hΣ]. eapply R_Acc; eassumption. - Defined. *) - Definition reduce_stack Γ t π h := let '(exist ts _) := reduce_stack_full Γ t π h in ts. @@ -1262,44 +1224,6 @@ Corollary R_Acc_aux : refine (reduce_stack_sound _ _ _ _ [] _); eauto. Qed. - (* (* Potentially hard? Ok with SN? *) *) - (* Lemma Ind_canonicity : *) - (* forall Γ ind uni args t, *) - (* Σ ;;; Γ |- t : mkApps (tInd ind uni) args -> *) - (* RedFlags.iota flags -> *) - (* let '(u,l) := decompose_app t in *) - (* (isLambda u -> l = []) -> *) - (* whnf flags Σ Γ u -> *) - (* discr_construct u -> *) - (* whne flags Σ Γ u. *) - (* Proof. *) - (* intros Γ ind uni args t ht hiota. *) - (* case_eq (decompose_app t). *) - (* intros u l e hl h d. *) - (* induction h. *) - (* - assumption. *) - (* - apply decompose_app_inv in e. subst. *) - (* (* Inversion on ht *) *) - (* admit. *) - (* - apply decompose_app_inv in e. subst. *) - (* (* Inversion on ht *) *) - (* admit. *) - (* - cbn in hl. specialize (hl eq_refl). subst. *) - (* apply decompose_app_inv in e. subst. cbn in ht. *) - (* (* Inversion on ht *) *) - (* admit. *) - (* - apply decompose_app_eq_mkApps in e. subst. *) - (* cbn in d. simp discr_construct in d. easy. *) - (* - apply decompose_app_inv in e. subst. *) - (* (* Inversion on ht *) *) - (* admit. *) - (* - apply decompose_app_inv in e. subst. *) - (* (* Not very clear now. *) - (* Perhaps we ought to show whnf of the mkApps entirely. *) - (* And have a special whne case for Fix that don't reduce? *) - (* *) *) - (* Abort. *) - Scheme Acc_ind' := Induction for Acc Sort Prop. Lemma Fix_F_prop : @@ -2166,56 +2090,4 @@ Section ReduceFns. Local Instance wellfounded Σ wfΣ : WellFounded (@hnf_subterm_rel _ Σ) := @wf_hnf_subterm _ _ (heΣ _ X Σ wfΣ). - (** not used anymore **) - (* - Equations? (noeqns) reduce_to_arity (Γ : context) (T : term) - (wt : forall Σ (wfΣ : abstract_env_ext_rel X Σ), welltyped Σ Γ T) - : (conv_arity Γ T) + {forall Σ (wfΣ : abstract_env_ext_rel X Σ), ~ Is_conv_to_Arity Σ Γ T} - by wf ((Γ ; T ; wt) : (∑ Γ t, forall Σ (wfΣ : abstract_env_ext_rel X Σ), welltyped Σ Γ t)) hnf_subterm_rel := - reduce_to_arity Γ T wt with inspect (hnf Γ T wt) := - | exist Thnf eqhnf with view_prod_sortc Thnf := { - | view_prod_sort_prod na A B with reduce_to_arity (Γ,, vass na A) B _ := { - | inleft car => inleft {| conv_ar_context := (na, A) :: conv_ar_context car; - conv_ar_univ := conv_ar_univ car |}; - | inright nocar => inright _ - }; - | view_prod_sort_sort u => inleft {| conv_ar_context := []; - conv_ar_univ := u |}; - | view_prod_sort_other Thnf notprod notsort => inright _ - }. - Proof. - all: pose proof (@hnf_sound Γ T wt) as [r]. - all: rewrite <- ?eqhnf in r. - all: destruct HΣ as [wf]. - - destruct wt as (?&typ). - eapply subject_reduction_closed in r; eauto. - apply inversion_Prod in r as (?&?&?&?&?); auto. - econstructor; eauto. - - constructor. - eexists _; split. 1:eapply r. - unshelve eexists _; [constructor; constructor|]; auto. - - destruct car as [c_ar c_univ [c_red]]; cbn. - constructor. - etransitivity; eauto. - eapply closed_red_prod_codom; eauto. - - eapply Is_conv_to_Arity_red in H as (?&[r']&isar); eauto. - apply invert_red_prod in r' as (?&?&[-> ? ?]); auto. - contradiction nocar. - eexists; eauto using sq. - - constructor; auto. - - pose proof (@hnf_complete Γ T wt) as [w]. - destruct HΣ. - apply Is_conv_to_Arity_inv in H as [(na&A&B&[r'])|(u&[r'])]; auto. - + eapply PCUICContextConversion.closed_red_confluence in r' as (?&r1&r2); eauto. - apply invert_red_prod in r2 as (?&?&[-> ? ?]); auto. - eapply whnf_red_inv in r1; eauto. - depelim r1. - rewrite H in notprod; auto. - + eapply PCUICContextConversion.closed_red_confluence in r' as (?&r1&r2); eauto. - apply invert_red_sort in r2 as ->. - eapply whnf_red_inv in r1; eauto. - depelim r1. - rewrite H in notsort; cbn in *; auto. - Qed. *) - End ReduceFns. diff --git a/template-coq/theories/common/uGraph.v b/template-coq/theories/common/uGraph.v index f915c8dc5..626c307f1 100644 --- a/template-coq/theories/common/uGraph.v +++ b/template-coq/theories/common/uGraph.v @@ -2034,46 +2034,6 @@ Section CheckLeq. End CheckLeq. - -Section CheckLeq'. - Context {cf:checker_flags}. - - Context (G : universes_graph) - uctx (Huctx: global_gc_uctx_invariants uctx) (HC : gc_consistent uctx.2) - (HG : G = make_graph uctx). - - (*Lemma check_gc_constraint_complete gcs - : gc_consistent gcs -> check_gc_constraints G gcs. - Proof. - unfold check_gc_constraints. cbn. - intros [v Hv]. - unfold gc_satisfies in Hv. - apply GoodConstraintSetFact.for_all_iff in Hv; eauto. 2:typeclasses eauto. - apply GoodConstraintSetFact.for_all_iff; eauto. typeclasses eauto. - intros gc hc. specialize (Hv gc hc). cbn in Hv. - unfold gc_satisfies0 in Hv. - destruct gc as [l z l'|k l|k n|l k|n k]. - - cbn. apply (leqb_level_n_spec G uctx Huctx HC HG). admit. admit. - intros v' Hv'. cbn. - specialize (HH v Hv). cbn in *. toProp. - pose proof (val_level_of_variable_level v l). - pose proof (val_level_of_variable_level v l'). - destruct l, l'; cbn in *; lled; lia. - - intros HH v Hv; apply leqb_level_n_spec0 in HH. - specialize (HH v Hv). cbn -[Z.of_nat] in HH. unfold gc_satisfies0. toProp. - cbn in *. lled; lia. - - intros HH v Hv; apply leqb_level_n_spec0 in HH. - specialize (HH v Hv). cbn in HH. unfold gc_satisfies0. toProp. - lled; lia. - - intros HH v Hv; apply leqb_level_n_spec0 in HH. - specialize (HH v Hv). cbn in HH. unfold gc_satisfies0. toProp. - lled; lia. - - intros HH v Hv; apply leqb_level_n_spec0 in HH. - specialize (HH v Hv). cbn in HH. unfold gc_satisfies0. toProp. - lled; lia. - Qed. *) -End CheckLeq'. - (* This section: specif in term of raw uctx *) Section CheckLeq2. Context {cf:checker_flags}. From 63906fb56f6d586a1d9e9b3f6938ccb68a472008 Mon Sep 17 00:00:00 2001 From: Yannick Forster Date: Sat, 25 Jun 2022 14:43:27 +0200 Subject: [PATCH 04/43] Option to see constructors as block in EWcbvEval, needed for extraction in CertiCoq and to OCaml/Malfunction (#716) * constructors as blocks * evaluation rules for constructors as blocks * tranformation to constructors as blocks * correctness proof for constructors as blocks --- erasure/_CoqProject.in | 1 + erasure/theories/EAst.v | 2 +- erasure/theories/EAstUtils.v | 12 +- erasure/theories/ECSubst.v | 3 +- erasure/theories/EConstructorsAsBlocks.v | 878 +++++++++++++++++++++++ erasure/theories/EDeps.v | 17 +- erasure/theories/EEtaExpanded.v | 69 +- erasure/theories/EEtaExpandedFix.v | 255 +++---- erasure/theories/EGlobalEnv.v | 2 +- erasure/theories/EInduction.v | 19 +- erasure/theories/EInlineProjections.v | 29 +- erasure/theories/ELiftSubst.v | 11 +- erasure/theories/EOptimizePropDiscr.v | 71 +- erasure/theories/EPretty.v | 4 +- erasure/theories/EReflect.v | 9 + erasure/theories/ERemoveParams.v | 91 +-- erasure/theories/ESpineView.v | 2 +- erasure/theories/ETransform.v | 57 +- erasure/theories/EWcbvEval.v | 280 ++++++-- erasure/theories/EWcbvEvalEtaInd.v | 93 +-- erasure/theories/EWcbvEvalInd.v | 175 +++-- erasure/theories/EWellformed.v | 9 +- erasure/theories/Erasure.v | 14 +- erasure/theories/ErasureCorrectness.v | 6 +- erasure/theories/ErasureFunction.v | 4 +- erasure/theories/ErasureProperties.v | 18 +- erasure/theories/Extract.v | 6 +- 27 files changed, 1708 insertions(+), 429 deletions(-) create mode 100644 erasure/theories/EConstructorsAsBlocks.v diff --git a/erasure/_CoqProject.in b/erasure/_CoqProject.in index 617a15e08..e4d218591 100644 --- a/erasure/_CoqProject.in +++ b/erasure/_CoqProject.in @@ -34,4 +34,5 @@ theories/EProgram.v theories/ERemoveParams.v theories/EInlineProjections.v theories/ETransform.v +theories/EConstructorsAsBlocks.v theories/Erasure.v diff --git a/erasure/theories/EAst.v b/erasure/theories/EAst.v index b0c8bbd72..16bf3e1a7 100644 --- a/erasure/theories/EAst.v +++ b/erasure/theories/EAst.v @@ -33,7 +33,7 @@ Inductive term : Set := | tLetIn : name -> term (* the term *) -> term -> term | tApp : term -> term -> term | tConst : kername -> term -| tConstruct : inductive -> nat -> term +| tConstruct : inductive -> nat -> list term -> term | tCase : (inductive * nat) (* # of parameters *) -> term (* discriminee *) -> list (list name * term) (* branches *) -> term | tProj : projection -> term -> term diff --git a/erasure/theories/EAstUtils.v b/erasure/theories/EAstUtils.v index 6db80c98d..53c531708 100644 --- a/erasure/theories/EAstUtils.v +++ b/erasure/theories/EAstUtils.v @@ -283,7 +283,7 @@ Definition isCoFix t := Definition isConstruct t := match t with - | tConstruct _ _ => true + | tConstruct _ _ _ => true | _ => false end. @@ -328,6 +328,8 @@ Definition string_of_def {A : Set} (f : A -> string) (def : def A) := "(" ^ string_of_name (dname def) ^ "," ^ f (dbody def) ^ "," ^ string_of_nat (rarg def) ^ ")". +Definition maybe_string_of_list {A} f (l : list A) := match l with [] => "" | _ => string_of_list f l end. + Fixpoint string_of_term (t : term) : string := match t with | tBox => "∎" @@ -338,7 +340,7 @@ Fixpoint string_of_term (t : term) : string := | tLetIn na b t => "LetIn(" ^ string_of_name na ^ "," ^ string_of_term b ^ "," ^ string_of_term t ^ ")" | tApp f l => "App(" ^ string_of_term f ^ "," ^ string_of_term l ^ ")" | tConst c => "Const(" ^ string_of_kername c ^ ")" - | tConstruct i n => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ ")" + | tConstruct i n args => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ maybe_string_of_list string_of_term args ^ ")" | tCase (ind, i) t brs => "Case(" ^ string_of_inductive ind ^ "," ^ string_of_nat i ^ "," ^ string_of_term t ^ "," ^ string_of_list (fun b => string_of_term (snd b)) brs ^ ")" @@ -354,8 +356,10 @@ Fixpoint string_of_term (t : term) : string := Fixpoint term_global_deps (t : EAst.term) := match t with - | EAst.tConst kn - | EAst.tConstruct {| inductive_mind := kn |} _ => KernameSet.singleton kn + | EAst.tConst kn => KernameSet.singleton kn + | EAst.tConstruct {| inductive_mind := kn |} _ args => + List.fold_left (fun acc x => KernameSet.union (term_global_deps x) acc) args + (KernameSet.singleton kn) | EAst.tLambda _ x => term_global_deps x | EAst.tApp x y | EAst.tLetIn _ x y => KernameSet.union (term_global_deps x) (term_global_deps y) diff --git a/erasure/theories/ECSubst.v b/erasure/theories/ECSubst.v index 7edceca5d..65a0695d3 100644 --- a/erasure/theories/ECSubst.v +++ b/erasure/theories/ECSubst.v @@ -36,6 +36,7 @@ Fixpoint csubst t k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (csubst t k')) mfix in tCoFix mfix' idx + | tConstruct ind n args => tConstruct ind n (map (csubst t k) args) | x => x end. @@ -57,7 +58,7 @@ Proof. destruct (nth_error_spec [t] (n - k) ). simpl in l0; lia. now rewrite Nat.sub_1_r. - + now destruct (Nat.leb_spec k n); try lia. + + now destruct (Nat.leb_spec k n); try lia. Qed. Lemma substl_subst s u : forallb (closedn 0) s -> diff --git a/erasure/theories/EConstructorsAsBlocks.v b/erasure/theories/EConstructorsAsBlocks.v new file mode 100644 index 000000000..8bc48e29b --- /dev/null +++ b/erasure/theories/EConstructorsAsBlocks.v @@ -0,0 +1,878 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import Utf8 Program. +From MetaCoq.Template Require Import config utils Kernames BasicAst EnvMap. +From MetaCoq.Erasure Require Import EAst EAstUtils EInduction EArities + ELiftSubst ESpineView EGlobalEnv EWellformed EEnvMap + EWcbvEval EEtaExpanded ECSubst EWcbvEvalEtaInd EProgram. + +Local Open Scope string_scope. +Set Asymmetric Patterns. +Import MCMonadNotation. + +From Equations Require Import Equations. +Set Equations Transparent. +Local Set Keyed Unification. +From Coq Require Import ssreflect ssrbool. + +(** We assume [Prop size x < size y) := + | e with TermSpineView.view e := { + | tRel i => EAst.tRel i + | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => transform_blocks x)) + | tLambda na M => EAst.tLambda na (transform_blocks M) + | tApp u v napp nnil with construct_viewc u := + { | view_construct ind i block_args with lookup_constructor_pars_args Σ ind i := { + | Some (npars, nargs) => + let args := map_InP v (fun x H => transform_blocks x) in + let '(args, rest) := MCList.chop nargs args in + EAst.mkApps (EAst.tConstruct ind i args) rest + | None => + let args := map_InP v (fun x H => transform_blocks x) in + EAst.tConstruct ind i args } + | view_other _ _ => mkApps (transform_blocks u) (map_InP v (fun x H => transform_blocks x)) } + + | tLetIn na b b' => EAst.tLetIn na (transform_blocks b) (transform_blocks b') + | tCase ind c brs => + let brs' := map_InP brs (fun x H => (x.1, transform_blocks x.2)) in + EAst.tCase (ind.1, 0) (transform_blocks c) brs' + | tProj p c => EAst.tProj {| proj_ind := p.(proj_ind); proj_npars := 0; proj_arg := p.(proj_arg) |} (transform_blocks c) + | tFix mfix idx => + let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in + EAst.tFix mfix' idx + | tCoFix mfix idx => + let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in + EAst.tCoFix mfix' idx + | tBox => EAst.tBox + | tVar n => EAst.tVar n + | tConst n => EAst.tConst n + | tConstruct ind i block_args => EAst.tConstruct ind i [] }. + Proof. + all:try lia. + all:try apply (In_size); tea. + all:try lia. + - now apply (In_size id size). + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + rewrite size_mkApps. cbn. lia. + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + rewrite size_mkApps. cbn. lia. + - now eapply size_mkApps_f. + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + pose proof (size_mkApps_l napp nnil). lia. + - eapply (In_size snd size) in H. cbn in *. lia. + Qed. + + End Def. + + Hint Rewrite @map_InP_spec : transform_blocks. + + Arguments eqb : simpl never. + + Opaque transform_blocks_unfold_clause_1. + Opaque transform_blocks. + Opaque isEtaExp. + Opaque isEtaExp_unfold_clause_1. + + + Lemma chop_firstn_skipn {A} n (l : list A) : chop n l = (firstn n l, skipn n l). + Proof using Type. + induction n in l |- *; destruct l; simpl; auto. + now rewrite IHn skipn_S. + Qed. + + Lemma chop_eq {A} n (l : list A) l1 l2 : chop n l = (l1, l2) -> l = l1 ++ l2. + Proof. + rewrite chop_firstn_skipn. intros [= <- <-]. + now rewrite firstn_skipn. + Qed. + + Lemma closed_transform_blocks t k : closedn k t -> closedn k (transform_blocks t). + Proof using Type. + funelim (transform_blocks t); simp transform_blocks; rewrite <-?transform_blocks_equation_1; toAll; simpl; + intros; try easy; + rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; + unfold test_def in *; + simpl closed in *; + try solve [simpl; subst; simpl closed; f_equal; auto; rtoProp; solve_all; solve_all]; try easy. + - rewrite !closedn_mkApps in H1 *. + rtoProp; intuition auto. solve_all. + - destruct (chop nargs v) eqn:E. + erewrite chop_map; eauto. + eapply chop_eq in E as ->. + rewrite !closedn_mkApps in H0 *. + rtoProp; intuition auto; cbn; solve_all; eapply All_app in H1; + repeat solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. + repeat solve_all. + Qed. + + Hint Rewrite @forallb_InP_spec : isEtaExp. + Transparent isEtaExp_unfold_clause_1. + + Transparent transform_blocks_unfold_clause_1. + + Local Lemma transform_blocks_mkApps f v : + ~~ isApp f -> + transform_blocks (mkApps f v) = match construct_viewc f with + | view_construct ind i block_args => + match lookup_constructor_pars_args Σ ind i with + | Some (npars, nargs) => + let args := map transform_blocks v in + let '(args, rest) := MCList.chop nargs args in + EAst.mkApps (EAst.tConstruct ind i args) rest + | None => + let args := map transform_blocks v in + EAst.tConstruct ind i args + end + | view_other _ _ => mkApps (transform_blocks f) (map transform_blocks v) + end. + Proof using Type. + intros napp; simp transform_blocks. + destruct (construct_viewc f) eqn:vc. + - destruct lookup_constructor_pars_args as [[]|] eqn:heq. + destruct v eqn:hargs. cbn. + * destruct n1 => //. + * set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /=. rewrite heq /=. now simp transform_blocks. + * destruct v eqn:hargs => //. + set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /=. rewrite heq /=. now simp transform_blocks. + - destruct v eqn:hargs => //. + simp transform_blocks. + set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /= vc /=. now simp transform_blocks. + Qed. + + Lemma transform_blocks_decompose f : + transform_blocks f = + let (fn, args) := decompose_app f in + match construct_viewc fn with + | view_construct kn c _ => + match lookup_constructor_pars_args Σ kn c with + | Some (npars, nargs) => + let args := map (transform_blocks) args in + let '(args, rest) := MCList.chop nargs args in + mkApps (tConstruct kn c args) rest + | None => + let args := map transform_blocks args in + tConstruct kn c args + end + | view_other fn nconstr => + mkApps (transform_blocks fn) (map transform_blocks args) + end. + Proof. + destruct (decompose_app f) eqn:da. + rewrite (decompose_app_inv da). rewrite transform_blocks_mkApps. + now eapply decompose_app_notApp. + destruct construct_viewc; try reflexivity. + Qed. + + Lemma transform_blocks_mkApps_eta (P : term -> Prop) fn args : + (* wf_glob Σ -> + *)~~ EAst.isApp fn -> + isEtaExp Σ (mkApps fn args) -> + (match construct_viewc fn with + | view_construct kn c block_args => + forall pars nargs, + lookup_constructor_pars_args Σ kn c = Some (pars, nargs) -> + let cargs := map transform_blocks args in + let '(cargs, rest) := MCList.chop nargs cargs in + P (mkApps (tConstruct kn c cargs) rest) + | view_other fn nconstr => + P (mkApps (transform_blocks fn) (map transform_blocks args)) + end) -> + P (transform_blocks (mkApps fn args)). + Proof. + intros napp. + move/isEtaExp_mkApps. + rewrite decompose_app_mkApps //. + destruct construct_viewc eqn:vc. + + rewrite /isEtaExp_app. + destruct lookup_constructor_pars_args as [[]|] eqn:hl. + rewrite transform_blocks_decompose decompose_app_mkApps // /= hl. + move=> /andP[] /andP[] /Nat.leb_le hargs etaargs bargs. + destruct block_args; invs bargs. + move/(_ _ _ eq_refl). + destruct chop eqn:eqch => //. + move => /andP[] => //. + + intros ht. rewrite transform_blocks_mkApps // vc //. + Qed. + + Lemma transform_blocks_mkApps_eta_fn f args : isEtaExp Σ f -> + transform_blocks (mkApps f args) = mkApps (transform_blocks f) (map (transform_blocks) args). + Proof. + intros ef. + destruct (decompose_app f) eqn:df. + rewrite (decompose_app_inv df) in ef |- *. + rewrite -mkApps_app. + move/isEtaExp_mkApps: ef. + pose proof (decompose_app_notApp _ _ _ df). + rewrite decompose_app_mkApps /= //. + rewrite transform_blocks_decompose. + rewrite decompose_app_mkApps /= //. + destruct (construct_viewc t) eqn:vc. + + move=> /andP[] etanl etal. + destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. + cbn. + rewrite chop_firstn_skipn. + rewrite transform_blocks_decompose. + rewrite decompose_app_mkApps // /= hl. + rewrite chop_firstn_skipn. + rewrite - mkApps_app. + move: etanl. rewrite /isEtaExp_app hl. + move => /andP[] /Nat.leb_le => hl' hall. + rewrite firstn_map. + rewrite firstn_app. + assert (args' - #|l| = 0) as -> by lia. + rewrite firstn_O // app_nil_r. f_equal. f_equal. + rewrite firstn_map //. rewrite map_app skipn_map. + rewrite skipn_app. len. + assert (args' - #|l| = 0) as -> by lia. + now rewrite skipn_0 -skipn_map. + move: etanl. rewrite /isEtaExp_app hl //. + + move => /andP[] etat etal. + rewrite (transform_blocks_decompose (mkApps t l)). + rewrite decompose_app_mkApps //. + rewrite vc. rewrite -mkApps_app. f_equal. + now rewrite map_app. + Qed. + + Lemma transform_blocks_csubst a k b : + closed a -> + isEtaExp Σ a -> + isEtaExp Σ b -> + transform_blocks (ECSubst.csubst a k b) = ECSubst.csubst (transform_blocks a) k (transform_blocks b). + Proof using Type. + funelim (transform_blocks b); cbn; simp transform_blocks isEtaExp; rewrite -?isEtaExp_equation_1 -?transform_blocks_equation_1; toAll; simpl; + intros; try easy; + rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; + unfold test_def in *; + simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. + + - destruct Nat.compare => //. + - f_equal. solve_all. move/andP: b => [] _ he. solve_all. + - rewrite csubst_mkApps. + rtoProp. solve_all. + assert ( + mkApps (transform_blocks u) (map transform_blocks v) = + transform_blocks (mkApps u v) + ) as ->. { rewrite transform_blocks_mkApps. eauto. now rewrite Heq. } + eapply (transform_blocks_mkApps_eta (fun x => transform_blocks (mkApps (csubst a k u) (map (csubst a k) v)) = + csubst (transform_blocks a) k x)); eauto. + rewrite Heq. + rewrite csubst_mkApps. + rewrite isEtaExp_mkApps_napp in H3 => //. rewrite Heq in H3. + rtoProp. rename H3 into etau. rename H4 into etav. + rewrite - H //. + rewrite transform_blocks_mkApps_eta_fn. + now eapply etaExp_csubst. + f_equal. + rewrite !map_map_compose. solve_all. + - pose proof (etaExp_csubst _ _ k _ H1 H2). + rewrite !csubst_mkApps /= in H3 *. + assert (map (csubst a k) v <> []). + { destruct v; cbn; congruence. } + rewrite transform_blocks_mkApps //. + rewrite isEtaExp_Constructor // in H3. + move: H3 => /andP[] /andP[]. rewrite map_length. move=> etaapp etav bargs. + destruct block_args; invs bargs. + cbn -[lookup_constructor_pars_args]. + unfold isEtaExp_app in etaapp. + rewrite Heq in etaapp |- *. + destruct (chop nargs v) eqn:heqc. + rewrite map_map_compose. + erewrite !chop_map; eauto. + rewrite csubst_mkApps. cbn. + eapply chop_eq in heqc as ->. + cbn. + rewrite isEtaExp_Constructor in H2. + move: H2 => /andP[] /andP[] He1 He2 He3. + cbn. f_equal. f_equal. + all: rewrite !map_map_compose; solve_all; eapply All_app in He2. + all: repeat solve_all. + - pose proof (etaExp_csubst _ _ k _ H1 H2). + rewrite !csubst_mkApps /= in H3 *. + assert (map (csubst a k) v <> []). + { destruct v; cbn; congruence. } + rewrite transform_blocks_mkApps //. + rewrite isEtaExp_Constructor // in H3. + move/andP : H3 => [] /andP[]. rewrite map_length. move=> etaapp etav bargs. + cbn -[lookup_inductive_pars]. + unfold isEtaExp_app in etaapp. + destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => //. + Qed. + + Lemma transform_blocks_substl s t : + forallb (closedn 0) s -> + forallb (isEtaExp Σ) s -> + isEtaExp Σ t -> + transform_blocks (substl s t) = substl (map transform_blocks s) (transform_blocks t). + Proof using Type. + induction s in t |- *; simpl; auto. + move=> /andP[] cla cls /andP[] etaa etas etat. + rewrite IHs //. now eapply etaExp_csubst. f_equal. + now rewrite transform_blocks_csubst. + Qed. + + Lemma transform_blocks_iota_red pars args br : + forallb (closedn 0) args -> + forallb (isEtaExp Σ) args -> + isEtaExp Σ br.2 -> + transform_blocks (EGlobalEnv.iota_red pars args br) = EGlobalEnv.iota_red pars (map transform_blocks args) (on_snd transform_blocks br). + Proof using Type. + intros cl etaargs etabr. + unfold EGlobalEnv.iota_red. + rewrite transform_blocks_substl //. + rewrite forallb_rev forallb_skipn //. + rewrite forallb_rev forallb_skipn //. + now rewrite map_rev map_skipn. + Qed. + + Lemma transform_blocks_fix_subst mfix : EGlobalEnv.fix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.fix_subst mfix). + Proof using Type. + unfold EGlobalEnv.fix_subst. + rewrite map_length. + generalize #|mfix|. + induction n; simpl; auto. + f_equal; auto. now simp transform_blocks. + Qed. + + Lemma transform_blocks_cofix_subst mfix : EGlobalEnv.cofix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.cofix_subst mfix). + Proof using Type. + unfold EGlobalEnv.cofix_subst. + rewrite map_length. + generalize #|mfix|. + induction n; simpl; auto. + f_equal; auto. now simp transform_blocks. + Qed. + + Lemma transform_blocks_cunfold_fix mfix idx n f : + forallb (closedn 0) (fix_subst mfix) -> + forallb (fun d => isLambda (dbody d) && isEtaExp Σ (dbody d)) mfix -> + cunfold_fix mfix idx = Some (n, f) -> + cunfold_fix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). + Proof using Type. + intros hfix heta. + unfold cunfold_fix. + rewrite nth_error_map. + destruct nth_error eqn:heq. + intros [= <- <-] => /=. f_equal. f_equal. + rewrite transform_blocks_substl //. + now apply isEtaExp_fix_subst. + solve_all. eapply nth_error_all in heta; tea. cbn in heta. + rtoProp; intuition auto. + f_equal. f_equal. apply transform_blocks_fix_subst. + discriminate. + Qed. + + + Lemma transform_blocks_cunfold_cofix mfix idx n f : + forallb (closedn 0) (cofix_subst mfix) -> + forallb (isEtaExp Σ ∘ dbody) mfix -> + cunfold_cofix mfix idx = Some (n, f) -> + cunfold_cofix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). + Proof using Type. + intros hcofix heta. + unfold cunfold_cofix. + rewrite nth_error_map. + destruct nth_error eqn:heq. + intros [= <- <-] => /=. f_equal. + rewrite transform_blocks_substl //. + now apply isEtaExp_cofix_subst. + solve_all. now eapply nth_error_all in heta; tea. + f_equal. f_equal. apply transform_blocks_cofix_subst. + discriminate. + Qed. + + Lemma transform_blocks_nth {n l d} : + transform_blocks (nth n l d) = nth n (map transform_blocks l) (transform_blocks d). + Proof using Type. + induction l in n |- *; destruct n; simpl; auto. + Qed. + + Definition switch_constructor_as_block fl : WcbvFlags := + EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) fl.(@with_guarded_fix) true. + +End transform_blocks. + +Definition transform_blocks_constant_decl Σ cb := + {| cst_body := option_map (transform_blocks Σ) cb.(cst_body) |}. + +Definition transform_blocks_decl Σ d := + match d with + | ConstantDecl cb => ConstantDecl (transform_blocks_constant_decl Σ cb) + | InductiveDecl idecl => d + end. + +Definition transform_blocks_env Σ := + map (on_snd (transform_blocks_decl Σ)) Σ. + +Definition transform_blocks_program (p : eprogram_env) := + (transform_blocks_env p.1, transform_blocks p.1 p.2). + +Definition term_flags := + {| + has_tBox := true; + has_tRel := true; + has_tVar := false; + has_tEvar := false; + has_tLambda := true; + has_tLetIn := true; + has_tApp := true; + has_tConst := true; + has_tConstruct := true; + has_tCase := true; + has_tProj := false; + has_tFix := true; + has_tCoFix := false + |}. + +Definition env_flags := + {| has_axioms := false; + has_cstr_params := false; + term_switches := term_flags |}. + +Local Existing Instance env_flags. + +Lemma Qpreserves_wellformed Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. +Proof. + intros clΣ. + split. + - red. move=> n t. + destruct t; cbn; intuition auto; try solve [constructor; auto]. + eapply on_letin; rtoProp; intuition auto. + eapply on_app; rtoProp; intuition auto. + eapply on_case; rtoProp; intuition auto. solve_all. + eapply on_fix. solve_all. move/andP: H => [] _ ha. solve_all. + - red. intros kn decl. + move/(lookup_env_wellformed clΣ). + unfold wf_global_decl. destruct cst_body => //. + - red. move=> hasapp n t args. rewrite wellformed_mkApps //. + split; intros; rtoProp; intuition auto; solve_all. + - red. cbn => //. + (* move=> hascase n ci discr brs. simpl. + destruct lookup_inductive eqn:hl => /= //. + split; intros; rtoProp; intuition auto; solve_all. *) + - red. move=> hasproj n p discr. now cbn in hasproj. + - red. move=> t args clt cll. + eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. + - red. move=> n mfix idx. cbn. unfold wf_fix. + split; intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. + - red. move=> n mfix idx. cbn. + split; intros; rtoProp; intuition auto; solve_all. +Qed. + +Definition block_wcbv_flags := + {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := true |}. + +Local Hint Resolve wellformed_closed : core. + +Lemma wellformed_lookup_inductive_pars Σ kn mdecl : + wf_glob Σ -> + lookup_minductive Σ kn = Some mdecl -> mdecl.(ind_npars) = 0. +Proof. + induction 1; cbn => //. + case: eqb_spec => [|]. + - intros ->. destruct d => //. intros [= <-]. + cbn in H0. unfold wf_minductive in H0. + rtoProp. cbn in H0. now eapply eqb_eq in H0. + - intros _. eapply IHwf_glob. +Qed. + +Lemma wellformed_lookup_constructor_pars {Σ kn c mdecl idecl cdecl} : + wf_glob Σ -> + lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> mdecl.(ind_npars) = 0. +Proof. + intros wf. cbn -[lookup_minductive]. + destruct lookup_minductive eqn:hl => //. + do 2 destruct nth_error => //. + eapply wellformed_lookup_inductive_pars in hl => //. congruence. +Qed. + +Lemma lookup_constructor_pars_args_spec {Σ ind n mdecl idecl cdecl} : + wf_glob Σ -> + lookup_constructor Σ ind n = Some (mdecl, idecl, cdecl) -> + lookup_constructor_pars_args Σ ind n = Some (mdecl.(ind_npars), cdecl.(cstr_nargs)). +Proof. + cbn -[lookup_constructor] => wfΣ. + destruct lookup_constructor as [[[mdecl' idecl'] [pars args]]|] eqn:hl => //. + intros [= -> -> <-]. cbn. f_equal. +Qed. + +Lemma wellformed_lookup_constructor_pars_args {Σ ind n block_args} : + wf_glob Σ -> + wellformed Σ 0 (EAst.tConstruct ind n block_args) -> + ∑ args, lookup_constructor_pars_args Σ ind n = Some (0, args). +Proof. + intros wfΣ wf. cbn -[lookup_constructor] in wf. + destruct lookup_constructor as [[[mdecl idecl] cdecl]|] eqn:hl => //. + exists cdecl.(cstr_nargs). + pose proof (wellformed_lookup_constructor_pars wfΣ hl). + eapply lookup_constructor_pars_args_spec in hl => //. congruence. +Qed. + +Lemma constructor_isprop_pars_decl_params {Σ ind c b pars cdecl} : + wf_glob Σ -> + constructor_isprop_pars_decl Σ ind c = Some (b, pars, cdecl) -> pars = 0. +Proof. + intros hwf. + rewrite /constructor_isprop_pars_decl /lookup_constructor /lookup_inductive. + destruct lookup_minductive as [mdecl|] eqn:hl => /= //. + do 2 destruct nth_error => //. + eapply wellformed_lookup_inductive_pars in hl => //. congruence. +Qed. + +Lemma skipn_ge m {A} (l : list A) : + m >= length l -> skipn m l = []. +Proof. + induction l in m |- *. + - destruct m; reflexivity. + - cbn. destruct m; try lia. intros H. + eapply IHl. lia. +Qed. + +Lemma chop_all {A} (l : list A) m : + m >= length l -> chop m l = (l, nil). +Proof. + intros Hl. rewrite chop_firstn_skipn. + rewrite firstn_ge; try lia. rewrite skipn_ge; try lia. + eauto. +Qed. + +Lemma transform_blocks_tApp Σ t a (P : term -> Set) k : + wf_glob Σ -> + wellformed Σ k (tApp t a) -> + (let (fn, args) := decompose_app (tApp t a) in + match construct_viewc fn with + | view_construct kn c block_args => + match lookup_constructor_pars_args Σ kn c with + | Some (0, nargs) => + let cargs := map (transform_blocks Σ) args in + let '(cargs, rest) := MCList.chop nargs cargs in + (args <> [] /\ t = mkApps (tConstruct kn c block_args) (remove_last args) /\ a = last args a) -> + P (mkApps (tConstruct kn c cargs) rest) + | _ => True + end + | view_other fn nconstr => + P (tApp (transform_blocks Σ t) (transform_blocks Σ a)) + end) -> + P (transform_blocks Σ (tApp t a)). +Proof. + intros wfΣ wf. + rewrite (transform_blocks_decompose _ (tApp t a)). + destruct decompose_app eqn:da. + pose proof (decompose_app_notApp _ _ _ da). + pose proof (EInduction.decompose_app_app _ _ _ _ da). + destruct construct_viewc eqn:vc. + + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. + cbn in wf. + move: wf => /andP[]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. + destruct (wellformed_lookup_constructor_pars_args wfΣ wfc). + rewrite e. cbn. + destruct chop eqn:eqch => //. + intros. apply H1. intuition auto. + + pose proof (decompose_app_notApp _ _ _ da). + pose proof (EInduction.decompose_app_app _ _ _ _ da). + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. + rewrite Ha Ht. + rewrite transform_blocks_mkApps // vc. + rewrite {3} (remove_last_last l a) => //. + now rewrite map_app mkApps_app. +Qed. + +Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e block_args mdecl idecl cdecl : + with_constructor_as_block = false -> + lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> + eval Σ (mkApps (tConstruct kn c block_args) args) e -> + ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (eval Σ) args args' × block_args = [] × #|args| <= cstr_arity mdecl cdecl. +Proof. + intros hblock hlook. + revert e; induction args using rev_ind; intros e. + - intros ev. depelim ev. congruence. exists []=> //. invs i. destruct block_args; invs H0 => //. cbn. repeat split. econstructor. lia. + - intros ev. rewrite mkApps_app /= in ev. + depelim ev; try solve_discr. + destruct (IHargs _ ev1) as [? []]. solve_discr. + all:try specialize (IHargs _ ev1) as [? []]; try solve_discr; try noconf H. + * destruct p as (? & ? & ?). exists (x0 ++ [a']). split => //. + rewrite mkApps_app /= //. split => //. eapply All2_app; eauto. + split => //. eapply All2_length in a. len. rewrite e1 in hlook; invs hlook. lia. + * destruct p as (? & ? & ?). subst f'. + cbn in i. + rewrite isConstructApp_mkApps in i. cbn in i. + rewrite orb_true_r in i. cbn in i. congruence. + * now cbn in i. +Qed. + +Lemma transform_blocks_isConstructApp Σ t : + wf_glob Σ -> wellformed Σ 0 t -> + isConstructApp (transform_blocks Σ t) = isConstructApp t. +Proof. + intros Hwf Hwf'. + induction t; try now cbn; eauto. + eapply transform_blocks_tApp; eauto. + destruct decompose_app. + destruct construct_viewc. + - destruct lookup_constructor_pars_args as [ [[]] | ]; eauto. + cbn. destruct chop. intros (? & ? & ?). subst. + rewrite -[tApp _ _](mkApps_app _ _ [t2]). + rewrite !isConstructApp_mkApps. cbn. reflexivity. + - change (tApp t1 t2) with (mkApps t1 [t2]). + change (tApp (transform_blocks Σ t1) (transform_blocks Σ t2)) with + (mkApps (transform_blocks Σ t1) [transform_blocks Σ t2]). + rewrite !isConstructApp_mkApps. + eapply IHt1. cbn in Hwf'. rtoProp. intuition. +Qed. + +Lemma lookup_env_transform_blocks Σ kn : + lookup_env (transform_blocks_env Σ) kn = + option_map (transform_blocks_decl Σ) (lookup_env Σ kn). +Proof. + unfold transform_blocks_env. + induction Σ at 2 4; simpl; auto. + case: eqb_spec => //. +Qed. + +Lemma transform_blocks_declared_constant Σ c decl : + declared_constant Σ c decl -> declared_constant (transform_blocks_env Σ) c (transform_blocks_constant_decl Σ decl). +Proof. + intros H. red in H; red. + rewrite lookup_env_transform_blocks H //. +Qed. + +Lemma lookup_constructor_transform_blocks Σ ind c : +lookup_constructor (transform_blocks_env Σ) ind c = +lookup_constructor Σ ind c. +Proof. + unfold lookup_constructor, lookup_inductive, lookup_minductive in *. + rewrite lookup_env_transform_blocks. + destruct lookup_env as [ [] | ]; cbn; congruence. +Qed. + +Lemma transform_blocks_eval (fl := EWcbvEval.target_wcbv_flags) : + forall Σ, isEtaExp_env Σ -> wf_glob Σ -> + forall t t', + wellformed Σ 0 t -> + isEtaExp Σ t -> + EWcbvEval.eval Σ t t' -> + @EWcbvEval.eval block_wcbv_flags (transform_blocks_env Σ) (transform_blocks Σ t) (transform_blocks Σ t'). +Proof. + intros Σ etaΣ wfΣ. + eapply + (EWcbvEvalEtaInd.eval_preserve_mkApps_ind fl eq_refl (efl := env_flags) Σ _ + (wellformed Σ) (Qpres := Qpreserves_wellformed _ wfΣ)) => //; eauto. + { intros. eapply EWcbvEval.eval_wellformed => //; tea. } + all:intros *. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. { cbn. rtoProp; eauto. } + destruct decompose_app as [fn args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[[] args']|] => // /=. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H0. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H4; try congruence. + eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + econstructor; tea. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. cbn. rtoProp; eauto. + destruct decompose_app as [fn args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[] |] => // /=. + destruct n0; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H0. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H5; try congruence. + eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + econstructor. + * revert e1. set (x := transform_blocks Σ f0). + simp transform_blocks. + * eauto. + * rewrite transform_blocks_csubst in e; eauto. + 1: now simp_eta in i10. + now rewrite - transform_blocks_equation_1. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + econstructor; eauto. + rewrite -transform_blocks_csubst; eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + cbn [plus]. + rewrite transform_blocks_mkApps in e0 => //. + assert (pars = 0) as -> by now (eapply constructor_isprop_pars_decl_params; eauto). + cbn [construct_viewc] in e0. + pose proof (Hcon := H2). + rewrite /constructor_isprop_pars_decl in H2. + destruct lookup_constructor as [[[]] | ] eqn:eqc; cbn in H2; invs H2. + rewrite -> lookup_constructor_pars_args_cstr_arity with (1 := eqc) in e0. + erewrite chop_all in e0. 2:len. + eapply eval_iota_block => //. + + cbn [fst]. eapply e0. + + unfold constructor_isprop_pars_decl. + rewrite lookup_constructor_transform_blocks. cbn [fst]. + rewrite eqc //= H8 //. + + now rewrite map_InP_spec nth_error_map H3; eauto. + + len. + + rewrite H9. len. + + rewrite wellformed_mkApps in i4 => //. + rewrite isEtaExp_Constructor in i6 => //. rtoProp. + rewrite -transform_blocks_iota_red. + * solve_all. + * solve_all. + * eapply forallb_nth_error in H. rewrite -> H3 in H => //. + * now rewrite H9. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. eauto; cbn; rtoProp; eauto. + destruct decompose_app as [ f args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[] |] => // /=. + destruct n0; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H0. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H0 as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H1. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H9; try congruence. + eapply eval_mkApps_Construct_inv in H0 as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + eapply eval_fix'. + * eauto. + * revert e1. set (x := transform_blocks Σ f5). + simp transform_blocks. + * rewrite map_InP_spec. + cbn in i8. unfold wf_fix in i8. rtoProp. + erewrite <- transform_blocks_cunfold_fix => //. + all: eauto. + eapply closed_fix_subst. solve_all. destruct x; cbn in H5 |- *. eauto. + simp_eta in i10. + * eauto. + * revert e. + eapply transform_blocks_tApp => //. + -- cbn. rtoProp. split; eauto. eapply wellformed_cunfold_fix; eauto. + -- destruct (decompose_app (tApp fn av)) eqn:E; eauto. + destruct (construct_viewc t0) eqn:E1; eauto. + destruct (lookup_constructor_pars_args Σ ind n) as [ [[ ]] | ] eqn:E2; eauto. + cbn zeta. destruct chop eqn:E3. intros (? & ? & ?). + subst. rewrite -> H7 in *. intros He. + eapply eval_mkApps_Construct_block_inv in He as (? & ? & ? & ?); eauto. subst. + rewrite -[tApp _ _](mkApps_app _ _ [last l av]) in i1. + rewrite H7 - remove_last_last in i1 => //. + rewrite isEtaExp_Constructor in i1. rtoProp. + rewrite isEtaExp_Constructor in H3. rtoProp. + unfold isEtaExp_app in *. + rewrite E2 in H3, H5. + eapply leb_complete in H3, H5. + exfalso. + enough (n0 >= #|l|). + { destruct l; try congruence. rewrite remove_last_length in H3. cbn in H5, H3, H13. lia. } + destruct (chop n0 l) eqn:Ec. + erewrite chop_map in E3 => //. 2: eauto. + inversion E3. subst. destruct l2; invs H15. + rewrite chop_firstn_skipn in Ec. invs Ec. + eapply PCUICSR.skipn_nil_length in H15. lia. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + rewrite map_InP_spec. cbn [plus]. + eapply eval_wellformed in H2; eauto. + rewrite wellformed_mkApps in H2; eauto. + rtoProp. now cbn in H2. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + econstructor. + eapply transform_blocks_declared_constant; eauto. + destruct decl. cbn in *. now rewrite H0. + eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. + destruct decompose_app as [ f args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[] args'|] eqn:hl => // /=. + destruct n0; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. pose proof ev as Hev. rewrite ha in Hev. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in Hev as (args'' & Ha1 & Ha2 & Ha3); eauto. subst. + destruct args as [ | []]; cbn in *; congruence. + * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H6; try congruence. + eapply eval_mkApps_Construct_inv in Hev as (args'' & Ha1 & Ha2 & -> & ?); eauto. subst. + rewrite isConstructApp_mkApps in H1. rewrite orb_true_r in H1 => //. + + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. + destruct (decompose_app (tApp f' a')). destruct (construct_viewc t0). + * destruct lookup_constructor_pars_args as [ [[]] | ] eqn:hpa; eauto. + cbn [plus]. destruct chop eqn:heqch. + intros [hl [ht ha]]. rewrite ht in H1. rewrite isConstructApp_mkApps orb_true_r in H1 => //. + * eapply eval_app_cong; eauto. + revert H1. + destruct f'; try now cbn; tauto. + intros H. cbn in H. + rewrite transform_blocks_isConstructApp; eauto. + destruct (isConstructApp (tApp f'1 f'2)). + -- cbn in H. congruence. + -- eapply transform_blocks_tApp; eauto. clear. + destruct decompose_app. + destruct construct_viewc; try now cbn; eauto. + destruct lookup_constructor_pars_args as [[[]] | ]; eauto. + cbn. destruct chop. cbn. intros. + destruct l1 using rev_case; cbn; eauto. + rewrite mkApps_app; cbn; eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + rewrite !transform_blocks_mkApps => //. + cbn [construct_viewc]. + erewrite lookup_constructor_pars_args_cstr_arity; eauto. + destruct (chop (cstr_nargs cdecl) args) eqn:E1. + destruct (chop (cstr_nargs cdecl) args') eqn:E2. + erewrite !chop_map; eauto. + specialize H as Heq. + unfold lookup_constructor, lookup_inductive, lookup_minductive in Heq. + destruct lookup_env eqn:E; try now inv Heq. + eapply lookup_env_wellformed in E; eauto. + destruct g; cbn in Heq; try now inv Heq. + cbn in E. + destruct nth_error; try now inv Heq. + destruct nth_error; invs Heq. + rewrite /wf_minductive in E. rtoProp. + cbn in H4. eapply eqb_eq in H4. + unfold cstr_arity in H0. + rewrite -> H4 in *. cbn in H0. + revert E1 E2. + rewrite <- H0. + rewrite !chop_firstn_skipn !firstn_all. intros [= <- <-] [= <- <-]. + eapply All2_length in X0 as Hlen. + cbn. + rewrite !skipn_all Hlen skipn_all firstn_all. cbn. + eapply eval_mkApps_Construct_block; eauto. + now rewrite lookup_constructor_transform_blocks. + len. unfold cstr_arity. lia. + solve_all. destruct H6; eauto. + - intros. econstructor. destruct t; cbn in H |- *; try congruence. +Qed. diff --git a/erasure/theories/EDeps.v b/erasure/theories/EDeps.v index 1b72d5c12..90399e1a8 100644 --- a/erasure/theories/EDeps.v +++ b/erasure/theories/EDeps.v @@ -57,6 +57,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -105,6 +107,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -160,6 +164,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + cbn. econstructor; eauto. - depelim er. econstructor; [easy|easy|easy|easy|easy|]. induction X; [easy|]. @@ -253,7 +259,7 @@ Qed. Notation "Σ ⊢ s ▷ t" := (eval Σ s t) (at level 50, s, t at next level) : type_scope. -Lemma erases_deps_eval {wfl:WcbvFlags} Σ t v Σ' : +Lemma erases_deps_eval {wfl:WcbvFlags} {hcon : with_constructor_as_block = false} Σ t v Σ' : Σ' ⊢ t ▷ v -> erases_deps Σ Σ' t -> erases_deps Σ Σ' v. @@ -275,8 +281,9 @@ Proof. + intuition auto. apply erases_deps_mkApps_inv in H4. now apply Forall_rev, Forall_skipn. - + eapply nth_error_forall in e0; [|now eauto]. + + eapply nth_error_forall in e1; [|now eauto]. assumption. + - congruence. - depelim er. subst brs; cbn in *. depelim H3. @@ -326,10 +333,12 @@ Proof. intuition auto. apply erases_deps_mkApps_inv in H3 as (? & ?). apply IHev2. - now eapply nth_error_forall in e1. + now eapply nth_error_forall in e2. + - congruence. - constructor. - depelim er. now constructor. + - congruence. - depelim er. now constructor. - easy. Qed. @@ -367,7 +376,7 @@ Lemma erases_deps_forall_ind Σ Σ' declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_one_inductive_body idecl idecl' -> erases_mutual_inductive_body mdecl mdecl' -> - P (Extract.E.tConstruct ind c)) + P (Extract.E.tConstruct ind c [])) (Hcase : forall (p : inductive × nat) mdecl idecl mdecl' idecl' (discr : Extract.E.term) (brs : list (list name × Extract.E.term)), PCUICAst.declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> diff --git a/erasure/theories/EEtaExpanded.v b/erasure/theories/EEtaExpanded.v index f43c00455..42b442e59 100644 --- a/erasure/theories/EEtaExpanded.v +++ b/erasure/theories/EEtaExpanded.v @@ -26,15 +26,15 @@ Hint Constructors eval : core. Import MCList (map_InP, map_InP_elim, map_InP_spec). Equations discr_construct (t : term) : Prop := -discr_construct (tConstruct ind n) := False ; +discr_construct (tConstruct ind n block_args) := False ; discr_construct _ := True. Inductive construct_view : term -> Type := -| view_construct : forall ind n, construct_view (tConstruct ind n) +| view_construct : forall ind n block_args, construct_view (tConstruct ind n block_args) | view_other : forall t, discr_construct t -> construct_view t. Equations construct_viewc t : construct_view t := -construct_viewc (tConstruct ind n) := view_construct ind n ; +construct_viewc (tConstruct ind n block_args) := view_construct ind n block_args ; construct_viewc t := view_other t I. Ltac toAll := @@ -55,6 +55,8 @@ Section isEtaExp. Import TermSpineView. + Definition is_nil {A} (l : list A) := match l with [] => true | _ => false end. + Equations? isEtaExp (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := | e with TermSpineView.view e := { @@ -62,7 +64,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp x) | tLambda na M => isEtaExp M | tApp u v napp nnil with construct_viewc u := - { | view_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) + { | view_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) && is_nil block_args | view_other _ _ => isEtaExp u && forallb_InP v (fun x H => isEtaExp x) } | tLetIn na b b' => isEtaExp b && isEtaExp b' | tCase ind c brs => isEtaExp c && forallb_InP brs (fun x H => isEtaExp x.2) @@ -72,15 +74,16 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i => isEtaExp_app ind i 0 }. + | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. Proof. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - rewrite size_mkApps. - change (fun x => size (id x)) with size in H. cbn. - now apply (In_size id size). + eapply (In_size id size) in H. + change (fun x => size (id x)) with size in H. unfold id in *; cbn. + lia. - now eapply size_mkApps_f. - change (fun x => size (id x)) with size in H. eapply (In_size id size) in H. unfold id in H. @@ -102,7 +105,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v + | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -114,7 +117,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_napp f v : ~~ isApp f -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v + | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -124,8 +127,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor ind i v : - isEtaExp (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v. + Lemma isEtaExp_Constructor ind i v block_args : + isEtaExp (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args. Proof using Type. rewrite isEtaExp_mkApps_napp //. Qed. @@ -134,7 +137,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps f u : isEtaExp (mkApps f u) -> let (hd, args) := decompose_app (mkApps f u) in match construct_viewc hd with - | view_construct kn c => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args + | view_construct kn c block_args => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args | view_other u discr => isEtaExp hd && forallb isEtaExp args end. Proof using Type. @@ -143,7 +146,7 @@ Section isEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l. cbn -[isEtaExp]. intros eq; rewrite eq. - destruct (construct_viewc t) => //. simp isEtaExp in eq; now rewrite eq. + destruct (construct_viewc t) => //. simp isEtaExp in eq. rtoProp. solve_all. assert (t0 :: l <> []) by congruence. revert da H0. generalize (t0 :: l). clear t0 l; intros l. intros da nnil. @@ -179,9 +182,9 @@ Section isEtaExp. Lemma isEtaExp_tApp {f u} : isEtaExp (EAst.tApp f u) -> let (hd, args) := decompose_app (EAst.tApp f u) in match construct_viewc hd with - | view_construct kn c => + | view_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb isEtaExp args + isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args | view_other _ discr => [&& isEtaExp hd, forallb isEtaExp args, isEtaExp f & isEtaExp u] end. @@ -232,17 +235,19 @@ Section WeakEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l0. simp_eta. - rewrite isEtaExp_mkApps_napp //. - destruct construct_viewc. cbn. len. - rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. + destruct construct_viewc. cbn. len. + rtoProp; repeat solve_all. cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. - eapply All_app_inv; eauto. rewrite et forallb_app /=. + eapply All_app_inv; eauto. + cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. + rewrite et forallb_app /=. rtoProp; repeat solve_all. - rewrite isEtaExp_mkApps_napp in et => //. destruct construct_viewc. rewrite -mkApps_app. rewrite isEtaExp_Constructor. - cbn. cbn. rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. - depelim H1. solve_all. eapply All_app_inv => //. + rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. + solve_all. eapply All_app_inv => //. econstructor; eauto. eapply All_app_inv => //. eauto. rewrite -mkApps_app. rewrite isEtaExp_mkApps_napp //. destruct (construct_viewc t0) => //. @@ -259,6 +264,7 @@ Section WeakEtaExp. - intros. simp isEtaExp ; cbn. destruct Nat.compare => //. simp_eta in H. - move/andP: H2 => [] etab etab'. apply/andP. split; eauto. + - rtoProp. intuition eauto. now destruct block_args. - rtoProp. intuition eauto. solve_all. - move/andP: b => [] etaexp h. @@ -269,6 +275,7 @@ Section WeakEtaExp. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. rewrite map_length. rtoProp; solve_all. solve_all. + now destruct block_args. - rewrite csubst_mkApps /=. move/andP: H2 => [] eu ev. specialize (H _ k H1 eu). @@ -459,7 +466,7 @@ Inductive expanded : term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= cstr_arity mind cdecl -> Forall expanded args -> - expanded (mkApps (tConstruct ind idx) args) + expanded (mkApps (tConstruct ind idx []) args) | expanded_tBox : expanded tBox. End expanded. @@ -497,7 +504,7 @@ forall (Σ : global_declarations) (P : term -> Prop), (idecl : one_inductive_body) cdecl (args : list term), declared_constructor Σ (ind, idx) mind idecl cdecl -> - #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx) args)) -> + #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx []) args)) -> (P tBox) -> forall t : term, expanded Σ t -> P t. Proof. @@ -570,7 +577,8 @@ Proof. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + destruct block_args; inv H0. eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. @@ -581,9 +589,10 @@ Proof. intuition auto. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - eapply andb_true_iff in H0 as []. eapply In_All in H. - rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. + - rtoProp. eapply In_All in H. + rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). + destruct block_args; inv H1. eapply expanded_tConstruct_app; eauto. solve_all. - eapply andb_true_iff in H1 as []. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. econstructor. @@ -603,8 +612,8 @@ Proof. eauto). - eapply isEtaExp_mkApps_intro; eauto. solve_all. - solve_all. now rewrite b H. - - rewrite isEtaExp_Constructor. eapply andb_true_iff. - split. 2: eapply forallb_Forall. + - rewrite isEtaExp_Constructor. rtoProp; repeat split. + 2: eapply forallb_Forall. 2: solve_all. eapply expanded_isEtaExp_app_; eauto. Qed. @@ -668,8 +677,8 @@ Proof. eapply In_All in H0; solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. - rewrite EEtaExpanded.isEtaExp_Constructor. apply/andP; split. exact H1. - solve_all. + rewrite EEtaExpanded.isEtaExp_Constructor. rtoProp; repeat split. eauto. + solve_all. destruct block_args; cbn in *; eauto. - eapply In_All in H, H0. simp_eta. move => /andP[] /andP[] etafix etamfix etav. eapply EEtaExpanded.isEtaExp_mkApps_intro. simp_eta. diff --git a/erasure/theories/EEtaExpandedFix.v b/erasure/theories/EEtaExpandedFix.v index bb087a915..3d8101415 100644 --- a/erasure/theories/EEtaExpandedFix.v +++ b/erasure/theories/EEtaExpandedFix.v @@ -58,7 +58,7 @@ Inductive expanded (Γ : list nat): term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= ind_npars mind + cdecl.(cstr_nargs) -> Forall (expanded Γ) args -> - expanded Γ (mkApps (tConstruct ind idx) args) + expanded Γ (mkApps (tConstruct ind idx []) args) | expanded_tBox : expanded Γ tBox. End expanded. @@ -135,7 +135,7 @@ Lemma expanded_ind : → #|args| ≥ ind_npars mind + cdecl.(cstr_nargs) → Forall (expanded Σ Γ) args → Forall (P Γ) args - → P Γ (mkApps (tConstruct ind idx) args)) + → P Γ (mkApps (tConstruct ind idx []) args)) → (∀ Γ : list nat, P Γ tBox) → ∀ (Γ : list nat) (t : term), expanded Σ Γ t → P Γ t. Proof. @@ -225,19 +225,19 @@ Proof. Qed. Equations discr_expanded_head (t : term) : Prop := - discr_expanded_head (tConstruct ind n) := False ; + discr_expanded_head (tConstruct ind n block_args) := False ; discr_expanded_head (tFix mfix idx) := False ; discr_expanded_head (tRel n) := False ; discr_expanded_head _ := True. Inductive expanded_head_view : term -> Type := -| expanded_head_construct : forall ind n, expanded_head_view (tConstruct ind n) +| expanded_head_construct : forall ind n block_args, expanded_head_view (tConstruct ind n block_args) | expanded_head_fix : forall mfix idx, expanded_head_view (tFix mfix idx) | expanded_head_rel : forall n, expanded_head_view (tRel n) | expanded_head_other : forall t, discr_expanded_head t -> expanded_head_view t. Equations expanded_head_viewc t : expanded_head_view t := - expanded_head_viewc (tConstruct ind n) := expanded_head_construct ind n ; + expanded_head_viewc (tConstruct ind n block_args) := expanded_head_construct ind n block_args; expanded_head_viewc (tFix mfix idx) := expanded_head_fix mfix idx ; expanded_head_viewc (tRel n) := expanded_head_rel n ; expanded_head_viewc t := expanded_head_other t I. @@ -266,6 +266,8 @@ Section isEtaExp. Import TermSpineView. + Definition is_nil {A} (l : list A) := match l with nil => true | _ => false end. + Equations? isEtaExp (Γ : list nat) (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := isEtaExp Γ e with TermSpineView.view e := { @@ -273,7 +275,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp Γ x) | tLambda na M => isEtaExp (0 :: Γ) M | tApp u v napp nnil with expanded_head_viewc u := - { | expanded_head_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) + { | expanded_head_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx (List.length v) && forallb_InP mfix (fun x H => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) && forallb_InP v (fun x H => isEtaExp Γ x) @@ -287,14 +289,15 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i => isEtaExp_app ind i 0 }. + | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. Proof using Σ. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - - rewrite size_mkApps. - now apply (In_size id size). + - rewrite size_mkApps. cbn. + apply (In_size id size) in H. + unfold id in H. change (fun x => size x) with size in H. lia. - rewrite size_mkApps. apply (In_size id (fun d => size d.(dbody))) in H. unfold id in H. change (fun x => size x) with size in H. cbn. lia. @@ -325,7 +328,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil Γ f v : ~~ isApp f -> v <> [] -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => option_default (fun m => m <=? List.length v) (nth_error Γ n) false && forallb (fun x => isEtaExp Γ x) v @@ -345,7 +348,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps Γ f v : ~~ isApp f -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v @@ -362,8 +365,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor Γ ind i v : - isEtaExp Γ (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v. + Lemma isEtaExp_Constructor Γ ind i block_args v : + isEtaExp Γ (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args. Proof. now rewrite isEtaExp_mkApps. Qed. @@ -380,7 +383,7 @@ Section isEtaExp. - rewrite isEtaExp_mkApps //. destruct expanded_head_viewc. + cbn. len. - rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. + rtoProp; repeat solve_all; cbn in et; rtoProp; eauto. rename H0 into et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. eapply All_app_inv; eauto. + cbn in *; congruence. @@ -393,9 +396,9 @@ Section isEtaExp. - rewrite isEtaExp_mkApps in et => //. destruct expanded_head_viewc. + rewrite -mkApps_app. rewrite isEtaExp_Constructor. - cbn. cbn. rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. - depelim H1. solve_all. eapply All_app_inv => //. + rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. + eapply All_app_inv => //. econstructor; eauto. eapply All_app_inv => //. eauto. + rewrite -mkApps_app. rewrite isEtaExp_mkApps //. simp expanded_head_viewc. rewrite /isEtaExp_fixapp in et |- *. @@ -439,8 +442,10 @@ Section isEtaExp. rewrite ?closedn_mkApps; rtoProp; (try toAll); repeat solve_all. - destruct nth_error eqn:Hn; cbn in H; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. + - destruct block_args; cbn in *; eauto. - eapply a in b. 2: f_equal. revert b. now len. - eapply a in b. 2: f_equal. revert b. now len. + - cbn. destruct block_args; cbn in *; eauto. - cbn. solve_all. rtoProp; intuition auto. eapply a in H0. 2: reflexivity. revert H0. now len. - destruct nth_error eqn:Hn; cbn in H1; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. @@ -466,6 +471,7 @@ Section isEtaExp. - move/andP: H2 => [] etab etab'. simp_eta. apply/andP. split; eauto. eapply H0 with (Γ := 0 :: Γ0); cbn; eauto. + - rtoProp. intuition eauto. destruct block_args; cbn in *; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a0; cbn; eauto. now len. cbn. now rewrite app_assoc. @@ -473,7 +479,7 @@ Section isEtaExp. - fold csubst. move/andP: H1 => [] etaexp h. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. - rewrite map_length. rtoProp; solve_all. solve_all. + rewrite map_length. rtoProp; solve_all. solve_all. destruct block_args; cbn in *; eauto. - rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -504,7 +510,7 @@ Section isEtaExp. Qed. Lemma etaExp_csubst a b n : - isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). + isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). Proof. intros. eapply etaExp_csubst' with (Γ := []); eauto. @@ -535,6 +541,7 @@ Section isEtaExp. apply/andP. split; eauto. eapply H; eauto. solve_all. eapply H0 with (Γ := 0 :: Γ0); eauto. solve_all. + - rtoProp. intuition eauto. destruct block_args; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a; cbn-[isEtaExp]; eauto. now len. cbn. now rewrite app_assoc. @@ -552,7 +559,7 @@ Section isEtaExp. eapply All_impl; tea; cbv beta. intros x Hx. eapply Hx; eauto. - solve_all. apply Hx. + solve_all. apply Hx. now destruct block_args. - solve_all. rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -730,7 +737,7 @@ Section isEtaExp. Lemma isEtaExp_tApp Γ f u : isEtaExp Γ (mkApps f u) -> let (hd, v) := decompose_app (mkApps f u) in match expanded_head_viewc hd with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => (option_default (fun m => m <=? List.length v) (nth_error Γ n) false) && forallb (fun x => isEtaExp Γ x) v @@ -788,16 +795,18 @@ Proof. - eapply expanded_tRel_app with (args := []). destruct (nth_error); invs H. f_equal. eapply Nat.eqb_eq in H1; eauto. cbn. lia. econstructor. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + destruct block_args; cbn in *; eauto. eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply In_All in H0. solve_all. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - eapply andb_true_iff in H0 as []. eapply In_All in H. - rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. + - rtoProp. eapply In_All in H. + rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). + destruct block_args; cbn in *; eauto. eapply expanded_tConstruct_app; eauto. solve_all. - rtoProp. rewrite forallb_InP_spec in H2. rewrite forallb_InP_spec in H3. eapply In_All in H. eapply In_All in H0. unfold isEtaExp_fixapp in H1. destruct nth_error eqn:E; try congruence. @@ -830,9 +839,9 @@ Proof. + unfold isEtaExp_fixapp. rewrite H4. eapply Nat.ltb_lt. lia. + solve_all; rtoProp; intuition auto. + solve_all. - - rewrite isEtaExp_Constructor. eapply andb_true_iff. - split. 2: eapply forallb_Forall. - 2: solve_all. eapply expanded_isEtaExp_app_; eauto. + - rewrite isEtaExp_Constructor. rtoProp. repeat split. + 2: eapply forallb_Forall; solve_all. + eapply expanded_isEtaExp_app_; eauto. Qed. Definition isEtaExp_constant_decl Σ cb := @@ -871,9 +880,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_tApp' {Σ} {Γ} {f u} : isEtaExp Σ Γ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c => + | expanded_head_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args && is_nil block_args | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ isEtaExp_fixapp mfix idx #|args| && forallb (fun d => isLambda d.(dbody) && isEtaExp Σ (rev_map (fun d => 1 + d.(rarg)) mfix ++ Γ) d.(dbody)) mfix && forallb (isEtaExp Σ Γ) args @@ -1008,22 +1017,22 @@ Qed. Arguments lookup_inductive_pars_constructor_pars_args {Σ ind n pars args}. -Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {wcon : with_constructor_as_block = false} {Σ a a'} : isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ [] a -> isEtaExp Σ [] a'. Proof. intros etaΣ wfΣ. - induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs - | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | ] using eval_mkApps_rect. + induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs + | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | | | ] using eval_mkApps_rect; try now congruence. all:try simp isEtaExp; rewrite -!isEtaExp_equation_1 => //. 6:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] ise etal]]]. + * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. destruct block_args; cbn in *; eauto. pose proof (H' := H). - rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. + rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. pose proof (mkApps_app (EAst.tFix mfix idx) argsv [av]). cbn in H3. rewrite <- H3. clear H3. @@ -1064,8 +1073,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] ise etal]]]. clear IHs. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. + * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. clear IHs. destruct block_args; inv bargs. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. eapply IHeval3. @@ -1114,11 +1123,11 @@ Proof. 11:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] hl' etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - destruct (eval_construct_size H) as [args' []]. subst f'. - rewrite isConstructApp_mkApps /= in H1. - rewrite !negb_or in H1. rtoProp; intuition auto. now cbn in H3. + destruct (eval_construct_size wcon H) as [args' []]. subst f'. + rewrite isConstructApp_mkApps /= in i. + rewrite !negb_or in i. rtoProp; intuition auto. now cbn in H3. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. @@ -1127,7 +1136,7 @@ Proof. { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. - -- subst. rewrite isFixApp_mkApps in H1 => //. destruct EAst.isLambda; easy. + -- subst. rewrite isFixApp_mkApps in i => //. destruct EAst.isLambda; easy. -- eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. @@ -1135,7 +1144,7 @@ Proof. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. destruct nth_error; try easy. - invs H5. eapply Nat.ltb_lt. lia. + invs H4. eapply Nat.ltb_lt. lia. } { @@ -1145,7 +1154,7 @@ Proof. unshelve eapply H0. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H5. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. @@ -1153,7 +1162,7 @@ Proof. destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. } * intros (? & ? & ? & ?). rtoProp. solve_all. - rewrite nth_error_nil in H6. easy. + rewrite nth_error_nil in H5. easy. * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. } @@ -1161,64 +1170,65 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] hl' etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. rewrite -[EAst.tApp _ _](mkApps_app _ _ [a']). - rewrite isEtaExp_Constructor. - move: H0 H1. rewrite hf. intros H0 H1. - destruct (eval_mkApps_Construct_size H0) as [args'' [evc []]]. - eapply mkApps_eq_inj in e as [] => //. subst args''. noconf H3. + rewrite isEtaExp_Constructor. cbn. rewrite andb_true_r. + revert H H0. rewrite hf. intros H H0. + destruct (eval_mkApps_Construct_size wcon H) as [args'' [evc []]]. + eapply mkApps_eq_inj in e1 as [] => //. subst args''. noconf H2. apply/andP; split => //. - + len. - rewrite (remove_last_last l a) // in hl'. + + len. + rewrite (remove_last_last l0 a) // in hl'. rewrite app_length in hl'. cbn in hl'. now rewrite -(All2_length a0). + solve_all. - rewrite (remove_last_last l a) // in etal. + rewrite (remove_last_last l0 a) // in etal. eapply All_app in etal as [etal etaa]. depelim etaa. clear etaa. rewrite -ha in i. eapply All_app_inv; try constructor; eauto. - clear -H1 a0 etal. solve_all. - destruct b as [ev Hev]. eapply (H1 _ _ ev) => //. lia. + solve_all. + destruct b as [ev Hev]. eapply (H0 _ _ ev) => //. lia. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. assert (isEtaExp Σ [] a). { rewrite ha. eapply Forall_last; solve_all. } destruct with_guarded_fix eqn:guarded. - { specialize eval_mkApps_tFix_inv_size with (Heval := H0); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. + { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. -- subst. solve_discr. + -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. repeat split; solve_all. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. - destruct nth_error; try easy. noconf H6. + destruct nth_error; try easy. noconf H4. eapply Nat.ltb_lt. lia. } { - specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H0); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. + specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. -- cbn in *. solve_discr. -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. - unshelve eapply H1. 2: eauto. lia. + unshelve eapply H0. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H6. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. setoid_rewrite Heq in isel. eapply Forall_All in isel. invs isel. solve_all. subst; eauto. - destruct b0. unshelve eapply H1. 2: eauto. lia. eauto. + destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. } - * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H7. easy. - * move/and4P => [] etat etal etaf etaa. + * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H5. easy. + * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. } 1:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. + * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - eapply eval_mkApps_Construct_inv in H as [? []];solve_discr. + eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []];solve_discr. * solve_all. rtoProp. solve_all. subst. destruct with_guarded_fix eqn:guarded. @@ -1265,10 +1275,10 @@ Proof. eapply IHeval2. rewrite /iota_red. eapply isEtaExp_substl with (Γ := repeat 0 #|br.1|); eauto. { len. } - rewrite isEtaExp_Constructor // in H5. solve_all. - eapply All_skipn. move/andP: H5 => []. repeat solve_all. - eapply forallb_nth_error in H7; tea. - now erewrite H1 in H7. + rewrite isEtaExp_Constructor // in H1. solve_all. + eapply All_skipn. move/andP: H1 => []. repeat solve_all. rtoProp. solve_all. + eapply forallb_nth_error in H3; tea. + now erewrite e2 in H3. - rtoProp; intuition auto. eapply IHeval2. eapply isEtaExp_substl. shelve. now apply forallb_repeat. @@ -1278,9 +1288,9 @@ Proof. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. + * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - clear H0; eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + clear H0; eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []]; solve_discr. * solve_all. rtoProp. solve_all. subst. specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Heq'] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn_ & Hunf & Hav & Hsza & Hev & Hsz)]; eauto; try congruence. @@ -1327,9 +1337,9 @@ Proof. eapply IHeval2. specialize (IHeval1 hd). move: IHeval1. rewrite isEtaExp_Constructor. - destruct args => //. now rewrite nth_error_nil in H2. - move=> /andP[] _ hargs. - eapply nth_error_forallb in H2; tea. + destruct args => //. now rewrite nth_error_nil in e3. + intros. rtoProp. + eapply nth_error_forallb in e3; tea. Qed. Lemma isEtaExp_fixapp_mon {mfix idx n n'} : n <= n' -> isEtaExp_fixapp mfix idx n -> isEtaExp_fixapp mfix idx n'. @@ -1465,18 +1475,18 @@ Lemma neval_to_stuck_fix {efl : EEnvFlags} {Σ mfix idx t} : isEtaExp Σ [] t -> @eval opt_wcbv_flags Σ t (tFix mfix idx) -> False. Proof. intros etaΣ wfΣ he hev. - pose proof (eval_etaexp etaΣ wfΣ hev he). + unshelve epose proof (eval_etaexp etaΣ wfΣ hev he). eauto. now apply isEtaExp_tFix in H. Qed. -Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl Σ mfix idx t args} : +Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl} {wcon : with_constructor_as_block = false} {Σ mfix idx t args} : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> isEtaExp Σ [] t -> @eval fl Σ t (mkApps (tFix mfix idx) args) -> False. Proof. intros wguard etaΣ wfΣ he hev. - pose proof (eval_etaexp etaΣ wfΣ hev he). + unshelve epose proof (eval_etaexp etaΣ wfΣ hev he); eauto. move: H. move/isEtaExp_tApp. rewrite decompose_app_mkApps // /= // app_nil_r //. @@ -1491,13 +1501,14 @@ Qed. Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : with_guarded_fix -> + with_constructor_as_block = false -> @eval fl Σ f v -> isEtaExp Σ [] (tApp f u) -> - (forall kn c args, v <> mkApps (tConstruct kn c) args) -> + (forall kn c args block_args, v <> mkApps (tConstruct kn c block_args) args) -> (forall mfix idx args, v <> mkApps (tFix mfix idx) args) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c => False + | expanded_head_construct kn c _ => False | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ [&& isEtaExp_fixapp mfix idx #|remove_last args|, @@ -1508,14 +1519,14 @@ Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : [&& isEtaExp Σ [] hd, forallb (isEtaExp Σ []) args, isEtaExp Σ [] f & isEtaExp Σ [] u] end. Proof. - intros wguard ev eta; revert eta ev. + intros wguard wcon ev eta; revert eta ev. move/isEtaExp_tApp'. cbn -[decompose_app]. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:cv => //. - * move=> [] hl [] ha [] ht /andP[] etaap etal. + * move=> [] hl [] ha [] ht /andP[] /andP[] etaap etal bargs. destruct block_args; inv bargs. rewrite ha. intros h. eapply eval_mkApps_Construct_inv in h as [? []]. subst v. - intros Hc _. specialize (Hc ind n x). now apply Hc. + intros Hc _. specialize (Hc ind n x). now eapply Hc. auto. * move=> [] hl [] ha [] ht /andP[] /andP[] etafix etab etal. rewrite ha. intros H; eapply eval_stuck_fix_eq in H as [args' [Hargs' [[]|]]]. subst v. @@ -1608,12 +1619,12 @@ Proof. eapply eval_app_cong_tApp'. now eapply eval_to_value in evf''. exact e0. exact evres. Qed. -Lemma All_eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} Σ l l' : +Lemma All_eval_etaexp {fl : WcbvFlags} {wcon : with_constructor_as_block = false } {efl : EEnvFlags} Σ l l' : isEtaExp_env Σ -> wf_glob Σ -> All2 (eval Σ) l l' -> forallb (isEtaExp Σ []) l -> forallb (isEtaExp Σ []) l'. Proof. - intros; solve_all. now eapply eval_etaexp. + intros; solve_all. eapply eval_etaexp; eauto. Unshelve. eauto. Qed. Lemma isFix_mkApps f args : ~~ isFix f -> ~~ isFix (mkApps f args). @@ -1632,7 +1643,7 @@ Proof. intros h. now apply isFix_mkApps. Qed. -Lemma eval_opt_to_target {fl: WcbvFlags} {efl : EEnvFlags} Σ t v : +Lemma eval_opt_to_target {fl: WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} Σ t v : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> @@ -1643,7 +1654,7 @@ Proof. intros wguard etaΣ wfΣ. intros H. induction H using eval_mkApps_rect. - - move/(isEtaExp_tApp_eval wguard H) => IH. + - move/(isEtaExp_tApp_eval wguard wcon H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp a t)) eqn:da. @@ -1661,7 +1672,7 @@ Proof. forward IHeval2 => //. econstructor; eauto. - clear H0. - move/(isEtaExp_tApp_eval wguard H) => IH. + move/(isEtaExp_tApp_eval wguard wcon H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp f0 a)) eqn:da. @@ -1689,14 +1700,15 @@ Proof. eapply eval_etaexp in IHeval1; tea. - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. - move: (eval_etaexp etaΣ wfΣ IHeval1 etad). - rewrite isEtaExp_Constructor => /andP[] etac etaargs. + unshelve epose proof (eval_etaexp etaΣ wfΣ IHeval1 etad). eauto. + revert H1. + rewrite isEtaExp_Constructor => /andP[] /andP[] etac etaargs bargs. forward_keep IHeval2 => //. eapply isEtaExp_iota_red'; eauto. - eapply forallb_nth_error in etabrs; tea. erewrite H1 in etabrs. - cbn in etabrs. now rewrite -H3 app_nil_r skipn_length in etabrs. + eapply forallb_nth_error in etabrs; tea. erewrite e2 in etabrs. + cbn in etabrs. now rewrite -e4 app_nil_r skipn_length in etabrs. econstructor; tea. - + - congruence. - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. eapply eval_iota_sing => //. tea. @@ -1710,9 +1722,9 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha heta. + * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. clear H0. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. set (H' := H); assert (eval_depth H' = eval_depth H) by reflexivity. clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. @@ -1769,8 +1781,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha heta. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. eauto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. rewrite hf in H. elimtype False. @@ -1820,10 +1832,11 @@ Proof. forward IHeval1 by tas. forward IHeval2. { eapply eval_etaexp in H; tea. - move: H; rewrite isEtaExp_mkApps // /= => /andP[] etaapp etaargs. + move: H; rewrite isEtaExp_mkApps // /= => /andP[] /andP[] etaapp etaargs bargs. eapply forallb_nth_error in etaargs; tea. - now erewrite H2 in etaargs. } + now erewrite e3 in etaargs. } eapply eval_proj; tea. + - congruence. - simp_eta => etad. forward IHeval by tas. eapply eval_proj_prop ; tea. @@ -1831,13 +1844,13 @@ Proof. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] heta etal. - set (H' := H0) ; assert (eval_depth H' = eval_depth H0) by reflexivity. - clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. - eapply mkApps_eq_inj in heq as [] => //. noconf H4. noconf H5. + * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. + set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. + clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. + eapply mkApps_eq_inj in heq as [] => //. noconf H2. noconf H3. intros hevd. - rewrite (remove_last_last l a hl). + rewrite (remove_last_last l0 a hl). rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply eval_mkApps_Construct; tea. { now constructor. } @@ -1846,22 +1859,22 @@ Proof. eapply forallb_remove_last, forallb_All in etal. eapply All2_All_mix_left in hargs; tea. eapply All2_impl; tea. cbn; intros ? ? []. - destruct s as [evxy hevxy]. unshelve eapply H1; tea. lia. + destruct s as [evxy hevxy]. unshelve eapply H0; tea. lia. constructor; [|constructor]. rewrite -ha. eapply IHeval2. rewrite ha. now eapply forallb_last. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } - rewrite (remove_last_last l a hl) /=. + rewrite (remove_last_last l0 a hl) /=. rewrite mkApps_app. eapply eval_construct; tea. - pose proof H0 as Hfix. + pose proof H as Hfix. rewrite hf in Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. { solve_discr. } - { cbn in H2. + { cbn in H1. rewrite hf in IHeval1. eapply IHeval1. rewrite isEtaExp_mkApps // /= i /= etab /=. move: isel. - now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } + now rewrite {1}(remove_last_last l0 a hl) /= forallb_app => /andP[]. } { now rewrite -ha. } * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1870,21 +1883,22 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_construct; tea. + - congruence. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] heta etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. - clearbody H'. move: H' H3. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. + clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. subst f'. - rewrite isConstructApp_mkApps /isConstructApp /= in H1. - now rewrite !negb_or /= !andb_false_r in H1. + rewrite isConstructApp_mkApps /isConstructApp /= in i. + now rewrite !negb_or /= !andb_false_r in i. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } rewrite (remove_last_last l a hl) /=. - rewrite mkApps_app. rewrite wguard in H1. + rewrite mkApps_app. rewrite wguard in i. move: H H0. rewrite hf. intros H IH. eapply eval_app_cong; tea. @@ -1892,12 +1906,12 @@ Proof. unshelve eapply IH. exact H. lia. pose proof H as Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. - { subst f'. rewrite isFixApp_mkApps in H1. - now rewrite !negb_or /= !andb_false_r in H1. } - { rewrite isEtaExp_mkApps // /= i /= etab /=. + { subst f'. rewrite isFixApp_mkApps in i. + now rewrite !negb_or /= !andb_false_r in i. } + { rewrite isEtaExp_mkApps // /= i0 /= etab /=. move: isel. now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } - cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. + cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1906,10 +1920,11 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_app_cong; tea. - cbn. rewrite wguard in H1. - cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. + cbn. rewrite wguard in i. + cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. - intros hexp. now eapply eval_atom. + Unshelve. all: eauto. Qed. Lemma expanded_global_env_isEtaExp_env {Σ} : expanded_global_env Σ -> isEtaExp_env Σ. diff --git a/erasure/theories/EGlobalEnv.v b/erasure/theories/EGlobalEnv.v index 3448f7540..60aefe00d 100644 --- a/erasure/theories/EGlobalEnv.v +++ b/erasure/theories/EGlobalEnv.v @@ -247,7 +247,7 @@ Definition is_constructor_app_or_box t := | a => let (f, a) := decompose_app a in match f with - | tConstruct _ _ => true + | tConstruct _ _ _ => true | _ => false end end. diff --git a/erasure/theories/EInduction.v b/erasure/theories/EInduction.v index 61a591530..659d24b37 100644 --- a/erasure/theories/EInduction.v +++ b/erasure/theories/EInduction.v @@ -25,7 +25,8 @@ Lemma term_forall_list_ind : P t -> forall t0 : term, P t0 -> P (tLetIn n t t0)) -> (forall t u : term, P t -> P u -> P (tApp t u)) -> (forall s, P (tConst s)) -> - (forall (i : inductive) (n : nat), P (tConstruct i n)) -> + (forall (i : inductive) (n : nat) (args : list term), + All P args -> P (tConstruct i n args)) -> (forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) -> @@ -50,6 +51,11 @@ Proof. destruct l; constructor; [|apply auxl']. apply auxt. + revert l. + fix auxl' 1. + destruct l; constructor; [|apply auxl']. + apply auxt. + revert m. fix auxm 1. destruct m; constructor; [|apply auxm]. @@ -93,6 +99,7 @@ Fixpoint size t : nat := | tProj p c => S (size c) | tFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) | tCoFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) + | tConstruct _ _ ignore_args => S (list_size size ignore_args) | _ => 1 end. @@ -168,7 +175,7 @@ Qed. Lemma size_mkApps_l {f l} (Hf : ~~ isApp f) (Hl : l <> []) : list_size size l < size (mkApps f l). Proof. rewrite size_mkApps. - destruct f => /= //; lia. + destruct f => /= //; try lia. Qed. (** Custom induction principle on syntax, dealing with the various lists appearing in terms. *) @@ -202,7 +209,7 @@ Section MkApps_rec. (papp : forall t u, ~~ isApp t -> u <> nil -> P t -> All P u -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) + (pconstruct : forall (i : inductive) (n : nat) args, All P args -> P (tConstruct i n args)) (pcase : forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) @@ -229,7 +236,7 @@ Section MkApps_rec. let pl := All_rec P id l (fun x H => rec x) in rew _ in papp t l napp nonnil pt pl } | tConst k => pconst k - | tConstruct i n => pconstruct i n + | tConstruct i n args => pconstruct i n _ (All_rec P id args (fun x H => rec x)) | tCase ina c brs => pcase ina c (rec c) brs (All_rec P (fun x => x.2) brs (fun x H => rec x)) | tProj p c => pproj p c (rec c) | tFix mfix idx => pfix mfix idx (All_rec P dbody mfix (fun x H => rec x)) @@ -260,7 +267,7 @@ Section MkApps_rec. (plet : forall (n : name) (t : term), forall t0 : term, P (tLetIn n t t0)) (papp : forall t u, ~~ isApp t -> u <> nil -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) + (pconstruct : forall (i : inductive) (n : nat) args, P (tConstruct i n args)) (pcase : forall (p : inductive * nat) (t : term) (l : list (list name * term)), P (tCase p t l)) (pproj : forall (s : projection) (t : term), P (tProj s t)) (pfix : forall (m : mfixpoint term) (n : nat), P (tFix m n)) @@ -281,7 +288,7 @@ Section MkApps_rec. let nonnil := decompose_app_app _ _ _ _ da in rew [P] (eq_sym (decompose_app_inv da)) in papp t l napp nonnil } | tConst k => pconst k - | tConstruct i n => pconstruct i n + | tConstruct i n args => pconstruct i n args | tCase ina c brs => pcase ina c brs | tProj p c => pproj p c | tFix mfix idx => pfix mfix idx diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index 3f99c9e9c..da5debd48 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -90,7 +90,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct _ _ _ => t (* | tPrim _ => t *) end. @@ -142,6 +142,7 @@ Section optimize. unfold wf_fix, test_def in *; simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct (k ?= n0)%nat; auto. + - f_equal. rtoProp. now destruct args; inv H0. - move/andP: wft => [] /andP[] hi hb hl. rewrite IHb. f_equal. unfold on_snd; solve_all. repeat toAll. f_equal. solve_all. unfold on_snd; cbn. f_equal. rewrite a0 //. now rewrite -Nat.add_assoc. @@ -406,7 +407,7 @@ Proof. now rewrite List.rev_length hskip Nat.add_0_r. Qed. -Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. +Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := false |}. Lemma isFix_mkApps t l : isFix (mkApps t l) = isFix t && match l with [] => true | _ => false end. Proof. @@ -472,7 +473,7 @@ Proof. * intros hnth. now apply IHs. Qed. -Lemma optimize_correct (efl := all_env_flags) {fl} {Σ : GlobalContextMap.t} t v : +Lemma optimize_correct (efl := all_env_flags) {fl} {wcon : with_constructor_as_block = false} { Σ : GlobalContextMap.t} t v : wf_glob Σ -> @eval fl Σ t v -> wellformed Σ 0 t -> @@ -501,11 +502,13 @@ Proof. eapply nth_error_forallb in wfbrs; tea. rewrite Nat.add_0_r in wfbrs. forward IHev2. eapply wellformed_iota_red; tea => //. - rewrite optimize_iota_red in IHev2 => //. now rewrite e2. + rewrite optimize_iota_red in IHev2 => //. now rewrite e3. econstructor; eauto. rewrite -is_propositional_cstr_optimize //. tea. - rewrite nth_error_map e0 //. len. len. - + rewrite nth_error_map e1 //. len. len. + + - congruence. + - move/andP => [] /andP[] hl wfd wfbrs. forward IHev2. eapply wellformed_substl; tea => //. rewrite forallb_repeat //. len. @@ -587,7 +590,7 @@ Proof. move/wf_mkApps: ev1 => [] wfc wfargs. destruct lookup_projection as [[[[mdecl idecl] cdecl'] pdecl]|] eqn:hl' => //. pose proof (lookup_projection_lookup_constructor hl'). - rewrite (constructor_isprop_pars_decl_constructor H) in e. noconf e. + rewrite (constructor_isprop_pars_decl_constructor H) in e0. noconf e0. forward IHev1 by auto. forward IHev2. eapply nth_error_forallb in wfargs; tea. rewrite optimize_mkApps /= in IHev1. @@ -604,11 +607,13 @@ Proof. rewrite nth_error_rev. len. rewrite skipn_length. lia. rewrite List.rev_involutive. len. rewrite skipn_length. rewrite nth_error_skipn nth_error_map. - rewrite e0 -H1. + rewrite e1 -H1. assert((ind_npars mdecl + cstr_nargs cdecl - ind_npars mdecl) = cstr_nargs cdecl) by lia. rewrite H3. - eapply (f_equal (option_map (optimize Σ))) in e1. - cbn in e1. rewrite -e1. f_equal. f_equal. lia. + eapply (f_equal (option_map (optimize Σ))) in e2. + cbn in e2. rewrite -e2. f_equal. f_equal. lia. + + - congruence. - move=> /andP[] iss cld. rewrite GlobalContextMap.lookup_projection_spec. @@ -629,11 +634,13 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e. + rewrite -lookup_constructor_optimize //. exact e0. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. + - congruence. + - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply eval_app_cong; eauto. diff --git a/erasure/theories/ELiftSubst.v b/erasure/theories/ELiftSubst.v index 91f9b59ad..f269e6574 100644 --- a/erasure/theories/ELiftSubst.v +++ b/erasure/theories/ELiftSubst.v @@ -34,7 +34,7 @@ Fixpoint lift n k t : term := | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct ind i args => tConstruct ind i (map (lift n k) args) (* | tPrim _ => t *) end. @@ -69,6 +69,7 @@ Fixpoint subst s k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (subst s k')) mfix in tCoFix mfix' idx + | tConstruct ind i args => tConstruct ind i (map (subst s k) args) | x => x end. @@ -95,6 +96,7 @@ Fixpoint closedn k (t : term) : bool := | tCoFix mfix idx => let k' := List.length mfix + k in List.forallb (test_def (closedn k')) mfix + | tConstruct ind i args => forallb (closedn k) args | _ => true end. @@ -106,7 +108,7 @@ Require Import PeanoNat. Import Nat. Lemma lift_rel_ge : - forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). + forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). Proof. intros; simpl in |- *. now elim (leb_spec p n). @@ -450,8 +452,8 @@ Proof. revert H. elim (Nat.ltb_spec n0 k); intros; try easy. - cbn. f_equal; auto. rtoProp; solve_all. - rtoProp; solve_all. - destruct x; f_equal; cbn in *. now apply a0. + rtoProp; solve_all. + destruct x; f_equal; cbn in *. eauto. Qed. Lemma closed_upwards {k t} k' : closedn k t -> k' >= k -> closedn k' t. @@ -604,6 +606,7 @@ Proof. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. rewrite IHt1 // IHt2 //. + - eapply All_forallb_eq_forallb; eauto. - rewrite IHt //. f_equal. eapply All_forallb_eq_forallb; tea. cbn. intros. specialize (H (#|x.1| + k')). diff --git a/erasure/theories/EOptimizePropDiscr.v b/erasure/theories/EOptimizePropDiscr.v index 64a4ef6f7..2626cbd70 100644 --- a/erasure/theories/EOptimizePropDiscr.v +++ b/erasure/theories/EOptimizePropDiscr.v @@ -61,7 +61,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct ind i args => tConstruct ind i (map optimize args) (* | tPrim _ => t *) end. @@ -366,7 +366,8 @@ Proof. lookup_projection GlobalContextMap.inductive_isprop_and_pars]; intros => //. all:unfold wf_fix_gen in *; rtoProp; intuition auto. - all:f_equal; eauto; solve_all. + all:try now f_equal; eauto; solve_all. + - destruct args; inv H2. reflexivity. - rewrite !GlobalContextMap.inductive_isprop_and_pars_spec. assert (map (on_snd (optimize Σ)) l = map (on_snd (optimize Σ')) l) as -> by solve_all. rewrite (extends_inductive_isprop_and_pars H0 H1 H2). @@ -522,7 +523,7 @@ Proof. destruct nth_error => //. congruence. Qed. -Lemma optimize_correct {efl : EEnvFlags} {fl} {Σ : GlobalContextMap.t} t v : +Lemma optimize_correct {efl : EEnvFlags} {fl}{wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : wf_glob Σ -> closed_env Σ -> @Ee.eval fl Σ t v -> @@ -550,11 +551,26 @@ Proof. rewrite optimize_iota_red in IHev2. eapply eval_closed in ev1 => //. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e). - eapply eval_iota; eauto. tea. + rewrite (constructor_isprop_pars_decl_inductive e0). + eapply eval_iota; eauto. now rewrite -is_propositional_cstr_optimize. - rewrite nth_error_map e0 //. now len. cbn. - rewrite -e2. rewrite !skipn_length map_length //. + rewrite nth_error_map e1 //. now len. cbn. + rewrite -e3. rewrite !skipn_length map_length //. + eapply IHev2. + eapply closed_iota_red => //; tea. + eapply nth_error_forallb in clbrs; tea. cbn in clbrs. + now rewrite Nat.add_0_r in clbrs. + + - move/andP => [] cld clbrs. + have := (eval_closed _ clΣ _ _ cld ev1). intros cl. + rewrite optimize_iota_red in IHev2. + eapply eval_closed in ev1 => //. + rewrite GlobalContextMap.inductive_isprop_and_pars_spec. + rewrite (constructor_isprop_pars_decl_inductive e0). + eapply eval_iota_block. eauto. eauto. + now rewrite -is_propositional_cstr_optimize. + rewrite nth_error_map e1 //. now len. cbn. + rewrite -e3. rewrite !skipn_length map_length //. eapply IHev2. eapply closed_iota_red => //; tea. eapply nth_error_forallb in clbrs; tea. cbn in clbrs. @@ -657,14 +673,25 @@ Proof. eapply eval_closed in ev1; tea. move: ev1; rewrite closedn_mkApps /= => clargs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e). + rewrite (constructor_isprop_pars_decl_inductive e0). rewrite optimize_mkApps in IHev1. specialize (IHev1 cld). eapply Ee.eval_proj; tea. now rewrite -is_propositional_cstr_optimize. - now len. rewrite nth_error_map e1 //. + now len. rewrite nth_error_map e2 //. + eapply IHev2. + eapply nth_error_forallb in e2; tea. + + - move=> cld. + eapply eval_closed in ev1; tea. + rewrite GlobalContextMap.inductive_isprop_and_pars_spec. + rewrite (constructor_isprop_pars_decl_inductive e0). + specialize (IHev1 cld). + eapply Ee.eval_proj_block; tea. + now rewrite -is_propositional_cstr_optimize. + now len. rewrite nth_error_map e2 //. eapply IHev2. - eapply nth_error_forallb in e1; tea. + eapply nth_error_forallb in e2; tea. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. now rewrite e. @@ -672,11 +699,13 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e. + rewrite -lookup_constructor_optimize //. exact e0. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. + - congruence. + - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply Ee.eval_app_cong; eauto. @@ -698,22 +727,10 @@ Proof. destruct args using rev_case => // /=. rewrite map_app !mkApps_app /= //. destruct v => /= //. - destruct t => //. - all:constructor; eauto. + all:constructor; eauto. cbn in *. destruct l; eauto. + Unshelve. all: repeat econstructor. Qed. -(* -Lemma optimize_extends Σ Σ' : - wf_glob Σ' -> - extends Σ Σ' -> - forall t b, optimize Σ t = b -> optimize Σ' t = b. -Proof. - intros wf ext. - induction t using EInduction.term_forall_list_ind; cbn => //. - all:try solve [f_equal; solve_all]. - destruct inductive_isp - rewrite (extends_is_propositional wf ext). - *) - From MetaCoq.Erasure Require Import EEtaExpanded. Lemma isLambda_optimize Σ t : isLambda t -> isLambda (optimize Σ t). @@ -841,6 +858,7 @@ Proof. intros wfΣ hbox hrel. induction t in n |- * using EInduction.term_forall_list_ind => //. all:try solve [cbn; rtoProp; intuition auto; solve_all]. + - cbn. intros. rtoProp; intuition eauto. now destruct args; inv H0. - cbn -[GlobalContextMap.inductive_isprop_and_pars lookup_inductive]. move/and3P => [] hasc /andP[]hs ht hbrs. destruct GlobalContextMap.inductive_isprop_and_pars as [[[|] _]|] => /= //. destruct l as [|[br n'] [|l']] eqn:eql; simpl. @@ -879,7 +897,8 @@ Proof. destruct (cst_body c) => //. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. - destruct g eqn:hg => /= //. + destruct g eqn:hg => /= //. + all: try now (intros; rtoProp; congruence). - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. subst g. diff --git a/erasure/theories/EPretty.v b/erasure/theories/EPretty.v index 4322008aa..96f534226 100644 --- a/erasure/theories/EPretty.v +++ b/erasure/theories/EPretty.v @@ -111,11 +111,11 @@ Module PrintTermTree. | tApp f l => parens (top || inapp) (print_term Γ false true f ^ " " ^ print_term Γ false false l) | tConst c => string_of_kername c - | tConstruct (mkInd i k as ind) l => + | tConstruct (mkInd i k as ind) l args => match lookup_ind_decl Σ i k with | Some oib => match nth_error oib.(ind_ctors) l with - | Some cstr => cstr.(cstr_name) + | Some cstr => cstr.(cstr_name) ^ maybe_string_of_list string_of_term args | None => "UnboundConstruct(" ^ string_of_inductive ind ^ "," ^ string_of_nat l ^ ")" end diff --git a/erasure/theories/EReflect.v b/erasure/theories/EReflect.v index 99dc459ef..039df2bc7 100644 --- a/erasure/theories/EReflect.v +++ b/erasure/theories/EReflect.v @@ -59,6 +59,15 @@ Proof. - destruct (IHx1 t1) ; nodec. destruct (IHx2 t2) ; nodec. subst. left. reflexivity. + - revert l. induction X ; intro l0. + + destruct l0. + * left. reflexivity. + * right. discriminate. + + destruct l0. + * right. discriminate. + * destruct (IHX l0) ; nodec. + destruct (p t) ; nodec. + inversion e. subst; left; reflexivity. - destruct (IHx t) ; nodec. subst. revert l0. clear IHx. induction X ; intro l0. diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index 134be90a4..d17d52665 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -36,10 +36,10 @@ Section strip. | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => strip x)) | tLambda na M => EAst.tLambda na (strip M) | tApp u v napp nnil with construct_viewc u := { - | view_construct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | view_construct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { | Some npars := - mkApps (EAst.tConstruct kn c) (List.skipn npars (map_InP v (fun x H => strip x))) - | None => mkApps (EAst.tConstruct kn c) (map_InP v (fun x H => strip x)) } + mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map_InP v (fun x H => strip x))) + | None => mkApps (EAst.tConstruct kn c block_args) (map_InP v (fun x H => strip x)) } | view_other u nconstr => mkApps (strip u) (map_InP v (fun x H => strip x)) } @@ -57,15 +57,15 @@ Section strip. | tBox => EAst.tBox | tVar n => EAst.tVar n | tConst n => EAst.tConst n - | tConstruct ind i => EAst.tConstruct ind i }. + | tConstruct ind i block_args => EAst.tConstruct ind i block_args }. Proof. all:try lia. all:try apply (In_size); tea. - now eapply (In_size id size). - rewrite size_mkApps. - now eapply (In_size id size) in H. + eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. - rewrite size_mkApps. - now eapply (In_size id size) in H. + eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. - now eapply size_mkApps_f. - pose proof (size_mkApps_l napp nnil). eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. lia. @@ -108,9 +108,9 @@ Section strip. - rewrite !closedn_mkApps in H1 *. rtoProp; intuition auto. solve_all. - - rewrite !closedn_mkApps /= in H0 *. - rewrite forallb_skipn; solve_all. - - rewrite !closedn_mkApps /= in H0 *; solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. + rewrite forallb_skipn; solve_all. solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. repeat solve_all. Qed. Hint Rewrite @forallb_InP_spec : isEtaExp. @@ -119,10 +119,10 @@ Section strip. Local Lemma strip_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c => + | view_construct kn c block_args => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -139,10 +139,10 @@ Section strip. Lemma strip_mkApps f v : ~~ isApp f -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c => + | view_construct kn c block_args => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -177,7 +177,8 @@ Section strip. simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct Nat.compare => //. - - f_equal. solve_all. move/andP: b => [] _ he. solve_all. + - f_equal. rtoProp. solve_all. destruct block_args; inv H2. eauto. + - f_equal. solve_all. move/andP: b => [] _ he. solve_all. - specialize (H a k H1 H2). rewrite !csubst_mkApps in H2 *. rewrite isEtaExp_mkApps_napp // in H3. @@ -208,7 +209,7 @@ Section strip. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). rewrite -mkApps_app /= !skipn_map. f_equal. rewrite skipn_app map_app. f_equal. - assert (pars - #|l| = 0). eapply Nat.leb_le in ise; lia. + assert (pars - #|l| = 0). rtoProp. rename H4 into ise. eapply Nat.leb_le in ise; lia. rewrite H4 skipn_0. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } @@ -225,7 +226,7 @@ Section strip. rewrite /isEtaExp_app in H4. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => // /=. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). - assert (pars = 0). eapply Nat.leb_le in H4. lia. + assert (pars = 0). rtoProp. eapply Nat.leb_le in H4. lia. subst pars. rewrite skipn_0. simp strip; rewrite -strip_equation_1. { f_equal. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } } @@ -240,11 +241,12 @@ Section strip. unfold isEtaExp_app in etaapp. rewrite GlobalContextMap.lookup_inductive_pars_spec in Heq. rewrite Heq in etaapp *. - f_equal. rewrite map_skipn. f_equal. + f_equal. + now destruct block_args; inv etav. + rewrite map_skipn. f_equal. rewrite !map_map_compose. - rewrite isEtaExp_Constructor // in H2. - move/andP: H2 => [] etaapp' ev. - clear -H0 H1 ev H. solve_all. + rewrite isEtaExp_Constructor // in H2. rtoProp. + solve_all. - pose proof (etaExp_csubst _ _ k _ H1 H2). rewrite !csubst_mkApps /= in H3 *. assert (map (csubst a k) v <> []). @@ -433,9 +435,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_mkApps {Σ} {f u} : isEtaExp Σ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match construct_viewc hd with - | view_construct kn c => + | view_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args && is_nil block_args | view_other _ discr => [&& isEtaExp Σ hd, forallb (isEtaExp Σ) args, isEtaExp Σ f & isEtaExp Σ u] end. @@ -496,7 +498,7 @@ Proof. rewrite isEtaExp_mkApps_napp // in etaf. simp construct_viewc in etaf. move/andP: etaf => []. rewrite /isEtaExp_app hl. - move/Nat.leb_le. lia. } + move => /andP[] /Nat.leb_le. lia. } { move/and4P=> [] iset isel _ _. rewrite (decompose_app_inv da). pose proof (decompose_app_notApp _ _ _ da). rewrite strip_mkApps //. @@ -531,9 +533,9 @@ Module Fast. | app, tCoFix mfix idx => let mfix' := strip_defs mfix in mkApps (EAst.tCoFix mfix' idx) app - | app, tConstruct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars app) - | None => mkApps (EAst.tConstruct kn c) app } + | app, tConstruct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars app) + | None => mkApps (EAst.tConstruct kn c block_args) app } | app, x => mkApps x app } where strip_args (t : list term) : list term := @@ -646,22 +648,22 @@ Proof. rewrite mkApps_app /= //. Qed. -Lemma isLambda_mkApps_Construct ind n l : - ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isLambda_mkApps_Construct ind n block_args l : + ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isBox_mkApps_Construct ind n l : - ~~ isBox (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isBox_mkApps_Construct ind n block_args l : + ~~ isBox (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isFix_mkApps_Construct ind n l : - ~~ isFix (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isFix_mkApps_Construct ind n block_args l : + ~~ isFix (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. @@ -673,7 +675,7 @@ Proof. funelim (strip Σ f); cbn -[strip]; (try simp_strip) => //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _ _)) //. Qed. Lemma strip_isBox Σ f : @@ -683,7 +685,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isBox_mkApps' _ _ _)) //. rewrite (negbTE (isBox_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _ _)) //. Qed. Lemma isApp_mkApps u v : v <> nil -> isApp (mkApps u v). @@ -708,7 +710,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isFix_mkApps' _ _ _)) //. rewrite (negbTE (isFix_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _ _)) //. Qed. Lemma strip_isFixApp Σ f : @@ -776,15 +778,16 @@ Proof. destruct construct_viewc eqn:vc. + move=> /andP[] hl0 etal0. rewrite -mkApps_app. - rewrite (strip_mkApps Σ (tConstruct ind n)) // /=. + rewrite (strip_mkApps Σ (tConstruct ind n block_args)) // /=. rewrite strip_mkApps // /=. unfold isEtaExp_app in hl0. destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. - eapply Nat.leb_le in hl0. + rtoProp. + eapply Nat.leb_le in H. rewrite (lookup_inductive_pars_constructor_pars_args hl). rewrite -mkApps_app. f_equal. rewrite map_app. rewrite skipn_app. len. assert (pars - #|l| = 0) by lia. - now rewrite H skipn_0. + now rewrite H1 skipn_0. + move=> /andP[] etat0 etal0. rewrite -mkApps_app !strip_mkApps; try now eapply decompose_app_notApp. rewrite vc. rewrite -mkApps_app !map_app //. @@ -820,7 +823,7 @@ Proof. split; intros; rtoProp; intuition auto; solve_all. Qed. -Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {Σ : GlobalContextMap.t} t v : +Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : closed_env Σ -> isEtaExp_env Σ -> wf_glob Σ -> @@ -831,7 +834,7 @@ Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {Σ : GlobalContextMap.t Proof. intros clΣ etaΣ wfΣ ev clt etat. revert t v clt etat ev. - apply (eval_preserve_mkApps_ind wfl Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) + unshelve eapply (eval_preserve_mkApps_ind wfl wcon Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) (fun n x => closedn n x) (Qpres := Qpreserves_closedn Σ clΣ)) => //. { intros. eapply eval_closed; tea. } all:intros; simpl in *. @@ -863,7 +866,7 @@ Proof. * cbn -[strip]. have etaargs : forallb (isEtaExp Σ) args. { rewrite isEtaExp_Constructor in i6. - now move/andP: i6 => []. } + now move/andP: i6 => [] /andP[]. } rewrite strip_iota_red // in e. rewrite closedn_mkApps in i4. now move/andP: i4. cbn. now eapply nth_error_forallb in H; tea. @@ -1172,7 +1175,7 @@ Proof. rewrite strip_mkApps // /=. move: Heq. rewrite GlobalContextMap.lookup_inductive_pars_spec. - unfold wellformed in wfc. move/andP: wfc => [] hacc hc. + unfold wellformed in wfc. move/andP: wfc => [] /andP[] hacc hc bargs. unfold lookup_inductive_pars. destruct lookup_minductive eqn:heq => //. unfold lookup_constructor, lookup_inductive in hc. rewrite heq /= // in hc. Qed. diff --git a/erasure/theories/ESpineView.v b/erasure/theories/ESpineView.v index 7bee803c6..8bbb0ca70 100644 --- a/erasure/theories/ESpineView.v +++ b/erasure/theories/ESpineView.v @@ -17,7 +17,7 @@ Inductive t : term -> Set := | tLetIn n b b' : t (EAst.tLetIn n b b') | tApp (f : term) (l : list term) (napp : ~~ isApp f) (nnil : l <> nil) : t (mkApps f l) | tConst kn : t (tConst kn) -| tConstruct i n : t (tConstruct i n) +| tConstruct i n args : t (tConstruct i n args) | tCase ci p brs : t (tCase ci p brs) | tProj p c : t (tProj p c) | tFix mfix idx : t (tFix mfix idx) diff --git a/erasure/theories/ETransform.v b/erasure/theories/ETransform.v index 9b34d1a0b..82f2318b3 100644 --- a/erasure/theories/ETransform.v +++ b/erasure/theories/ETransform.v @@ -111,7 +111,7 @@ Qed. Import EWcbvEval (WcbvFlags, with_prop_case, with_guarded_fix). -Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {efl : EEnvFlags} (wguard : with_guarded_fix) : +Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} {efl : EEnvFlags} (wguard : with_guarded_fix) : Transform.t eprogram_env eprogram_env EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram_env (EWcbvEval.switch_unguarded_fix fl)) := {| name := "switching to unguarded fixpoints"; @@ -122,10 +122,10 @@ Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {efl : EE Next Obligation. cbn. eauto. Qed. Next Obligation. cbn. - move=> fl efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. + move=> fl wcon efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. intros [ev]. exists v. split => //. red. sq. cbn in *. - apply EEtaExpandedFix.eval_opt_to_target => //. 2:apply wfp. + unshelve eapply EEtaExpandedFix.eval_opt_to_target => //. auto. 2:apply wfp. now eapply EEtaExpandedFix.expanded_global_env_isEtaExp_env. now eapply EEtaExpandedFix.expanded_isEtaExp. Qed. @@ -147,7 +147,7 @@ Next Obligation. cbn. intros fl efl input v [] ev p'; exists v. split => //. Qed. -Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} +Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags): Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters"; @@ -156,7 +156,7 @@ Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl efl [Σ t] [wfp etap]. + move=> fl wcon efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. split. now eapply ERemoveParams.strip_program_wf. @@ -164,16 +164,17 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. now sq. cbn in *. now eapply wellformed_closed_env. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. + Unshelve. auto. Qed. -Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) +Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags) : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters (faster?)"; @@ -182,7 +183,7 @@ Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl efl [Σ t] [wfp etap]. + move=> fl wcon efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. @@ -192,7 +193,7 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. @@ -201,11 +202,12 @@ Next Obligation. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. + Unshelve. auto. Qed. Import EOptimizePropDiscr EWcbvEval. -Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : +Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram (disable_prop_cases fl)) := {| name := "optimize_prop_discr"; transform p _ := optimize_program p ; @@ -214,22 +216,23 @@ Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {efl : EEnv obseq g g' v v' := v' = EOptimizePropDiscr.optimize g.1 v |}. Next Obligation. - move=> fl efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl wcon efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EOptimizePropDiscr.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. eapply wellformed_closed_env, wfe. eapply wellformed_closed, wfe. + Unshelve. eauto. Qed. From MetaCoq.Erasure Require Import EInlineProjections. -Program Definition inline_projections_optimization {fl : WcbvFlags} (efl := all_env_flags) +Program Definition inline_projections_optimization {fl : WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags) {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "primitive projection inlining"; @@ -239,14 +242,36 @@ Program Definition inline_projections_optimization {fl : WcbvFlags} (efl := all_ obseq g g' v v' := v' = EInlineProjections.optimize g.1 v |}. Next Obligation. - move=> fl efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl wcon hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EInlineProjections.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. - cbn. eapply wfe. + cbn. eapply wfe. Unshelve. auto. +Qed. + +From MetaCoq.Erasure Require Import EConstructorsAsBlocks. + +Program Definition constructors_as_blocks_transformation (efl := all_env_flags) + {hastrel : has_tRel} {hastbox : has_tBox} : + Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env target_wcbv_flags) (eval_eprogram block_wcbv_flags) := + {| name := "transforming to constuctors as blocks"; + transform p _ := EConstructorsAsBlocks.transform_blocks_program p ; + pre p := wf_eprogram_env efl p /\ EEtaExpanded.expanded_eprogram_env_cstrs p; + post p := wf_eprogram (disable_projections_env_flag efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; + obseq g g' v v' := True |}. + +Next Obligation. + move=> efl hastrel hastbox [Σ t] [wfp etap]. + cbn in *. split. + - todo "". + - todo "". +Qed. +Next Obligation. + red. move=> hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + todo "". Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index c498a85ef..fa2208429 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -30,7 +30,7 @@ Local Ltac inv H := inversion H; subst. Definition atom t := match t with | tBox - | tConstruct _ _ + | tConstruct _ _ [] | tCoFix _ _ | tLambda _ _ | tFix _ _ => true @@ -54,17 +54,17 @@ Proof. Qed. (* Tells if the evaluation relation should include match-prop and proj-prop reduction rules. *) -Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool }. +Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool ; with_constructor_as_block : bool }. Definition disable_prop_cases fl : WcbvFlags := - {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. + {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := fl.(@with_constructor_as_block) |}. Definition switch_unguarded_fix fl : WcbvFlags := - EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false. + EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false fl.(@with_constructor_as_block). -Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true |}. -Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true |}. -Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false |}. +Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true ; with_constructor_as_block := false |}. +Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true ; with_constructor_as_block := false|}. +Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := false |}. Section Wcbv. Context {wfl : WcbvFlags}. @@ -93,7 +93,19 @@ Section Wcbv. (** Case *) | eval_iota ind pars cdecl discr c args brs br res : - eval discr (mkApps (tConstruct ind c) args) -> + with_constructor_as_block = false -> + eval discr (mkApps (tConstruct ind c []) args) -> + constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> + nth_error brs c = Some br -> + #|args| = pars + cdecl.(cstr_nargs) -> + #|skipn pars args| = #|br.1| -> + eval (iota_red pars args br) res -> + eval (tCase (ind, pars) discr brs) res + + (** Case *) + | eval_iota_block ind pars cdecl discr c args brs br res : + with_constructor_as_block = true -> + eval discr (tConstruct ind c args) -> constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> nth_error brs c = Some br -> #|args| = pars + cdecl.(cstr_nargs) -> @@ -159,7 +171,18 @@ Section Wcbv. (** Proj *) | eval_proj p cdecl discr args a res : - eval discr (mkApps (tConstruct p.(proj_ind) 0) args) -> + with_constructor_as_block = false -> + eval discr (mkApps (tConstruct p.(proj_ind) 0 []) args) -> + constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> + #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> + nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> + eval a res -> + eval (tProj p discr) res + + (** Proj *) + | eval_proj_block p cdecl discr args a res : + with_constructor_as_block = true -> + eval discr (tConstruct p.(proj_ind) 0 args) -> constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> @@ -175,12 +198,21 @@ Section Wcbv. (** Constructor congruence: we do not allow over-applications *) | eval_construct ind c mdecl idecl cdecl f args a a' : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (mkApps (tConstruct ind c) args) -> + eval f (mkApps (tConstruct ind c []) args) -> #|args| < cstr_arity mdecl cdecl -> eval a a' -> - eval (tApp f a) (tApp (mkApps (tConstruct ind c) args) a') + eval (tApp f a) (tApp (mkApps (tConstruct ind c []) args) a') + (** Constructor congruence: we do not allow over-applications *) + | eval_construct_block ind c mdecl idecl cdecl args args' a a' : + with_constructor_as_block = true -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + #|args| < cstr_arity mdecl cdecl -> + eval (tConstruct ind c args) (tConstruct ind c args') -> + eval a a' -> + eval (tConstruct ind c (args ++ [a])) (tConstruct ind c (args' ++ [a'])) (** Atoms (non redex-producing heads) applied to values are values *) | eval_app_cong f f' a a' : @@ -214,9 +246,10 @@ Section Wcbv. Variant value_head (nargs : nat) : term -> Type := | value_head_cstr ind c mdecl idecl cdecl : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> nargs <= cstr_arity mdecl cdecl -> - value_head nargs (tConstruct ind c) + value_head nargs (tConstruct ind c []) | value_head_cofix mfix idx : value_head nargs (tCoFix mfix idx) | value_head_fix mfix idx rarg fn : cunfold_fix mfix idx = Some (rarg, fn) -> @@ -228,6 +261,11 @@ Section Wcbv. Inductive value : term -> Type := | value_atom t : atom t -> value t + | value_constructor ind c mdecl idecl cdecl args : + with_constructor_as_block = true -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + #|args| <= cstr_arity mdecl cdecl -> + All value args -> value (tConstruct ind c args) | value_app_nonnil f args : value_head #|args| f -> args <> [] -> All value args -> value (mkApps f args). Derive Signature for value. @@ -251,13 +289,18 @@ Section Wcbv. Lemma value_values_ind : forall P : term -> Type, (forall t, atom t -> P t) -> + (forall (ind : inductive) (c : nat) (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body) + (args : list term) (e : with_constructor_as_block = true) (e0 : lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl)) + (l : #|args| <= cstr_arity mdecl cdecl) (a : All value args) , All P args -> + P (tConstruct ind c args)) -> (forall f args, value_head #|args| f -> args <> [] -> All value args -> All P args -> P (mkApps f args)) -> forall t : term, value t -> P t. Proof. - intros P ??. + intros P X X0 X1. fix value_values_ind 2. destruct 1. - apply X; auto. - - eapply X0; auto; tea. + - eapply X0; auto; tea. clear -a value_values_ind. induction a; econstructor; auto. + - eapply X1; auto; tea. clear v n. revert args a. fix aux 2. destruct 1. constructor; auto. constructor. now eapply value_values_ind. now apply aux. Defined. @@ -277,12 +320,19 @@ Section Wcbv. Lemma value_mkApps_inv t l : ~~ isApp t -> value (mkApps t l) -> - ((l = []) /\ atom t) + ([× l <> [], value_head #|l| t & All value l]). + ((l = []) /\ atom t) + + (l = [] × ∑ ind c mdecl idecl cdecl args, [ × with_constructor_as_block , lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl), t = tConstruct ind c args, #|args| <= cstr_arity mdecl cdecl & All value args]) + + ([× l <> [], value_head #|l| t & All value l]). Proof. intros H H'. generalize_eq x (mkApps t l). revert x H' t H. apply: value_values_ind. - intros. subst. now eapply atom_mkApps in H. + - intros * wcon lup len H IH t ht hcon. + destruct l using rev_ind. + + cbn in hcon. invs hcon. left. right. + repeat eexists; eauto. + + rewrite mkApps_app in hcon. invs hcon. - intros * vh nargs hargs ih t isapp appeq. move: (value_head_nApp vh) => Ht. right. apply mkApps_eq_inj in appeq => //. intuition subst; auto => //. @@ -294,8 +344,18 @@ Section Wcbv. All value l. Proof. intros val not_app. - now apply value_mkApps_inv in val as [(-> & ?)|[]]. + now apply value_mkApps_inv in val as [[(-> & ?) | [-> ] ] |[]]. Qed. + + Lemma eval_Construct_inv ind c args e : + eval (tConstruct ind c args) e -> + ∑ args', e = tConstruct ind c args' × All2 eval args args'. + Proof. + intros H. depind H. + - edestruct IHeval1 as (args'' & [= ->] & H2); eauto. + repeat eexists; eauto. eapply All2_app; eauto. + - invs i. destruct args; invs H0. exists []. repeat econstructor. + Qed. Lemma eval_to_value e e' : eval e e' -> value e'. Proof. @@ -304,7 +364,10 @@ Section Wcbv. - change (tApp ?h ?a) with (mkApps h [a]). rewrite -mkApps_app. apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [(-> & _)|[]]. + destruct IHev1 as [[(-> & _) | [-> ] ] |[]]. + + apply value_app; auto. len. + cbn in *. econstructor; tea. + destruct with_guarded_fix => //. cbn; auto. + apply value_app; auto. len. cbn in *. econstructor; tea. destruct with_guarded_fix => //. cbn; auto. @@ -314,12 +377,20 @@ Section Wcbv. len; lia. apply All_app_inv; auto. - apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [(-> & _)|[]]. + destruct IHev1 as [[(-> & _)|[-> ]] | []]. + + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply value_app. cbn; auto. econstructor; tea. cbn; len. eapply All_app_inv; auto. - + + - invs IHev1. + + invs H. destruct args'; invs H1. econstructor 2; eauto. len; lia. now econstructor. + + rewrite e0 in H3; invs H3. + eapply eval_Construct_inv in ev1 as (? & [= <-] & Hall). + econstructor 2; eauto. len. eapply All2_length in Hall. lia. + eapply All_app_inv; eauto. + + destruct H1. destruct args0 using rev_ind. eauto. rewrite mkApps_app in H. invs H. - destruct (mkApps_elim f' [a']). eapply value_mkApps_inv in IHev1 => //. destruct IHev1 as [?|[]]; intuition subst. @@ -332,6 +403,13 @@ Section Wcbv. now cbn in i. now cbn in i. + constructor. + econstructor; auto. + * destruct b0 as (ind & c & mdecl & idecl & cdecl & args & [H1 H2 H3 H4]). + rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). + rewrite a0 in i |- *. simpl in *. + apply (value_app f0 [a']). + destruct f0; simpl in * |- *; try congruence. + + rewrite !negb_or /= in i; rtoProp; intuition auto. + + destruct with_guarded_fix. now cbn in i. now cbn in i. * rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). eapply value_app; eauto with pcuic. 2:eapply All_app_inv; auto. len. @@ -484,6 +562,7 @@ Section Wcbv. - destruct L using rev_ind. reflexivity. rewrite mkApps_app in i. inv i. + - EAstUtils.solve_discr. - EAstUtils.solve_discr. depelim v. Qed. @@ -528,6 +607,8 @@ Section Wcbv. unfold atom in isatom. destruct argsv using rev_case => //. split; auto. simpl. simpl in isatom. rewrite H //. rewrite mkApps_app /= // in isatom. + - intros. destruct argsv using rev_case => //. + rewrite mkApps_app in Heqtfix => //. - intros * vf hargs vargs ihargs eq. solve_discr => //. depelim vf. rewrite e. intros [= <- <-]. destruct with_guarded_fix => //. split => //. unfold isStuckFix. rewrite e. now apply Nat.leb_le. @@ -546,13 +627,14 @@ Section Wcbv. Qed. Lemma eval_mkApps_Construct ind c mdecl idecl cdecl f args args' : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (tConstruct ind c) -> + eval f (tConstruct ind c []) -> #|args| <= cstr_arity mdecl cdecl -> All2 eval args args' -> - eval (mkApps f args) (mkApps (tConstruct ind c) args'). + eval (mkApps f args) (mkApps (tConstruct ind c []) args'). Proof. - intros hdecl evf hargs. revert args'. + intros hblock hdecl evf hargs. revert args'. induction args using rev_ind; intros args' evargs. - depelim evargs. now cbn. - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. @@ -564,6 +646,23 @@ Section Wcbv. rewrite -(All2_length evl). lia. Qed. + Lemma eval_mkApps_Construct_block ind c mdecl idecl cdecl f args args' : + with_constructor_as_block -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + eval f (tConstruct ind c []) -> + #|args| <= cstr_arity mdecl cdecl -> + All2 eval args args' -> + eval (tConstruct ind c args) (tConstruct ind c args'). + Proof. + intros hblock hdecl evf hargs. revert args'. + induction args using rev_ind; intros args' evargs. + - depelim evargs. econstructor. now cbn. + - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. + depelim evr. depelim evr. + eapply eval_construct_block; tea. 1: revert hargs; len. + eapply IHargs => //. 1: revert hargs; len. + Qed. + Lemma eval_mkApps_CoFix f mfix idx args args' : eval f (tCoFix mfix idx) -> All2 eval args args' -> @@ -620,6 +719,13 @@ Section Wcbv. Proof. move: e; eapply value_values_ind; simpl; intros; eauto with value. - now constructor. + - assert (All2 eval args args). + { clear -X; induction X; constructor; auto. } + induction args using rev_ind. repeat econstructor. + eapply All_app in a as [? HH]; eauto; invs HH. + eapply All_app in X as [? HH]; eauto; invs HH. + eapply All2_app_inv in X0 as [? HH]; eauto; invs HH. + econstructor; eauto. revert l. len. eapply IHargs; eauto. revert l. len. - assert (All2 eval args args). { clear -X0; induction X0; constructor; auto. } eapply eval_mkApps_cong => //. now eapply value_head_final. @@ -656,9 +762,18 @@ Section Wcbv. apply mkApps_eq_inj in apps_eq as (eq1 & eq2); try easy. noconf eq1. noconf eq2. noconf IHev1. - pose proof e0. rewrite e4 in H. noconf H. - pose proof e as e'. rewrite e3 in e'. noconf e'. - rewrite -> (uip e e3), (uip e0 e4), (uip e1 e5), (uip e2 e6). + pose proof e0. rewrite e5 in H. noconf H. + pose proof e as e'. rewrite e4 in e'. noconf e'. + assert (br0 = br) as -> by congruence. + rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). + specialize (IHev2 _ ev'2); noconf IHev2. + reflexivity. + - depelim ev'; try go. + + specialize (IHev1 _ ev'1); noconf IHev1. + pose proof e0. rewrite e5 in H. noconf H. + pose proof e as e'. rewrite e4 in e'. noconf e'. + assert (br0 = br) as -> by congruence. + rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). specialize (IHev2 _ ev'2); noconf IHev2. reflexivity. - depelim ev'; try go. @@ -760,27 +875,48 @@ Section Wcbv. specialize (IHev1 _ ev'1). pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. noconf IHev1. - pose proof e as e'. rewrite e2 in e'; noconf e'. - rewrite -> (uip e e2), (uip e0 e3). - pose proof e4 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite (uip e1 e4). + assert (a0 = a) as -> by congruence. + pose proof e0 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e e3), (uip e0 e4). + pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. + rewrite -> (uip e1 e5), (uip e2 e6). + now specialize (IHev2 _ ev'2); noconf IHev2. + - depelim ev'; try go. + specialize (IHev1 _ ev'1); noconf IHev1. + assert (a0 = a) as -> by congruence. + pose proof e0 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e e3), (uip e0 e4). + pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. + rewrite -> (uip e1 e5), (uip e2 e6). now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. specialize (IHev _ ev'). noconf IHev. rewrite (uip e e0). now rewrite (uip i i0). - - depelim ev'; try go. + - depelim ev'; try now go. + move: (IHev1 _ ev'1). eapply DepElim.simplification_sigma1 => heq IHev1'. apply mkApps_eq_inj in heq as H'; auto. destruct H' as (H' & <-). noconf H'. noconf IHev1'. - pose proof e as e'. rewrite e0 in e'; noconf e'. + pose proof e0 as e'. rewrite e2 in e'; noconf e'. specialize (IHev2 _ ev'2). noconf IHev2. - now rewrite -> (uip e e0), (PCUICWcbvEval.le_irrel _ _ l l0). + now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + specialize (IHev1 _ ev'1). noconf IHev1. exfalso. rewrite isConstructApp_mkApps in i. cbn in i. rewrite !negb_or in i. rtoProp; intuition auto. + - depelim ev'; try go. + + eapply app_inj_tail in e3 as e4. destruct e4 as [-> ->]. + rewrite (uip e3 eq_refl) in H. cbn in H. subst. + move: (IHev1 _ ev'1). + eapply DepElim.simplification_sigma1 => heq IHev1'. + noconf heq. + noconf IHev1'. + specialize (IHev2 _ ev'2). noconf IHev2. + pose proof e2 as E. + rewrite e0 in E. noconf E. + now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + + exfalso. invs i. destruct args; invs H0. - depelim ev'; try go. + exfalso. rewrite !negb_or in i. specialize (IHev1 _ ev'1); noconf IHev1. cbn in i. rtoProp; intuition auto. @@ -799,7 +935,8 @@ Section Wcbv. specialize (IHev2 _ ev'2); noconf IHev2. now assert (i0 = i) as -> by now apply uip. - depelim ev'; try go. - now assert (i0 = i) as -> by now apply uip. + 2: now assert (i0 = i) as -> by now apply uip. + exfalso. invs i. destruct args; cbn in H0; invs H0. Qed. Lemma eval_unique {t v} : @@ -1075,7 +1212,12 @@ Proof. move: IHev1; rewrite closedn_mkApps => /andP[] _ clargs. apply IHev2. rewrite /iota_red. eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e2. eapply nth_error_forallb in Hc'; tea. + len. rewrite e3. eapply nth_error_forallb in Hc'; tea. + now rewrite Nat.add_0_r in Hc'. + - specialize (IHev1 Hc). + apply IHev2. rewrite /iota_red. + eapply closed_substl. now rewrite forallb_rev forallb_skipn. + len. rewrite e3. eapply nth_error_forallb in Hc'; tea. now rewrite Nat.add_0_r in Hc'. - subst brs. cbn in Hc'. rewrite andb_true_r in Hc'. eapply IHev2. eapply closed_substl. @@ -1111,9 +1253,15 @@ Proof. rewrite closedn_mkApps /= => clargs. eapply IHev2; eauto. eapply nth_error_forallb in clargs; tea. + - have := (IHev1 Hc). intros clargs. + eapply IHev2; eauto. + eapply nth_error_forallb in clargs; tea. - have := (IHev1 Hc). rewrite closedn_mkApps /= => clargs. rewrite clargs IHev2 //. + - rtoProp; intuition auto. forward IHev1; solve_all; + eapply All_app in Hc; solve_all. + eapply All_app_inv; solve_all. invs b. econstructor. eauto. econstructor. - rtoProp; intuition auto. Qed. @@ -1148,6 +1296,9 @@ Proof. - eapply IHev2; eauto. eapply wellformed_iota_red_brs; tea => //. rewrite wellformed_mkApps // in H2. move/andP: H2 => [] //. + - eapply IHev2; eauto. + eapply wellformed_iota_red_brs; tea => //. + now destruct args; inv H3. - subst brs. eapply IHev2. sim in H0. eapply wellformed_substl => //. eapply All_forallb, All_repeat => //. @@ -1175,6 +1326,10 @@ Proof. eapply IHev2; eauto. move/andP: clargs => [/andP[] hasc wfc wfargs]. eapply nth_error_forallb in wfargs; tea. + - eapply IHev2. + eapply nth_error_forallb in e2; eauto. + now destruct args; inv H0. + - destruct args; invs Hc''. Qed. Lemma remove_last_length {X} {l : list X} : @@ -1235,6 +1390,9 @@ Proof. - unshelve eexists; eauto. eapply eval_fix_value; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. - unshelve eexists. eapply eval_construct; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. cbn. lia. + - unshelve eexists. eapply eval_construct_block; eauto. + { clear - l He1. eapply eval_Construct_inv in He1 as (? & ? & ?). eapply All2_length in a. invs e. lia. } + eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2; lia. - unshelve eexists. eapply eval_app_cong; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. Qed. @@ -1358,11 +1516,13 @@ Proof. Qed. Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e : - eval Σ (mkApps (tConstruct kn c) args) e -> - ∑ args', (e = mkApps (tConstruct kn c) args') × All2 (eval Σ) args args'. + with_constructor_as_block = false -> + eval Σ (mkApps (tConstruct kn c []) args) e -> + ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (eval Σ) args args'. Proof. + intros hblock. revert e; induction args using rev_ind; intros e. - - intros ev. depelim ev. exists []=> //. + - intros ev. depelim ev. congruence. exists []=> //. - intros ev. rewrite mkApps_app /= in ev. depelim ev; try solve_discr. destruct (IHargs _ ev1) as [? []]. solve_discr. @@ -1376,6 +1536,25 @@ Proof. * now cbn in i. Qed. +Lemma eval_mkApps_Construct_block_inv {fl : WcbvFlags} Σ kn c args oargs e : + with_constructor_as_block -> + eval Σ (mkApps (tConstruct kn c args) oargs) e -> + ∑ args', oargs = [] × (e = tConstruct kn c args') × All2 (eval Σ) args args'. +Proof. + intros hblock. + revert e; induction oargs using rev_ind; intros e. + - intros ev. depelim ev. + + eexists. split. reflexivity. split. reflexivity. + eapply eval_Construct_inv in ev1 as (? & [= <-] & ?). + eapply All2_app; eauto. + + invs i. destruct args; invs H0. exists []. repeat econstructor. + - intros ev. rewrite mkApps_app /= in ev. + depelim ev; try solve_discr. + all: try specialize (IHoargs _ ev1) as (? & ? & E & ?); try congruence; try solve_discr; try noconf E. + * subst. cbn in i. destruct with_guarded_fix; cbn in *; eauto. + * invs i. +Qed. + Lemma eval_mkApps_inv_size {wfl : WcbvFlags} {Σ f args v} : forall ev : eval Σ (mkApps f args) v, ∑ f' args' (evf : eval Σ f f'), @@ -1464,31 +1643,33 @@ Proof. Qed. Lemma eval_mkApps_Construct_size {wfl : WcbvFlags} {Σ ind c args v} : - forall ev : eval Σ (mkApps (tConstruct ind c) args) v, - ∑ args' (evf : eval Σ (tConstruct ind c) (tConstruct ind c)), + with_constructor_as_block = false -> + forall ev : eval Σ (mkApps (tConstruct ind c []) args) v, + ∑ args' (evf : eval Σ (tConstruct ind c []) (tConstruct ind c [])), [× eval_depth evf <= eval_depth ev, All2 (fun a a' => ∑ eva : eval Σ a a', eval_depth eva < eval_depth ev) args args' & - v = mkApps (tConstruct ind c) args']. + v = mkApps (tConstruct ind c []) args']. Proof. - intros ev. + intros hblock ev. destruct (eval_mkApps_inv_size ev) as [f'' [args' [? []]]]. exists args'. - exists (eval_atom _ (tConstruct ind c) eq_refl). + exists (eval_atom _ (tConstruct ind c []) eq_refl). cbn. split => //. destruct ev; cbn => //; auto with arith. clear l. - destruct (eval_mkApps_Construct_inv _ _ _ _ _ ev) as [? []]. subst v. - eapply (eval_mkApps_Construct_inv _ _ _ []) in x as [? []]. subst f''. depelim a1. + destruct (eval_mkApps_Construct_inv _ _ _ _ _ hblock ev) as [? []]. subst v. + eapply (@eval_mkApps_Construct_inv _ _ _ _ ) with (args0 := []) in x as [? []]; auto. subst f''. depelim a1. f_equal. eapply eval_deterministic_all; tea. - eapply All2_impl; tea; cbn; eauto. now intros x y []. + eapply All2_impl; tea; cbn; eauto. now intros x y []. Qed. Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : - forall (ev : eval Σ (mkApps (tConstruct kn c) args) e), - ∑ args', (e = mkApps (tConstruct kn c) args') × + with_constructor_as_block = false -> + forall (ev : eval Σ (mkApps (tConstruct kn c []) args) e), + ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (fun x y => ∑ ev' : eval Σ x y, eval_depth ev' < eval_depth ev) args args'. Proof. - intros ev; destruct (eval_mkApps_Construct_size ev) as [args'[evf [_ hargs hv]]]. + intros hblock ev; destruct (eval_mkApps_Construct_size hblock ev) as [args'[evf [_ hargs hv]]]. exists args'; intuition auto. Qed. @@ -1503,5 +1684,4 @@ Proof. depelim H2. specialize (IHx e _ H' H). simpl. rewrite mkApps_app. simpl. econstructor; eauto. -Qed. - +Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index 8707820dc..a9f8f3403 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -14,14 +14,14 @@ Hint Constructors eval : core. Definition atomic_term (t : term) := match t with - | tBox | tConstruct _ _ | tConst _ | tRel _ | tVar _ => true + | tBox | tConstruct _ _ _ | tConst _ | tRel _ | tVar _ => true | _ => false end. Definition has_atom {etfl : ETermFlags} (t : term) := match t with | tBox => has_tBox - | tConstruct _ _ => has_tConstruct + | tConstruct _ _ _ => has_tConstruct | tConst _ => has_tConst | tRel _ => has_tRel | tVar _ => has_tVar @@ -141,7 +141,7 @@ Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := qpres_qcofix :> Qcofix Q }. Lemma eval_preserve_mkApps_ind : -∀ (wfl : WcbvFlags) {efl : EEnvFlags} (Σ : global_declarations) +∀ (wfl : WcbvFlags), with_constructor_as_block = false -> forall {efl : EEnvFlags} (Σ : global_declarations) (P' : term → term → Type) (Q : nat -> term -> Type) {Qpres : Qpreserves Q Σ} @@ -175,8 +175,8 @@ Lemma eval_preserve_mkApps_ind : (list name × term)) (br : list name × term) (res : term), forallb (λ x : list name × term, isEtaExp Σ x.2) brs -> - eval Σ discr (mkApps (tConstruct ind c) args) - → P discr (mkApps (tConstruct ind c) args) + eval Σ discr (mkApps (tConstruct ind c []) args) + → P discr (mkApps (tConstruct ind c []) args) → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) → nth_error brs c = Some br → #|args| = pars + cdecl.(cstr_nargs) @@ -280,8 +280,8 @@ Lemma eval_preserve_mkApps_ind : → (∀ p cdecl (discr : term) (args : list term) a (res : term), has_tProj -> eval Σ discr - (mkApps (tConstruct p.(proj_ind) 0) args) - → P discr (mkApps (tConstruct p.(proj_ind) 0) args) + (mkApps (tConstruct p.(proj_ind) 0 []) args) + → P discr (mkApps (tConstruct p.(proj_ind) 0 []) args) → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a @@ -308,15 +308,15 @@ Lemma eval_preserve_mkApps_ind : #|args| = cstr_arity mdecl cdecl -> All2 (eval Σ) args args' -> isEtaExp_app Σ ind i #|args| -> - Q 0 (mkApps (tConstruct ind i) args) -> - Q 0 (mkApps (tConstruct ind i) args') -> + Q 0 (mkApps (tConstruct ind i []) args) -> + Q 0 (mkApps (tConstruct ind i []) args') -> All2 P args args' -> - P' (mkApps (tConstruct ind i) args) (mkApps (tConstruct ind i) args')) → + P' (mkApps (tConstruct ind i []) args) (mkApps (tConstruct ind i []) args')) → (∀ t : term, atom t → Q 0 t -> isEtaExp Σ t -> P' t t) -> ∀ (t t0 : term), Q 0 t -> isEtaExp Σ t -> eval Σ t t0 → P' t t0. Proof. - intros * Qpres P P'Q etaΣ wfΣ hasapp. + intros wfl hcon. intros * Qpres P P'Q etaΣ wfΣ hasapp. assert (qfixs: Qfixs Q) by tc. assert (qcofixs: Qcofixs Q) by tc. intros. @@ -362,22 +362,22 @@ Proof. eapply H; tea; (apply and_assum; [ih|hp' P'Q]) end. destruct ev. - 1-15:eapply qpres in qt as qt'; depelim qt' => //. + 1-18:eapply qpres in qt as qt'; depelim qt' => //. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply X; tea; (apply and_assum; [ih|hp' P'Q]). iheta q. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (ql : Q 0 (tLambda na b)). { eapply P'Q; tea. ih. } @@ -404,25 +404,26 @@ Proof. - simp_eta. move=> /andP[etad etabrs]. assert (isEtaExp Σ (iota_red pars args br)). { eapply isEtaExp_iota_red. - assert (isEtaExp Σ (mkApps (tConstruct ind c) args)) by iheta q. - rewrite isEtaExp_mkApps_napp /= // in H. + assert (isEtaExp Σ (mkApps (tConstruct ind c []) args)) by iheta q. + rewrite isEtaExp_mkApps_napp /= // in H. rewrite andb_true_r in H. now move/andP: H => []. - now clear IH; eapply nth_error_forallb in e0; tea. } + now clear IH; eapply nth_error_forallb in e1; tea. } assert (Q 0 (iota_red pars args br)). { unfold iota_red. eapply nth_error_all in a; tea. cbn in a. - rewrite -e2 in a. + rewrite -e3 in a. rewrite -(List.rev_length (skipn pars args)) in a. rewrite Nat.add_0_r in a. eapply (qsubst _ (List.rev (skipn pars args))) in a. 2:{ eapply All_rev, All_skipn. - assert (Q 0 (mkApps (tConstruct ind c) args)). + assert (Q 0 (mkApps (tConstruct ind c []) args)). eapply P'Q; tea; ih. eapply qapp in X13; tea. eapply X13. } exact a. } split. eapply X2; tea. 1,3:(apply and_assum; [ih|hp' P'Q]). eapply nth_error_all in a; tea; cbn. now rewrite Nat.add_0_r in a. iheta X13. + - congruence. - simp_eta; move=> /andP[etad etabrs]. assert (isEtaExp Σ (substl (repeat tBox #|n|) f)). { eapply isEtaExp_substl => //. rewrite forallb_repeat //. @@ -438,9 +439,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. pose proof (ev1' := ev1). eapply P'Q in ev1' => //. 2:{ clear ev1'; ih. } eapply qapp in ev1' as [hfix qargs] => //. @@ -472,9 +473,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (isEtaExp Σ (tApp (mkApps (tFix mfix idx) argsv) av)). { rewrite -[tApp _ _](mkApps_app _ _ [av]). @@ -488,9 +489,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (qav : Q 0 av). { eapply P'Q; tea; ih. } @@ -571,13 +572,14 @@ Proof. { eapply nth_error_all in qargs; tea. } clear ev1'; ih. } assert (isEtaExp Σ a). - { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0) args)) by iheta q. + { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0 []) args)) by iheta q. move: H; simp_eta. rewrite isEtaExp_mkApps_napp // /=. - move=> /andP[] etaapp etaargs. - eapply nth_error_forallb in etaargs; tea. } + move=> /andP[] /andP[] etaapp etaargs. + eapply nth_error_forallb in etaargs; tea. eauto. } split. eapply X10; tea; (apply and_assum; [ih|hp' P'Q]). iheta X13. + - congruence. - simp_eta => etadiscr. split. unshelve eapply X11; tea; try (intros; apply and_assum; [ih|hp' P'Q]). now idtac. @@ -585,11 +587,11 @@ Proof. rename args into cargs. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. - pose proof (eval_construct_size ev1') as [ex []]. + pose proof (eval_construct_size hcon ev1') as [ex []]. cbn in IH. intros eq. assert (All2 (λ x y : term, ∑ ev' : eval Σ x y, eval_depth ev' < S (Nat.max (eval_depth ev1) (eval_depth ev2))) (remove_last args ++ [a]) (ex ++ [a'])). @@ -613,12 +615,12 @@ Proof. eapply All2_All_mix_left in X15. 2:exact X14. eapply All2_All_right; tea; cbn. intros ? ? [? [? [? []]]]. split. eapply P'Q; tea. apply p. apply p. } - eapply mkApps_eq_inj in e0 as [] => //. subst ex. noconf H. + eapply mkApps_eq_inj in e1 as [] => //. subst ex. noconf H. split. unshelve eapply Xcappexp; tea. + rewrite ht -remove_last_last //. move: etaind; rewrite /isEtaExp_app. - rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e). + rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e0). move/Nat.leb_le. move: l. rewrite /cstr_arity. eapply All2_length in X13. move: X13. rewrite ht /= -remove_last_last //. len. @@ -639,26 +641,28 @@ Proof. + rewrite isEtaExp_Constructor. apply/andP. split. rewrite -(All2_length X16). rewrite ht -remove_last_last //. - eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. + rtoProp. split. eauto. + eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. auto. * move=> /and4P [] etat0 etaargs etaa etat. rewrite -[tApp _ a'](mkApps_app _ _ [a']). - assert (P' f (mkApps (tConstruct ind c) cargs) × isEtaExp Σ (mkApps (tConstruct ind c) cargs)). + assert (P' f (mkApps (tConstruct ind c []) cargs) × isEtaExp Σ (mkApps (tConstruct ind c []) cargs)). { unshelve eapply IH; tea. cbn. lia. } elimtype False. destruct X13 as [p'f etac]. move: etac. rewrite isEtaExp_Constructor. move/andP => []. rewrite /isEtaExp_app. - rewrite /lookup_constructor_pars_args e /=. - move/Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. + rewrite /lookup_constructor_pars_args e0 /=. + move => /andP[] /Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. + - congruence. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. exfalso. eapply eval_mkApps_Construct_inv in ev1' as [? [hf' hargs']]. subst f'. - clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. + clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. auto. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply (X12 _ _ _ _ ev1); tea. 1,3:(apply and_assum; [ih|hp' P'Q]). @@ -688,18 +692,19 @@ Ltac destruct_nary_times := | [ H : [× _, _, _, _ & _] |- _ ] => destruct H end. -Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : + with_constructor_as_block = false -> isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ a -> isEtaExp Σ a'. Proof. - intros etaΣ wfΣ ev eta. + intros hcon etaΣ wfΣ ev eta. generalize I. intros q. revert a a' q eta ev. - eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. + eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. all:intros; repeat destruct_nary_times. all:intuition auto. - rewrite isEtaExp_Constructor => //. - rewrite -(All2_length X0) H1. + rewrite -(All2_length X0) H1. cbn. rtoProp; intuition eauto. cbn; eapply All_forallb. eapply All2_All_right; tea. cbn. intros x y []; auto. Qed. diff --git a/erasure/theories/EWcbvEvalInd.v b/erasure/theories/EWcbvEvalInd.v index 97a600227..1435dc6ed 100644 --- a/erasure/theories/EWcbvEvalInd.v +++ b/erasure/theories/EWcbvEvalInd.v @@ -37,18 +37,36 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.csubst b0' 0 b1) res → P (ECSubst.csubst b0' 0 b1) res → P (tLetIn na b0 b1) res) - → (∀ (ind : Kernames.inductive) (pars : nat) cdecl (discr : term) - (c : nat) (args : list term) (brs : list (list BasicAst.name × term)) - (br : list BasicAst.name × term) (res : term), - eval Σ discr (mkApps (tConstruct ind c) args) - → P discr (mkApps (tConstruct ind c) args) - → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) - → nth_error brs c = Some br - → #|args| = pars + cdecl.(cstr_nargs) - → #|skipn pars args| = #|br.1| - → eval Σ (iota_red pars args br) res - → P (iota_red pars args br) res - → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = false) + (e0 : eval Σ discr (mkApps (tConstruct ind c []) args)), + P discr (mkApps (tConstruct ind c []) args) + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) (e2 : + nth_error brs c = + Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res + → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = true) + (e0 : eval Σ discr (tConstruct ind c args)), + P discr (tConstruct ind c args) + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) + (e2 : nth_error brs c = Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res + → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : Kernames.inductive) (pars : nat) (discr : term) (brs : list (list BasicAst.name × term)) (n : list BasicAst.name) (f3 res : term), @@ -60,6 +78,7 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.substl (repeat tBox #|n|) f3) res → P (ECSubst.substl (repeat tBox #|n|) f3) res → P (tCase (ind, pars) discr brs) res) + → (∀ (f4 : term) (mfix : mfixpoint term) (idx : nat) (argsv : list term) (a av fn res : term), @@ -121,16 +140,47 @@ Section eval_mkApps_rect. cst_body decl = Some body → eval Σ body res → P body res → P (tConst c) res) - → (∀ p (discr : term) (args : list term) - (res : term) cdecl a, - eval Σ discr (mkApps (tConstruct p.(proj_ind) 0) args) - → P discr (mkApps (tConstruct p.(proj_ind) 0) args) - → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) - → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) - -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a - -> eval Σ a res - → P a res - → P (tProj p discr) res) + + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : with_constructor_as_block = + false) + (e0 : eval Σ discr + (mkApps + (tConstruct + (proj_ind p) 0 []) args)), + P discr + (mkApps + (tConstruct (proj_ind p) 0 []) + args) + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res + → P (tProj p discr) res) + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : + with_constructor_as_block = + true) + (e0 : eval Σ discr + (tConstruct (proj_ind p) 0 args)), + P discr (tConstruct (proj_ind p) 0 args) + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res + → P (tProj p discr) res) → (∀ p (discr : term), with_prop_case @@ -139,30 +189,72 @@ Section eval_mkApps_rect. → inductive_isprop_and_pars Σ p.(proj_ind) = Some (true, p.(proj_npars)) → P (tProj p discr) tBox) - → (∀ ind c mdecl idecl cdecl f args a a', - lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - forall (ev : eval Σ f (mkApps (tConstruct ind c) args)), - IH _ _ ev -> + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (f14 : term) (args : list term) + (a a' : term) + (e : with_constructor_as_block = false) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (e1 : eval Σ f14 + (mkApps + (tConstruct ind c []) + args)), + IH _ _ e1 -> + P f14 + (mkApps (tConstruct ind c []) + args) + → ∀ (l : #|args| < cstr_arity mdecl cdecl) + (e2 : eval Σ a a'), + P a a' + → P (tApp f14 a) + (tApp + (mkApps + (tConstruct ind c + []) args) a')) - P f (mkApps (tConstruct ind c) args) -> - #|args| < cstr_arity mdecl cdecl -> - eval Σ a a' -> - P a a' -> - P (tApp f a) (tApp (mkApps (tConstruct ind c) args) a')) + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (args args' : + list term) (a a' : term) + (e : with_constructor_as_block = true) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (l : #|args| < cstr_arity mdecl cdecl) + (e1 : eval Σ + (tConstruct ind c args) + (tConstruct ind c args')), + P (tConstruct ind c args) + (tConstruct ind c args') + → ∀ e2 : eval Σ a a', + P a a' + → P (tConstruct ind c (args ++ [a])) + (tConstruct ind c + (args' ++ [a']))) - → (∀ (f11 f' : term) a a' , - forall (ev : eval Σ f11 f'), - P f11 f' -> - IH _ _ ev - → ~~ (isLambda f' || (if with_guarded_fix then isFixApp f' else isFix f') || isBox f' - || isConstructApp f') - → eval Σ a a' - → P a a' - → P (tApp f11 a) (tApp f' a')) + → (∀ (f15 f' a a' : term) (e : eval Σ f15 f'), + P f15 f' -> IH _ _ e + → ∀ (i : ~~ + (isLambda f' + || + (if with_guarded_fix + then isFixApp f' + else isFix f') || + isBox f' || + isConstructApp f')) + (e0 : eval Σ a a'), + P a a' + → P (tApp f15 a) + (tApp f' a') + ) → (∀ t : term, atom t → P t t) → ∀ t t0 : term, eval Σ t t0 → P t t0. Proof using Type. - intros ?????????????????? H. + intros ????????????????????? H. pose proof (p := @Fix_F { t : _ & { t0 : _ & eval Σ t t0 }}). specialize (p (MR lt (fun x => eval_depth x.π2.π2))). set(foo := existT _ t (existT _ t0 H) : { t : _ & { t0 : _ & eval Σ t t0 }}). @@ -193,4 +285,3 @@ Proof using Type. Qed. End eval_mkApps_rect. - diff --git a/erasure/theories/EWellformed.v b/erasure/theories/EWellformed.v index 27828e501..67d031d0f 100644 --- a/erasure/theories/EWellformed.v +++ b/erasure/theories/EWellformed.v @@ -76,6 +76,8 @@ Section wf. Definition wf_fix_gen (wf : nat -> term -> bool) k mfix idx := let k' := List.length mfix + k in (idx true | _ => false end. Fixpoint wellformed k (t : term) : bool := match t with @@ -96,7 +98,7 @@ Section wf. | Some d => has_axioms || isSome d.(cst_body) | _ => false end - | tConstruct ind c => has_tConstruct && isSome (lookup_constructor Σ ind c) + | tConstruct ind c block_args => has_tConstruct && isSome (lookup_constructor Σ ind c) && is_nil block_args | tVar _ => has_tVar end. @@ -158,7 +160,8 @@ Section EEnvFlags. autorewrite with map; simpl wellformed in *; intuition auto; unfold wf_fix, test_def, test_snd in *; - try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. + try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. + destruct args; firstorder. Qed. Lemma wellformed_closed_decl {t} : wf_global_decl Σ t -> closed_decl t. @@ -193,6 +196,7 @@ Section EEnvFlags. elim (Nat.ltb_spec); auto. apply Nat.ltb_lt in H1. lia. simpl; rewrite H0 /=. elim (Nat.ltb_spec); auto. intros. apply Nat.ltb_lt in H1. lia. + - solve_all. destruct args; firstorder. - solve_all. rewrite Nat.add_assoc. eauto. - len. move/andP: H1 => [] -> ha. cbn. solve_all. rewrite Nat.add_assoc; eauto. @@ -231,6 +235,7 @@ Section EEnvFlags. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. eapply IHt2; auto. + - now destruct args; inv H0. - specialize (a (#|x.1| + k')) => //. rewrite Nat.add_assoc (Nat.add_comm k) in a. rewrite !Nat.add_assoc. eapply a => //. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index 11ff060f7..fcc4c85aa 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -43,17 +43,17 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf (* Simulation of the guarded fixpoint rules with a single unguarded one: the only "stuck" fixpoints remaining are unapplied. This translation is a noop on terms and environments. *) - guarded_to_unguarded_fix eq_refl ▷ + guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ (* Remove all constructor parameters *) - remove_params_optimization ▷ + remove_params_optimization (wcon := eq_refl) ▷ (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ (* Remove all cases / projections on propositional content *) - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := EWellformed.all_env_flags) ▷ (* Inline projections to cases *) - inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (hastrel := eq_refl) (hastbox := eq_refl). + inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). (* At the end of erasure we get a well-formed program (well-scoped globally and localy), without parameters in inductive declarations. The constructor applications are also expanded, and the evaluation relation does not need to consider guarded fixpoints or case analyses on propositional @@ -96,10 +96,10 @@ Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := E template_to_pcuic_transform ▷ pcuic_expand_lets_transform ▷ erase_transform ▷ - guarded_to_unguarded_fix eq_refl ▷ - remove_params_fast_optimization _ ▷ + guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ + remove_params_fast_optimization (wcon := eq_refl) _ ▷ rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl). + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). Next Obligation. destruct H; split => //. now eapply ETransform.expanded_eprogram_env_expanded_eprogram_cstrs. Qed. diff --git a/erasure/theories/ErasureCorrectness.v b/erasure/theories/ErasureCorrectness.v index f559b1aa2..a3073b40c 100644 --- a/erasure/theories/ErasureCorrectness.v +++ b/erasure/theories/ErasureCorrectness.v @@ -325,7 +325,7 @@ Proof. invs H2. -- exists x2. split; eauto. - constructor. econstructor. eauto. 2:eauto. + constructor. econstructor. eauto. eauto. 2:eauto. 4:{ unfold EGlobalEnv.iota_red. rewrite ECSubst.substl_subst //. rewrite forallb_rev forallb_skipn //. @@ -1021,7 +1021,7 @@ Proof. eapply erases_deps_eval in Hed1; tea. eapply erases_deps_mkApps_inv in Hed1 as []. depelim H8. - constructor. eapply Ee.eval_construct; tea. + constructor. eapply Ee.eval_construct; tea. eauto. eapply (EGlobalEnv.declared_constructor_lookup H9). rewrite -(Forall2_length H7). rewrite /EAst.cstr_arity. @@ -1305,4 +1305,4 @@ Proof. + constructor => //. eapply erases_deps_mkApps_inv in etaΣ as []. solve_all. -Qed. \ No newline at end of file +Qed. diff --git a/erasure/theories/ErasureFunction.v b/erasure/theories/ErasureFunction.v index 4b6fc0280..0e61fb071 100644 --- a/erasure/theories/ErasureFunction.v +++ b/erasure/theories/ErasureFunction.v @@ -393,7 +393,7 @@ Section Erase. | tSort u := !%prg | tConst kn u := E.tConst kn | tInd kn u := !%prg - | tConstruct kn k u := E.tConstruct kn k + | tConstruct kn k u := E.tConstruct kn k [] | tProd _ _ _ := !%prg | tLambda na b b' := let t' := erase (vass na b :: Γ) b' _ in E.tLambda na.(binder_name) t' @@ -1942,7 +1942,7 @@ Section wffix. | tCoFix mfix idx => (idx true - | tConstruct ind c => true + | tConstruct ind c _ => true | tVar _ => true | tBox => true end. diff --git a/erasure/theories/ErasureProperties.v b/erasure/theories/ErasureProperties.v index 8450c1c80..1b1ca62c5 100644 --- a/erasure/theories/ErasureProperties.v +++ b/erasure/theories/ErasureProperties.v @@ -635,7 +635,7 @@ Proof. simpl; try solve [solve_all]. - now apply Nat.ltb_lt. - eapply trans_lookup_constant in wfa; tea. - - eapply trans_lookup_constructor in wfa; tea. + - eapply trans_lookup_constructor in wfa; tea. now rewrite wfa. - move/andP: wfa => [] /andP[] lookup wfc wfbrs. apply/andP. split. apply/andP. split; eauto. eapply trans_lookup_inductive; tea. @@ -677,7 +677,8 @@ Lemma eval_empty_brs {wfl : Ee.WcbvFlags} Σ ci p e : Σ ⊢ E.tCase ci p [] ▷ Proof. intros He. depind He. - - clear -e0. now rewrite nth_error_nil in e0. + - clear -e1. now rewrite nth_error_nil in e1. + - clear -e1. now rewrite nth_error_nil in e1. - discriminate. - eapply IHHe2. - cbn in i. discriminate. @@ -693,6 +694,7 @@ Proof. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. rewrite EAstUtils.mkApps_app in H. discriminate. + - depelim He1. - exists n, f. intuition auto. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. @@ -709,6 +711,8 @@ Proof. depind He. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. econstructor; eauto. now eapply Ee.value_final, Ee.eval_to_value. + - pose proof (Ee.eval_deterministic He1 Hc). subst c'. + eapply Ee.eval_iota_block; eauto. now eapply Ee.value_final, Ee.eval_to_value. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. eapply Ee.eval_iota_sing; tea. now constructor. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. @@ -726,6 +730,8 @@ Proof. depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. + - pose proof (eval_trans' Hc He1); subst discr. + now econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. eapply Ee.eval_iota_sing; tea. - pose proof (eval_trans' Hc He1); subst discr. @@ -739,13 +745,15 @@ Lemma eval_proj_eval_inv_discr {wfl : Ee.WcbvFlags} {Σ p c c' e} : Σ ⊢ E.tProj p c' ▷ e. Proof. intros He Hc. - depind He. + depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. - eapply Ee.eval_proj; tea. + now econstructor; tea. + - pose proof (eval_trans' Hc He1); subst discr. + now econstructor; tea. - pose proof (eval_trans' Hc He); subst discr. - eapply Ee.eval_proj_prop; tea. + now econstructor; tea. - cbn in i. discriminate. Qed. diff --git a/erasure/theories/Extract.v b/erasure/theories/Extract.v index 94b6fb0a9..9f0136c81 100644 --- a/erasure/theories/Extract.v +++ b/erasure/theories/Extract.v @@ -55,7 +55,7 @@ Inductive erases (Σ : global_env_ext) (Γ : context) : term -> E.term -> Prop : Σ;;; Γ |- tConst kn u ⇝ℇ E.tConst kn | erases_tConstruct : forall (kn : inductive) (k : nat) (n : Instance.t), isPropositional Σ kn false -> - Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k + Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k [] | erases_tCase1 (ci : case_info) (p : predicate term) (c : term) (brs : list (branch term)) (c' : E.term) (brs' : list (list name × E.term)) : @@ -113,7 +113,7 @@ Lemma erases_forall_list_ind P Γ (tConst kn u) (E.tConst kn)) (Hconstruct : forall Γ kn k n, isPropositional Σ kn false -> - P Γ (tConstruct kn k n) (E.tConstruct kn k)) + P Γ (tConstruct kn k n) (E.tConstruct kn k [])) (Hcase : forall Γ ci p c brs c' brs', PCUICElimination.Informative Σ ci.(ci_ind) -> Σ;;; Γ |- c ⇝ℇ c' -> @@ -266,7 +266,7 @@ Inductive erases_deps (Σ : global_env) (Σ' : E.global_declarations) : E.term - EGlobalEnv.declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_mutual_inductive_body mdecl mdecl' -> erases_one_inductive_body idecl idecl' -> - erases_deps Σ Σ' (E.tConstruct ind c) + erases_deps Σ Σ' (E.tConstruct ind c []) | erases_deps_tCase p mdecl idecl mdecl' idecl' discr brs : declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> From 488ac9dd5ea69a9dc938df27a1935b9aaa9dfa15 Mon Sep 17 00:00:00 2001 From: Yannick Forster Date: Sun, 26 Jun 2022 12:53:21 +0200 Subject: [PATCH 05/43] Replace all uses of `todo` and `Admitted` by axioms (#717) * remove all todos, all Admitteds and add a checktodos make target * Squash the axioms to avoid introducing useless dependencies in extracted code Co-authored-by: Matthieu Sozeau --- INSTALL.md | 8 +++--- Makefile | 5 +++- README.md | 29 ++++++++++++++-------- RELEASING.md | 1 + checktodos.sh | 21 ++++++++++++++++ erasure/theories/EArities.v | 3 +++ erasure/theories/Erasure.v | 18 +++++++++++--- pcuic/theories/PCUICEquality.v | 2 +- pcuic/theories/PCUICInversion.v | 2 +- pcuic/theories/PCUICSafeLemmata.v | 2 +- pcuic/theories/utils/PCUICAstUtils.v | 6 ++--- safechecker/theories/Extraction.v | 9 ++++++- safechecker/theories/PCUICEqualityDec.v | 2 +- safechecker/theories/PCUICSafeConversion.v | 8 +++--- safechecker/theories/PCUICTypeChecker.v | 2 +- template-coq/theories/AstUtils.v | 2 +- template-coq/theories/Checker.v | 19 -------------- template-coq/theories/EnvMap.v | 4 +-- template-coq/theories/LiftSubst.v | 4 +-- template-coq/theories/TemplateCheckWf.v | 7 ++++-- template-coq/theories/TemplateProgram.v | 24 +++++++++++++++--- template-coq/theories/Universes.v | 2 +- template-coq/theories/monad_utils.v | 3 --- template-coq/theories/utils/All_Forall.v | 2 +- 24 files changed, 120 insertions(+), 65 deletions(-) create mode 100755 checktodos.sh diff --git a/INSTALL.md b/INSTALL.md index a550810ef..334ffae8e 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -72,12 +72,12 @@ To setup a fresh `opam` installation, you might want to create a one yet. You need to use **opam 2** to obtain the right version of `Equations`. - # opam switch create coq.8.14 4.07.1 + # opam switch create coq.8.16 --packages=ocaml-variants.4.13.1+options,ocaml-option-flambda # eval $(opam env) -This creates the `coq.8.14` switch which initially contains only the -basic `OCaml` `4.07.1` compiler, and puts you in the right environment -(check with `ocamlc -v`). +This creates the `coq.8.16` switch which initially contains only the +basic `OCaml` `4.13.1` compiler with the `flambda` option enabled, +and puts you in the right environment (check with `ocamlc -v`). Once in the right switch, you can install `Coq` and the `Equations` package using: diff --git a/Makefile b/Makefile index 79389f0fe..46150a69e 100644 --- a/Makefile +++ b/Makefile @@ -95,7 +95,7 @@ ci-local-noclean: ./configure.sh local $(MAKE) all test-suite TIMED=pretty-timed -ci-local: ci-local-noclean +ci-local: ci-local-noclean $(MAKE) clean ci-quick: @@ -106,3 +106,6 @@ ci-opam: # Use -v so that regular output is produced opam install -v -y . opam remove -y coq-metacoq coq-metacoq-template + +checktodos: + sh checktodos.sh diff --git a/README.md b/README.md index 2daec5930..f1fe701a8 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,14 @@ Template-Coq with additional features. Each extension is in dedicated folder. Template-Coq is a quoting library for [Coq](http://coq.inria.fr). It takes `Coq` terms and constructs a representation of their syntax tree as -a `Coq` inductive data type. The representation is based on the kernel's +an inductive data type. The representation is based on the kernel's term representation. +After importing `MetaCoq.Template.Loader` there are commands `MetaCoq Test Quote t.`, +`MetaCoq Quote Definition name := (t).` and `MetaCoq Quote Recursively Definition name := (t).` as +well as a tactic `quote_term t k`, +where in all cases `t` is a term and `k` a continuation tactic. + In addition to this representation of terms, Template Coq includes: - Reification of the environment structures, for constant and inductive @@ -66,9 +71,9 @@ In addition to this representation of terms, Template Coq includes: - A monad for manipulating global declarations, calling the type checker, and inserting them in the global environment, in - the style of MTac. + the style of MTac. Monadic programs `p : TemplateMonad A` can be run using `MetaCoq Run p`. -- A formalisation of the expected typing rules reflecting the ones of Coq +- A formalisation of the typing rules reflecting the ones of Coq, not covering eta-expansion and template polymorphism. ### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.11/pcuic) @@ -92,7 +97,14 @@ calculus has proofs of standard metatheoretical results: that singleton elimination (from Prop to Type) is only allowed on singleton inductives in Prop. -### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.13/safechecker) +- Canonicity: The weak head normal form of erms of inductive type is a constructor application. + +- Consistency under the assumption of strong normalization + +- Weak call-by-value standardization: Normal forms of terms of first-order inductive type +can be found via weak call-by-value evaluation. + +### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.16/safechecker) Implementation of a fuel-free and verified reduction machine, conversion checker and type checker for PCUIC. This relies on a postulate of @@ -108,12 +120,11 @@ type-checker, one can use: MetaCoq CoqCheck - -### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.13/erasure) +### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.16/erasure) An erasure procedure to untyped lambda-calculus accomplishing the -same as the Extraction plugin of Coq. The extracted safe erasure is -available in Coq through a new vernacular command: +same as the type and proof erasure phase of the Extraction plugin of Coq. +The extracted safe erasure is available in Coq through a new vernacular command: MetaCoq Erase @@ -138,8 +149,6 @@ Examples of translations built on top of this: and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/test-suite/safechecker_test.v) show example uses (and current limitations of) the verified checker and erasure. - - ## Papers - ["Coq Coq Correct! Verification of Type Checking and Erasure for Coq, in Coq"](https://metacoq.github.io/coqcoqcorrect) diff --git a/RELEASING.md b/RELEASING.md index 91e4c35e3..4d2613a6d 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -1 +1,2 @@ - Change the "version:" fields in opam files. + diff --git a/checktodos.sh b/checktodos.sh new file mode 100755 index 000000000..25b2476f3 --- /dev/null +++ b/checktodos.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +if [[ $(git grep -c todo | grep theories) = template-coq/theories/utils/MCUtils.v:3 ]] +then + echo "No todos found" + if [[ $(git grep -c Admitted | grep theories) = "" ]] + then + echo "No Admitted results found" + exit 0 + else + echo "Found Admitted results:" + git grep -c Admitted | grep theories + exit 1 + fi +else + echo "Found todos:" + git grep -c todo | grep theories + exit 1 +fi +endef + diff --git a/erasure/theories/EArities.v b/erasure/theories/EArities.v index 492c0d74c..f687356d5 100644 --- a/erasure/theories/EArities.v +++ b/erasure/theories/EArities.v @@ -22,6 +22,9 @@ Local Existing Instance extraction_checker_flags. Implicit Types (cf : checker_flags) (Σ : global_env_ext). +(* TODO move *) +#[global] Existing Instance extends_refl. + Lemma isErasable_Proof Σ Γ t : Is_proof Σ Γ t -> isErasable Σ Γ t. Proof. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index 11ff060f7..f3f570c61 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -108,20 +108,32 @@ Definition run_erase_program_fast {guard : abstract_guard_impl} := run erasure_p Local Open Scope string_scope. +Axiom fake_guard_impl_properties : +forall (fix_cofix: PCUICTyping.FixCoFix) + (Σ: PCUICAst.PCUICEnvironment.global_env_ext) + (Γ: PCUICAst.PCUICEnvironment.context) + (mfix: BasicAst.mfixpoint PCUICAst.term), +PCUICTyping.guard fix_cofix Σ Γ mfix <-> fake_guard_impl fix_cofix Σ Γ mfix. + + Global Program Instance fake_guard_impl : abstract_guard_impl := {| guard_impl := fake_guard_impl |}. -Next Obligation. Admitted. +Next Obligation. apply fake_guard_impl_properties. Qed. (** This uses the retyping-based erasure and assumes that the global environment and term are welltyped (for speed). As such this should only be used for testing, or when we know that the environment is wellformed and the term well-typed (e.g. when it comes directly from a Coq definition). *) + + +Axiom assume_that_we_only_erase_on_welltyped_programs : + forall (p : Ast.Env.program), squash (TemplateProgram.wt_template_program p). Definition erase_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) : string := - let p' := run_erase_program p (sq (todo "assuming quoted environment and term are well-typed")) in + let p' := run_erase_program p (assume_that_we_only_erase_on_welltyped_programs p) in time "Pretty printing" EPretty.print_program p'. Program Definition erase_fast_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) : string := - let p' := run_erase_program_fast p (sq (todo "wf_env and welltyped term")) in + let p' := run_erase_program_fast p (assume_that_we_only_erase_on_welltyped_programs p) in time "pretty-printing" EPretty.print_program p'. diff --git a/pcuic/theories/PCUICEquality.v b/pcuic/theories/PCUICEquality.v index ff3b500b6..cdef24b7d 100644 --- a/pcuic/theories/PCUICEquality.v +++ b/pcuic/theories/PCUICEquality.v @@ -1291,7 +1291,7 @@ Proof. eapply eq_term_upto_univ_trans; exact _. Qed. -(* todo: rename *) +(* TODO: rename *) (* Definition nleq_term t t' := *) (* eqb_term_upto_univ eqb eqb t t'. *) diff --git a/pcuic/theories/PCUICInversion.v b/pcuic/theories/PCUICInversion.v index 23d7c369d..68b65c5e8 100644 --- a/pcuic/theories/PCUICInversion.v +++ b/pcuic/theories/PCUICInversion.v @@ -6,7 +6,7 @@ From MetaCoq.PCUIC Require Import PCUICAst PCUICCases PCUICLiftSubst PCUICUnivSu PCUICOnFreeVars PCUICClosedTyp PCUICWellScopedCumulativity. Require Import Equations.Prop.DepElim. -(* todo: make wf arguments implicit *) +(* TODO: make wf arguments implicit *) Section Inversion. Context `{checker_flags}. diff --git a/pcuic/theories/PCUICSafeLemmata.v b/pcuic/theories/PCUICSafeLemmata.v index 92f2d72b7..bf439d604 100644 --- a/pcuic/theories/PCUICSafeLemmata.v +++ b/pcuic/theories/PCUICSafeLemmata.v @@ -346,7 +346,7 @@ Section Lemmata. destruct h; depelim wf; simpl in *. all: destruct l; econstructor; eauto. Qed. - (* todo: rename alpha_eq *) + (* TODO: rename alpha_eq *) Lemma compare_decls_conv Γ Γ' : eq_context_upto_names Γ Γ' -> conv_context cumulAlgo_gen Σ Γ Γ'. diff --git a/pcuic/theories/utils/PCUICAstUtils.v b/pcuic/theories/utils/PCUICAstUtils.v index b91b6b3b7..006243ec1 100644 --- a/pcuic/theories/utils/PCUICAstUtils.v +++ b/pcuic/theories/utils/PCUICAstUtils.v @@ -205,7 +205,7 @@ Fixpoint remove_arity (n : nat) (t : term) : term := | O => t | S n => match t with | tProd _ _ B => remove_arity n B - | _ => t (* todo *) + | _ => t (* TODO *) end end. @@ -282,7 +282,7 @@ Fixpoint decompose_prod_n_assum (Γ : context) n (t : term) : option (context * end end. -(* todo move *) +(* TODO move *) Lemma it_mkLambda_or_LetIn_app l l' t : it_mkLambda_or_LetIn (l ++ l') t = it_mkLambda_or_LetIn l' (it_mkLambda_or_LetIn l t). Proof. induction l in l', t |- *; simpl; auto. Qed. @@ -402,7 +402,7 @@ Ltac merge_All := #[global] Hint Rewrite @map_def_id @map_id : map. -(* todo move *) +(* TODO move *) Ltac close_All := match goal with | H : Forall _ _ |- Forall _ _ => apply (Forall_impl H); clear H; simpl diff --git a/safechecker/theories/Extraction.v b/safechecker/theories/Extraction.v index b269dda4f..03ffbfcf5 100644 --- a/safechecker/theories/Extraction.v +++ b/safechecker/theories/Extraction.v @@ -37,12 +37,19 @@ Extraction Inline Equations.Prop.Logic.True_rect_dep Equations.Prop.Logic.False_ Extraction Inline PCUICPrimitive.prim_val_reflect_eq. Cd "src". +Axiom fake_abstract_guard_impl_properties: + forall (fix_cofix : PCUICTyping.FixCoFix) + (Σ : PCUICAst.PCUICEnvironment.global_env_ext) + (Γ : PCUICAst.PCUICEnvironment.context) + (mfix : BasicAst.mfixpoint PCUICAst.term), + PCUICTyping.guard fix_cofix Σ Γ mfix <-> + PCUICWfEnvImpl.fake_guard_impl fix_cofix Σ Γ mfix. #[local,program] Instance fake_abstract_guard_impl : PCUICWfEnvImpl.abstract_guard_impl := { guard_impl := PCUICWfEnvImpl.fake_guard_impl }. -Next Obligation. Admitted. +Next Obligation. eapply fake_abstract_guard_impl_properties. Qed. Definition infer_and_print_template_program_with_guard {cf} {nor} := @SafeTemplateChecker.infer_and_print_template_program cf nor fake_abstract_guard_impl. diff --git a/safechecker/theories/PCUICEqualityDec.v b/safechecker/theories/PCUICEqualityDec.v index 7f48784cc..633942d43 100644 --- a/safechecker/theories/PCUICEqualityDec.v +++ b/safechecker/theories/PCUICEqualityDec.v @@ -13,7 +13,7 @@ Local Set Keyed Unification. Set Default Goal Selector "!". -(*todo move*) +(* TODO move*) Lemma consistent_instance_wf_universe `{checker_flags} Σ uctx u : consistent_instance_ext Σ uctx u -> diff --git a/safechecker/theories/PCUICSafeConversion.v b/safechecker/theories/PCUICSafeConversion.v index b3a733b30..8fb8f19d1 100644 --- a/safechecker/theories/PCUICSafeConversion.v +++ b/safechecker/theories/PCUICSafeConversion.v @@ -5850,13 +5850,13 @@ match (LevelSet.add Level.lzero LevelSet.empty, ConstraintSet.empty); declarations := [] |}, Monomorphic_ctx); - referenced_impl_ext_wf := todo "foo" + referenced_impl_ext_wf := TODO "foo" |} [] Cumul (tSort (Universe.lType (Universe.make' (Level.lzero, 0)))) - (todo "") (tSort (Universe.lType (Universe.make' (Level.lzero, 0)))) - (todo "") + (TODO "") (tSort (Universe.lType (Universe.make' (Level.lzero, 0)))) + (TODO "") with | ConvSuccess => "success" -| ConvError _ => todo "foo" +| ConvError _ => TODO "foo" end = "success". Proof. lazy. reflexivity. diff --git a/safechecker/theories/PCUICTypeChecker.v b/safechecker/theories/PCUICTypeChecker.v index d63905b02..0598c4dbc 100644 --- a/safechecker/theories/PCUICTypeChecker.v +++ b/safechecker/theories/PCUICTypeChecker.v @@ -1771,7 +1771,7 @@ Section Typecheck. Qed. Next Obligation. - (*todo: factor*) + (*TODO: factor*) cbn in *. pose proof (heΣ _ wfΣ) as [heΣ]. specialize_Σ wfΣ ; sq. apply eqb_eq in i. subst I. eapply eqb_eq in i0. diff --git a/template-coq/theories/AstUtils.v b/template-coq/theories/AstUtils.v index d971222c9..6c81955fa 100644 --- a/template-coq/theories/AstUtils.v +++ b/template-coq/theories/AstUtils.v @@ -192,7 +192,7 @@ Fixpoint remove_arity (n : nat) (t : term) : term := | O => t | S n => match t with | tProd _ _ B => remove_arity n B - | _ => t (* todo *) + | _ => t (* TODO *) end end. diff --git a/template-coq/theories/Checker.v b/template-coq/theories/Checker.v index 0a84dd2a5..20ba48c6b 100644 --- a/template-coq/theories/Checker.v +++ b/template-coq/theories/Checker.v @@ -614,25 +614,6 @@ Definition check_conv `{checker_flags} {F:Fuel} := check_conv_gen Conv. Definition is_graph_of_global_env_ext `{checker_flags} Σ G := is_graph_of_uctx G (global_ext_uctx Σ). -Lemma conv_spec : forall `{checker_flags} {F:Fuel} Σ G Γ t u, - is_graph_of_global_env_ext Σ G -> - Σ ;;; Γ |- t = u <~> check_conv (fst Σ) G Γ t u = Checked (). -Proof. - intros. todo "Checker.conv_spec". -Defined. - -Lemma cumul_spec : forall `{checker_flags} {F:Fuel} Σ G Γ t u, - is_graph_of_global_env_ext Σ G -> - Σ ;;; Γ |- t <= u <~> check_conv_leq (fst Σ) G Γ t u = Checked (). -Proof. - intros. todo "Checker.cumul_spec". -Defined. - -Lemma reduce_cumul : - forall `{checker_flags} Σ Γ n t, Σ ;;; Γ |- try_reduce (fst Σ) Γ n t <= t. -Proof. intros. todo "Checker.reduce_cumul". Defined. - - Section Typecheck. Context {F : Fuel}. Context (Σ : global_env). diff --git a/template-coq/theories/EnvMap.v b/template-coq/theories/EnvMap.v index b9f1389d1..d7b39028f 100644 --- a/template-coq/theories/EnvMap.v +++ b/template-coq/theories/EnvMap.v @@ -293,7 +293,7 @@ Context {A : Type}. Lemma pos_of_string_cont_inj s s' p : pos_of_string_cont s p = pos_of_string_cont s' p -> s = s'. Proof. induction s; destruct s' => /= //. - Admitted. + Qed. (* TODO *) Fixpoint pos_of_dirpath_cont (d : dirpath) (cont : positive) : positive := match d with @@ -324,7 +324,7 @@ Context {A : Type}. induction a; destruct m => /= //. cbn. - Admitted. + Qed. (* TODO *) Definition empty : t := PTree.empty _. diff --git a/template-coq/theories/LiftSubst.v b/template-coq/theories/LiftSubst.v index 28f215634..5a506f748 100644 --- a/template-coq/theories/LiftSubst.v +++ b/template-coq/theories/LiftSubst.v @@ -461,7 +461,7 @@ Qed. Lemma noccur_between_subst k n t : noccur_between k n t -> closedn (n + k) t -> closedn k t. Proof. -Admitted. *) +Qed. *) (* TODO *) Lemma strip_casts_lift n k t : strip_casts (lift n k t) = lift n k (strip_casts t). @@ -524,4 +524,4 @@ Proof. pose (subst_context_snoc n k ctx a). unfold snoc in e. rewrite e. clear e. simpl. rewrite -> IHctx. pose (subst_context_snoc n k ctx a). simpl. now destruct a as [na [b|] ty]. -Qed. \ No newline at end of file +Qed. diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 492d0b29a..6ed3e103d 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -9,8 +9,11 @@ Open Scope bs_scope. Definition run_eta_program := Transform.run template_eta_expand. +Axiom assume_welltypedness_of_input : forall p, ∥ wt_template_program p ∥. Definition eta_expand p := - run_eta_program p (todo "assume well-typedness"). + run_eta_program p (assume_welltypedness_of_input p). + +Compute (Transform.pre template_eta_expand _). Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with @@ -72,4 +75,4 @@ Definition check_wf_eta (g : Ast.Env.program) : TemplateMonad unit := (* To test that a program's eta-expansion is indeed well-typed according to Coq's kernel use: - MetaCoq Run (tmQuoteRec wf_program >>= check_wf_eta). *) \ No newline at end of file + MetaCoq Run (tmQuoteRec wf_program >>= check_wf_eta). *) diff --git a/template-coq/theories/TemplateProgram.v b/template-coq/theories/TemplateProgram.v index f243eaca5..9a1d1aba6 100644 --- a/template-coq/theories/TemplateProgram.v +++ b/template-coq/theories/TemplateProgram.v @@ -31,6 +31,24 @@ Definition template_expand_obseq (p p' : template_program) (v v' : Ast.term) := Local Obligation Tactic := idtac. +Axiom eta_expansion_preserves_wf_ext_and_typing : + forall (cf : checker_flags) + (Σ : global_env) + (t : term) + (wfext : wf_ext (empty_ext (Σ, t).1)) + (ht : ∑ T : term, empty_ext (Σ, t).1;;; [] |- (Σ, t).2 : T), + ∥ wt_template_program (eta_expand_program (Σ, t)) ∥. + +Axiom eta_expansion_preserves_evaluation : + forall (cf : checker_flags) + (Σ : global_env) + (t v : term) + (w : wf_ext (empty_ext (Σ, t).1)) + (s : ∑ T : term, empty_ext (Σ, t).1;;; [] |- (Σ, t).2 : T) + (ev : ∥ eval Σ t v ∥), + ∥ eval (eta_expand_global_env Σ) (eta_expand (declarations Σ) [] t) + (eta_expand (declarations Σ) [] v) ∥. + Program Definition template_eta_expand {cf : checker_flags} : self_transform template_program Ast.term eval_template_program eval_template_program := {| name := "eta-expansion of template program"; pre p := ∥ wt_template_program p ∥; @@ -39,7 +57,7 @@ Program Definition template_eta_expand {cf : checker_flags} : self_transform tem obseq := template_expand_obseq |}. Next Obligation. intros cf [Σ t] [[wfext ht]]. - cbn. split. split. todo "eta-expansion preserves wf ext and typing". + cbn. split. eapply eta_expansion_preserves_wf_ext_and_typing; eauto. red. destruct ht as [T ht]. split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. apply wfext. @@ -53,7 +71,7 @@ Next Obligation. red. intros cf [Σ t] v [[]]. unfold eval_template_program. cbn. intros ev. - exists (EtaExpand.eta_expand (Ast.Env.declarations Σ) [] v). split. split. - todo "eta-expansion preserves evaluation". + exists (EtaExpand.eta_expand (Ast.Env.declarations Σ) [] v). split. + eapply eta_expansion_preserves_evaluation; eauto. red. reflexivity. Qed. diff --git a/template-coq/theories/Universes.v b/template-coq/theories/Universes.v index 37c510990..d5ccb7008 100644 --- a/template-coq/theories/Universes.v +++ b/template-coq/theories/Universes.v @@ -2531,7 +2531,7 @@ Definition polymorphic_instance uctx := | Monomorphic_ctx => Instance.empty | Polymorphic_ctx c => fst (AUContext.repr c) end. -(* todo: duplicate of polymorphic_instance *) +(* TODO: duplicate of polymorphic_instance *) Definition abstract_instance decl := match decl with | Monomorphic_ctx => Instance.empty diff --git a/template-coq/theories/monad_utils.v b/template-coq/theories/monad_utils.v index 07cc7c175..dc3f08eac 100644 --- a/template-coq/theories/monad_utils.v +++ b/template-coq/theories/monad_utils.v @@ -1,6 +1,3 @@ -(* todo(gmm): This file should really be replaced by a real - * monad library. - *) Require Import Arith List. From MetaCoq.Template Require Import All_Forall MCSquash. From Equations Require Import Equations. diff --git a/template-coq/theories/utils/All_Forall.v b/template-coq/theories/utils/All_Forall.v index 4adaadac6..a6a09502b 100644 --- a/template-coq/theories/utils/All_Forall.v +++ b/template-coq/theories/utils/All_Forall.v @@ -1767,7 +1767,7 @@ Proof. move=> [= <-]. now rewrite (IHHa _ E'). Qed. -(* todo: move *) +(* TODO: move *) Lemma All_mapi {A B} P f l k : Alli (fun i x => P (f i x)) k l -> All P (@mapi_rec A B f l k). Proof. From b6daf8cda78c57ac3c2ba094cc525e2177bbf581 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Mon, 27 Jun 2022 10:58:46 +0200 Subject: [PATCH 06/43] Ensure constant constructors are declared in evaluation (#718) --- erasure/theories/EEtaExpandedFix.v | 2 +- erasure/theories/EInlineProjections.v | 2 ++ erasure/theories/EOptimizePropDiscr.v | 3 ++- erasure/theories/ERemoveParams.v | 7 +++-- erasure/theories/EWcbvEval.v | 38 ++++++++++++++------------- erasure/theories/EWcbvEvalEtaInd.v | 2 +- erasure/theories/EWcbvEvalInd.v | 2 +- erasure/theories/ErasureCorrectness.v | 5 ++-- 8 files changed, 35 insertions(+), 26 deletions(-) diff --git a/erasure/theories/EEtaExpandedFix.v b/erasure/theories/EEtaExpandedFix.v index bb087a915..6ec3fffb5 100644 --- a/erasure/theories/EEtaExpandedFix.v +++ b/erasure/theories/EEtaExpandedFix.v @@ -1840,7 +1840,7 @@ Proof. rewrite (remove_last_last l a hl). rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply eval_mkApps_Construct; tea. - { now constructor. } + { constructor. cbn [atom]; rewrite H //. } { len. rewrite (All2_length hargs). lia. } eapply All2_app. eapply forallb_remove_last, forallb_All in etal. diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index 3f99c9e9c..2afb1ba1c 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -656,6 +656,8 @@ Proof. destruct v => /= //. - destruct t => //. all:constructor; eauto. + cbn [atom optimize] in i |- *. + rewrite -lookup_constructor_optimize //. Qed. From MetaCoq.Erasure Require Import EEtaExpanded. diff --git a/erasure/theories/EOptimizePropDiscr.v b/erasure/theories/EOptimizePropDiscr.v index 64a4ef6f7..a19b19144 100644 --- a/erasure/theories/EOptimizePropDiscr.v +++ b/erasure/theories/EOptimizePropDiscr.v @@ -698,7 +698,8 @@ Proof. destruct args using rev_case => // /=. rewrite map_app !mkApps_app /= //. destruct v => /= //. - destruct t => //. - all:constructor; eauto. + all:constructor; eauto. cbn [atom optimize] in i |- *. + rewrite -lookup_constructor_optimize //. Qed. (* diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index 134be90a4..a9e351b1b 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -964,7 +964,7 @@ Proof. rewrite (lookup_constructor_lookup_inductive_pars H). eapply eval_mkApps_Construct; tea. + rewrite lookup_constructor_strip H //. - + now constructor. + + constructor. cbn [atom]. rewrite lookup_constructor_strip H //. + rewrite /cstr_arity /=. move: H0; rewrite /cstr_arity /=. rewrite skipn_length map_length => ->. lia. @@ -973,7 +973,10 @@ Proof. intros x y []; auto. - destruct t => //. - all:constructor; eauto. + all:constructor; eauto. simp strip. + cbn [atom strip] in H |- *. + rewrite lookup_constructor_strip. + destruct lookup_constructor eqn:hl => //. destruct p as [[] ?] => //. Qed. From MetaCoq.Erasure Require Import EEtaExpanded. diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index c498a85ef..f56783f91 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -27,13 +27,13 @@ Local Ltac inv H := inversion H; subst. (** ** Big step version of weak cbv beta-zeta-iota-fix-delta reduction. *) -Definition atom t := +Definition atom Σ t := match t with | tBox - | tConstruct _ _ | tCoFix _ _ | tLambda _ _ | tFix _ _ => true + | tConstruct ind c => isSome (lookup_constructor Σ ind c) | _ => false end. @@ -47,7 +47,7 @@ Definition isStuckFix t (args : list term) := | _ => false end. -Lemma atom_mkApps f l : atom (mkApps f l) -> (l = []) /\ atom f. +Lemma atom_mkApps Σ f l : atom Σ (mkApps f l) -> (l = []) /\ atom Σ f. Proof. revert f; induction l using rev_ind. simpl. intuition auto. simpl. intros. now rewrite mkApps_app in H. @@ -197,7 +197,7 @@ Section Wcbv. (** Atoms are values (includes abstractions, cofixpoints and constructors) *) - | eval_atom t : atom t -> eval t t. + | eval_atom t : atom Σ t -> eval t t. Hint Constructors eval : core. Derive Signature for eval. @@ -227,7 +227,7 @@ Section Wcbv. Derive Signature NoConfusion for value_head. Inductive value : term -> Type := - | value_atom t : atom t -> value t + | value_atom t : atom Σ t -> value t | value_app_nonnil f args : value_head #|args| f -> args <> [] -> All value args -> value (mkApps f args). Derive Signature for value. @@ -245,12 +245,12 @@ Section Wcbv. Lemma value_app f args : value_head #|args| f -> All value args -> value (mkApps f args). Proof. destruct args. - - intros [] hv; now constructor. + - intros [] hv; constructor; try easy. cbn [atom mkApps]. now rewrite e. - intros vh av. eapply value_app_nonnil => //. Qed. Lemma value_values_ind : forall P : term -> Type, - (forall t, atom t -> P t) -> + (forall t, atom Σ t -> P t) -> (forall f args, value_head #|args| f -> args <> [] -> All value args -> All P args -> P (mkApps f args)) -> forall t : term, value t -> P t. Proof. @@ -270,14 +270,14 @@ Section Wcbv. Proof. destruct t; auto. Qed. Hint Resolve isStuckfix_nApp : core. - Lemma atom_nApp {t} : atom t -> ~~ isApp t. + Lemma atom_nApp {t} : atom Σ t -> ~~ isApp t. Proof. destruct t; auto. Qed. Hint Resolve atom_nApp : core. Lemma value_mkApps_inv t l : ~~ isApp t -> value (mkApps t l) -> - ((l = []) /\ atom t) + ([× l <> [], value_head #|l| t & All value l]). + ((l = []) /\ atom Σ t) + ([× l <> [], value_head #|l| t & All value l]). Proof. intros H H'. generalize_eq x (mkApps t l). revert x H' t H. apply: value_values_ind. @@ -353,7 +353,7 @@ Section Wcbv. value_head n t -> eval t t. Proof. destruct 1. - - now constructor. + - constructor; try easy. now cbn [atom]; rewrite e. - now eapply eval_atom. - now eapply eval_atom. Qed. @@ -362,9 +362,9 @@ Section Wcbv. (* It means no redex can remain at the head of an evaluated term. *) Lemma value_head_spec' n t : - value_head n t -> (~~ (isLambda t || isBox t)) && atom t. + value_head n t -> (~~ (isLambda t || isBox t)) && atom Σ t. Proof. - induction 1; cbn => //. + induction 1; auto. cbn [atom]; rewrite e //. Qed. @@ -953,7 +953,9 @@ Section WcbvEnv. induction ev; try solve [econstructor; eauto using (extends_lookup_constructor wf ex), (extends_constructor_isprop_pars_decl wf ex), (extends_is_propositional wf ex)]. econstructor; eauto. - red in isdecl |- *. eauto using extends_lookup. + red in isdecl |- *. eauto using extends_lookup. constructor. + destruct t => //. cbn [atom] in i. destruct lookup_constructor eqn:hl => //. + eapply (extends_lookup_constructor wf ex) in hl. now cbn [atom]. Qed. End WcbvEnv. @@ -1359,7 +1361,7 @@ Qed. Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e : eval Σ (mkApps (tConstruct kn c) args) e -> - ∑ args', (e = mkApps (tConstruct kn c) args') × All2 (eval Σ) args args'. + ∑ args', [× isSome (lookup_constructor Σ kn c), (e = mkApps (tConstruct kn c) args') & All2 (eval Σ) args args']. Proof. revert e; induction args using rev_ind; intros e. - intros ev. depelim ev. exists []=> //. @@ -1472,18 +1474,18 @@ Lemma eval_mkApps_Construct_size {wfl : WcbvFlags} {Σ ind c args v} : Proof. intros ev. destruct (eval_mkApps_inv_size ev) as [f'' [args' [? []]]]. - exists args'. - exists (eval_atom _ (tConstruct ind c) eq_refl). + exists args'. + destruct (eval_mkApps_Construct_inv _ _ _ _ _ ev) as [? []]. subst v. + exists (eval_atom _ (tConstruct ind c) i). cbn. split => //. destruct ev; cbn => //; auto with arith. clear l. - destruct (eval_mkApps_Construct_inv _ _ _ _ _ ev) as [? []]. subst v. eapply (eval_mkApps_Construct_inv _ _ _ []) in x as [? []]. subst f''. depelim a1. f_equal. eapply eval_deterministic_all; tea. eapply All2_impl; tea; cbn; eauto. now intros x y []. Qed. -Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : +Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : forall (ev : eval Σ (mkApps (tConstruct kn c) args) e), ∑ args', (e = mkApps (tConstruct kn c) args') × All2 (fun x y => ∑ ev' : eval Σ x y, eval_depth ev' < eval_depth ev) args args'. diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index 8707820dc..7cbf6e778 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -313,7 +313,7 @@ Lemma eval_preserve_mkApps_ind : All2 P args args' -> P' (mkApps (tConstruct ind i) args) (mkApps (tConstruct ind i) args')) → - (∀ t : term, atom t → Q 0 t -> isEtaExp Σ t -> P' t t) -> + (∀ t : term, atom Σ t → Q 0 t -> isEtaExp Σ t -> P' t t) -> ∀ (t t0 : term), Q 0 t -> isEtaExp Σ t -> eval Σ t t0 → P' t t0. Proof. intros * Qpres P P'Q etaΣ wfΣ hasapp. diff --git a/erasure/theories/EWcbvEvalInd.v b/erasure/theories/EWcbvEvalInd.v index 97a600227..9c14cc8e6 100644 --- a/erasure/theories/EWcbvEvalInd.v +++ b/erasure/theories/EWcbvEvalInd.v @@ -159,7 +159,7 @@ Section eval_mkApps_rect. → eval Σ a a' → P a a' → P (tApp f11 a) (tApp f' a')) - → (∀ t : term, atom t → P t t) + → (∀ t : term, atom Σ t → P t t) → ∀ t t0 : term, eval Σ t t0 → P t t0. Proof using Type. intros ?????????????????? H. diff --git a/erasure/theories/ErasureCorrectness.v b/erasure/theories/ErasureCorrectness.v index f559b1aa2..cdb5e374d 100644 --- a/erasure/theories/ErasureCorrectness.v +++ b/erasure/theories/ErasureCorrectness.v @@ -1102,7 +1102,8 @@ Proof. * eexists. split. 2: now constructor; econstructor. econstructor; eauto. + invs He. - * eexists. split. 2: now constructor; econstructor. + * eexists. split. 2:{ constructor; econstructor. cbn [EWcbvEval.atom]. + depelim Hed. eapply EGlobalEnv.declared_constructor_lookup in H0. now rewrite H0. } econstructor; eauto. * eexists. split. 2: now constructor; econstructor. eauto. @@ -1114,7 +1115,7 @@ Proof. * eexists. split; eauto. now constructor; econstructor. * eexists. split. 2: now constructor; econstructor. econstructor; eauto. - Unshelve. all: repeat econstructor. + Unshelve. all: repeat econstructor. Qed. (* Print Assumptions erases_correct. *) From 17b949276b209659b4d4894f2025116f0a28e9ed Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Mon, 27 Jun 2022 15:03:46 +0200 Subject: [PATCH 07/43] Update readmes (#719) * Update README.md * Cleanup erasure and add a readme there * Fix typo * Remove a leftover Compute * Fix erasure _CoqProject.in --- README.md | 83 +++++++++++++++++++------ erasure/_CoqProject.in | 2 - erasure/theories/EAll.v | 3 - erasure/theories/ECoFixToFix.v | 23 ------- erasure/theories/EWndEval.v | 67 -------------------- erasure/theories/README.md | 79 +++++++++++++++++++++++ template-coq/theories/TemplateCheckWf.v | 2 - 7 files changed, 142 insertions(+), 117 deletions(-) delete mode 100644 erasure/theories/EAll.v delete mode 100644 erasure/theories/ECoFixToFix.v delete mode 100644 erasure/theories/EWndEval.v create mode 100644 erasure/theories/README.md diff --git a/README.md b/README.md index f1fe701a8..427883bda 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ MetaCoq

-[![Build status](https://github.com/MetaCoq/metacoq/workflows/Test%20compilation/badge.svg?branch=coq-8.13)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) +[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.16)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) +[![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/metacoq/metacoq) MetaCoq is a project formalizing Coq in Coq and providing tools for manipulating Coq terms and developing certified plugins @@ -48,7 +49,7 @@ See [DOC.md](https://github.com/MetaCoq/metacoq/tree/coq-8.13/DOC.md) At the center of this project is the Template-Coq quoting library for Coq. The project currently has a single repository extending -Template-Coq with additional features. Each extension is in dedicated folder. +Template-Coq with additional features. Each extension is in a dedicated folder. ### [Template-Coq](https://github.com/MetaCoq/metacoq/tree/coq-8.13/template-coq) @@ -65,17 +66,18 @@ where in all cases `t` is a term and `k` a continuation tactic. In addition to this representation of terms, Template Coq includes: - Reification of the environment structures, for constant and inductive - declarations. + declarations along with their universe structures. -- Denotation of terms and global declarations +- Denotation of terms and global declarations. -- A monad for manipulating global declarations, calling the type +- A monad for querying the environment, manipulating global declarations, calling the type checker, and inserting them in the global environment, in the style of MTac. Monadic programs `p : TemplateMonad A` can be run using `MetaCoq Run p`. -- A formalisation of the typing rules reflecting the ones of Coq, not covering eta-expansion and template polymorphism. +- A formalisation of the typing rules reflecting the ones of Coq, covering all of Coq + except eta-expansion and template polymorphism. -### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.11/pcuic) +### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.16/pcuic) PCUIC, the Polymorphic Cumulative Calculus of Inductive Constructions is a cleaned up version of the term language of Coq and its associated @@ -87,28 +89,36 @@ calculus has proofs of standard metatheoretical results: - Confluence of reduction using a notion of parallel reduction -- Context conversion and validity of typing. +- Context cumulativity / conversion and validity of typing. - Subject Reduction (case/cofix reduction excluded) - Principality: every typeable term has a smallest type. +- Bidirectional presentation: an equivalent presentation of the system + that enforces directionality of the typing rules. Strengthening follows + from this presentation. + - Elimination restrictions: the elimination restrictions ensure that singleton elimination (from Prop to Type) is only allowed on singleton inductives in Prop. -- Canonicity: The weak head normal form of erms of inductive type is a constructor application. +- Canonicity: The weak head normal form of a term of inductive type is a constructor application. - Consistency under the assumption of strong normalization - Weak call-by-value standardization: Normal forms of terms of first-order inductive type can be found via weak call-by-value evaluation. +See the PCUIC [README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/pcuic/theories/README.md) for +a detailed view of the development. + ### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.16/safechecker) Implementation of a fuel-free and verified reduction machine, conversion checker and type checker for PCUIC. This relies on a postulate of strong normalization of the reduction relation of PCUIC on well-typed terms. +The checker is shown to be correct and complete w.r.t. the PCUIC specification. The extracted safe checker is available in Coq through a new vernacular command: MetaCoq SafeCheck @@ -120,6 +130,12 @@ type-checker, one can use: MetaCoq CoqCheck +This also includes a verified, efficient re-typing procedure (useful in tactics) in +`MetaCoq.SafeChecker.PCUICSafeRetyping`. + +See the SafeChecker [README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/safechecker/theories/README.md) for +a detailed view of the development. + ### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.16/erasure) An erasure procedure to untyped lambda-calculus accomplishing the @@ -130,6 +146,12 @@ The extracted safe erasure is available in Coq through a new vernacular command: After importing `MetaCoq.Erasure.Loader`. +The erasure pipeline includes verified optimizations to remove lets in constructors, +remove cases on propositional terms, switch to an unguarded fixpoint reduction rule and +transform the higher-order constructor applications to first-order blocks for easier +translation to usual programming languages. See the erasure +[README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/erasure/theories/README.md) for +a detailed view of the development. ### [Translations](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations) @@ -137,7 +159,7 @@ Examples of translations built on top of this: - a parametricity plugin in [translations/param_original.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations/param_original.v) -- a plugin to negate funext in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations/times_bool_fun.v) +- a plugin to negate functional extensionality in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/translations/times_bool_fun.v) ### Examples @@ -145,16 +167,28 @@ Examples of translations built on top of this: - An example Coq plugin built on the Template Monad, which can be used to add a constructor to any inductive type is in [examples/add_constructor.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/examples/add_constructor.v) -- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/test-suite/erasure_test.v) - and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/test-suite/safechecker_test.v) show example +- An example *extracted* Coq plugin built on the extractable Template Monad, which can be used to + derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. + +- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/erasure_test.v) + and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/safechecker_test.v) show example uses (and current limitations of) the verified checker and erasure. ## Papers +- ["The Curious Case of Case"](https://sozeau.gitlabpages.inria.fr/www/research/publications/The_Curious_Case_of_Case-WITS22-220122.pdf) Matthieu Sozeau, Meven Lennon-Bertrand and Yannick Forster. WITS 2022 presentation, Philadelphia. + This presents the challenges around the representation of cases in Coq and PCUIC. + +- ["Bidirectional Typing for the Calculus of Inductive Constructions"](https://www.meven.ac/category/phd-thesis.html) Meven Lennon-Bertrand, PhD thesis, June 2022. + Part 2 describes in detail the bidirectional variant of typing and its use to verify correctness and completeness of the type checker. + - ["Coq Coq Correct! Verification of Type Checking and Erasure for Coq, in Coq"](https://metacoq.github.io/coqcoqcorrect) Matthieu Sozeau, Simon Boulier, Yannick Forster, Nicolas Tabareau and Théo Winterhalter. POPL 2020, New Orleans. +- ["Formalisation and meta-theory of type theory"](https://theowinterhalter.github.io/#phd) Théo Winterhalter, PhD thesis, September 2020. + Part 3 describes in detail the verified reduction, conversion and type checker. + - ["Coq Coq Codet! Towards a Verified Toolchain for Coq in MetaCoq"](http://www.irif.fr/~sozeau/research/publications/Coq_Coq_Codet-CoqWS19.pdf) Matthieu Sozeau, Simon Boulier, Yannick Forster, Nicolas Tabareau and @@ -182,8 +216,6 @@ Examples of translations built on top of this: - The system was presented at [Coq'PL 2018](https://popl18.sigplan.org/event/coqpl-2018-typed-template-coq) - - ## Team & Credits

@@ -203,17 +235,25 @@ alt="Cyril Cohen" width="150px"/> src="https://github.com/MetaCoq/metacoq.github.io/raw/master/assets/yannick-forster.jpg" alt="Yannick Forster" width="150px"/>
+
+alt="Gregory Malecha" width="150px"/> + +alt="Matthieu Sozeau" width="150px"/>
Nicolas Tabareau Théo Winterhalter +
+ MetaCoq is developed by (left to right) Abhishek Anand, @@ -221,7 +261,9 @@ MetaCoq is developed by (left to right) Simon Boulier, Cyril Cohen, Yannick Forster, +Meven Lennon-Bertrand, Gregory Malecha, +Jakob Botsch Nielsen, Matthieu Sozeau, Nicolas Tabareau and Théo Winterhalter. @@ -229,10 +271,11 @@ MetaCoq is developed by (left to right) ``` -Copyright (c) 2014-2020 Gregory Malecha -Copyright (c) 2015-2020 Abhishek Anand, Matthieu Sozeau -Copyright (c) 2017-2020 Simon Boulier, Nicolas Tabareau, Cyril Cohen -Copyright (c) 2018-2020 Danil Annenkov, Yannick Forster, Théo Winterhalter +Copyright (c) 2014-2022 Gregory Malecha +Copyright (c) 2015-2022 Abhishek Anand, Matthieu Sozeau +Copyright (c) 2017-2022 Simon Boulier, Nicolas Tabareau, Cyril Cohen +Copyright (c) 2018-2022 Danil Annenkov, Yannick Forster, Théo Winterhalter +Copyright (c) 2020-2022 Jakob Botsch Nielsen, Meven Lennon-Bertrand ``` This software is distributed under the terms of the MIT license. diff --git a/erasure/_CoqProject.in b/erasure/_CoqProject.in index 617a15e08..37d9b3020 100644 --- a/erasure/_CoqProject.in +++ b/erasure/_CoqProject.in @@ -10,7 +10,6 @@ theories/EPretty.v theories/ECSubst.v theories/EWcbvEval.v # theories/EWtAst.v -theories/EWndEval.v theories/EGlobalEnv.v theories/EWellformed.v theories/EEnvMap.v @@ -18,7 +17,6 @@ theories/EWcbvEvalInd.v theories/EWcbvEvalEtaInd.v theories/Extract.v theories/EDeps.v -theories/EAll.v theories/Extraction.v theories/Prelim.v theories/ESubstitution.v diff --git a/erasure/theories/EAll.v b/erasure/theories/EAll.v deleted file mode 100644 index 06e48834b..000000000 --- a/erasure/theories/EAll.v +++ /dev/null @@ -1,3 +0,0 @@ -(* Distributed under the terms of the MIT license. *) -From MetaCoq.Erasure Require Export EAst EInduction ELiftSubst EGlobalEnv EWcbvEval - EWndEval Extract. diff --git a/erasure/theories/ECoFixToFix.v b/erasure/theories/ECoFixToFix.v deleted file mode 100644 index 401644e9b..000000000 --- a/erasure/theories/ECoFixToFix.v +++ /dev/null @@ -1,23 +0,0 @@ -(* Distributed under the terms of the MIT license. *) -From Coq Require Import Program. -From MetaCoq.Template Require Import config utils. -From MetaCoq.PCUIC Require PCUICWcbvEval. -From MetaCoq.Erasure Require Import EAst EAstUtils ELiftSubst ECSubst EReflect EGlobalEnv. - -From Equations Require Import Equations. -Require Import ssreflect ssrbool. - -(** * Weak-head call-by-value evaluation strategy. - - The [wcbveval] inductive relation specifies weak cbv evaluation. It - is shown to be a subrelation of the 1-step reduction relation from - which conversion is defined. Hence two terms that reduce to the same - wcbv head normal form are convertible. - - This reduction strategy is supposed to mimick at the Coq level the - reduction strategy of ML programming languages. It is used to state - the extraction conjecture that can be applied to Coq terms to produce - (untyped) terms where all proofs are erased to a dummy value. *) - - -Local Ltac inv H := inversion H; subst. diff --git a/erasure/theories/EWndEval.v b/erasure/theories/EWndEval.v deleted file mode 100644 index ce6779e55..000000000 --- a/erasure/theories/EWndEval.v +++ /dev/null @@ -1,67 +0,0 @@ -(* Distributed under the terms of the MIT license. *) -From MetaCoq.Erasure Require Import EAst ELiftSubst EGlobalEnv. - -(** * 1-step non-deterministic weak reduction **) - - -Section Wnd. - Context (Σ : global_declarations). - (* The local context is fixed: we are only doing weak reductions *) - -Inductive Wnd : term -> term -> Prop := - (*** contraction steps ***) -(** Constant unfolding *) -| wConst c decl body (isdecl: declared_constant Σ c decl): - decl.(cst_body) = Some body -> Wnd (tConst c) body -(** Beta *) -| wBeta na a b: Wnd (tApp (tLambda na b) a) (subst10 a b) -(** Let *) -| wLet na b0 b1: Wnd (tLetIn na b0 b1) (subst10 b0 b1). - - - -End Wnd. - -(******************************** -| sConst: forall (s:string) (t:Term), - LookupDfn s p t -> wndEval (TConst s) t -| sBeta: forall (nm:name) (bod arg:Term), - wndEval (TApp (TLambda nm bod) arg) (whBetaStep bod arg) -(* note: [instantiate] is total *) -| sLetIn: forall (nm:name) (dfn bod:Term), - wndEval (TLetIn nm dfn bod) (instantiate dfn 0 bod) -(* Case argument must be in Canonical form *) -(* n is the number of parameters of the datatype *) -| sCase: forall (ml:inductive * nat) (s mch:Term) - (args ts:Terms) (brs:Brs) (n npars nargs:nat), - canonicalP mch = Some (n, npars, nargs, args) -> - tskipn (snd ml) args = Some ts -> - whCaseStep n ts brs = Some s -> - wndEval (TCase ml mch brs) s -| sFix: forall (dts:Defs) (m:nat) (arg:Term) (x:Term) (ix:nat), - (** ix is index of recursive argument **) - dnthBody m dts = Some (x, ix) -> - wndEval (TApp (TFix dts m) arg) (pre_whFixStep x dts arg) -| sProofApp arg: wndEval (TApp TProof arg) TProof -| sProj: forall bod r npars nargs args arg x ind, - canonicalP bod = Some (r, npars, nargs, args) -> - List.nth_error args (npars + arg) = Some x -> - wndEval (TProj (ind, npars, arg) bod) x -(*** congruence steps ***) -(** no xi rules: sLambdaR, sLetInR, - *** no congruence on Case branches ***) -| sAppFn: forall (t r arg:Term), - wndEval t r -> wndEval (TApp t arg) (TApp r arg) -| sAppArg: forall (t arg brg:Term), - wndEval arg brg -> wndEval (TApp t arg) (TApp t brg) -| sLetInDef:forall (nm:name) (d1 d2 bod:Term), - wndEval d1 d2 -> wndEval (TLetIn nm d1 bod) (TLetIn nm d2 bod) -| sCaseArg: forall (nl:inductive * nat) (mch can:Term) (brs:Brs), - wndEval mch can -> wndEval (TCase nl mch brs) (TCase nl can brs) -| sProjBod: forall prj bod Bod, - wndEval bod Bod -> wndEval (TProj prj bod) (TProj prj Bod). -#[global] -Hint Constructors wndEval. - - -**********************) diff --git a/erasure/theories/README.md b/erasure/theories/README.md new file mode 100644 index 000000000..4f3e77ec2 --- /dev/null +++ b/erasure/theories/README.md @@ -0,0 +1,79 @@ +# Erasure + +Implementation of a verified extraction pipeline from PCUIC to untyped lambda calculus +extended with a box construct for erased terms. + + +| File | Description | +|-----------------------|------------------------------------------------------| +| [Prelim] | Preliminaries on PCUIC +| [EArities] | Meta-theoretic lemmas on PCUIC needed for erasure correctness +| [EAst] | AST of λ-box terms +| [EAstUtils] | Utility definitions and lemmas on the AST +| [ELiftSubst] | Lifting and substitution for λ-box terms +| [ECSubst] | Definition of closed substitution (without lifting) +| [EReflect] | Reflection of equality on the AST +| [ESpineView] | Spine-view of λ-box terms (i.e., n-ary applications) +| [EDeps] | Definitions of λ-box term dependencies (used to optimize erasure) +| [EEnvMap] | Efficient global environment definition +| [EGlobalEnv] | Global environment interface +| [EEtaExpanded] | Eta-expansion predicates on λ-box terms, only for constructors +| [EEtaExpandedFix] | Eta-expansion predicates on λ-box terms, for constructors and fixpoints +| [EInduction] | Induction principles on λ-box terms +| [EExtends] | Weakening of global environments +| [EPretty] | Pretty-printing of λ-box programs +| [EProgram] | Definition of well-formed λ-box programs and associated evaluation +| [EWcbvEval] | Weak call-by-value evaluation definition +| [EWcbvEvalEtaInd] | Induction principle on weak call-by-value evaluation preserving eta-expansion +| [EWcbvEvalInd] | Induction principle on weak call-by-value evaluation +| [EWellformed] | Well-formedness predicate on erased terms +| [Erasure] | The erasure relation +| [ESubstitution] | Substitution and weakening lemmas for the erasure relation +| [ErasureCorrectness] | The erasure relation correctness proof +| [ErasureProperties] | Properties of the erasure relation +| [ErasureFunction] | The erasure function defined on well-typed terms and its correctness proof +| [EInlineProjections] | Transformation that inlines projections to cases +| [EOptimizePropDiscr] | Transformation removing cases on propositional content +| [ERemoveParams] | Remove constructor parameters +| [ETransform] | Definitions of transformations from PCUIC to λ-box +| [Extract] | The complete erasure pipeline +| [Extraction] | Extraction directives for the plugin +| [Loader] | Loads the erasure plugin + +[EAll]: EAll.v +[EArities]: EArities.v +[EAst]: EAst.v +[EAstUtils]: EAstUtils.v +[ECSubst]: ECSubst.v +[ECoFixToFix]: ECoFixToFix.v +[EDeps]: EDeps.v +[EEnvMap]: EEnvMap.v +[EEtaExpanded]: EEtaExpanded.v +[EEtaExpandedFix]: EEtaExpandedFix.v +[EExtends]: EExtends.v +[EGlobalEnv]: EGlobalEnv.v +[EInduction]: EInduction.v +[EInlineProjections]: EInlineProjections.v +[ELiftSubst]: ELiftSubst.v +[EOptimizePropDiscr]: EOptimizePropDiscr.v +[EPretty]: EPretty.v +[EProgram]: EProgram.v +[EReflect]: EReflect.v +[ERemoveParams]: ERemoveParams.v +[ESpineView]: ESpineView.v +[ESubstitution]: ESubstitution.v +[ETransform]: ETransform.v +[EWcbvEval]: EWcbvEval.v +[EWcbvEvalEtaInd]: EWcbvEvalEtaInd.v +[EWcbvEvalInd]: EWcbvEvalInd.v +[EWellformed]: EWellformed.v +[EWndEval]: EWndEval.v +[EWtAst]: EWtAst.v +[Erasure]: Erasure.v +[ErasureCorrectness]: ErasureCorrectness.v +[ErasureFunction]: ErasureFunction.v +[ErasureProperties]: ErasureProperties.v +[Extract]: Extract.v +[Extraction]: Extraction.v +[Loader]: Loader.v +[Prelim]: Prelim.v \ No newline at end of file diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 6ed3e103d..2b31d1719 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -13,8 +13,6 @@ Axiom assume_welltypedness_of_input : forall p, ∥ wt_template_program p ∥. Definition eta_expand p := run_eta_program p (assume_welltypedness_of_input p). -Compute (Transform.pre template_eta_expand _). - Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with | ConstantDecl cb => From a247fa62b9758e9c58d5bf00b603e8f1ae1feede Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Mon, 27 Jun 2022 15:22:43 +0200 Subject: [PATCH 08/43] Fix README --- erasure/theories/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erasure/theories/README.md b/erasure/theories/README.md index 4f3e77ec2..554d351d3 100644 --- a/erasure/theories/README.md +++ b/erasure/theories/README.md @@ -27,7 +27,7 @@ extended with a box construct for erased terms. | [EWcbvEvalEtaInd] | Induction principle on weak call-by-value evaluation preserving eta-expansion | [EWcbvEvalInd] | Induction principle on weak call-by-value evaluation | [EWellformed] | Well-formedness predicate on erased terms -| [Erasure] | The erasure relation +| [Extract] | The erasure relation | [ESubstitution] | Substitution and weakening lemmas for the erasure relation | [ErasureCorrectness] | The erasure relation correctness proof | [ErasureProperties] | Properties of the erasure relation @@ -36,7 +36,7 @@ extended with a box construct for erased terms. | [EOptimizePropDiscr] | Transformation removing cases on propositional content | [ERemoveParams] | Remove constructor parameters | [ETransform] | Definitions of transformations from PCUIC to λ-box -| [Extract] | The complete erasure pipeline +| [Erasure] | The complete erasure pipeline | [Extraction] | Extraction directives for the plugin | [Loader] | Loads the erasure plugin From f8510b013f694eeea6d2a20b4474cdf31f05e8bc Mon Sep 17 00:00:00 2001 From: Yannick Forster Date: Tue, 28 Jun 2022 13:54:38 +0200 Subject: [PATCH 09/43] Remove warnings (#720) * remove warnings * remove warnings and remove axion on eta expansion * fix build.yml * fix build.yml * fix compilation * use bash for checktodos.sh * always run CI even if there are todos * improve output * Set Warnings * separate todo job --- .github/workflows/build.yml | 11 ++++ checktodos.sh | 4 +- erasure/_PluginProject.in | 6 +++ erasure/src/metacoq_erasure_plugin.mlpack | 3 ++ erasure/theories/EWcbvEvalEtaInd.v | 2 + erasure/theories/EWellformed.v | 8 +-- erasure/theories/Erasure.v | 41 +++++++++++---- pcuic/theories/PCUICProgress.v | 2 +- safechecker/_PluginProject.in | 2 + .../src/metacoq_safechecker_plugin.mlpack | 1 + safechecker/theories/PCUICSafeConversion.v | 7 +-- template-coq/_PluginProject | 6 --- template-coq/theories/EtaExpand.v | 8 +-- template-coq/theories/TemplateCheckWf.v | 5 +- template-coq/theories/TemplateProgram.v | 51 ------------------- template-coq/theories/common/uGraph.v | 6 +-- test-suite/hott_example.v | 2 +- test-suite/safechecker_test.v | 1 + translations/MiniHoTT.v | 14 +++-- translations/MiniHoTT_paths.v | 10 ++-- translations/param_binary.v | 2 + translations/param_generous_packed.v | 1 + translations/standard_model.v | 2 +- translations/times_bool_fun.v | 7 ++- translations/times_bool_fun2.v | 2 + 25 files changed, 107 insertions(+), 97 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7b751b9cb..769d2b2c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,17 @@ name: MetaCoq CI on: [push, pull_request] jobs: + checktodos: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 1 + + - name: Check for todos + run: ./checktodos.sh + build: runs-on: ubuntu-latest diff --git a/checktodos.sh b/checktodos.sh index 25b2476f3..f4eef771e 100755 --- a/checktodos.sh +++ b/checktodos.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash if [[ $(git grep -c todo | grep theories) = template-coq/theories/utils/MCUtils.v:3 ]] then @@ -14,7 +14,7 @@ then fi else echo "Found todos:" - git grep -c todo | grep theories + git grep -c todo | grep theories | grep -v "template-coq/theories/utils/MCUtils.v:3" exit 1 fi endef diff --git a/erasure/_PluginProject.in b/erasure/_PluginProject.in index aa47c2482..9909b2e98 100644 --- a/erasure/_PluginProject.in +++ b/erasure/_PluginProject.in @@ -18,6 +18,12 @@ src/wGraph.ml src/wGraph.mli src/envMap.mli src/envMap.ml +src/mCProd.mli +src/mCProd.ml +src/transform.mli +src/transform.ml +src/etaExpand.mli +src/etaExpand.ml # src/reflect.mli # src/reflect.ml diff --git a/erasure/src/metacoq_erasure_plugin.mlpack b/erasure/src/metacoq_erasure_plugin.mlpack index 520b59552..66c282909 100644 --- a/erasure/src/metacoq_erasure_plugin.mlpack +++ b/erasure/src/metacoq_erasure_plugin.mlpack @@ -7,6 +7,9 @@ Utils WGraph UGraph0 EnvMap +MCProd +Transform +EtaExpand WcbvEval Classes0 diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index 7cbf6e778..2c3ae7d7b 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -130,6 +130,7 @@ Class Qconst Σ (Q : nat -> term -> Type) := qconst : end. #[export] Hint Mode Qconst - ! : typeclass_instances. +Set Warnings "-future-coercion-class-field". Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := { qpres_qpres :> Qpres Q; qpres_qcons :> Qconst Σ Q; @@ -139,6 +140,7 @@ Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := qpres_qsubst :> Qsubst Q; qpres_qfix :> Qfix Q; qpres_qcofix :> Qcofix Q }. +Set Warnings "+future-coercion-class-field". Lemma eval_preserve_mkApps_ind : ∀ (wfl : WcbvFlags) {efl : EEnvFlags} (Σ : global_declarations) diff --git a/erasure/theories/EWellformed.v b/erasure/theories/EWellformed.v index 27828e501..68412ffc1 100644 --- a/erasure/theories/EWellformed.v +++ b/erasure/theories/EWellformed.v @@ -35,11 +35,13 @@ Class ETermFlags := ; has_tCoFix : bool }. +Set Warnings "-future-coercion-class-field". Class EEnvFlags := { has_axioms : bool; has_cstr_params : bool; term_switches :> ETermFlags }. - +Set Warnings "+future-coercion-class-field". + Definition all_term_flags := {| has_tBox := true ; has_tRel := true @@ -281,7 +283,7 @@ Section EEnvFlags. forallb (wellformed 0) (fix_subst mfix). Proof using Type. intros hm. unfold fix_subst. - generalize (le_refl #|mfix|). + generalize (Nat.le_refl #|mfix|). move: {1 3}#|mfix| => n. induction n => //. intros hn. cbn. rewrite hast /=. rewrite /wf_fix_gen hm /= andb_true_r. @@ -293,7 +295,7 @@ Section EEnvFlags. forallb (wellformed 0) (cofix_subst mfix). Proof using Type. intros hm. unfold cofix_subst. - generalize (le_refl #|mfix|). + generalize (Nat.le_refl #|mfix|). move: {1 3}#|mfix| => n. induction n => //. intros hn. cbn. rewrite hasco /=. rewrite /wf_fix_gen hm /= andb_true_r. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index f3f570c61..3288adb96 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -1,13 +1,12 @@ (* Distributed under the terms of the MIT license. *) From Coq Require Import Program ssreflect ssrbool. -From MetaCoq.Template Require Import Transform bytestring config utils. +From MetaCoq.Template Require Import Transform bytestring config utils EtaExpand. From MetaCoq.PCUIC Require PCUICAst PCUICAstUtils PCUICProgram. From MetaCoq.SafeChecker Require Import PCUICErrors PCUICWfEnvImpl. From MetaCoq.Erasure Require EAstUtils ErasureFunction ErasureCorrectness EPretty Extract. From MetaCoq.Erasure Require Import ETransform. Import PCUICProgram. -Import TemplateProgram (template_eta_expand). Import PCUICTransform (template_to_pcuic_transform, pcuic_expand_lets_transform). Import bytestring. @@ -32,8 +31,6 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf Ast.term EAst.term TemplateProgram.eval_template_program (EProgram.eval_eprogram {| with_prop_case := false; with_guarded_fix := false |}) := - (* Eta expansion of constructors and fixpoints *) - template_eta_expand ▷ (* Casts are removed, application is binary, case annotations are inferred from the global environment *) template_to_pcuic_transform ▷ (* Branches of cases are expanded to bind only variables, constructor types are expanded accordingly *) @@ -92,7 +89,6 @@ Qed. Definition run_erase_program {guard : abstract_guard_impl} := run erasure_pipeline. Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := EWellformed.all_env_flags) := - template_eta_expand ▷ template_to_pcuic_transform ▷ pcuic_expand_lets_transform ▷ erase_transform ▷ @@ -126,14 +122,41 @@ Next Obligation. apply fake_guard_impl_properties. Qed. Coq definition). *) -Axiom assume_that_we_only_erase_on_welltyped_programs : +Axiom assume_that_we_only_erase_on_welltyped_programs : forall {cf : checker_flags}, forall (p : Ast.Env.program), squash (TemplateProgram.wt_template_program p). -Definition erase_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) + +Program Definition erase_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) : string := - let p' := run_erase_program p (assume_that_we_only_erase_on_welltyped_programs p) in + let p' := run_erase_program (eta_expand_program p) _ in time "Pretty printing" EPretty.print_program p'. +Next Obligation. + assert (ht : ∥ TemplateProgram.wt_template_program p ∥) by eapply assume_that_we_only_erase_on_welltyped_programs. + split; auto. + apply assume_that_we_only_erase_on_welltyped_programs. + red. + destruct ht as [[wfext [T ht]]]. + split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. eapply wfext. + eapply EtaExpand.expanded_env_irrel. + epose proof (EtaExpand.eta_expand_expanded (Σ := Ast.Env.empty_ext p.1) [] [] p.2 T). + forward H. apply wfext. specialize (H ht). + forward H by constructor. cbn in H. + destruct p as [ [] ]; cbn in *. exact H. +Qed. Program Definition erase_fast_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) : string := - let p' := run_erase_program_fast p (assume_that_we_only_erase_on_welltyped_programs p) in + let p' := run_erase_program_fast (eta_expand_program p) _ in time "pretty-printing" EPretty.print_program p'. +Next Obligation. + assert (ht : ∥ TemplateProgram.wt_template_program p ∥) by eapply assume_that_we_only_erase_on_welltyped_programs. + split; auto. + apply assume_that_we_only_erase_on_welltyped_programs. + red. + destruct ht as [[wfext [T ht]]]. + split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. eapply wfext. + eapply EtaExpand.expanded_env_irrel. + epose proof (EtaExpand.eta_expand_expanded (Σ := Ast.Env.empty_ext p.1) [] [] p.2 T). + forward H. apply wfext. specialize (H ht). + forward H by constructor. cbn in H. + destruct p as [ [] ]; cbn in *. exact H. +Qed. \ No newline at end of file diff --git a/pcuic/theories/PCUICProgress.v b/pcuic/theories/PCUICProgress.v index 0393eef9c..6ac0f0e48 100644 --- a/pcuic/theories/PCUICProgress.v +++ b/pcuic/theories/PCUICProgress.v @@ -735,7 +735,7 @@ Proof. 1,2: now rewrite closed_subst; eauto; econstructor; eauto. - now rewrite e0 /cstr_arity -e1 -e2. - rewrite !tApp_mkApps -!mkApps_app. econstructor. eauto. - unfold is_constructor. now rewrite nth_error_app2 // minus_diag. + unfold is_constructor. now rewrite nth_error_app2 // Nat.sub_diag. - unfold cunfold_cofix in e. destruct nth_error as [d | ] eqn:E; try congruence. inversion e; subst. econstructor. unfold unfold_cofix. rewrite E. repeat f_equal. diff --git a/safechecker/_PluginProject.in b/safechecker/_PluginProject.in index 788756c48..fa2d6a61a 100644 --- a/safechecker/_PluginProject.in +++ b/safechecker/_PluginProject.in @@ -16,6 +16,8 @@ src/wGraph.ml src/wGraph.mli src/envMap.mli src/envMap.ml +src/mCProd.mli +src/mCProd.ml # From PCUIC # src/pCUICPrimitive.mli diff --git a/safechecker/src/metacoq_safechecker_plugin.mlpack b/safechecker/src/metacoq_safechecker_plugin.mlpack index 1c0e60a37..50582b0b6 100644 --- a/safechecker/src/metacoq_safechecker_plugin.mlpack +++ b/safechecker/src/metacoq_safechecker_plugin.mlpack @@ -5,6 +5,7 @@ WGraph UGraph0 EnvMap Reflect +MCProd Classes0 Logic1 diff --git a/safechecker/theories/PCUICSafeConversion.v b/safechecker/theories/PCUICSafeConversion.v index 8fb8f19d1..77c871f31 100644 --- a/safechecker/theories/PCUICSafeConversion.v +++ b/safechecker/theories/PCUICSafeConversion.v @@ -213,8 +213,7 @@ Section Conversion. Defined. Derive Signature for Subterm.lexprod. - Derive Signature for dlexmod. - + Lemma R_aux_Acc : forall Γ t p w q s, (forall Σ, abstract_env_ext_rel X Σ -> welltyped Σ Γ t) -> @@ -5710,7 +5709,9 @@ Qed. _isconv Fallback Γ t1 π1 h1 t2 π2 h2 aux := λ { | leq | hx | r1 | r2 | hd := _isconv_fallback Γ leq t1 π1 h1 t2 π2 h2 r1 r2 hd hx aux }. - + + Derive Signature for dlexmod. + Lemma welltyped_R_zipc Σ (wfΣ : abstract_env_ext_rel X Σ) Γ : forall x y : pack Γ, welltyped Σ Γ (zipc (tm1 x) (stk1 x)) -> R Γ y x -> welltyped Σ Γ (zipc (tm1 y) (stk1 y)). Proof using Type. diff --git a/template-coq/_PluginProject b/template-coq/_PluginProject index e49dae931..e0b2967b6 100644 --- a/template-coq/_PluginProject +++ b/template-coq/_PluginProject @@ -110,8 +110,6 @@ gen-src/mCList.ml gen-src/mCList.mli gen-src/mCOption.ml gen-src/mCOption.mli -gen-src/mCProd.ml -gen-src/mCProd.mli gen-src/mCRelations.ml gen-src/mCRelations.mli gen-src/mCReflect.mli @@ -205,10 +203,6 @@ gen-src/termEquality.mli gen-src/termEquality.ml gen-src/typing0.mli gen-src/typing0.ml -gen-src/transform.mli -gen-src/transform.ml -gen-src/etaExpand.mli -gen-src/etaExpand.ml gen-src/templateProgram.mli gen-src/templateProgram.ml diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index 04a77ca1c..e4267fb2c 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -781,9 +781,9 @@ Proof. 2:{ replace (S n0 - #|l|) with 0 by lia. cbn. econstructor. } rewrite EE in H4. rewrite seq_app, rev_map_spec, map_app, rev_app_distr in H4. - eapply Forall_app in H4 as []. rewrite Min.min_l. 2: len; lia. + eapply Forall_app in H4 as []. rewrite Nat.min_l. 2: len; lia. rewrite <- EE in H0. - revert H0. len. rewrite !firstn_length, Min.min_l. 2:len;lia. + revert H0. len. rewrite !firstn_length, Nat.min_l. 2:len;lia. rewrite rev_map_spec. intros. rewrite Forall_forall in H0 |- *. intros. specialize (H0 _ H1). rewrite <- in_rev in H1. @@ -949,7 +949,7 @@ Proof. destruct n0. * cbn. econstructor. now rewrite nth_error_map, H1. * rewrite seq_S,rev_map_spec, map_app, rev_app_distr. subst. - rewrite <- context_assumptions_lift, !Min.min_l; try lia. + rewrite <- context_assumptions_lift, !Nat.min_l; try lia. econstructor. -- rewrite nth_error_app2. 2: rewrite repeat_length; lia. rewrite repeat_length. replace (S n0 + n - S n0) with n by lia. @@ -1128,7 +1128,7 @@ Proof. assert (#| (case_branch_context_gen (ci_ind ci) mdecl (pparams p) (puinst p) (bcontext y) x)| = #|bcontext y|). { clear - a0. unfold case_branch_context_gen. rewrite map2_length. - rewrite Min.min_l; try lia. eapply All2_length in a0. + rewrite Nat.min_l; try lia. eapply All2_length in a0. unfold inst_case_context. unfold subst_context. unfold subst_instance, subst_instance_context, map_context. rewrite fold_context_k_length, map_length. unfold aname. lia. diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 2b31d1719..8bb7798b4 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -7,11 +7,8 @@ Open Scope bs_scope. #[local] Existing Instance config.default_checker_flags. -Definition run_eta_program := Transform.run template_eta_expand. - -Axiom assume_welltypedness_of_input : forall p, ∥ wt_template_program p ∥. Definition eta_expand p := - run_eta_program p (assume_welltypedness_of_input p). + EtaExpand.eta_expand_program p. Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with diff --git a/template-coq/theories/TemplateProgram.v b/template-coq/theories/TemplateProgram.v index 9a1d1aba6..ec0280282 100644 --- a/template-coq/theories/TemplateProgram.v +++ b/template-coq/theories/TemplateProgram.v @@ -24,54 +24,3 @@ Definition wt_template_program {cf : checker_flags} (p : template_program) := Definition eval_template_program (p : Ast.Env.program) (v : Ast.term) := ∥ WcbvEval.eval p.1 p.2 v ∥. -(* Eta-expansion *) - -Definition template_expand_obseq (p p' : template_program) (v v' : Ast.term) := - v' = EtaExpand.eta_expand p.1.(Ast.Env.declarations) [] v. - -Local Obligation Tactic := idtac. - -Axiom eta_expansion_preserves_wf_ext_and_typing : - forall (cf : checker_flags) - (Σ : global_env) - (t : term) - (wfext : wf_ext (empty_ext (Σ, t).1)) - (ht : ∑ T : term, empty_ext (Σ, t).1;;; [] |- (Σ, t).2 : T), - ∥ wt_template_program (eta_expand_program (Σ, t)) ∥. - -Axiom eta_expansion_preserves_evaluation : - forall (cf : checker_flags) - (Σ : global_env) - (t v : term) - (w : wf_ext (empty_ext (Σ, t).1)) - (s : ∑ T : term, empty_ext (Σ, t).1;;; [] |- (Σ, t).2 : T) - (ev : ∥ eval Σ t v ∥), - ∥ eval (eta_expand_global_env Σ) (eta_expand (declarations Σ) [] t) - (eta_expand (declarations Σ) [] v) ∥. - -Program Definition template_eta_expand {cf : checker_flags} : self_transform template_program Ast.term eval_template_program eval_template_program := - {| name := "eta-expansion of template program"; - pre p := ∥ wt_template_program p ∥; - transform p _ := EtaExpand.eta_expand_program p; - post p := ∥ wt_template_program p ∥ /\ EtaExpand.expanded_program p; - obseq := template_expand_obseq |}. -Next Obligation. - intros cf [Σ t] [[wfext ht]]. - cbn. split. eapply eta_expansion_preserves_wf_ext_and_typing; eauto. - red. - destruct ht as [T ht]. - split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. apply wfext. - eapply EtaExpand.expanded_env_irrel. - epose proof (EtaExpand.eta_expand_expanded (Σ := Ast.Env.empty_ext Σ) [] [] t T). - forward H. apply wfext. specialize (H ht). - forward H by constructor. cbn in H. - destruct Σ; cbn in *. exact H. -Qed. -Next Obligation. - red. intros cf [Σ t] v [[]]. - unfold eval_template_program. - cbn. intros ev. - exists (EtaExpand.eta_expand (Ast.Env.declarations Σ) [] v). split. - eapply eta_expansion_preserves_evaluation; eauto. - red. reflexivity. -Qed. diff --git a/template-coq/theories/common/uGraph.v b/template-coq/theories/common/uGraph.v index 626c307f1..49326d738 100644 --- a/template-coq/theories/common/uGraph.v +++ b/template-coq/theories/common/uGraph.v @@ -2940,7 +2940,7 @@ Proof. Qed. -Instance subgraph_proper : Proper ((=_g) ==> (=_g) ==> iff) subgraph. +#[global] Instance subgraph_proper : Proper ((=_g) ==> (=_g) ==> iff) subgraph. Proof. unshelve apply: proper_sym_impl_iff_2. move=> g1 g1' [eqv1 [eqe1 eqs1]] g2 g2' [eqv2 [eqe2 eqs2]]. @@ -2950,7 +2950,7 @@ Proof. + by rewrite <- eqs1, <- eqs2. Qed. -Instance full_subgraph_proper : Proper ((=_g) ==> (=_g) ==> iff) full_subgraph. +#[global] Instance full_subgraph_proper : Proper ((=_g) ==> (=_g) ==> iff) full_subgraph. Proof. unshelve apply: proper_sym_impl_iff_2. move=> g1 g1' eq1 g2 g2' eq2. @@ -2984,7 +2984,7 @@ Proof. apply: make_graph_invariants. Qed. -Existing Instance correct_labelling_proper. +#[export] Existing Instance correct_labelling_proper. Lemma correct_labelling_of_valuation_satisfies_iff `{checker_flags} [uctx G v] : is_graph_of_uctx G uctx -> diff --git a/test-suite/hott_example.v b/test-suite/hott_example.v index 90281a880..40a925025 100644 --- a/test-suite/hott_example.v +++ b/test-suite/hott_example.v @@ -1,4 +1,4 @@ - +Set Warnings "-future-coercion-class-field". Set Universe Polymorphism. (* Basic notations *) diff --git a/test-suite/safechecker_test.v b/test-suite/safechecker_test.v index cb629545d..f6a893761 100644 --- a/test-suite/safechecker_test.v +++ b/test-suite/safechecker_test.v @@ -29,6 +29,7 @@ Definition bignat : nat := Nat.of_num_uint 10000%uint. MetaCoq SafeCheck bignat. MetaCoq CoqCheck bignat. +Set Warnings "-notation-overriden". From MetaCoq.TestSuite Require Import hott_example. MetaCoq SafeCheck @issect'. diff --git a/translations/MiniHoTT.v b/translations/MiniHoTT.v index 5b4e2e874..b83923b0f 100644 --- a/translations/MiniHoTT.v +++ b/translations/MiniHoTT.v @@ -1,4 +1,4 @@ - +Set Warnings "-notation-overridden". Local Set Primitive Projections. Record sigT {A} (P : A -> Type) : Type := existT @@ -93,6 +93,11 @@ Ltac transitivity x := etransitivity x. Notation idmap := (fun x => x). +Declare Scope equiv_scope. +Declare Scope path_scope. +Declare Scope fibration_scope. +Declare Scope trunc_scope. + Delimit Scope equiv_scope with equiv. Delimit Scope function_scope with function. Delimit Scope path_scope with path. @@ -134,7 +139,7 @@ Notation "g 'o' f" := (compose g%function f%function) (at level 40, left associa Definition composeD {A B C} (g : forall b, C b) (f : A -> B) := fun x : A => g (f x). Global Arguments composeD {A B C}%type_scope (g f)%function_scope x. #[global] -Hint Unfold composeD. +Hint Unfold composeD : core. Notation "g 'oD' f" := (composeD g f) (at level 40, left associativity) : function_scope. Notation "x = y :> A" := (paths A x y) : type_scope. @@ -266,7 +271,7 @@ Arguments center A {_}. Class Funext := { isequiv_apD10 : forall (A : Type) (P : A -> Type) f g, IsEquiv (@apD10 A P f g) }. -Existing Instance isequiv_apD10. +Global Existing Instance isequiv_apD10. Definition path_forall `{Funext} {A : Type} {P : A -> Type} (f g : forall x : A, P x) : f == g -> f = g := (@apD10 A P f g)^-1. @@ -1312,6 +1317,7 @@ Hint Resolve inv_pp inv_V : path_hints. +#[global] Hint Rewrite @concat_p1 @concat_1p @@ -3038,7 +3044,7 @@ Definition equiv_path_sigma `(P : A -> Type) (u v : sigT P) := BuildEquiv _ _ (path_sigma_uncurried P u v) _. (* A contravariant version of [isequiv_path_sigma'] *) -Instance isequiv_path_sigma_contra `{P : A -> Type} {u v : sigT P} +Global Instance isequiv_path_sigma_contra `{P : A -> Type} {u v : sigT P} : IsEquiv (path_sigma_uncurried_contra P u v) | 0. unshelve eapply (isequiv_adjointify (path_sigma_uncurried_contra P u v)). - intros []. exists 1. reflexivity. diff --git a/translations/MiniHoTT_paths.v b/translations/MiniHoTT_paths.v index af9b3170f..242b49bd5 100644 --- a/translations/MiniHoTT_paths.v +++ b/translations/MiniHoTT_paths.v @@ -1,4 +1,4 @@ - +Set Warnings "-notation-overridden". Local Set Primitive Projections. Record sigT {A} (P : A -> Type) : Type := existT @@ -33,18 +33,17 @@ Defined. (* *********************************************** *) - Arguments sigT {A}%type P%type. Arguments existT {A}%type P%type _ _. Arguments projT1 {A P} _ / . Arguments projT2 {A P} _ / . + Notation "'exists' x .. y , p" := (sigT (fun x => .. (sigT (fun y => p)) ..)) (at level 200, x binder, right associativity, format "'[' 'exists' '/ ' x .. y , '/ ' p ']'") : type_scope. Notation "{ x : A & P }" := (sigT (fun x:A => P)) : type_scope. - Definition relation (A : Type) := A -> A -> Type. Class Reflexive {A} (R : relation A) := @@ -97,6 +96,11 @@ Ltac transitivity x := etransitivity x. Notation idmap := (fun x => x). +Declare Scope equiv_scope. +Declare Scope path_scope. +Declare Scope fibration_scope. +Declare Scope trunc_scope. + Delimit Scope equiv_scope with equiv. Delimit Scope function_scope with function. Delimit Scope path_scope with path. diff --git a/translations/param_binary.v b/translations/param_binary.v index 08201be6d..6b251e565 100644 --- a/translations/param_binary.v +++ b/translations/param_binary.v @@ -199,6 +199,7 @@ Definition tsl_mind_body (E : tsl_table) (mp : modpath) (kn : kername) Defined. +#[global] Instance param : Translation := {| tsl_id := tsl_ident ; tsl_tm := fun ΣE t => ret (tsl_rec1 (snd ΣE) t) ; @@ -217,6 +218,7 @@ MetaCoq Run ( tmUnquote tm' >>= tmDebug ). +Set Warnings "-unexpected-implicit-declaration". MetaCoq Run ( typ <- tmQuote (forall A B, B -> (A -> B -> B) -> B) ;; typ' <- tmEval all (tsl_rec1 [] typ) ;; diff --git a/translations/param_generous_packed.v b/translations/param_generous_packed.v index 37d19a9c0..b540f2e41 100644 --- a/translations/param_generous_packed.v +++ b/translations/param_generous_packed.v @@ -1,4 +1,5 @@ (* Distributed under the terms of the MIT license. *) +Set Warnings "-notation-overridden". From MetaCoq.Template Require Import utils Checker All. From MetaCoq.Translations Require Import translation_utils MiniHoTT_paths. diff --git a/translations/standard_model.v b/translations/standard_model.v index 13fbe8dfb..7641f3e37 100644 --- a/translations/standard_model.v +++ b/translations/standard_model.v @@ -89,7 +89,7 @@ with tsl_ctx (ΣE : tsl_context) (Γ : context) {struct Γ} : tsl_result term := end. - +#[global] Instance param : Translation := {| tsl_id := tsl_ident ; tsl_tm := fun ΣE => tsl ΣE [] ; diff --git a/translations/times_bool_fun.v b/translations/times_bool_fun.v index 74449f088..3f8164067 100644 --- a/translations/times_bool_fun.v +++ b/translations/times_bool_fun.v @@ -1,4 +1,6 @@ (* Distributed under the terms of the MIT license. *) +Set Warnings "-notation-overridden". + From MetaCoq.Template Require Import utils All Checker. From MetaCoq.Translations Require Import translation_utils MiniHoTT. Import MCMonadNotation. @@ -12,6 +14,7 @@ Arguments π1 {_ _} _. Arguments π2 {_ _} _. Arguments pair {_ _} _ _. +Declare Scope prod_scope. Notation "( x ; y )" := (pair x y) : prod_scope. Notation " A × B " := (prod A B) : type_scope. Open Scope prod_scope. @@ -37,7 +40,7 @@ Definition pairTrue typ tm := tApp tpair [typ; tbool; tm; ttrue]. Local Instance tit : config.checker_flags := config.type_in_type. -Existing Instance Checker.default_fuel. +Local Existing Instance Checker.default_fuel. Fixpoint tsl_rec (fuel : nat) (Σ : global_env_ext) (E : tsl_table) (Γ : context) (t : term) {struct fuel} : tsl_result term := @@ -216,7 +219,7 @@ Fixpoint refresh_universes (t : term) {struct t} := | _ => t end. -Instance tsl_fun : Translation +Global Instance tsl_fun : Translation := {| tsl_id := tsl_ident ; tsl_tm := fun ΣE t => t' <- tsl_rec fuel (fst ΣE) (snd ΣE) [] t ;; ret (refresh_universes t'); diff --git a/translations/times_bool_fun2.v b/translations/times_bool_fun2.v index cdd8fce87..71678ef4b 100644 --- a/translations/times_bool_fun2.v +++ b/translations/times_bool_fun2.v @@ -1,4 +1,6 @@ (* Distributed under the terms of the MIT license. *) +Set Warnings "-notation-overridden". + From MetaCoq.Template Require Import utils All. Unset Universe Checking. From MetaCoq.Translations Require Import translation_utils times_bool_fun MiniHoTT. From 78b5df89974165230b6f744c754e6cef3c893901 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Thu, 30 Jun 2022 15:08:33 +0200 Subject: [PATCH 10/43] Constructor tactic example (#725) --- examples/_CoqProject | 1 + examples/constructor_tac.v | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 examples/constructor_tac.v diff --git a/examples/_CoqProject b/examples/_CoqProject index c68a2627f..a4603b8bf 100644 --- a/examples/_CoqProject +++ b/examples/_CoqProject @@ -8,6 +8,7 @@ -R . MetaCoq.Examples demo.v +constructor_tac.v add_constructor.v tauto.v typing_correctness.v diff --git a/examples/constructor_tac.v b/examples/constructor_tac.v new file mode 100644 index 000000000..31f58df31 --- /dev/null +++ b/examples/constructor_tac.v @@ -0,0 +1,43 @@ +From Coq Require Import List. +From MetaCoq.Template Require Import All Loader. +Import MCMonadNotation. +Open Scope bs. + +Definition constructor (goal : Ast.term): TemplateMonad typed_term := + let '(hd, iargs) := decompose_app goal in + match hd with + | Ast.tInd ind u => + qi <- tmQuoteInductive (inductive_mind ind) ;; + match nth_error qi.(Ast.Env.ind_bodies) (inductive_ind ind) with + | Some oib => + let cstrs := Ast.Env.ind_ctors oib in + match cstrs with + | [] => tmFail "no constructor in this inductive type" + | hd :: _ => + let args := cstr_args hd in + let params := firstn qi.(ind_npars) iargs in + let args := (params ++ map (fun _ => Ast.hole) args)%list in + let term := Ast.tApp (Ast.tConstruct ind 0 u) args in + term' <- tmEval all term ;; + tmUnquote term' + end + | None => tmFail "anomaly" + end + | _ => tmFail "goal is not an inductive type" + end. + +Ltac constructor_tac := + match goal with + |- ?T => + let k tm := refine tm.(my_projT2) in + unshelve quote_term T ltac:(fun gl => run_template_program (constructor gl) k) + end. + +Goal True. + constructor_tac. +Qed. + +Goal True + False. + repeat constructor_tac. +Qed. + From 5b410f1b5272ce6f7633229e69ff6279ccc38226 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 10:00:08 +0200 Subject: [PATCH 11/43] Constructors as blocks (#723) * Option to see constructors as block in EWcbvEval, needed for extraction in CertiCoq and to OCaml/Malfunction (#716) * constructors as blocks * evaluation rules for constructors as blocks * tranformation to constructors as blocks * correctness proof for constructors as blocks * Fixes after merge * Fixes after merge * everything apart from wf_global for transform_blocks * fix workflow * generalize transformation on env * don't skip test * fix names Co-authored-by: Yannick Forster --- .github/workflows/build.yml | 6 +- erasure/_CoqProject.in | 2 + erasure/theories/EAst.v | 2 +- erasure/theories/EAstUtils.v | 12 +- erasure/theories/ECSubst.v | 3 +- erasure/theories/EConstructorsAsBlocks.v | 1004 ++++++++++++++++++++++ erasure/theories/EDeps.v | 17 +- erasure/theories/EEtaExpanded.v | 69 +- erasure/theories/EEtaExpandedFix.v | 257 +++--- erasure/theories/EGenericMapEnv.v | 339 ++++++++ erasure/theories/EGlobalEnv.v | 2 +- erasure/theories/EInduction.v | 19 +- erasure/theories/EInlineProjections.v | 60 +- erasure/theories/ELiftSubst.v | 11 +- erasure/theories/EOptimizePropDiscr.v | 51 +- erasure/theories/EPretty.v | 4 +- erasure/theories/EReflect.v | 9 + erasure/theories/ERemoveParams.v | 118 +-- erasure/theories/ESpineView.v | 2 +- erasure/theories/ETransform.v | 60 +- erasure/theories/EWcbvEval.v | 304 +++++-- erasure/theories/EWcbvEvalEtaInd.v | 93 +- erasure/theories/EWcbvEvalInd.v | 175 +++- erasure/theories/EWellformed.v | 31 +- erasure/theories/Erasure.v | 39 +- erasure/theories/ErasureCorrectness.v | 4 +- erasure/theories/ErasureFunction.v | 4 +- erasure/theories/ErasureProperties.v | 18 +- erasure/theories/Extract.v | 6 +- 29 files changed, 2239 insertions(+), 482 deletions(-) create mode 100644 erasure/theories/EConstructorsAsBlocks.v create mode 100644 erasure/theories/EGenericMapEnv.v diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 769d2b2c6..892463022 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,13 @@ name: MetaCoq CI -on: [push, pull_request] +on: + push: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] jobs: checktodos: + if: github.event_name != 'pull_request' || github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - name: Checkout code diff --git a/erasure/_CoqProject.in b/erasure/_CoqProject.in index 37d9b3020..9240b90d9 100644 --- a/erasure/_CoqProject.in +++ b/erasure/_CoqProject.in @@ -11,6 +11,7 @@ theories/ECSubst.v theories/EWcbvEval.v # theories/EWtAst.v theories/EGlobalEnv.v +theories/EGenericMapEnv.v theories/EWellformed.v theories/EEnvMap.v theories/EWcbvEvalInd.v @@ -32,4 +33,5 @@ theories/EProgram.v theories/ERemoveParams.v theories/EInlineProjections.v theories/ETransform.v +theories/EConstructorsAsBlocks.v theories/Erasure.v diff --git a/erasure/theories/EAst.v b/erasure/theories/EAst.v index b0c8bbd72..16bf3e1a7 100644 --- a/erasure/theories/EAst.v +++ b/erasure/theories/EAst.v @@ -33,7 +33,7 @@ Inductive term : Set := | tLetIn : name -> term (* the term *) -> term -> term | tApp : term -> term -> term | tConst : kername -> term -| tConstruct : inductive -> nat -> term +| tConstruct : inductive -> nat -> list term -> term | tCase : (inductive * nat) (* # of parameters *) -> term (* discriminee *) -> list (list name * term) (* branches *) -> term | tProj : projection -> term -> term diff --git a/erasure/theories/EAstUtils.v b/erasure/theories/EAstUtils.v index 6db80c98d..53c531708 100644 --- a/erasure/theories/EAstUtils.v +++ b/erasure/theories/EAstUtils.v @@ -283,7 +283,7 @@ Definition isCoFix t := Definition isConstruct t := match t with - | tConstruct _ _ => true + | tConstruct _ _ _ => true | _ => false end. @@ -328,6 +328,8 @@ Definition string_of_def {A : Set} (f : A -> string) (def : def A) := "(" ^ string_of_name (dname def) ^ "," ^ f (dbody def) ^ "," ^ string_of_nat (rarg def) ^ ")". +Definition maybe_string_of_list {A} f (l : list A) := match l with [] => "" | _ => string_of_list f l end. + Fixpoint string_of_term (t : term) : string := match t with | tBox => "∎" @@ -338,7 +340,7 @@ Fixpoint string_of_term (t : term) : string := | tLetIn na b t => "LetIn(" ^ string_of_name na ^ "," ^ string_of_term b ^ "," ^ string_of_term t ^ ")" | tApp f l => "App(" ^ string_of_term f ^ "," ^ string_of_term l ^ ")" | tConst c => "Const(" ^ string_of_kername c ^ ")" - | tConstruct i n => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ ")" + | tConstruct i n args => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ maybe_string_of_list string_of_term args ^ ")" | tCase (ind, i) t brs => "Case(" ^ string_of_inductive ind ^ "," ^ string_of_nat i ^ "," ^ string_of_term t ^ "," ^ string_of_list (fun b => string_of_term (snd b)) brs ^ ")" @@ -354,8 +356,10 @@ Fixpoint string_of_term (t : term) : string := Fixpoint term_global_deps (t : EAst.term) := match t with - | EAst.tConst kn - | EAst.tConstruct {| inductive_mind := kn |} _ => KernameSet.singleton kn + | EAst.tConst kn => KernameSet.singleton kn + | EAst.tConstruct {| inductive_mind := kn |} _ args => + List.fold_left (fun acc x => KernameSet.union (term_global_deps x) acc) args + (KernameSet.singleton kn) | EAst.tLambda _ x => term_global_deps x | EAst.tApp x y | EAst.tLetIn _ x y => KernameSet.union (term_global_deps x) (term_global_deps y) diff --git a/erasure/theories/ECSubst.v b/erasure/theories/ECSubst.v index 7edceca5d..65a0695d3 100644 --- a/erasure/theories/ECSubst.v +++ b/erasure/theories/ECSubst.v @@ -36,6 +36,7 @@ Fixpoint csubst t k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (csubst t k')) mfix in tCoFix mfix' idx + | tConstruct ind n args => tConstruct ind n (map (csubst t k) args) | x => x end. @@ -57,7 +58,7 @@ Proof. destruct (nth_error_spec [t] (n - k) ). simpl in l0; lia. now rewrite Nat.sub_1_r. - + now destruct (Nat.leb_spec k n); try lia. + + now destruct (Nat.leb_spec k n); try lia. Qed. Lemma substl_subst s u : forallb (closedn 0) s -> diff --git a/erasure/theories/EConstructorsAsBlocks.v b/erasure/theories/EConstructorsAsBlocks.v new file mode 100644 index 000000000..f85a3083b --- /dev/null +++ b/erasure/theories/EConstructorsAsBlocks.v @@ -0,0 +1,1004 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import Utf8 Program. +From MetaCoq.Template Require Import config utils Kernames BasicAst EnvMap. +From MetaCoq.Erasure Require Import EAst EAstUtils EInduction EArities + ELiftSubst ESpineView EGlobalEnv EWellformed EEnvMap + EWcbvEval EEtaExpanded ECSubst EWcbvEvalEtaInd EProgram. + +Local Open Scope string_scope. +Set Asymmetric Patterns. +Import MCMonadNotation. + +From Equations Require Import Equations. +Set Equations Transparent. +Local Set Keyed Unification. +From Coq Require Import ssreflect ssrbool. + +(** We assume [Prop size x < size y) := + | e with TermSpineView.view e := { + | tRel i => EAst.tRel i + | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => transform_blocks x)) + | tLambda na M => EAst.tLambda na (transform_blocks M) + | tApp u v napp nnil with construct_viewc u := + { | view_construct ind i block_args with lookup_constructor_pars_args Σ ind i := { + | Some (npars, nargs) => + let args := map_InP v (fun x H => transform_blocks x) in + let '(args, rest) := MCList.chop nargs args in + EAst.mkApps (EAst.tConstruct ind i args) rest + | None => + let args := map_InP v (fun x H => transform_blocks x) in + EAst.tConstruct ind i args } + | view_other _ _ => mkApps (transform_blocks u) (map_InP v (fun x H => transform_blocks x)) } + + | tLetIn na b b' => EAst.tLetIn na (transform_blocks b) (transform_blocks b') + | tCase ind c brs => + let brs' := map_InP brs (fun x H => (x.1, transform_blocks x.2)) in + EAst.tCase (ind.1, 0) (transform_blocks c) brs' + | tProj p c => EAst.tProj {| proj_ind := p.(proj_ind); proj_npars := 0; proj_arg := p.(proj_arg) |} (transform_blocks c) + | tFix mfix idx => + let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in + EAst.tFix mfix' idx + | tCoFix mfix idx => + let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in + EAst.tCoFix mfix' idx + | tBox => EAst.tBox + | tVar n => EAst.tVar n + | tConst n => EAst.tConst n + | tConstruct ind i block_args => EAst.tConstruct ind i [] }. + Proof. + all:try lia. + all:try apply (In_size); tea. + all:try lia. + - now apply (In_size id size). + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + rewrite size_mkApps. cbn. lia. + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + rewrite size_mkApps. cbn. lia. + - now eapply size_mkApps_f. + - change (fun x => size (id x)) with size in H. + eapply (In_size id size) in H. unfold id in H. + change (fun x => size x) with size in H. + pose proof (size_mkApps_l napp nnil). lia. + - eapply (In_size snd size) in H. cbn in *. lia. + Qed. + + End Def. + + Hint Rewrite @map_InP_spec : transform_blocks. + + Arguments eqb : simpl never. + + Opaque transform_blocks_unfold_clause_1. + Opaque transform_blocks. + Opaque isEtaExp. + Opaque isEtaExp_unfold_clause_1. + + + Lemma chop_firstn_skipn {A} n (l : list A) : chop n l = (firstn n l, skipn n l). + Proof using Type. + induction n in l |- *; destruct l; simpl; auto. + now rewrite IHn skipn_S. + Qed. + + Lemma chop_eq {A} n (l : list A) l1 l2 : chop n l = (l1, l2) -> l = l1 ++ l2. + Proof. + rewrite chop_firstn_skipn. intros [= <- <-]. + now rewrite firstn_skipn. + Qed. + + Lemma closed_transform_blocks t k : closedn k t -> closedn k (transform_blocks t). + Proof using Type. + funelim (transform_blocks t); simp transform_blocks; rewrite <-?transform_blocks_equation_1; toAll; simpl; + intros; try easy; + rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; + unfold test_def in *; + simpl closed in *; + try solve [simpl; subst; simpl closed; f_equal; auto; rtoProp; solve_all; solve_all]; try easy. + - rewrite !closedn_mkApps in H1 *. + rtoProp; intuition auto. solve_all. + - destruct (chop nargs v) eqn:E. + erewrite chop_map; eauto. + eapply chop_eq in E as ->. + rewrite !closedn_mkApps in H0 *. + rtoProp; intuition auto; cbn; solve_all; eapply All_app in H1; + repeat solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. + repeat solve_all. + Qed. + + Hint Rewrite @forallb_InP_spec : isEtaExp. + Transparent isEtaExp_unfold_clause_1. + + Transparent transform_blocks_unfold_clause_1. + + Local Lemma transform_blocks_mkApps f v : + ~~ isApp f -> + transform_blocks (mkApps f v) = match construct_viewc f with + | view_construct ind i block_args => + match lookup_constructor_pars_args Σ ind i with + | Some (npars, nargs) => + let args := map transform_blocks v in + let '(args, rest) := MCList.chop nargs args in + EAst.mkApps (EAst.tConstruct ind i args) rest + | None => + let args := map transform_blocks v in + EAst.tConstruct ind i args + end + | view_other _ _ => mkApps (transform_blocks f) (map transform_blocks v) + end. + Proof using Type. + intros napp; simp transform_blocks. + destruct (construct_viewc f) eqn:vc. + - destruct lookup_constructor_pars_args as [[]|] eqn:heq. + destruct v eqn:hargs. cbn. + * destruct n1 => //. + * set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /=. rewrite heq /=. now simp transform_blocks. + * destruct v eqn:hargs => //. + set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /=. rewrite heq /=. now simp transform_blocks. + - destruct v eqn:hargs => //. + simp transform_blocks. + set (v' := TermSpineView.view _). + destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. + rewrite eq /= vc /=. now simp transform_blocks. + Qed. + + Lemma transform_blocks_decompose f : + transform_blocks f = + let (fn, args) := decompose_app f in + match construct_viewc fn with + | view_construct kn c _ => + match lookup_constructor_pars_args Σ kn c with + | Some (npars, nargs) => + let args := map (transform_blocks) args in + let '(args, rest) := MCList.chop nargs args in + mkApps (tConstruct kn c args) rest + | None => + let args := map transform_blocks args in + tConstruct kn c args + end + | view_other fn nconstr => + mkApps (transform_blocks fn) (map transform_blocks args) + end. + Proof. + destruct (decompose_app f) eqn:da. + rewrite (decompose_app_inv da). rewrite transform_blocks_mkApps. + now eapply decompose_app_notApp. + destruct construct_viewc; try reflexivity. + Qed. + + Lemma transform_blocks_mkApps_eta (P : term -> Prop) fn args : + (* wf_glob Σ -> + *)~~ EAst.isApp fn -> + isEtaExp Σ (mkApps fn args) -> + (match construct_viewc fn with + | view_construct kn c block_args => + forall pars nargs, + lookup_constructor_pars_args Σ kn c = Some (pars, nargs) -> + let cargs := map transform_blocks args in + let '(cargs, rest) := MCList.chop nargs cargs in + P (mkApps (tConstruct kn c cargs) rest) + | view_other fn nconstr => + P (mkApps (transform_blocks fn) (map transform_blocks args)) + end) -> + P (transform_blocks (mkApps fn args)). + Proof. + intros napp. + move/isEtaExp_mkApps. + rewrite decompose_app_mkApps //. + destruct construct_viewc eqn:vc. + + rewrite /isEtaExp_app. + destruct lookup_constructor_pars_args as [[]|] eqn:hl. + rewrite transform_blocks_decompose decompose_app_mkApps // /= hl. + move=> /andP[] /andP[] /Nat.leb_le hargs etaargs bargs. + destruct block_args; invs bargs. + move/(_ _ _ eq_refl). + destruct chop eqn:eqch => //. + move => /andP[] => //. + + intros ht. rewrite transform_blocks_mkApps // vc //. + Qed. + + Lemma transform_blocks_mkApps_eta_fn f args : isEtaExp Σ f -> + transform_blocks (mkApps f args) = mkApps (transform_blocks f) (map (transform_blocks) args). + Proof. + intros ef. + destruct (decompose_app f) eqn:df. + rewrite (decompose_app_inv df) in ef |- *. + rewrite -mkApps_app. + move/isEtaExp_mkApps: ef. + pose proof (decompose_app_notApp _ _ _ df). + rewrite decompose_app_mkApps /= //. + rewrite transform_blocks_decompose. + rewrite decompose_app_mkApps /= //. + destruct (construct_viewc t) eqn:vc. + + move=> /andP[] etanl etal. + destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. + cbn. + rewrite chop_firstn_skipn. + rewrite transform_blocks_decompose. + rewrite decompose_app_mkApps // /= hl. + rewrite chop_firstn_skipn. + rewrite - mkApps_app. + move: etanl. rewrite /isEtaExp_app hl. + move => /andP[] /Nat.leb_le => hl' hall. + rewrite firstn_map. + rewrite firstn_app. + assert (args' - #|l| = 0) as -> by lia. + rewrite firstn_O // app_nil_r. f_equal. f_equal. + rewrite firstn_map //. rewrite map_app skipn_map. + rewrite skipn_app. len. + assert (args' - #|l| = 0) as -> by lia. + now rewrite skipn_0 -skipn_map. + move: etanl. rewrite /isEtaExp_app hl //. + + move => /andP[] etat etal. + rewrite (transform_blocks_decompose (mkApps t l)). + rewrite decompose_app_mkApps //. + rewrite vc. rewrite -mkApps_app. f_equal. + now rewrite map_app. + Qed. + + Lemma transform_blocks_csubst a k b : + closed a -> + isEtaExp Σ a -> + isEtaExp Σ b -> + transform_blocks (ECSubst.csubst a k b) = ECSubst.csubst (transform_blocks a) k (transform_blocks b). + Proof using Type. + intros cla etaa. move b at bottom. + funelim (transform_blocks b); cbn; simp transform_blocks isEtaExp; rewrite -?isEtaExp_equation_1 -?transform_blocks_equation_1; toAll; simpl; + intros; try easy; + rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; + unfold test_def in *; + simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. + + - destruct Nat.compare => //. + - f_equal. solve_all. move/andP: b => [] _ he. solve_all. + - rewrite csubst_mkApps. + rtoProp. solve_all. + assert ( + mkApps (transform_blocks u) (map transform_blocks v) = + transform_blocks (mkApps u v) + ) as ->. { rewrite transform_blocks_mkApps. eauto. now rewrite Heq. } + eapply (transform_blocks_mkApps_eta (fun x => transform_blocks (mkApps (csubst a k u) (map (csubst a k) v)) = + csubst (transform_blocks a) k x)); eauto. + rewrite Heq. + rewrite csubst_mkApps. + rewrite isEtaExp_mkApps_napp in H1 => //. rewrite Heq in H1. + rtoProp. rename H1 into etau. rename H2 into etav. + rewrite - H //. + rewrite transform_blocks_mkApps_eta_fn. + now eapply etaExp_csubst. + f_equal. + rewrite !map_map_compose. solve_all. + - assert (H1 := etaExp_csubst _ _ k _ etaa H0). + rewrite !csubst_mkApps /= in H1 *. + assert (map (csubst a k) v <> []). + { destruct v; cbn; congruence. } + rewrite transform_blocks_mkApps //. + rewrite isEtaExp_Constructor // in H1. + move: H1 => /andP[] /andP[]. rewrite map_length. move=> etaapp etav bargs. + destruct block_args; invs bargs. + cbn -[lookup_constructor_pars_args]. + unfold isEtaExp_app in etaapp. + rewrite Heq in etaapp |- *. + destruct (chop nargs v) eqn:heqc. + rewrite map_map_compose. + erewrite !chop_map; eauto. + rewrite csubst_mkApps. cbn. + eapply chop_eq in heqc as ->. + cbn. + rewrite isEtaExp_Constructor in H0. + move: H0 => /andP[] /andP[] He1 He2 He3. + cbn. f_equal. f_equal. + all: rewrite !map_map_compose; solve_all; eapply All_app in He2. + all: repeat solve_all. + - assert (H1 := etaExp_csubst _ _ k _ etaa H0). + rewrite !csubst_mkApps /= in H1 *. + assert (map (csubst a k) v <> []). + { destruct v; cbn; congruence. } + rewrite transform_blocks_mkApps //. + rewrite isEtaExp_Constructor // in H1. + move/andP : H1 => [] /andP[]. rewrite map_length. move=> etaapp etav bargs. + cbn -[lookup_inductive_pars]. + unfold isEtaExp_app in etaapp. + destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => //. + Qed. + + Lemma transform_blocks_substl s t : + forallb (closedn 0) s -> + forallb (isEtaExp Σ) s -> + isEtaExp Σ t -> + transform_blocks (substl s t) = substl (map transform_blocks s) (transform_blocks t). + Proof using Type. + induction s in t |- *; simpl; auto. + move=> /andP[] cla cls /andP[] etaa etas etat. + rewrite IHs //. now eapply etaExp_csubst. f_equal. + now rewrite transform_blocks_csubst. + Qed. + + Lemma transform_blocks_iota_red pars args br : + forallb (closedn 0) args -> + forallb (isEtaExp Σ) args -> + isEtaExp Σ br.2 -> + transform_blocks (EGlobalEnv.iota_red pars args br) = EGlobalEnv.iota_red pars (map transform_blocks args) (on_snd transform_blocks br). + Proof using Type. + intros cl etaargs etabr. + unfold EGlobalEnv.iota_red. + rewrite transform_blocks_substl //. + rewrite forallb_rev forallb_skipn //. + rewrite forallb_rev forallb_skipn //. + now rewrite map_rev map_skipn. + Qed. + + Lemma transform_blocks_fix_subst mfix : EGlobalEnv.fix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.fix_subst mfix). + Proof using Type. + unfold EGlobalEnv.fix_subst. + rewrite map_length. + generalize #|mfix|. + induction n; simpl; auto. + f_equal; auto. now simp transform_blocks. + Qed. + + Lemma transform_blocks_cofix_subst mfix : EGlobalEnv.cofix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.cofix_subst mfix). + Proof using Type. + unfold EGlobalEnv.cofix_subst. + rewrite map_length. + generalize #|mfix|. + induction n; simpl; auto. + f_equal; auto. now simp transform_blocks. + Qed. + + Lemma transform_blocks_cunfold_fix mfix idx n f : + forallb (closedn 0) (fix_subst mfix) -> + forallb (fun d => isLambda (dbody d) && isEtaExp Σ (dbody d)) mfix -> + cunfold_fix mfix idx = Some (n, f) -> + cunfold_fix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). + Proof using Type. + intros hfix heta. + unfold cunfold_fix. + rewrite nth_error_map. + destruct nth_error eqn:heq. + intros [= <- <-] => /=. f_equal. f_equal. + rewrite transform_blocks_substl //. + now apply isEtaExp_fix_subst. + solve_all. eapply nth_error_all in heta; tea. cbn in heta. + rtoProp; intuition auto. + f_equal. f_equal. apply transform_blocks_fix_subst. + discriminate. + Qed. + + + Lemma transform_blocks_cunfold_cofix mfix idx n f : + forallb (closedn 0) (cofix_subst mfix) -> + forallb (isEtaExp Σ ∘ dbody) mfix -> + cunfold_cofix mfix idx = Some (n, f) -> + cunfold_cofix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). + Proof using Type. + intros hcofix heta. + unfold cunfold_cofix. + rewrite nth_error_map. + destruct nth_error eqn:heq. + intros [= <- <-] => /=. f_equal. + rewrite transform_blocks_substl //. + now apply isEtaExp_cofix_subst. + solve_all. now eapply nth_error_all in heta; tea. + f_equal. f_equal. apply transform_blocks_cofix_subst. + discriminate. + Qed. + + Lemma transform_blocks_nth {n l d} : + transform_blocks (nth n l d) = nth n (map transform_blocks l) (transform_blocks d). + Proof using Type. + induction l in n |- *; destruct n; simpl; auto. + Qed. + + Definition switch_constructor_as_block fl : WcbvFlags := + EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) fl.(@with_guarded_fix) true. + +End transform_blocks. + +Definition transform_blocks_constant_decl Σ cb := + {| cst_body := option_map (transform_blocks Σ) cb.(cst_body) |}. + +Definition transform_blocks_decl Σ d := + match d with + | ConstantDecl cb => ConstantDecl (transform_blocks_constant_decl Σ cb) + | InductiveDecl idecl => d + end. + +Definition transform_blocks_env Σ := + map (on_snd (transform_blocks_decl Σ)) Σ. + +Definition transform_blocks_program (p : eprogram_env) := + (transform_blocks_env p.1, transform_blocks p.1 p.2). + +Definition term_flags := + {| + has_tBox := true; + has_tRel := true; + has_tVar := false; + has_tEvar := false; + has_tLambda := true; + has_tLetIn := true; + has_tApp := true; + has_tConst := true; + has_tConstruct := true; + has_tCase := true; + has_tProj := false; + has_tFix := true; + has_tCoFix := false + |}. + +Definition env_flags := + {| has_axioms := false; + has_cstr_params := false; + term_switches := term_flags ; + cstr_as_blocks := false + |}. + + +Definition env_flags_blocks := + {| has_axioms := false; + has_cstr_params := false; + term_switches := term_flags ; + cstr_as_blocks := true + |}. + + +Local Existing Instance env_flags. + +Lemma Qpreserves_wellformed Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. +Proof. + intros clΣ. + split. + - red. move=> n t. + destruct t; cbn; intuition auto; try solve [constructor; auto]. + eapply on_letin; rtoProp; intuition auto. + eapply on_app; rtoProp; intuition auto. + eapply on_case; rtoProp; intuition auto. solve_all. + eapply on_fix. solve_all. move/andP: H => [] _ ha. solve_all. + - red. intros kn decl. + move/(lookup_env_wellformed clΣ). + unfold wf_global_decl. destruct cst_body => //. + - red. move=> hasapp n t args. rewrite wellformed_mkApps //. + split; intros; rtoProp; intuition auto; solve_all. + - red. cbn => //. + (* move=> hascase n ci discr brs. simpl. + destruct lookup_inductive eqn:hl => /= //. + split; intros; rtoProp; intuition auto; solve_all. *) + - red. move=> hasproj n p discr. now cbn in hasproj. + - red. move=> t args clt cll. + eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. + - red. move=> n mfix idx. cbn. unfold wf_fix. + split; intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. + - red. move=> n mfix idx. cbn. + split; intros; rtoProp; intuition auto; solve_all. +Qed. + +Definition block_wcbv_flags := + {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := true |}. + +Local Hint Resolve wellformed_closed : core. + +Lemma wellformed_lookup_inductive_pars Σ kn mdecl : + wf_glob Σ -> + lookup_minductive Σ kn = Some mdecl -> mdecl.(ind_npars) = 0. +Proof. + induction 1; cbn => //. + case: eqb_spec => [|]. + - intros ->. destruct d => //. intros [= <-]. + cbn in H0. unfold wf_minductive in H0. + rtoProp. cbn in H0. now eapply eqb_eq in H0. + - intros _. eapply IHwf_glob. +Qed. + +Lemma wellformed_lookup_constructor_pars {Σ kn c mdecl idecl cdecl} : + wf_glob Σ -> + lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> mdecl.(ind_npars) = 0. +Proof. + intros wf. cbn -[lookup_minductive]. + destruct lookup_minductive eqn:hl => //. + do 2 destruct nth_error => //. + eapply wellformed_lookup_inductive_pars in hl => //. congruence. +Qed. + +Lemma lookup_constructor_pars_args_spec {Σ ind n mdecl idecl cdecl} : + wf_glob Σ -> + lookup_constructor Σ ind n = Some (mdecl, idecl, cdecl) -> + lookup_constructor_pars_args Σ ind n = Some (mdecl.(ind_npars), cdecl.(cstr_nargs)). +Proof. + cbn -[lookup_constructor] => wfΣ. + destruct lookup_constructor as [[[mdecl' idecl'] [pars args]]|] eqn:hl => //. + intros [= -> -> <-]. cbn. f_equal. +Qed. + +Lemma wellformed_lookup_constructor_pars_args {Σ ind n block_args} : + wf_glob Σ -> + wellformed Σ 0 (EAst.tConstruct ind n block_args) -> + ∑ args, lookup_constructor_pars_args Σ ind n = Some (0, args). +Proof. + intros wfΣ wf. cbn -[lookup_constructor] in wf. + destruct lookup_constructor as [[[mdecl idecl] cdecl]|] eqn:hl => //. + exists cdecl.(cstr_nargs). + pose proof (wellformed_lookup_constructor_pars wfΣ hl). + eapply lookup_constructor_pars_args_spec in hl => //. congruence. +Qed. + +Lemma constructor_isprop_pars_decl_params {Σ ind c b pars cdecl} : + wf_glob Σ -> + constructor_isprop_pars_decl Σ ind c = Some (b, pars, cdecl) -> pars = 0. +Proof. + intros hwf. + rewrite /constructor_isprop_pars_decl /lookup_constructor /lookup_inductive. + destruct lookup_minductive as [mdecl|] eqn:hl => /= //. + do 2 destruct nth_error => //. + eapply wellformed_lookup_inductive_pars in hl => //. congruence. +Qed. + +Lemma skipn_ge m {A} (l : list A) : + m >= length l -> skipn m l = []. +Proof. + induction l in m |- *. + - destruct m; reflexivity. + - cbn. destruct m; try lia. intros H. + eapply IHl. lia. +Qed. + +Lemma chop_all {A} (l : list A) m : + m >= length l -> chop m l = (l, nil). +Proof. + intros Hl. rewrite chop_firstn_skipn. + rewrite firstn_ge; try lia. rewrite skipn_ge; try lia. + eauto. +Qed. + +Lemma transform_blocks_tApp Σ t a (P : term -> Set) k : + wf_glob Σ -> + wellformed Σ k (tApp t a) -> + (let (fn, args) := decompose_app (tApp t a) in + match construct_viewc fn with + | view_construct kn c block_args => + match lookup_constructor_pars_args Σ kn c with + | Some (0, nargs) => + let cargs := map (transform_blocks Σ) args in + let '(cargs, rest) := MCList.chop nargs cargs in + (args <> [] /\ t = mkApps (tConstruct kn c block_args) (remove_last args) /\ a = last args a) -> + P (mkApps (tConstruct kn c cargs) rest) + | _ => True + end + | view_other fn nconstr => + P (tApp (transform_blocks Σ t) (transform_blocks Σ a)) + end) -> + P (transform_blocks Σ (tApp t a)). +Proof. + intros wfΣ wf. + rewrite (transform_blocks_decompose _ (tApp t a)). + destruct decompose_app eqn:da. + pose proof (decompose_app_notApp _ _ _ da). + pose proof (EInduction.decompose_app_app _ _ _ _ da). + destruct construct_viewc eqn:vc. + + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. + cbn in wf. + move: wf => /andP[]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. + destruct (wellformed_lookup_constructor_pars_args wfΣ wfc). + rewrite e. cbn. + destruct chop eqn:eqch => //. + intros. apply H1. intuition auto. + + pose proof (decompose_app_notApp _ _ _ da). + pose proof (EInduction.decompose_app_app _ _ _ _ da). + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. + rewrite Ha Ht. + rewrite transform_blocks_mkApps // vc. + rewrite {3} (remove_last_last l a) => //. + now rewrite map_app mkApps_app. +Qed. + +Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e block_args mdecl idecl cdecl : + with_constructor_as_block = false -> + lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> + eval Σ (mkApps (tConstruct kn c block_args) args) e -> + ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (eval Σ) args args' × block_args = [] × #|args| <= cstr_arity mdecl cdecl. +Proof. + intros hblock hlook. + revert e; induction args using rev_ind; intros e. + - intros ev. depelim ev. congruence. exists []=> //. invs i. destruct block_args; invs H0 => //. cbn. repeat split. econstructor. lia. + - intros ev. rewrite mkApps_app /= in ev. + depelim ev; try solve_discr. + destruct (IHargs _ ev1) as [? []]. solve_discr. + all:try specialize (IHargs _ ev1) as [? []]; try solve_discr; try noconf H. + * destruct p as (? & ? & ?). exists (x0 ++ [a']). split => //. + rewrite mkApps_app /= //. split => //. eapply All2_app; eauto. + split => //. eapply All2_length in a. len. rewrite e1 in hlook; invs hlook. lia. + * destruct p as (? & ? & ?). subst f'. + cbn in i. + rewrite isConstructApp_mkApps in i. cbn in i. + rewrite orb_true_r in i. cbn in i. congruence. + * now cbn in i. +Qed. + +Lemma transform_blocks_isConstructApp Σ t : + wf_glob Σ -> wellformed Σ 0 t -> + isConstructApp (transform_blocks Σ t) = isConstructApp t. +Proof. + intros Hwf Hwf'. + induction t; try now cbn; eauto. + eapply transform_blocks_tApp; eauto. + destruct decompose_app. + destruct construct_viewc. + - destruct lookup_constructor_pars_args as [ [[]] | ]; eauto. + cbn. destruct chop. intros (? & ? & ?). subst. + rewrite -[tApp _ _](mkApps_app _ _ [t2]). + rewrite !isConstructApp_mkApps. cbn. reflexivity. + - change (tApp t1 t2) with (mkApps t1 [t2]). + change (tApp (transform_blocks Σ t1) (transform_blocks Σ t2)) with + (mkApps (transform_blocks Σ t1) [transform_blocks Σ t2]). + rewrite !isConstructApp_mkApps. + eapply IHt1. cbn in Hwf'. rtoProp. intuition. +Qed. + +Lemma lookup_env_transform_blocks Σ kn : + lookup_env (transform_blocks_env Σ) kn = + option_map (transform_blocks_decl Σ) (lookup_env Σ kn). +Proof. + unfold transform_blocks_env. + induction Σ at 2 4; simpl; auto. + case: eqb_spec => //. +Qed. + +Lemma transform_blocks_declared_constant Σ c decl : + declared_constant Σ c decl -> declared_constant (transform_blocks_env Σ) c (transform_blocks_constant_decl Σ decl). +Proof. + intros H. red in H; red. + rewrite lookup_env_transform_blocks H //. +Qed. + +Lemma lookup_constructor_transform_blocks Σ ind c : +lookup_constructor (transform_blocks_env Σ) ind c = +lookup_constructor Σ ind c. +Proof. + unfold lookup_constructor, lookup_inductive, lookup_minductive in *. + rewrite lookup_env_transform_blocks. + destruct lookup_env as [ [] | ]; cbn; congruence. +Qed. + +Lemma transform_wellformed' Σ n t : + wf_glob Σ -> + @wellformed env_flags Σ n t -> + isEtaExp Σ t -> + @wellformed env_flags_blocks Σ n (transform_blocks Σ t). +Proof. + revert n. funelim (transform_blocks Σ t); simp_eta; cbn-[transform_blocks lookup_constructor_pars_args isEtaExp]; intros m Hwf Hw; rtoProp; try split; eauto. + all: rewrite ?map_InP_spec; toAll; eauto; try now solve_all. + - destruct H1. unfold isEtaExp_app in H1. unfold lookup_constructor_pars_args in *. + destruct (lookup_constructor Σ) as [[[]] | ]; try congruence; cbn - [transform_blocks]. + 2: eauto. split; auto. + - destruct H4. solve_all. + - unfold wf_fix in *. rtoProp. solve_all. len. solve_all. len. destruct x. + cbn -[transform_blocks isEtaExp] in *. rtoProp. eauto. + - rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. intros. + eapply isEtaExp_mkApps in H3. rewrite decompose_app_mkApps in H3; eauto. + destruct construct_viewc; eauto. cbn in d. eauto. + rtoProp. eauto. repeat solve_all. + - Opaque isEtaExp. destruct chop eqn:Ec. rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. + cbn -[lookup_constructor transform_blocks ] in *. intros. rtoProp. + rewrite isEtaExp_Constructor in H2. + rtoProp. unfold isEtaExp_app in *. unfold lookup_constructor_pars_args in H2. + repeat split; eauto; + rewrite ?lookup_constructor_transform_blocks; eauto. + * destruct lookup_constructor as [ [[]] | ] eqn:E; cbn -[transform_blocks] in *; eauto. + invs Heq. rewrite chop_firstn_skipn in Ec. invs Ec. + rewrite firstn_length. len. eapply Nat.leb_le in H2. eapply Nat.leb_le. + destruct lookup_env as [ [] | ] eqn:E'; try congruence. + eapply lookup_env_wellformed in E'; eauto. + cbn in E'. red in E'. unfold wf_minductive in E'. + rewrite andb_true_iff in E'. + cbn in E'. destruct E'. + eapply Nat.eqb_eq in H6. + destruct nth_error; invs E. + destruct nth_error; invs H9. + rewrite H6. lia. + * rewrite chop_firstn_skipn in Ec. invs Ec. + solve_all. eapply All_firstn. solve_all. + * rewrite chop_firstn_skipn in Ec. invs Ec. + solve_all. eapply All_skipn. solve_all. + - rewrite wellformed_mkApps in Hw; eauto. rtoProp. cbn in *. rtoProp. + cbn in *. destruct lookup_env as [[] | ]; cbn in *; eauto; try congruence. + - rewrite isEtaExp_Constructor in H0. rtoProp. unfold lookup_constructor_pars_args in *. + destruct lookup_constructor as [ [[]] | ]; cbn in Heq; try congruence. + cbn. split; eauto. rewrite wellformed_mkApps in Hw; eauto. rtoProp. solve_all. +Qed. + +From MetaCoq.Erasure Require Import EGenericMapEnv. + +Lemma transform_blocks_extends : + ∀ (Σ : global_context) (t : term) (n : nat), + wellformed Σ n t + → ∀ Σ' : global_context, + extends Σ Σ' + → wf_glob Σ' → transform_blocks Σ t = transform_blocks Σ' t. +Proof. + intros Σ t. + Opaque transform_blocks. + funelim (transform_blocks Σ t); cbn -[lookup_constant lookup_inductive + lookup_projection]; intros => //; simp transform_blocks; rewrite -?transform_blocks_equation_1. + all: try rewrite !map_InP_spec. + all: try toAll. + all: try f_equal. + all: rtoProp; solve_all. + - f_equal. eauto. solve_all. + - unfold wf_fix in *. rtoProp. f_equal. solve_all. + - rewrite wellformed_mkApps in H1 => //. rtoProp. + rewrite transform_blocks_mkApps; eauto. destruct construct_viewc; cbn in d; eauto. + f_equal. eapply H; eauto. solve_all. + - destruct chop eqn:E. + rewrite wellformed_mkApps in H0 => //. rewrite transform_blocks_mkApps => //. + rtoProp. cbn [construct_viewc]. unfold lookup_constructor_pars_args in *. + destruct (lookup_constructor Σ) as [ [[]] | ] eqn:E'; invs Heq. + erewrite extends_lookup_constructor; eauto. cbn. + destruct (chop (cstr_nargs c) (map (transform_blocks Σ') v) ) eqn:Ec. + rewrite !chop_firstn_skipn in E, Ec. invs E. invs Ec. + f_equal. f_equal. f_equal. solve_all. f_equal. solve_all. + - rewrite wellformed_mkApps in H0 => //. cbn -[lookup_constructor] in H0. rtoProp. + unfold lookup_constructor_pars_args in Heq. + destruct lookup_constructor as [ [[]] | ]; cbn in *; try congruence. +Qed. + +Lemma transform_wellformed Σ n t : + wf_glob Σ -> + @wellformed env_flags Σ n t -> + isEtaExp Σ t -> + @wellformed env_flags_blocks (transform_blocks_env Σ) n (transform_blocks Σ t). +Proof. + intros. eapply gen_transform_wellformed_irrel; eauto. + 2:{eapply transform_wellformed'; eauto. } + eapply transform_blocks_extends. +Qed. + +Lemma transform_wf_global Σ : + EEtaExpanded.isEtaExp_env Σ -> + @wf_glob env_flags Σ -> + @wf_glob env_flags_blocks (transform_blocks_env Σ). +Proof. + intros pre. + eapply gen_transform_env_wf => //. + 2:{ intros. eapply transform_wellformed'; eauto. eapply H1. } + { eapply transform_blocks_extends. } + + induction Σ as [ | ]; cbn in *; eauto. + rtoProp. destruct a. cbn in *. split; eauto. + destruct g; cbn in *; eauto. + unfold isEtaExp_constant_decl in H. + destruct (cst_body c); eauto. +Qed. + +Transparent transform_blocks. + +Lemma transform_blocks_eval (fl := EWcbvEval.target_wcbv_flags) : + forall Σ, isEtaExp_env Σ -> wf_glob Σ -> + forall t t', + wellformed Σ 0 t -> + isEtaExp Σ t -> + EWcbvEval.eval Σ t t' -> + @EWcbvEval.eval block_wcbv_flags (transform_blocks_env Σ) (transform_blocks Σ t) (transform_blocks Σ t'). +Proof. + intros Σ etaΣ wfΣ. + eapply + (EWcbvEvalEtaInd.eval_preserve_mkApps_ind fl eq_refl (efl := env_flags) Σ _ + (wellformed Σ) (Qpres := Qpreserves_wellformed _ wfΣ)) => //; eauto. + { intros. eapply EWcbvEval.eval_wellformed => //; tea. } + all:intros *. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. { cbn. rtoProp; eauto. } + destruct decompose_app as [fn args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[[] args']|] => // /=. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H0. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H4; try congruence. + eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + econstructor; tea. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. cbn. rtoProp; eauto. + destruct decompose_app as [fn args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[] |] => // /=. + destruct n0; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H0. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H5; try congruence. + eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + econstructor. + * revert e1. set (x := transform_blocks Σ f0). + simp transform_blocks. + * eauto. + * rewrite transform_blocks_csubst in e; eauto. + 1: now simp_eta in i10. + now rewrite - transform_blocks_equation_1. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + econstructor; eauto. + rewrite -transform_blocks_csubst; eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + cbn [plus]. + rewrite transform_blocks_mkApps in e0 => //. + assert (pars = 0) as -> by now (eapply constructor_isprop_pars_decl_params; eauto). + cbn [construct_viewc] in e0. + pose proof (Hcon := H2). + rewrite /constructor_isprop_pars_decl in H2. + destruct lookup_constructor as [[[]] | ] eqn:eqc; cbn in H2; invs H2. + rewrite -> lookup_constructor_pars_args_cstr_arity with (1 := eqc) in e0. + erewrite chop_all in e0. 2:len. + eapply eval_iota_block => //. + + cbn [fst]. eapply e0. + + unfold constructor_isprop_pars_decl. + rewrite lookup_constructor_transform_blocks. cbn [fst]. + rewrite eqc //= H8 //. + + now rewrite map_InP_spec nth_error_map H3; eauto. + + len. + + rewrite H9. len. + + rewrite wellformed_mkApps in i4 => //. + rewrite isEtaExp_Constructor in i6 => //. rtoProp. + rewrite -transform_blocks_iota_red. + * solve_all. + * solve_all. + * eapply forallb_nth_error in H. rewrite -> H3 in H => //. + * now rewrite H9. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp. eauto. eauto; cbn; rtoProp; eauto. + destruct decompose_app as [ f args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[] |] => // /=. + destruct n0; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. rewrite ha in H0. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in H0 as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. + * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H1. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H9; try congruence. + eapply eval_mkApps_Construct_inv in H0 as (args'' & Ha1 & Ha2 & -> & ?); eauto. + solve_discr. + + eapply eval_fix'. + * eauto. + * revert e1. set (x := transform_blocks Σ f5). + simp transform_blocks. + * rewrite map_InP_spec. + cbn in i8. unfold wf_fix in i8. rtoProp. + erewrite <- transform_blocks_cunfold_fix => //. + all: eauto. + eapply closed_fix_subst. solve_all. destruct x; cbn in H5 |- *. eauto. + simp_eta in i10. + * eauto. + * revert e. + eapply transform_blocks_tApp => //. + -- cbn. rtoProp. split; eauto. eapply wellformed_cunfold_fix; eauto. + -- destruct (decompose_app (tApp fn av)) eqn:E; eauto. + destruct (construct_viewc t0) eqn:E1; eauto. + destruct (lookup_constructor_pars_args Σ ind n) as [ [[ ]] | ] eqn:E2; eauto. + cbn zeta. destruct chop eqn:E3. intros (? & ? & ?). + subst. rewrite -> H7 in *. intros He. + eapply eval_mkApps_Construct_block_inv in He as (? & ? & ? & ?); eauto. subst. + rewrite -[tApp _ _](mkApps_app _ _ [last l av]) in i1. + rewrite H7 - remove_last_last in i1 => //. + rewrite isEtaExp_Constructor in i1. rtoProp. + rewrite isEtaExp_Constructor in H3. rtoProp. + unfold isEtaExp_app in *. + rewrite E2 in H3, H5. + eapply leb_complete in H3, H5. + exfalso. + enough (n0 >= #|l|). + { destruct l; try congruence. rewrite remove_last_length in H3. cbn in H5, H3, H13. lia. } + destruct (chop n0 l) eqn:Ec. + erewrite chop_map in E3 => //. 2: eauto. + inversion E3. subst. destruct l2; invs H15. + rewrite chop_firstn_skipn in Ec. invs Ec. + eapply PCUICSR.skipn_nil_length in H15. lia. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + rewrite map_InP_spec. cbn [plus]. + eapply eval_wellformed in H2; eauto. + rewrite wellformed_mkApps in H2; eauto. + rtoProp. now cbn in H2. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + econstructor. + eapply transform_blocks_declared_constant; eauto. + destruct decl. cbn in *. now rewrite H0. + eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. + destruct decompose_app as [ f args] eqn:heq. + destruct construct_viewc eqn:heqv. + + destruct lookup_constructor_pars_args as [[npars args']|] eqn:hl => // /=. + destruct npars; eauto. + destruct chop eqn:eqch. + intros [Hl [ha ht]]. pose proof ev as Hev. rewrite ha in Hev. + destruct with_constructor_as_block eqn:E. + * eapply eval_mkApps_Construct_block_inv in Hev as (args'' & Ha1 & Ha2 & Ha3); eauto. subst. + destruct args as [ | []]; cbn in *; congruence. + * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H. + rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H6; try congruence. + eapply eval_mkApps_Construct_inv in Hev as (args'' & Ha1 & Ha2 & -> & ?); eauto. subst. + rewrite isConstructApp_mkApps in H1. rewrite orb_true_r in H1 => //. + + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. + destruct (decompose_app (tApp f' a')). destruct (construct_viewc t0). + * destruct lookup_constructor_pars_args as [ [[]] | ] eqn:hpa; eauto. + cbn [plus]. destruct chop eqn:heqch. + intros [hl [ht ha]]. rewrite ht in H1. rewrite isConstructApp_mkApps orb_true_r in H1 => //. + * eapply eval_app_cong; eauto. + revert H1. + destruct f'; try now cbn; tauto. + intros H. cbn in H. + rewrite transform_blocks_isConstructApp; eauto. + destruct (isConstructApp (tApp f'1 f'2)). + -- cbn in H. congruence. + -- eapply transform_blocks_tApp; eauto. clear. + destruct decompose_app. + destruct construct_viewc; try now cbn; eauto. + destruct lookup_constructor_pars_args as [[[]] | ]; eauto. + cbn. destruct chop. cbn. intros. + destruct l1 using rev_case; cbn; eauto. + rewrite mkApps_app; cbn; eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + simp transform_blocks. rewrite -!transform_blocks_equation_1. + rewrite !transform_blocks_mkApps => //. + cbn [construct_viewc]. + erewrite lookup_constructor_pars_args_cstr_arity; eauto. + destruct (chop (cstr_nargs cdecl) args) eqn:E1. + destruct (chop (cstr_nargs cdecl) args') eqn:E2. + erewrite !chop_map; eauto. + specialize H as Heq. + unfold lookup_constructor, lookup_inductive, lookup_minductive in Heq. + destruct lookup_env eqn:E; try now inv Heq. + eapply lookup_env_wellformed in E; eauto. + destruct g; cbn in Heq; try now inv Heq. + cbn in E. + destruct nth_error; try now inv Heq. + destruct nth_error; invs Heq. + rewrite /wf_minductive in E. rtoProp. + cbn in H4. eapply eqb_eq in H4. + unfold cstr_arity in H0. + rewrite -> H4 in *. cbn in H0. + revert E1 E2. + rewrite <- H0. + rewrite !chop_firstn_skipn !firstn_all. intros [= <- <-] [= <- <-]. + eapply All2_length in X0 as Hlen. + cbn. + rewrite !skipn_all Hlen skipn_all firstn_all. cbn. + eapply eval_mkApps_Construct_block; tea. eauto. + now rewrite lookup_constructor_transform_blocks. + constructor. cbn [atom]. now rewrite lookup_constructor_transform_blocks H. + len. unfold cstr_arity. lia. + solve_all. destruct H6; eauto. + - intros. econstructor. destruct t; try solve [cbn in H, H0 |- *; try congruence]. + cbn -[lookup_constructor] in H |- *. destruct l => //. now rewrite lookup_constructor_transform_blocks H. +Qed. diff --git a/erasure/theories/EDeps.v b/erasure/theories/EDeps.v index 1b72d5c12..90399e1a8 100644 --- a/erasure/theories/EDeps.v +++ b/erasure/theories/EDeps.v @@ -57,6 +57,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -105,6 +107,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -160,6 +164,8 @@ Proof. now constructor. - depelim er. now constructor. + - depelim er. + cbn. econstructor; eauto. - depelim er. econstructor; [easy|easy|easy|easy|easy|]. induction X; [easy|]. @@ -253,7 +259,7 @@ Qed. Notation "Σ ⊢ s ▷ t" := (eval Σ s t) (at level 50, s, t at next level) : type_scope. -Lemma erases_deps_eval {wfl:WcbvFlags} Σ t v Σ' : +Lemma erases_deps_eval {wfl:WcbvFlags} {hcon : with_constructor_as_block = false} Σ t v Σ' : Σ' ⊢ t ▷ v -> erases_deps Σ Σ' t -> erases_deps Σ Σ' v. @@ -275,8 +281,9 @@ Proof. + intuition auto. apply erases_deps_mkApps_inv in H4. now apply Forall_rev, Forall_skipn. - + eapply nth_error_forall in e0; [|now eauto]. + + eapply nth_error_forall in e1; [|now eauto]. assumption. + - congruence. - depelim er. subst brs; cbn in *. depelim H3. @@ -326,10 +333,12 @@ Proof. intuition auto. apply erases_deps_mkApps_inv in H3 as (? & ?). apply IHev2. - now eapply nth_error_forall in e1. + now eapply nth_error_forall in e2. + - congruence. - constructor. - depelim er. now constructor. + - congruence. - depelim er. now constructor. - easy. Qed. @@ -367,7 +376,7 @@ Lemma erases_deps_forall_ind Σ Σ' declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_one_inductive_body idecl idecl' -> erases_mutual_inductive_body mdecl mdecl' -> - P (Extract.E.tConstruct ind c)) + P (Extract.E.tConstruct ind c [])) (Hcase : forall (p : inductive × nat) mdecl idecl mdecl' idecl' (discr : Extract.E.term) (brs : list (list name × Extract.E.term)), PCUICAst.declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> diff --git a/erasure/theories/EEtaExpanded.v b/erasure/theories/EEtaExpanded.v index f43c00455..42b442e59 100644 --- a/erasure/theories/EEtaExpanded.v +++ b/erasure/theories/EEtaExpanded.v @@ -26,15 +26,15 @@ Hint Constructors eval : core. Import MCList (map_InP, map_InP_elim, map_InP_spec). Equations discr_construct (t : term) : Prop := -discr_construct (tConstruct ind n) := False ; +discr_construct (tConstruct ind n block_args) := False ; discr_construct _ := True. Inductive construct_view : term -> Type := -| view_construct : forall ind n, construct_view (tConstruct ind n) +| view_construct : forall ind n block_args, construct_view (tConstruct ind n block_args) | view_other : forall t, discr_construct t -> construct_view t. Equations construct_viewc t : construct_view t := -construct_viewc (tConstruct ind n) := view_construct ind n ; +construct_viewc (tConstruct ind n block_args) := view_construct ind n block_args ; construct_viewc t := view_other t I. Ltac toAll := @@ -55,6 +55,8 @@ Section isEtaExp. Import TermSpineView. + Definition is_nil {A} (l : list A) := match l with [] => true | _ => false end. + Equations? isEtaExp (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := | e with TermSpineView.view e := { @@ -62,7 +64,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp x) | tLambda na M => isEtaExp M | tApp u v napp nnil with construct_viewc u := - { | view_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) + { | view_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) && is_nil block_args | view_other _ _ => isEtaExp u && forallb_InP v (fun x H => isEtaExp x) } | tLetIn na b b' => isEtaExp b && isEtaExp b' | tCase ind c brs => isEtaExp c && forallb_InP brs (fun x H => isEtaExp x.2) @@ -72,15 +74,16 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i => isEtaExp_app ind i 0 }. + | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. Proof. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - rewrite size_mkApps. - change (fun x => size (id x)) with size in H. cbn. - now apply (In_size id size). + eapply (In_size id size) in H. + change (fun x => size (id x)) with size in H. unfold id in *; cbn. + lia. - now eapply size_mkApps_f. - change (fun x => size (id x)) with size in H. eapply (In_size id size) in H. unfold id in H. @@ -102,7 +105,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v + | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -114,7 +117,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_napp f v : ~~ isApp f -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v + | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -124,8 +127,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor ind i v : - isEtaExp (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v. + Lemma isEtaExp_Constructor ind i v block_args : + isEtaExp (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args. Proof using Type. rewrite isEtaExp_mkApps_napp //. Qed. @@ -134,7 +137,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps f u : isEtaExp (mkApps f u) -> let (hd, args) := decompose_app (mkApps f u) in match construct_viewc hd with - | view_construct kn c => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args + | view_construct kn c block_args => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args | view_other u discr => isEtaExp hd && forallb isEtaExp args end. Proof using Type. @@ -143,7 +146,7 @@ Section isEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l. cbn -[isEtaExp]. intros eq; rewrite eq. - destruct (construct_viewc t) => //. simp isEtaExp in eq; now rewrite eq. + destruct (construct_viewc t) => //. simp isEtaExp in eq. rtoProp. solve_all. assert (t0 :: l <> []) by congruence. revert da H0. generalize (t0 :: l). clear t0 l; intros l. intros da nnil. @@ -179,9 +182,9 @@ Section isEtaExp. Lemma isEtaExp_tApp {f u} : isEtaExp (EAst.tApp f u) -> let (hd, args) := decompose_app (EAst.tApp f u) in match construct_viewc hd with - | view_construct kn c => + | view_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb isEtaExp args + isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args | view_other _ discr => [&& isEtaExp hd, forallb isEtaExp args, isEtaExp f & isEtaExp u] end. @@ -232,17 +235,19 @@ Section WeakEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l0. simp_eta. - rewrite isEtaExp_mkApps_napp //. - destruct construct_viewc. cbn. len. - rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. + destruct construct_viewc. cbn. len. + rtoProp; repeat solve_all. cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. - eapply All_app_inv; eauto. rewrite et forallb_app /=. + eapply All_app_inv; eauto. + cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. + rewrite et forallb_app /=. rtoProp; repeat solve_all. - rewrite isEtaExp_mkApps_napp in et => //. destruct construct_viewc. rewrite -mkApps_app. rewrite isEtaExp_Constructor. - cbn. cbn. rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. - depelim H1. solve_all. eapply All_app_inv => //. + rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. + solve_all. eapply All_app_inv => //. econstructor; eauto. eapply All_app_inv => //. eauto. rewrite -mkApps_app. rewrite isEtaExp_mkApps_napp //. destruct (construct_viewc t0) => //. @@ -259,6 +264,7 @@ Section WeakEtaExp. - intros. simp isEtaExp ; cbn. destruct Nat.compare => //. simp_eta in H. - move/andP: H2 => [] etab etab'. apply/andP. split; eauto. + - rtoProp. intuition eauto. now destruct block_args. - rtoProp. intuition eauto. solve_all. - move/andP: b => [] etaexp h. @@ -269,6 +275,7 @@ Section WeakEtaExp. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. rewrite map_length. rtoProp; solve_all. solve_all. + now destruct block_args. - rewrite csubst_mkApps /=. move/andP: H2 => [] eu ev. specialize (H _ k H1 eu). @@ -459,7 +466,7 @@ Inductive expanded : term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= cstr_arity mind cdecl -> Forall expanded args -> - expanded (mkApps (tConstruct ind idx) args) + expanded (mkApps (tConstruct ind idx []) args) | expanded_tBox : expanded tBox. End expanded. @@ -497,7 +504,7 @@ forall (Σ : global_declarations) (P : term -> Prop), (idecl : one_inductive_body) cdecl (args : list term), declared_constructor Σ (ind, idx) mind idecl cdecl -> - #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx) args)) -> + #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx []) args)) -> (P tBox) -> forall t : term, expanded Σ t -> P t. Proof. @@ -570,7 +577,8 @@ Proof. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + destruct block_args; inv H0. eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. @@ -581,9 +589,10 @@ Proof. intuition auto. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - eapply andb_true_iff in H0 as []. eapply In_All in H. - rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. + - rtoProp. eapply In_All in H. + rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). + destruct block_args; inv H1. eapply expanded_tConstruct_app; eauto. solve_all. - eapply andb_true_iff in H1 as []. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. econstructor. @@ -603,8 +612,8 @@ Proof. eauto). - eapply isEtaExp_mkApps_intro; eauto. solve_all. - solve_all. now rewrite b H. - - rewrite isEtaExp_Constructor. eapply andb_true_iff. - split. 2: eapply forallb_Forall. + - rewrite isEtaExp_Constructor. rtoProp; repeat split. + 2: eapply forallb_Forall. 2: solve_all. eapply expanded_isEtaExp_app_; eauto. Qed. @@ -668,8 +677,8 @@ Proof. eapply In_All in H0; solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. - rewrite EEtaExpanded.isEtaExp_Constructor. apply/andP; split. exact H1. - solve_all. + rewrite EEtaExpanded.isEtaExp_Constructor. rtoProp; repeat split. eauto. + solve_all. destruct block_args; cbn in *; eauto. - eapply In_All in H, H0. simp_eta. move => /andP[] /andP[] etafix etamfix etav. eapply EEtaExpanded.isEtaExp_mkApps_intro. simp_eta. diff --git a/erasure/theories/EEtaExpandedFix.v b/erasure/theories/EEtaExpandedFix.v index 6ec3fffb5..0e3a1cce9 100644 --- a/erasure/theories/EEtaExpandedFix.v +++ b/erasure/theories/EEtaExpandedFix.v @@ -58,7 +58,7 @@ Inductive expanded (Γ : list nat): term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= ind_npars mind + cdecl.(cstr_nargs) -> Forall (expanded Γ) args -> - expanded Γ (mkApps (tConstruct ind idx) args) + expanded Γ (mkApps (tConstruct ind idx []) args) | expanded_tBox : expanded Γ tBox. End expanded. @@ -135,7 +135,7 @@ Lemma expanded_ind : → #|args| ≥ ind_npars mind + cdecl.(cstr_nargs) → Forall (expanded Σ Γ) args → Forall (P Γ) args - → P Γ (mkApps (tConstruct ind idx) args)) + → P Γ (mkApps (tConstruct ind idx []) args)) → (∀ Γ : list nat, P Γ tBox) → ∀ (Γ : list nat) (t : term), expanded Σ Γ t → P Γ t. Proof. @@ -225,19 +225,19 @@ Proof. Qed. Equations discr_expanded_head (t : term) : Prop := - discr_expanded_head (tConstruct ind n) := False ; + discr_expanded_head (tConstruct ind n block_args) := False ; discr_expanded_head (tFix mfix idx) := False ; discr_expanded_head (tRel n) := False ; discr_expanded_head _ := True. Inductive expanded_head_view : term -> Type := -| expanded_head_construct : forall ind n, expanded_head_view (tConstruct ind n) +| expanded_head_construct : forall ind n block_args, expanded_head_view (tConstruct ind n block_args) | expanded_head_fix : forall mfix idx, expanded_head_view (tFix mfix idx) | expanded_head_rel : forall n, expanded_head_view (tRel n) | expanded_head_other : forall t, discr_expanded_head t -> expanded_head_view t. Equations expanded_head_viewc t : expanded_head_view t := - expanded_head_viewc (tConstruct ind n) := expanded_head_construct ind n ; + expanded_head_viewc (tConstruct ind n block_args) := expanded_head_construct ind n block_args; expanded_head_viewc (tFix mfix idx) := expanded_head_fix mfix idx ; expanded_head_viewc (tRel n) := expanded_head_rel n ; expanded_head_viewc t := expanded_head_other t I. @@ -266,6 +266,8 @@ Section isEtaExp. Import TermSpineView. + Definition is_nil {A} (l : list A) := match l with nil => true | _ => false end. + Equations? isEtaExp (Γ : list nat) (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := isEtaExp Γ e with TermSpineView.view e := { @@ -273,7 +275,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp Γ x) | tLambda na M => isEtaExp (0 :: Γ) M | tApp u v napp nnil with expanded_head_viewc u := - { | expanded_head_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) + { | expanded_head_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx (List.length v) && forallb_InP mfix (fun x H => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) && forallb_InP v (fun x H => isEtaExp Γ x) @@ -287,14 +289,15 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i => isEtaExp_app ind i 0 }. + | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. Proof using Σ. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - - rewrite size_mkApps. - now apply (In_size id size). + - rewrite size_mkApps. cbn. + apply (In_size id size) in H. + unfold id in H. change (fun x => size x) with size in H. lia. - rewrite size_mkApps. apply (In_size id (fun d => size d.(dbody))) in H. unfold id in H. change (fun x => size x) with size in H. cbn. lia. @@ -325,7 +328,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil Γ f v : ~~ isApp f -> v <> [] -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => option_default (fun m => m <=? List.length v) (nth_error Γ n) false && forallb (fun x => isEtaExp Γ x) v @@ -345,7 +348,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps Γ f v : ~~ isApp f -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v @@ -362,8 +365,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor Γ ind i v : - isEtaExp Γ (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v. + Lemma isEtaExp_Constructor Γ ind i block_args v : + isEtaExp Γ (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args. Proof. now rewrite isEtaExp_mkApps. Qed. @@ -380,7 +383,7 @@ Section isEtaExp. - rewrite isEtaExp_mkApps //. destruct expanded_head_viewc. + cbn. len. - rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. + rtoProp; repeat solve_all; cbn in et; rtoProp; eauto. rename H0 into et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. eapply All_app_inv; eauto. + cbn in *; congruence. @@ -393,9 +396,9 @@ Section isEtaExp. - rewrite isEtaExp_mkApps in et => //. destruct expanded_head_viewc. + rewrite -mkApps_app. rewrite isEtaExp_Constructor. - cbn. cbn. rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. - depelim H1. solve_all. eapply All_app_inv => //. + rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. + eapply All_app_inv => //. econstructor; eauto. eapply All_app_inv => //. eauto. + rewrite -mkApps_app. rewrite isEtaExp_mkApps //. simp expanded_head_viewc. rewrite /isEtaExp_fixapp in et |- *. @@ -439,8 +442,10 @@ Section isEtaExp. rewrite ?closedn_mkApps; rtoProp; (try toAll); repeat solve_all. - destruct nth_error eqn:Hn; cbn in H; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. + - destruct block_args; cbn in *; eauto. - eapply a in b. 2: f_equal. revert b. now len. - eapply a in b. 2: f_equal. revert b. now len. + - cbn. destruct block_args; cbn in *; eauto. - cbn. solve_all. rtoProp; intuition auto. eapply a in H0. 2: reflexivity. revert H0. now len. - destruct nth_error eqn:Hn; cbn in H1; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. @@ -466,6 +471,7 @@ Section isEtaExp. - move/andP: H2 => [] etab etab'. simp_eta. apply/andP. split; eauto. eapply H0 with (Γ := 0 :: Γ0); cbn; eauto. + - rtoProp. intuition eauto. destruct block_args; cbn in *; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a0; cbn; eauto. now len. cbn. now rewrite app_assoc. @@ -473,7 +479,7 @@ Section isEtaExp. - fold csubst. move/andP: H1 => [] etaexp h. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. - rewrite map_length. rtoProp; solve_all. solve_all. + rewrite map_length. rtoProp; solve_all. solve_all. destruct block_args; cbn in *; eauto. - rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -504,7 +510,7 @@ Section isEtaExp. Qed. Lemma etaExp_csubst a b n : - isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). + isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). Proof. intros. eapply etaExp_csubst' with (Γ := []); eauto. @@ -535,6 +541,7 @@ Section isEtaExp. apply/andP. split; eauto. eapply H; eauto. solve_all. eapply H0 with (Γ := 0 :: Γ0); eauto. solve_all. + - rtoProp. intuition eauto. destruct block_args; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a; cbn-[isEtaExp]; eauto. now len. cbn. now rewrite app_assoc. @@ -552,7 +559,7 @@ Section isEtaExp. eapply All_impl; tea; cbv beta. intros x Hx. eapply Hx; eauto. - solve_all. apply Hx. + solve_all. apply Hx. now destruct block_args. - solve_all. rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -730,7 +737,7 @@ Section isEtaExp. Lemma isEtaExp_tApp Γ f u : isEtaExp Γ (mkApps f u) -> let (hd, v) := decompose_app (mkApps f u) in match expanded_head_viewc hd with - | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v + | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => (option_default (fun m => m <=? List.length v) (nth_error Γ n) false) && forallb (fun x => isEtaExp Γ x) v @@ -788,16 +795,18 @@ Proof. - eapply expanded_tRel_app with (args := []). destruct (nth_error); invs H. f_equal. eapply Nat.eqb_eq in H1; eauto. cbn. lia. econstructor. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). + destruct block_args; cbn in *; eauto. eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply In_All in H0. solve_all. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - eapply andb_true_iff in H0 as []. eapply In_All in H. - rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. + - rtoProp. eapply In_All in H. + rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). + destruct block_args; cbn in *; eauto. eapply expanded_tConstruct_app; eauto. solve_all. - rtoProp. rewrite forallb_InP_spec in H2. rewrite forallb_InP_spec in H3. eapply In_All in H. eapply In_All in H0. unfold isEtaExp_fixapp in H1. destruct nth_error eqn:E; try congruence. @@ -830,9 +839,9 @@ Proof. + unfold isEtaExp_fixapp. rewrite H4. eapply Nat.ltb_lt. lia. + solve_all; rtoProp; intuition auto. + solve_all. - - rewrite isEtaExp_Constructor. eapply andb_true_iff. - split. 2: eapply forallb_Forall. - 2: solve_all. eapply expanded_isEtaExp_app_; eauto. + - rewrite isEtaExp_Constructor. rtoProp. repeat split. + 2: eapply forallb_Forall; solve_all. + eapply expanded_isEtaExp_app_; eauto. Qed. Definition isEtaExp_constant_decl Σ cb := @@ -871,9 +880,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_tApp' {Σ} {Γ} {f u} : isEtaExp Σ Γ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c => + | expanded_head_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args && is_nil block_args | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ isEtaExp_fixapp mfix idx #|args| && forallb (fun d => isLambda d.(dbody) && isEtaExp Σ (rev_map (fun d => 1 + d.(rarg)) mfix ++ Γ) d.(dbody)) mfix && forallb (isEtaExp Σ Γ) args @@ -1008,22 +1017,22 @@ Qed. Arguments lookup_inductive_pars_constructor_pars_args {Σ ind n pars args}. -Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {wcon : with_constructor_as_block = false} {Σ a a'} : isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ [] a -> isEtaExp Σ [] a'. Proof. intros etaΣ wfΣ. - induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs - | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | ] using eval_mkApps_rect. + induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs + | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | | | ] using eval_mkApps_rect; try now congruence. all:try simp isEtaExp; rewrite -!isEtaExp_equation_1 => //. 6:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] ise etal]]]. + * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. destruct block_args; cbn in *; eauto. pose proof (H' := H). - rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. + rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. pose proof (mkApps_app (EAst.tFix mfix idx) argsv [av]). cbn in H3. rewrite <- H3. clear H3. @@ -1064,8 +1073,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] ise etal]]]. clear IHs. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. + * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. clear IHs. destruct block_args; inv bargs. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. eapply IHeval3. @@ -1114,11 +1123,11 @@ Proof. 11:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] hl' etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - destruct (eval_construct_size H) as [args' []]. subst f'. - rewrite isConstructApp_mkApps /= in H1. - rewrite !negb_or in H1. rtoProp; intuition auto. now cbn in H3. + destruct (eval_construct_size wcon H) as [args' []]. subst f'. + rewrite isConstructApp_mkApps /= in i. + rewrite !negb_or in i. rtoProp; intuition auto. now cbn in H3. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. @@ -1127,7 +1136,7 @@ Proof. { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. - -- subst. rewrite isFixApp_mkApps in H1 => //. destruct EAst.isLambda; easy. + -- subst. rewrite isFixApp_mkApps in i => //. destruct EAst.isLambda; easy. -- eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. @@ -1135,7 +1144,7 @@ Proof. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. destruct nth_error; try easy. - invs H5. eapply Nat.ltb_lt. lia. + invs H4. eapply Nat.ltb_lt. lia. } { @@ -1145,7 +1154,7 @@ Proof. unshelve eapply H0. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H5. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. @@ -1153,7 +1162,7 @@ Proof. destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. } * intros (? & ? & ? & ?). rtoProp. solve_all. - rewrite nth_error_nil in H6. easy. + rewrite nth_error_nil in H5. easy. * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. } @@ -1161,64 +1170,65 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] hl' etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. rewrite -[EAst.tApp _ _](mkApps_app _ _ [a']). - rewrite isEtaExp_Constructor. - move: H0 H1. rewrite hf. intros H0 H1. - destruct (eval_mkApps_Construct_size H0) as [args'' [evc []]]. - eapply mkApps_eq_inj in e as [] => //. subst args''. noconf H3. + rewrite isEtaExp_Constructor. cbn. rewrite andb_true_r. + revert H H0. rewrite hf. intros H H0. + destruct (eval_mkApps_Construct_size wcon H) as [args'' [evc []]]. + eapply mkApps_eq_inj in e1 as [] => //. subst args''. noconf H2. apply/andP; split => //. - + len. - rewrite (remove_last_last l a) // in hl'. + + len. + rewrite (remove_last_last l0 a) // in hl'. rewrite app_length in hl'. cbn in hl'. now rewrite -(All2_length a0). + solve_all. - rewrite (remove_last_last l a) // in etal. + rewrite (remove_last_last l0 a) // in etal. eapply All_app in etal as [etal etaa]. depelim etaa. clear etaa. rewrite -ha in i. eapply All_app_inv; try constructor; eauto. - clear -H1 a0 etal. solve_all. - destruct b as [ev Hev]. eapply (H1 _ _ ev) => //. lia. + solve_all. + destruct b as [ev Hev]. eapply (H0 _ _ ev) => //. lia. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. assert (isEtaExp Σ [] a). { rewrite ha. eapply Forall_last; solve_all. } destruct with_guarded_fix eqn:guarded. - { specialize eval_mkApps_tFix_inv_size with (Heval := H0); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. + { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. -- subst. solve_discr. + -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. repeat split; solve_all. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. - destruct nth_error; try easy. noconf H6. + destruct nth_error; try easy. noconf H4. eapply Nat.ltb_lt. lia. } { - specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H0); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. + specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. -- cbn in *. solve_discr. -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. - unshelve eapply H1. 2: eauto. lia. + unshelve eapply H0. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H6. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. setoid_rewrite Heq in isel. eapply Forall_All in isel. invs isel. solve_all. subst; eauto. - destruct b0. unshelve eapply H1. 2: eauto. lia. eauto. + destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. } - * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H7. easy. - * move/and4P => [] etat etal etaf etaa. + * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H5. easy. + * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. } 1:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. + * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - eapply eval_mkApps_Construct_inv in H as [? []];solve_discr. + eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []];solve_discr. * solve_all. rtoProp. solve_all. subst. destruct with_guarded_fix eqn:guarded. @@ -1265,10 +1275,10 @@ Proof. eapply IHeval2. rewrite /iota_red. eapply isEtaExp_substl with (Γ := repeat 0 #|br.1|); eauto. { len. } - rewrite isEtaExp_Constructor // in H5. solve_all. - eapply All_skipn. move/andP: H5 => []. repeat solve_all. - eapply forallb_nth_error in H7; tea. - now erewrite H1 in H7. + rewrite isEtaExp_Constructor // in H1. solve_all. + eapply All_skipn. move/andP: H1 => []. repeat solve_all. rtoProp. solve_all. + eapply forallb_nth_error in H3; tea. + now erewrite e2 in H3. - rtoProp; intuition auto. eapply IHeval2. eapply isEtaExp_substl. shelve. now apply forallb_repeat. @@ -1278,9 +1288,9 @@ Proof. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. + * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. move: H H0. rewrite hf => H H0. - clear H0; eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + clear H0; eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []]; solve_discr. * solve_all. rtoProp. solve_all. subst. specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Heq'] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn_ & Hunf & Hav & Hsza & Hev & Hsz)]; eauto; try congruence. @@ -1327,9 +1337,9 @@ Proof. eapply IHeval2. specialize (IHeval1 hd). move: IHeval1. rewrite isEtaExp_Constructor. - destruct args => //. now rewrite nth_error_nil in H2. - move=> /andP[] _ hargs. - eapply nth_error_forallb in H2; tea. + destruct args => //. now rewrite nth_error_nil in e3. + intros. rtoProp. + eapply nth_error_forallb in e3; tea. Qed. Lemma isEtaExp_fixapp_mon {mfix idx n n'} : n <= n' -> isEtaExp_fixapp mfix idx n -> isEtaExp_fixapp mfix idx n'. @@ -1465,18 +1475,18 @@ Lemma neval_to_stuck_fix {efl : EEnvFlags} {Σ mfix idx t} : isEtaExp Σ [] t -> @eval opt_wcbv_flags Σ t (tFix mfix idx) -> False. Proof. intros etaΣ wfΣ he hev. - pose proof (eval_etaexp etaΣ wfΣ hev he). + unshelve epose proof (eval_etaexp etaΣ wfΣ hev he). eauto. now apply isEtaExp_tFix in H. Qed. -Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl Σ mfix idx t args} : +Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl} {wcon : with_constructor_as_block = false} {Σ mfix idx t args} : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> isEtaExp Σ [] t -> @eval fl Σ t (mkApps (tFix mfix idx) args) -> False. Proof. intros wguard etaΣ wfΣ he hev. - pose proof (eval_etaexp etaΣ wfΣ hev he). + unshelve epose proof (eval_etaexp etaΣ wfΣ hev he); eauto. move: H. move/isEtaExp_tApp. rewrite decompose_app_mkApps // /= // app_nil_r //. @@ -1491,13 +1501,14 @@ Qed. Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : with_guarded_fix -> + with_constructor_as_block = false -> @eval fl Σ f v -> isEtaExp Σ [] (tApp f u) -> - (forall kn c args, v <> mkApps (tConstruct kn c) args) -> + (forall kn c args block_args, v <> mkApps (tConstruct kn c block_args) args) -> (forall mfix idx args, v <> mkApps (tFix mfix idx) args) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c => False + | expanded_head_construct kn c _ => False | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ [&& isEtaExp_fixapp mfix idx #|remove_last args|, @@ -1508,14 +1519,14 @@ Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : [&& isEtaExp Σ [] hd, forallb (isEtaExp Σ []) args, isEtaExp Σ [] f & isEtaExp Σ [] u] end. Proof. - intros wguard ev eta; revert eta ev. + intros wguard wcon ev eta; revert eta ev. move/isEtaExp_tApp'. cbn -[decompose_app]. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:cv => //. - * move=> [] hl [] ha [] ht /andP[] etaap etal. + * move=> [] hl [] ha [] ht /andP[] /andP[] etaap etal bargs. destruct block_args; inv bargs. rewrite ha. intros h. eapply eval_mkApps_Construct_inv in h as [? []]. subst v. - intros Hc _. specialize (Hc ind n x). now apply Hc. + intros Hc _. specialize (Hc ind n x). now eapply Hc. auto. * move=> [] hl [] ha [] ht /andP[] /andP[] etafix etab etal. rewrite ha. intros H; eapply eval_stuck_fix_eq in H as [args' [Hargs' [[]|]]]. subst v. @@ -1608,12 +1619,12 @@ Proof. eapply eval_app_cong_tApp'. now eapply eval_to_value in evf''. exact e0. exact evres. Qed. -Lemma All_eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} Σ l l' : +Lemma All_eval_etaexp {fl : WcbvFlags} {wcon : with_constructor_as_block = false } {efl : EEnvFlags} Σ l l' : isEtaExp_env Σ -> wf_glob Σ -> All2 (eval Σ) l l' -> forallb (isEtaExp Σ []) l -> forallb (isEtaExp Σ []) l'. Proof. - intros; solve_all. now eapply eval_etaexp. + intros; solve_all. eapply eval_etaexp; eauto. Unshelve. eauto. Qed. Lemma isFix_mkApps f args : ~~ isFix f -> ~~ isFix (mkApps f args). @@ -1632,7 +1643,7 @@ Proof. intros h. now apply isFix_mkApps. Qed. -Lemma eval_opt_to_target {fl: WcbvFlags} {efl : EEnvFlags} Σ t v : +Lemma eval_opt_to_target {fl: WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} Σ t v : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> @@ -1643,7 +1654,7 @@ Proof. intros wguard etaΣ wfΣ. intros H. induction H using eval_mkApps_rect. - - move/(isEtaExp_tApp_eval wguard H) => IH. + - move/(isEtaExp_tApp_eval wguard wcon H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp a t)) eqn:da. @@ -1661,7 +1672,7 @@ Proof. forward IHeval2 => //. econstructor; eauto. - clear H0. - move/(isEtaExp_tApp_eval wguard H) => IH. + move/(isEtaExp_tApp_eval wguard wcon H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp f0 a)) eqn:da. @@ -1689,14 +1700,15 @@ Proof. eapply eval_etaexp in IHeval1; tea. - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. - move: (eval_etaexp etaΣ wfΣ IHeval1 etad). - rewrite isEtaExp_Constructor => /andP[] etac etaargs. + unshelve epose proof (eval_etaexp etaΣ wfΣ IHeval1 etad). eauto. + revert H1. + rewrite isEtaExp_Constructor => /andP[] /andP[] etac etaargs bargs. forward_keep IHeval2 => //. eapply isEtaExp_iota_red'; eauto. - eapply forallb_nth_error in etabrs; tea. erewrite H1 in etabrs. - cbn in etabrs. now rewrite -H3 app_nil_r skipn_length in etabrs. + eapply forallb_nth_error in etabrs; tea. erewrite e2 in etabrs. + cbn in etabrs. now rewrite -e4 app_nil_r skipn_length in etabrs. econstructor; tea. - + - congruence. - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. eapply eval_iota_sing => //. tea. @@ -1710,9 +1722,9 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha heta. + * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. clear H0. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. auto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. set (H' := H); assert (eval_depth H' = eval_depth H) by reflexivity. clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. @@ -1769,8 +1781,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha heta. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. + * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. eauto. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. rewrite hf in H. elimtype False. @@ -1820,10 +1832,11 @@ Proof. forward IHeval1 by tas. forward IHeval2. { eapply eval_etaexp in H; tea. - move: H; rewrite isEtaExp_mkApps // /= => /andP[] etaapp etaargs. + move: H; rewrite isEtaExp_mkApps // /= => /andP[] /andP[] etaapp etaargs bargs. eapply forallb_nth_error in etaargs; tea. - now erewrite H2 in etaargs. } + now erewrite e3 in etaargs. } eapply eval_proj; tea. + - congruence. - simp_eta => etad. forward IHeval by tas. eapply eval_proj_prop ; tea. @@ -1831,37 +1844,37 @@ Proof. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] heta etal. - set (H' := H0) ; assert (eval_depth H' = eval_depth H0) by reflexivity. - clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. - eapply mkApps_eq_inj in heq as [] => //. noconf H4. noconf H5. + * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. + set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. + clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. + eapply mkApps_eq_inj in heq as [] => //. noconf H2. noconf H3. intros hevd. - rewrite (remove_last_last l a hl). + rewrite (remove_last_last l0 a hl). rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply eval_mkApps_Construct; tea. - { constructor. cbn [atom]; rewrite H //. } + { constructor. cbn [atom]; rewrite e0 //. } { len. rewrite (All2_length hargs). lia. } eapply All2_app. eapply forallb_remove_last, forallb_All in etal. eapply All2_All_mix_left in hargs; tea. eapply All2_impl; tea. cbn; intros ? ? []. - destruct s as [evxy hevxy]. unshelve eapply H1; tea. lia. + destruct s as [evxy hevxy]. unshelve eapply H0; tea. lia. constructor; [|constructor]. rewrite -ha. eapply IHeval2. rewrite ha. now eapply forallb_last. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } - rewrite (remove_last_last l a hl) /=. + rewrite (remove_last_last l0 a hl) /=. rewrite mkApps_app. eapply eval_construct; tea. - pose proof H0 as Hfix. + pose proof H as Hfix. rewrite hf in Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. { solve_discr. } - { cbn in H2. + { cbn in H1. rewrite hf in IHeval1. eapply IHeval1. rewrite isEtaExp_mkApps // /= i /= etab /=. move: isel. - now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } + now rewrite {1}(remove_last_last l0 a hl) /= forallb_app => /andP[]. } { now rewrite -ha. } * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1870,21 +1883,22 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_construct; tea. + - congruence. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] heta etal. + * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. - clearbody H'. move: H' H3. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. + clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. subst f'. - rewrite isConstructApp_mkApps /isConstructApp /= in H1. - now rewrite !negb_or /= !andb_false_r in H1. + rewrite isConstructApp_mkApps /isConstructApp /= in i. + now rewrite !negb_or /= !andb_false_r in i. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } rewrite (remove_last_last l a hl) /=. - rewrite mkApps_app. rewrite wguard in H1. + rewrite mkApps_app. rewrite wguard in i. move: H H0. rewrite hf. intros H IH. eapply eval_app_cong; tea. @@ -1892,12 +1906,12 @@ Proof. unshelve eapply IH. exact H. lia. pose proof H as Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. - { subst f'. rewrite isFixApp_mkApps in H1. - now rewrite !negb_or /= !andb_false_r in H1. } - { rewrite isEtaExp_mkApps // /= i /= etab /=. + { subst f'. rewrite isFixApp_mkApps in i. + now rewrite !negb_or /= !andb_false_r in i. } + { rewrite isEtaExp_mkApps // /= i0 /= etab /=. move: isel. now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } - cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. + cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1906,10 +1920,11 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_app_cong; tea. - cbn. rewrite wguard in H1. - cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. + cbn. rewrite wguard in i. + cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. - intros hexp. now eapply eval_atom. + Unshelve. all: eauto. Qed. Lemma expanded_global_env_isEtaExp_env {Σ} : expanded_global_env Σ -> isEtaExp_env Σ. diff --git a/erasure/theories/EGenericMapEnv.v b/erasure/theories/EGenericMapEnv.v new file mode 100644 index 000000000..1f1df5bc2 --- /dev/null +++ b/erasure/theories/EGenericMapEnv.v @@ -0,0 +1,339 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import Utf8 Program. +From MetaCoq.Template Require Import config utils Kernames BasicAst EnvMap. +From MetaCoq.Erasure Require Import EAst EAstUtils EInduction EArities + ELiftSubst ESpineView EGlobalEnv EWellformed EEnvMap + EWcbvEval EEtaExpanded ECSubst EWcbvEvalEtaInd EProgram. + +Local Open Scope string_scope. +Set Asymmetric Patterns. +Import MCMonadNotation. + +From Equations Require Import Equations. +Set Equations Transparent. +Local Set Keyed Unification. +Require Import ssreflect ssrbool. + +Section sec. + +Variable gen_transform : global_context -> term -> term. + +Definition gen_transform_constant_decl Σ cb := + {| cst_body := option_map (gen_transform Σ) cb.(cst_body) |}. + +Definition gen_transform_decl Σ d := + match d with + | ConstantDecl cb => ConstantDecl (gen_transform_constant_decl Σ cb) + | InductiveDecl idecl => d + end. + +Definition gen_transform_env Σ := + map (on_snd (gen_transform_decl Σ)) Σ. + +Program Fixpoint gen_transform_env' Σ : global_context := +match Σ with +| [] => [] +| hd :: tl => on_snd (gen_transform_decl tl) hd :: gen_transform_env' tl +end. + +Import EGlobalEnv EExtends. + +Lemma extends_lookup_projection {efl : EEnvFlags} {Σ Σ' p} : extends Σ Σ' -> wf_glob Σ' -> +isSome (lookup_projection Σ p) -> +lookup_projection Σ p = lookup_projection Σ' p. +Proof. +intros ext wf; cbn -[lookup_projection]. +unfold lookup_projection. +destruct lookup_constructor as [[[mdecl idecl] cdecl]|] eqn:hl => //. +simpl. +rewrite (extends_lookup_constructor wf ext _ _ _ hl) //. +Qed. + +Variable efl' : EEnvFlags. +Variable efl : EEnvFlags. + +Hypothesis wellformed_gen_transform_extends : forall {Σ : global_context} t, +forall n, EWellformed.wellformed Σ n t -> +forall {Σ' : global_context}, extends Σ Σ' -> wf_glob Σ' -> +gen_transform Σ t = gen_transform Σ' t. + +Lemma wellformed_gen_transform_decl_extends {Σ : global_context} t : +wf_global_decl Σ t -> +forall {Σ' : global_context}, extends Σ Σ' -> wf_glob Σ' -> +gen_transform_decl Σ t = gen_transform_decl Σ' t. +Proof. +destruct t => /= //. +intros wf Σ' ext wf'. f_equal. unfold gen_transform_constant_decl. f_equal. +destruct (cst_body c) => /= //. f_equal. +now eapply wellformed_gen_transform_extends. +Qed. + +Lemma lookup_env_gen_transform_env_Some {Σ : global_context} kn d : +wf_glob Σ -> +lookup_env Σ kn = Some d -> +∑ Σ' : global_context, + [× extends Σ' Σ, wf_global_decl Σ' d & + lookup_env (gen_transform_env Σ) kn = Some (gen_transform_decl Σ' d)]. +Proof. +induction Σ in |- *; simpl; auto => //. +intros wfg. +case: eqb_specT => //. +- intros ->. cbn. intros [= <-]. exists Σ. split. + now eexists [_]. + cbn. now depelim wfg. + f_equal. symmetry. eapply wellformed_gen_transform_decl_extends. cbn. now depelim wfg. + cbn. now exists [a]. now cbn. +- intros _. + cbn in IHΣ. forward IHΣ. now depelim wfg. + intros hl. specialize (IHΣ hl) as [Σ'' [ext wfgd hl']]. + exists Σ''. split => //. + * destruct ext as [? ->]. + now exists (a :: x). + * rewrite -hl'. f_equal. + clear -wfg wellformed_gen_transform_extends. + eapply map_ext_in => kn hin. unfold on_snd. f_equal. + symmetry. eapply wellformed_gen_transform_decl_extends => //. cbn. + eapply lookup_env_In in hin. 2:now depelim wfg. + depelim wfg. eapply lookup_env_wellformed; tea. + cbn. now exists [a]. +Qed. + +Lemma lookup_env_map_snd Σ f kn : lookup_env (List.map (on_snd f) Σ) kn = option_map f (lookup_env Σ kn). +Proof. +induction Σ; cbn; auto. +case: eqb_spec => //. +Qed. + +Lemma lookup_env_gen_transform_env_None {Σ : global_context} kn : +lookup_env Σ kn = None -> +lookup_env (gen_transform_env Σ) kn = None. +Proof. +cbn. intros hl. rewrite lookup_env_map_snd hl //. +Qed. + +Lemma lookup_env_gen_transform {Σ : global_context} kn : +wf_glob Σ -> +lookup_env (gen_transform_env Σ) kn = option_map (gen_transform_decl Σ) (lookup_env Σ kn). +Proof. +intros wf. +destruct (lookup_env Σ kn) eqn:hl. +- eapply lookup_env_gen_transform_env_Some in hl as [Σ' [ext wf' hl']] => /=. + rewrite hl'. f_equal. + eapply wellformed_gen_transform_decl_extends; eauto. auto. + +- cbn. now eapply lookup_env_gen_transform_env_None in hl. +Qed. + + +Lemma is_propositional_gen_transform {Σ : global_context} ind : + wf_glob Σ -> + inductive_isprop_and_pars Σ ind = inductive_isprop_and_pars (gen_transform_env Σ) ind. +Proof. + rewrite /inductive_isprop_and_pars => wf. + rewrite /lookup_inductive /lookup_minductive. + rewrite (lookup_env_gen_transform (inductive_mind ind) wf). + rewrite /GlobalContextMap.inductive_isprop_and_pars /GlobalContextMap.lookup_inductive + /GlobalContextMap.lookup_minductive. + destruct lookup_env as [[decl|]|] => //. +Qed. + +Lemma is_propositional_cstr_gen_transform {Σ : global_context} ind c : + wf_glob Σ -> + constructor_isprop_pars_decl Σ ind c = constructor_isprop_pars_decl (gen_transform_env Σ) ind c. +Proof. + rewrite /constructor_isprop_pars_decl => wf. + rewrite /lookup_constructor /lookup_inductive /lookup_minductive. + rewrite (lookup_env_gen_transform (inductive_mind ind) wf). + rewrite /GlobalContextMap.inductive_isprop_and_pars /GlobalContextMap.lookup_inductive + /GlobalContextMap.lookup_minductive. + destruct lookup_env as [[decl|]|] => //. +Qed. + +Lemma isFix_mkApps t l : isFix (mkApps t l) = isFix t && match l with [] => true | _ => false end. +Proof. + induction l using rev_ind; cbn. + - now rewrite andb_true_r. + - rewrite mkApps_app /=. now destruct l => /= //; rewrite andb_false_r. +Qed. + +Lemma lookup_constructor_gen_transform {Σ : global_context} {ind c} : + wf_glob Σ -> + lookup_constructor Σ ind c = lookup_constructor (gen_transform_env Σ) ind c. +Proof. + intros wfΣ. rewrite /lookup_constructor /lookup_inductive /lookup_minductive. + rewrite lookup_env_gen_transform // /=. destruct lookup_env => // /=. + destruct g => //. +Qed. + +Lemma lookup_projection_gen_transform {Σ : global_context} {p} : + wf_glob Σ -> + lookup_projection Σ p = lookup_projection (gen_transform_env Σ) p. +Proof. + intros wfΣ. rewrite /lookup_projection. + rewrite -lookup_constructor_gen_transform //. +Qed. + +Lemma constructor_isprop_pars_decl_inductive {Σ ind c} {prop pars cdecl} : + constructor_isprop_pars_decl Σ ind c = Some (prop, pars, cdecl) -> + inductive_isprop_and_pars Σ ind = Some (prop, pars). +Proof. + rewrite /constructor_isprop_pars_decl /inductive_isprop_and_pars /lookup_constructor. + destruct lookup_inductive as [[mdecl idecl]|]=> /= //. + destruct nth_error => //. congruence. +Qed. + +Lemma constructor_isprop_pars_decl_constructor {Σ ind c} {mdecl idecl cdecl} : + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + constructor_isprop_pars_decl Σ ind c = Some (ind_propositional idecl, ind_npars mdecl, cdecl). +Proof. + rewrite /constructor_isprop_pars_decl. intros -> => /= //. +Qed. + +Lemma wf_mkApps (ha : has_tApp) Σ k f args : reflect (wellformed Σ k f /\ forallb (wellformed Σ k) args) (wellformed Σ k (mkApps f args)). +Proof. + rewrite wellformed_mkApps //. eapply andP. +Qed. + +Lemma gen_transform_env_extends' {Σ Σ' : global_context} : + extends Σ Σ' -> + wf_glob Σ' -> + List.map (on_snd (gen_transform_decl Σ)) Σ = + List.map (on_snd (gen_transform_decl Σ')) Σ. +Proof. + intros ext. + move=> wfΣ. + assert (Hext : extends Σ Σ); auto. now exists []. + assert (Hwfg : wf_glob Σ). + { eapply extends_wf_glob. exact ext. tea. } + revert Hext Hwfg. + generalize Σ at 1 3 5 6. intros Σ''. + induction Σ'' => //. cbn. + intros hin wfg. depelim wfg. + f_equal. + 2:{ eapply IHΣ'' => //. destruct hin. exists (x ++ [(kn, d)]). rewrite -app_assoc /= //. } + unfold on_snd. cbn. f_equal. + eapply wellformed_gen_transform_decl_extends => //. cbn. + eapply extends_wf_global_decl. 3:tea. + eapply extends_wf_glob; tea. + destruct hin. exists (x ++ [(kn, d)]). rewrite -app_assoc /= //. +Qed. + +Lemma gen_transform_env_eq (Σ : global_context) : wf_glob Σ -> gen_transform_env Σ = gen_transform_env' Σ. +Proof. + intros wf. + unfold gen_transform_env. + induction Σ => //. + cbn. f_equal. + destruct a as [kn d]; unfold on_snd; cbn. f_equal. symmetry. + eapply wellformed_gen_transform_decl_extends => //. cbn. now depelim wf. cbn. now exists [(kn, d)]. cbn. + erewrite <- IHΣ. + 2:now depelim wf. + symmetry. eapply gen_transform_env_extends'; eauto. + cbn. now exists [a]. +Qed. + +Variable Pre : global_context -> term -> Prop. + +Hypothesis gen_transform_wellformed : forall {Σ : global_context} n t, + has_tBox -> has_tRel -> Pre Σ t -> + @wf_glob efl Σ -> @EWellformed.wellformed efl Σ n t -> + EWellformed.wellformed (efl := efl') Σ n (gen_transform Σ t). + +Import EWellformed. + +Lemma gen_transform_wellformed_irrel {Σ : global_context} t : + wf_glob Σ -> + forall n, wellformed (efl := efl') Σ n t -> + wellformed (efl := efl') (gen_transform_env Σ) n t. +Proof. + intros wfΣ. induction t using EInduction.term_forall_list_ind; cbn => //. + all:try solve [intros; unfold wf_fix_gen in *; rtoProp; intuition eauto; solve_all]. + - rewrite lookup_env_gen_transform //. + destruct lookup_env eqn:hl => // /=. + destruct g eqn:hg => /= //. destruct (cst_body c); cbn; eauto. + - rewrite lookup_env_gen_transform //. + destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. + destruct g eqn:hg => /= //; intros; rtoProp; eauto. + repeat split; eauto. destruct cstr_as_blocks; rtoProp; repeat split; eauto. solve_all. + - rewrite lookup_env_gen_transform //. + destruct lookup_env eqn:hl => // /=. + destruct g eqn:hg => /= //. subst g. + destruct nth_error => /= //. + intros; rtoProp; intuition auto; solve_all. + - rewrite lookup_env_gen_transform //. + destruct lookup_env eqn:hl => // /=; intros; rtoProp; repeat split; eauto. + destruct g eqn:hg => /= //. +Qed. + +Lemma gen_transform_wellformed_decl_irrel {Σ : global_context} d : + wf_glob Σ -> + wf_global_decl (efl:= efl') Σ d -> + wf_global_decl (efl := efl') (gen_transform_env Σ) d. +Proof. + intros wf; destruct d => /= //. + destruct (cst_body c) => /= //. + now eapply gen_transform_wellformed_irrel. +Qed. + +Hypothesis axioms_efl : forall _ : is_true (@has_axioms efl), is_true (@has_axioms efl'). +Hypothesis cstrs_efl : forall _ : is_true (@has_cstr_params efl), is_true (@has_cstr_params efl'). + +Definition Pre_decl Σ d := match d with ConstantDecl cb => match cb.(cst_body) with Some b => Pre Σ b | _ => True end | _ => True end. + +Lemma gen_transform_decl_wf {Σ : global_context} : + has_tBox -> has_tRel -> wf_glob Σ -> + forall d, wf_global_decl Σ d -> Pre_decl Σ d -> + wf_global_decl (efl := efl') (gen_transform_env Σ) (gen_transform_decl Σ d). +Proof. + intros hasb hasr wf d. + intros hd. intros pre. + eapply gen_transform_wellformed_decl_irrel; tea; eauto. + move: hd. + destruct d => /= //. cbn in pre. + destruct (cst_body c) => /= //. + intros hwf. eapply gen_transform_wellformed => //. auto. + destruct efl => //; eauto. destruct m => //. cbn. unfold wf_minductive. + cbn. move/andP => [] hp //. rtoProp. solve_all. + eapply orb_true_iff. eapply orb_true_iff in hp as []; eauto. + left. eapply cstrs_efl. now rewrite H. +Qed. + +Lemma fresh_global_gen_transform_env {Σ : global_context} kn : + fresh_global kn Σ -> + fresh_global kn (gen_transform_env Σ). +Proof. + induction 1; cbn; constructor; auto. + now eapply Forall_map; cbn. +Qed. + +Fixpoint Pre_glob Σ := + match Σ with + | nil => True + | (kn, d) :: Σ => Pre_decl Σ d /\ Pre_glob Σ + end. + +Lemma gen_transform_env_wf {Σ : global_context} : + has_tBox -> has_tRel -> Pre_glob Σ -> + wf_glob Σ -> wf_glob (efl := efl') (gen_transform_env Σ). +Proof. + intros hasb hasrel pre. + intros wfg. rewrite gen_transform_env_eq //. + induction wfg; cbn; constructor; invs pre; auto. + - rewrite /= -(gen_transform_env_eq Σ) => //. eauto. + eapply gen_transform_decl_wf => //. + - rewrite /= -(gen_transform_env_eq Σ) //. + now eapply fresh_global_gen_transform_env. +Qed. + +(* Definition gen_transform_program (p : eprogram_env) := + (gen_transform_env p.1, gen_transform p.1 p.2). + +Definition gen_transform_program_wf (p : eprogram_env) {hastbox : has_tBox} {hastrel : has_tRel} : + wf_eprogram_env efl p -> wf_eprogram (efl') (gen_transform_program p). +Proof. + intros []; split. + now eapply gen_transform_env_wf. + cbn. eapply gen_transform_wellformed_irrel => //. now eapply gen_transform_wellformed. +Qed. *) + +End sec. \ No newline at end of file diff --git a/erasure/theories/EGlobalEnv.v b/erasure/theories/EGlobalEnv.v index 3448f7540..60aefe00d 100644 --- a/erasure/theories/EGlobalEnv.v +++ b/erasure/theories/EGlobalEnv.v @@ -247,7 +247,7 @@ Definition is_constructor_app_or_box t := | a => let (f, a) := decompose_app a in match f with - | tConstruct _ _ => true + | tConstruct _ _ _ => true | _ => false end end. diff --git a/erasure/theories/EInduction.v b/erasure/theories/EInduction.v index 61a591530..659d24b37 100644 --- a/erasure/theories/EInduction.v +++ b/erasure/theories/EInduction.v @@ -25,7 +25,8 @@ Lemma term_forall_list_ind : P t -> forall t0 : term, P t0 -> P (tLetIn n t t0)) -> (forall t u : term, P t -> P u -> P (tApp t u)) -> (forall s, P (tConst s)) -> - (forall (i : inductive) (n : nat), P (tConstruct i n)) -> + (forall (i : inductive) (n : nat) (args : list term), + All P args -> P (tConstruct i n args)) -> (forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) -> @@ -50,6 +51,11 @@ Proof. destruct l; constructor; [|apply auxl']. apply auxt. + revert l. + fix auxl' 1. + destruct l; constructor; [|apply auxl']. + apply auxt. + revert m. fix auxm 1. destruct m; constructor; [|apply auxm]. @@ -93,6 +99,7 @@ Fixpoint size t : nat := | tProj p c => S (size c) | tFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) | tCoFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) + | tConstruct _ _ ignore_args => S (list_size size ignore_args) | _ => 1 end. @@ -168,7 +175,7 @@ Qed. Lemma size_mkApps_l {f l} (Hf : ~~ isApp f) (Hl : l <> []) : list_size size l < size (mkApps f l). Proof. rewrite size_mkApps. - destruct f => /= //; lia. + destruct f => /= //; try lia. Qed. (** Custom induction principle on syntax, dealing with the various lists appearing in terms. *) @@ -202,7 +209,7 @@ Section MkApps_rec. (papp : forall t u, ~~ isApp t -> u <> nil -> P t -> All P u -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) + (pconstruct : forall (i : inductive) (n : nat) args, All P args -> P (tConstruct i n args)) (pcase : forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) @@ -229,7 +236,7 @@ Section MkApps_rec. let pl := All_rec P id l (fun x H => rec x) in rew _ in papp t l napp nonnil pt pl } | tConst k => pconst k - | tConstruct i n => pconstruct i n + | tConstruct i n args => pconstruct i n _ (All_rec P id args (fun x H => rec x)) | tCase ina c brs => pcase ina c (rec c) brs (All_rec P (fun x => x.2) brs (fun x H => rec x)) | tProj p c => pproj p c (rec c) | tFix mfix idx => pfix mfix idx (All_rec P dbody mfix (fun x H => rec x)) @@ -260,7 +267,7 @@ Section MkApps_rec. (plet : forall (n : name) (t : term), forall t0 : term, P (tLetIn n t t0)) (papp : forall t u, ~~ isApp t -> u <> nil -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) + (pconstruct : forall (i : inductive) (n : nat) args, P (tConstruct i n args)) (pcase : forall (p : inductive * nat) (t : term) (l : list (list name * term)), P (tCase p t l)) (pproj : forall (s : projection) (t : term), P (tProj s t)) (pfix : forall (m : mfixpoint term) (n : nat), P (tFix m n)) @@ -281,7 +288,7 @@ Section MkApps_rec. let nonnil := decompose_app_app _ _ _ _ da in rew [P] (eq_sym (decompose_app_inv da)) in papp t l napp nonnil } | tConst k => pconst k - | tConstruct i n => pconstruct i n + | tConstruct i n args => pconstruct i n args | tCase ina c brs => pcase ina c brs | tProj p c => pproj p c | tFix mfix idx => pfix mfix idx diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index 2afb1ba1c..810ceab5f 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -23,8 +23,15 @@ Ltac introdep := let H := fresh in intros H; depelim H. Hint Constructors eval : core. (** Allow everything in terms *) -Local Existing Instance all_env_flags. +Definition switch_no_params (efl : EEnvFlags) := + {| has_axioms := has_axioms; + has_cstr_params := false; + term_switches := term_switches ; + cstr_as_blocks := false + |}. +Definition flags_after_projs := (switch_no_params all_env_flags). +Local Existing Instance flags_after_projs. Arguments lookup_projection : simpl never. Arguments GlobalContextMap.lookup_projection : simpl never. @@ -90,7 +97,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct ind n args => tConstruct ind n (map optimize args) (* | tPrim _ => t *) end. @@ -116,6 +123,7 @@ Section optimize. rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; unfold wf_fix_gen, test_def in *; simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. + - rtoProp. split; eauto. destruct args; eauto. - move/andP: H => [] /andP[] -> clt cll /=. rewrite IHt //=. solve_all. - rewrite GlobalContextMap.lookup_projection_spec. @@ -142,6 +150,7 @@ Section optimize. unfold wf_fix, test_def in *; simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct (k ?= n0)%nat; auto. + - f_equal. rtoProp. now destruct args; inv H0. - move/andP: wft => [] /andP[] hi hb hl. rewrite IHb. f_equal. unfold on_snd; solve_all. repeat toAll. f_equal. solve_all. unfold on_snd; cbn. f_equal. rewrite a0 //. now rewrite -Nat.add_assoc. @@ -284,7 +293,8 @@ Lemma wellformed_optimize_extends {wfl: EEnvFlags} {Σ : GlobalContextMap.t} t : Proof. induction t using EInduction.term_forall_list_ind; cbn -[lookup_constant lookup_inductive GlobalContextMap.lookup_projection]; intros => //. - all:unfold wf_fix_gen in *; rtoProp; intuition auto. + all:unfold wf_fix_gen in *; rtoProp; intuition auto. + 5:{ destruct cstr_as_blocks; rtoProp. f_equal; eauto; solve_all. destruct args; cbn in *; eauto. } all:f_equal; eauto; solve_all. - rewrite !GlobalContextMap.lookup_projection_spec. rewrite -(extends_lookup_projection H0 H1 H3). @@ -364,7 +374,7 @@ Proof. rewrite hl'. f_equal. eapply wellformed_optimize_decl_extends; eauto. auto. - - cbn. now eapply lookup_env_optimize_env_None in hl. + - cbn. now eapply lookup_env_optimize_env_None in hl. Qed. Lemma is_propositional_optimize {efl : EEnvFlags} {Σ : GlobalContextMap.t} ind : @@ -406,7 +416,7 @@ Proof. now rewrite List.rev_length hskip Nat.add_0_r. Qed. -Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. +Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := false |}. Lemma isFix_mkApps t l : isFix (mkApps t l) = isFix t && match l with [] => true | _ => false end. Proof. @@ -472,7 +482,8 @@ Proof. * intros hnth. now apply IHs. Qed. -Lemma optimize_correct (efl := all_env_flags) {fl} {Σ : GlobalContextMap.t} t v : + +Lemma optimize_correct {fl} {wcon : with_constructor_as_block = false} { Σ : GlobalContextMap.t} t v : wf_glob Σ -> @eval fl Σ t v -> wellformed Σ 0 t -> @@ -486,7 +497,7 @@ Proof. eapply eval_wellformed in ev2; tea => //. eapply eval_wellformed in ev1; tea => //. econstructor; eauto. - rewrite -(optimize_csubst _ 1) //. + rewrite -(optimize_csubst _ 1) //. apply IHev3. eapply wellformed_csubst => //. - move/andP => [] clb0 clb1. @@ -501,11 +512,13 @@ Proof. eapply nth_error_forallb in wfbrs; tea. rewrite Nat.add_0_r in wfbrs. forward IHev2. eapply wellformed_iota_red; tea => //. - rewrite optimize_iota_red in IHev2 => //. now rewrite e2. + rewrite optimize_iota_red in IHev2 => //. now rewrite e3. econstructor; eauto. rewrite -is_propositional_cstr_optimize //. tea. - rewrite nth_error_map e0 //. len. len. - + rewrite nth_error_map e1 //. len. len. + + - congruence. + - move/andP => [] /andP[] hl wfd wfbrs. forward IHev2. eapply wellformed_substl; tea => //. rewrite forallb_repeat //. len. @@ -587,7 +600,7 @@ Proof. move/wf_mkApps: ev1 => [] wfc wfargs. destruct lookup_projection as [[[[mdecl idecl] cdecl'] pdecl]|] eqn:hl' => //. pose proof (lookup_projection_lookup_constructor hl'). - rewrite (constructor_isprop_pars_decl_constructor H) in e. noconf e. + rewrite (constructor_isprop_pars_decl_constructor H) in e0. noconf e0. forward IHev1 by auto. forward IHev2. eapply nth_error_forallb in wfargs; tea. rewrite optimize_mkApps /= in IHev1. @@ -604,11 +617,13 @@ Proof. rewrite nth_error_rev. len. rewrite skipn_length. lia. rewrite List.rev_involutive. len. rewrite skipn_length. rewrite nth_error_skipn nth_error_map. - rewrite e0 -H1. + rewrite e1 -H1. assert((ind_npars mdecl + cstr_nargs cdecl - ind_npars mdecl) = cstr_nargs cdecl) by lia. rewrite H3. - eapply (f_equal (option_map (optimize Σ))) in e1. - cbn in e1. rewrite -e1. f_equal. f_equal. lia. + eapply (f_equal (option_map (optimize Σ))) in e2. + cbn in e2. rewrite -e2. f_equal. f_equal. lia. + + - congruence. - move=> /andP[] iss cld. rewrite GlobalContextMap.lookup_projection_spec. @@ -629,11 +644,13 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e. + rewrite -lookup_constructor_optimize //. exact e0. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. + - congruence. + - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply eval_app_cong; eauto. @@ -658,6 +675,7 @@ Proof. all:constructor; eauto. cbn [atom optimize] in i |- *. rewrite -lookup_constructor_optimize //. + destruct l; cbn in *; eauto. Qed. From MetaCoq.Erasure Require Import EEtaExpanded. @@ -786,7 +804,8 @@ Definition disable_projections_term_flags (et : ETermFlags) := Definition disable_projections_env_flag (efl : EEnvFlags) := {| has_axioms := true; term_switches := disable_projections_term_flags term_switches; - has_cstr_params := true |}. + has_cstr_params := true ; + cstr_as_blocks := efl.(cstr_as_blocks) |}. Lemma optimize_wellformed {efl : EEnvFlags} {Σ : GlobalContextMap.t} n t : has_tBox -> has_tRel -> @@ -798,6 +817,10 @@ Proof. all:try solve [cbn; rtoProp; intuition auto; solve_all]. - simpl. destruct lookup_constant => //. move/andP => [] hasc _ => //. now rewrite hasc. + - cbn -[lookup_constructor_pars_args]. intros. rtoProp. repeat split; eauto. + destruct cstr_as_blocks; rtoProp; eauto. + destruct lookup_constructor_pars_args as [ [] | ]; eauto. split; len. solve_all. split; eauto. + solve_all. now destruct args; invs H0. - cbn. move/andP => [] /andP[] hast hl wft. rewrite GlobalContextMap.lookup_projection_spec. destruct lookup_projection as [[[[mdecl idecl] cdecl] pdecl]|] eqn:hl'; auto => //. @@ -825,8 +848,9 @@ Proof. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. - rewrite lookup_env_optimize //. - destruct lookup_env eqn:hl => // /=. - destruct g eqn:hg => /= //. + destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. + destruct g eqn:hg => /= //; intros; rtoProp; eauto. + repeat split; eauto. destruct cstr_as_blocks; rtoProp; repeat split; eauto. solve_all. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. subst g. diff --git a/erasure/theories/ELiftSubst.v b/erasure/theories/ELiftSubst.v index 91f9b59ad..f269e6574 100644 --- a/erasure/theories/ELiftSubst.v +++ b/erasure/theories/ELiftSubst.v @@ -34,7 +34,7 @@ Fixpoint lift n k t : term := | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct ind i args => tConstruct ind i (map (lift n k) args) (* | tPrim _ => t *) end. @@ -69,6 +69,7 @@ Fixpoint subst s k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (subst s k')) mfix in tCoFix mfix' idx + | tConstruct ind i args => tConstruct ind i (map (subst s k) args) | x => x end. @@ -95,6 +96,7 @@ Fixpoint closedn k (t : term) : bool := | tCoFix mfix idx => let k' := List.length mfix + k in List.forallb (test_def (closedn k')) mfix + | tConstruct ind i args => forallb (closedn k) args | _ => true end. @@ -106,7 +108,7 @@ Require Import PeanoNat. Import Nat. Lemma lift_rel_ge : - forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). + forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). Proof. intros; simpl in |- *. now elim (leb_spec p n). @@ -450,8 +452,8 @@ Proof. revert H. elim (Nat.ltb_spec n0 k); intros; try easy. - cbn. f_equal; auto. rtoProp; solve_all. - rtoProp; solve_all. - destruct x; f_equal; cbn in *. now apply a0. + rtoProp; solve_all. + destruct x; f_equal; cbn in *. eauto. Qed. Lemma closed_upwards {k t} k' : closedn k t -> k' >= k -> closedn k' t. @@ -604,6 +606,7 @@ Proof. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. rewrite IHt1 // IHt2 //. + - eapply All_forallb_eq_forallb; eauto. - rewrite IHt //. f_equal. eapply All_forallb_eq_forallb; tea. cbn. intros. specialize (H (#|x.1| + k')). diff --git a/erasure/theories/EOptimizePropDiscr.v b/erasure/theories/EOptimizePropDiscr.v index a19b19144..4e7d019cd 100644 --- a/erasure/theories/EOptimizePropDiscr.v +++ b/erasure/theories/EOptimizePropDiscr.v @@ -61,7 +61,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ => t + | tConstruct ind i args => tConstruct ind i (map optimize args) (* | tPrim _ => t *) end. @@ -366,7 +366,8 @@ Proof. lookup_projection GlobalContextMap.inductive_isprop_and_pars]; intros => //. all:unfold wf_fix_gen in *; rtoProp; intuition auto. - all:f_equal; eauto; solve_all. + all:try now f_equal; eauto; solve_all. + - destruct cstr_as_blocks; rtoProp; eauto. f_equal. solve_all. destruct args; inv H2. reflexivity. - rewrite !GlobalContextMap.inductive_isprop_and_pars_spec. assert (map (on_snd (optimize Σ)) l = map (on_snd (optimize Σ')) l) as -> by solve_all. rewrite (extends_inductive_isprop_and_pars H0 H1 H2). @@ -522,7 +523,7 @@ Proof. destruct nth_error => //. congruence. Qed. -Lemma optimize_correct {efl : EEnvFlags} {fl} {Σ : GlobalContextMap.t} t v : +Lemma optimize_correct {efl : EEnvFlags} {fl}{wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : wf_glob Σ -> closed_env Σ -> @Ee.eval fl Σ t v -> @@ -550,16 +551,18 @@ Proof. rewrite optimize_iota_red in IHev2. eapply eval_closed in ev1 => //. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e). - eapply eval_iota; eauto. tea. + rewrite (constructor_isprop_pars_decl_inductive e0). + eapply eval_iota; eauto. now rewrite -is_propositional_cstr_optimize. - rewrite nth_error_map e0 //. now len. cbn. - rewrite -e2. rewrite !skipn_length map_length //. + rewrite nth_error_map e1 //. now len. cbn. + rewrite -e3. rewrite !skipn_length map_length //. eapply IHev2. eapply closed_iota_red => //; tea. eapply nth_error_forallb in clbrs; tea. cbn in clbrs. now rewrite Nat.add_0_r in clbrs. + - congruence. + - move/andP => [] cld clbrs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. rewrite e e0 /=. @@ -657,14 +660,16 @@ Proof. eapply eval_closed in ev1; tea. move: ev1; rewrite closedn_mkApps /= => clargs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e). + rewrite (constructor_isprop_pars_decl_inductive e0). rewrite optimize_mkApps in IHev1. specialize (IHev1 cld). eapply Ee.eval_proj; tea. now rewrite -is_propositional_cstr_optimize. - now len. rewrite nth_error_map e1 //. + now len. rewrite nth_error_map e2 //. eapply IHev2. - eapply nth_error_forallb in e1; tea. + eapply nth_error_forallb in e2; tea. + + - congruence. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. now rewrite e. @@ -672,11 +677,13 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e. + rewrite -lookup_constructor_optimize //. exact e0. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. + - congruence. + - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply Ee.eval_app_cong; eauto. @@ -699,22 +706,9 @@ Proof. destruct v => /= //. - destruct t => //. all:constructor; eauto. cbn [atom optimize] in i |- *. - rewrite -lookup_constructor_optimize //. + rewrite -lookup_constructor_optimize //. destruct l => //. Qed. -(* -Lemma optimize_extends Σ Σ' : - wf_glob Σ' -> - extends Σ Σ' -> - forall t b, optimize Σ t = b -> optimize Σ' t = b. -Proof. - intros wf ext. - induction t using EInduction.term_forall_list_ind; cbn => //. - all:try solve [f_equal; solve_all]. - destruct inductive_isp - rewrite (extends_is_propositional wf ext). - *) - From MetaCoq.Erasure Require Import EEtaExpanded. Lemma isLambda_optimize Σ t : isLambda t -> isLambda (optimize Σ t). @@ -842,6 +836,8 @@ Proof. intros wfΣ hbox hrel. induction t in n |- * using EInduction.term_forall_list_ind => //. all:try solve [cbn; rtoProp; intuition auto; solve_all]. + - cbn -[lookup_constructor]. intros. destruct cstr_as_blocks; rtoProp; repeat split; eauto. 2:solve_all. + 2: now destruct args; inv H0. len. eauto. - cbn -[GlobalContextMap.inductive_isprop_and_pars lookup_inductive]. move/and3P => [] hasc /andP[]hs ht hbrs. destruct GlobalContextMap.inductive_isprop_and_pars as [[[|] _]|] => /= //. destruct l as [|[br n'] [|l']] eqn:eql; simpl. @@ -879,8 +875,9 @@ Proof. destruct g eqn:hg => /= //. subst g. destruct (cst_body c) => //. - rewrite lookup_env_optimize //. - destruct lookup_env eqn:hl => // /=. - destruct g eqn:hg => /= //. + destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. + destruct g eqn:hg => /= //; intros; rtoProp; eauto. + repeat split; eauto. destruct cstr_as_blocks; rtoProp; repeat split; len; eauto. 1: solve_all. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. subst g. diff --git a/erasure/theories/EPretty.v b/erasure/theories/EPretty.v index 4322008aa..96f534226 100644 --- a/erasure/theories/EPretty.v +++ b/erasure/theories/EPretty.v @@ -111,11 +111,11 @@ Module PrintTermTree. | tApp f l => parens (top || inapp) (print_term Γ false true f ^ " " ^ print_term Γ false false l) | tConst c => string_of_kername c - | tConstruct (mkInd i k as ind) l => + | tConstruct (mkInd i k as ind) l args => match lookup_ind_decl Σ i k with | Some oib => match nth_error oib.(ind_ctors) l with - | Some cstr => cstr.(cstr_name) + | Some cstr => cstr.(cstr_name) ^ maybe_string_of_list string_of_term args | None => "UnboundConstruct(" ^ string_of_inductive ind ^ "," ^ string_of_nat l ^ ")" end diff --git a/erasure/theories/EReflect.v b/erasure/theories/EReflect.v index 99dc459ef..039df2bc7 100644 --- a/erasure/theories/EReflect.v +++ b/erasure/theories/EReflect.v @@ -59,6 +59,15 @@ Proof. - destruct (IHx1 t1) ; nodec. destruct (IHx2 t2) ; nodec. subst. left. reflexivity. + - revert l. induction X ; intro l0. + + destruct l0. + * left. reflexivity. + * right. discriminate. + + destruct l0. + * right. discriminate. + * destruct (IHX l0) ; nodec. + destruct (p t) ; nodec. + inversion e. subst; left; reflexivity. - destruct (IHx t) ; nodec. subst. revert l0. clear IHx. induction X ; intro l0. diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index a9e351b1b..2e760b906 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -36,10 +36,10 @@ Section strip. | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => strip x)) | tLambda na M => EAst.tLambda na (strip M) | tApp u v napp nnil with construct_viewc u := { - | view_construct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | view_construct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { | Some npars := - mkApps (EAst.tConstruct kn c) (List.skipn npars (map_InP v (fun x H => strip x))) - | None => mkApps (EAst.tConstruct kn c) (map_InP v (fun x H => strip x)) } + mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map_InP v (fun x H => strip x))) + | None => mkApps (EAst.tConstruct kn c block_args) (map_InP v (fun x H => strip x)) } | view_other u nconstr => mkApps (strip u) (map_InP v (fun x H => strip x)) } @@ -57,15 +57,15 @@ Section strip. | tBox => EAst.tBox | tVar n => EAst.tVar n | tConst n => EAst.tConst n - | tConstruct ind i => EAst.tConstruct ind i }. + | tConstruct ind i block_args => EAst.tConstruct ind i block_args }. Proof. all:try lia. all:try apply (In_size); tea. - now eapply (In_size id size). - rewrite size_mkApps. - now eapply (In_size id size) in H. + eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. - rewrite size_mkApps. - now eapply (In_size id size) in H. + eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. - now eapply size_mkApps_f. - pose proof (size_mkApps_l napp nnil). eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. lia. @@ -108,9 +108,9 @@ Section strip. - rewrite !closedn_mkApps in H1 *. rtoProp; intuition auto. solve_all. - - rewrite !closedn_mkApps /= in H0 *. - rewrite forallb_skipn; solve_all. - - rewrite !closedn_mkApps /= in H0 *; solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. + rewrite forallb_skipn; solve_all. solve_all. + - rewrite !closedn_mkApps /= in H0 *. rtoProp. repeat solve_all. Qed. Hint Rewrite @forallb_InP_spec : isEtaExp. @@ -119,10 +119,10 @@ Section strip. Local Lemma strip_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c => + | view_construct kn c block_args => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -139,10 +139,10 @@ Section strip. Lemma strip_mkApps f v : ~~ isApp f -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c => + | view_construct kn c block_args => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -170,6 +170,7 @@ Section strip. isEtaExp Σ b -> strip (ECSubst.csubst a k b) = ECSubst.csubst (strip a) k (strip b). Proof using Type. + intros cla etaa; move cla before a. move etaa before a. funelim (strip b); cbn; simp strip isEtaExp; rewrite -?isEtaExp_equation_1 -?strip_equation_1; toAll; simpl; intros; try easy; rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; @@ -177,10 +178,11 @@ Section strip. simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct Nat.compare => //. - - f_equal. solve_all. move/andP: b => [] _ he. solve_all. - - specialize (H a k H1 H2). - rewrite !csubst_mkApps in H2 *. - rewrite isEtaExp_mkApps_napp // in H3. + - f_equal. rtoProp. solve_all. destruct block_args; inv H0. eauto. + - f_equal. solve_all. move/andP: b => [] _ he. solve_all. + - specialize (H a etaa cla k). + rewrite !csubst_mkApps in H1 *. + rewrite isEtaExp_mkApps_napp // in H1. destruct construct_viewc. * cbn. rewrite strip_mkApps //. * move/andP: H3 => [] et ev. @@ -208,8 +210,8 @@ Section strip. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). rewrite -mkApps_app /= !skipn_map. f_equal. rewrite skipn_app map_app. f_equal. - assert (pars - #|l| = 0). eapply Nat.leb_le in ise; lia. - rewrite H4 skipn_0. + assert (pars - #|l| = 0). rtoProp. rename H2 into ise. eapply Nat.leb_le in ise; lia. + rewrite H2 skipn_0. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } { rewrite -mkApps_app. @@ -225,7 +227,7 @@ Section strip. rewrite /isEtaExp_app in H4. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => // /=. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). - assert (pars = 0). eapply Nat.leb_le in H4. lia. + assert (pars = 0). rtoProp. eapply Nat.leb_le in H2. lia. subst pars. rewrite skipn_0. simp strip; rewrite -strip_equation_1. { f_equal. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } } @@ -240,13 +242,13 @@ Section strip. unfold isEtaExp_app in etaapp. rewrite GlobalContextMap.lookup_inductive_pars_spec in Heq. rewrite Heq in etaapp *. - f_equal. rewrite map_skipn. f_equal. + f_equal. + now destruct block_args; inv etav. + rewrite map_skipn. f_equal. rewrite !map_map_compose. - rewrite isEtaExp_Constructor // in H2. - move/andP: H2 => [] etaapp' ev. - clear -H0 H1 ev H. solve_all. - - pose proof (etaExp_csubst _ _ k _ H1 H2). - rewrite !csubst_mkApps /= in H3 *. + rewrite isEtaExp_Constructor // in H0. rtoProp. solve_all. + - pose proof (etaExp_csubst _ _ k _ etaa H0). + rewrite !csubst_mkApps /= in H1 *. assert (map (csubst a k) v <> []). { destruct v; cbn; congruence. } rewrite strip_mkApps //. @@ -433,9 +435,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_mkApps {Σ} {f u} : isEtaExp Σ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match construct_viewc hd with - | view_construct kn c => + | view_construct kn c block_args => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args && is_nil block_args | view_other _ discr => [&& isEtaExp Σ hd, forallb (isEtaExp Σ) args, isEtaExp Σ f & isEtaExp Σ u] end. @@ -496,7 +498,7 @@ Proof. rewrite isEtaExp_mkApps_napp // in etaf. simp construct_viewc in etaf. move/andP: etaf => []. rewrite /isEtaExp_app hl. - move/Nat.leb_le. lia. } + move => /andP[] /Nat.leb_le. lia. } { move/and4P=> [] iset isel _ _. rewrite (decompose_app_inv da). pose proof (decompose_app_notApp _ _ _ da). rewrite strip_mkApps //. @@ -531,9 +533,9 @@ Module Fast. | app, tCoFix mfix idx => let mfix' := strip_defs mfix in mkApps (EAst.tCoFix mfix' idx) app - | app, tConstruct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { - | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars app) - | None => mkApps (EAst.tConstruct kn c) app } + | app, tConstruct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars app) + | None => mkApps (EAst.tConstruct kn c block_args) app } | app, x => mkApps x app } where strip_args (t : list term) : list term := @@ -646,22 +648,22 @@ Proof. rewrite mkApps_app /= //. Qed. -Lemma isLambda_mkApps_Construct ind n l : - ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isLambda_mkApps_Construct ind n block_args l : + ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isBox_mkApps_Construct ind n l : - ~~ isBox (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isBox_mkApps_Construct ind n block_args l : + ~~ isBox (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isFix_mkApps_Construct ind n l : - ~~ isFix (EAst.mkApps (EAst.tConstruct ind n) l). +Lemma isFix_mkApps_Construct ind n block_args l : + ~~ isFix (EAst.mkApps (EAst.tConstruct ind n block_args) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. @@ -673,7 +675,7 @@ Proof. funelim (strip Σ f); cbn -[strip]; (try simp_strip) => //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _ _)) //. Qed. Lemma strip_isBox Σ f : @@ -683,7 +685,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isBox_mkApps' _ _ _)) //. rewrite (negbTE (isBox_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _ _)) //. Qed. Lemma isApp_mkApps u v : v <> nil -> isApp (mkApps u v). @@ -708,7 +710,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isFix_mkApps' _ _ _)) //. rewrite (negbTE (isFix_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _)) //. + all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _ _)) //. Qed. Lemma strip_isFixApp Σ f : @@ -776,15 +778,16 @@ Proof. destruct construct_viewc eqn:vc. + move=> /andP[] hl0 etal0. rewrite -mkApps_app. - rewrite (strip_mkApps Σ (tConstruct ind n)) // /=. + rewrite (strip_mkApps Σ (tConstruct ind n block_args)) // /=. rewrite strip_mkApps // /=. unfold isEtaExp_app in hl0. destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. - eapply Nat.leb_le in hl0. + rtoProp. + eapply Nat.leb_le in H. rewrite (lookup_inductive_pars_constructor_pars_args hl). rewrite -mkApps_app. f_equal. rewrite map_app. rewrite skipn_app. len. assert (pars - #|l| = 0) by lia. - now rewrite H skipn_0. + now rewrite H1 skipn_0. + move=> /andP[] etat0 etal0. rewrite -mkApps_app !strip_mkApps; try now eapply decompose_app_notApp. rewrite vc. rewrite -mkApps_app !map_app //. @@ -820,7 +823,7 @@ Proof. split; intros; rtoProp; intuition auto; solve_all. Qed. -Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {Σ : GlobalContextMap.t} t v : +Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : closed_env Σ -> isEtaExp_env Σ -> wf_glob Σ -> @@ -831,7 +834,7 @@ Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {Σ : GlobalContextMap.t Proof. intros clΣ etaΣ wfΣ ev clt etat. revert t v clt etat ev. - apply (eval_preserve_mkApps_ind wfl Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) + unshelve eapply (eval_preserve_mkApps_ind wfl wcon Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) (fun n x => closedn n x) (Qpres := Qpreserves_closedn Σ clΣ)) => //. { intros. eapply eval_closed; tea. } all:intros; simpl in *. @@ -863,7 +866,7 @@ Proof. * cbn -[strip]. have etaargs : forallb (isEtaExp Σ) args. { rewrite isEtaExp_Constructor in i6. - now move/andP: i6 => []. } + now move/andP: i6 => [] /andP[]. } rewrite strip_iota_red // in e. rewrite closedn_mkApps in i4. now move/andP: i4. cbn. now eapply nth_error_forallb in H; tea. @@ -1057,8 +1060,15 @@ Proof. destruct g eqn:hg => /= //. subst g. destruct (cst_body c) => //. - rewrite lookup_env_strip //. - destruct lookup_env eqn:hl => // /=. - destruct g eqn:hg => /= //. + destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. + destruct g eqn:hg => /= //; intros; rtoProp; eauto. + destruct cstr_as_blocks; repeat split; eauto. + destruct nth_error => /= //. + destruct nth_error => /= //. + destruct nth_error => /= //. + destruct nth_error => /= //. rtoProp. split. solve_all. + eapply Nat.leb_le in H0. eapply Nat.leb_le. lia. + solve_all. destruct nth_error => /= //. destruct nth_error => /= //. - rewrite lookup_env_strip //. @@ -1088,7 +1098,9 @@ Qed. Definition switch_no_params (efl : EEnvFlags) := {| has_axioms := has_axioms; has_cstr_params := false; - term_switches := term_switches |}. + term_switches := term_switches ; + cstr_as_blocks := false + |}. Lemma strip_decl_wf (efl := all_env_flags) {Σ : GlobalContextMap.t} : wf_glob Σ -> @@ -1175,7 +1187,7 @@ Proof. rewrite strip_mkApps // /=. move: Heq. rewrite GlobalContextMap.lookup_inductive_pars_spec. - unfold wellformed in wfc. move/andP: wfc => [] hacc hc. + unfold wellformed in wfc. move/andP: wfc => [] /andP[] hacc hc bargs. unfold lookup_inductive_pars. destruct lookup_minductive eqn:heq => //. unfold lookup_constructor, lookup_inductive in hc. rewrite heq /= // in hc. Qed. diff --git a/erasure/theories/ESpineView.v b/erasure/theories/ESpineView.v index 7bee803c6..8bbb0ca70 100644 --- a/erasure/theories/ESpineView.v +++ b/erasure/theories/ESpineView.v @@ -17,7 +17,7 @@ Inductive t : term -> Set := | tLetIn n b b' : t (EAst.tLetIn n b b') | tApp (f : term) (l : list term) (napp : ~~ isApp f) (nnil : l <> nil) : t (mkApps f l) | tConst kn : t (tConst kn) -| tConstruct i n : t (tConstruct i n) +| tConstruct i n args : t (tConstruct i n args) | tCase ci p brs : t (tCase ci p brs) | tProj p c : t (tProj p c) | tFix mfix idx : t (tFix mfix idx) diff --git a/erasure/theories/ETransform.v b/erasure/theories/ETransform.v index 9b34d1a0b..ab608037b 100644 --- a/erasure/theories/ETransform.v +++ b/erasure/theories/ETransform.v @@ -111,7 +111,7 @@ Qed. Import EWcbvEval (WcbvFlags, with_prop_case, with_guarded_fix). -Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {efl : EEnvFlags} (wguard : with_guarded_fix) : +Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} {efl : EEnvFlags} (wguard : with_guarded_fix) : Transform.t eprogram_env eprogram_env EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram_env (EWcbvEval.switch_unguarded_fix fl)) := {| name := "switching to unguarded fixpoints"; @@ -122,10 +122,10 @@ Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {efl : EE Next Obligation. cbn. eauto. Qed. Next Obligation. cbn. - move=> fl efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. + move=> fl wcon efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. intros [ev]. exists v. split => //. red. sq. cbn in *. - apply EEtaExpandedFix.eval_opt_to_target => //. 2:apply wfp. + unshelve eapply EEtaExpandedFix.eval_opt_to_target => //. auto. 2:apply wfp. now eapply EEtaExpandedFix.expanded_global_env_isEtaExp_env. now eapply EEtaExpandedFix.expanded_isEtaExp. Qed. @@ -147,7 +147,7 @@ Next Obligation. cbn. intros fl efl input v [] ev p'; exists v. split => //. Qed. -Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} +Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags): Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters"; @@ -156,7 +156,7 @@ Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl efl [Σ t] [wfp etap]. + move=> fl wcon efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. split. now eapply ERemoveParams.strip_program_wf. @@ -164,16 +164,17 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. now sq. cbn in *. now eapply wellformed_closed_env. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. + Unshelve. auto. Qed. -Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) +Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags) : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters (faster?)"; @@ -182,7 +183,7 @@ Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl efl [Σ t] [wfp etap]. + move=> fl wcon efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. @@ -192,7 +193,7 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. @@ -201,11 +202,12 @@ Next Obligation. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. + Unshelve. auto. Qed. Import EOptimizePropDiscr EWcbvEval. -Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : +Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram (disable_prop_cases fl)) := {| name := "optimize_prop_discr"; transform p _ := optimize_program p ; @@ -214,22 +216,23 @@ Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {efl : EEnv obseq g g' v v' := v' = EOptimizePropDiscr.optimize g.1 v |}. Next Obligation. - move=> fl efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl wcon efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EOptimizePropDiscr.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. eapply wellformed_closed_env, wfe. eapply wellformed_closed, wfe. + Unshelve. eauto. Qed. From MetaCoq.Erasure Require Import EInlineProjections. -Program Definition inline_projections_optimization {fl : WcbvFlags} (efl := all_env_flags) +Program Definition inline_projections_optimization {fl : WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} (efl := switch_no_params all_env_flags) {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "primitive projection inlining"; @@ -239,14 +242,39 @@ Program Definition inline_projections_optimization {fl : WcbvFlags} (efl := all_ obseq g g' v v' := v' = EInlineProjections.optimize g.1 v |}. Next Obligation. - move=> fl efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl wcon hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EInlineProjections.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. - cbn. eapply wfe. + cbn. eapply wfe. Unshelve. auto. +Qed. + +From MetaCoq.Erasure Require Import EConstructorsAsBlocks. + +Program Definition constructors_as_blocks_transformation (efl := env_flags) + {hastrel : has_tRel} {hastbox : has_tBox} : + Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env target_wcbv_flags) (eval_eprogram block_wcbv_flags) := + {| name := "transforming to constuctors as blocks"; + transform p _ := EConstructorsAsBlocks.transform_blocks_program p ; + pre p := wf_eprogram_env efl p /\ EEtaExpanded.expanded_eprogram_env_cstrs p; + post p := wf_eprogram env_flags_blocks p ; + obseq g g' v v' := True |}. + +Next Obligation. + move=> efl hastrel hastbox [Σ t] [] [wftp wft] /andP [etap etat]. + cbn in *. split. + - eapply transform_wf_global; eauto. + - subst efl. eapply transform_wellformed; eauto. +Qed. +Next Obligation. + red. move=> hastrel hastbox [Σ t] /= v [[wfe1 wfe2] wft] [ev]. + eexists. split; [ | eauto]. + unfold EEtaExpanded.expanded_eprogram_env_cstrs in *. + revert wft. move => /andP // [e1 e2]. cbn in *. + econstructor. eapply transform_blocks_eval; cbn; eauto. Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index f56783f91..5e3683b85 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -33,7 +33,7 @@ Definition atom Σ t := | tCoFix _ _ | tLambda _ _ | tFix _ _ => true - | tConstruct ind c => isSome (lookup_constructor Σ ind c) + | tConstruct ind c [] => isSome (lookup_constructor Σ ind c) | _ => false end. @@ -54,17 +54,17 @@ Proof. Qed. (* Tells if the evaluation relation should include match-prop and proj-prop reduction rules. *) -Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool }. +Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool ; with_constructor_as_block : bool }. Definition disable_prop_cases fl : WcbvFlags := - {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. + {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := fl.(@with_constructor_as_block) |}. Definition switch_unguarded_fix fl : WcbvFlags := - EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false. + EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false fl.(@with_constructor_as_block). -Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true |}. -Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true |}. -Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false |}. +Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true ; with_constructor_as_block := false |}. +Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true ; with_constructor_as_block := false|}. +Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := false |}. Section Wcbv. Context {wfl : WcbvFlags}. @@ -93,7 +93,19 @@ Section Wcbv. (** Case *) | eval_iota ind pars cdecl discr c args brs br res : - eval discr (mkApps (tConstruct ind c) args) -> + with_constructor_as_block = false -> + eval discr (mkApps (tConstruct ind c []) args) -> + constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> + nth_error brs c = Some br -> + #|args| = pars + cdecl.(cstr_nargs) -> + #|skipn pars args| = #|br.1| -> + eval (iota_red pars args br) res -> + eval (tCase (ind, pars) discr brs) res + + (** Case *) + | eval_iota_block ind pars cdecl discr c args brs br res : + with_constructor_as_block = true -> + eval discr (tConstruct ind c args) -> constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> nth_error brs c = Some br -> #|args| = pars + cdecl.(cstr_nargs) -> @@ -159,7 +171,18 @@ Section Wcbv. (** Proj *) | eval_proj p cdecl discr args a res : - eval discr (mkApps (tConstruct p.(proj_ind) 0) args) -> + with_constructor_as_block = false -> + eval discr (mkApps (tConstruct p.(proj_ind) 0 []) args) -> + constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> + #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> + nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> + eval a res -> + eval (tProj p discr) res + + (** Proj *) + | eval_proj_block p cdecl discr args a res : + with_constructor_as_block = true -> + eval discr (tConstruct p.(proj_ind) 0 args) -> constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> @@ -175,12 +198,21 @@ Section Wcbv. (** Constructor congruence: we do not allow over-applications *) | eval_construct ind c mdecl idecl cdecl f args a a' : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (mkApps (tConstruct ind c) args) -> + eval f (mkApps (tConstruct ind c []) args) -> #|args| < cstr_arity mdecl cdecl -> eval a a' -> - eval (tApp f a) (tApp (mkApps (tConstruct ind c) args) a') + eval (tApp f a) (tApp (mkApps (tConstruct ind c []) args) a') + (** Constructor congruence: we do not allow over-applications *) + | eval_construct_block ind c mdecl idecl cdecl args args' a a' : + with_constructor_as_block = true -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + #|args| < cstr_arity mdecl cdecl -> + eval (tConstruct ind c args) (tConstruct ind c args') -> + eval a a' -> + eval (tConstruct ind c (args ++ [a])) (tConstruct ind c (args' ++ [a'])) (** Atoms (non redex-producing heads) applied to values are values *) | eval_app_cong f f' a a' : @@ -214,9 +246,10 @@ Section Wcbv. Variant value_head (nargs : nat) : term -> Type := | value_head_cstr ind c mdecl idecl cdecl : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> nargs <= cstr_arity mdecl cdecl -> - value_head nargs (tConstruct ind c) + value_head nargs (tConstruct ind c []) | value_head_cofix mfix idx : value_head nargs (tCoFix mfix idx) | value_head_fix mfix idx rarg fn : cunfold_fix mfix idx = Some (rarg, fn) -> @@ -228,6 +261,11 @@ Section Wcbv. Inductive value : term -> Type := | value_atom t : atom Σ t -> value t + | value_constructor ind c mdecl idecl cdecl args : + with_constructor_as_block = true -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + #|args| <= cstr_arity mdecl cdecl -> + All value args -> value (tConstruct ind c args) | value_app_nonnil f args : value_head #|args| f -> args <> [] -> All value args -> value (mkApps f args). Derive Signature for value. @@ -245,19 +283,24 @@ Section Wcbv. Lemma value_app f args : value_head #|args| f -> All value args -> value (mkApps f args). Proof. destruct args. - - intros [] hv; constructor; try easy. cbn [atom mkApps]. now rewrite e. + - intros [] hv; constructor; try easy. cbn [atom mkApps]. now rewrite e0. - intros vh av. eapply value_app_nonnil => //. Qed. Lemma value_values_ind : forall P : term -> Type, (forall t, atom Σ t -> P t) -> + (forall (ind : inductive) (c : nat) (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body) + (args : list term) (e : with_constructor_as_block = true) (e0 : lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl)) + (l : #|args| <= cstr_arity mdecl cdecl) (a : All value args) , All P args -> + P (tConstruct ind c args)) -> (forall f args, value_head #|args| f -> args <> [] -> All value args -> All P args -> P (mkApps f args)) -> forall t : term, value t -> P t. Proof. - intros P ??. + intros P X X0 X1. fix value_values_ind 2. destruct 1. - apply X; auto. - - eapply X0; auto; tea. + - eapply X0; auto; tea. clear -a value_values_ind. induction a; econstructor; auto. + - eapply X1; auto; tea. clear v n. revert args a. fix aux 2. destruct 1. constructor; auto. constructor. now eapply value_values_ind. now apply aux. Defined. @@ -277,12 +320,19 @@ Section Wcbv. Lemma value_mkApps_inv t l : ~~ isApp t -> value (mkApps t l) -> - ((l = []) /\ atom Σ t) + ([× l <> [], value_head #|l| t & All value l]). + ((l = []) /\ atom Σ t) + + (l = [] × ∑ ind c mdecl idecl cdecl args, [ × with_constructor_as_block , lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl), t = tConstruct ind c args, #|args| <= cstr_arity mdecl cdecl & All value args]) + + ([× l <> [], value_head #|l| t & All value l]). Proof. intros H H'. generalize_eq x (mkApps t l). revert x H' t H. apply: value_values_ind. - intros. subst. now eapply atom_mkApps in H. + - intros * wcon lup len H IH t ht hcon. + destruct l using rev_ind. + + cbn in hcon. invs hcon. left. right. + repeat eexists; eauto. + + rewrite mkApps_app in hcon. invs hcon. - intros * vh nargs hargs ih t isapp appeq. move: (value_head_nApp vh) => Ht. right. apply mkApps_eq_inj in appeq => //. intuition subst; auto => //. @@ -294,8 +344,18 @@ Section Wcbv. All value l. Proof. intros val not_app. - now apply value_mkApps_inv in val as [(-> & ?)|[]]. + now apply value_mkApps_inv in val as [[(-> & ?) | [-> ] ] |[]]. Qed. + + Lemma eval_Construct_inv ind c args e : + eval (tConstruct ind c args) e -> + ∑ args', e = tConstruct ind c args' × All2 eval args args'. + Proof. + intros H. depind H. + - edestruct IHeval1 as (args'' & [= ->] & H2); eauto. + repeat eexists; eauto. eapply All2_app; eauto. + - invs i. destruct args; invs H0. exists []. repeat econstructor. + Qed. Lemma eval_to_value e e' : eval e e' -> value e'. Proof. @@ -304,7 +364,10 @@ Section Wcbv. - change (tApp ?h ?a) with (mkApps h [a]). rewrite -mkApps_app. apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [(-> & _)|[]]. + destruct IHev1 as [[(-> & _) | [-> ] ] |[]]. + + apply value_app; auto. len. + cbn in *. econstructor; tea. + destruct with_guarded_fix => //. cbn; auto. + apply value_app; auto. len. cbn in *. econstructor; tea. destruct with_guarded_fix => //. cbn; auto. @@ -314,12 +377,20 @@ Section Wcbv. len; lia. apply All_app_inv; auto. - apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [(-> & _)|[]]. + destruct IHev1 as [[(-> & _)|[-> ]] | []]. + + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply value_app. cbn; auto. econstructor; tea. cbn; len. eapply All_app_inv; auto. - + + - invs IHev1. + + invs H. destruct args'; invs H1. econstructor 2; eauto. len; lia. now econstructor. + + rewrite e0 in H3; invs H3. + eapply eval_Construct_inv in ev1 as (? & [= <-] & Hall). + econstructor 2; eauto. len. eapply All2_length in Hall. lia. + eapply All_app_inv; eauto. + + destruct H1. destruct args0 using rev_ind. eauto. rewrite mkApps_app in H. invs H. - destruct (mkApps_elim f' [a']). eapply value_mkApps_inv in IHev1 => //. destruct IHev1 as [?|[]]; intuition subst. @@ -332,6 +403,13 @@ Section Wcbv. now cbn in i. now cbn in i. + constructor. + econstructor; auto. + * destruct b0 as (ind & c & mdecl & idecl & cdecl & args & [H1 H2 H3 H4]). + rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). + rewrite a0 in i |- *. simpl in *. + apply (value_app f0 [a']). + destruct f0; simpl in * |- *; try congruence. + + rewrite !negb_or /= in i; rtoProp; intuition auto. + + destruct with_guarded_fix. now cbn in i. now cbn in i. * rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). eapply value_app; eauto with pcuic. 2:eapply All_app_inv; auto. len. @@ -353,7 +431,7 @@ Section Wcbv. value_head n t -> eval t t. Proof. destruct 1. - - constructor; try easy. now cbn [atom]; rewrite e. + - constructor; try easy. now cbn [atom]; rewrite e0. - now eapply eval_atom. - now eapply eval_atom. Qed. @@ -364,7 +442,7 @@ Section Wcbv. Lemma value_head_spec' n t : value_head n t -> (~~ (isLambda t || isBox t)) && atom Σ t. Proof. - induction 1; auto. cbn [atom]; rewrite e //. + induction 1; auto. cbn [atom]; rewrite e0 //. Qed. @@ -484,6 +562,7 @@ Section Wcbv. - destruct L using rev_ind. reflexivity. rewrite mkApps_app in i. inv i. + - EAstUtils.solve_discr. - EAstUtils.solve_discr. depelim v. Qed. @@ -528,6 +607,8 @@ Section Wcbv. unfold atom in isatom. destruct argsv using rev_case => //. split; auto. simpl. simpl in isatom. rewrite H //. rewrite mkApps_app /= // in isatom. + - intros. destruct argsv using rev_case => //. + rewrite mkApps_app in Heqtfix => //. - intros * vf hargs vargs ihargs eq. solve_discr => //. depelim vf. rewrite e. intros [= <- <-]. destruct with_guarded_fix => //. split => //. unfold isStuckFix. rewrite e. now apply Nat.leb_le. @@ -546,13 +627,14 @@ Section Wcbv. Qed. Lemma eval_mkApps_Construct ind c mdecl idecl cdecl f args args' : + with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (tConstruct ind c) -> + eval f (tConstruct ind c []) -> #|args| <= cstr_arity mdecl cdecl -> All2 eval args args' -> - eval (mkApps f args) (mkApps (tConstruct ind c) args'). + eval (mkApps f args) (mkApps (tConstruct ind c []) args'). Proof. - intros hdecl evf hargs. revert args'. + intros hblock hdecl evf hargs. revert args'. induction args using rev_ind; intros args' evargs. - depelim evargs. now cbn. - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. @@ -564,6 +646,23 @@ Section Wcbv. rewrite -(All2_length evl). lia. Qed. + Lemma eval_mkApps_Construct_block ind c mdecl idecl cdecl f args args' : + with_constructor_as_block -> + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + eval f (tConstruct ind c []) -> + #|args| <= cstr_arity mdecl cdecl -> + All2 eval args args' -> + eval (tConstruct ind c args) (tConstruct ind c args'). + Proof. + intros hblock hdecl evf hargs. revert args'. + induction args using rev_ind; intros args' evargs. + - depelim evargs. econstructor. now cbn [atom]; rewrite hdecl. + - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. + depelim evr. depelim evr. + eapply eval_construct_block; tea. 1: revert hargs; len. + eapply IHargs => //. 1: revert hargs; len. + Qed. + Lemma eval_mkApps_CoFix f mfix idx args args' : eval f (tCoFix mfix idx) -> All2 eval args args' -> @@ -620,6 +719,14 @@ Section Wcbv. Proof. move: e; eapply value_values_ind; simpl; intros; eauto with value. - now constructor. + - assert (All2 eval args args). + { clear -X; induction X; constructor; auto. } + induction args using rev_ind. repeat econstructor. + cbn [atom]; now rewrite e0. + eapply All_app in a as [? HH]; eauto; invs HH. + eapply All_app in X as [? HH]; eauto; invs HH. + eapply All2_app_inv in X0 as [? HH]; eauto; invs HH. + econstructor; eauto. revert l. len. eapply IHargs; eauto. revert l. len. - assert (All2 eval args args). { clear -X0; induction X0; constructor; auto. } eapply eval_mkApps_cong => //. now eapply value_head_final. @@ -656,9 +763,18 @@ Section Wcbv. apply mkApps_eq_inj in apps_eq as (eq1 & eq2); try easy. noconf eq1. noconf eq2. noconf IHev1. - pose proof e0. rewrite e4 in H. noconf H. - pose proof e as e'. rewrite e3 in e'. noconf e'. - rewrite -> (uip e e3), (uip e0 e4), (uip e1 e5), (uip e2 e6). + pose proof e0. rewrite e5 in H. noconf H. + pose proof e as e'. rewrite e4 in e'. noconf e'. + assert (br0 = br) as -> by congruence. + rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). + specialize (IHev2 _ ev'2); noconf IHev2. + reflexivity. + - depelim ev'; try go. + + specialize (IHev1 _ ev'1); noconf IHev1. + pose proof e0. rewrite e5 in H. noconf H. + pose proof e as e'. rewrite e4 in e'. noconf e'. + assert (br0 = br) as -> by congruence. + rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). specialize (IHev2 _ ev'2); noconf IHev2. reflexivity. - depelim ev'; try go. @@ -760,27 +876,48 @@ Section Wcbv. specialize (IHev1 _ ev'1). pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. noconf IHev1. - pose proof e as e'. rewrite e2 in e'; noconf e'. - rewrite -> (uip e e2), (uip e0 e3). - pose proof e4 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite (uip e1 e4). + assert (a0 = a) as -> by congruence. + pose proof e0 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e e3), (uip e0 e4). + pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. + rewrite -> (uip e1 e5), (uip e2 e6). + now specialize (IHev2 _ ev'2); noconf IHev2. + - depelim ev'; try go. + specialize (IHev1 _ ev'1); noconf IHev1. + assert (a0 = a) as -> by congruence. + pose proof e0 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e e3), (uip e0 e4). + pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. + rewrite -> (uip e1 e5), (uip e2 e6). now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. specialize (IHev _ ev'). noconf IHev. rewrite (uip e e0). now rewrite (uip i i0). - - depelim ev'; try go. + - depelim ev'; try now go. + move: (IHev1 _ ev'1). eapply DepElim.simplification_sigma1 => heq IHev1'. apply mkApps_eq_inj in heq as H'; auto. destruct H' as (H' & <-). noconf H'. noconf IHev1'. - pose proof e as e'. rewrite e0 in e'; noconf e'. + pose proof e0 as e'. rewrite e2 in e'; noconf e'. specialize (IHev2 _ ev'2). noconf IHev2. - now rewrite -> (uip e e0), (PCUICWcbvEval.le_irrel _ _ l l0). + now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + specialize (IHev1 _ ev'1). noconf IHev1. exfalso. rewrite isConstructApp_mkApps in i. cbn in i. rewrite !negb_or in i. rtoProp; intuition auto. + - depelim ev'; try go. + + eapply app_inj_tail in e3 as e4. destruct e4 as [-> ->]. + rewrite (uip e3 eq_refl) in H. cbn in H. subst. + move: (IHev1 _ ev'1). + eapply DepElim.simplification_sigma1 => heq IHev1'. + noconf heq. + noconf IHev1'. + specialize (IHev2 _ ev'2). noconf IHev2. + pose proof e2 as E. + rewrite e0 in E. noconf E. + now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + + exfalso. invs i. destruct args; invs H0. - depelim ev'; try go. + exfalso. rewrite !negb_or in i. specialize (IHev1 _ ev'1); noconf IHev1. cbn in i. rtoProp; intuition auto. @@ -799,7 +936,8 @@ Section Wcbv. specialize (IHev2 _ ev'2); noconf IHev2. now assert (i0 = i) as -> by now apply uip. - depelim ev'; try go. - now assert (i0 = i) as -> by now apply uip. + 2: now assert (i0 = i) as -> by now apply uip. + exfalso. invs i. destruct args; cbn in H0; invs H0. Qed. Lemma eval_unique {t v} : @@ -954,7 +1092,7 @@ Section WcbvEnv. eauto using (extends_lookup_constructor wf ex), (extends_constructor_isprop_pars_decl wf ex), (extends_is_propositional wf ex)]. econstructor; eauto. red in isdecl |- *. eauto using extends_lookup. constructor. - destruct t => //. cbn [atom] in i. destruct lookup_constructor eqn:hl => //. + destruct t => //. cbn [atom] in i. destruct l => //. destruct lookup_constructor eqn:hl => //. eapply (extends_lookup_constructor wf ex) in hl. now cbn [atom]. Qed. @@ -1077,7 +1215,12 @@ Proof. move: IHev1; rewrite closedn_mkApps => /andP[] _ clargs. apply IHev2. rewrite /iota_red. eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e2. eapply nth_error_forallb in Hc'; tea. + len. rewrite e3. eapply nth_error_forallb in Hc'; tea. + now rewrite Nat.add_0_r in Hc'. + - specialize (IHev1 Hc). + apply IHev2. rewrite /iota_red. + eapply closed_substl. now rewrite forallb_rev forallb_skipn. + len. rewrite e3. eapply nth_error_forallb in Hc'; tea. now rewrite Nat.add_0_r in Hc'. - subst brs. cbn in Hc'. rewrite andb_true_r in Hc'. eapply IHev2. eapply closed_substl. @@ -1113,9 +1256,15 @@ Proof. rewrite closedn_mkApps /= => clargs. eapply IHev2; eauto. eapply nth_error_forallb in clargs; tea. + - have := (IHev1 Hc). intros clargs. + eapply IHev2; eauto. + eapply nth_error_forallb in clargs; tea. - have := (IHev1 Hc). rewrite closedn_mkApps /= => clargs. rewrite clargs IHev2 //. + - rtoProp; intuition auto. forward IHev1; solve_all; + eapply All_app in Hc; solve_all. + eapply All_app_inv; solve_all. invs b. econstructor. eauto. econstructor. - rtoProp; intuition auto. Qed. @@ -1126,10 +1275,11 @@ Ltac forward_keep H := assert (H' : X) ; [|specialize (H H')] end. -Definition mk_env_flags has_ax has_pars tfl := +Definition mk_env_flags has_ax has_pars tfl has_blocks := {| has_axioms := has_ax; has_cstr_params := has_pars; - term_switches := tfl |}. + term_switches := tfl ; + cstr_as_blocks := has_blocks |}. Global Hint Rewrite andb_true_r andb_false_r : simplifications. Global Hint Rewrite orb_false_r orb_true_r : simplifications. @@ -1140,16 +1290,22 @@ Ltac sim := repeat (cbn ; autorewrite with simplifications). Lemma eval_wellformed {efl : EEnvFlags} {wfl : WcbvFlags} Σ : forall (has_app : has_tApp), (* necessary due to mkApps *) + efl.(cstr_as_blocks) = false -> wf_glob Σ -> forall t u, wellformed Σ 0 t -> eval Σ t u -> wellformed Σ 0 u. Proof. - move=> has_app clΣ t u Hc ev. move: Hc. + move=> has_app blcks clΣ t u Hc ev. move: Hc. induction ev; simpl in *; auto; (move/andP=> [/andP[Hc Hc'] Hc''] || move/andP=> [Hc Hc'] || move=>Hc); auto. all:intros; intuition auto; rtoProp; intuition auto; rtoProp; eauto using wellformed_csubst. - eapply IHev2; eauto. eapply wellformed_iota_red_brs; tea => //. rewrite wellformed_mkApps // in H2. move/andP: H2 => [] //. + - eapply IHev2; eauto. + eapply wellformed_iota_red_brs; tea => //. + destruct cstr_as_blocks; solve_all. + destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. + destruct args; cbn in H3; eauto; econstructor. - subst brs. eapply IHev2. sim in H0. eapply wellformed_substl => //. eapply All_forallb, All_repeat => //. @@ -1177,6 +1333,13 @@ Proof. eapply IHev2; eauto. move/andP: clargs => [/andP[] hasc wfc wfargs]. eapply nth_error_forallb in wfargs; tea. + - eapply IHev2. + eapply nth_error_forallb in e2; eauto. + destruct cstr_as_blocks; eauto. + destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. + destruct args; cbn in H0; eauto. + - destruct cstr_as_blocks; try congruence. + now destruct args; invs Hc''. Qed. Lemma remove_last_length {X} {l : list X} : @@ -1237,6 +1400,9 @@ Proof. - unshelve eexists; eauto. eapply eval_fix_value; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. - unshelve eexists. eapply eval_construct; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. cbn. lia. + - unshelve eexists. eapply eval_construct_block; eauto. + { clear - l He1. eapply eval_Construct_inv in He1 as (? & ? & ?). eapply All2_length in a. invs e. lia. } + eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2; lia. - unshelve eexists. eapply eval_app_cong; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. Qed. @@ -1360,11 +1526,13 @@ Proof. Qed. Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e : - eval Σ (mkApps (tConstruct kn c) args) e -> - ∑ args', [× isSome (lookup_constructor Σ kn c), (e = mkApps (tConstruct kn c) args') & All2 (eval Σ) args args']. + with_constructor_as_block = false -> + eval Σ (mkApps (tConstruct kn c []) args) e -> + ∑ args', [× isSome (lookup_constructor Σ kn c), (e = mkApps (tConstruct kn c []) args') & All2 (eval Σ) args args']. Proof. + intros hblock. revert e; induction args using rev_ind; intros e. - - intros ev. depelim ev. exists []=> //. + - intros ev. depelim ev. congruence. exists []=> //. - intros ev. rewrite mkApps_app /= in ev. depelim ev; try solve_discr. destruct (IHargs _ ev1) as [? []]. solve_discr. @@ -1378,6 +1546,25 @@ Proof. * now cbn in i. Qed. +Lemma eval_mkApps_Construct_block_inv {fl : WcbvFlags} Σ kn c args oargs e : + with_constructor_as_block -> + eval Σ (mkApps (tConstruct kn c args) oargs) e -> + ∑ args', oargs = [] × (e = tConstruct kn c args') × All2 (eval Σ) args args'. +Proof. + intros hblock. + revert e; induction oargs using rev_ind; intros e. + - intros ev. depelim ev. + + eexists. split. reflexivity. split. reflexivity. + eapply eval_Construct_inv in ev1 as (? & [= <-] & ?). + eapply All2_app; eauto. + + invs i. destruct args; invs H0. exists []. repeat econstructor. + - intros ev. rewrite mkApps_app /= in ev. + depelim ev; try solve_discr. + all: try specialize (IHoargs _ ev1) as (? & ? & E & ?); try congruence; try solve_discr; try noconf E. + * subst. cbn in i. destruct with_guarded_fix; cbn in *; eauto. + * invs i. +Qed. + Lemma eval_mkApps_inv_size {wfl : WcbvFlags} {Σ f args v} : forall ev : eval Σ (mkApps f args) v, ∑ f' args' (evf : eval Σ f f'), @@ -1466,31 +1653,33 @@ Proof. Qed. Lemma eval_mkApps_Construct_size {wfl : WcbvFlags} {Σ ind c args v} : - forall ev : eval Σ (mkApps (tConstruct ind c) args) v, - ∑ args' (evf : eval Σ (tConstruct ind c) (tConstruct ind c)), + with_constructor_as_block = false -> + forall ev : eval Σ (mkApps (tConstruct ind c []) args) v, + ∑ args' (evf : eval Σ (tConstruct ind c []) (tConstruct ind c [])), [× eval_depth evf <= eval_depth ev, All2 (fun a a' => ∑ eva : eval Σ a a', eval_depth eva < eval_depth ev) args args' & - v = mkApps (tConstruct ind c) args']. + v = mkApps (tConstruct ind c []) args']. Proof. - intros ev. + intros hblock ev. destruct (eval_mkApps_inv_size ev) as [f'' [args' [? []]]]. exists args'. - destruct (eval_mkApps_Construct_inv _ _ _ _ _ ev) as [? []]. subst v. - exists (eval_atom _ (tConstruct ind c) i). + destruct (eval_mkApps_Construct_inv _ _ _ _ _ hblock ev) as [? []]. subst v. + exists (eval_atom _ (tConstruct ind c []) i). cbn. split => //. destruct ev; cbn => //; auto with arith. clear l. - eapply (eval_mkApps_Construct_inv _ _ _ []) in x as [? []]. subst f''. depelim a1. + eapply (eval_mkApps_Construct_inv _ _ _ [] _ hblock) in x as [? []]; auto. subst f''. depelim a1. f_equal. eapply eval_deterministic_all; tea. - eapply All2_impl; tea; cbn; eauto. now intros x y []. + eapply All2_impl; tea; cbn; eauto. now intros x y []. Qed. -Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : - forall (ev : eval Σ (mkApps (tConstruct kn c) args) e), - ∑ args', (e = mkApps (tConstruct kn c) args') × +Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : + with_constructor_as_block = false -> + forall (ev : eval Σ (mkApps (tConstruct kn c []) args) e), + ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (fun x y => ∑ ev' : eval Σ x y, eval_depth ev' < eval_depth ev) args args'. Proof. - intros ev; destruct (eval_mkApps_Construct_size ev) as [args'[evf [_ hargs hv]]]. + intros hblock ev; destruct (eval_mkApps_Construct_size hblock ev) as [args'[evf [_ hargs hv]]]. exists args'; intuition auto. Qed. @@ -1505,5 +1694,4 @@ Proof. depelim H2. specialize (IHx e _ H' H). simpl. rewrite mkApps_app. simpl. econstructor; eauto. -Qed. - +Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index 2c3ae7d7b..927479125 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -14,14 +14,14 @@ Hint Constructors eval : core. Definition atomic_term (t : term) := match t with - | tBox | tConstruct _ _ | tConst _ | tRel _ | tVar _ => true + | tBox | tConstruct _ _ _ | tConst _ | tRel _ | tVar _ => true | _ => false end. Definition has_atom {etfl : ETermFlags} (t : term) := match t with | tBox => has_tBox - | tConstruct _ _ => has_tConstruct + | tConstruct _ _ _ => has_tConstruct | tConst _ => has_tConst | tRel _ => has_tRel | tVar _ => has_tVar @@ -143,7 +143,7 @@ Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := Set Warnings "+future-coercion-class-field". Lemma eval_preserve_mkApps_ind : -∀ (wfl : WcbvFlags) {efl : EEnvFlags} (Σ : global_declarations) +∀ (wfl : WcbvFlags), with_constructor_as_block = false -> forall {efl : EEnvFlags} (Σ : global_declarations) (P' : term → term → Type) (Q : nat -> term -> Type) {Qpres : Qpreserves Q Σ} @@ -177,8 +177,8 @@ Lemma eval_preserve_mkApps_ind : (list name × term)) (br : list name × term) (res : term), forallb (λ x : list name × term, isEtaExp Σ x.2) brs -> - eval Σ discr (mkApps (tConstruct ind c) args) - → P discr (mkApps (tConstruct ind c) args) + eval Σ discr (mkApps (tConstruct ind c []) args) + → P discr (mkApps (tConstruct ind c []) args) → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) → nth_error brs c = Some br → #|args| = pars + cdecl.(cstr_nargs) @@ -282,8 +282,8 @@ Lemma eval_preserve_mkApps_ind : → (∀ p cdecl (discr : term) (args : list term) a (res : term), has_tProj -> eval Σ discr - (mkApps (tConstruct p.(proj_ind) 0) args) - → P discr (mkApps (tConstruct p.(proj_ind) 0) args) + (mkApps (tConstruct p.(proj_ind) 0 []) args) + → P discr (mkApps (tConstruct p.(proj_ind) 0 []) args) → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a @@ -310,15 +310,15 @@ Lemma eval_preserve_mkApps_ind : #|args| = cstr_arity mdecl cdecl -> All2 (eval Σ) args args' -> isEtaExp_app Σ ind i #|args| -> - Q 0 (mkApps (tConstruct ind i) args) -> - Q 0 (mkApps (tConstruct ind i) args') -> + Q 0 (mkApps (tConstruct ind i []) args) -> + Q 0 (mkApps (tConstruct ind i []) args') -> All2 P args args' -> - P' (mkApps (tConstruct ind i) args) (mkApps (tConstruct ind i) args')) → + P' (mkApps (tConstruct ind i []) args) (mkApps (tConstruct ind i []) args')) → (∀ t : term, atom Σ t → Q 0 t -> isEtaExp Σ t -> P' t t) -> ∀ (t t0 : term), Q 0 t -> isEtaExp Σ t -> eval Σ t t0 → P' t t0. Proof. - intros * Qpres P P'Q etaΣ wfΣ hasapp. + intros wfl hcon. intros * Qpres P P'Q etaΣ wfΣ hasapp. assert (qfixs: Qfixs Q) by tc. assert (qcofixs: Qcofixs Q) by tc. intros. @@ -364,22 +364,22 @@ Proof. eapply H; tea; (apply and_assum; [ih|hp' P'Q]) end. destruct ev. - 1-15:eapply qpres in qt as qt'; depelim qt' => //. + 1-18:eapply qpres in qt as qt'; depelim qt' => //. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply X; tea; (apply and_assum; [ih|hp' P'Q]). iheta q. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (ql : Q 0 (tLambda na b)). { eapply P'Q; tea. ih. } @@ -406,25 +406,26 @@ Proof. - simp_eta. move=> /andP[etad etabrs]. assert (isEtaExp Σ (iota_red pars args br)). { eapply isEtaExp_iota_red. - assert (isEtaExp Σ (mkApps (tConstruct ind c) args)) by iheta q. - rewrite isEtaExp_mkApps_napp /= // in H. + assert (isEtaExp Σ (mkApps (tConstruct ind c []) args)) by iheta q. + rewrite isEtaExp_mkApps_napp /= // in H. rewrite andb_true_r in H. now move/andP: H => []. - now clear IH; eapply nth_error_forallb in e0; tea. } + now clear IH; eapply nth_error_forallb in e1; tea. } assert (Q 0 (iota_red pars args br)). { unfold iota_red. eapply nth_error_all in a; tea. cbn in a. - rewrite -e2 in a. + rewrite -e3 in a. rewrite -(List.rev_length (skipn pars args)) in a. rewrite Nat.add_0_r in a. eapply (qsubst _ (List.rev (skipn pars args))) in a. 2:{ eapply All_rev, All_skipn. - assert (Q 0 (mkApps (tConstruct ind c) args)). + assert (Q 0 (mkApps (tConstruct ind c []) args)). eapply P'Q; tea; ih. eapply qapp in X13; tea. eapply X13. } exact a. } split. eapply X2; tea. 1,3:(apply and_assum; [ih|hp' P'Q]). eapply nth_error_all in a; tea; cbn. now rewrite Nat.add_0_r in a. iheta X13. + - congruence. - simp_eta; move=> /andP[etad etabrs]. assert (isEtaExp Σ (substl (repeat tBox #|n|) f)). { eapply isEtaExp_substl => //. rewrite forallb_repeat //. @@ -440,9 +441,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. pose proof (ev1' := ev1). eapply P'Q in ev1' => //. 2:{ clear ev1'; ih. } eapply qapp in ev1' as [hfix qargs] => //. @@ -474,9 +475,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (isEtaExp Σ (tApp (mkApps (tFix mfix idx) argsv) av)). { rewrite -[tApp _ _](mkApps_app _ _ [av]). @@ -490,9 +491,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. * move=> /and4P [] etat0 etaargs etaa etat. assert (qav : Q 0 av). { eapply P'Q; tea; ih. } @@ -573,13 +574,14 @@ Proof. { eapply nth_error_all in qargs; tea. } clear ev1'; ih. } assert (isEtaExp Σ a). - { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0) args)) by iheta q. + { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0 []) args)) by iheta q. move: H; simp_eta. rewrite isEtaExp_mkApps_napp // /=. - move=> /andP[] etaapp etaargs. - eapply nth_error_forallb in etaargs; tea. } + move=> /andP[] /andP[] etaapp etaargs. + eapply nth_error_forallb in etaargs; tea. eauto. } split. eapply X10; tea; (apply and_assum; [ih|hp' P'Q]). iheta X13. + - congruence. - simp_eta => etadiscr. split. unshelve eapply X11; tea; try (intros; apply and_assum; [ih|hp' P'Q]). now idtac. @@ -587,11 +589,11 @@ Proof. rename args into cargs. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. - pose proof (eval_construct_size ev1') as [ex []]. + pose proof (eval_construct_size hcon ev1') as [ex []]. cbn in IH. intros eq. assert (All2 (λ x y : term, ∑ ev' : eval Σ x y, eval_depth ev' < S (Nat.max (eval_depth ev1) (eval_depth ev2))) (remove_last args ++ [a]) (ex ++ [a'])). @@ -615,12 +617,12 @@ Proof. eapply All2_All_mix_left in X15. 2:exact X14. eapply All2_All_right; tea; cbn. intros ? ? [? [? [? []]]]. split. eapply P'Q; tea. apply p. apply p. } - eapply mkApps_eq_inj in e0 as [] => //. subst ex. noconf H. + eapply mkApps_eq_inj in e1 as [] => //. subst ex. noconf H. split. unshelve eapply Xcappexp; tea. + rewrite ht -remove_last_last //. move: etaind; rewrite /isEtaExp_app. - rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e). + rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e0). move/Nat.leb_le. move: l. rewrite /cstr_arity. eapply All2_length in X13. move: X13. rewrite ht /= -remove_last_last //. len. @@ -641,26 +643,28 @@ Proof. + rewrite isEtaExp_Constructor. apply/andP. split. rewrite -(All2_length X16). rewrite ht -remove_last_last //. - eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. + rtoProp. split. eauto. + eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. auto. * move=> /and4P [] etat0 etaargs etaa etat. rewrite -[tApp _ a'](mkApps_app _ _ [a']). - assert (P' f (mkApps (tConstruct ind c) cargs) × isEtaExp Σ (mkApps (tConstruct ind c) cargs)). + assert (P' f (mkApps (tConstruct ind c []) cargs) × isEtaExp Σ (mkApps (tConstruct ind c []) cargs)). { unshelve eapply IH; tea. cbn. lia. } elimtype False. destruct X13 as [p'f etac]. move: etac. rewrite isEtaExp_Constructor. move/andP => []. rewrite /isEtaExp_app. - rewrite /lookup_constructor_pars_args e /=. - move/Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. + rewrite /lookup_constructor_pars_args e0 /=. + move => /andP[] /Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. + - congruence. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. + * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. exfalso. eapply eval_mkApps_Construct_inv in ev1' as [? [hf' hargs']]. subst f'. - clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. + clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. auto. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply (X12 _ _ _ _ ev1); tea. 1,3:(apply and_assum; [ih|hp' P'Q]). @@ -690,18 +694,19 @@ Ltac destruct_nary_times := | [ H : [× _, _, _, _ & _] |- _ ] => destruct H end. -Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : + with_constructor_as_block = false -> isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ a -> isEtaExp Σ a'. Proof. - intros etaΣ wfΣ ev eta. + intros hcon etaΣ wfΣ ev eta. generalize I. intros q. revert a a' q eta ev. - eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. + eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. all:intros; repeat destruct_nary_times. all:intuition auto. - rewrite isEtaExp_Constructor => //. - rewrite -(All2_length X0) H1. + rewrite -(All2_length X0) H1. cbn. rtoProp; intuition eauto. cbn; eapply All_forallb. eapply All2_All_right; tea. cbn. intros x y []; auto. Qed. diff --git a/erasure/theories/EWcbvEvalInd.v b/erasure/theories/EWcbvEvalInd.v index 9c14cc8e6..5d1e69291 100644 --- a/erasure/theories/EWcbvEvalInd.v +++ b/erasure/theories/EWcbvEvalInd.v @@ -37,18 +37,36 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.csubst b0' 0 b1) res → P (ECSubst.csubst b0' 0 b1) res → P (tLetIn na b0 b1) res) - → (∀ (ind : Kernames.inductive) (pars : nat) cdecl (discr : term) - (c : nat) (args : list term) (brs : list (list BasicAst.name × term)) - (br : list BasicAst.name × term) (res : term), - eval Σ discr (mkApps (tConstruct ind c) args) - → P discr (mkApps (tConstruct ind c) args) - → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) - → nth_error brs c = Some br - → #|args| = pars + cdecl.(cstr_nargs) - → #|skipn pars args| = #|br.1| - → eval Σ (iota_red pars args br) res - → P (iota_red pars args br) res - → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = false) + (e0 : eval Σ discr (mkApps (tConstruct ind c []) args)), + P discr (mkApps (tConstruct ind c []) args) + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) (e2 : + nth_error brs c = + Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res + → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = true) + (e0 : eval Σ discr (tConstruct ind c args)), + P discr (tConstruct ind c args) + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) + (e2 : nth_error brs c = Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res + → P (tCase (ind, pars) discr brs) res) + → (∀ (ind : Kernames.inductive) (pars : nat) (discr : term) (brs : list (list BasicAst.name × term)) (n : list BasicAst.name) (f3 res : term), @@ -60,6 +78,7 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.substl (repeat tBox #|n|) f3) res → P (ECSubst.substl (repeat tBox #|n|) f3) res → P (tCase (ind, pars) discr brs) res) + → (∀ (f4 : term) (mfix : mfixpoint term) (idx : nat) (argsv : list term) (a av fn res : term), @@ -121,16 +140,47 @@ Section eval_mkApps_rect. cst_body decl = Some body → eval Σ body res → P body res → P (tConst c) res) - → (∀ p (discr : term) (args : list term) - (res : term) cdecl a, - eval Σ discr (mkApps (tConstruct p.(proj_ind) 0) args) - → P discr (mkApps (tConstruct p.(proj_ind) 0) args) - → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) - → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) - -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a - -> eval Σ a res - → P a res - → P (tProj p discr) res) + + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : with_constructor_as_block = + false) + (e0 : eval Σ discr + (mkApps + (tConstruct + (proj_ind p) 0 []) args)), + P discr + (mkApps + (tConstruct (proj_ind p) 0 []) + args) + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res + → P (tProj p discr) res) + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : + with_constructor_as_block = + true) + (e0 : eval Σ discr + (tConstruct (proj_ind p) 0 args)), + P discr (tConstruct (proj_ind p) 0 args) + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res + → P (tProj p discr) res) → (∀ p (discr : term), with_prop_case @@ -139,30 +189,72 @@ Section eval_mkApps_rect. → inductive_isprop_and_pars Σ p.(proj_ind) = Some (true, p.(proj_npars)) → P (tProj p discr) tBox) - → (∀ ind c mdecl idecl cdecl f args a a', - lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - forall (ev : eval Σ f (mkApps (tConstruct ind c) args)), - IH _ _ ev -> + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (f14 : term) (args : list term) + (a a' : term) + (e : with_constructor_as_block = false) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (e1 : eval Σ f14 + (mkApps + (tConstruct ind c []) + args)), + IH _ _ e1 -> + P f14 + (mkApps (tConstruct ind c []) + args) + → ∀ (l : #|args| < cstr_arity mdecl cdecl) + (e2 : eval Σ a a'), + P a a' + → P (tApp f14 a) + (tApp + (mkApps + (tConstruct ind c + []) args) a')) - P f (mkApps (tConstruct ind c) args) -> - #|args| < cstr_arity mdecl cdecl -> - eval Σ a a' -> - P a a' -> - P (tApp f a) (tApp (mkApps (tConstruct ind c) args) a')) + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (args args' : + list term) (a a' : term) + (e : with_constructor_as_block = true) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (l : #|args| < cstr_arity mdecl cdecl) + (e1 : eval Σ + (tConstruct ind c args) + (tConstruct ind c args')), + P (tConstruct ind c args) + (tConstruct ind c args') + → ∀ e2 : eval Σ a a', + P a a' + → P (tConstruct ind c (args ++ [a])) + (tConstruct ind c + (args' ++ [a']))) - → (∀ (f11 f' : term) a a' , - forall (ev : eval Σ f11 f'), - P f11 f' -> - IH _ _ ev - → ~~ (isLambda f' || (if with_guarded_fix then isFixApp f' else isFix f') || isBox f' - || isConstructApp f') - → eval Σ a a' - → P a a' - → P (tApp f11 a) (tApp f' a')) + → (∀ (f15 f' a a' : term) (e : eval Σ f15 f'), + P f15 f' -> IH _ _ e + → ∀ (i : ~~ + (isLambda f' + || + (if with_guarded_fix + then isFixApp f' + else isFix f') || + isBox f' || + isConstructApp f')) + (e0 : eval Σ a a'), + P a a' + → P (tApp f15 a) + (tApp f' a') + ) → (∀ t : term, atom Σ t → P t t) → ∀ t t0 : term, eval Σ t t0 → P t t0. Proof using Type. - intros ?????????????????? H. + intros ????????????????????? H. pose proof (p := @Fix_F { t : _ & { t0 : _ & eval Σ t t0 }}). specialize (p (MR lt (fun x => eval_depth x.π2.π2))). set(foo := existT _ t (existT _ t0 H) : { t : _ & { t0 : _ & eval Σ t t0 }}). @@ -193,4 +285,3 @@ Proof using Type. Qed. End eval_mkApps_rect. - diff --git a/erasure/theories/EWellformed.v b/erasure/theories/EWellformed.v index 68412ffc1..61ea8148a 100644 --- a/erasure/theories/EWellformed.v +++ b/erasure/theories/EWellformed.v @@ -39,7 +39,9 @@ Set Warnings "-future-coercion-class-field". Class EEnvFlags := { has_axioms : bool; has_cstr_params : bool; - term_switches :> ETermFlags }. + term_switches :> ETermFlags ; + cstr_as_blocks : bool ; + }. Set Warnings "+future-coercion-class-field". Definition all_term_flags := @@ -61,7 +63,14 @@ Definition all_term_flags := Definition all_env_flags := {| has_axioms := true; term_switches := all_term_flags; - has_cstr_params := true |}. + has_cstr_params := true ; + cstr_as_blocks := false |}. + +Definition all_env_flags_blocks := + {| has_axioms := true; + term_switches := all_term_flags; + has_cstr_params := true ; + cstr_as_blocks := true |}. Section wf. @@ -78,6 +87,8 @@ Section wf. Definition wf_fix_gen (wf : nat -> term -> bool) k mfix idx := let k' := List.length mfix + k in (idx true | _ => false end. Fixpoint wellformed k (t : term) : bool := match t with @@ -98,7 +109,7 @@ Section wf. | Some d => has_axioms || isSome d.(cst_body) | _ => false end - | tConstruct ind c => has_tConstruct && isSome (lookup_constructor Σ ind c) + | tConstruct ind c block_args => has_tConstruct && isSome (lookup_constructor Σ ind c) && if cstr_as_blocks then match lookup_constructor_pars_args Σ ind c with Some (p, a) => p + a <=? #|block_args| | _ => true end && forallb (wellformed k) block_args else is_nil block_args | tVar _ => has_tVar end. @@ -160,7 +171,9 @@ Section EEnvFlags. autorewrite with map; simpl wellformed in *; intuition auto; unfold wf_fix, test_def, test_snd in *; - try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. + try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. + destruct cstr_as_blocks. 2: destruct args; eauto; solve_all. + rtoProp. solve_all. Qed. Lemma wellformed_closed_decl {t} : wf_global_decl Σ t -> closed_decl t. @@ -178,7 +191,9 @@ Section EEnvFlags. simpl wellformed in *; intuition auto; unfold wf_fix, test_def, test_snd in *; try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. - eapply Nat.ltb_lt. now eapply Nat.ltb_lt in H2. + - eapply Nat.ltb_lt. now eapply Nat.ltb_lt in H2. + - destruct cstr_as_blocks; eauto. solve_all. + destruct lookup_constructor_pars_args as [ [] |]; rtoProp; repeat solve_all. Qed. Lemma wellformed_lift n k k' t : wellformed k t -> wellformed (k + n) (lift n k' t). @@ -195,6 +210,8 @@ Section EEnvFlags. elim (Nat.ltb_spec); auto. apply Nat.ltb_lt in H1. lia. simpl; rewrite H0 /=. elim (Nat.ltb_spec); auto. intros. apply Nat.ltb_lt in H1. lia. + - destruct cstr_as_blocks; eauto. destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. + destruct args; firstorder. - solve_all. rewrite Nat.add_assoc. eauto. - len. move/andP: H1 => [] -> ha. cbn. solve_all. rewrite Nat.add_assoc; eauto. @@ -233,6 +250,8 @@ Section EEnvFlags. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. eapply IHt2; auto. + - destruct cstr_as_blocks; eauto. + destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. now destruct args; inv H0. - specialize (a (#|x.1| + k')) => //. rewrite Nat.add_assoc (Nat.add_comm k) in a. rewrite !Nat.add_assoc. eapply a => //. @@ -437,6 +456,8 @@ Proof. induction t using EInduction.term_forall_list_ind; cbn => //; intros; rtoProp; intuition auto; solve_all. all:try destruct lookup_env eqn:hl => //; try rewrite (extends_lookup wf ex hl). all:try destruct g => //. + - destruct cstr_as_blocks; eauto; solve_all. + destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. - move/andP: H0 => [] hn hf. unfold wf_fix. rewrite hn /=. solve_all. - move/andP: H0 => [] hn hf. unfold wf_fix. rewrite hn /=. solve_all. Qed. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index 3288adb96..3349efccc 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -40,17 +40,17 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf (* Simulation of the guarded fixpoint rules with a single unguarded one: the only "stuck" fixpoints remaining are unapplied. This translation is a noop on terms and environments. *) - guarded_to_unguarded_fix eq_refl ▷ + guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ (* Remove all constructor parameters *) - remove_params_optimization ▷ + remove_params_optimization (wcon := eq_refl) ▷ (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ (* Remove all cases / projections on propositional content *) - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ (* Rebuild the efficient lookup table *) - rebuild_wf_env_transform (efl := EWellformed.all_env_flags) ▷ + rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ (* Inline projections to cases *) - inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (hastrel := eq_refl) (hastbox := eq_refl). + inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). (* At the end of erasure we get a well-formed program (well-scoped globally and localy), without parameters in inductive declarations. The constructor applications are also expanded, and the evaluation relation does not need to consider guarded fixpoints or case analyses on propositional @@ -58,33 +58,10 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf Import EGlobalEnv EWellformed. -Lemma wf_global_switch_no_params (efl : EWellformed.EEnvFlags) Σ : - wf_glob (efl := ERemoveParams.switch_no_params efl) Σ -> - wf_glob (efl := efl) Σ. -Proof. - induction 1; constructor; auto. - destruct d; cbn in *. auto. - move/andP: H0 => [] hasp. unfold wf_minductive. - cbn in hasp. rewrite hasp. rewrite orb_true_r //. -Qed. - -Lemma wf_eprogram_switch_no_params (p : EProgram.eprogram) : - EProgram.wf_eprogram (ERemoveParams.switch_no_params all_env_flags) p -> - EProgram.wf_eprogram all_env_flags p. -Proof. - destruct p as [Σ p]. - intros []; split; cbn in * => //. - now eapply wf_global_switch_no_params. -Qed. - Next Obligation. destruct H. split => //. sq. now eapply ETransform.expanded_eprogram_env_expanded_eprogram_cstrs. Qed. -Next Obligation. - split => //. - now apply wf_eprogram_switch_no_params. -Qed. Definition run_erase_program {guard : abstract_guard_impl} := run erasure_pipeline. @@ -92,10 +69,10 @@ Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := E template_to_pcuic_transform ▷ pcuic_expand_lets_transform ▷ erase_transform ▷ - guarded_to_unguarded_fix eq_refl ▷ - remove_params_fast_optimization _ ▷ + guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ + remove_params_fast_optimization (wcon := eq_refl) _ ▷ rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl). + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). Next Obligation. destruct H; split => //. now eapply ETransform.expanded_eprogram_env_expanded_eprogram_cstrs. Qed. diff --git a/erasure/theories/ErasureCorrectness.v b/erasure/theories/ErasureCorrectness.v index cdb5e374d..29d71b7b2 100644 --- a/erasure/theories/ErasureCorrectness.v +++ b/erasure/theories/ErasureCorrectness.v @@ -325,7 +325,7 @@ Proof. invs H2. -- exists x2. split; eauto. - constructor. econstructor. eauto. 2:eauto. + constructor. econstructor. eauto. eauto. 2:eauto. 4:{ unfold EGlobalEnv.iota_red. rewrite ECSubst.substl_subst //. rewrite forallb_rev forallb_skipn //. @@ -1021,7 +1021,7 @@ Proof. eapply erases_deps_eval in Hed1; tea. eapply erases_deps_mkApps_inv in Hed1 as []. depelim H8. - constructor. eapply Ee.eval_construct; tea. + constructor. eapply Ee.eval_construct; tea. eauto. eapply (EGlobalEnv.declared_constructor_lookup H9). rewrite -(Forall2_length H7). rewrite /EAst.cstr_arity. diff --git a/erasure/theories/ErasureFunction.v b/erasure/theories/ErasureFunction.v index 4b6fc0280..0e61fb071 100644 --- a/erasure/theories/ErasureFunction.v +++ b/erasure/theories/ErasureFunction.v @@ -393,7 +393,7 @@ Section Erase. | tSort u := !%prg | tConst kn u := E.tConst kn | tInd kn u := !%prg - | tConstruct kn k u := E.tConstruct kn k + | tConstruct kn k u := E.tConstruct kn k [] | tProd _ _ _ := !%prg | tLambda na b b' := let t' := erase (vass na b :: Γ) b' _ in E.tLambda na.(binder_name) t' @@ -1942,7 +1942,7 @@ Section wffix. | tCoFix mfix idx => (idx true - | tConstruct ind c => true + | tConstruct ind c _ => true | tVar _ => true | tBox => true end. diff --git a/erasure/theories/ErasureProperties.v b/erasure/theories/ErasureProperties.v index 8450c1c80..1b1ca62c5 100644 --- a/erasure/theories/ErasureProperties.v +++ b/erasure/theories/ErasureProperties.v @@ -635,7 +635,7 @@ Proof. simpl; try solve [solve_all]. - now apply Nat.ltb_lt. - eapply trans_lookup_constant in wfa; tea. - - eapply trans_lookup_constructor in wfa; tea. + - eapply trans_lookup_constructor in wfa; tea. now rewrite wfa. - move/andP: wfa => [] /andP[] lookup wfc wfbrs. apply/andP. split. apply/andP. split; eauto. eapply trans_lookup_inductive; tea. @@ -677,7 +677,8 @@ Lemma eval_empty_brs {wfl : Ee.WcbvFlags} Σ ci p e : Σ ⊢ E.tCase ci p [] ▷ Proof. intros He. depind He. - - clear -e0. now rewrite nth_error_nil in e0. + - clear -e1. now rewrite nth_error_nil in e1. + - clear -e1. now rewrite nth_error_nil in e1. - discriminate. - eapply IHHe2. - cbn in i. discriminate. @@ -693,6 +694,7 @@ Proof. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. rewrite EAstUtils.mkApps_app in H. discriminate. + - depelim He1. - exists n, f. intuition auto. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. @@ -709,6 +711,8 @@ Proof. depind He. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. econstructor; eauto. now eapply Ee.value_final, Ee.eval_to_value. + - pose proof (Ee.eval_deterministic He1 Hc). subst c'. + eapply Ee.eval_iota_block; eauto. now eapply Ee.value_final, Ee.eval_to_value. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. eapply Ee.eval_iota_sing; tea. now constructor. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. @@ -726,6 +730,8 @@ Proof. depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. + - pose proof (eval_trans' Hc He1); subst discr. + now econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. eapply Ee.eval_iota_sing; tea. - pose proof (eval_trans' Hc He1); subst discr. @@ -739,13 +745,15 @@ Lemma eval_proj_eval_inv_discr {wfl : Ee.WcbvFlags} {Σ p c c' e} : Σ ⊢ E.tProj p c' ▷ e. Proof. intros He Hc. - depind He. + depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. - eapply Ee.eval_proj; tea. + now econstructor; tea. + - pose proof (eval_trans' Hc He1); subst discr. + now econstructor; tea. - pose proof (eval_trans' Hc He); subst discr. - eapply Ee.eval_proj_prop; tea. + now econstructor; tea. - cbn in i. discriminate. Qed. diff --git a/erasure/theories/Extract.v b/erasure/theories/Extract.v index 94b6fb0a9..9f0136c81 100644 --- a/erasure/theories/Extract.v +++ b/erasure/theories/Extract.v @@ -55,7 +55,7 @@ Inductive erases (Σ : global_env_ext) (Γ : context) : term -> E.term -> Prop : Σ;;; Γ |- tConst kn u ⇝ℇ E.tConst kn | erases_tConstruct : forall (kn : inductive) (k : nat) (n : Instance.t), isPropositional Σ kn false -> - Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k + Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k [] | erases_tCase1 (ci : case_info) (p : predicate term) (c : term) (brs : list (branch term)) (c' : E.term) (brs' : list (list name × E.term)) : @@ -113,7 +113,7 @@ Lemma erases_forall_list_ind P Γ (tConst kn u) (E.tConst kn)) (Hconstruct : forall Γ kn k n, isPropositional Σ kn false -> - P Γ (tConstruct kn k n) (E.tConstruct kn k)) + P Γ (tConstruct kn k n) (E.tConstruct kn k [])) (Hcase : forall Γ ci p c brs c' brs', PCUICElimination.Informative Σ ci.(ci_ind) -> Σ;;; Γ |- c ⇝ℇ c' -> @@ -266,7 +266,7 @@ Inductive erases_deps (Σ : global_env) (Σ' : E.global_declarations) : E.term - EGlobalEnv.declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_mutual_inductive_body mdecl mdecl' -> erases_one_inductive_body idecl idecl' -> - erases_deps Σ Σ' (E.tConstruct ind c) + erases_deps Σ Σ' (E.tConstruct ind c []) | erases_deps_tCase p mdecl idecl mdecl' idecl' discr brs : declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> From 1f4566280d450129f3bc0aece60969d2a80104ab Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 10:08:43 +0200 Subject: [PATCH 12/43] [doc] Update erasure README.md for constructors-as-blocks --- erasure/theories/README.md | 76 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/erasure/theories/README.md b/erasure/theories/README.md index 554d351d3..72fb993d4 100644 --- a/erasure/theories/README.md +++ b/erasure/theories/README.md @@ -4,41 +4,43 @@ Implementation of a verified extraction pipeline from PCUIC to untyped lambda ca extended with a box construct for erased terms. -| File | Description | -|-----------------------|------------------------------------------------------| -| [Prelim] | Preliminaries on PCUIC -| [EArities] | Meta-theoretic lemmas on PCUIC needed for erasure correctness -| [EAst] | AST of λ-box terms -| [EAstUtils] | Utility definitions and lemmas on the AST -| [ELiftSubst] | Lifting and substitution for λ-box terms -| [ECSubst] | Definition of closed substitution (without lifting) -| [EReflect] | Reflection of equality on the AST -| [ESpineView] | Spine-view of λ-box terms (i.e., n-ary applications) -| [EDeps] | Definitions of λ-box term dependencies (used to optimize erasure) -| [EEnvMap] | Efficient global environment definition -| [EGlobalEnv] | Global environment interface -| [EEtaExpanded] | Eta-expansion predicates on λ-box terms, only for constructors -| [EEtaExpandedFix] | Eta-expansion predicates on λ-box terms, for constructors and fixpoints -| [EInduction] | Induction principles on λ-box terms -| [EExtends] | Weakening of global environments -| [EPretty] | Pretty-printing of λ-box programs -| [EProgram] | Definition of well-formed λ-box programs and associated evaluation -| [EWcbvEval] | Weak call-by-value evaluation definition -| [EWcbvEvalEtaInd] | Induction principle on weak call-by-value evaluation preserving eta-expansion -| [EWcbvEvalInd] | Induction principle on weak call-by-value evaluation -| [EWellformed] | Well-formedness predicate on erased terms -| [Extract] | The erasure relation -| [ESubstitution] | Substitution and weakening lemmas for the erasure relation -| [ErasureCorrectness] | The erasure relation correctness proof -| [ErasureProperties] | Properties of the erasure relation -| [ErasureFunction] | The erasure function defined on well-typed terms and its correctness proof -| [EInlineProjections] | Transformation that inlines projections to cases -| [EOptimizePropDiscr] | Transformation removing cases on propositional content -| [ERemoveParams] | Remove constructor parameters -| [ETransform] | Definitions of transformations from PCUIC to λ-box -| [Erasure] | The complete erasure pipeline -| [Extraction] | Extraction directives for the plugin -| [Loader] | Loads the erasure plugin +| File | Description | +|-------------------------|------------------------------------------------------| +| [Prelim] | Preliminaries on PCUIC +| [EArities] | Meta-theoretic lemmas on PCUIC needed for erasure correctness +| [EAst] | AST of λ-box terms +| [EAstUtils] | Utility definitions and lemmas on the AST +| [ELiftSubst] | Lifting and substitution for λ-box terms +| [ECSubst] | Definition of closed substitution (without lifting) +| [EReflect] | Reflection of equality on the AST +| [ESpineView] | Spine-view of λ-box terms (i.e., n-ary applications) +| [EDeps] | Definitions of λ-box term dependencies (used to optimize erasure) +| [EEnvMap] | Efficient global environment definition +| [EGlobalEnv] | Global environment interface +| [EGenericMapEnv] | Generic well-formedness preservation proof for global environments +| [EEtaExpanded] | Eta-expansion predicates on λ-box terms, only for constructors +| [EEtaExpandedFix] | Eta-expansion predicates on λ-box terms, for constructors and fixpoints +| [EInduction] | Induction principles on λ-box terms +| [EExtends] | Weakening of global environments +| [EPretty] | Pretty-printing of λ-box programs +| [EProgram] | Definition of well-formed λ-box programs and associated evaluation +| [EWcbvEval] | Weak call-by-value evaluation definition +| [EWcbvEvalEtaInd] | Induction principle on weak call-by-value evaluation preserving eta-expansion +| [EWcbvEvalInd] | Induction principle on weak call-by-value evaluation +| [EWellformed] | Well-formedness predicate on erased terms +| [Extract] | The erasure relation +| [ESubstitution] | Substitution and weakening lemmas for the erasure relation +| [ErasureCorrectness] | The erasure relation correctness proof +| [ErasureProperties] | Properties of the erasure relation +| [ErasureFunction] | The erasure function defined on well-typed terms and its correctness proof +| [EInlineProjections] | Transformation that inlines projections to cases +| [EOptimizePropDiscr] | Transformation removing cases on propositional content +| [EConstructorsAsBlocks] | Transform constructor applications into an atomic construct (always fully-applied constructors) +| [ERemoveParams] | Remove constructor parameters +| [ETransform] | Definitions of transformations from PCUIC to λ-box +| [Erasure] | The complete erasure pipeline +| [Extraction] | Extraction directives for the plugin +| [Loader] | Loads the erasure plugin [EAll]: EAll.v [EArities]: EArities.v @@ -48,6 +50,7 @@ extended with a box construct for erased terms. [ECoFixToFix]: ECoFixToFix.v [EDeps]: EDeps.v [EEnvMap]: EEnvMap.v +[EGenericMapEnv]: EGenericMapEnv.v [EEtaExpanded]: EEtaExpanded.v [EEtaExpandedFix]: EEtaExpandedFix.v [EExtends]: EExtends.v @@ -69,7 +72,8 @@ extended with a box construct for erased terms. [EWellformed]: EWellformed.v [EWndEval]: EWndEval.v [EWtAst]: EWtAst.v -[Erasure]: Erasure.v +[Erasure]: Erasure.v +[EConstructorsAsBlocks]: EConstructorsAsBlocks.v [ErasureCorrectness]: ErasureCorrectness.v [ErasureFunction]: ErasureFunction.v [ErasureProperties]: ErasureProperties.v From 7fde2fbb0bf1bd48592c426666932ac38c5566cb Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 10:23:05 +0200 Subject: [PATCH 13/43] Update README.md and self_erasure file --- .vscode/metacoq.code-workspace | 1 + README.md | 11 ++++++++++- test-suite/self_erasure.v | 2 -- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.vscode/metacoq.code-workspace b/.vscode/metacoq.code-workspace index e51f9f5b8..cb90e4fbb 100644 --- a/.vscode/metacoq.code-workspace +++ b/.vscode/metacoq.code-workspace @@ -6,6 +6,7 @@ ], "settings": { "coqtop.args": [ + "-I", "template-coq", // "-bt", get backtraces from Coq on errors "-I", "template-coq/build", "-R", "template-coq/theories", "MetaCoq.Template", diff --git a/README.md b/README.md index 427883bda..99e58d56f 100644 --- a/README.md +++ b/README.md @@ -170,9 +170,18 @@ Examples of translations built on top of this: - An example *extracted* Coq plugin built on the extractable Template Monad, which can be used to derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. +- An example ``constructor`` tactic written using the Template Monad is in [examples/constructor_tac.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/examples/constructor_tac.v), + and a more elaborate verified tautology checker is in [examples/tauto.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/examples/tauto.v). + - The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/erasure_test.v) and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/safechecker_test.v) show example - uses (and current limitations of) the verified checker and erasure. + uses (and current limitations of) the extracted verified checker and erasure. + +- The [test-suite/self_erasure.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/self_erasure.v) file checks that erasure + works on the verified typechecking and erasure programs themselves. + +- The test-suite file [test-suite/erasure_live_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/erasure_live_test.v) + shows uses of the verified erasure running *inside* Coq. ## Papers diff --git a/test-suite/self_erasure.v b/test-suite/self_erasure.v index 9f0718618..3d37be9e7 100644 --- a/test-suite/self_erasure.v +++ b/test-suite/self_erasure.v @@ -1,7 +1,5 @@ From MetaCoq.Erasure Require Import Loader Erasure. From MetaCoq.SafeChecker Require Import PCUICSafeChecker. Set MetaCoq Timing. -(* <1sec *) MetaCoq Fast Erase @erase_and_print_template_program. -(* 2sec *) MetaCoq Fast Erase @typecheck_program. From 0102668f2a28e380e71976118ed533eacab42006 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 11:06:22 +0200 Subject: [PATCH 14/43] Update DOC.md and dependency graph --- DOC.md | 33 +- README.md | 35 +- dependency-graph/depgraph-2022-07-01.dot | 540 ++++ dependency-graph/depgraph-2022-07-01.png | Bin 0 -> 2160294 bytes dependency-graph/depgraph-2022-07-01.svg | 3241 ++++++++++++++++++++++ dependency-graph/generate-depgraph.sh | 2 +- 6 files changed, 3815 insertions(+), 36 deletions(-) create mode 100644 dependency-graph/depgraph-2022-07-01.dot create mode 100644 dependency-graph/depgraph-2022-07-01.png create mode 100644 dependency-graph/depgraph-2022-07-01.svg diff --git a/DOC.md b/DOC.md index fc525a99f..2fa24e5a3 100644 --- a/DOC.md +++ b/DOC.md @@ -2,7 +2,7 @@ ## Branches and compatibility -**tl;dr** You should do your PRs against [coq-8.11](https://github.com/MetaCoq/metacoq/tree/coq-8.11). +**tl;dr** You should do your PRs against [coq-8.16](https://github.com/MetaCoq/metacoq/tree/coq-8.16). Coq's kernel API is not stable yet, and changes there are reflected in MetaCoq's reified structures, @@ -11,9 +11,8 @@ so we do not ensure any compatibility from version to version. There is one bran The *main branch* or *current branch* is the one which appers when you go on [https://github.com/MetaCoq/metacoq](https://github.com/MetaCoq/metacoq). Currently (unless you are reading the README of an outdated branch), -it is the [coq-8.11](https://github.com/MetaCoq/metacoq/tree/coq-8.11). +it is the [coq-8.16](https://github.com/MetaCoq/metacoq/tree/coq-8.16). You should use it both for usage of MetaCoq and development of MetaCoq. -We should move soon to [coq-8.13](https://github.com/MetaCoq/metacoq/tree/coq-8.12). The [master](https://github.com/MetaCoq/metacoq/tree/master) branch is following Coq's master branch and gets regular updates from the the main development branch which follows the latest @@ -23,29 +22,25 @@ stable release of Coq. +The branches [coq-8.14](https://github.com/MetaCoq/metacoq/tree/coq-8.14), [coq-8.15](https://github.com/MetaCoq/metacoq/tree/coq-8.15) +and [coq-8.16](https://github.com/MetaCoq/metacoq/tree/coq-8.16) are being kept in sync. The branches [coq-8.6](https://github.com/MetaCoq/metacoq/tree/coq-8.6), [coq-8.7](https://github.com/MetaCoq/metacoq/tree/coq-8.7), [coq-8.8](https://github.com/MetaCoq/metacoq/tree/coq-8.8) -and [coq-8.9](https://github.com/MetaCoq/metacoq/tree/coq-8.9), and [coq-8.10](https://github.com/MetaCoq/metacoq/tree/coq-8.10) are frozen. - +and [coq-8.9](https://github.com/MetaCoq/metacoq/tree/coq-8.9), [coq-8.10](https://github.com/MetaCoq/metacoq/tree/coq-8.10), +[coq-8.11](https://github.com/MetaCoq/metacoq/tree/coq-8.11), [coq-8.12](https://github.com/MetaCoq/metacoq/tree/coq-8.12) +and [coq-8.13](https://github.com/MetaCoq/metacoq/tree/coq-8.13) are frozen. ## Program and Equations -MetaCoq relies on `Program` and `Equations` plugins. - -**Important**: We keep the `template-coq` folder not relying on Equations so that -it compiles without external dependency. -That's why first lemmas involving Equations are in `PCUICUtils.v`. - -Besides, try to avoid `Program`. It inserts some JMeq and UIP axioms silently. You can -use `Equations` to do some dependent induction (`dependent induction`, +MetaCoq relies on `Program` and `Equations` plugins, however try to avoid `Program` as it +inserts some JMeq and UIP axioms silently, whereas we try to keep the development axiom-free. +You can use `Equations` to do some dependent induction (`dependent induction`, `dependent destruction`, `depelim`). You may need to add: ``` Require Import Equations.Prop.DepElim. ``` - - ## ident vs. qualid. vs kername MetaCoq uses three types convertible to `string` which have a different intended meaning: @@ -56,7 +51,7 @@ MetaCoq uses three types convertible to `string` which have a different intended - `qualid` is the type of partially qualified names. E.g. `Datatypes.nat` -- `kername` is the type of fully qualified names. +- `kername` is a structured type of fully qualified names. E.g. `Coq.Init.Datatypes.nat` Quoting always produce fully qualified names. On the converse, unquoting allow to @@ -100,10 +95,10 @@ a fresh level when `MetaCoq Strict Unquote Universe Mode` is off. ## Dependency graph between files -Generated on 2020/09/24, sources [there](https://github.com/MetaCoq/metacoq/tree/coq-8.11/dependency-graph). +Generated on 2022/07/01, sources [there](https://github.com/MetaCoq/metacoq/tree/coq-8.16/dependency-graph).

-Dependency graph
@@ -115,6 +110,6 @@ The file `README.md` in https://github.com/MetaCoq/metacoq.github.io is supposed `README.md` in [https://github.com/MetaCoq/metacoq/](https://github.com/MetaCoq/metacoq/). That's why we can't use relative links and have to use absolute ones. -E.g. [INSTALL.md](https://github.com/MetaCoq/metacoq/tree/coq-8.11/INSTALL.md) and not [INSTALL.md](INSTALL.md). +E.g. [INSTALL.md](https://github.com/MetaCoq/metacoq/tree/coq-8.16/INSTALL.md) and not [INSTALL.md](INSTALL.md). Thus, when switching to a new default branch, we have to search and replace the old branch with the new one. diff --git a/README.md b/README.md index 99e58d56f..b8f9274fc 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ MetaCoq

-[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.16)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) +[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.15)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/metacoq/metacoq) MetaCoq is a project formalizing Coq in Coq and providing tools for @@ -50,8 +50,11 @@ See [DOC.md](https://github.com/MetaCoq/metacoq/tree/coq-8.13/DOC.md) At the center of this project is the Template-Coq quoting library for Coq. The project currently has a single repository extending Template-Coq with additional features. Each extension is in a dedicated folder. +The [dependency graph](https://raw.githubusercontent.com/MetaCoq/metacoq.github.io/master/assets/depgraph-2022-07-01.png) +might be useful to navigate the project. +Statistics: ~150kLoC of Coq, ~30kLoC of OCaml. -### [Template-Coq](https://github.com/MetaCoq/metacoq/tree/coq-8.13/template-coq) +### [Template-Coq](https://github.com/MetaCoq/metacoq/tree/coq-8.15/template-coq/theories) Template-Coq is a quoting library for [Coq](http://coq.inria.fr). It takes `Coq` terms and constructs a representation of their syntax tree as @@ -77,7 +80,7 @@ In addition to this representation of terms, Template Coq includes: - A formalisation of the typing rules reflecting the ones of Coq, covering all of Coq except eta-expansion and template polymorphism. -### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.16/pcuic) +### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.15/pcuic/theories) PCUIC, the Polymorphic Cumulative Calculus of Inductive Constructions is a cleaned up version of the term language of Coq and its associated @@ -110,10 +113,10 @@ calculus has proofs of standard metatheoretical results: - Weak call-by-value standardization: Normal forms of terms of first-order inductive type can be found via weak call-by-value evaluation. -See the PCUIC [README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/pcuic/theories/README.md) for +See the PCUIC [README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/pcuic/theories/README.md) for a detailed view of the development. -### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.16/safechecker) +### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.15/safechecker/theories) Implementation of a fuel-free and verified reduction machine, conversion checker and type checker for PCUIC. This relies on a postulate of @@ -133,10 +136,10 @@ type-checker, one can use: This also includes a verified, efficient re-typing procedure (useful in tactics) in `MetaCoq.SafeChecker.PCUICSafeRetyping`. -See the SafeChecker [README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/safechecker/theories/README.md) for +See the SafeChecker [README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/safechecker/theories/README.md) for a detailed view of the development. -### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.16/erasure) +### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.15/erasure/theories) An erasure procedure to untyped lambda-calculus accomplishing the same as the type and proof erasure phase of the Extraction plugin of Coq. @@ -150,7 +153,7 @@ The erasure pipeline includes verified optimizations to remove lets in construct remove cases on propositional terms, switch to an unguarded fixpoint reduction rule and transform the higher-order constructor applications to first-order blocks for easier translation to usual programming languages. See the erasure -[README](https://github.com/MetaCoq/metacoq/tree/coq-8.16/erasure/theories/README.md) for +[README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/erasure/theories/README.md) for a detailed view of the development. ### [Translations](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations) @@ -159,7 +162,7 @@ Examples of translations built on top of this: - a parametricity plugin in [translations/param_original.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations/param_original.v) -- a plugin to negate functional extensionality in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/translations/times_bool_fun.v) +- a plugin to negate functional extensionality in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/translations/times_bool_fun.v) ### Examples @@ -168,19 +171,19 @@ Examples of translations built on top of this: add a constructor to any inductive type is in [examples/add_constructor.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/examples/add_constructor.v) - An example *extracted* Coq plugin built on the extractable Template Monad, which can be used to - derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. + derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. -- An example ``constructor`` tactic written using the Template Monad is in [examples/constructor_tac.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/examples/constructor_tac.v), - and a more elaborate verified tautology checker is in [examples/tauto.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/examples/tauto.v). +- An example ``constructor`` tactic written using the Template Monad is in [examples/constructor_tac.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/examples/constructor_tac.v), + and a more elaborate verified tautology checker is in [examples/tauto.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/examples/tauto.v). -- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/erasure_test.v) - and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/safechecker_test.v) show example +- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/erasure_test.v) + and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/safechecker_test.v) show example uses (and current limitations of) the extracted verified checker and erasure. -- The [test-suite/self_erasure.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/self_erasure.v) file checks that erasure +- The [test-suite/self_erasure.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/self_erasure.v) file checks that erasure works on the verified typechecking and erasure programs themselves. -- The test-suite file [test-suite/erasure_live_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.16/test-suite/erasure_live_test.v) +- The test-suite file [test-suite/erasure_live_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/erasure_live_test.v) shows uses of the verified erasure running *inside* Coq. ## Papers diff --git a/dependency-graph/depgraph-2022-07-01.dot b/dependency-graph/depgraph-2022-07-01.dot new file mode 100644 index 000000000..29de49597 --- /dev/null +++ b/dependency-graph/depgraph-2022-07-01.dot @@ -0,0 +1,540 @@ +digraph dependencies { +node[style=filled] +"safechecker/Extraction"[label="Extraction", color=paleturquoise1] +"safechecker/PCUICConsistency"[label="PCUICConsistency", color=paleturquoise1] +"safechecker/PCUICRetypingEnvIrrelevance"[label="PCUICRetypingEnvIrrelevance", color=paleturquoise1] +"safechecker/PCUICSafeRetyping"[label="PCUICSafeRetyping", color=paleturquoise1] +"safechecker/SafeTemplateChecker"[label="SafeTemplateChecker", color=paleturquoise1] +"safechecker/PCUICWfEnvImpl"[label="PCUICWfEnvImpl", color=paleturquoise1] +"safechecker/PCUICSafeChecker"[label="PCUICSafeChecker", color=paleturquoise1] +"safechecker/PCUICTypeChecker"[label="PCUICTypeChecker", color=paleturquoise1] +"safechecker/PCUICWfReduction"[label="PCUICWfReduction", color=paleturquoise1] +"safechecker/PCUICSafeConversion"[label="PCUICSafeConversion", color=paleturquoise1] +"safechecker/PCUICSafeReduce"[label="PCUICSafeReduce", color=paleturquoise1] +"safechecker/PCUICWfEnv"[label="PCUICWfEnv", color=paleturquoise1] +"safechecker/PCUICErrors"[label="PCUICErrors", color=paleturquoise1] +"safechecker/PCUICEqualityDec"[label="PCUICEqualityDec", color=paleturquoise1] +"pcuic/Bidirectional/BDToPCUIC" -> "pcuic/Bidirectional/BDFromPCUIC" +"pcuic/Bidirectional/BDTyping" -> "pcuic/Bidirectional/BDToPCUIC" +"pcuic/PCUICSR" -> "pcuic/Bidirectional/BDToPCUIC" +"pcuic/PCUICCumulativity" -> "pcuic/Bidirectional/BDTyping" +"pcuic/PCUICTyping" -> "pcuic/Bidirectional/BDTyping" +"pcuic/Bidirectional/BDFromPCUIC" -> "pcuic/Bidirectional/BDUnique" +"pcuic/PCUICGlobalEnv" -> "pcuic/Conversion/PCUICClosedConv" +"pcuic/PCUICReduction" -> "pcuic/Conversion/PCUICClosedConv" +"pcuic/PCUICWeakeningEnv" -> "pcuic/Conversion/PCUICClosedConv" +"pcuic/Conversion/PCUICUnivSubstitutionConv" -> "pcuic/Conversion/PCUICInstConv" +"pcuic/Typing/PCUICWeakeningTyp" -> "pcuic/Conversion/PCUICInstConv" +"pcuic/Conversion/PCUICRenameConv" -> "pcuic/Conversion/PCUICOnFreeVarsConv" +"pcuic/Syntax/PCUICViews" -> "pcuic/Conversion/PCUICRenameConv" +"pcuic/Typing/PCUICClosedTyp" -> "pcuic/Conversion/PCUICRenameConv" +"pcuic/PCUICCumulativity" -> "pcuic/Conversion/PCUICUnivSubstitutionConv" +"pcuic/PCUICGuardCondition" -> "pcuic/Conversion/PCUICUnivSubstitutionConv" +"pcuic/PCUICWeakeningEnv" -> "pcuic/Conversion/PCUICUnivSubstitutionConv" +"pcuic/Conversion/PCUICRenameConv" -> "pcuic/Conversion/PCUICWeakeningConv" +"pcuic/PCUICCumulativity" -> "pcuic/Conversion/PCUICWeakeningEnvConv" +"pcuic/PCUICCumulativitySpec" -> "pcuic/Conversion/PCUICWeakeningEnvConv" +"pcuic/PCUICWeakeningEnv" -> "pcuic/Conversion/PCUICWeakeningEnvConv" +"pcuic/PCUICInductiveInversion" -> "pcuic/PCUICAlpha" +"pcuic/PCUICContexts" -> "pcuic/PCUICArities" +"pcuic/PCUICInversion" -> "pcuic/PCUICArities" +"pcuic/PCUICWfUniverses" -> "pcuic/PCUICArities" +"pcuic/utils/PCUICPrimitive" -> "pcuic/PCUICAst" +"pcuic/PCUICReduction" -> "pcuic/PCUICCSubst" +"pcuic/PCUICTyping" -> "pcuic/PCUICCSubst" +"pcuic/PCUICElimination" -> "pcuic/PCUICCanonicity" +"pcuic/PCUICWcbvEval" -> "pcuic/PCUICCanonicity" +"pcuic/PCUICEquality" -> "pcuic/PCUICCasesContexts" +"pcuic/PCUICSigmaCalculus" -> "pcuic/PCUICCasesContexts" +"pcuic/PCUICParallelReductionConfluence" -> "pcuic/PCUICConfluence" +"pcuic/PCUICRedTypeIrrelevance" -> "pcuic/PCUICConfluence" +"pcuic/PCUICWellScopedCumulativity" -> "pcuic/PCUICContextConversion" +"pcuic/PCUICSubstitution" -> "pcuic/PCUICContextReduction" +"pcuic/Syntax/PCUICLiftSubst" -> "pcuic/PCUICContextSubst" +"pcuic/PCUICGeneration" -> "pcuic/PCUICContexts" +"pcuic/PCUICSubstitution" -> "pcuic/PCUICContexts" +"pcuic/Typing/PCUICUnivSubstitutionTyp" -> "pcuic/PCUICContexts" +"pcuic/PCUICNormal" -> "pcuic/PCUICConvCumInversion" +"pcuic/PCUICContextConversion" -> "pcuic/PCUICConversion" +"pcuic/PCUICSafeLemmata" -> "pcuic/PCUICCumulProp" +"pcuic/PCUICReduction" -> "pcuic/PCUICCumulativity" +"pcuic/Syntax/PCUICOnFreeVars" -> "pcuic/PCUICCumulativitySpec" +"pcuic/utils/PCUICOnOne" -> "pcuic/PCUICCumulativitySpec" +"pcuic/PCUICCumulProp" -> "pcuic/PCUICElimination" +"pcuic/Syntax/PCUICLiftSubst" -> "pcuic/PCUICEquality" +"pcuic/Syntax/PCUICReflect" -> "pcuic/PCUICEquality" +"pcuic/PCUICTyping" -> "pcuic/PCUICGeneration" +"pcuic/PCUICTyping" -> "pcuic/PCUICGlobalEnv" +"pcuic/PCUICReduction" -> "pcuic/PCUICGuardCondition" +"pcuic/Syntax/PCUICInstDef" -> "pcuic/PCUICGuardCondition" +"pcuic/Syntax/PCUICNamelessDef" -> "pcuic/PCUICGuardCondition" +"pcuic/PCUICValidity" -> "pcuic/PCUICInductiveInversion" +"pcuic/PCUICSpine" -> "pcuic/PCUICInductives" +"pcuic/PCUICConversion" -> "pcuic/PCUICInversion" +"pcuic/PCUICSR" -> "pcuic/PCUICNormal" +"template-coq/UnivSubst" -> "pcuic/PCUICNormal" +"pcuic/PCUICSubstitution" -> "pcuic/PCUICParallelReduction" +"pcuic/Syntax/PCUICDepth" -> "pcuic/PCUICParallelReduction" +"pcuic/PCUICParallelReduction" -> "pcuic/PCUICParallelReductionConfluence" +"pcuic/PCUICCumulProp" -> "pcuic/PCUICPrincipality" +"pcuic/PCUICGlobalEnv" -> "pcuic/PCUICProgram" +"template-coq/EnvMap" -> "pcuic/PCUICProgram" +"pcuic/PCUICContextReduction" -> "pcuic/PCUICRedTypeIrrelevance" +"pcuic/Syntax/PCUICClosed" -> "pcuic/PCUICReduction" +"pcuic/Syntax/PCUICPosition" -> "pcuic/PCUICReduction" +"pcuic/Syntax/PCUICTactics" -> "pcuic/PCUICReduction" +"pcuic/utils/PCUICOnOne" -> "pcuic/PCUICReduction" +"pcuic/PCUICSafeLemmata" -> "pcuic/PCUICSN" +"pcuic/PCUICAlpha" -> "pcuic/PCUICSR" +"pcuic/PCUICNormal" -> "pcuic/PCUICSafeLemmata" +"pcuic/Syntax/PCUICLiftSubst" -> "pcuic/PCUICSigmaCalculus" +"pcuic/PCUICArities" -> "pcuic/PCUICSpine" +"pcuic/PCUICCasesContexts" -> "pcuic/PCUICSpine" +"pcuic/Typing/PCUICContextConversionTyp" -> "pcuic/PCUICSpine" +"pcuic/Typing/PCUICInstTyp" -> "pcuic/PCUICSubstitution" +"pcuic/PCUICCumulativitySpec" -> "pcuic/PCUICTyping" +"pcuic/Syntax/PCUICPosition" -> "pcuic/PCUICTyping" +"pcuic/utils/PCUICUtils" -> "pcuic/PCUICTyping" +"pcuic/PCUICInductives" -> "pcuic/PCUICValidity" +"pcuic/PCUICCSubst" -> "pcuic/PCUICWcbvEval" +"pcuic/Typing/PCUICClosedTyp" -> "pcuic/PCUICWcbvEval" +"pcuic/utils/PCUICAstUtils" -> "pcuic/PCUICWeakeningEnv" +"template-coq/utils/LibHypsNaming" -> "pcuic/PCUICWeakeningEnv" +"pcuic/PCUICConfluence" -> "pcuic/PCUICWellScopedCumulativity" +"pcuic/PCUICGeneration" -> "pcuic/PCUICWfUniverses" +"pcuic/PCUICSubstitution" -> "pcuic/PCUICWfUniverses" +"pcuic/utils/PCUICAstUtils" -> "pcuic/Syntax/PCUICCases" +"pcuic/PCUICSigmaCalculus" -> "pcuic/Syntax/PCUICClosed" +"pcuic/Syntax/PCUICUnivSubst" -> "pcuic/Syntax/PCUICClosed" +"pcuic/Syntax/PCUICInduction" -> "pcuic/Syntax/PCUICDepth" +"pcuic/Syntax/PCUICCases" -> "pcuic/Syntax/PCUICInduction" +"template-coq/utils/LibHypsNaming" -> "pcuic/Syntax/PCUICInduction" +"pcuic/Syntax/PCUICRenameDef" -> "pcuic/Syntax/PCUICInstDef" +"pcuic/Syntax/PCUICInduction" -> "pcuic/Syntax/PCUICLiftSubst" +"pcuic/PCUICTyping" -> "pcuic/Syntax/PCUICNamelessDef" +"pcuic/PCUICEquality" -> "pcuic/Syntax/PCUICOnFreeVars" +"pcuic/Syntax/PCUICClosed" -> "pcuic/Syntax/PCUICOnFreeVars" +"template-coq/utils/MCPred" -> "pcuic/Syntax/PCUICOnFreeVars" +"pcuic/PCUICEquality" -> "pcuic/Syntax/PCUICPosition" +"pcuic/Syntax/PCUICInduction" -> "pcuic/Syntax/PCUICReflect" +"pcuic/PCUICTyping" -> "pcuic/Syntax/PCUICRenameDef" +"pcuic/PCUICSigmaCalculus" -> "pcuic/Syntax/PCUICTactics" +"pcuic/Syntax/PCUICInduction" -> "pcuic/Syntax/PCUICUnivSubst" +"pcuic/Syntax/PCUICReflect" -> "pcuic/Syntax/PCUICViews" +"pcuic/utils/PCUICOnOne" -> "pcuic/Syntax/PCUICViews" +"pcuic/PCUICProgram" -> "pcuic/TemplateToPCUIC" +"template-coq/TemplateProgram" -> "pcuic/TemplateToPCUIC" +"pcuic/Conversion/PCUICClosedConv" -> "pcuic/Typing/PCUICClosedTyp" +"pcuic/Typing/PCUICWeakeningEnvTyp" -> "pcuic/Typing/PCUICClosedTyp" +"pcuic/PCUICConversion" -> "pcuic/Typing/PCUICContextConversionTyp" +"pcuic/Conversion/PCUICInstConv" -> "pcuic/Typing/PCUICInstTyp" +"pcuic/Conversion/PCUICOnFreeVarsConv" -> "pcuic/Typing/PCUICRenameTyp" +"pcuic/Conversion/PCUICUnivSubstitutionConv" -> "pcuic/Typing/PCUICUnivSubstitutionTyp" +"pcuic/Typing/PCUICWeakeningEnvTyp" -> "pcuic/Typing/PCUICUnivSubstitutionTyp" +"pcuic/Conversion/PCUICWeakeningEnvConv" -> "pcuic/Typing/PCUICWeakeningEnvTyp" +"pcuic/PCUICContextSubst" -> "pcuic/Typing/PCUICWeakeningEnvTyp" +"pcuic/PCUICGlobalEnv" -> "pcuic/Typing/PCUICWeakeningEnvTyp" +"pcuic/PCUICGuardCondition" -> "pcuic/Typing/PCUICWeakeningEnvTyp" +"pcuic/Conversion/PCUICWeakeningConv" -> "pcuic/Typing/PCUICWeakeningTyp" +"pcuic/Typing/PCUICRenameTyp" -> "pcuic/Typing/PCUICWeakeningTyp" +"pcuic/utils/PCUICSize" -> "pcuic/utils/PCUICAstUtils" +"template-coq/common/uGraph" -> "pcuic/utils/PCUICAstUtils" +"pcuic/PCUICAst" -> "pcuic/utils/PCUICOnOne" +"pcuic/utils/PCUICAstUtils" -> "pcuic/utils/PCUICPretty" +"template-coq/EnvironmentTyping" -> "pcuic/utils/PCUICPrimitive" +"template-coq/Reflect" -> "pcuic/utils/PCUICPrimitive" +"pcuic/PCUICAst" -> "pcuic/utils/PCUICSize" +"template-coq/config" -> "pcuic/utils/PCUICUtils" +"template-coq/utils" -> "pcuic/utils/PCUICUtils" +"template-coq/EnvironmentTyping" -> "template-coq/Ast" +"template-coq/Ast" -> "template-coq/AstUtils" +"template-coq/Kernames" -> "template-coq/BasicAst" +"template-coq/Reflect" -> "template-coq/EnvMap" +"template-coq/common/uGraph" -> "template-coq/EnvMap" +"template-coq/utils/canonicaltries/CanonicalTries" -> "template-coq/EnvMap" +"template-coq/Universes" -> "template-coq/Environment" +"template-coq/Environment" -> "template-coq/EnvironmentTyping" +"template-coq/Typing" -> "template-coq/EtaExpand" +"template-coq/common/uGraph" -> "template-coq/EtaExpand" +"template-coq/AstUtils" -> "template-coq/Induction" +"template-coq/utils" -> "template-coq/Kernames" +"template-coq/WfAst" -> "template-coq/LiftSubst" +"template-coq/Universes" -> "template-coq/Reflect" +"template-coq/Induction" -> "template-coq/ReflectAst" +"template-coq/Reflect" -> "template-coq/ReflectAst" +"template-coq/EtaExpand" -> "template-coq/TemplateProgram" +"template-coq/Transform" -> "template-coq/TemplateProgram" +"template-coq/WcbvEval" -> "template-coq/TemplateProgram" +"template-coq/Induction" -> "template-coq/TermEquality" +"template-coq/Reflect" -> "template-coq/TermEquality" +"template-coq/utils" -> "template-coq/Transform" +"template-coq/LiftSubst" -> "template-coq/Typing" +"template-coq/ReflectAst" -> "template-coq/Typing" +"template-coq/TermEquality" -> "template-coq/Typing" +"template-coq/Typing" -> "template-coq/TypingWf" +"template-coq/Induction" -> "template-coq/UnivSubst" +"template-coq/BasicAst" -> "template-coq/Universes" +"template-coq/config" -> "template-coq/Universes" +"template-coq/TypingWf" -> "template-coq/WcbvEval" +"template-coq/UnivSubst" -> "template-coq/WfAst" +"template-coq/Universes" -> "template-coq/common/uGraph" +"template-coq/utils/wGraph" -> "template-coq/common/uGraph" +"template-coq/utils/All_Forall" -> "template-coq/monad_utils" +"template-coq/monad_utils" -> "template-coq/utils" +"template-coq/utils/MCUtils" -> "template-coq/utils" +"template-coq/utils/MCOption" -> "template-coq/utils/All_Forall" +"template-coq/utils/MCSquash" -> "template-coq/utils/All_Forall" +"template-coq/utils/ByteCompare" -> "template-coq/utils/ByteCompareSpec" +"template-coq/utils/MCCompare" -> "template-coq/utils/ByteCompareSpec" +"template-coq/utils/ReflectEq" -> "template-coq/utils/ByteCompareSpec" +"template-coq/utils/MCPrelude" -> "template-coq/utils/MCList" +"template-coq/utils/MCRelations" -> "template-coq/utils/MCList" +"template-coq/utils/ReflectEq" -> "template-coq/utils/MCList" +"template-coq/utils/MCList" -> "template-coq/utils/MCOption" +"template-coq/utils/MCProd" -> "template-coq/utils/MCOption" +"template-coq/utils/MCReflect" -> "template-coq/utils/MCOption" +"template-coq/utils/MCOption" -> "template-coq/utils/MCPred" +"template-coq/utils/MCPrelude" -> "template-coq/utils/MCReflect" +"template-coq/utils/bytestring" -> "template-coq/utils/MCString" +"template-coq/utils/All_Forall" -> "template-coq/utils/MCUtils" +"template-coq/utils/MCArith" -> "template-coq/utils/MCUtils" +"template-coq/utils/MCEquality" -> "template-coq/utils/MCUtils" +"template-coq/utils/MCString" -> "template-coq/utils/MCUtils" +"template-coq/utils/ByteCompareSpec" -> "template-coq/utils/bytestring" +"template-coq/utils/canonicaltries/String2pos" -> "template-coq/utils/canonicaltries/CanonicalTries" +"template-coq/utils/MCUtils" -> "template-coq/utils/wGraph" +"template-coq/utils/MC_ExtrOCamlZPosInt" -> "safechecker/Extraction" +"safechecker/SafeTemplateChecker" -> "safechecker/Extraction" +"safechecker/PCUICSafeReduce" -> "safechecker/PCUICConsistency" +"safechecker/PCUICWfEnvImpl" -> "safechecker/PCUICConsistency" +"pcuic/PCUICWfUniverses" -> "safechecker/PCUICEqualityDec" +"pcuic/utils/PCUICPretty" -> "safechecker/PCUICErrors" +"safechecker/PCUICSafeRetyping" -> "safechecker/PCUICRetypingEnvIrrelevance" +"safechecker/PCUICTypeChecker" -> "safechecker/PCUICSafeChecker" +"pcuic/PCUICConvCumInversion" -> "safechecker/PCUICSafeConversion" +"pcuic/PCUICPrincipality" -> "safechecker/PCUICSafeConversion" +"safechecker/PCUICEqualityDec" -> "safechecker/PCUICSafeConversion" +"safechecker/PCUICSafeReduce" -> "safechecker/PCUICSafeConversion" +"pcuic/PCUICCanonicity" -> "safechecker/PCUICSafeReduce" +"safechecker/PCUICErrors" -> "safechecker/PCUICSafeReduce" +"safechecker/PCUICWfReduction" -> "safechecker/PCUICSafeReduce" +"pcuic/Bidirectional/BDUnique" -> "safechecker/PCUICSafeRetyping" +"pcuic/PCUICConvCumInversion" -> "safechecker/PCUICSafeRetyping" +"safechecker/PCUICSafeReduce" -> "safechecker/PCUICSafeRetyping" +"pcuic/Bidirectional/BDUnique" -> "safechecker/PCUICTypeChecker" +"safechecker/PCUICSafeConversion" -> "safechecker/PCUICTypeChecker" +"pcuic/PCUICSafeLemmata" -> "safechecker/PCUICWfEnv" +"template-coq/EnvMap" -> "safechecker/PCUICWfEnv" +"safechecker/PCUICEqualityDec" -> "safechecker/PCUICWfEnvImpl" +"safechecker/PCUICWfEnv" -> "safechecker/PCUICWfEnvImpl" +"pcuic/PCUICSN" -> "safechecker/PCUICWfReduction" +"pcuic/utils/PCUICPretty" -> "safechecker/PCUICWfReduction" +"safechecker/PCUICWfEnv" -> "safechecker/PCUICWfReduction" +"pcuic/TemplateToPCUIC" -> "safechecker/SafeTemplateChecker" +"safechecker/PCUICSafeChecker" -> "safechecker/SafeTemplateChecker" +"safechecker/PCUICWfEnvImpl" -> "safechecker/SafeTemplateChecker" +"template-coq/Extraction"[label="Extraction", color=aquamarine] +"template-coq/Constants"[label="Constants", color=aquamarine] +"template-coq/monad_utils"[label="monad_utils", color=aquamarine] +"template-coq/TemplateMonad/Extractable"[label="Extractable", color=aquamarine] +"template-coq/TemplateMonad/Core"[label="Core", color=aquamarine] +"template-coq/TemplateMonad/Common"[label="Common", color=aquamarine] +"template-coq/TemplateMonad"[label="TemplateMonad", color=aquamarine] +"template-coq/TemplateProgram"[label="TemplateProgram", color=aquamarine] +"template-coq/EtaExpand"[label="EtaExpand", color=aquamarine] +"template-coq/Checker"[label="Checker", color=aquamarine] +"template-coq/WcbvEval"[label="WcbvEval", color=aquamarine] +"template-coq/Normal"[label="Normal", color=aquamarine] +"template-coq/TypingWf"[label="TypingWf", color=aquamarine] +"template-coq/Reduction"[label="Reduction", color=aquamarine] +"template-coq/Typing"[label="Typing", color=aquamarine] +"template-coq/TermEquality"[label="TermEquality", color=aquamarine] +"template-coq/Pretty"[label="Pretty", color=aquamarine] +"template-coq/UnivSubst"[label="UnivSubst", color=aquamarine] +"template-coq/LiftSubst"[label="LiftSubst", color=aquamarine] +"template-coq/WfAst"[label="WfAst", color=aquamarine] +"template-coq/EnvironmentTyping"[label="EnvironmentTyping", color=aquamarine] +"template-coq/Induction"[label="Induction", color=aquamarine] +"template-coq/EnvMap"[label="EnvMap", color=aquamarine] +"template-coq/ReflectAst"[label="ReflectAst", color=aquamarine] +"template-coq/Reflect"[label="Reflect", color=aquamarine] +"template-coq/AstUtils"[label="AstUtils", color=aquamarine] +"template-coq/Ast"[label="Ast", color=aquamarine] +"template-coq/Environment"[label="Environment", color=aquamarine] +"template-coq/BasicAst"[label="BasicAst", color=aquamarine] +"template-coq/Universes"[label="Universes", color=aquamarine] +"template-coq/Kernames"[label="Kernames", color=aquamarine] +"template-coq/config"[label="config", color=aquamarine] +"template-coq/utils"[label="utils", color=aquamarine] +"template-coq/Transform"[label="Transform", color=aquamarine] +"template-coq/common/uGraph"[label="uGraph", color=aquamarine] +"template-coq/utils/ReflectEq"[label="ReflectEq", color=aquamarine] +"template-coq/utils/MC_ExtrOCamlZPosInt"[label="MC_ExtrOCamlZPosInt", color=aquamarine] +"template-coq/utils/MCUtils"[label="MCUtils", color=aquamarine] +"template-coq/utils/wGraph"[label="wGraph", color=aquamarine] +"template-coq/utils/MCString"[label="MCString", color=aquamarine] +"template-coq/utils/MCSquash"[label="MCSquash", color=aquamarine] +"template-coq/utils/MCRelations"[label="MCRelations", color=aquamarine] +"template-coq/utils/MCPred"[label="MCPred", color=aquamarine] +"template-coq/utils/MCProd"[label="MCProd", color=aquamarine] +"template-coq/utils/MCOption"[label="MCOption", color=aquamarine] +"template-coq/utils/MCList"[label="MCList", color=aquamarine] +"template-coq/utils/LibHypsNaming"[label="LibHypsNaming", color=aquamarine] +"template-coq/utils/MCEquality"[label="MCEquality", color=aquamarine] +"template-coq/utils/MCCompare"[label="MCCompare", color=aquamarine] +"template-coq/utils/MCArith"[label="MCArith", color=aquamarine] +"template-coq/utils/All_Forall"[label="All_Forall", color=aquamarine] +"template-coq/utils/MCReflect"[label="MCReflect", color=aquamarine] +"template-coq/utils/MCPrelude"[label="MCPrelude", color=aquamarine] +"template-coq/utils/bytestring"[label="bytestring", color=aquamarine] +"template-coq/utils/ByteCompareSpec"[label="ByteCompareSpec", color=aquamarine] +"template-coq/utils/ByteCompare"[label="ByteCompare", color=aquamarine] +"template-coq/utils/canonicaltries/CanonicalTries"[label="CanonicalTries", color=aquamarine] +"template-coq/utils/canonicaltries/String2pos"[label="String2pos", color=aquamarine] +"template-coq/Typing" -> "template-coq/Checker" +"template-coq/common/uGraph" -> "template-coq/Checker" +"template-coq/TemplateMonad" -> "template-coq/Constants" +"template-coq/TemplateMonad/Extractable" -> "template-coq/Constants" +"template-coq/common/uGraph" -> "template-coq/Constants" +"template-coq/Pretty" -> "template-coq/Extraction" +"template-coq/TemplateMonad/Extractable" -> "template-coq/Extraction" +"template-coq/TemplateProgram" -> "template-coq/Extraction" +"template-coq/utils/MC_ExtrOCamlZPosInt" -> "template-coq/Extraction" +"template-coq/Typing" -> "template-coq/Normal" +"template-coq/LiftSubst" -> "template-coq/Pretty" +"template-coq/Typing" -> "template-coq/Reduction" +"template-coq/TemplateMonad/Core" -> "template-coq/TemplateMonad" +"template-coq/Ast" -> "template-coq/TemplateMonad/Common" +"template-coq/AstUtils" -> "template-coq/TemplateMonad/Core" +"template-coq/TemplateMonad/Common" -> "template-coq/TemplateMonad/Core" +"template-coq/AstUtils" -> "template-coq/TemplateMonad/Extractable" +"template-coq/TemplateMonad/Common" -> "template-coq/TemplateMonad/Extractable" +"erasure/Erasure"[label="Erasure", color=tan] +"erasure/EConstructorsAsBlocks"[label="EConstructorsAsBlocks", color=tan] +"erasure/ETransform"[label="ETransform", color=tan] +"erasure/EInlineProjections"[label="EInlineProjections", color=tan] +"erasure/ERemoveParams"[label="ERemoveParams", color=tan] +"erasure/EProgram"[label="EProgram", color=tan] +"erasure/EEtaExpanded"[label="EEtaExpanded", color=tan] +"erasure/EEtaExpandedFix"[label="EEtaExpandedFix", color=tan] +"erasure/EOptimizePropDiscr"[label="EOptimizePropDiscr", color=tan] +"erasure/EExtends"[label="EExtends", color=tan] +"erasure/ErasureFunction"[label="ErasureFunction", color=tan] +"erasure/ErasureCorrectness"[label="ErasureCorrectness", color=tan] +"erasure/ErasureProperties"[label="ErasureProperties", color=tan] +"erasure/EArities"[label="EArities", color=tan] +"erasure/ESubstitution"[label="ESubstitution", color=tan] +"erasure/Prelim"[label="Prelim", color=tan] +"erasure/Extraction"[label="Extraction", color=tan] +"erasure/EDeps"[label="EDeps", color=tan] +"erasure/Extract"[label="Extract", color=tan] +"erasure/EWcbvEvalEtaInd"[label="EWcbvEvalEtaInd", color=tan] +"erasure/EWcbvEvalInd"[label="EWcbvEvalInd", color=tan] +"erasure/EEnvMap"[label="EEnvMap", color=tan] +"erasure/EWellformed"[label="EWellformed", color=tan] +"erasure/EGlobalEnv"[label="EGlobalEnv", color=tan] +"erasure/EWcbvEval"[label="EWcbvEval", color=tan] +"erasure/ECSubst"[label="ECSubst", color=tan] +"erasure/EPretty"[label="EPretty", color=tan] +"erasure/ESpineView"[label="ESpineView", color=tan] +"erasure/EReflect"[label="EReflect", color=tan] +"erasure/ELiftSubst"[label="ELiftSubst", color=tan] +"erasure/EInduction"[label="EInduction", color=tan] +"erasure/EAstUtils"[label="EAstUtils", color=tan] +"erasure/EAst"[label="EAst", color=tan] +"pcuic/PCUICInductiveInversion" -> "pcuic/PCUICEtaExpand" +"pcuic/TemplateToPCUIC" -> "pcuic/PCUICEtaExpand" +"pcuic/PCUICProgram" -> "pcuic/PCUICExpandLets" +"pcuic/PCUICCanonicity" -> "pcuic/PCUICExpandLetsCorrectness" +"pcuic/PCUICEtaExpand" -> "pcuic/PCUICExpandLetsCorrectness" +"pcuic/PCUICExpandLets" -> "pcuic/PCUICExpandLetsCorrectness" +"pcuic/PCUICCanonicity" -> "pcuic/PCUICFirstorder" +"pcuic/PCUICPrincipality" -> "pcuic/PCUICFirstorder" +"pcuic/PCUICSN" -> "pcuic/PCUICFirstorder" +"pcuic/PCUICFirstorder" -> "pcuic/PCUICProgress" +"pcuic/PCUICExpandLetsCorrectness" -> "pcuic/PCUICTransform" +"pcuic/TemplateToPCUICExpanded" -> "pcuic/PCUICTransform" +"pcuic/TemplateToPCUICWcbvEval" -> "pcuic/PCUICTransform" +"pcuic/PCUICInductiveInversion" -> "pcuic/TemplateToPCUICCorrectness" +"pcuic/TemplateToPCUIC" -> "pcuic/TemplateToPCUICCorrectness" +"pcuic/PCUICEtaExpand" -> "pcuic/TemplateToPCUICExpanded" +"pcuic/TemplateToPCUICCorrectness" -> "pcuic/TemplateToPCUICExpanded" +"pcuic/PCUICCanonicity" -> "pcuic/TemplateToPCUICWcbvEval" +"pcuic/TemplateToPCUICCorrectness" -> "pcuic/TemplateToPCUICWcbvEval" +"pcuic/PCUICCanonicity" -> "erasure/EArities" +"pcuic/PCUICPrincipality" -> "erasure/EArities" +"erasure/Extract" -> "erasure/EArities" +"template-coq/Universes" -> "erasure/EAst" +"erasure/EAst" -> "erasure/EAstUtils" +"erasure/ELiftSubst" -> "erasure/ECSubst" +"erasure/EGenericMapEnv" -> "erasure/EConstructorsAsBlocks" +"erasure/EExtends" -> "erasure/EDeps" +"erasure/ESubstitution" -> "erasure/EDeps" +"template-coq/EnvMap" -> "erasure/EEnvMap" +"erasure/EGlobalEnv" -> "erasure/EEnvMap" +"erasure/EEtaExpandedFix" -> "erasure/EEtaExpanded" +"erasure/EExtends" -> "erasure/EEtaExpandedFix" +"erasure/EProgram" -> "erasure/EEtaExpandedFix" +"erasure/ESpineView" -> "erasure/EEtaExpandedFix" +"erasure/EWcbvEvalInd" -> "erasure/EEtaExpandedFix" +"erasure/EWellformed" -> "erasure/EExtends" +"erasure/EArities" -> "erasure/EGenericMapEnv" +"erasure/EWcbvEvalEtaInd" -> "erasure/EGenericMapEnv" +"erasure/ECSubst" -> "erasure/EGlobalEnv" +"erasure/EReflect" -> "erasure/EGlobalEnv" +"pcuic/utils/PCUICSize" -> "erasure/EInduction" +"erasure/EAstUtils" -> "erasure/EInduction" +"erasure/EArities" -> "erasure/EInlineProjections" +"erasure/EEtaExpanded" -> "erasure/EInlineProjections" +"erasure/EInduction" -> "erasure/ELiftSubst" +"safechecker/PCUICWfEnvImpl" -> "erasure/EOptimizePropDiscr" +"erasure/EDeps" -> "erasure/EOptimizePropDiscr" +"erasure/EEtaExpanded" -> "erasure/EOptimizePropDiscr" +"erasure/EGlobalEnv" -> "erasure/EPretty" +"pcuic/PCUICProgram" -> "erasure/EProgram" +"template-coq/Transform" -> "erasure/EProgram" +"erasure/EEnvMap" -> "erasure/EProgram" +"erasure/EPretty" -> "erasure/EProgram" +"erasure/EWcbvEval" -> "erasure/EProgram" +"erasure/EInduction" -> "erasure/EReflect" +"erasure/EArities" -> "erasure/ERemoveParams" +"erasure/EWcbvEvalEtaInd" -> "erasure/ERemoveParams" +"erasure/EReflect" -> "erasure/ESpineView" +"erasure/Prelim" -> "erasure/ESubstitution" +"pcuic/PCUICTransform" -> "erasure/ETransform" +"template-coq/Pretty" -> "erasure/ETransform" +"erasure/EConstructorsAsBlocks" -> "erasure/ETransform" +"erasure/EInlineProjections" -> "erasure/ETransform" +"erasure/EOptimizePropDiscr" -> "erasure/ETransform" +"erasure/ERemoveParams" -> "erasure/ETransform" +"erasure/ErasureFunction" -> "erasure/ETransform" +"pcuic/PCUICWcbvEval" -> "erasure/EWcbvEval" +"erasure/EWellformed" -> "erasure/EWcbvEval" +"erasure/EEtaExpanded" -> "erasure/EWcbvEvalEtaInd" +"template-coq/EnvMap" -> "erasure/EWcbvEvalInd" +"erasure/EWcbvEval" -> "erasure/EWcbvEvalInd" +"pcuic/Syntax/PCUICTactics" -> "erasure/EWellformed" +"erasure/EGlobalEnv" -> "erasure/EWellformed" +"erasure/ETransform" -> "erasure/Erasure" +"pcuic/PCUICEtaExpand" -> "erasure/ErasureCorrectness" +"erasure/EEtaExpandedFix" -> "erasure/ErasureCorrectness" +"erasure/ErasureProperties" -> "erasure/ErasureCorrectness" +"pcuic/PCUICProgress" -> "erasure/ErasureFunction" +"safechecker/PCUICRetypingEnvIrrelevance" -> "erasure/ErasureFunction" +"erasure/ErasureCorrectness" -> "erasure/ErasureFunction" +"erasure/EDeps" -> "erasure/ErasureProperties" +"pcuic/PCUICElimination" -> "erasure/Extract" +"pcuic/PCUICWcbvEval" -> "erasure/Extract" +"erasure/EGlobalEnv" -> "erasure/Extract" +"erasure/Erasure" -> "erasure/Extraction" +"safechecker/PCUICErrors" -> "erasure/Prelim" +"erasure/EArities" -> "erasure/Prelim" +"erasure/EWcbvEval" -> "erasure/Prelim" +"pcuic/PCUICWeakeningEnv"[label="PCUICWeakeningEnv", color=lemonchiffon1] +"pcuic/Bidirectional/BDStrengthening"[label="BDStrengthening", color=lemonchiffon1] +"pcuic/Bidirectional/BDUnique"[label="BDUnique", color=lemonchiffon1] +"pcuic/Bidirectional/BDFromPCUIC"[label="BDFromPCUIC", color=lemonchiffon1] +"pcuic/Bidirectional/BDToPCUIC"[label="BDToPCUIC", color=lemonchiffon1] +"pcuic/Bidirectional/BDTyping"[label="BDTyping", color=lemonchiffon1] +"pcuic/PCUICTransform"[label="PCUICTransform", color=lemonchiffon1] +"pcuic/PCUICExpandLetsCorrectness"[label="PCUICExpandLetsCorrectness", color=lemonchiffon1] +"pcuic/PCUICExpandLets"[label="PCUICExpandLets", color=lemonchiffon1] +"pcuic/PCUICToTemplateCorrectness"[label="PCUICToTemplateCorrectness", color=lemonchiffon1] +"pcuic/PCUICToTemplate"[label="PCUICToTemplate", color=lemonchiffon1] +"pcuic/TemplateToPCUICExpanded"[label="TemplateToPCUICExpanded", color=lemonchiffon1] +"pcuic/TemplateToPCUICWcbvEval"[label="TemplateToPCUICWcbvEval", color=lemonchiffon1] +"pcuic/TemplateToPCUICCorrectness"[label="TemplateToPCUICCorrectness", color=lemonchiffon1] +"pcuic/TemplateToPCUIC"[label="TemplateToPCUIC", color=lemonchiffon1] +"pcuic/PCUICProgram"[label="PCUICProgram", color=lemonchiffon1] +"pcuic/PCUICEtaExpand"[label="PCUICEtaExpand", color=lemonchiffon1] +"pcuic/PCUICSafeLemmata"[label="PCUICSafeLemmata", color=lemonchiffon1] +"pcuic/PCUICProgress"[label="PCUICProgress", color=lemonchiffon1] +"pcuic/PCUICFirstorder"[label="PCUICFirstorder", color=lemonchiffon1] +"pcuic/PCUICSigmaCalculus"[label="PCUICSigmaCalculus", color=lemonchiffon1] +"pcuic/PCUICPrincipality"[label="PCUICPrincipality", color=lemonchiffon1] +"pcuic/PCUICSN"[label="PCUICSN", color=lemonchiffon1] +"pcuic/PCUICElimination"[label="PCUICElimination", color=lemonchiffon1] +"pcuic/PCUICCumulProp"[label="PCUICCumulProp", color=lemonchiffon1] +"pcuic/PCUICWcbvEval"[label="PCUICWcbvEval", color=lemonchiffon1] +"pcuic/PCUICCSubst"[label="PCUICCSubst", color=lemonchiffon1] +"pcuic/PCUICCanonicity"[label="PCUICCanonicity", color=lemonchiffon1] +"pcuic/PCUICSR"[label="PCUICSR", color=lemonchiffon1] +"pcuic/PCUICInductiveInversion"[label="PCUICInductiveInversion", color=lemonchiffon1] +"pcuic/PCUICValidity"[label="PCUICValidity", color=lemonchiffon1] +"pcuic/PCUICInductives"[label="PCUICInductives", color=lemonchiffon1] +"pcuic/PCUICSpine"[label="PCUICSpine", color=lemonchiffon1] +"pcuic/PCUICWfUniverses"[label="PCUICWfUniverses", color=lemonchiffon1] +"pcuic/PCUICArities"[label="PCUICArities", color=lemonchiffon1] +"pcuic/PCUICContexts"[label="PCUICContexts", color=lemonchiffon1] +"pcuic/PCUICAlpha"[label="PCUICAlpha", color=lemonchiffon1] +"pcuic/PCUICGeneration"[label="PCUICGeneration", color=lemonchiffon1] +"pcuic/PCUICRedTypeIrrelevance"[label="PCUICRedTypeIrrelevance", color=lemonchiffon1] +"pcuic/PCUICConvCumInversion"[label="PCUICConvCumInversion", color=lemonchiffon1] +"pcuic/PCUICConversion"[label="PCUICConversion", color=lemonchiffon1] +"pcuic/PCUICContextConversion"[label="PCUICContextConversion", color=lemonchiffon1] +"pcuic/PCUICWellScopedCumulativity"[label="PCUICWellScopedCumulativity", color=lemonchiffon1] +"pcuic/PCUICConfluence"[label="PCUICConfluence", color=lemonchiffon1] +"pcuic/PCUICParallelReductionConfluence"[label="PCUICParallelReductionConfluence", color=lemonchiffon1] +"pcuic/PCUICParallelReduction"[label="PCUICParallelReduction", color=lemonchiffon1] +"pcuic/PCUICCumulativitySpec"[label="PCUICCumulativitySpec", color=lemonchiffon1] +"pcuic/PCUICCumulativity"[label="PCUICCumulativity", color=lemonchiffon1] +"pcuic/PCUICContextReduction"[label="PCUICContextReduction", color=lemonchiffon1] +"pcuic/PCUICSubstitution"[label="PCUICSubstitution", color=lemonchiffon1] +"pcuic/PCUICEquality"[label="PCUICEquality", color=lemonchiffon1] +"pcuic/PCUICNormal"[label="PCUICNormal", color=lemonchiffon1] +"pcuic/PCUICInversion"[label="PCUICInversion", color=lemonchiffon1] +"pcuic/PCUICGlobalEnv"[label="PCUICGlobalEnv", color=lemonchiffon1] +"pcuic/PCUICGuardCondition"[label="PCUICGuardCondition", color=lemonchiffon1] +"pcuic/PCUICTyping"[label="PCUICTyping", color=lemonchiffon1] +"pcuic/PCUICReduction"[label="PCUICReduction", color=lemonchiffon1] +"pcuic/PCUICCasesContexts"[label="PCUICCasesContexts", color=lemonchiffon1] +"pcuic/PCUICContextSubst"[label="PCUICContextSubst", color=lemonchiffon1] +"pcuic/Typing/PCUICContextConversionTyp"[label="PCUICContextConversionTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICClosedTyp"[label="PCUICClosedTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICUnivSubstitutionTyp"[label="PCUICUnivSubstitutionTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICWeakeningTyp"[label="PCUICWeakeningTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICWeakeningEnvTyp"[label="PCUICWeakeningEnvTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICInstTyp"[label="PCUICInstTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICRenameTyp"[label="PCUICRenameTyp", color=lemonchiffon1] +"pcuic/Typing/PCUICNamelessTyp"[label="PCUICNamelessTyp", color=lemonchiffon1] +"pcuic/Conversion/PCUICOnFreeVarsConv"[label="PCUICOnFreeVarsConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICClosedConv"[label="PCUICClosedConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICWeakeningConv"[label="PCUICWeakeningConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICUnivSubstitutionConv"[label="PCUICUnivSubstitutionConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICWeakeningEnvConv"[label="PCUICWeakeningEnvConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICInstConv"[label="PCUICInstConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICRenameConv"[label="PCUICRenameConv", color=lemonchiffon1] +"pcuic/Conversion/PCUICNamelessConv"[label="PCUICNamelessConv", color=lemonchiffon1] +"pcuic/Syntax/PCUICViews"[label="PCUICViews", color=lemonchiffon1] +"pcuic/Syntax/PCUICClosed"[label="PCUICClosed", color=lemonchiffon1] +"pcuic/Syntax/PCUICUnivSubst"[label="PCUICUnivSubst", color=lemonchiffon1] +"pcuic/Syntax/PCUICTactics"[label="PCUICTactics", color=lemonchiffon1] +"pcuic/Syntax/PCUICLiftSubst"[label="PCUICLiftSubst", color=lemonchiffon1] +"pcuic/Syntax/PCUICInstDef"[label="PCUICInstDef", color=lemonchiffon1] +"pcuic/Syntax/PCUICRenameDef"[label="PCUICRenameDef", color=lemonchiffon1] +"pcuic/Syntax/PCUICOnFreeVars"[label="PCUICOnFreeVars", color=lemonchiffon1] +"pcuic/Syntax/PCUICNamelessDef"[label="PCUICNamelessDef", color=lemonchiffon1] +"pcuic/Syntax/PCUICReflect"[label="PCUICReflect", color=lemonchiffon1] +"pcuic/Syntax/PCUICPosition"[label="PCUICPosition", color=lemonchiffon1] +"pcuic/Syntax/PCUICDepth"[label="PCUICDepth", color=lemonchiffon1] +"pcuic/Syntax/PCUICInduction"[label="PCUICInduction", color=lemonchiffon1] +"pcuic/Syntax/PCUICCases"[label="PCUICCases", color=lemonchiffon1] +"pcuic/utils/PCUICPretty"[label="PCUICPretty", color=lemonchiffon1] +"pcuic/utils/PCUICSize"[label="PCUICSize", color=lemonchiffon1] +"pcuic/utils/PCUICUtils"[label="PCUICUtils", color=lemonchiffon1] +"pcuic/utils/PCUICAstUtils"[label="PCUICAstUtils", color=lemonchiffon1] +"pcuic/utils/PCUICPrimitive"[label="PCUICPrimitive", color=lemonchiffon1] +"pcuic/utils/PCUICOnOne"[label="PCUICOnOne", color=lemonchiffon1] +"pcuic/PCUICAst"[label="PCUICAst", color=lemonchiffon1] +"pcuic/Bidirectional/BDFromPCUIC" -> "pcuic/Bidirectional/BDStrengthening" +"pcuic/Conversion/PCUICUnivSubstitutionConv" -> "pcuic/Conversion/PCUICNamelessConv" +"pcuic/Typing/PCUICClosedTyp" -> "pcuic/Conversion/PCUICNamelessConv" +"template-coq/AstUtils" -> "pcuic/PCUICToTemplate" +"pcuic/Syntax/PCUICCases" -> "pcuic/PCUICToTemplate" +"template-coq/Reduction" -> "pcuic/PCUICToTemplateCorrectness" +"template-coq/TypingWf" -> "pcuic/PCUICToTemplateCorrectness" +"pcuic/PCUICSafeLemmata" -> "pcuic/PCUICToTemplateCorrectness" +"pcuic/PCUICToTemplate" -> "pcuic/PCUICToTemplateCorrectness" +"pcuic/Conversion/PCUICNamelessConv" -> "pcuic/Typing/PCUICNamelessTyp" +"pcuic/PCUICConversion" -> "pcuic/Typing/PCUICNamelessTyp" +} diff --git a/dependency-graph/depgraph-2022-07-01.png b/dependency-graph/depgraph-2022-07-01.png new file mode 100644 index 0000000000000000000000000000000000000000..fb92b658348a72ef7dd91db09a972195a30fbef0 GIT binary patch literal 2160294 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�PB-JS?U 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

a4{Ty0_*%-ZQz&@x#z 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

ZoLkfbHm-#XG#ww&BL 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±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 +&u;Rvf4aNk>?_4* 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 z%0D>iCB#s-p*2B4nTXq%3?J=>4+B9wesxPgQvtT{L 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�nkV*p;|}`$LU%WwxxX?s zy2$l3FgZJ^h)!_Aa&q6z&-WDP5h{f}FF9E;uR{L}#dHX41=7^7g*snSbRd<}+NgX`lGGbLfGe!9L<|9?3@k z@n{I%$8Wq5&->$)?|`Vd3k%*tfY#{uEtg*xiG>HbZ;PdCoAtTf_W2dapVsiO8HAYO ziTf7AFRqUCrTKyxw1 z)Rq`okc~}jiGe$7!qo@H^J>{|HXZJivJ?d0IR^ekR%f_TY5oyImpO)#gJ?wYIHWLK zCenXwWMcGyIdB~^G^5KB6(OjFcFzd^4Pm8&#aa8lbNTXmfjjVF3uyW!Tee#{&kzIjw(-%CqhrkiO2;QNxJW^}#JqPw3JE9Kn<-%UB^RiraQ{QV1R zzAK*+X^e4~>v11sbNs>@w^t!f#b3*?Fjm57N5C-GPf7#g`v)d9(X@UZFQStTwDz4j zOw*Qg^Hr)ZxASW0ft)@2n}vh~Dc+|g*)|*E4m@?LMRYbaFwn=#Yx;C!Obre6=~?yz zj8SvCt?z^jDzg)*&luD>fgJm^^8YUr|hGhz_0n5?Z{R+}J<6h9cHe(t|cbe|_d*_(%||ZPamKQ>!VN$%fE8R|eZ{Nph6W7qZkMohXeJ;uA>k57Ik`FLy7wK$s%lA8^@&3BZO zDYEAVV|oS#c&cr{0ZlE&r-*yZ080)@glFU*ZTmQm`SVpwTHvN~+wlZ6!~Z#I-e}J~ z{db6U-~Vv|&>REwp_Y@I?`In+M;nc($LO-1#}YXxPbohwYmrE>;0XNl(!$C*%W!N= z&6aK4tClZ&F>5oQ2m`QTf5fhP-~al0LdPMuM&I= zbn-p+JP!^oLq87k&{g0$)S`*&VPo(IzMK3rZW(IYQ{G8x3AofB$M0rjyo}MsQG0L~ zBvmAol&DF^hmQ%p)fmdXF?f{iAolR$;XS?03n$;G- z;n&g_=V?xx#Qn2_>FdWTu`=vodzk%^x*OVRwd}WtO|MrENI0GukR1trHn52DE9u9t zT;=}vzmk}uKRocbmur~dZu!Xj#A}t?fvW!NG}0S3?Mw^0OHt!jbju+C2WO6GN>`58 zN6%;XC&W^+ZHFB)gY{pP`KNh{I8;}y%}8#Hon2GNc0<1!YGN?iV9lPG+IO{F6K-u7 z?;PgfNYbKvvRRRV#FeFUE?Vo_g8#V_rHUb5x9CEDlx*M;x6I2tBJgfwBbD|({5EL% zL>vYtF9Anj?LaeJ-vc8*9i2Bc@uN8~XQ_*OOg?HB`Gk9YFl2OJCcS((jSB^c|QkUgP(N#>hPxBTA9-2c!c zz)S+Dk88Vq*A56+D=}fyOf&Vb?P%Nkq~&olP?&YhXR+hV;3cNQpw{X@_Z^f=t{51Zn0KBroqa5wf(!x zGM!IlkegwGh+W2oIk5-6+IJqx%hXS~>pZ)Z`02n>F=h1VlI!H`pqEqcX*VDGoQa`+ zyB}4R5q*Ev-)EII@QiwRM?TzjN2AuG$Uj|=DZZ?LO8go0P}t$Jfmf&SdWo(Xf~>2c z=)j5m%)ra?BG^}xg9{`y)odE+^K%OI>+y7`|5*u-F!A#GqI%y7aS7oCgF;EX>R=EB z^OYTri_Jbp8k(9lkkdex`A(vcU(VS07&fvoWckDb??30@1RKo;utUnA(JZvjj`81m za*N^)6*dLU`_VFrEX8NZkxT48iKGw06SV;=bEU?0Wp|EE=g>qh;3C=<5E`DGa)m)n z+TiB4#>nNcoskCy)-4P!EF7{3k=4zCr1;4be>-`-eLmo9*S$B8BGYTK)3R~oMr~tU zJ2l!Kh7Oih_tDNjYgob_?~>fSJG#O234CACyAYrRRBnj7s>07a^y3^BzU<0ZN49CRd0pl3D;G0CwzRDcr}YZVHqC@rbhYkSP5+dd{Q0m7TlSX~`c^$x zO0)YL(^MN6I2G0itB87SOG}OYFuYmOpJ@NUkgvj=CH1546LC9I;scwjz)Y$MKJ-{- zO4zC&z#Kj3(7h|VOaVZ!dlvhN6Y#}7LR`eKJaOpn3xTWnBsBOR0OzW(?O9!D%$oxR zA0ZC9SuSk_1yaK5DygJdfE!i-BFKTnLiK*HmRU6cW4{+*Jn{l`iI&T{pqmoAsMC3& zdXFUk!9^PW7wa^#A8a|eh_Z-K7@*;gsvEE$$?8J~^0;*4iRK40j4YztOkP-?Firns z?oqLalA%pQ2@_?PYOd#CJ5HTFcB(u7!^)7@KN5uaH10Tg;rPM!S|wOOj#+x7E3 z@=u^?C02jYWto@qT$blR>m)ASmtM0}r)q5;|9b7tBiw5WE-qpuF9l>r;CD1=k|1Kd z-d}6<41yR)ra&oT(e=!{j8AHeefwxjfMifSzAF4T9&05T0~R8#yD)7>2f=L5G7_9- zt4NU$9xl-->lXL%Tm_4k5}j?@<);eTS}nZxo3AK0hH80JJ_!37ZYKtOCCsB!@yW=q=SjZHu?FOK?CxZ zy5I=HjN}SzSs>n{2lk4t*8rr2Io9`|KYw^T$Nl|Uo4~S9(Z(aPXS22P;my~Y4k&Lw zNV{#zmQJuPjiFKmfk9!wN>;gX6Z>ri!AO(RF#5f__`O{8qs-qjZaYUK%BS$~_x{A+ z53{)iXFVoz+0XVU)VOxAi*h>&*R3#=E=k|iOuNg0iVV_Sm4!FEFbfBKR#H}$P(Qu3 z3%R0)I;9K(p!Bh{vSM@mX8IE@V%R%a$q59=8}YRvc2rhKMSy^Q58Rl1z-=XAPbBBf z!^5LC+CL7QC?ws%mHyw@q37`;nJWBGJapl6uUlpVI2eTaON=@QZ5I}QT|VN3LKrQ# z+c^A`Q&3o#kJqIJx74#01pNZY#jU7)Dyh`qm(S$$U#>llZ{Dr%h_%@-Df%3TAFut` z73kld^=<7xM}m_vmLyJ!#FiY)ML*7xzr@M}uW7*PG4|fPCxVfYtpPO>xl=YX(fEgi zQ~*oS1gr75{F`vx3P8mte;N9;&R#!*Cj_3Lw|tCL^veq!{zfo3fP~u{FPQkE>p6`} zN6RUF$G8;kGMz{iQO@?udB654PDHPKmFk`&46nXFWE~OiUQb&=!5+OWo(4T{1c(Qp z7X}mX5{MVqz8c3zMm3|qBe_jdBsz`46$T>RVkH-rx6@v!InS8O?|$#&9u2+?PmhIP zS~tvG-D5R5j|%79290}&{>p7Vf9Z7D{dJa!x^$Ho&A^{QqDE*PHW$(^2;Pk8ZVb>J z5}`rP;15P}Z$d&+Kb>f=cfeVR@I^9-Yiny$om+CFChiBB7ED=LS?8LVK+UUoN-J_%EJa%9x<~tU_#Y)r%FxV4gSKN5GWAy2KXp&yHxKsNj)6AR>(|$Oa0fl;l-wfrA3|1BV}xH<}(wHz8q7cUwLVPb_*_*7iGBYtYc8Hz*Dcrt(a1Y8_fJsFB)``#y zZuzB{!4Te_AEz8QX6Jy&YarUj@hnJ6<8{NT)p`^m=LS68o@h>Y84n6Id@G1z;Ls6? zOplGSx!`XO7iRKJp@}7l>oDBe-WT=kA#-dnjjdYUiZWj)^RJ`jo-1jI@f!v=E^vCh zvp=D*VeqcBV5@Dl9{biKk!Ok$cFrn^im8O(p-^>J5LwICTcNFBT7vvJnA{;4a4X88 zF4*Nj?L_2<7!#JkRIVI_Kk_hyhi)4f+y@9xJjw_u&7>xOEDbvwxH~lzD&hU3GHF_u zu3n9FqpDCqg^rsAPMnyOh_LH=@AO9=iU*>P2Y)6d*s$8cHCmilUw_g{degTjfBir7 zVdO9x7^uvt|AQSt5jDbwUt13+dD-bkhWAJS8bi%--L;G7%HERExCS!-JmDd920Sgp5ScMbJ}owI5*>wywl%ZG?@FG ziJ7bv86AViZVfbsgi(s&15PbV)I+xbG~&TZ3@EXkxBVF9C&2JY-E-|OEV2y6p&UE@ zqx1FqL8XIt%rPOMSFqQxhQ}juEWpeFF-9A{mXvIPXcM)mM@B|Qrz7s0f-DBZSzN7T zR0UslVu=kPU9iniKmNCL#IdKw;T7w3518<>Y!%oO(z!E#&Tl)t@PpD_^|oB2W%uJf zvv+Ery665>>~YYV?CsS(mXld!i|@JYnDvKfrO!yIhFEQ&WG}6)#pri0j)#%#i$FpU zu?KR)Yb3AWQKCgUlcctrfuRDo;f}szusAmBe*<$WIf(S-TEQ*Rh?{;IAEA~2YwjKx zlKg8Qp+4L6Owb8g%n;vi!@2%)EMn)e^R>q%H%IKnYemcx@wWmsJ5eX=C2Y=vD%LAO zC}L%84fN-wx8bo;vLy3Xw6wgpMWFzH{P=MPnn03af%@kIhW-c)&=_PZ#(c9An9)+7 z_^RT2Edy`Q%L;pGY1wq1aBW1ACIo8_k&8@f8-PUV>FFTeJ%qa)$=E%RY@vV9RAuVj zuHm?XlW%(1=BXtW~u?7?;#leYAJe`FjI#a zHNp!j-s^yUYr51h={}AKhP9|w5G?!Pc&NSPfEA4;b~Ucj%NT1Q3IGR+8jiW&XfUzl z{=;7)Sx^&L2l)FJV#*&qNu1U`BFqw{B0HHO5j*p*_twDIrNJUGoNaz#ftry~zo(g7 z239U4qK1YB{=q%6IO{ozZ%)Cm_>!^lyDj?n6gQa0LjovwJpno!&2YI*Ase?G**dATl%=#GUW<8VO{t(ep(CNoM%qel z{W7t_LU(@{xCJ~Q_C0ulY(|&^yCc)^Jtz!-kRP6lTJyE7Emvh<4SEZ_slR{y>^=Wb zq9A*_-;ImC=%CnoTwTWi=ir1O;A!Lo+;ncSHJ&N&AS~DUkLGg-?nZeWT!xg;-XV?k z7$+wXjbo+7#UA(#YnU5Cso>8kgJjFC2#DE(Ym*q`5X1{NZXMuq5zahxKS-xU4eh2?GbPKwyNGsyFj7yiV53l++r>Dd`xObc)TvnSydt04eQvx z;>^KO2Xc+M;|U0E@n;8YWj-e@Z3%NFq$yK$4F|v)-pwlYm4e6IeVl!MC32&`u41)D(yHeT`u5qeu`Aehz<@eOMqC<&98sTP<)ND@ z2ZX#m1Gf<|zk*@>HH~zT$n3Ts%g)Jx_0?4#hRBLDDCpqvE)i7|RMaQTRQfz1VB?kg z;#+V|s3azDU?dTP#cX<}vm1VhMDL6|hZOZLtfFgh$|fV2HS0Daf$Si*RJ_d%)uP|O z51{mb)iM&0-qxZcBq8ToNyo&*^zuC<6;bpY$0dbY&Kr6onMKTGVBE^^4Z$1*c_2U`~6hWk)B-r)`wsv=4 z(|APbk(yajQWCCP8}I?4J(U~y@T?ZZ8VIN}YK=rmye2Mra`O<+eUw?G@kShrT$#5t z!h4ww%>Wt^g zId`2~zvZasqWVOdGS4j&eVSXed!jyYwC<8uS2+AQNSE)C+@qXoHifr4Et>lz{k>dT zng?#b6InTZ`gBQoc{iwpnCVR=mucdDk#w_r85mfM0pIr4h^M#7w}TfJCUX?~#3pH6 zf3iA&X%n*EmQ54)6-tdBR8K~gj=S?|hzTv@@AGc|2t6B z&5BVvU+(&2B0$nMu#W8)24Xa^HPiGisa^o#3>0}b(tF@agh4vk@(M?C;y3pgfq4T} zJ#k6E9PyjmmfgfIv$Ub}9hwcCoIIEen8vEq^HGZ>?nhfqyjozuM)F+%S)sDOOk}Ft zwizO#2G2Z3%QVhwgY%7xho+l~`DZ4m98Au%Pp2HqvSi+YR8$7~;9cjPUn|WY7XieN z_8jUkLdM3>5u%<)l_c(zm?eINBmx4Yf{LJ&Zjd$5+s49Krrl|B$Lf5QE0(Dig1G{* zHR+K&Ls(X3i|wyRu(!S!7LLQ92~?#&1l7{SWETcgu`2N&_7WGaXF6xjtRak6RD)Mh zq>w%cj|>FqI1?EX=ZmL`CNdINoM(f^^M7$5!8L3QBwZ;b>1UVq@=Ra7>EfH zAf!=5CjQr!6{M!)nhtL;9S7+LFer}yIvhya53(z64}=D6S?G$QR^z$DT=3{;c)T{v zR;A{sDVh)1C~cOKuCU=i35WE%mwtZVAv;4tST}|b0P@yUBlQx@H1twC@IE+g;X|1) zrBw_MESzWm^M8S573>#v2Abn&<9{zmoIm2ckNYy?tSrHd-Bk_CkvCkY?*j__q8UXm;GG5wK0kVp=TzO4xQ zD7YSi>YJo+LdEs-r>gauE!MCO^h!(P#~Mey$+Zm~yJNVssx7g&MlWtvqsw&hIUuc_ z{Q0Q2G~q)DD-@jh<1N-z8hb{`iu5D10r?c)^iULam4+1nKhbkNv<>hlu0 z2J1m^$Nq8X3$a6U!#OKVlpn-C4c$j7TcS$6N}+Ehvy%x<%;g2<-~EI?YQzt z&=tfZq}7ew-SGGQ+v8rFBiC47vv__}r{ht?wnKhm%(pq~W2++zXtz;T>Qsj63yifl zeZ0YEc{PpRh@4?M431be$TTHZM+NKS@R9(5V=F#7bX7rNXPW704Z(9vBe+LilZht~ z@;2vL-H%jK@N^;IBbk7}&HUP*8~nestdCRph)z7t_h-3`w);(CaWVXz{%gCxuPZ^w z6^3ZWATC479e{gk=kDE7|LDpOi`S{gZ)hF-Ow`8w9q%LkgIb}GzF}gVZv&>V+Eae~7va4F` zyLeQZu8bJAH#O~tH#5>*5?yM|1;K$zC>^B-j+ANI5 zu{Kdu5P-}2gXdzBm$d}^>7Ny;33sU|r^$pYehyRZYpsrr9=bKyX#llS&o?bq> zt?mx$HDV@+_v*Sbe;oUh*!=*>;DY-XD96z@Pcl*^FCBl=@3ve0#}RLvs~3*b?VuH| ze*JAe;EzN!Gn;7KLvim+gW|GDal_n6C-Qfbn+83xJ%H$hGy!dGZK)qSJ(IU)p+*7+ zO&S0(-72J$`Yakd0a z8yh|}og|iRK$+MDEPS9PiTawiy|A?wr3hLQp?7r5bL+l}w6fv=21+ zJ_ntr6p4WuhCfJex_gf!*8I_Blf==`fRxc(n=dTSW6PwoV^pKHT~h+2R~bzggF}9l z$FAE&6GCTYXII?Xx}5$rthcYv8b~DIs2v#q6VRi>c-gb_YJfZDKpaRYSB7R`(bG^@>zDTxghiuX$y(hRN{Po7NuQSEbak zwv&>(72(t!4XNaLITflxj(6ZTCqg!WbjJI|>IZBHk&BFf3E~060#;omFB%30-Dvd& zer62Dd)W}!fg@>vc!1=0fB*jdJz%h($+~ioZN37th-5@U)Fm5uN1ZT-{*eO=Xn1&e z=b=U*_a}S2_RpQ&V7(q)ZC_Jw<@*|Wu^lpT34WFT-A|iCS`ViIyf(G%4 zRu%bn*(fRO?Z{h{3RFjF?Jlv86#41@xvsJ>KU(Cvq#|TDD5*lfovp?__R-}{AJfwX z+_v0SRZ#efZeDi7ZrBeZc$2W{;WmV5v`URqLlA|KLYMO84U3lJ=bF+%6*y=S{rMKh7IT zU1|>uI$jp6YjHc8{VSJwNuy7@=<@7_mNsU^wVp-8oU7t&a-Kz5JFe*d;SFBDeYCKy z&KJci#=1uk^a?Bjcw**oDuCI4r~cLLP@5aUN=+xvg@I-HRSYf#)Twm2DY`i`W zFfZudxaOB)7>(8W9^n$5J~oGbmaX$~3Ifk#e>O(cG+yywPX1Lxt*v!cM(S3nXhl8l zW|xJ5<0OXw$ACO`D~9?ox)lQX@_lJo!56ri@jA^}01Ba$004oe4jW(``(P4JiHxAo zVasE`V8rmPp+U9gwfhai0wOtJh_6C(=fAw}81VHm`_pq#od88i{!)!Fx>b^?fzle^?>_oT zg&27TRB{DyLmp_)%gf&zqdHK)As|t5<-<%sxKe1YqgJR`zeSla#U!Or?2pRIZVab0nC$ zeXna8r`Ea6EHxbC=G$oci*Kyy=cDmz{*zK@nEhNN_i}}1 z(~J6vQ-;m)-&b#xq)cRWy1;FaI1ERZ#lFYltW7nPflZ{wpbMBqn5$vjbcCDx1w7UP zjh=&18$RcT|KUS8(BOK&vwk-uJmtv-l2{^mu^7SC0)WO;_0N6uua!p+)S>evzXZIC z8Hd>x?v%Q*Tn)PD`r*AQ{xrMh*^2_U+ zDQN93xJ4=tXY*YCK9Jd568Xn=j|ctJ#<%CBbrVe_Io`xc8!k6yYqZWzjy8QfPSp08 zof~595QB0Oz70#x3X@|Km_&19f#VoFYhb{Holg#R@ZL!9IL>W2#2rD<9$Y;Sx-MD% zD(x9yRLjR)|xSJVe-=$o{_N%_Dm`s?;88=7czbv-_PUf4N3qL zA3nGS^}3M+O9Z!J3@!f{=&8Q&uP3ygz4}gPa6$QTCP@NyEeG!k4OOPu;dfberfDR% z8Bml3iWm}fh;JnKZwy^=6vMygzP?dEvIb!B^}%`Z4jN`0_^{?{t!^E|H5~~&6&<6B zqwbz4&YGlAwZb#e4{FaaZj_QzqnHNnX}_-chg;~*F*e_ZirKf0Bc(? z3$v4dibrSk^#1XbW3ZTRK;K6TBtw9%uyPWry>`thOQ zkKy=a!fos5SV#3Wp}`bG8cSQ-X#G5w=z}o(?8S`d;0oF87HqtC+JsJyf-J1j7&q!+pKFX`N-Ujcn0{O$M>b`QUL^$H0Lk1!r3hWW=X23a&3 z-84AE{?|l$AYoNcMoM_YTi?sV8?Hq$c}QASKlgg1vz7I%Ozz5H-iH3_!OJ>L{g)4G zhyUpgX#G2P>X}_+ZZW0Yt<E^mLzUiMbdJYy<`yNRSUFn8xlz|uc3*bJ zY7FEpEiAr55~h`IhawgQEQW|UW>0HqYwrdt6z2UE7^2~*jSmoxmvML?t3ad1M##Be~z|w)E`Y)up7?pCk3o!vTj?XqiXUm1#CA46LIV49;lIUq{Qlc3p;e zs^+NcS0q|Ibp2XDu+Q-DaL3aQikC1WvHV}_a$x}v4~IAk|H97ikQR`j&~)?Gtr950 zL4o%-_^_HJC^WK8u=sTJqhb(V9L5XdNM%G6KpqEI_G&a4>??ajQOD7)9Lv})ynS(v z&4TlN@8;P}{egM5j9+y}>KdJj`xGZu{w%w%D7|GL>7(`RH%3xhJ)fD$eqP=Ck!4xc=)QqY z;6gm->B=4LLwN^Wo}j-X)y2^TjQZ`QU^6+aj_G6>sb4m+6g9U$|35FB8h+X;^m zQn-VWKqeaqa=H*FaTW6|BtQr*e0_(Xg2C_nC<9K+e+DTPYI_ zqd8lIH6Q0VCT!AbT>b#Z6UgicGXuvxL7>RM3C%iYQ?RxEfHV0({$u#F_5qm!#in@Y zx$Qf4NP`Q7jj{R2#tj>YeF|7{=dOa(M`R@!;YT@#1QvsXU4rrozV6(PGk+t%+ma1b z>B5#Gf}ZFyt^@zN9GHfqLnG%FYJyUnI0Pm^(Tr$GZot#P2X0R64ORww1(9vYsTxCQ z6PvEQf9-(HSs-TE_&|&J4v&MK(D7xq%{TA9R}i)a zlf*9!Je7RV9(ciUFAy7m?!nVS26sX?AT9n99C*@9et(LKSiD*i?BOBf71BPA!iIR( z!a1u7)C+m+ZaLBTNR{fiIZh_GEo_t>{)f6W_iX`mis1#+0(^^Oovq~2iv=P^@P|bn z)&OV;gqB1abF2ko4U0E*PEW7REQA_r<1wUfBOhE&uImZc|Gzc=bDthDwEnX0$ZV*M z_LBnyi82K1xj(m0V+&J!;P_|jZD78UFO0!IA#s8tat$&ZFas;QFPp0g;>tlE1D=H_ zu(Q?VmXt;qC7-IeL(5i zBU}eUWKxJ#QcL_^-4y>Lt4yHA`~WNrRrC*BE&KURRs1(3`XT@CJ0kedFRJ#+M-*WE z@KIb%y%iW%ifo=nIe554$%S=~s*a)>Nl?W07jd;$YWIp#_b6keLx|(xB@$ii|LB?DMXYn+JfGh97kJ3_t@54*e zkF&5J3ltMPZIl$+gDWp1@X^nrNdJW~Cpyr#;o%f?biqmnX94^`6&|afmwUMC2<##N zLSKAgwoOqJ^_)B|Y49<@G_|?`{~cf!9boSH5k^Y>XK!KH-6#RJ#tXz|CqOB2v;l(D z#BeH!6M~9U!ot*abnKl{yBi>rBV<4|wE%jZy+*PZE*Jn9hX4?YzA||25ZxPa?1X?} z8ENUx-rjRq!SP0pk;a%tSb2)j!v;5l5W9fOjRQpF0YZw=sUK%bDRI2V@RC44p@30W zua8z1m{zv0-WRWnJbY9;nEHui!uL47YjPz&CEq^#P=2)e$8|2lEzFnLv~zYb8&&6b zY`&3tk?qJaImsE_8>3T;hAtta`^q%p8#PCYZEbbKxMlhrdU<`V+eRBFbD><`x_|%v zpQ#iSJUl#H{QS~5%fWQeEM7x_qhK=>znE3!V!Kn1u(yCXF`^53q~0+&=m}i@D*9eY)w5^z)3xFJCb+ zd0bnoB?$=y_dce!t)UdH%;U$9)|4ea}eW@8|P=U)On^=XqV1P1uSs5$xb-o+jjv%TkF} znNb&%B;FDDS%b7Src)9Lc z<$d|E9I>l}JvpgdZP1eods7=MVvX&mPv3Af{DD`c|ILbwXV0`@DlO^xa9Omd6)k4c zrWg|wv($2j`(U@6Hf)mbBFhcw^>@sz?;af;&Bnz{Y>4z8L_&+CMOu9?Wihf`0ZxIV zjasLv=G_x22@h6)ufVDtWBR8GYpP2vQ3GVx%aP<{S;!%Aud=f8WMoMy@@N|_6J+?VlMJo8Fw%>^)H*7A^qoG@;bcRarW$R9x-ETTl38oWJ`$Uv}vC%&r)CisVWcv zGx+hF?_K#sIha&7QnyVwFuXIGl1Ezn1&WXBxv~a_lgdG?6dT~=$tvsCty{5Q#jE;x z6Ra=+&|WyubViKO!USYFXO0%szI?-TzjyD_sgvnzpMjQ^mI|X##@l|?v3LWxtGsu# zc7GF>DnZ%O z5$)M#lf#@jZ51p|58btOvc02Yu*{umvW7s>H-+@alh1_8EV$yco&x(C6``%IZR)|Z zN<)VZ?ex=6t$pgN$=S%DeMFS1tz8XMR>m$My?Na4|db3Qv=?3yl8FEyEk66 zPSi4@sZj5g!aoyOegDp1K4#3A@9uG*>+ObayIGNtm>4kf`8a#~ZS$-fKL4GC8T0q+ z8z0l8Cd=MaQ`>Obb`M$QdU|9pu3v5P+O=y{2?X7?*!ZjMmET4bHDT%E_Y?O@O3H}! z;%Hf63#&c?BY0Nhh=}+8;Smug^RI91f8{_SSo_G4BRc*2Z^;X?@|Xkn4)r=;tNirt zJ$p*oYoCL7RtOv_S*4`gxG66vKy_1fWuZPZn6v-|M~)rK2HVIeC?P;RO}8bUII)G> zQhe{;Xxq^52C6@kMD1qG_|a5oquaFmz=7)2_Lw&Vw{25Hn=%&LQb)SMOmCteZ91nFM!yWVfKIYPaKbDN)2k7@6VoAf|73i2}_N^VbYT3lSLQ1|tNiEe`Q zJr>-(>!#%oM%(Ri>A*frZp)S}W4WsfH*jlo^a8D8*?5tpO~Es~zf6h+89_BP#X^{U z?%9SgPR!l7gPQE(2&N;2{%TPEdCxbR2$=ZXLji;bVIalo%_|k*_DD*~@6N7ze}Ug! zTwR-@sbeVCN1r&}S;?eXvu2pF%fTS5m{lYLq5`ZHHngC)cXLVT?XmYCt{e-QIdf(~K|x*0dTS!1BM2OfZ%m^O2+%G~Q0P@k+tCXa z^spU2Uhzx#Mgz8Zzg#h{;V`)s>x_gKarL1!R+AgR2%~1r`iX!o`Ixvx^%@@+S3NF& zA?cXiMlZd32bf+A4ONcXxzl3Sti7I5`2#!(bi~O5T<#cp?M^`Ou*LhBi}K~wL=#0t zMK+ylQ*YS7EI8SyFKW@E#gWuh>6(f=di17QyZWY&9z7CdK>#%Y$lwV{opVtW^+q8m zQ>>a?Sx1{@3Opc7f>NBy6ZOJTdsX&Mvb1a_=2oX@$#vPk$u^2W4 z3EYDA1o{@Qo84JY$SJ2V%Ox+1>-`LqH9fo6b|Vo5CM4*Iea0+wRJ>qBN@e!yI{!G5 zN=M1ee3Soyndf9urkn-BQNQuJMJ?vSHzRdzvg@GbHM|=%z-G$O=hR!WUj-lzPBpB) zpJG)Q)M6}3nVyM>8kT5ci~L@?`qXHFpoqG=aAobZ@bK`JHDzNESAW9CwrSU{j#8V? zDh_;rYsrLZQ-3{6*9KJCynlKbOKBuiIFp@P=kWx8;KS+D%fQa>|BMlIM^OI$*?!8D z^@pSC^4o@LOM4N4u#_=^4{$SZ`uA3xm9d=jj;^5skFLGPWUeoGsh zmUwdx*6Qk7Y?P4K6LmnXeS1F|PTPW@@Gm#x7r#E_*!uPT6WTZlx5ma!W*}#g{1R4wGWF`8Y8NpL3*BkfwR;W^_1?gP-(0EDbN1LZUW zxH_^km=Gkfxuj-ypZ@)WE?yi)$4W3 zj_?@|3gdRSd}9!M`_?UKc>><4*0$>2g?}7_bOM5da@x)TKchlPdBeO86&h5`ta3MA zxgwoyZQ+Yb?5}skmtQuytVbEJw+#UswO!5t&h!8%vk!-twA#+!9S^r7z3mf|bZ;LA zn=wE^CLfDm$SksexN5a{u_5}Bq+q_ND=g}6nu>_wPPyux*vXLvG!u|cg{m|s*{pBh zwpd-g>Z;=lG{(K>_5pG9DR-qYnI0JzclR8#>0#%68_jvXS1VSpf^nC)4-Cf1QMOBy zMlGx3QN3*;gN^Aymu_3~hPzfvg_RsJYSx4!N0h)-*C>FTZ1lA4r%hAr(W8ePeLTyl z_^skG0=YC zB{nn3chsCYV3|#B%a*kT=~48aimZ(!j?l{M#+j6AABh+gSA@$B&Dyi=}2Gu@2(R4L+fg zalLOmVvzw_2>gX0cv^o!isegQ*L;`a-r(A(Kn^wIOsw!(w0Loms({|6ZY-_maamJ% zzcF~xIyx$<`erbdvDmSI6~d9mA$JY=^<7uI4HA2i>rY3Hzus#vZxt?4fX3;_+J}<7 zX(@V66L4`49jlYyCLO$|#1UC#xeNB380zfi<_{(XxR(@W#cbNtgt-$=xjOU4lIyvl ziQ|U3mXQx+fIfyCuw6@NEB1p;jXS)H8T*#F3$Vkb9#l0c@G6bJa^=9P_N5FDj35gB z#XIx#^z1Zvc~_33F<3U{%D4WIzMHwn!XDs29yMjk4$s7V_vOnYNt&f#(A{)yz8Mk= zmR5v|$2^+_W&`D_$`A`6r``1F?ph}vCLcL+_1d*2Okh&D8r$i1#p=>muYzE4;_(Y% z9}U2?$+jfLwr$(yB;Od>w%hPdI7hO1N{R`hQH8?MkK$L59@MWl(R{Itk40mK;=}@< zEg(-OgS7Uk*}B!5?2AULp7(h##bWcxgaU$)nzptIV3V${_Bbo7e-zc~j)c-tu)@5_ z=C0TC@zDL73}6Rb*l&!>n>MRv8pfTDrle%>NVo0Y9ZV=pNJ&vv={9^LbrfNCGjBI7 za%|St0p{nemdCl;mWiKQEqyw0oqlx$K!{Oot+Dy|7F|LD2;( zz3Qp@8=^4e&`|lQBtIKUhJLa#giF6Ydpe`M>a@3J53&HC{n zq(wku+=upj--*;y5w6EpnwxsXhc<|tsL7AI~ zViP7#)YaF|G#;U=y>r*DUS~2dwQSoZfNBPLRRfv8O)E&XR&DL6DAl5+Fh&u(cke#; z^I9(c=ovG1d7ApA57zF+c2LhYkTU&?o?ZG)9atECck4?|kROUZU`uv{j-Zcl~_ynT?nkXKueL@5EhiJR((&OeSWnfO3x^a8K`0Y+AQ%nXqf~FR?AonF3tS;zk20QWwF)Rukv^yv>6J()mfme=tI z%3H8t+pb+U@G;H1{<%me!1O#u6CF0nN%r9L(5=;cgXOLv1B{I&&vJ8{r9J4Xzxd3V zGdir*Ce2T&w`=|l`v;l$`Q$@S{{fMKDbD29kaLHu)QX;vfs(!J`U6JMBC*qqVQMjV zm#(021dH8!_nwaIb&_Xd%vM-dasC7iCtA>(vGZ<25E6K9`<)dxJ+rVSLH&@rtk z(-j)}?(F-T@FP4vxx1Q99!~ki?15YR|BB67Ob5_0@Kt(?X;_Ird^p#v1q6leR41np z=HF{@nGE{%+ssfwSCYvzFTbkIfAcFU7j(o`lp24w&T!M5Jc3+8 z{HP8wus00}2@&s!9XWsCz=2ZLVZbD?=LpGzVU8a?8981lmYKi=6c`pIa6a5u(KjYW{=%r2AR)XMIeO$dyF0ZGf zSL5Sv6RkkKr36AkUeNjTLx~DPY;#-Twsm^-YKgKqj6|seH_Fe+HKTJq5TXq-%rU*W z-e%&doxQ#8nODI{iHTIYVGxYsZSw4DaoxtQeyeKHe4!nQ8ZMMouw@yT#7{b3Yx-zi zkGL++JTOFa0F`K3kd@@1>K1Pd5?j%TB((s(vC8`=Vhbi6y7KG$Zj2y^gkwpIw8&D5 zR%y)VYYRl@g$P=L?T1&BoV4u17Zo^!-M9)v!@^c!o)oi`XJSth@Fu3^K`A&?KHH0X zPU0c2%8@ovoZYfxo?&Q8w0^p1ZRtF8==pQYH%9H+B@-kXZU-Y3%P|GbriXi=dMs6s z9U{(M>+nvSi2IuTwFQ#HCy&7j1X4(qQPCbbdeoo%2!q@b7KYB}x5sjKMMc@U1S%!MM?QaYevRYrOFMVf z(qeL2AT`UEu6^}z|0|-Dvis!+UjhJ-P1{nQFkb;8-v7{{o^N(5Y{V3M?ax28xYWWs z;Lft8lKAXpuPR8BHPk^a1Icp+R5LDeLYKX~ki~JN&Qg2c$`>seI=JUmrtOpy=l6nfQ zL7;U*Zs#stid@dSm%V$}jusuc-V}?szk7ohMSYU#KG=PAsdg*Fa?2{wuwHcxyKxb9 z<8?uIwa)PW){7SPUS{4M>Xv4HTUAs$)L@b2Zr^T;*mLH$W38lU;2$r->W+>IzYXsu zrt(=IAv09q@^8fqYE4N~$#jq%=GygZ^J7QaP^4i$UIi^Kk{rSxfOj`NbWEPAz4mO@ z%$bk$Vn4L1Z%bsDLY;Q@Od7x`k5x08EX3+$F->5pRP83QNcye@Z3qwPCaIkT|0r zkMy;lF(Zh0_kHDaIw22&eE$KDL4wvJyY@D=)C=~wk(cL(r_(O>;r;vfZQ%JtKxrHm z>)lFsUcf&&5gF8$GQ2v?h!L-WSKDm-{eeKl3I$TaetpupfE1U*4fCpN2()g3;(D`U+@2~{w0e#eNWyVR!j3i==#0GS%I0)g?@>W7RQ>Sc7|Lw#d ze{{msC-;!5j_9=+>%cX1WZw^&4<77ZwYbm)CIrGxIxC4YPN&W9Q^c9TtIIDS?N>j+L8>>l6tE%#}r`~@8-{Vi`LmARA^0f)@QGe_GmEflMf9M#M zxvhQalb%I9>>CQuAv#!s7aP+!bMK?t|8z4Hi@e(TuanrVc${NQnA}99C;i2Yi#7KV zZ3LQn%TAR>T8NZ$a&m;o-m)cs*a9mct)c#Q_Z^HfknJgvHPbj&Lib!Ku?XHM1mcU+ zQ~yysTmOOHF5F<($bQzXhQ97XF<6*<*NvAfo5*QA8qC=*=~n^?MsgMgPD+ zMJ~6=x{n^B^sHK3$~Zfj494%ll6m;y2I_$|E$-a8vvvFS40@+3*IZCNdg6o)I9y<8 ziGB0w6DLO4O@80~MXVe=@vS_a0FQQ==!TbV3p_mo9JQ&eBy#;IS=EQi6dx)DCOtG{ zS7gGihy_R(!VQhze!aBeTNkpzZiW$xr#sMcGsTBLxJlRCyc=o8AH4@7Q5aHtxYn@0 z!)$f26din%W@Ugp{hU}=T~i}-sTez>O3OmCEmm9k3BIMvvSktIoNoMa$WLofI16C2-~av57V6(FhC|1Pa7N_% z(&`%kf4+F};sUzQg{S9*%D@K}y%z_Z*c|LnLNCYX6fin-X6U~lF?>jr%F&}o`Afs0abcK68z+JUV7Zo3J6GL| zCz*++ypl2F%;8jER#U3}pgyfzx27-;{`l1#C??bwV;SX(NOB^_ARu3R@?@Xq@J;`h zfc$=fOL0+AnfC0?=H5fZ>Sgx3oj7QTkMJ&cU+g_j+LS7qDDH|q0X8~*WXAxY*sJP> z`Ze*fb`SS0Ua~}S^K(nxo%ce^ri6X8ia}vB@w(;(s{gi#HFyv-noXBoCXF~oQfPBvn@Ve7i}Qsm_9Irj$NxWrC0)-ZO9r}lh&^Jx6 zj|6x#iSFD=H-V$?_2FgPxmUc$ zb=<4?0J-3Yx1eQ9|J?FxU?vc(`oq|Ra5j*uLHi65?;Z81zq*8s^$w*^Lo(~);mQ6p5DegTo@O!7c@-FWO+Un(?# z!6h}#4JGeG-U?vW)l;mU)@H&hCfTRkFfk7PgkI74_?zl5&Ixxyk zI9!Tc6wsf*$U@2kS5ccjKh3T78b14vl}#wx(bwdtzcTii9YRu3wYq7|B^XAPDn494>eD3M!MwFF$f8Qq089I6W z#tpfzfDvgI#h4+79C>FmFWBdM_xFtOY>RkLAs68pb>a|)2B2q&2^eWKQ0e;mii!$d zs#hMI7#lF$FmOs&^X`qT5U9LI=T>Z?H_lL7IX-7m3f1vc^A4l3v$KKSGU|Z;tO95- zay&WeMPs_{3g8Fa(Tjl8~d*DPE90+5J! z#09AHuoh}1k1^=e=O9YX_3PJF>uX&O;uk3+M>f3m!H*8y&(oNL1YzEbo+ zcgH6uhd>-k(4^5a;q&2ejeqoI37P~8;W{`oE?kdFF6@qx&w#h!)`Iy9tSx44r%sm0 z%PG&mek6uAuyCaj0xPiS*6rIaNCeCQ4Q!MpP->h!4@P=Oa7n-OHSJAA|9Mv=!HQ3c z>8#M*2>|fEb&CV$@#_oHeSN_sjhB7X`9kEd@)Z-7KG_M@52j?1BMMLWU+>ud+aVFY zh`B4szGq%s|25U%KVE>F`T?rjk`5mHk*ra!_3Z!FeLn#5i(9??>7|FR_hle)rmu=7 z5r?@+FvvQC25FFXbIDjP9v;_yZz0&fUfQim_2+8Oc0rkD);lDs(5EC-&X%o|xE{`0 zeyVyy{zX#^sDs6FrV56zt6DgDuzrS^2uX7YXNZe022yw_(~xnMXJ5HBMnOheJ3H$z zCqeKpdUfXAyXw@7sRsvLB&~776bZGN_{yAebzQB;jcX-{7R={pQ*TJjCWGV9Yl1`y z`OoU*K0lANiJ3y3AiRcWlrBhFope&(9uzHC=AS%$6*We|p_lfrHYlj$CPi z-9;=)z{f=yi2+HXbQ0F2I0l6{=BhbjZ_TE>m9DlD`zw#QH7KLaFHGovK*$}AP|;Z} z3njHFNSs!Tw8N@X0AgiGv3PS~*IczGrY=K65x*PRQj);-?S7PhacFjj4jmHp3Zn_m z(~%|i*-w!{>F?Tz0xi=$(0Uk-vU%^`S*KTQPiM}>$4{SX=v5hQV{_OkHf-z5wbjo@ zV{lXF*6^9*Vwbu8MVuMJI1en_kyHZY%h6~}SfH{P{f)u%hVK^XUKVlyE&_r*h-g;+ zu`HR7gRqlLrS`P90Yy1JkDt6gRcSQV0OGWbdM#eGXtbrJ|GPavpI(0;%u^~SL0S5*zwLFfZ3N{MRbB&H15oI5Rj#X&zX_vz55sxOX?xxwD8IO^X z2^+Ap)(c-KsZB_qvNu@O@6n@~RG6616-aL_{trKne&4H@88Q4U#LT!!Oc>+{!Y2x0 z!@S>yp<*DTj>1XJz^tsQrr*GI!cu{VsndcBn2Ko$O@&cq<=aPt=t^rt_QT+!aXuo_ z=t;V-Hq~Pe6?>X*;|6K9@$B9c51uG(D7Vzsry}nr5Qa;ck;B{+H;n3a?=HTlD%gy8 z1f)9^*{hfdWXg1|W5!pgTmN-U`SdKfJSmTu%bo#a-Ha@^X3d(kKMM~3MC0Wpoj>u1{gu;^@otau<`uWD?Uq0vs=9s_#5SG!A1&`4^t;nC{~24r7LItHM0s( zsIW0F!>Teudt^89!~OD04#u!F9GXIgdm3eI4f7TD`UAEQLoF9TWjZ`_jv~PEPgHho+^)J@C?MjD4)WfFe3E@#FNNHL;2q z)t6yYI^JWRo^F6rcaS9iUpq=45~B>WD?qE6JNLk-C>8SRvqzy4TshXyq0WK`%tVsb z_<49|O-L`|7;>`d*;j0Y{7szz|8EQ?O26xo6DM+UotQvjidFHwr0OhAM`zMJjsO4k z&f;ak;0f03I~J@-zXw0q@#yxbBZvw~wYruOKjq2zaUPmqW~sQOTxV(KVMj*8iaT*4 z-%MG}lKW**|7;Fr630zkvY5;S)Io%x`QZi#hZ1$o2xuif0ls0JXd&$fl4H^ObC^u` zL;Yx{&XW`!jc*u+=RmA49N01Z8zdvgT=iD?@Q|^kh}wAWW-z{@frz|{7!u$tGZ}*? z-YQ^Yd2wH6o@lWg^D5a={4|rl`=FoGj}%B@C#*TlJt$$Yn?nYaqcY@erB1%DbP{Nw zQ?nI7i#zXx^yn1{39myAD{c5R`e1;~bCo@5RCa^~T(` z4I$M&6n8bqEuWW9enFoBObP|W4d3C*CU+0mn!aesl7mN%1benA3Wsn+*2^`^Sq~r; z7dH+)DU!wPi@}OUF4&EhK&eh6Hw=f)Q*m>1iyuCIjQMTmg%vR679@HqvZyr+wkQXIN%PjNTRJ_)tS}jOQ~meaQnHFz`oP<9_;|$XN$JO#Z3$MBJeUCPF634p;97S{Gr(@8UDemQ-v*UvlEeu!;WQ8xzL(`ytJZN_u zf5pl|X^|$9B5`jO_=R7$P^*08Sw?BY74WHT_$q+6Rg94RSKGA&ahhPe$Ij%6`mnaY zMHW5ZZHSKZwGI-1uZs(2!ci8AHAl53asSvz`zcRbaWW z#T~AVS52sOxw(#-npJG|Ke_GSzn|OI9A%-Tu(<_i3_D4VSqrr(84l)j1L-jzI2;Cz zbM6XukcwcU-3nI%jGQ;2Sb*NHlzXPjJ~y5|d2$p_3>oAO$&H#y>NhF07_-JHbYVtF z9qTGyS33@bCS13~^%rso9kBHavM~PekAMK?hEOWNR1;pCzNwsO&BLUFcQiB{gGA~J zM_wdIF+_V4F9rKYNBRkn@qTT6s7K$ow4VsLk*QXc(%4?(+qSXlj$t(c+f%9=J+6yd zkY||Wp7F0akwGZB6b9UIBKI)>h#PN<$uO2EMi5I%Bw1-*qM~2nW4@QnN(ClkmlzRm zJfZIfIkF<6U@FX_AalV2LhO_og>lDKF0K0%`Yug<8>My-MIrxI5olQb;lshvj;=X@44$(XiG(fu7#g0q{9YeuOY9OtPxeTO1cy5*b zZFsHk_a*D~6nIx<{uNo25By(#jpV+EDm&HBo;f2*U6)@bD5-gI`fwHCCp6VZ7?*C2 z&+nfFA+BSbvSJ1_d{8#wBMo|nk$!5>C|T?V#QEBk*Uc%+z`n*8NG;!f0?A$<@y(eV zk$TXyx8bkqdJighbkTK{UM$q7;4NDOTG4m-ytEXq?6;D_Umk3uVxn1y`$URSR2qfC1I`vR?q zGh2CKOeIhT>xiRu>wyE`3qKFQy-sg~KU5T78b8zl0}d{~1h&VT$0GFs+SU)p!sa$j zuydg<@?2(CC2e!Zta)8~c%6Cd=@Dr)Uww}3gLxctU$K?$Es>)^$vhGZ-)Gw|#X>q_ zA;nYG%d{fXci?~le)NZk6A0X+&R{IQxs<1z|L52`&>iS@I2~zwv@O6+5z zs67eSnOIL=G^;Fbud8Q-kAtFLE;MgJ24w%iKxSRH+II9v{G(J~*~s?>L_6iGI$>SR zqWB|gH>aTWZv6Hc|Gn^0Z#|?lLcEAxr)9YwBlV&VMT0yzO zxDm*irKt6XP5z+WD}2W((5Qf3-u#>WwJwAR3AaotTgw4KY}|x1;b0;V{?H*;nq^Ym zl&~;&VV+!!XB&$vc~B`eIJ6&a9D{AUjIv7%fr4rI`2X)di}8~W48MkNHIzUN%DD#R zhX%iL_3AG#YH#t`c`d=D@gkiJ_p9YKoSjIF%r1B+V2Wi;HN_&@mwvV7V@^!6k)>4( z6bisl5fMNvnm8_a$8r8QT%Th$7tfXu#n4F%Nb)ZHbRP?*8?GIxs};n`MFk<6C{bFx zs?sz|@)tV?oR1jVF`7@Dc)RC@X#r+<`chhBA60PDfhC z$P^x7J$Ns`kDZ?TPL%w^{AhDg*kED>&ms&Fav0{i4E&?0kT6irTG8GKl)d89)EnI0 z8chfDO4HxkZB@k>Z(-GbS&44!cM7(ZYdRwX~}6Lnz)ff#lC|yxRQ~Vs83rxO}A-kYs(Znc`f{~ zCH_<=oAzT7Hb-Nyf@sAPU4HG?y5X!-$76(hlU(s8PU!CZU#C7-W9gF1ys5%M9up|ZLb zQ22OM##kzwt4&nznILIFK^k<1uuX95iB(h-OBtUjCz||2$p!nS@+dfGELK^D1k^AO zU^G|+5^>(_oiwOhqUW&&DvVCAw9ZALhmqVN5@ZeEAAA7VYZmwg^qz7Em**zWOOvhf zq4lHfHd4|qr_0^lovY@L(g0=M8IO#vv9YRbVunIr1;5`@E3a3N9@)<#1(+(p3Cl01 zcB6GG5Pt^DJ_)lKB^;P02YPjp|C!x&C*Foojr~E#!18BTA~^hI9MV75f9@w>m}61O z@gnaiR)79^k_2Gn5ReO`aS-5@@~0iq7zb#PkCnys8HFV!Efna|+n*PtcZDD03+kl|ia#!HF4p_XM>`de-ZIIM82U2JY_7^9Q6~mJH(kx>21JjE=)b>E<~I>-?iMVAh$@;)W6NQBQWR_dNLeh;Fm5rK!BDEu?5O(;+xqo`=R zr&Un~K|)rDb(vlra>RSA)iwTVxp+UEgH$6gT4RV5M;zoMY;!LFNmGpL=z*srd;TK4 z9VFY*M`v1zFiXx75YWx5|65UtajtD$5!}LJdt_ZeS@fFrd?`YG?#P{!Y){n$_g^C`_AMGPu)bubtSn@?z(me9RciOeK zGX})M(+eky?nNe{59FBditss%vRM}Xtqt*3JUY@B3UVk}6};QQ&TbS;3ueTJW%+;B zZMa2oiIgkc7-D+h-_OI1e?$GEEnl=f%(rv~pNj0>!O!16jp1CweZHI-(@r(m4;C|n zk0>5s;Du_ZPD;|&k#>C~A%-r;jp?0hNbm4Io6&}F7Szup>8Bp7Wn)qcl7YhaE2B@+ zJS)CG(w+Oh@RL$ol4SIlION$O-g*A~0GuTV?QLmJJ4=~%9ix7!jk!S?cY|}5tGe|r&z+xI8kXa1WHP|5_dsity~fr~ z;}^`cG?-$8& zXheT;7s;GVqAHKs9oS6Nuql5wFxKbq&QK?y+*wryes(FM_u)9BB15>hoM2V5(l%*3 zd~ey?x42uE0g%@0sd^f9;J_sGFoZ}9Td}CGKtrLjaG*#d8rXN7)|3JrA{P-a2yBc& zE+j0hPwhH$LLWSejC`QM3ix4UWK_(K&NCepL;dVF4IMH>yu?709=w16i0_~+=3j(B zbU0|;Hn}`1hPp_A32m`Ma0$wL!*30&49mYfKzKiyRz-Xsua#s)m-*4Xo0a_R4mIfR ztm@dDas1KQ*cq`CzLqNBGo`d+JP72~`;s4vCt!GuNYe!JFi zN9+R{yATHHsTu$xyvEI{8qy^m#>!~snP4)VNC3|R;J1YKy zXL7n_A-miZ-0K-E6bYrD)(y@VM=MI!ayi8Xaq)%`NB8PaLw-C=DkK1V%1h zJHORc>!Me1O zypG3i(6o>-d{t>MyLT^|a2_`9UB;}_X=%DY|2(~_Q^t~%nP&|tV-xDC2faA4`O?Z# z3nramBKH}xpjW6D#K=VZndg>IL_pyY`dZbLE`bl0&DXq8nHeSDpZr9Q zILHli$W>Q1HZ`5vv9raytSGQYdo{JuJWR|HQ&Xmf@b@w$a0};>T4KzM8RxQ2&tcsL zE3qUEBbwp<`NLp%>T~Hfq4Nnt>Q=MRoUxN9A6{LN=a8!!aBej|xlga6bhv^)gNGn( z+tD$ZPufT4QDH^rkJ(~oGXoRt45aiTjaC5LB(30f;bdQK@AHHREPhJi3ewV6g_!R= zl*b5A*g5b|Bz-f^ix=m?n{+l?>#?UQZrVOFT;4R3B%Mo@wp_~8XY{F0i5$K?;r6J)?~z4q|o9$IzE zDk~jdlGSfJJ3Cj$Du&WsFy@y@;bCF=uQP#w%cGEcbVKv&u_H1k zmUvgkgljp5T?Q@A!cdX);}~YG9_bgSD;?LU4l?_i>K&47CDIXqeoSe+oe^IVw6M)= zb9IZw#YaXvIBYLA$-4wzqsuDo%$fN>$V-glmbELaZLs&M+llT9HM+}ev)#35>sOZ1 zwxW;poq6VYSpO^Hk3}Ls4QFldL&iE=ywJr{FPmn#EK%1vX%AIgKYAUUb}q3G+Fltg7^b3@&}~!YZQ6Ac|d*{TAwh zsfN?i-0ciHP_J#}7&8DtXlY4g6j6Oka@9;HW7g$3s`hbC-~92CnZ<K zG65k?;hdeG;j|QdsETOA6zb34zP-(nmyyumV0{>O62dA>Rg|5%31h-!76%KsppyYo zdxrlu03$m)1logJfnTdC3c)xYTV2=V( z;*;G73e5}a?Nsyrpg=!KlZQxu@J>kl$X6j~8RNAk8Y~32Nxo*@0gUT7EgLT(D+r=J zfYMjN;*RH6_ka-dW~GTJsyy@YTE}J!>S01Fot0y?#vFNWd!f#lZZRG|Q%|I-myRC_ z${v4vWqdeb?vp2bZ{d8$ph1wK9Bhg_=mBV8OsQp(!zx5=S(qaGE}#HpjcrooVKq*- z%y?iHKRYU#GYg8wz%1C4dJ3wf$X*RWI8-ro_`wA#@EmzhYMPokSUB)5#e;^KPpQF_ zK4f|?R)0LLt6@fV2L6!qw7$W72w#makY;t6EsZF1hypVE)5m}TRU98N7_%5@?r$Ud z^cnx{g8JM!EaP-+JG;OGxy~xdA*9T5v}(YBmr!2ETp-f@)r}!8Es-bp`*tyfOb$Tk}ap!ZgIk{_ywKy{pBd4Y^ za!<}&UDeSO@YM^k3`%IAKeZ4*hS7koY{$SasqGUNK7tM;AiD*chztqh`VVFqk5F+f`5 zq?O6r$>rk`IJPoelh7fCG%Tz+^rh7?1aJ4x%VwUR8+^n_SUCy0H$T-Rv*|LJkYQ(i zV`}#0@QXT1*=4*@IqB#RZp)Y7A;Q%&>LvSza(otUlL!nS@|}t9I-Xri2Z?f`)On=dEocIfiYy>P3%OHZnDjmOSvV2Ee9RySQp11QWWF$BYoNZEj zq!kWych3nCcmV$7L`WH(TgU`s;zM zUv1U5YLBFXo9BC*fuJ_-crlqC(S{O2gMJF{9VE7O*9?7_uj$_pOzUc`6}Eez8+NKbLJYT_@v zUm1JMjR)un9FnQSD8$JJr#aFyAI{=ys(tNzu(WytK8j@IL)f>tKwQLj^ zLv{(6*S}Dw6(uRsK&dhLNYiY;#w#f2DC!DSq=YR8pzili^v8!ZT{YUECyzodD?uxo z3TbTB5DOD<(Mu{OVgu&c)B__iSj6|M`@(T#C$4{#$<1)gOTYmqMx1b4GqbY;xz53X zzm69o|8+rpGY*!~uVEn_I<#+Z0p^BD&P=ml{bzkOArvk%Oe!-pV&xHOV;A#>+jJffz#&+TH;es0eLTBI zoFPWZek%#fJYjD2=$<>0FZO!%;st}v0vWuJHEz%@+CAyQkwx!B&AYhB%o`ilK)j9z zaTBF4$)qTH)6&kK&8AH<&;p?|^}@h1*gfgf;H;y(r3}+&UdiQx_pR6^NF4K6v?y)S z-JTGy2i6=a?{6Jix4DH;}b7GdsywR%7L-w2d#DFqRQQv|ioajyBM7DoCzdc@6IYCk~ z{`&N{AV|p_SjcU)S~I>)&G7S%gQIa+nk*Dh>TTNs-gz6D36?gg)ppmn{D)j zo|#XdcH{cXBm;=~Oe$*J|A#55gulnp7+U_>Vvjoy(tMtM6pn9%@JzyE$d)ayC?tgu zAQnhQg}I&MVZMz%928zwA8EsmeEP(NzI)Qel0|#{HC@yKW=uW5dI3x^)4xKC?E_r7 zkk+98kkC+eleZLu)7i6ZrL+rM(yNvdf2^7pBk&!(a@d{hW3bGzOlXk|@NFg<3&%D;# z`y4OJ1QiYhV9xw~=?y$(4==AD3`9F-w<9!9nJLATkKl`376B3hgEKPE$*?zC`)_l+ zn*eyPSJYa3F1&Xy8_*u=Rbh*8Lc6#UXAjqJ(Z7H?FK;`5dNa&kabPfNL^wmwVk?9Rvh@Gvyrsnj}eA}%S*QQlyC@XFq zHuMES!kd{e@GbsSL9+Y+LN_tg=_LocS#Wee#fV>k6XPxpZsn&lbuGqhAU*Ne67K+? zQH*vBhO_rFh^M|FKx~Gjrq)DWJ2as~x0j&6uEMr6b7h;EZOD40d4c3kPKC%pB%%jY zMtsTzR5ltZ)vBw*RNfRPe<=D&bSz^&)}1%4HRfU)9>T;{#9ESCTQFIa?SgHe=P-Vc z_M6@n0ToO{yFPx);E`U{8>NtY`7(#rTZp8!fqjO1@1!>uqoYpu?g1Q7F$pqoms^xe zJ&5mPtd_m%(_sFLWWd)&flTrhj-r}K2*YjxvVhO0yI==&zKqr((n^C2xs;m5AFryv zq@fY_4-vyDuv?8EKc0)m5(LRxs9T_N*(A}g-@8D!i#k(HsTULKPIgV6eSQE1(~K>v z$OVDQDjyasTo_iCsYeu&jit~R7(c~d1A|d}t);d!i6oaV8cr;uT%&JNp5_u3y(s`Z z+xJpyUh0%kXQ$eI=g3xt|A2U?3t3oKQ(dhZ*wrFgI19qKa25khOp*)st9NGxy9cf z)-V_N5bIsriljA&hqQngT(#UjV=tu3A)-?M{R&AA$;JZ*_Q{@Fv5Ppv733~SpAEAh zEOD}7j;CC-YhyU$csRra@R4aD+u_e8WKtC$e$j$)x3XR0n==A5WU*Eu|Gk)m)m&gsxRKsp5b(z>fTiK7Lht$2) zlj1X_=EasK+pHPO%r!}H9&15*%jVw$wD00R|CHdj;4QY|>RXg1iB#!w=SU<-VA9-8 zV!Hfl)s>A)1dQ9q|y>le~ zb0Er#ksU{N%ns_`bH@!BX<7e4lw#QMe9D7P%=G7~N1GkU`9fv#8&h3juy%5e2Qo5- zdXvGwQ=qGLhFi)zvch$6u%8)}tqjrwHiss_%@PFmnfuJ_s!(JMa!y^D9R!n23)Lk zaMrzkeD3|4Ki8j_ecnPsF|&p#cjspXtF=!unnwV}i$^JTx!Qd7`Pm(`HBW=T*(?{5a-^W~Ln2;%LvDdDfGTIj;9&Hw?qht}Nv+E{xSRw@$ z6#eAOZx5s&*$?%rb$<38Djr+{mJrsgZeYt=80>g)VQ3=WS>8)Mrm=giU87pUbBQXw zWJwrRvJGfsIS6`A+C5e^?`HrKR${0D^i?ec8rX=I zFZvmNywNK*ZmJ;*gR}15{g9Mpno@D0XKlS%AuAB6lyTa;W&u4cDzgZKc=XOV$mmpsA(cgoC@Gj8 zxEQm~KRT{y*wfzI@jKK6OEijhJ+YbZgjIBREUl}JW-MnPH(2A5YH&67m&lN5-j`nt=ZWjaRJ$M z-MR}8dY2fJ#q%|mN6nB1#uhD#2)t7JL9z|~tu}F8La^Nh=~f`Z&~ofxqZTmO(43Hv zg?&PJdCxaF08MemLrM3Da=1R2-AvTYVuA&HSjF2ZobOZnI}}08>_L26eX<`I64%)^JXv#JzoOxC{E+zSLlk*jwRqks z9e!)@9}r1`m;*=_=mDw3|Edue31|UQP#h~*DR>0j0vTQ_s6_#6a5^i0tid?iX!`#- z7rajgVgw^;FLju*=s-i6B~P$mDq&*`QuPm7uLq7F8OX=d3)v`w!CT&Z)w>|SGeis# zF=gEb+emb|chKFoT5m@B)MR(8`p_Zf9aR}>e-Uqn5?&g`cn`wwa?HZszFla#q@)c4 z{`Ee;re_DWet^8?n3q{yT8PkkGG@SNR1d#QYuJ`&0z8$}&e zF0}lE-_}x;}^onS;yIjVa#G=0qmbVR5;mHt5+uw3^=+l z>}_FVHZcG|&Nv^MvN*YQ2eb*pPg6PubmU-&J&E>w*faxcFog_C?EfT}*PD6uYFyNm zML&bC$+h*b569AHrVV!C=?OQ)X_qmSGz@kgFh981-gY8z(+cs-z<<7Bns<~=R4DqP z?292W$rc3C!+hN3u4AUfPhhM>0tb)-p3*B_dBHPTAHt^+v*EOqsoTsZh0qEkL0@)= z(%8Y(txs?KIueOS4~b+MumNvY7(}(`DKaIPk`;!!@s*Ey`}Wee327u$whS?MbDN^v zTXAFh_b*`>_mUfr9Xl35>fWF15qo1_+Sy+Cf`GNLMGU{Rrpm^%5LSBbQ?oI15# z$0NOr!v>N46i>{&bzs}JYcMzBN9DH> zN>3F$_!}GbP$}POh=+aUr+_CZGjfah;F!4*S}z((N94R0A*L{c2&eSNYwqxF%tSDl z$Yd^QAUeDF-uC~JCllBHcI1cb3r^rcslERdQg8<1?Hzbx7~oppr=J04!dl>aq=j4> z-DJHc3W7mkVumjxu|Wy7#GqA z?L(;r%OKVTu0aoQH>4Yg;`xwilbd^(|8$zkY2sFaE2g)w2fY`nUu*pACP3n#G3&D> zfJbO?pBGH)fqVS%V5ZSw7?-(7$;q$R-2c#DG5*YcmPUh8SFw_rYOJ?s*Z59Y9b}QZ z#&7R(3JdN3yf@3shm0q)R%8-`k&%21uf}hmlOm@bI!5YaEpaFssNE0sGb$8>xe80z zcL*j3a=+>mBSjmGI?0tf1?hoGHl7et58YV@Lp-K1-p-wu70QJBt%wb_T4TJ%poql* z-*DRbV??&qI_&soy02_1V-MG41{Fh1<1h&G-@L$ztagMraNe=Pslc0vD6^NCB=Iru zGv4&)|1NZydSdQ=x;JGIW7?eQpG z1GLhS+?yvG9srBT_DJ9XGe}xU*Is7k!2+Ks+a7o&dC10$ie@{OVNPoMzgcNqNQM?p zFykxrXjw%?Hr4DNCYCW;&Z|7b?gzPI#B0Fyx}Q6*z%yM*R4Odo2ASbNoizB%H;ac; zDEB>IUGYXPA;*KCJ)T}VZ*{{om+oe3?BU}kPE7hCF#fiL@~F&-5Y8pm>DO+f`(P+f{-T&kWtLjBZ8pRH;09U{;`&x(WrT@62=GriE(k$BE`3A} zx$BleWy-c{iN?GmyQ(24torTxz&wyLUWS!bbJ`nS7-WU;61=?aiBgg~-Sr*M&z@WP z3&`UitLk?Gpwy! z&|^mD+YY!~N1+6NV)O{idY>~YM*wqtZ#o}#89UX>xL#r#vs_ChuEFgvU(;6W=mfyE z2BnTGrI~|G??EI-7fvnCp3(Aj8{Vj-_2{eA1FcY+(eL6tmbvyk;Gye28c^<)IVam4 zdidbMkzSXSV|3FWyDVOuk~Jwu-cX2B7mcBt1RdV7QS!6e_5eS%lmH z)s2nsrkY*`W#2u!WQI_R z$B!?Me~cq{OsPw6`g^ljx=Sxu5mgzw1vAWM#V@NNWUr)d(m6L|0lC2;`vQs`BH9uXtEw~x=W6#XP@%^Y_wo}goFyqN?^zzl22l-V4#xFj_MIL!1Y z6dsN9W|!iI9?)8^`|B`wl0`ywwFcyf{*D_~yXKE}o5N!)HyaK;GPVb&l(@gDp>7rY zRoHCP8bUIA5^C-YdoQzX2ZF}{O*NlCcMJ?#V8!J}6XJ8(UtZ@aGe$9YSZj7`dg<%C zi!!YOFlVb(F>(Z^LI4lAM?^@bRTN7{ zN*Thy5eo;^TvZ$FE8gW9h&#gQwL?V3c|d2>**5f$-v zOPS7#spXTiq^L3D{%K?p8IPpdcc$nQ#182};zSV^+IQ{@q@RpS;1yq3J|6j1tQH~% zaefI8@CZy73gw{!!DXfcD1)LpsQvVUXPB@Cuv=0J2pl(Y+q~ORe-k=0OC8EO z9?+R#7%jzG*Wrdp!A9}YQ!xE=>YR(e2ZR_N7dD+jUtqpPybPQL*vs_5EnBu+P~Yj0 zJfHq^*QS$NJp_@EBo$WAXy1r|vH02eNt1GJ-VEd9%l;U4GEP8sfq~7Ap$9q$s#jts zcOoP_`~_DV=DsafByc49Z~_mEt{vvY*?4)?wa%RuzjWO%7Af2j@|^g}+V?0Ljy6I6 zd$2}|VuU9jqT?@b+czJr`aK%zfYWys%8F_WVVT^K2fSC1A?F+-*(gWZa0(Z|r?mNn zLofX$_F}lNT*@v$miP*Iml!ol@I?(>TS*_18d0i<|JE6jh3**QXb=V(X_*Caf_bCN z4p@Kq_|fQ$cE4RWR}Cubbm~7|fK{uu8E+#xOWv-pt=QEq7dsa=nrMoVXxCGxR)Ae- z#Hk4kTn=$SWpDgj?F)xV)6P zX}8Ih0f%_(#91NWQVu+{I!Br=GU;+646r3M8^9CoCFk+uSsl76cVWmx8(1s+d)X;h zyU1<^Ce`6#m<$D<6#2oLa--(M2RGDYnc@rLt)>FdoH=5;!7TX9&Ja0}6!smjD*Htd z=cGLNQOqd^`cdha(6l1~m6{#D@8PW8efm*VvNIAL%KP;uT_TjI8_-Rmf3@k+;RH%s z1m7T~@lTKjzq!YR?x<;0ZcGGIp%5OK*0<%g$o7%pUe%+j46MkaBrSDCzBZl9b@0VIIsnmyid~Cy!iw8GM1EHwnL&7 z&bK!5{&a6f1Dg0H^i(Q@)F;c{0PVL&M~|T^3HFG7Lm0N|C!a9qYJTYoZI?quPayx4 z6c{)r{xNz^c72SpGXQG#g|#xuj^uC91S5y(vPV(;P{LHhO-~fR{xoQD_hlznS5X?f z(u;$LPyI|Q#kt~b-9Hh$pdRv(5^y#|nN3PoX0$QI9H5+)3Ozl$j#gd$O*gVwDPxuy z<0^4}n`JO*iqK}{-pCgE9?#%GBW1U%TdW{hEy!#Iqx_$dsN z=4;I20Wx0HlD}K)qyCb*=e$S}(D_k?yFX<*ml9M?bju+PU zCJjLlC^7YvM~~(pr7SG!X{!&)C;IzZq)g~3WEWL^NJi#;D#S<;Xib`zMm)LVvlqPy zJZ9+GK|CdI#smg!o%NCCURhYcDJz8v^@g}h7!n^&!Ja{Ck-SEGHU#Uc5|NNbb(QVB!h7!30J|ppll5XwVI(cg^hYP91~J+kC``5q$l+7ds~NFm)P&0J9iA zRGAx-YJTEd!siHVk^D~Ze1fU|&T(KdmRo&aSZMpbF^RiF$61ovM1}u@l|sBHfk7A2 zA9B37u=!}OX3$C+-aotcE#OF^?CknP|+japqO7D+_HiE`5 z-{L64K9_|iN(`qzm5N?AnM3v9{+ato!?B=E!Uvan=I-a>?_+Nj-%<>o`%)UJ2uqlP znBi$5#SDY|P&h>ntCh|@Q}>dp8Eb`M&j zNlr?nc>aI5dhb9k_xFEXBBGFtP_kzwqO9yq*_DK{l9C-lA|qt4h>TK38AT|OO|~dS z*&~&aWQFhJKJU-(pWmP7oQ_`Z*ZsVn*Y#KzQrx=Gi04}EtToLydC7-fo1c&GNp0c& zEJ4ULK^UUhJT)Ug%r7s&lfb}D5cxo_3->8Y=viCypuL4&lS~3k2U;*Z4Z?^Bh8OFf zu6%r!+}kZw32+7BqHCocIc51&k~O zfmg&0A&R=MaMWkez_*gQ)i*jNk(ty2X@sEbc%hA@8ZjxJ@MH zq9Pio3yGrK6PPF3FA(D&4gCH=DNRHr0E)*_qYS(y;A-wJs|gYzkDv(1E&{uvf4V2| zMWI2q7G@-(heY>|KgcU7c^_#6PIKQ*;%mW4F&MJQHA0iGjA7ocJ1Z!#B^$zWXIEEl zVc{PYWAzZ>&jj@Xo*8YgKr0|NYsiqrIHkp zh5!8dFYT%Kfb3*HNr-NV0l7p{0g%WDrKxPH8~Q%4ye&5!P!+Nl7=li8;RnDZR9_o9 zfta9;X#_qKFBiUE-l}sBs%J5D+(MESVU0wSN>Hr8bF6~cD8LNEW@C#CFGiPZdm5mO zI!;K>JWmm6nh1nMoXQ8>)inDh6@V^0j^w3mc#p>k_Ywqvg*9DWMQt8(kY`&0JjQa_ zBvgK4{}ggv^)KnNUJ=6^32i5Egd~s{41|UmkM1)BVigbj|A=WBS!eRZ?SG*c8@D{? zBbC#9WZu!idV0apgT&0*j$8Sl!=LV25(hWW)x6hRHb`QGZCTDE-~z0I03%Q^7odoP zW_9L{y3+UD>jrVWh@BmMnQ4?~8Yk((d`yqY^H(#;b{E==tJ`kcWkwxO_+9mFmXS;L z2WSxlB)%v@XmxqfO@Fz6)ikMimWs|rZ|21=k>~hgl%3M(Kr-K)-7EK!Hz4t_)Xky)dgfnjhl@Ct1^mRNO*JNy*>##ncNnl@U%@=da}Fo zSIvZOV$b`H*eg?JA{!^);yWe!9vz)FYHC_e53xBMMf*!aTeI(zp<2R_uE)WrD zq)-v#r42%3TdWCDCZ}>Rk(v)5qt=8oAs54NX#xxoF+l)h_d>l6;7@yEp|v`z(S(=0 z$!Or!DJ&xwEpz1W`mk_Pk8f*zOf|A}bR5Gx3Izh)1W5?MtB8&d zeJhY5Mj-O~0t}chQ1Nlh>xFe@kIb7J3#M1>cEODIJu%Cm>fidz@-OWwi|LKjt%o8j zu7zd36F7+|hPT&NAtAbW{d&QX;{bnTBt0 zhdO?~#}?2e2uE}fmetQL2(0xFcnELUIehhJI{b~i??a`PBROMf`^wL%3>t$29v@Ud zJ&RxI2}EDq1LZgxMB~hFR=D;E#DC{rK7jP}sAB54Pe6||Qo2cnNVYqsu#M#r(bs>YHP*4k3wy$31?E(5Hby#JJal`3@tv4f;Uw z>x1WJ>}uIwV;|qC6meotDRha7z?;aEpb@}7;+AXxZHa0Z|0eXZmXWMtht>FF4*rDw z2GMcBTyw|CO~#`m=o?<{r4IK$V_p-u?aRJQWk$E$Fq(vJeTy^dv{r82zP7b(7)GH` z33+{23q2Ep8LRKD(d)!(t{N23&b!Ba|t(D>Z(2JsMB)r zve2W5J+F-vDXjkF7~Cs-gi}kLZX=^!ZQ`J~bfPcRdK-5gQ&RV*PnR(|HT;!uC{ z&-)OY!Ryck!8fcyUs<|qYDVPW98SC}mE)|f`+@_V*bx7>$H7pt{@m)T-l1|7;@2$y4 zo80JU0G2cIKP~vsNRv3#Xw=M$+YNI7SF^7&mGSyj3wR z^))h?|6aU$WeZsYu0u;yJP4B+jQ}dQxyx08|0PCOd`oz8AR#bWM@jB6r$J&Y%KDws z(o$&fsE(kO0o#)&pHKX~5l3Wo_(Qy{UD9=8nUxNfe!~0Q zr9m3c3bXl#927m>9l~Np6Tb2mHf~4NlFm2tdCaYxc;fK! z<(OSvSu{I(+t>4=IQgc-ztgD_&>LPde1%TSvt}F~2G6y!g* z+0zKIM>qJ2d1)MPvCa?A7o&bg@=)fjDm7ysy`cD^urNOhc|n14_1S$-gML=*m$uX2 zeZW4e@JL%;#J1Azr#)A7$_)h=cI`WQ8_>eW<&jHr2M?xO9wzl+L@!A=wQ%VJEjBq+ z{Q!YCb_4Z9)+C`s=v}@F<;VH+6EFAH8IBKf-cb>&&}CX~9v5|4 z>d$_@S($xK-Z}q%-;=4HE928w;sOE~7W-zVYpNvRvFu9wb z+w6LLOjn<+E7fdsw8H+6+oxrcNfcRuJU zoMn$U=14pMT?gLJT{_NQUNv? zTw~VwiLwm`9k5I;ZURC%bI(WQED^@E25rkL6tc zX0^Sj6g}?8Wxr{&xso3xpvRyU{5yH{TR>cyt4p=fZ_-bTN5bPR0{OQmPzkrb*GV6( z{Uf-&!uv#M^vRHwjVMZZ@ig}42lH;WX{q}!znocZ`K3vlUgThU^cFSWX#b;=AD=&f ztaxLtbE5w3@UlIlfJ)mCdu#PWi~47#7rDGQv*?vHAzdQ~=6eU_AL4ZMys*(GvXBs2 zUH>YdgR-yz=~p0vfOId^5}R$1{A85FAzG~=S{*)$W2_)MugoC zGI1>bGexr>8t&aaRiYWiE3~adY^1O| zgJxfW*#q?b8pP{CN^ta^{%FVv_7W07LZ=KIpHVeLDaaX7;^^jx+&Ij0Nz#$?RM_63 zjXCBVLe_fq307ceC>;}%{`2z^NSLcb99+YDlZj@4r^F}e?rv~aP^B}sK)46MHeSH% z5Dtq$h)IYwAoakCn>)P=<}G{22f5Nz#56hXcw5Il^dL149}KwDBeW^F^L(@9pLW*B zXOxeFv_-!7Ox}C$t3K1RD>r=G6qwDl_0tEy-(?P=iVb%>wOgKDIv=Zs0U*SXl1}VmSnlueB;%Y-tM2O;})|tbrDAxVvuXZ%%5`qKCyYp;MX9wld0kRF+p4cGKB;anuu=k{~Ql8V@`6cQ@W6Csm1E1n9DICs>*L{7w<|1S1Q}gSn7>5cH)@ErKPpwXB~2nx8#&Q zc;*laC9&8D91WqE2pr9LPinj)I@#moTr6qa1M3%DeALDat7*Pev;KBC1HDrVaffb7 z(hM89>CAeRmh?6Rk(Yhmy=zzR0ai@sc95L{jzWxYIvS$H$vAo{%reBPa!{nW&X#(1 z7EhR9JchX^1MdOBF7@A?p;{5ny zVTDqfTh|S1w~79^#kr_fBYloRVnK$%Y^C-8Q^lESu z;u2N|iVtn_2!t?@M-w!pQW^52R5p$gbNa?S=omyK1jBHE*WTFTBj#eupXrqWkjxTY zI%?e!_jnfpe#fDs+;jb=d|OBUCY1R;lH1(DX!W3EI9ai;x@=-@@zVTUReIZS^7>U^ z;Y2JTu@{X9egpsae}DwR9m2o{!+z|{*Ec6Hb0X6fFmnLM_!=RItUU&xDjACzz>8;q za)lBHLv@DBo1SV82Iwyc4v_$X(5Poea#sdm-3gHn^xd8xD+dU@2hlS?77t|{(aehi z%{mmPCq}4{aOeRLyd`=70rUV6Hz5wK4SfP3jDY$AF~_m6XrdShyVp;RGt1V;smZbo zazuzTG)HHWvzl42aOLgibzYC^p59pQ`nX<3B2XP}L?h%Dqc2jp(zaij_2ON2%LnT= z?6D0t2IVSLWzBlbZ1yu(1*-QQp8M^C*Q z$;BrftiF8kwvO7?sl_7pFSKcumO`gQ#C*)8y$bmmFWx=AJLjHM!qKMan?|)BAFn}% zwmi4t?s9gyLxe!`r9tHof?nIa?zzVDdc^WnlB+?0RwHXr?A@l`mHfy?30G$Uh@1eiUv8a|q)fZ}-IzQg2 z!*!}tc(h~a>fW)d3*A|IqUAaiIe+G?jZD6|JNvxa|6b(Kq5g;pg|oKq&X=|^-dqR_ zE654`8U5zAivR4#Rn^d$BcE>GT^O6d%SpKG;ra1FpbCb8nbN4|gwnbMkRDJdDtFyO zo-EAFO?VB#6V9Z2y$ZL~PeS?ukyBWE`OI&*jX#EHYgU&&S!73MeKz{M#eRqT1jbqrbs}<#(ygIK5loKE|I zx&b7)U>Lw#!Hh(ybc7INt^$*9BXnBJ%TGbe`D`qGg2=UG(BVF1ZN7_>QwH!Cyf^1( z1Zss>hVRfK*un-NTlQu@)LZE3iaqAGUV2O}h?>nE^y}2I<_y2fs}kRD85&4;HTQVp ztDL{uzrqZjXN8?d7Ic2et;2oxSGvFC-6)R#5}KwF$Pq&psuJ+?2hTBV0y#vlLNAt_ zEIIc{xX@{;L#lIdaJ{W!>S5>N=Li^Iu*q8xSAr5UCjDRBJ^vgkrWhDt<5Q@k6i8Ul z&Y%)F18F6~InnSc1W_@PAjts~_tOXcaNvRa4B>o^q4G zjpFE7nCbx)qvlZH>7i9<$|*+i#niQAsRCUC1WZ81i7Zk;8|L1>B;bEGy2u969EhE0 zWW^|DX5dwSW>NhR2RrFpYH|)GZ^FgcP>usTzgjiFxG!-qt2N!OTKmDMg5mz6!;h5e zQTz1DuAALj|8>GD#DI%(VI;f`;P@5DUmeKL+gzBB6pdp!PY)NgCkX4<5*=|}f^Z2#Vj1F#rwvS<+i?79~oAeYl4Wb`pb&PyrjgZuzy77GPp)h_q5>y}?1h~{U zHDP+*4}w$VqcJ5J=}Rn~C|2;#nq9`(!pyt2JgpLjx1OAe@oHb5&8y}A#Q9*`Awgh~ zVK}CAf+8t#O5Gz$V3t<9W3 zz9LnIb`Fq#1IpmN17QjrT}7W{)$K_YcY@ekh4_MaEU@Si!g`n*&=p(#>>?w51Sys# zWQN6cbPRg{g5r>CKbJ2(-;Vni`Y3k71`PlXzu6t=jyU2%DJX1`vB54bHdYDsB;r8W zFu7tZ53!$!Pxs+HtfB;y{22G~>R%ut+cI!RH&W{B(o0?7Ob+<2jZNbmB$_IUM%p}k z)e~=N1{chxP%YRkX^z|TNAU8@Mr-a$-cKTQF_TfZ-!SgCNN;i6Z9N02_U+eWBQFR` z2EOL=(jjKZX$?D9HtM>6+CC^FH z!>PWHAYVDZPXfM|XkAkR(CQNX|W8VPYZ+L8}wGjJURzkU0*Dgxg-PQ*?-rpa%R z6XHJm{rPgbC>of{Hx!My_o%U6_EI2YA!+_y&X)M~*=lr%gt_}rw#iTKNUVuwOvs5k z>=Gy2njQfSpzj_k|97bb?E*d-svR~N27iTl0fQYHxf!Rs54pXcvRj$98&%zB7Eg2I z2KiyC_ulth6}5I4C>-|JdScc*OX4EaJ}ST&CMbd0kM5e5@PvZBhH|O3pEG$EXdp;T zk0E@CaA!hsZ#2Ga4q6!FC6V<56@Le&R)Y3j6*(FgpE4+veZ}u8bIg0|`TANmu4>kh z$^y>U4b@s4F(Kgw4hptU_uOs`q#VrA_^gn4#_0Z1mxOqsY0j+`gDwf)0*RVM1HI%^ z?hjqX=BnnM{NL=(a5e4Q$=LpHz2H7!(1u>`81jCe=%#nzajxLL&@NGUpuj=5kMIye z*>MHZ5dU>t6_5;BWGIMYdI2>BSIC3Hqv?+xS^1Buq&am15*wdQg1$jnMJ2Gf?x^o$ zol}`2?qV9>r{|=^MJB%%|FIHYly&i0TE4aOivtr!8AbA2+l~mA?1Pq~_+?MPRFZ`! z1-ErFrT`*k$0}rLFfb(K<@K-9Q195dcy;U}j9Dou_CJr3kt(tWuISCzW}V3=2rPgQ zyhn}@8xaY1TIkF(JK}`Jz5DPX4)fLC(({LRys#y10cido)~sWKCv51beXbC;eDfUJ z4PILn1nsVGW$(nxokob2;Sf9SlVPZ#eurt5MaqQ-tdPWRfCEjPV z=O$~#1-@i$o;}Km9}`aBS&Q*)?TGcOi&>6wm##?V_dh0^LCWMgdYghVH`2@af-sF% zFIjZ+74~Qq8W(Ggc!!!xigpDDL-!AphNg1+OB-bzNXU(P?tDj>+@Q3ASJL9T*R<#A zXxg665O-CXO8Myrj;2&nsUzE-mPkEG{wUZ%{y|X1`qCvu^i3vjZanX92#Erj`N%_- z4E*01$kv;e>%r;4Y69s%@0vg(Rz4^l@B%CvEPy zz3UU!l8QxD)kU*BDbhWUo$rWWD}EQE6jsv@JZLwD^!1pUL|of=-V!ER8kN{Ul|Zk4~VpLeennKBejig4t#^-p5j`E{#qWtQqs&@%V|S_V7^=%p5u=Lfnnrx%&_SLF^%Y^~z>zHAI2K zQxvkL$7qgV3?0i|j>3Bn*~@S!R|C{DM=q2rz$^#p+v=AaE-p8-6h!CdK>s9t*+9T9 z8*B==qmp)RGiu4~VOsB@qG_2}SXU9fEx{heKw`*Gy7SBXnd9dYt0%kE%CsN<()jeyzU?mpv7tw-V84-YHFoUJXq23gIXKmyadA z2MHVLnI&_@&%+?la2jOwN%-jE8KleVfCuYCM2L_cO`w-lgYq!(T)sSIaF5Qid0aM> zEHin$<3~TAfRtO)v9t>v(eE_bhwn)|&k3ZUIhPm{bXY1!N|&ptT>W^SEa@3%xth8$ zr|?}|6{_yf7P490TkliqlX7WJ$?m+sZCt%u<+>=t>#K+Hb7J2KvJVIHwma9esbAB{ zh}}Yd)C$s{c2ZIbBpxj+fw8@vU#$}EHdK>QD9VV`By@#(`DYG;Ol0>i>>%%MY6`)? z&pZ>5v+kWXE+@o3N$FlSlSAt18TmA(b={?~i#2pBK`DJLKk#pQH zOYN^^f_MCJ`}1h|>af*&FO!ySVVcbg@@@bM& zBkY`Vy*p{*#FxWv*866Ck1KQ1vwb*f@kD0m4Ejwdy-tG$B7A^oq>h;?2SI%YBV8*x z#^R!*LsR9vgsK>-!A2To4!UtgYyKMQ2An~plCToO1E`dVLpz(;QrzHA#b9^1`^g;veV>;avs2G%>(W z&8S|{Bt;(+UGL!}s{g3v5&jn0oh47`599`v?!0>~Je=+zRa*jlo`_tzh+8p$nObw_ z3kcTJ>K^WJ#{^YY4b~j#Vz+$#C=TGoU$Dh$UDR}oD zUM2p0Rf%>{K5Zu}OctN%$`O3bW%gr+03isKFzzMKiG;KLZ@tSj z%|n8S{oZ;gc?fv9_)|}3$B2&r-F^1S3ME4h0Y2o5SOK`equq&F4c4y9XTtxIky;_h z_!MSwn2d>~0F5;2dX%u!uaUputpSq!pLq+RF8=t`L0?Hh-S(1D9oU?35(5(j$2^LA+5dWWGBDrLYy?Vd9K?Zi^N- z?pq2^3ml$r;4Y*SRpeGkFbSxnY8KvBn~`T4C3#(?pb=j05@dnz?#M7XBR92#j(anMn=g=K{?KwFYNorMt2R`{C;#Vr&-O4$bA zhk#(r@ zfb2<#j!@2cxq{vfVg&=U=Ot1kaY(QIbRx64OSoF$ zopyyQjIea$+=Ustw*!?ylYI0Kh3q|W>OvsjHvWoE z&e51?c2i3(0qNH_LtU)7N431HLW~83cup_ewi@JS)}+jBBS~Yk*}H#QOX8=t zSMhH^=LG0ZTq^k?JYLE0GeN&7^vd*2k_YwLvozg;H{o>lY$PmVJUsUL54ZI9QXD&X zHyxfYM2`bC$c7fNk>;rivF-;&SGbGCNbflExt^XcwI?deCv)$10uix^->=tjm8p7q zu0-WJA;Y80D*iQ$Q8g7dV#=wLiUZU zqVGf1)hwZs?j4NItRcro&T|SJf9kKC4<-iinm679Tc@ZcpKoXr$4`TWBr`^&vC|e*ZO{kO@vc z81hTe=x%R6C1P~wc>s|F2AYy9u0_D2N|s1zLbwm0KzZ*+20L=BB&;mjgXu$!FBS-h zt5!1@i@xF~Toni+B@AppS_y{WQKO*|;O|Cw8p>}j<&zzZ*;uJZ$i`d^rSWVO-RrJn8^MnHW3ng@bh)c!Bps0`#_2MsB zvqCI4Mqi#_cWtM@=To~z9*5g(v%PI=l3Ty?dAOmjeHV!gxB8N#Nlt&`0VPewDWjbk zrUn^mTnYQnILBR={E(uh7V+bXN_58&OARjdyEN^TX>1e52IXp0X}MZ#se17SjK2V> zbYrs=>{XXvjn=^!x-2?!30XZrZZ%?65GZf&eoN|ALWD%jLh-W|yB%hJsbMdZysrfR zQ_9%u_Kh*}Cz5%kI=x~Yf9O$=+9*9NMGLYpk zyWv%{U89TT`vaN_14iSTyv}VX{7|_{5oXUJtXRfq#cgw?K6r+wo$F_a2*bRizk=Qi z*_p`uRC(gK%Woad&tc^LVtJ(CE(Cal0u0EPD5ATdGyCrw@|pK9R^AJ^keLeME<~sz zqTH|n{)kgGWTS+!54!_^qgVmJy6J2Q6CqkT4nDqMEUNHvkdcyNoX*NwN6MiYUiP{g3~R3YOd zbbUaf=`9^<_98Fq2~ML?p7rZ28vj)~Tm=|vSK;C&w&Yo$@D>l!xFb^n-45pPL&g25 zYuoF;GmnRVH&|4RP+_fjHg!CrXzcKXqDJwm5A^!K`A=x_s;3(6P}toZ-QQ{kh|bZT z<3wf<+2@?kn!A!TnW8SW?MtIv;8-Aw*08wX-1ypPjU8S%!c~qtGG4^doaQiAn!qeZ z4l#UcYHAL`;LEHk5^aKDekYhTA?YT{dDJoZjn%vmKYnp?atC~uSL6FhKP|}h#kN4NtUiE+1+hraVOaItAW$wf{>z=I2*yGFhXMTQC#(axt7Y_I~ zM_>dZWVOUf9Q4*!A$;f=17s1X1jJxB=6Hbr0(yrYCMTO@coXj;d`5)WAB%c6y#Ie= zP5N3J58`Epwp?9YNLG+7d=5z(I9OB2EX}~NBlpullPz#clwUtXZC-_^J?eB|j?)e= ziF=}xv8@vX#RA`aDE{IY@XeqNwN6H6i6O-lJ}$52uO0wyTP`^kCLe=KJrgXLTBI5W z9r1kM(-CtS#34{wAH_){0=()CNNZesvQ()_Knye}+wOfT*%4x2nu5=>2p6*R?4T4} zLs3v@<0cn(iYIlQ!j}qPNiT})dlJHPP)95O7=I16@q_^xm2)+Pnf)<*JiISRPO?eJ zl-C&>EY&LeuV${d2E{fy1|GY8-bk3&Sx=EC!^t0a$Bvl%t8*~uy4R<2L)5QVgD19bPUSaWN6EYHVP6^ugHW z6hCJT{Z&tQZ?Yy2uNm#v{wbbiP5vZvKEBb9oWPP?c_9Trjpa;g#Y0liJFYiG(RV<6 zbf4xfR-DS~`Zsrsn^Sn%==GB96|^+^g2G2E$%fqQGh`OAxg*z@01Sk>Yz*9%IE^4jaYU-Ou-C<*VJZ`#o-7n6S=a z6KmllP{8K@&aK-l-9AD&S9(toNk!b5yLMk1emY#cMgUTH;zTvZ!!|1Cpdusn4>fpt z`T#~{1hOJ(S?=%a|IIAr6%{8-)6j1?Ly`qy*}-*RWJMDt1W^TYaRHdIX3SWx_U8CQ za*NZ6c%mTKMhyxsNWGob3z^-*YcUKPbv9l;R62qU7}SMb%9p>3*jAXW6YQ@xva zPLKcgDDSC}LIX9vI8i{lKtY=!-3HdlCv}2IX9sHD1QkU3z(mO*xa!Dn8{~?+@R0f| zgb;`OA;xL&2!smNYyDRlkuHT~grhgkkt!y?!zutAD`MIXrh$i)oVHSwQ!r!Cb9_&`yFo*rr3w$nUF#S6 z3k5N*({Wv)wC>1nBX#9O9(bDxH5spe{O&xBUjcrimVmduxN7=tjbsUUsg4C3y;o6J zM~o3nq%;H_gHzK;({e~JzYj^sL1;p-81~Osx)|?7Mq0C&@#eZ~=_mJ8H6MY( ztUX+ougUM=TY7sdN`+qUYIZkWo@^3yRe zYaW}5_C7Ff9C4%i1nL!HTnL&K23Kqde%Wg!K&cr^gvAmDL*zl^71xPsx-~=`WYnc5 zBOSZ++M}IRk&|HI0G$#>4tskcd;%+oM=bY*DCpG!)WGf>Yv2??^WqDauxt;O^+x2{ zpj0BE4{>#raI-PgDl5k5=NchF$xQMf)x%_PVBP5Ti0DgzR7h<7>`G0`t2v4x3WM-w z#TU(wVRf<1dq#`Ig3k-Dd{GfUt0}m&=^C^0z|@**8qjDOl#mZjy5O>c&)!-V% zO&-w0cj%B#n<+I}XLx+p9)8M^%y$ zV`BY)3XTuo_`;_3Pp$F+!qiAW&B@1_G-Bk)-LsAt+U}E~uc3~>K`DQnk#nAys;bXJGD2BdK42R^yk^AwYd5Q`!DUpA5;kM z=swEDm1VT%>gI+m)O>^{#%)@U_`ad@B2G50KTs=ih-JCGZM$AR_13Kq&t-PO-iDZg zM~ZiX|Gm0)*uMRkK$6%)k8%V{0`PRAl$4n zyA(NPHGMoGktCLOK&!zItd^YwPa<^`Pv{hwGoXuJn`%?;aBR9A=&}!NI!C((l5R+h(D!w#0Aj zZS{@ky?H%o%OkdpLX*VkM&TXTMYUD)PA#p8#_Fa;hx|`(w||U$GDVkdFzK|uLayX- zpy9c;=}dKZvC2TwZSMN9fZa<)hr3@#^a-tf$Doj2P%DP0dZLvRH zAN{`L`=iIvB!07F_asg^AH5-Y6CpIkSSQMNOz{K&auOa*!qxGgj3ASeY%+YU;LI*t z&&UI`!>4sNEwNSbOs`w6)}1wxk>UAq@9>;yNzxq_4jdgvgkD)xbO;zyJz4Bdn~?~VMs_mJ!Nmmy+{o}LutP9$+eeyq}wcYp+ckP8S zDwJG(-NHca~O*>Iu0@&iciec}ISjC_P@eu=bL<(dXlj(#M6a*@shl?`2xQVlkEXuyt)5Gs+SeZON-U{K^(uxu2tnW+7tC-7$|jUGe6SbXGD3- zKodbM=p+zn0zpDx2db*VMFpgopsw+9D;vp4*f3B9-O3t<%7t*=_CmLdL;|r}|2z?? z+m3=3G_N<`2J;;;V1Skzk)b9#59c&yQCrMt1mKOPD(U__-8-z?`ky!U;r9*tq6j;K z-8`~nl1pRun-40Z`)||r%zm4i>|VUaA{j*8dLrhQNX+^tN0*tVzLmG~`6}xXyD2%H z`i_s@QPwUoGo5z~|;YiVf~>b`GdH`A;2jwwqs z(~U3tdR&bvz4pJsyuK=_Wkn+mLNRAtZedPH?Tc(c$xsRJTyKw4cd3 zldGTKYyI@eUe`^kfsjrfiOJ9VfA9Kw>xzq2q5M|lR$?pLri7im^tMsW?NrmK;0o~c zAXYG~X6@(>mYn{Gk$N&A8=7@_)8^P6jxOuCUmznzK6ALmO|E%Tw>dfk+L*MsbnnvbGV@-`)eKe_}KH@R>xVe?@ z(vk;UR%Lu-LUut*+`%B~U54Hcn&g_tg7UG+$?e(Nm)ibW3QCyIH1_K1Q;dDgV7}aG*4X-z^OLfps8jPU{3xLA60^In z{un4OD^xiAX{PN#b?oZUM(EX3mwhZ2YZ@ERZ#`UJj`PemY_(k87#nrhdHCY)?eI@< zRc}*|B0q|slDJiz;JqAM&VDoeAami=2JIy4&+;7?D&OZ-|D&X-x>O{m#k5o7&fw9b znZSCWA;a00Z+-NVZqhvYrwLfQac4R5`zo zemwZjn&QZtM2;u%rZUx|W?U7e<>}wO1ng-fsxPby&}V#<>`MGCm8VFaXUeKhBlv-G zgZZAInKG}0oY%*Vh?WWAk!ypM>8kS2`T72?PQFZEx_P+ehb%WYb@~nE&m|KiCx?FC zjf>m<;qsBpOK~2O?rS}+WsVQ0Q;QyzTz~fDjoK5R)!#Rn>v2N6k-R(-AV4rO3c%{_ z-n%D$W8Z2ynr^EBH%ny_WOO5_qaIUp$L7|nXrC>CCfcou13=dH)ax?6eL(0Tnc2YN=3Uap1)hOq^RduZ|FR_$I2@BC{NM%q-q>OD~ zfPhR|3WfP3#2yk_yQD!+=|ZLqWFj));4G&+$<{$^a*5nsqM*JVl`42op?=zD)B0>xaJ@1o59DmM}*%0~G zgl5iJZf95^k0!B$oQO@q@K%fr1H$1lxk`lhJI++OO#q%G0xgZ;^{LLf6~{qy}ZaLu4XMd zT7x^um8WaR)7qi=)N!ujWPv-{2U^cM*Sk)ermkK&kTBC%d-dF0)8CjDo1A#shF6OD z8}s|Wv|jx6Kqz9}jo12voMnfFsHX+J(_POQ%kX2tUUY!(In4bw+~FjBfA8)D<-$1Y zbY4sQds~}zPM*La+vd%o+`i19&C)MvzIHujY<@S`PoGv}nsuyh>~o+f_gZT->Ar#5X2nr~<>|(EN2~t@nT&vDUYDeV#nO)MVx@9BA@@v4Wr_k{%?$tjIZ~I>E zWfcAb@5}pPf5(efk1B?aoF4l8S!#d(vT(%U50WD9DEZb~Ljg&bl^dge(Z2g5Sa;={ z{l(A&O?_8AMBSWdH@4O*$6DXszhhKzO@%*yluJ{AFNaIQ_;V{A0pnn_gOVc}Xpq(a zh}=X(rV;s)xE6`fJA$`GPEmu)Xd==Lu|o*t?yKQ#Gq z)aS`mcE zdeAg{<6G=&^Y9efu-Z{xKcZoIbK_9Yo1eSbzQlD~Re4=^wnR8zM+)Bo zX*Ui50gbr;PndCtc3=OT63B~t_1YqD|ELtFi$Yef%ohg$2ooTb7hT0x>I7$HerweR zaTCae=g7WFv+$Xcv8JH7{#Rp1Y1w(?yN#YIk+UJTYGtNXRNSRdnR^*- zFS!Ceo@k>KZxL#bdn4&fz=sV1tiTDU2;iOw3)Mau4DAlVj#aHrvSC}5`3jr)#s4cO zZzTOSu}7pHC@~Qy2-XpObrKY6RA^K5!g}-167&YJIRI7}BuJDdblOCQ7Um-4Y$DvU z5s6}4ftCUE-0%=U*@uD0p9PV0P0%>C5SEYQ4ks?S zF6pACrB=FRqq(?eF5Yv9_poelcgB=(|EFh-?$veHd^|tO-c)a}V(V+g>t7@$nz^gr zTpgM&rR@H`dd_sYU{Il;>s#V`>;AqR`{?`bInm{+d`X%|e5R&2V%@S@4mpopG8gL0 zSN&S>tK3f_z(HC5(~&TryAg(}aqhBh;e$%s^q#4DH>gI`i_WtAnadm#r!9|qVYK$5 z#CuJ$ustxd|5NYXATHXpk>Nk8JFX7(#wi5u9X!P8^zqmj_Z!-FYqWge=*}%YA&(Xh8@;3?3bYuHgrqSg5 zQkfr}(*kSysr@OABQcS$uS+CLSTTHONhuC~oA%3afFkEycVrl&!_rn#i*^5J`^HHc z8rm}Er*kyF-u|hr3&8%TwzB3QUXpGr`#)U%_pkrP;sq66@N>O3m$z*K%=Y?K`Uxn$ zH98{8YsMttbP4Dgp#{XIbHXP|>@7vyRr(d0v4pecBhSmeS%P9{G(DPKMLVN%k2g=~ zYDKAJdM=Nrcu3;&3+p`AtP5pEVzV*2s#+f??>*kHbIR?0(hJYsj2?c5@08@z&HgOM z|5-ZU>!Y{NU-6TEejj+0se#R3pT<1r-xYQ0wQbj2eDr#^P+j|SBAGOEJscV?@X-?4 zg6Nzh4kThEsEj6}OW|3u3d!U@aUuyBEyPxuL@dgMvqV!zryfufNOx@4dcKD}>*Kv@ z?POfn&-H48ovqfmHR-GWy7MsiKVaYaU}5=vx*y$AHQ zid8hLu<~fV-2zugprRNI&(8QhU;{3|ar7h(*E=5k3jc5#fi3M#)@ek+0yyyaMuspQ zr5650a7YLRoT801s`HdUD~R=V`(-_&!RJ`n*r);*Q)Hf_Horiu6+~K8#DU;<^~5qT z$SvxSxq-H-r@&0+&JrUtv$~2({jp`|$UuWV6s7CeJY)Xme;Z7DCttSxA`aFg4q8isjf<3d-OyzJ+3G!&*O}$U#Aza_T3sYRI&)6`V?46;HYD-j(uXpy)wz?q z=Dk~94y7ZdOroL?pvSBNJZXOi;R$Bf?=8+w&oGBE+`6&mKsHm)W?EP?C zt+MBGol;`iOjGGE3aP(KV$vOJdRwn`j(F=_%hox?f34Gb)-2*(O<(eBvw=%X% z3p4co`VvWuW~1yG0+$uzJl=4NT-JX)XnambwcRRtXG`F<&8Wu@M2P`RGd8S@Yg$T= zdyh6#%wxllfP;1?g`v11f+NA32V-q{g6DenDN4b8_LnTad|gjnxz0QB-t@=U;Pk*L zZ%5~^b55HPvGr*$YX!R=EmD@I7Sn){Un3O*;SUf#Fo?@zrkyI<3QB z{wm9svuheh?dbjSkzF|CUxmKGn#6k>TI*{L~> zPD@h-?OzUdpB^1}t&yHxum5$M7w@~ubVG3UUC`^Jfo{jNQuONhJ*ziTs0_s7d6=CC z-+CvZfDrpm=~?bT5F3pv?}c>>J^Xd&NV}OrF6gORh1KR&R!DT*bNTV1c|F?Q4(>lQ-JvVqJAbY&2X3!-$5Ia)Knoc7Zpd6$o+5MCBLizlNvfQwP9hs=XmY z9acW#uW9jx6gh5bUa&Ws*cf@c6sbTWTD;u^1IVhGYA_y*hPFx@s_BTE_X`OK16sR@24qX}Kp7pPp1bWif3z6w$MR zTd<|Q-3Bqb#L7v$7zW=xP_hYM3+||yAoqZPJ&-~8f9Fi4CFg5`IRfs(OHjiRYp}pL z19v+di2uF^p}O=PA$$SnpW8xqLWt0kEN&%Z=Mu4I68f4L9!*MG@*SMQ!r>5@LZK%R z4U-)K-J#v>Ab2X^M!SS$$s&GaV&O_t)6@C1bOk!i9Bs)bQ<=7=BBzi1i#t$vd9>#> z3zcv?*@N&X3Vx<%U2phz6b>{Lwtt(fZW(&%-FEiE`7w1Ay3GS8qKwnNDW}D?qVgYK ze$Zx77|AiIL`jk<6IImqM#P)HZK_T8hvZV7eU>govBR|6=|kr-qqv1dgC@Ss8I)c* zDc!OE)N}#&znO*OekBK*t8|&Cmltp9js?>dS?1pw*ti-qZYx|mP&QpQM7^`=N$mEC zd|5Y3H_u#YW7bdPnpsK`{CVCdYH}5S(aYuOs*%pdwEMo;{jrHLb~kW@OTX-Nw|>cA zx?=jU&f=fav?1Szv4Db?SsNF}Cl1Z8dZJ+z{MS>?j7g1za_uUGe6LT!+jO7S&*`6B zFRpRX=&Z+N^xgV5vr1#S!>4g|XtQQ(KwhJYvF@Xy;pbjQ`fYyKE)6}N3zc=-QLS%L zYj-wu_TT2J;uqW|nDl{4!?E0ck_T4&5%FXaO{~BHWND^c$mCE|DoBDM6lH;P?y79>wWC{0+`tXfxrDfnZwRVy6_q+bo ze3_=X)r3LNgOSNlf3g40j}s;XzT$ndtX*ES=fr0DT^!ak4G!=NM?1INrpd?L#|2gy zfF#?qsGd==7L9$Aj;_n2#=TM%lCLW)ubeHSGrD9F+33rDgu^hu_b1DVDC%lQzT?9} zrXf00#0M-K!n!1GizC@LT|M%|U96Pn7Jja-T;2FVz;YEs)_D?F6`qPTIytN>GJX1W z+Oj^5oMA%v?D#)Nw%oxY8uvG^L`tFpelNX^o}ZF7*HtFH^JWJ#Bc~k0eQqVlNM*Oj z()YI9Pocaxv}rg#nK#|_4f|IJ>3PHRNa`E9&b!M>4xP1Lu+XpA=h=SIS7hzV$wy5- zb8TO>_*oT|97!MCyF)T3l|->Uno+Xg)LXBK#iaBN7!bFbWUglT@iP7pea^vs z#amPS*s2WnipY2%63_!fbcccJA_mEyNM%ACA0Txi(K|Fk{zqSa6NZ{qsCPp{1t+Ms zX4dbYKiwB|qRjjVcZI~<fA4hPQUf-9c}nWm$hq0l|wphYnJ^^E-oBm;c53&5F3=8RrX;1 zP$?G{P!Xvc_QtRCgv{@z_rKa!?WIU=+?ZgIE~l_)+lXk;-rO-fT}6EC`6`z@unGO}If4E8VY<=A#rF6P;JXc=KcF^bJvw`;P;iHYG zRw7RqMsTUi6nd{TdsU^rxi@J(D{gNT^39iTVPR!;?JpH-KY5-EYt4&L%>A9v7 zv^Ax@BV~sCK}WhI`2RcNLFJJ^$Hf(gs9#}-rjad)0i*i=qyc)nGL?xWn978pRRwix zuz|he!zj`S5R*a1A8ccU;I{Yx>JUH+Q9+FE4c%R8BidM~a*w@>j>UX)Lh`BZ50@k(c(V2B;DdrrQ(C|IiBK^D# zHbsj0%F0PsJa27C1n~>Szsv8k+7$OHJAU)3DS6cCM_AYUrmx*ehDD?G57I6D6U)!9 z!=2uJdWoKuCg(eAa6*jkb|LwfBns@Tw8Rkue&XZRCtCS4|&bPv`Zp&`>VvIEOj50)Qp*D^`LY9yT0ca09^fo}saFY=m>QCnk-d*S0^haTcH7DoIDxfjf@gi~Xp4W2W7 zU$Zx*XjxP`VTrCz=ZS=dp~_{96a_cQeoLLB|1{~#kJ#SH&wa@1Lt@Ie@=jjY+2p^h za4pnMrx|Gd?A|VI5JUTQoc*+-Xz8<%?dm=->{pkE1!M50CSX2U|94W*9 z9r(3Jq6LSnWraU~5H^Hd-PZ8^w z%?CZ;%}b*Tfk2xT`smV>VK*R8_(Az)3|69a#C$^RqGdvTJM1%;57GwXMG~w zMTsBZ_YtN-zU4r`u;cbQ%Xk{E_>1hUnI$vk$KNxVahpAtsFHtdS{zrj9jw}!A*Fr^ zFZcUT3Rf3yF;8*ef};f-iFYE&+hX_k=}#y60PUg zZ(Y2fZF%(lYc2%!VKb^xNrF?Gj_$UHCtsf8Gr7_-HqZP7ev=Fw8`PJmpWJfGzY9LO z(JMTKLa#`7f;iyqY}ERA?&EO(*&J{l_PstAqXkkx2c+V_%%BP)>_P4qNgc1?v^qo$ zb(jid4ubdvw0%{OAN=3++ZPmW=m5EeGGFI-h#~yZ?Z>xule$s=s)zHmR!00sTxYjt zQr*4UU>O;${LhuM#mm)VEXV(kXLkL4UhDQ0d2 zKwF?+>w5j>N|e>vYq+boVB>oWU5iN``=JqHM~^UJH^qk*hEo$Ex|5~eGGNAP**R7z6 zAm8{$wD%DK`6C}b<2f>^gLHv&Z=lqq^P6sq>%5JxFrR(az4vo-c9*cqGI9xZ!diOf za>K@kJd#QznU+*F2R7UPE{2o+e48o{>Qvr~5*n@550`Rsne}`}proLC{s5~E5N{ws zVX^7<6#L#F?ofXVL}LJ(+@_?o-Bf=Qorn?dWZd1~PsY!Y>Gu#5MkzU&KXNr~dfxBu zVhPL3=cIqlEGRHApvken+Rw=eyk6fXP{y7*=fH4lhshb$85~t zz5KH5OovNM76}U)Fm-`ZEu%u}b_yB%TO=_N3DW|10W_J9pZfwNHVyhu(eK`bD#{+9 zYZBNc&M`F( zX66{;&)oUXYgwXZ@Z{&TrBpy!?D8K`S{QFmCFC}=eHNN;Mq@Tz!c-6QlhjBFj;G)0ebVH#{hD1xtl z{#ljnX9(Y()=x!E^R4wd9HBj?az7E8k@_c$a@~7(Hh;MIuUOGxb*joU=Fm@IMkGNQ z`eh`DmCVZ#qci%fFWB(Z$!2D=;+*E?1?$G#hr&PZroz-9X*v7mhCe9REEV!x^<>0| z=HmZp0Zcd)w^-OdbnNLZWpkqhUBVxw@7FK%TZ~zcSC376EFe3!L(=3yZ_WSvD!pJ~ zA72(;1&oLT@>oo0m+eaT8g_N;4KllSn9-0C*88t^hiWHchdyV#-l7+2)sv?none@l zB{K7lcH-Zm_&c{*=g%kCQ+_8Ye$ z>wJ16rli?O>ff93A=M@U%a+EYt@h{ZJ)VKs>?o}!9ULH(oNV{7XXq%LGclidVeIUF zR4s@e)NkF>b#|%oPhMvAU;cZWgZQ*L=WwpZ#rEoR@2X!Vnb?e(5Kb6DSB`2^w}4CG zto5Ao#{~}|Dd~-i<9$;K9&-7@7fuRjl$5MmEDSHNZfjfk_%Cq6Ki|O3u=w+D#$tBx z>FAA{;v|AVR<<}**sAWJA`lWKF9FRMB5!qna6$90qPa7N`C`NW#`RF zF62w0j_%%A4tx>}@!vpIy9*Y3fB$ps$M{=Ft~8Q0Hs2Alw7kp(7!uIzDnmfR60S;N z0K`Oq7g{`@z*tU#72*kD688xL#Abc=RS*##FK*v%qwXqKqRhDzmaM{Jz&lRWH`M$&6Lnx%N4p)Xxa@mVXu{(oxfTB=B&O7r^ov5^{WUoNi*7WWjI-sZf-QA;*1F`o&FV2A6Gj_ z{QdBkv#QpowEjRP=wc{{4P8fsZL?vx=QgQZoYM5AUK>@J4CPcs(B z8{-al_ov1~7-l{jUmPtIva!?rOC41{6^%>qbC6We-_U+N<&vT#boe;e-ki$TYiBOp zC1$@QDb-GdX>iT^GC#kvI_qy@97ebo22D!9US9cN?xDl7b?-iRPnCUFuSG%9$I7)J z`-y}ut$ON#@_K{(t#d3IJk?gNYrGWB8s;AgUbX>_|0@U$`#~uR63<+d=xm37%EH&M z35+xO=Jm5RbB0Xg4(#ZYiW^5xrtu4c}xUT{-oha+g=c__>~X zR5Q##jZRbE@<2)7OSnKuiJlhw10(oi0Hec|!H5|%D8NW~eBxEP)KnxR`c~}ZUwim+ zHy8I~It9)4=c_WvTwrRdcJf@fuR^KBtA=IsWD!%yPe^{652t8-aVR`t^(GD8&8A>z z-5w0#9*GQ}y}D3U@ZA~RwEEW3cko9nHKS#2Ib`+S-u|U1#69n}8a*6gn5$q$uZuiAHU7v?0?G(F=Ne69s#Fn;2uFd`&0Qnp-EHxNBLNlJaeCM0sc&NQ7o<{vm3qZUm)6Z1d>ep$VKUT*$xKYhX! zJ@;@8ANF>BZZ+Se!_TM^B z4&UZjikWNkUfL}!V|Oaw>MskXAIgZxDSpR2=V$DyJx9)+oK$>iO~CWv=L=-?2$GJS ze%5jX)&zRjK?q@ZM$S(P?CWiS)x3eX5~S78^nRgMz2A39?(Vt1D7rRNXJXbn6!i6S zkLh3YShPyp=Cfgkxwps7@&9zQT81fwKXI4%O|_SjFV-i;N_+h?hLfwxXSuw2$LF!1 z-r-HC;EI0<_VEAsAmM${XDVk4)ed0ocOXdbse^+Wj6DbJ=D_{|?smlT#i*R3Zh1<4 zO(HhvjJ;N!4)j(C6MF>Y(%{qu-|!PSC+_a5<3}bYB@rW{-;j_#YQ+XpLc-2qEJ7sc z4iVHqVA37j8?i<0; zxO=D1R+o|0=@&Jc-(=1jYr8G`PDn=4u2g#-Knl=a_lE`UOh)?Ob!4Gqyed+@c|XR!Bscf)0>bjn z&52DiwBfv(e`1Q|QOQ@HS6f@%%lCr7>o=+V$_KsUPkJ9*an`HE%&i&zW@a6jCvdnu ze--2Y@-5rU*N-!F&67p03O8l`_>TmT7MYY`@3$EY{&dk8!#cQMI7{eq;w91j&Sz-o zkj?ZTa2^8Nj%eYn7?Y#nU}b$*{|@WeqbXO5rNLtzTQG)ffW`ju8@)UpN53@-5(fuZ z0fZ?5Y?M4WuVBR>we<!#_*=dg<=29Th2?(y?6;}U-@g>I-mAp2tv@16YcFJ6zrGy(&JCxF!KapQ zQ8na0J-Q)KlI)=cCRn!-NcsJ$^9TBs!I1C*9aVH{>TZnp&A>ZEy&eYk*^(pHJV z)=n_CD%>e208Nqspdn;w0HP-mCTd>@AjV7p5Tzgj_#K|H9W1DrYDt_}ZBRXminN-g z=velZgKd;3PUv5@aldkEL6xl;wzH;M-{NB;7KWtaN8eq#ZyEib$oZa}U~{om5`${p zLi_XFl!aBP8K6tYo}Ck3=&{KOK}Y+887z#xU!Bb5ajT_YD<;2M&;Nba!C27oGVFABKCaNk*~x(>FPU?@%V-te-7#8JO_pMYEc%v=^Gd_Tc!N2 zwDrYPoDNT$LFu zlTfe{qp%+_!?!hd@|1RXl|n1x{ef~chl&5(@b;|2@}&E3$MN(as~?-q+q+-8gp4LD zkFtGVn(!p;ylf+U=>M!JhK`gnkvZ~-j-{gFn?fJvlthqRfY+YsWR^GPJYn= zq`&tT(8k>5P#erUA|+}1Q#2BRaXD9NV+?h5!@=u~ua`791qzGeEmT5txqfX>nx=BO zkO$px>rtFw(iIzFD%VvrH1-;7oZCM2eERgEq2J7nEJOX)V-{_OKTPm8jEimOX)@Th zp8xZ8yZFb;zd(RIvfW#{{`9fRbP966|A&&G0cRIt>aeq0YWWb^4nh!wS_aUo0?3y@ z_%+abLq?&&Ucz6HQX=w@oo{lqPWvk==d|i9t!Y7YiM_QoJZ+DwK1>bk;8H#EoEz>O zmIdO5(!SM(n8rKZwAxypUOqpH^YpfOsrLG}_n93gMiRP;HSagPOVZw~Ra;azG)=pB zZ1ZuVW4e{An8W|&&;>`L&*_XuUFL&~T?os&Fg|J_)UfeOxxZxXo>fuxUgC?A z``g_y^foe>-e}{Pq#^1N|90zArOUg+U*ok-5_@JQI=E=$SPB@^7WsL$v;#x;kM(6G z3BWOek-!%1-?&1yyQ*!erRlK=FYH?=TLN|TbLHm8bn~Hpx&vx0P7#T}`TJT4}bN)BBbw~HSFVqhJ@<8+4{iC6wP_G21_|L+>OwHq(E6^Vn?b1C z^mN~m-v@8M3%8T$;PUe*xYD2EWg!0pl!_vq5PQ((m}{l$gyco-zq?mV*4%fdk`Y>`h#A62JgWRXfm_0sjSD`a8nqh>k>L$!HLqga@Wy@P7`tVyihyMLy_ z$w#zI%Tp>ZGFr9Ni!?G5<;Ns1lYYVrDhF-~aK*8Cn%`TFiZUU+X3giv`O;+T%ZcfQ z1r!ip2AkVvlw0>`r%f|;950^H&muodv*aJ+l|L5F4G!O6ZTR(1@8El;9~UO(Y3C;zc*Q05>L2mP zTrY2t9*NyLZs4ZVud8CicopO%BQ3Uu6xSve{7c+9y*8B(FJ2~ckY0Sqc&vn0tn-p_ z%ku6wu8HtBt+G%f={GvP3BG23nV)xV&GYFvY!D-1!Sm7K#67s zjYJI-Q#dHdH%sa0xD_#?|4zP2S02{Y|FvXX61Ox0-?(Ha^&VZHfyXB%3ceEWB@u75_;{CtIe&2RO4C$ud@oRkRo(}m)^ zyZH5&-*N}OD1SqYLJW(ZTU}s)T0Rxg)*=E}ga8RpO2j)KmpwOZ4aFG?L4uN~G{bZt z?{Y=VX;$)Sb#F@}>y?_8nqhe|BmU5BS9?$~`A#)CxG2u~BzQyM)yFHW;IkE$Rz{wiHkg2_=sR~=e zG?WD9vLV=h!9ldRoNU?ytZ!5Q^CTcln%UbMm5@M^Wi!mQ5!o=pkF>L2&UCfz=b^ws zP>OKS`W*hWg8whVH32=gIJly*yB7;O-$N8TWDL>G{s^fAx0WD+CI^}jVDKYQ^Oz42 z^dz96m>@t2ypelTw&fxkLfUVUTCuE*9nNr%1z+Yk0lDYovf9EgRUh=Wn)b$V=*Bs* zhUcZ&TJMc%xw&`u&tF_4&JPjn)4j;G?0u`{u($JTF`xSMCJT@8#VK?4KwYdKYq;OL zR%sivp}+oWF4jLDzDSR_yQo8OXfiI}EkI=c`1#Le-y9hZmyFlKFRcC2y(p;C4-&T=dzc zhW8z}PGaAnjS2G$vz6{u`W&jQ&C+W zoGk!0rb-cdO53ltuBb~4f5C%Sg{ z=XGv56I1ewg`KmcE*fElgG{^6-wA8+=cQ8 zzt&60Q~&3|vD2fsxJiQN-*Kb;>!M4Scq%nV9kF(@onPv9=-4lwarno3{bAf1+<08z z&?`r?sPU&p)FyzmFfbvb_n(7w zIJpSqDMp07xTt)8wlD>&i5e=q9=wcyJPMxaEBv}l#kwVXBej6=ZEcyJH~b!yKTykg zSu#!~Ow^z0efezk^rj#oP2U)vNv>JY6vlATymk~{8D*v0`HPjWhJCNlnSM6@aUk)l zx=y>jp`3Xr+g^)|ru1EO@tv1=&~D$ZNJ%ZiEc|mW-8-1e@M&J27gS7DZeoWI=jadxOP zrV{^I1sxqeu?Od5H)f7QqiTqe5mdkSv{ShW23%#9gZk|a``=KFNx{ih+Rw-LSlq8$6p+)KIOpHt%}TinQ!?$B9>7&2PHZ>n9BBZA1eENk2fAVEVma*7F38 zRirKj=57KAze$v7xJjVjgnjWoD80V}I_dm@-W~lwMyy+$mKuqBleMBl+haxMN-uim zR`&G=0J^i#)#ox*>-L9=O38ZvLWJT%opNJ)Rlm6Q$J}sLm-)7sW1ygEDO~j|>+7jJ z_D0FnZPZKC+x)R@bTe^ zAYXslRrrEW%M-rH$Uit(NI>u>odSWr{?D%|fA8@-Fvh2PCTHF8@94OD>~k1{dad-U zjj|3Cw^+tvOdI*MYJTscTGN#sW5raX-59pS`1xaOz9-`ozl?gf8}8v%|E*HSG5nm# zis@9-xcmgFn%B_{LzKDyG;20mEb2yUZ^%k*foRl|fQ zYdhJFo@bK)y1Cxd$8DCABU?Vamm*)kR+|^Xl=n-~$W64fmP>&F-4}~L%INvZE+K=D z8}lCR#R9OcE#M4I8qVgxOTL;m0St$|puCL#OfSFc_n zJ0)J*A0t2~fSD$XyEWW@jN1SWL0~a(3B#;#UBNP|)qX_k?S$x7P@*D+r>7^6t-(?D zQm5SCZN&{!;+5^y?r)3p%BO3yCo7wq0q}56Rk!Ne3?KJQC1xFTkdX#)adYRoZ_h%H z^9p)Nt|y-Zm{{)a0WE{e`_K-?tihR?nKXCH$dIUme}{i;iEf5t1&Zh8#rYRK%%-}D zg=GffQK&4r0YC6TId!j#_&Ib+6L3Q!JR@M8eSpLm=P>hl00-zbxv?WaptF;Gga!hh z?h%;4#Ag}>LZ-q9m>urvz0zWKfWK85!ao64)H|x#mehQ05lM>$`+_1UsD8q{8;}!{GY+A~*a(?lhrg&^Wcl`7ojhCvd+eWda>S9QG3?Cogu$~agBqmHZMCOviXE1Uch zwD+DBd@wgzH_7jV(=?GJw24D&tyrTq`l19^Ca&lC$F*|-wY#i>aF)&-8IbMO+_#_B z*5P`FQtbFTMZitTTKWAUjbg?RQVar|PX(0Yx15`y^@r>?vr-P*e~ z`g9f=BvIk3A*t9*mlS$}q9=1~C;k3+6ec}MMCewx(zSS=*Ov)-AGSEl3fXLGzb^97&UMOlmtMB@~W(N*MO-<~1 zt6WYP9B!|Mr5j=x$RNBOki6Z4Dnl-X9xYyf??MR%9IZ9?TP6ut8c4a4_;^h{Z45!@ zmmxwLQcys-g~xVxpWc3UvAU+4dRjnXDobJ7ti^gctUuQF>St?;)J?QUE51m zfamcfG}rHmpb+i5P}&d^8TyMI8|Or7`+KyFiKy-pH@)|h*&x*>?Q!#ZPgHQ= z#PLSWJE*U_y7{Yj$ahG?OWL`1; zq;Kr{fH55U|J4GF^n2;Vbz{xii3 z`ChLej>G?Kx7VEEj!BzeIw?^Lk#!?cYT05-1i^a{mlT2|!%$GL#N*LE23R#j9hgIW9}H`QU=m&Bv?vR1 zyJcJzd_|($x8d(DkQXj};_TvrBo3xR4$wWh=q0e$aTR0G!%t}QEvNhOAE{T;w5XF; zYY*QPZ=!BBy$*_ziwh6KD>e#659C*UZ~nXFv8T|X8h!p%xjApvKR-M^-iIY8%buqU z1I^X^H*+II^3~lk<>6syxGCQ;Z>YvwWVxp0h@^O6J~6Y3kc)T{)T1E~cZ<_{fzCQ1 zYT7(SL7TTCpDX%({7DVRn~<5#a6ji3zU~_1XT%9L11+_E_~Bs`)!Juv8sDyT`s(eE zDsgaGekB8OZ9hzQaNJOpInp^IFV6b?$ripVD~0uY)V|PSJgwYk5pAz#o4uj*C^Xyk zv-V+^R6ua>HMIBXnOi|-5}ZU)vQo;*k$xp)SdtAN(4MJ$X$esH>UEWhisgHwc2GS3 z7!a~Q*d$cySDZM-7{9;4R7RTQfho-Ms)e)Z?v@zMvc{=KQDVR-CZkjX<+;T^tR!Ip z)d`Y(m_+-BoGbGIWD$tEyRZcWlus8hnlrp^eZy}(KQx5j3X*dH4_na%F1@~O3HFll zk2$V`tmf*nEPF~r9z2%43MQL&bi<=mJ25igfoN zE^Pj{Q37;vTm_aB8tvR~oFIS&t!=8H%ZDp>VIRjyRiPZEz5+p%5&)Zs%stuvOSClUj!rH9l~mgni@2DC-0o>4V`Z&KkNT9w z8>*mZT_RMsq&8kSNfba^>tS9WoGQ`uohG{+EF}S`uq15(bD*eOpw$7z|c5I98#02 zyp}|pb*Jq8;XRCd1*OI5_|LkaiH4Wh0z4vT;3EXg6JNr*vVw^T4T6h;2{dd(_5o@K zk#ZUd^1{~&!RMUmvxf!2Gb?cG{}V~+(0CWXyw!Fsm*JJg^?rk??NH&5qf)x-Kk7yC zZU^_iTv+lnSrY&*dwTE4eCEzYo^IxIe{ynnu&I=YpF1g><~x4ZF)h1eA1Imqq$3y$ zF&;u(9#CU{Hoh!DnPCOqNukHX!-H=W(9a1%iM@H(@-q*c>aB+u*4h->sHJ|;v z8Tf<({zjmnBnjQhg&BP>DCNL%y0jQ0wgM9gM&QfB#uh?k^!ISDwZDePW?^-e2_|o^ zkcb3G>;{G40Pvy6MSbc~bj0^LIPmf{^%+l}N8QA6jP+g9%GGf>*AvKQtsAx6_&qtn z?8WtmO_s|%7GiTbzN%MbH9n~yL}kA&uathd{pT21ct->@inwu7=- zd{dfc$&x6qCEJbGtWLHzUMnMmS4?@57OF}NP$2YP&ah1gqHSW6|2*LFB$WO-OO&)9WwB%q9*ykxcm_ts zr?$2cA>Ey<_1J-2Z{EDQngyTLL%F+{9~QyTj_?;ia`+I!e*ge0bBZfcwDB|C$^Zv_ z*E8V>CjqmFgvQ>+p0hXbTEPN{16H*>IK-e}bVO!OG7%(*&=JzikWU}@wxN<{2JWPQ z$Srs=(-=u3LJ=i9oU4G%q<(Uhr7Kvoy)6YN_b$)UkG*8HMUAtENXiA2e@mQ!1 zcJQ6xngzPkbx<=saGQoD6I90?@WR;qC{2BJ7uE@!R7t2Sn9H58OGNn9j&5!%a1v$# zY27)D9y5>zo)Rwj*Z`>oPQJ4|19MUU+D(}H4+7370GRv^Eq_S>@5Sfl24BF4sm6Bq zZXk__*B9#0CuqpU3??qujj?d3>d9YD=WDUR8^oUAt01mh92XSo7_Tvq$f8rGV9Yot z8krXx`zDoYdG4?NSz|T(ab17TEnTA|`m{Fg#Fgz^G61;fDD^=-V2S-C)9vU}Xz|PN zSL38pl5(_@VXaF^PQ2^opRj^uVk_~ZwaNYdoF43OqiD2Cx6`=u9?*;c(B*( z?)Li!4xo=`53Y)e~9EzZj>kB<{TN_d}+^SE6P zzaJs7fGbX`#&sgeKR#uQOqSaM7Kty{2Umo*TDbD28qRJkQ zM3?wrxBSbrscU5S0PH!p3z_gc@OthoL~!&|M@!5AVH8jFH~_e`-(Z6dzh%IX#tM}( zeb8b-6tJ*k`!DH%l25tqMk32AeYB;X07jLzUV>nPby>8;7qamO?5}d(xIHa>bY+ZR zBH_|gx|?Q^P+2OW=ViU`z5@~VdQrk|liLfGWKu)ov*{eFsNb`>wn0RyS&m5@CqG|< z=cmGPUNQqhCPMLORbl-LF^QiiCUmz(V6>_n2v~Apgc-GXX>X}#L|S}Q5&s%>MTI2? zk4-rJ>{P^Ez5WYj|6?-XH?0n5T6Mj?4KW})fB+P&R)N_lc&j=f`4l3(DMaO=v_xm7 ztx~}FY1HHv1NuJWUA5 z(CQ>%2vd-j9L*OYdn>8!%qu6QP0J=09`-Ag;e0oi;R;R``bYYNP6kbxt2tK`d$Kv9ohVLolSH8s2d*06#^TE=%inCgUv zUK&yCXH4IPD$u6#eC_87ABmDp1fL?$(R$Q0CLPal~t^Nt{;wGNU#Cgu@$-YKESLvV5T0Fk7xbKaz@W#H0J0FSL zCyNw!Js;alCVh9B@%9zFX`fTkf%SOplH35INf639#A_5lV)Yr6*}z&h{ZBZd9N5&< zWTPX>mUT^gP;$}n&cDwcgmGUb*7M6AIxK){N(B^>kgtW9t6RM>w7uZW z{J@MMfq$Tc61=Hq2LTAkNee8E!>t)5h|5y)i-%dnAjIDRu?zfVGJAALlKaZn)J~wP zW8&gkp6o3{C>v&erQP*?42c&oq_pOtI6FIojVCOZyQHD*=!IZ5n8l;Rw-6_kr|IP4 z!kSX5r$Z#~`WeT)^k)a}m^^W-X6pU#zIMul@7DrY70G{F-H-Dicjt3S-_O%pyT&6G z>stO-Nvj}3S$hq;sxxw8XCCi`vvkjrW%lO%SjWylKaZzjXS6i8;39)Pn9IrDGfp0cD06X!6X;iV#Tt z@PrG%NTmG;DxLV`E8X)TW1vJM5A*vuGG8E!==^(lbiA4dP-R9;}+YyHno`HZtz5Tfc11y# zc#>xC=}q=7I!uPXa<)Go${aZsebOuQAd(iIYJm76VcS4JCW=&oH!lKsOcfwug-y0a zv=;s~34i$Pb|zs&K_=qG1J8*$jD{fk9n`|+h9Ro>*L;By0|>%QaMw3T#YO$kEByb` z4G=jKn4rIbC#^w>F!&)UIXT2A0;AJ#OZ}RN0DMevX3@iO0}uQ6LXCS3QY%Y{CHC+OVc#I5a#2&D;k+`Xk%h{O2c@8%goK4k=xV_r&kRpZ zK1mXpA`YKplCo0^S>#nL+r)!TbUgBs9uf$wy$vx!4W0PGni0{_d_|{h63nWyve%(! zSO&$g5vazY26hII1mxQX%I3C1Mhw_)7{qb?u>=7Hl5iC#A|(>S~WbG?HfI`{id z@p#s)x37;s^JmNUN%&e#m`ya4(l1>I7HS|NssL^PteqLCc`|7@kxhMeF{&&Fb6|!8 zzoNux3?z32p`gPo4oWiKTT}ug;&M7RC4MaLC8!IOwytvpGOUGRCu&!Rm!}vcIdcEG zW*5S0{ji$&Hm|#D`0G3Iw=vqk$P-xe1Yi@nO)X)`JX6k}vw{&N8)Mzf9O7^GvVU!|Z=`}JjC ztG(k3<45LLkGSG`^TBc>Ih=)N7WAWdRfhMR1!5TjPanAJ$rQ^l`0OmAVNo$&!J**d zoeEx3dshC6*SOHqbu~3Ll^iHa1VCxyJz0`MQ!6D8;%IY>Vjk_*MDt>#(;%eunvdpH zZ0PjNgQ)=pkM$jB7Sx|>XlNY#nbzInyf$9}Ond-TBj<(H(EE894z0d)ev z>k&@^#Qds?i=%;)zrDBjM!sg~5q=Rt;qzCFDuxwG34tjG97JmFe)20>g~erF=8_4+ zi;yQaRl^E>n-!QbnTdLM53}*6>m00Lr~~OR2w)TVFidLR=Hifz{R=iUPavG4d8gwh zBvw#t{fcK`wzX!$Dqeh;Tyxf56%u_ zng}ldSmcNog8l$p-tTNz4xDsyK0d-wJuU*T;P&#j5Nx`K4+#K` z1g~=cBz(xo=!zVoWla4}7+8|lX9#$nkG%%pD+mhy>L^HG4Xh|2NfP+X9vv5aJ*u$P zA~;cgDZ8DLa%x^yJ5tE3k;bjwtWW3TK5gnkq?e*1J&!mcm5m(n*GRVY0|`rJk5??$ z%!fr61eLI{@$DmSKfaSK8^lf09Kc!=Sy;Rh1erz%n^zD5b{gtUD`flbGz$#bU;JY9 zT=1=rv{BFcd@KC0eiTzKH}hX=N(zty6X4R4ECOLNRA6fG+9RVqn)^Uohf^2sYUKF= zzr_mZ$@2;d0Luw*a60gigIip)+(aZWFcAKLYlzFNk3_4r5nCE-No@iLNYjfgnu7vk0Cwo9$D_7uz*8 zaFcW(4(o`B1fg5!>H-___}kW`W#97d{c9vn%@blOPCU))>_8$tVF!W8vw%JbqYd>2 zXTjE07!!?fwWRh0wwIZ-q=BsN*V0lKT%q7yu0hekqm>KwGKj6iBO|-!px|;mKmvQ9 zTSc;{Vj)^!XTB4Op4r;kLVC07gyiH3;3I)Tl=&W{%{BvoiOsk%5oQF)XVy5Mu16o8z<*!I@cGqM+cwZxYf@`uivt0eA15TBQQwq zw|HI9x=ZkH${wKw97Q+ARW|s0Bd^8B-S%vBcSw{g8-x-2*0{6!tR46O!PKM_SImA0Fzm-m@t&nM)3cJtFMSivWC+BK0U0MjIaEgK}RHgtYNUpHZp9yIu@2JDu_rD0Q<%cIb0P2Fu3F%Hj(lUtP=)mIu0e^`gH|DGdCLU-N z>D?)z)t$O)e2f*UbW6ce6^Qb=x2N5zUERfYH zFw|w;efvZJTU=5?gylPtTyd)2sJ$~pZ<<(DBAU*9M_YArtcx2AGXi4aU#UZ@W1ecUL4`kNPy62N$pV*n}j}bVX;bvCX?;7Zrp3V_T{!i0(rhhw+R#a zD>HIV9D<7T*w(InugQ<%33&A#=N>98co77j7XMLXv8TNE)0&hj&Msgt<%^jCa?b$+ zZ5`q}k?8`QR8W$s|L>j)1f2ssSoDmHnvfR&4;M!tLE?DLQN)H&qf@=s7JEJ2zuFIK zM~@U)VqMKY#+RWa`dC0qfIvQ=V1mNnzwrka)@?x&c+$M#ePz}JXg?Aq2KyY)Eq%{d zB5jZ&xYjNYg9ixzkkiv61Eyh;(EEpkG&DnCC;@yhH4t#kp^uBC64XTDV-oB9uhR#g zb3gT)oy4b4pRNJS2y9N9b8VUMX7p2QrXrC8$P``oqfz_7z`&E<8W|Z%BkK_EWcfwr z@UGbC;Na`7FH?dm-pGKFO)g=4+M4tuiu5`T4&OfY}x0n3I;W)z@-SmV1b z>^H?z;pb^WjnZAWx~^UBWsTS}r>--K|4c5yQirUwr;s^@l&1grkfKc>Ga(%rH~|6U zJ3zXCiv;mlVJI{55I`0}Z$LBaxk?Q*4R&{dBl+5_Y7A)ZniF0oD09~*i!)69*kir? zs~ymx`p&MfFjD>+3;VhWf%X*~>xU8Y@?%j1O7UCq1QSW>v+|AQl9{jNS3=@%mDMC^ zskoNb-bF^!uv+y2mIo4m0VBo=kKLzSG}v3AM*EZm#lsVb6F7sCWZ@3vyaoT7*mjAsw7>+{4Kh zs|^a^|l3^r`X=o_&Xv?`DzIvxMT2gZfRbT+(sR3>K(&A zUTnWsXaCahN8~|RUF`({!oagVv(^ngE;0^+z7>HwK?Q=JjS7kj6yG$n&JFdlvgmMm zI&L#Tdo2w(xvb`=8JH7aTbZq;@Xp#`2w|Wi zQ>J0j(^4b$>!}<}OktpMjYc5w@ZllRHsB#z#vLexXkz3sXmnkdgx~G@&#D3xorrSf znBRS)SHkwAiI0eRil!`BjN_-emAJ61D zeI=^aKd0d)YMg<|ayB!O`QL*;h5J6OijDMAte^L0y~8cAmaV_Fzk%3AL|1}TUGQ7C z9?ipoiZJUxMJ^*|;2lc%2F2g`=mCr)H8(D(QvGfY1&?USUxOObn{WNLc7 zXSyr!Djo&@3o793F0Fmbot&HmEao7jWg(9pj3&$>0n#~)88a}8A2|sf=Q}Wvq7-I0 zNH`FTUqC-1fgh;_O#y5nqflnTNgz`}#_h;j5Dsbmil-QG+ej7>l{jNx6^B$Rhz^1A zAt)m{oO`6FH8QDbKoTqn* zr~jz^sf%0T=uJrg+NO0dx`|e^#Gj7eX*8q%j|*V01Zm?;Ntl}T%8U(#8rgSr$G))f zG8}z)rrl29Z-+I)K=qa%Huw)Ab?GU@O)?WLdsjviuDEtZkvcB3^}S!g{boVb>`=%m zUE-;B;eB5mrxdFvLwvJeX4DNtc>#L#DxBmHPYC$!$Iyime)wix@48L^MH-c;PYPJ2 zz^0%E>puWS@Bl;NiKZ1a^wQ3Ugc>%iOJ?Qg1&oHt%n2V(`$z4W7^V73cIHemuzyST zg)R%N!|o^)YU=M069v1GyY2$dpd9dpvm+E1ddRk7*9QC}m&=MWlD7w4%QEhb5yt46 z&*3BjaZzald4viS$@0s%f&sNtI?gC|yBU_lB~N=9Mtg0sn?%P?B4}$TCw>PX8E)_V zshboZ@LinLwmy+KEMQk)74d>M+{dCn1bJdJJX6fE*@p7&v2irA^ohq3ckbl;$~ z>pyXvMAF4!l`80S%voko6Ayz_b-LTZA`+7c5;UZ)#Np+!uNvQTT#LPIx*xmKk>)iC zbHGw&({nKmXk>VykrCei$_;05N-PM)p&HbQwI(AVkc3D6?c2BTB&U#?`ozH^5=l1# zxxzATolpE%3FoVObGEMIO+4#aKYW?gj#5%?<J_I!EQUTc%W=oclbn&ix$J1hm8BLR zPyJoGy8gcDg&-s-6p?^wa4ktg*$7BJWDD@$ChFD@;3@0t1sXazMUlo_{K6;oy|=kT z8qc4W1>c*`U$<_2k8}0!$ssu!ok4#iYFLCE4G^pzfh>k#8Yyyc47C*!e2;zucL|=c zr*Z6H?9AU2nO0{t-DB|`D&xMib9A6q-7@xi9Mrd?P2F;DSCU@x7@wU} z)v5WOp24#hZL{~e)~C~{iAPek@}ivo4vQzo$WOE!#MEgu+PE*vE zJhJaEjr!-nJJL z>*8m7gwo@g78Mtp;p1@KdQd;$>G`qc;qCo)OnER<>(GZ~6*s>X%zUl!WXOxn8N=NM z);pB3-uzI;mGX$v!?~IL+BZ-C`e?q;U~Sr%vwAl1t`iFD@9LbPxwme)agvbsl0#x;Qwcn`-~|&85I0y$NLuK9`ww9k*;0KQ2)HyyDzoqq7mOUpQ@T zHd}R(%gHedrjJ=PKHD zihjkMZ0R@kRcx?Ie|`OVxA*lqcrfDIRExq7%X5y+33%N6Q^w1*xMO3UUHixUXY|># zhHNh`I$O5)CDFPJ1KNToXSM-9Q$l96;*?0lL}JegH9NH=NL{TpM(fJ9{!_tU3pety4KnO=qSz@kw= zQG$G%H&T7I{Y8xc<+x6xs%EPGL*2}9u`MifUG??t6*d-och~UWCR1D3!wEz`VAf7u ztc5%pX+34F`xV_|>1OE1z_1Bw;{p}+`t`G&Q!rS+rlv+l;9|0oy~{`{Nk(>OWj+ps zlq-T^`lp-5DKCE>nbIM;dR){n%2RPSsDJ+ZnnRZ@3kq^yHJEf@yZN%2Jsb6}RC(8- zZ)nTqJ)%^?a(e0LAKs|lqHkgcM<@0QCVrt zQM%)v2613_WOCt;QByXR8%$7lD|gwqR^`O#S8ba<>AG(B6CK}Q_PV`B9ab{4LaB_a=_KN>i388F~MYS*Bo>E%~A)iDU-4~O?YIx zd)d7?^*pvr-JaJqx>xJ7qjesZ*xF3p>a;D$JGe(rEu8^}H#QyQRIq;6DXm`5j!g@& ze&>8{>F9Hv72~(<*~9$(mh1pdi4RnijhYnnt)LnyF~mKCz;tTiiApX7@gw_4QQAvO$Sim+!{8 z+NZT#q+l!u-a?IS!RvSK6$e}YD%^9wGHb{K7Km+@PhHK zeGXUrH@=&->VaGO?K0;bzuKx^tev?(;p@b}RcG(}y?*-p)$*HzX4-8jemObiSMBP& zW8+dZ9yhBxBP9XV{&h+b4=*oiF{Z*C?%hknUu!T}Y+G^W$XRx?wuiUg@$c4&)zN*= zXO(3f&Nw#4`pm2bjUv3gQdh++@2}hMcu1q=J$7sVG|{?$eM~l2=|3FR4CqfkV3E04I!7Bo(8 zN~q^}`WPiK3T2$0ZX&yC8Tle2SNUAC_FHK3c+=9|0)u_~{&Sk6Ao_l~F*u}sKQr$G zUUwOT(PP}MEcP~6ef@egH7AXR)hq@dE?KgKK1q=f>nGKJFr#Ku&a*CI*Pgu6Kb_Yr z{nDtG6LU2WrKTPZ)K>YblD=eR)s-L>^`nWiZ10=x$Y^llJR{9q%%)wRx7KjH%Cquz z&+f+?9SmDxcK6;rjIJ9-#1|o_3{Si(D@O4~T$5cIeP@~_lsEX$cWl4?hK>Vrf;vCx zaB6wP)PiQgHw*HL8cdqnV`qBnp7(Dk{vJOj-r)G_w3(BqzODXIk=goWaopXwxW4my z9p5^Q9=~=>$=1<*qO%|G?9^x5HSdqLA3Cm!yPp^HZS`>NbjQks zl8Q|k_iw4M>KJ9yu>W4ICs*(3d9G@(#69==BfmTrog+=0K$24|Y-OHiWS`ir@J((^ z{UePP&*U!D&+W0HQ$e1_kyNMCCABvXXJx1VT-EEF?UNN>YR@X4>3Hy7ywR3s&D{T< zIlNo1xq&qSX^W>=St-)Iuy15o zXBf8axB)<+w`RDyCKw&{S=uKr+#j0iP81<%c`ooV^t0Vok)-Q3*`)h-S`h*E5 zi{HN=GWXhFW3Ovf2AY3q{mnAlqHXSs#3rAB-mNJS$Ya>l?9|GRcWB<25fj;f%j5t2 zBW^^dy(Wda-ZTCEbBWQiw}I>=MlQBId(;?qfc%S^B|9NxKQv@Sb#-;!bR8_j`cCt0 z?|i$k#!ai2)%Ei^tF4Px_wgI@;&Wy3g`o~s5j&bZeYUe#N1cZ&4nLaqtsvVhe0|(% z1IHN+60Kw8J~6#)JE{~`rr6bA4R3w^>|Z``jh;>SOQ}m{)yBLJzI0R1cj&9vXOPVY>`GoKivm|?-M#!*YpwW;1vyRgUFc|}zdi*6j~xP0U9Xw};ElKTPA+x?yz z__2^R5`rA4dSoFvh9z-ToIj*{LfOpTnj4Iy?Cc$4b-*L;uN}MmY72*)U)e6k??-Uu zGn-kh|E~P?Lx1AEfO9YO{$0HCeob1&Enm&^6Rv&vsPEdhy;vA%qUr=}U3c|>bfTgq z_nn#X7xTF^+ITe8&`~u!X_JkH2CQr^S|aVDA&!R})J7}JJb>wl_39JUUMk^%%pu@A zp~K7g7B)!FO`FU{MZe!Yn`zW`K?|S~JQS+Y`7+N6E25Czxw*NUVja%4{_yFO3u7Cl z6KMRU0;@JI{@85@6Ct^^kn{kJ8Obu<6y(NVsavzKgcyjQe=T(sYH2$KU3j&yVfNxF4k5!(Ok`3(vBF zF6%W9-n$$!**-_H|KYyz)APHo1dmOyz4&4pym6C>8p=l{(SUZ@T97WMRkOFSbUKhb*PIHz6Z{KaiA4sIUs zWAd4ku{U)qYv{e}VQjxE4el1-Uv}r8lWhx=f(^Zst<_TUDr)tnru*3Tx!E+n z6}w9)Ji$T7%eCV6sHmuT6lXPEQ(e?VJW}@dDuisdA^uJ7eYWPuLUd}&ZK879_lKO}GR_gZNq@?}|i0H=93LLY} z-g|PE{jB!Hb9R|q?1KZc>f5)Rf{)K)M`mxB4|A4+ug#S9{5A@`Jo}O_CP(d9?S{ud0gTg$wQsyLbNd$;Lsa6TWpi z?B1pKJN=yTKSw-ox3}oqy7=W~1AhIgDDG-DA*k7=TAQ)<_5$o8VCG_p2)x{_^_=+?%KJZvM}jsN*G` zac|zAF8(x6Gwheu-ub#UX`Ox~zk)7?W~ipslC`XUFUt7tA-K=CQ~S5-)M@I*rXX(L zyt$D&vpFYHx=^O3vJGtSn(y-pw*d#}y)F$e_ zYs13Au6OE_)$QDxUq%4kc;sks;SY9clwf`>L6Ntxw3I%D!foL+ewnJTsn!rD8at5K zRWrZH`Qy)V!Z=`LpHs!*nlK*-Yv;aKqxk0b)lke)M>QF!a#M zDWRGc(fa-R4L?*^jN^bxDuY(c8>9#sZ3x;^u${x~ztQ8yIjEVd^k02_bpP77Ij>#O z4fS2!@8?X9O7ajQPsSEFA4>#tD1CWy&b#8ooEsg*bIF(P&~KJShXfU~z>k`DZ5``3 zYSidIwNY5-AqKwHsVbcnH9GI!v7-(3TGrL8I@grd)V2WV zewMB?WYXkGc-A@)DD~3%M5BFD;QXbhr-vmmi=QN|Beg$k7#!Dz$9L@5v2AU6u9Ykp zie9_6-lKmO1|#^wtN+B3)Pp~yYQQ@jvhufmtF*<>_Y!nwELs#A9NdhkF+pu~pw}Io z4lUU;Oil6TPJ9zy!IAP&ava2?kR9AEB5Zmq*PcU%f)lkflR~<7?HYyuL?|z!eAuZF zZiUQ>uB{65+Zq|^m`}VhYw@tc!RyVNH+Y6)F^v**!;4+nYvkc18vj8)m*w2MFH*3to))Qt-nmu zNa?2SHfvS}4L1h3i}B7nMs~w0BhZ&;DWg|UFu;&u2H~a2IyehIeEcZG8@YK~qoX&| z)J5I;`pZhZ>GmU4;;c@bK3xW@$4x7=P3ew@P&Ptiqi`76s`&UclCzOIb@A4%NM=XM z+ZXq9b#;}7xPHuim8gMjoS^pez2EP6zu&dud6q9iuOfDD;)|EFoxKqY1m{5PVa9Bw zu71qOI$>GS+4+*=XfVb5uD}j9AP{EX&ZTTIUGB%UpFnS z*V`gJu^fM1Nta4vmaj?!3EV=6+~-ah$=G_ni0b8y_>wZGo`^~Ya` z{O3?v@%)5qGeChRN-(EiniKMBllMgL+Qq$K@$f73YiVa;60dBJTWX|sdeKumHQPWP z_Ghi58IpzP4kMFKU}mO?p^OKU60cC@#DSy&a#S-9Y|=G*(^XyC+wdphP1?*+5Hs|p z-@o(#*8`*(k*gp}WW{*HlHAVCnl&rj7NE6+CwveiPWqRBr=-N&TXBYkiKb)z%3R~W z*oF7<_3KfvRfL*uG$z+YaR*J4Z%>v$R<}9gc#Tlf`L!WZWv@O43y^fHUYv#m^TNec zyx!dKYumVw-{~2Ln3!=GT$7WNp#w+*2aIM#h&PWr?Zf4Ijei72t1c=~ z?60#q>(2K2LgoG*t7td-oYrRcX4cl$uFq=v_Uzf@g7bK6 z=^YrG2mzRtm8G(LsES$mMIj+pIt{0>BofMhrmJf2NPiXwWCJD{!-x-S3wZ`+|mhuYcM*^>*bJUl$= zNiqo9VLy#r{DMA;1?f5k1-5?rsUMk<7Owqw=B6G$ zUW6_1uNk}|hQGDy+&OgT&YfdNXjy13BR*ic6jKdH>Lp%AH$snO4Pw%!O-*QUN^x}=lHJX!At?uXY)jaW9fg~kVVIluT_`~Ej~FX!RIv-j@z^sk;~ zXV)6NbfTL16HUC`T&cZ;z~dN1k?s!@1ne)Y^rnqc+D>@eTA#jPkyONt0>aG!Ky3lR zU|e^-=v?&z$N*=`dYMonQ{4TE<0nsMvbg|PxP!NehR#4D9tOm2*_#vxvgDv_?<(s# zb}A!!_wL<-=$E}ILu=1azr8%DVv^(t`v2n+%%FYHA< zOA2+=Bxrr4u3;d4@afabtG=AW(oMi3!8~~MNZ&PIr5-+?aVuA@^t`e^q?>Zw$NXEj zdP34*a}mb}zu@YQ@us8snXtH7bcC6@P3*#~76y>67fpm-6V|;*0ywUOzoQ*eJ$YsCq3`c!h&JcdtGP5)PuGqmx55tcH_vko;Z&3b{iv7$Bnj<51SI zjU6|RPU$(xeI_bss2j5|8Y>Hv z8(ikkzeakl`tYHPscC0I1uiFQ#j~}t+!ZZL*)v2+iqRZB;TkCNcR7b5@V~PYU zqv6nZX0WAc)%y!0hYznW(->%`6NJIh=5y+*P4};ER=<9Ir^%D`!4QSEA$zaPm_h#{ zCc6FiEBc{rsJ&SiLzk-vR^q!s``#orvW#YWNuds<1JRPvk(ehYV1^@bYSGhOR5-KT z+}N2r*VFR?A_XAJPHmEc?M9jPNt=|6T+_Q)-4y~#+GAkc_whg;pFU>$ZdD5Dv<;qE zT<+S)v?C7{M&@ehI}a3gic z2FPqwF1jFm=850b@6aFj-!wXToG`vLY1v8ZOKCF=ixt~0IBSvzT1pklZbobHIsIC; za9p;HmR3ILz=$F?iF|x;Er{LFhYAbMdC!-5XpV<^?~N|Jdi9`60mX#9o!xd0QWuU0 zqpHFf&fK~~2kn4OO0R{m0D?%1@2OL#?52H{-~)%fIK8SdJftgj5Q6s3awCg}?3238 zg~u6!@LO0!yldAcfCH?+0emwZ5PM%nPDnR+xt5tpYi(1NtC))Glg+7| zfCvS24qH+J@C&k8M@zP91>?ans{!zw{Zl>2)bu))P1oNxX+mO4sSoHJVerUQ?@sZ9 zuuIS(M)#U|@~t>$M}FNT_@hSwBN~kC&If9Xke_khIk%``a>7Vjn23V6??L zLJfCU5HpQ4lCU`nRk!?VcMuWrvBMXBFc-#-YiXaOnxS>!=f`U_*NW=(CgoS4v@HSB zrQZs`>Y!G(PDoq1|1==P(iA7gQlhYZPD(+LVoT$tuh+)MccTyd>cfZ8I2y=l*s`j@!@A@T7Dm)QGo%nl>p^(?4kzw07s@Pcu0Mh~cCg4_u3+ zvK!=N;423rVz`|~)&^mmsL6n{Q@z7=^tyH1fUdTV!z%pfo6jE=;N-@j#$()aE6&;+ zb|IY{RRA%-#F{H4L5x;@+6PorhuhxI#MRW_Wqg=v25UCJ3evO7 zC}$>hG!>HH#7CKV-FsqU97d|f6%b)MP+ZL738cigk0E(8_Q4w$PzU&-a)WOX++f~6 zfGzXMlRX$CiYh8}Hll!|dP87{?UyyLat=V5G=*|@i3vFr(oB3XV04>}+7t!b z#@n}Vr|WzlFZ;~dv$7O6m4jtxLDH|kqL;XJ0Djc|nSgOhGbq6`8yKn)hErPP4HT=mz-8*f-gyCHwYW66?k6lcVYmg=S;2UwMoIO&SE(W)dA6&o06gg26r=5T+@D_@B8^i(BUN2TlLCD*5(h=1tBk6q zFwd)3ZIyrXrrcvOXBv6yth~^f4KdQ$Lw0}z%Fr@2Fz~4Ow>J}^_8D145Z_aaZ@HMY z-%Sr!bf9_r7TTu0Rsr0^-OPYeHTsn00#hmj?=(1keEh3n>S1YVY2`^~_Et2$ln9SX zH=zr2Oj2I9-$MB)E%@{WHdRzaKf4H|yW0PjNhYp%IxIWW^_qaRp5o%5ZK-yH>j|vQ zxpSx01?OA%&jT4x4cdvZ-gM|tg}PCn-BD4gK=e*(YC=F#R4V>f)UcSBck^ZsI3o7Y z)1y{Hohen$$k0wjRJO2Hgsy!?2elfKMG&3V5-xC{XP{8pk8Bd3k`{;H(J0(p|WU>r)CVq1dr`DbOsBX47^GLmm2pP3H#}%Ww4YpPo9M4YQtTg zI`zqrW-Z^(nKv&_<`vbGGsEfO!U>w^FyPTLeBxAxGXvA9oVn2+q1 z-QYOp4#@b<+yOk{&+CjIynAq5)(g__dlgqhdsAPZ4v8wNTd>0d1q4|#We4oxxqLY_ zVTTLOdi@V8R>|PfBzo&Pwe@g3NJ$|xF68}kk`-NSZES{ld7bbL)z#E&)^g#(g)%sd zr_7SZ?U9iiosW%-zmr?i*G#K*`}U)}yz~L*urfZlVh>L}yPZVh__}f(0()t++uoVa z(pO|ZZ3!wqWaOBzbH@&IY%G(HL;~&Fw(Io0y4vGo$!Ms(Ntm{Q=1OT#NL$i1#h*zL z%u<~`@t1}v*ghio*i3bLKzo(2Ft{%a{Ax|m%YX&B{XA6fQMQTj$GVFZ0Cx42apN>X zo=UGVx$;u&cU@?;GE5LsIAt|VX6l~GxQVkkV_eADBFaniheWMsD=T`t8al6fHxRlq z!}xuAe6J14W+sXcD>`h3fCW$y>52%Pt`NZ#B?t!o%F>$xsPL@*P*fZ{?cCC)Br{?R zbzBd!Q>j!lUseM2lKLJ|E?z^@neEjuKn&Jo1q$|^9p;aT-n_XfT~?z0pE-YiM^sex z&amEET3xzyS<9;xv?0Ae#0$fNs;XOH%mDzeU(Xdr8l=;n23ZI{^TfNJ1nR<80ZFN2 z$Bs=seR^kcrs537=G5cu=~#Eo%0#(9RGaMGTm#Lr_ZIjWZByUojQ$g2GBcS~+I8YX zMbfV{=E{C$)v>r}KYaV<#zE&irG!qHDW#U=4wBiS3~P6X6OU)&!4E#KmjB}Hi5)O! z;0jJ33kjLAVa@9n4O6;tq}Zc|wRmUGUaQ@@qHL7g!N=hB}MbdQKJH-06!!sh_>U7gBFZJK&cb`$-|XnsIe9` z-XP=13;Sg?oQ(W05s_he)MpO!+ET-r)>gX+Afhx(9uUk+ZhqE%#$P8+o?P)R?Y^i~ zPV{5ZN0b4-Q|Cz{LT7=FM)3%rKUe1xOCt={@zJA34NJT`y5A1v5ygmn1Lprb);mNe zkLfSq-QyrW{IB*o$>Bt|2j{$XsS{s71{O1S$ZzF!R1_Zu=S0z@E5s(JO053FC)?Vp zdJi$7S(u148~GpRf|i$&@M`5gX7-~HX;FRZ-#au>iG+js5CCq9GnE~#`lbTE7v)6S#UK*Q~i%ZlHSe zKO7WCxrj0V#(nP^R{88*S*|T8iti|;8t&{Z2ToIZ`o-RU4XoSG zvZ23cQe!|p1Tj8ds;r5CO0H59*uss?JFLHSX(*LUU7()6{ZF9IEg3gL_H0Uf@Ach- z!zg8wLK_Yv4R*kOETiVfw%7FU+wsKxLofO`rw2j^fVpN9H0sQ#-TjsQ3Q(~)5TgNf zO`A6_iCO+kHZn_!+c&&nVU@qK5=_*%IpZC=(6cS21`;gxHD2#MK=n14v$MG?19c=}bU!~a#U)6QO*0{KQ^4L*7r?(rVxBq)0e=D+`z$%FaauP0$n&8Lo1f)rn zUg9%`%JDvI^^!lSBS~6Nr^`*G3qfWqV#p2#8Z20lKk$Aty>wZ`$}zjUO(I6cgOY*cAUWXvc(mo9sPy=4>K5g-{EbObFw#z1YjP6p|&C#4kMEp+mYX zX0J=tv5c!xA9haN(e8g@`Ey~&uuaUMol4YON42u?GKu)~>A@J#x(psX(Yup|{~0}s z?|ndR76J>)1hcrA_jV|hOP3KaOY{lD6&sx@`AJRzhXxjuA} z2@d|`_xqb4xwyEZB3LS_DCot$wDe8>XF(qGdJ~MS0+gADNDl;s9y6dudGDFUbQRRp zqF1jrl3QiK6r)K!j-s{$R0^Q##lkK+cm&M@^IeU5b%t^uEEE|Qm6-q{mY?v@EzV-OQ>V^&LY{~J zJC3vF&&4}Xo$B>RC2KH+v2PM21aJ~1Y}Ly2RL9+}<|d_tcJ){Orn%~Z;#??c87C#W z6_{>J{k6(*W_|1QP_c3X>_@;&BFl9$S{ms0t75toV9+T^q1ygFW6|P%;vn0GS^Cb| zC2oY4{YKUie8f!^j~WU*I1A!#YXccD|H7BROJEJ$t*#9@a#>Obj#oBdzFlm*F@ZS^WIBemSXs+2vZD?iVb{|krFJ|pYnOketh3?zAn zI;93qY3{=l3FS^Bdh=?aFqykao|FuDIi}(#)g(drWofA;b(w0K{Jmgj{xx< z)kZ34)JDGjq7&7qSz9J~Wx}mWQ#o>=jZod$pu@irGX&{^G4N`<0y6ZeT%#~!)+{s9 zcS5y|LbsjhiloJaiYbPar@;`4l0<{T~$WfAuykUTh z8LSk*3;^GTEBGH&v+{zo(Rl^i&1cV?k*~&`89jddM75F8L_p~}=IR6{BqWp@kkI-v z4iHK*067MZN@j0)_ll1oB3LJ878a^9?TxCT!DUIfVnX40&EaoQt(<^KC|)>{C+09xCBg|{v>9ce@CNm?%q&oGIQE3W8?LNn^bF1pxuG*rV9{xwt^PKx(6e(cZ*A0=F*_2!d;Lha*A zx^U{qU$D1m#KkC@r1C(0H+Od{;GN;BuZPRE)*CnM_x;=Z@lsA`nLU|^*A3sYt@st} z9D(h_IK)y_uOCI1qs8u-kR)24VIXySP9 zmj{JY!7m#H+x>aY#~KL8WC)eCLm<;j=`45N!HIcmXf2|#g20$gag|tlr{W7`N3C9L z8PyXcDzuqy&MC;xr3{oE7Nm6T5v>v8eV0YL2n%*bqg_f zcdw(cJebeUo{-52K}xsipyuKN!bKfp1?yex zVqnl7uVCS}&XaAwng0hZ|J2krwSP;jl&)_WTV>2>h;czy6udw?N+o$z&+u2n z^TRG8IQ+bLYdNhvy1Ky_J|fH~YgkO;9k?zga}Z|4Mjwv71tK9qR&--R6vU6XFxzPz# zwZR^7n=)FQc62jHXn*qM^_>kQ%oIGwpSVBaHBds3s5D*DAHA0&B}h4GJkQIC2g{8SM5@ttQm4UP5Lo@p> z;C2?rOsPXD;a*j^E{-FCLJg~z@3NYw10P46N!+_KNO$7V54dwgcslw1`AFLdeaZ$3&wCOxH!PGG+z}55{~Gr%ZE2>-IPqMit0jgTwYs0rQ485YC%sx5O-p~6va<=y#1mACs*s6LBqU>9#E1Gen+M)qdp>y%2c__qDFJkv>a7 zlg-slJ7EoVJUTTQc>NJxqkt?goj4q<4n|8~ua5nc)n>dDiWFXicvr~F(yjLP-j>sp z#>bjUccP5${^y^6xF6fLZ;!)X5_SWhA3FO2GfFUv$O{Tnn8OVZ1mOhR3S5Alr6p3~vTj{s})4liT zd(%q-4I!i)w2l3C@?kTgwUEQ|k04{_7;W#R8dIkmcRb=a23r^J-{RQ){&2M%VxaTL z#JjQ^w)EyUV*>+aRaG1bjgSG7KEI!)Q5(wt$)rOZ%hGxQ(YyiBM@b+SE1{d}+|&VQ z^ym}3So?iG-Sis@R;4YKs> zfjYnOn<{xfnTD4_+PX>aA`4AE(ssiYn~n1V&Sd_tI%M%SbjW%hb@i6THn6}f(kyhO zIFI)Nc|pX95OTOqJ*Q*+V+@C#cZePC?;GTQDcq*7{-P>|GDAa=Lhkp6%cBuS(v2RF=-b#Mm{vkb8CW@N=xEHUx4?Y~;nv1o3wtV;K<}`+L)RbDAOG7-V(` zNr7t4;o=hjj)+ZMkv`e{Ycu-hy8UHo9c#J; z(>g`fEA9~F&m`{ycArFerdXyTjh9RR6OlUdB-F{Vi$jVdID3PZEIZR>#2qz5Aee|HDU*W-VIOM=WD#g+46GL75k4$&+YN?Cj!G|w3 zy|$VWYiNZp>B5l-1Qi65HE1c}Te_yTomKt8@J+>jUQX@73FOveuF@mYy0{RI^$%vK=sZSpDUe z!)M1BUK;Au`Nq?=4KvHUr%hGpfBnhjs^&{xJ$W9cY}u!O|2802>5Bq*@qGtTq3J}e zae9DT^#Nq5(w_@J~60d@5br2oALB>h)|IXqWlmL3>?YU2XNqzA|Fs z*4`oX4p_d!o7Cm^1G9O0OE;g;fHxY!U|A?m<&Nhsh|f$BC`NR)u4gqqr84o84FAp+4)OQ9_*vE zzQ`P9Y^B=^@AxZQ>cDg{MozkJ7!F0{+Yk=Cd*8lWIdG~Ee@Vw$ovonPi66>lDlr7Z zF*T{mG%NLISOIM~*Kl|ghEC`KjUc^}kX)DP#%Bbs_Nj)e=>&O2QzEx`EmuetW1QL9 zX&QS8KCSxn=>xtdUk>MKOZ?>?W-@`sag0iW8Jx1g^2$Ar`ehA~ICR#l6qk<;Uqp$6 zclqAEa2|g$r9w}gEv1>@1;Kz+!A_{qV$1_H;(C|O0ckIrYBbN{Lk;6fN*~jmH%r}f zv{i_&!l+2C20m(A@e3prNg|<_t{wS+=(+0nQ@_#Sd-poq7~rfF^aW?D4^K;_q^P)w zDCuDAp8Od*Nh%^e2ovxSZaLo~d1rXIKMX2wbU&sJzGIaigfGo-G#lsQ?Qkt>G4lgX zsfWl7MMXt?iVb43CBw{e!~6?hkTm6VAL*fi0Figy-auQuV;}C>u~qHjrn3PMyV*oz zyKUewEk=izQY1S5&pRGY=Pdpy(dIBSj;f;KpG}z@#CaFn4jjkTKQWd}7F?QLNZsJF zaN#(6d;4wAcPhty;3E^L-ILTZXNV6Le7)w!yTKt_wiJfCd_Y2JkEo9wqLf7|GQ1~X zjXJcuELuS}5~iJ^3*Nlf=O3+#M}JK0yw`MfM+kJO4++r(L?eKPy)j^Lwu?)*9ZF-O zP$*;uEhqTUGAMM^u~9(q(#7*^i?xHysN#>0zqrzwN0CYM17y?*ra;MLA{3r#5Ku`J z{PAr}T|(b@mE^V(K{)NDN)XHxvG)pjIOv_}a%R#YghL3-h8UBChhtLp@voiT#iqu| z!#;$~F^`nX;$&CA79}^W9UBu9-I7;K?em5LQ3x(*8s>pSl3r4HUvAr@qw~;VJ)pDl z^A#z`66J(12h&Wsq+$lv-=Wjbbo+mn53 zKAzZ`x~|~O(vKY-`%#YzeJ8W6W?X4N-f3Q2MoJGw^kk$>zozVZu z6NLhiguQgpCM)zMdGiOPNc=*Dp*^!2LV5Hm&1{_u{ln?@`t{vA4X7vesNuY+;ff4^ z>)x$feAakV6Rfa=SPU7*=iTk`>Q?M{T3gA@_Q`gZ?|jS@8h-tFO|L&)00+m%T2Gz2 z=aFY^1c&o06W5`B4#2|il>T1!z6 zImDDARwO89gRZzT+T8ufO5IX(4Xd7iOuh$vofO1sL@gh{A)*7w#yIp!@RltJq(X+@ zh^9j~UQp?pY0Ui&4L!&tT^WDFOI5Mdj{MQKI94tR)CpeD%=`Cu0t9Emw}V%y)7|MX zS_>0Eoe*&TIN8%0xHlec3vyuN1btbuwg^z8U^|QpEhF9x z3=QwlrUxb}>4LIkQyM$q9?bz1zd^CF)8*y9Uo6iJ>eSG1Qeh{vK({3?ueSKSa&@%P zx&$q)Aek+M=l=z_Vj{2E_>b*7&Z{*4?c>v7;%{?$e~D8py;{=lfHzy19r|&D2X0XQ zrayQvoe^*#=1{A61sXLgMyjT0j$dYBdzEg=dg4!y*b%tO;jmLHPUC+fc;$|*Tf3B+ z+v;$j>W7~h9mCO(Mu#R%niLciR6`{|f|?yF%x~JtjEqM-;|j49t{p1nnfE8q3}}L? z4TC303a?xPOzFxR!*#bVA!dZ@P2YR$Qti1>@2A_UKpP8+#G1_vt-q9%!n$6#wO!mZ z^n1$Prsn{^NFQ0`^^zn9BNtcb?mFw36&wsXpc~EULQNCEz=iihHS-N(tnnl%h+UI2 zGZsq?oCDWR+%5#40rWAyi!uv$LceqYOo*b3(eF5tcUrfm`xP7cp1R2jEg*NKhf_A?owN|+?zDZh&c&r@A{ly(h+HFkmt$r_o2n~@I z66@0Z2y*sqe1}#HL|E~qa3V7<6WtH(!Cm`-f{}ST&enTPM*lI0P1Folt_cYVA(v@j zn`c6xq!W&i*fFV_J{E7Z*+R!BZ3K)W9Pv)8Se;%AX4yqr&bHW$=514)Kh?}+EFEhR zIu3C}4)>Auz1sCgr}>+j)Bech2!i5Cw011;_n5t=^%6-IX|oA{t(QUcVAx4CciEO9 zjtT3iA4Z~YX5$IH4ppFNdg;%eoN9Qk;H7?kkZuG3nRbDbpv!;(r)IQjXYP#xMxK;r zKmj`&luYYg#t;K3+g7Dzsnh&C*^NUwu;3kvfJ<$X$Q8VShE9Rl0>(+lXE#+0hw9tv zqhKo{YTC<=rvTnXV0&DtGUbYNA;SicFu+hk8O7g8QkxKHx1aPaTc7~|;&BsGM%~Ha z{V^8(RjOZ#;{xo`=yz2vH%F&unuPdaL{$-@D7lu3?|KhhdBr&@~=nS zevJi#m(gU}xuqIt6kOtDDfaVOt;B$t@w`LA$x!Kf#;nwvLao5rKmrp1uDgzo6_F*- z&Ev<{h4m&4{675*Ejlt`S6cY_YVJAx=1P?Y{W=5ukCWGCzgeTSZgMxo`67*u1Km|% zt0NuyS#I7s^o!`NbeQyax!N4(L@xj4>OH{rEsjMWEC+_@a*u4YhC-t%Z5fdXBq4MC z#hTq{X)x%a9%M(smTaNo8Xq4ojxz*Tl+)BDW!BP|M4>6iL%9+1vi8KIonZUL?M}dy z-9M1Zkl_x-ohedE2v{oCQ_bJv%z~v?=MBF>JazN@4?ws>CHMUB;J9EK;!^@g)kkKI^Xz~2Y z%uMGC=PdRp9X!Zkz!`E?-S6lA{~nhlNsEZXLa-xELG?;*3bgC>r>>VS5iS>GSZ@Oc zMq=9&qUoJaSRolkTV2sMzhtM9Yoj-1SX~U*Syuz8To^j*wv62+HAx+X&uG$SqpcH} zwU0n*g-MJT7l#Q9y2S3ClUcp9dQsSeS)p=^7b2~_u!~$LB2Mx$6I%upKal*9<`U>9 zGvbMvGoX+OgAH+&8MUKdO+*xmCxq5@#pDGJbE4G zH50rc#;2gTeRto8b%1)_J;#Nx$AU@pT%{c5)K|Z0)fbPL#(o{ zg(u>t7zrWiKQarl=zmaR_E8uO@p#ZF556f$bJobZ6gjlU##SXQKG3WOv*&LCv!s&+ zXWVQ?%yZnQulZ-ih>-To78n58GC^v@Q8lTll%lt(xMb`F#S0SI1ddx=xYg*=qBD^mmFNL8}tpsf1;{H0mWyI@v=KGSv#Ho9OJ1iAC4}fBz)4 z@!|C`!vLK8y}Z3O(Qcr_sTzjMEckFG%jA9kmSkS~UHdm>hKzc7?)O_}n2V^Mot^OD zq=H7)-7|msYIv-Oc~;ieH&^eBHSmm^v2H*byJDJc88P95Co>@FG7&S+%nX0G+9@?0 z6=ngn)6+Y)$$1U#WP#d*o2Cj1m!Cg>zVG0&(snH=kHl{yPFQL}p1v3DVCysX@3;2p zr7LTP!1>2%QR8s&%R4NcnI9u`of@sueBMo&n&P^9HOL~8Y;PJ8tpzkuvGEyYfn+ZeG``(@3|`XQW-4_^Y9?i z?3$OK5A&ln+s?FCCkhog#l-sK%(~dvQY~fKf!1_;)~C=D3zdY8tsiI3l&K^CN!Ivq zcGmQ}#BW|gs->AoBD<`>CJpr9RWbO~?({4dv0-=?|3&>R2*xA<@m+_X75>{~(OI6$E=^ukZHBM`#exTObXsFG-$#WNW^&~o9Ox0p zDc6&mn^V@}%VXM9BijETco)t+V&6$1fw{1p~lp!-GU=F>yM7V zBaKh%8#NPEj3n~$QM7XL*%G}Oq}Zcgt!*FBDZ0n)o8B)>FiYPQ1jqny-nI-2N$VD2 zK)(Xq)Cqhp(ff4#ZDPWeekVvr?$y5+bKD;OvrwAN|AZ21rR=+R+wck3FxF4VIfmRb zTuX_qYPQDDmdG$*)F%RhnIMzIr63a!Pu#K)yLq%TqBh7H$F%tNy-?Ro>8Y0$?9c%T z%l5c^d^Go`6yu<%?Kn;tk~)ss3MR6MD$RYQ zN@E1-jaZDXHPzL$A+UiGbg3r=KNAvVd(fnQj^T=w^VxQ$SDPQ+|6eaa`jWDig#QDG zQ*WQ1Z%3BLe@bWC*6@}A%9@iQC-^;G2M+vle8&>3&D|i9 zD}q>*0a@a-8=roGSX#w@Zg+V7Pz>4FsfIJwh72MT8N?^kO^cL z6dUfviUK>?rejAd{vVJzugbFXvF3YNi3mf6$Sey5xR)&G%XGOUsZgLzRO_~TVWU57 zdwkOQm>Ufx*?W?f8pCk#@}Zc+0IfTq%W%kup&Wkc%FUbB?*h%jM*~P^^F!!=Qh{Uw zhaFtjUBjLal*f6^1I~u--n~10Q4fEgIW?u`5B=JAj`pqoi5e$Zg>;CAHirIv2)Be~ zhg;7_p_$4qNAM1DTqECL#l0WxSdJnZI3TT?fq_%!YJcThpjJh0KS5D^26&<|U3KO( zq&OZ)S(fgX052frAS>kM$L!r6t`sYcaD+3dq}Qym9A>LxTK%G->5sSl5rWZJ?TrhT z^h1M#r3Ars;&3u&{w68~CGjJB9Dm z$UR3T?)rS{ZcYU8_iwRa132nntT-^KaFjcDwg!2fUHK(NXvl<7g!uZ=zH~d_o~F&jYNUDS7|k`yvR)&!8ve*Tktj+O&0%RY!ac$4Ds zrvX(Au*(W4p#(e$vn=L-v~IuVlbYo%+X)akWjH0ywnhQw z*fHe0l5e?fiE#YxBULqrC0Io;L=_WNAaUR}?xTN?P4|254IqGDGon_R$-osI&DEwd zl^3suQtw`uFazpz*HOd53HKx0EGWl>uI1!9c%=LC-lRPeG9}QD@t^(JLmIVv_g&^% z6IKgxE$Pr{mrDYcU2#$}^HAzEuhw;%*V1!2eP(NR2GI0@|B_uQoJA3?+(+sR;A#ATX;RTz0^$^!00Q*+`kh zE}e=%r!uHa9dBLVW|*ef^`?Y$1ytXM|NX-YVxbj5FXi~~BIwS*y0~2endq3dQiVxhG z8#QQQM`*J+G)tvvcTAYXM+K@{FnrXgT=TFSayLkhXk06PeYqd&W6bR(`}y-IoAlw} z0At%e-kksY>+AziaSa+aWX#mP6o+OIe4Li{*gYrjp;N$D-&&XspmqD_$Kl zhG|1(PXr{T*M6^an!q-z|)T5SAr~V8j+S zYm%riJDjPyBh#QJXK0D9awbw!?A|yndQ@(sr-~*cDs*8=#G~U@5qO%Gu-^!w_#PCy zR%VIq`wrSc8OWgzm{=#z5(HQG<7VKEl7=00I?=`Pta0{qqt?vL)jJ@HG1JBwtt3Rf zk0Jx4>{IMVziXdx6~RuL;QwqjawO_#$;?1pW{ibxrJ|C>w!Hnz4s@N#0wlhcY-*%%w}eU8ZYckC+W|lEJnAEVR80(1FrV zRx>wQPcIHH!+v3Li1JqBn$)Boc};DjpmqBV9GC#43h-LByz&X%Va+&~+&}SIkb|B5 z+nKcwryiEKNGB|fA7|g=VChfK&V;woxKwV?VyM3IA*7Tc?VA(S8k+F-s4!N)t?0_M z0?Kujn&*!>EOC^6R6TCr&wc*RJd|D5J&Y_>f9ehIqXlN>Vk?j2A z0^VtEngCc#9;v`pn$)tPT<9###A&Uls-t4=rC~8M8QOuk98b`qcRs(^HST(f^93V9 z7XOOwl?7`o(MYT4W9*My!|;tGkKO;fLQfpGKjb*>ol}A}M@5Ju zqKRnLam{ypEb9LqkSeA->28C)vo#J?j`KeUq9lt9V6>4;JEDT{431!3eU+R$32y-vmsqUCZY{Pc zWKQaZZE=xWp8s!l7YgYAVRxU99M&C^LTto{5n>^fQGK_33*!5Z{ZoGbg^TSaMBDfw zMfQOi==WC$6cU$I@vx&;S6*^{>SU|J6%T?WhF21gV-f5aG+{eC8P-3^nQ`eDlZYqZ zR+|!)&`jE{+Ka2{`SKG{G*3evNG%Ho0EXV{^EXTzn&aEeIZMEj(tk{7_)oJ2RC=2Nlb0d7H*7V~XIVqQK1oNP!1#>}&FmisqIP=1{Q*e6{>-A^=Al zIQ~*e*R73WgJs%F1r4ixP*F4s1w=%sQnARx5Fa%a3$gm>vh-PB5Eoq*EEqd`_5ndz z3mh{~D4SWkUM^uarmH{-AckX{`H6w_udyHdGaeW_h!T@PeQ zVQ7ym^E9+VewA3*c-Rc2+lRcw#NikscmofnI?2jL#t$63|B2$KKmRuboP)LAy?K8p(!Br7BD7$Wej;oZyr${DxA zbtksO@*&f|I6Zxt|7)wlVGCYew2P0fx~F>ftXb=MDELie^g{AtskEpwb4<$yLdsHK zTiQzhCyMR&`w!noAnc!ie=!)96lx=C*DlkK@4pK=CJ#|$GS+AoT#lSG>Qrt3h7d|y z?Rz0{3&^1mQa|?Z#GHeB0Y>hddAl<@n`w-nWD|Fabd|eg6mF9d94H}Qse}3XbcQc~ z?hUz#rT-wAjSKBj{b44XAI32MMkXJ@I38T5Fmo6RlJstijU8esq98)+r2G+WWZ1v; zq_k%$^?sFL%#n!7Ehf~ypODXv`TG?$yn5k->0Iy1L=GL!#3*pk3VWl{@Xk+?ymSlF-_N1 zV`enr)R|O9Y?fb)yY3pgpEalVUZ_i78EE0{Ez|J+YSLuq+2W!L;xmK&CXv(wMqb87 zE%&Zt$M0iLce`6^;rU!%fV6FRe~djNACr(bGbr?1h|2&$5St^Lw$cJrSp z;}c%Z&Nv}<1O6kxpX8pu?`ON~GQ^BY3Oh74HErQi%f3GX=>TYjlKazccM`t^h34d3 zZDxx9AEN#{5a{-OABQzGw2QQm5hA1{TS;VOCn{8Cnnw00vWx7MO-Q(rA}ca7GNY8e zWs{ZlJFecJ@ALe3-`THmUgvqNQ?JQ58(o(hASDE>BiNv9R~#^Wh~}qGg$3_ zs84;)l{X|(hQ5d}d(BsS=1C|y3IX{Ncx%{YDr4fJ?h?#!2cGbo6pN5HI?(9^d9Fo5>N z@1ftnJwZ%Yc~E`FAV4zEaO`rit3!M<1A!2rNqr(JgGh`pW4|62l_5$C_Y3bg839nu zI2<=ixX0o)@)a(P3&T_P8QSD{CB~|^5O9#haiW>b%gZ~WN(=2>(JNM;K-Xhy^T)TP zim*d~ho+6t=m6JMp@fjc9Q4gwe>aXHRMso#qq6=@bpe>uOCYv*1XC}h8Bo8az&ohy z^h(rr|Nm)K5L!g|26%!hs;lL+mDZs(MbVQy&e;DsG3$026<(fl0CuT30eu4luPBMM zAw(^do4z9jgf4hq5>0V*oat&DO7%w;x$;a(id*+l3W4L@@w1YA+hN0OZ_YItL7#Q0ubZeVg#UOOU!2T3h z5{;Ac@v#-XB@PFuy-;yrgG28}k0nnpfQ-?K?A)sS3jda@o*G8|pJXz$O$#^rKjX+l zhHnK4ImdG)2s1LiIgisbkpJj*>Yt*CBp}zi-G@FN{<7)Vz5sKj@qvN_vA!|>A%BKx zi;+Fw74rt?P6^r$u;3<_L16)L14`4He1(jvipl~0dm63NbAr5lF)lF z{rhl{aS)eDtSnM)+I0Kw-RmbqN3{{YeG7XvNN7HKeJ_9&s)cse1lC8BM?4TI&4Bs? zCBCwhio3YE%^*@s+(L-GFX$KK32Gud7uK0a>pk_G3RzL48hCAaaI}Tti7)eCaf70n zBKw_sgB=cA2YY)jVEROixYf-fWcvK~{=ET0Ce_|*_~L;?t|Y?uccte~d&+va>^3IB zs)UjxG#c#qnM2X+Ss3f2fbfuZ9PSGeVn!HHCoolVpVxEt4EOV#L&2N)0NDpo{^7c} z7TBHzfaD*g%!ry3hd$vSr$EYFXcAp?JPB$;Hp8!iQcPA&0Gko{bF>|#1)}4L+(-|9GqeRVE`5qYQada4{3ZC4 z`(8@zOx81VJMzH)vXD?_J*{SF^%3TplO^kQ-`teFD4!HCU&zF&RvtimGEQXr$fPEL z#!Pz4NmGfI>~B5I5ds20cmQ;N87~;LFS+$*U*@i4B3<(UMzPvRQ7`bJKTS$6pu!WM z8)l2)=9J){CXxsDVO0mX?{D6~Qmk7l-JsO!LlWF=sM$f11Y_n+sow_eN{pB&duw0N z=Er?O_e@PYY3<%_IL0aTQ|F`gkb|ZbY)E z5OoU6lB|c!9$`2kGFZ^)WGw^Hi4J?3>EzxZuBS@kRN zz&h4w-eZr z06(<9B*ljq!%t}EhXAR4LsxxNP)O($Xm~VIyl1$6>TZFjtpvhHixYC@ zZqQHV?GpHoM2C&yikIoq)Z|tYMvFHat+pHcA1BVGSazRR(Xa=) zAh;aZ<aWE0l`Yp2S2NOc9gC7Hex)ekZ={$aA3*(cv#w+**NB}D#4**?e zI_}n2!8lK~%0m(wP%*r4QIn9q7n8Yc8Wyl?haCFU+QURFfkwF!A~do;8tga-rSoR6 z<-sTgUMJv3*^tX_SGn3FHXAQ0TMb57k`@{hnM&B6*zI8031~|~8^K%MMk+B{sI@ZL zaD8b9Ul0nO=o+;8`H;7PDa*%lu$B(mlnM-~`WzP-0mYHXBC=%<>L7dw}uU7UQ(mc?w#q%NUbqtoG6+8V5 zQT3Vr_Idrxph#}TOM(wV9wRbk1MG>oSI|3Vp~HcndFIPV)ttW7uVA#h5J;;EyIO50 zzenvW8C-tU73luhFW?{~o5^uzS;gYXh8!YNU~v-k8Ofn0Qa}<020d7nC)nP-vXz`P z1~0GoRsQX?J?6FKB@(t&G%oXD>G`N|(R7W@O#Y@kA+gWdflD2&d=Ea&%KhR!Q!sdJ z-bu!Ics|&jo_$w;uxrhX=Y{_1RV{Be8Uk&&z#@n|2A>G}U~IC)veG1`s8aUQUW`4B zfFhwY^MD$H0%Aeq`!`rVDV8S4?p_0IaL<`NVC!ZLG_Xs{f96}x>JK$QVy)XcL;1wWGESLqh} z4rBlNXdLys3T^;cLQorYL`00Zc^7?YZEczWGZkYg^Uyh&I?hSG^#|tztf!-{i@rT+ znclc^?5S0L0u#yEY`mVJ3wne zZ>;OrYx;f!>g7gTU?O6~?M~jKcfiTEuIEu2CO7JYkNFD{y{GvN9Zcz1(T2 z$;E&qRHTs+Vh2FWP0V)sbA~ala2fzaC;`g!7SxyILFWF?BrHr2{xm{83kZo-8wX2l zx$p?Z547k4FoAz@XKp+7QEdN7*^Cmf=ZOxO0B($g2=Ks72$V(2M0Q-jCFsGr0PNjD z7vs&#(AF7l&R(VF+FsVILbC*tFDwI#d@}q$tis3 zDM!fd3m3ywJj&HdOQRiGbN4+VKoBzE$YzFZ9i1r2PwzKDGJ-;YW=PO-{7AaR?=Q5r zEoQ&ogx%B8zqw=#t_d_E{w&3=-@mKCn`q=bipjsp;#r19T?WCOkWYZ7>mjJ$Mv;6w zD=1%xr)9WILF4~v0iaP00q{$52=LsLLGaILny7o+vXbk->%sl)0dH;7qPuep9n|C`|2F|Xu)-GUYQ|_%c|4yC=T>K0yy*m>39ofD7I3lY&TIv6VEw-B0=kq(DJFAxGW$GB0SD=TFn(WA}-77mfX zCPI3mS*(Ndpak+hNZ_9-onJMx0BNfM+Nr$Um|H5&8=3{O*$i?(3=&213s;`PR{OAE zc0VwaQ}-~uz6HU%3pNBKdQO7hJ#GAros=}s2ISEYXBJ_afOkNAa~i362Ps#1vO$>u zvjuy;W$FO*q30fKl@$2`5gI5>Lf+$%v%%Bd1-L>V;*#7HO)m*mC=QLkr>)fY+!BLg z8xtYX#9~)aa@9M{A;HTW4Q)L~?hH+{)(wvzzfj3Iy}AAR%e>3{%56O-D?_4-U1fi$ zguYfQ+5VYx8X1@3(|YBY)y+ur3u^=(CYg_R9!2TLO#U`f`f+RZ)CL}|c{G2soc zzf368Ueqb(o(@29kY?}~org6I-SWSYA9O|*BIz*OHG4BxJ%P)VBGisu)`hf_Knyq2 zS6~LO0Llo54wJCOXjk@kZPnv3yJJTyE4ikIX1qi!b07YsnY`I>Ir4Gfy*19AS_KyV z#~BJM19o+?%qrNNS01X3FwZojsPeTq>-P4(PgoA2=n33=tC#xiQa&&sI zkNk;_cM_us2*|IDqB7!}{IoS^-tpe8Ti*7AS3SAzw7&eHlWVi@2}9wUJI57{^-3}M zlm-T`4;;K2E!+Gv`naNtXEW3ipTB%by2+pdJ+S5t+@wnYtKbdX4HpDpPj;j)% z3pU~CVb903h{_h_cL6o|ez#Vy8+1@gO@7KcVa=`cGy7gcND$W{@qt703K@Ls;;5pN zL*~`#WxHl1ZgmB`Ym1E$JC?pZb@J1y469>ORpT_JNXNlHA$R*GuAVCXa^j(*$~wO3 zYks?XDgmXFtUmB129WJQM&u7Lk#}EkeuncTVHE+%@T&i zAaYE#My&yDKtXsJ8CeSe2b-6oe)?9u1KddBI5DXZe-gRZx3KHP2XH%}9dhE~DS=OJ zi*hLe`(Qh-#JHOTJv(LzUF;6YJS5EsMB_sGcSJhz!blMR?^b{5`z%c|=rF_K7N*c8 zs9nd|hrXyE5hn1QyrHW&dQn<>-@${6YTv)s)(#L=*5BVL;2*bc-n^MYrLvp-!;iWh z<1d}}9Qs4KZ|B8Zl~MhP8x(x2WK=Rfx$~>V(eWtJe757}_;q!P{qn!g8@f1*2eOc; z9zJ=Kf&{?ehY{)J1|%+k8cP#7yC>Uw9IaXD)c2uZ*%Yg52EHFZMB1dFU9caFL*w(S0|9vCa33#enja{vh^8{g2~mcoRA+`5~$nes|w zZ^CX0NEk`w0n;(Nj|Iq!+2sJOAhDEWi3}>`H*ZyAmuJsN5*qpW@O9x$cAf zF*_PCMG+l=-M0Enc%mzO21y` zW1_o;7Aq4rzuX~W8JyoFL>z&ABuIJrh%#$#ULKxmI^tOa^h;unaYa?&CX99OkIG{N z?<1!fVh8<Kn=)YbPB2I=e9%VU>%=wTAKLy#ZXM&}NqU-T03-;4;mFJy;0wmIO# z|L&kK*|Sj>c^RTI{1bdF>kJJCo!G2mjgX^40M`GLOIU3@&LGx?X9N$E0VD{<(#Nxb zGkk$Qf<*n{g;hmuJuGG?K!C0@X96+HfycN2KnTEwiBN;dcsWb6Rdu?+!w z^=yNe&jw`1uy3E=@0NKkcjw=`PfW)DoQgA6k)*CWDxChvO4QQUujJOjfO*@(ba#!d z&yD-`hwJMwJzH=?^EicL=p?r1;MiIu05Z}KaZk$9ATc1?{n63qU=2VczDE7~cQ!Jj z#R@@-<%)?M%>j{qf&V5u0nsieE62J1%qSJd`NDqe@t*E>Mu)tJ2^V>Z&*f9C z6cAMyjlxTEb)o6htXjQTQ(WAgoNgN-|NfDOM&n6WCy9_)_Gw#{h}So-X^B`)F?*M* zMeo8==iwjHYi3L9LrpbI1MRapfS|+hN?2fK6-5{RHI!K3L?%W=veLY=#H0)RQ9P&*nD=8EzHD^P zJi1R*IH&kXY_8;?bCC+>DpnfrhZxxRE_tw9m~Oa#F!D=a=fYlnIn9GQaG@i1p9S|< z0OEgWgJh-mu-4o>Ns^t0?bxf{;ddlr79_?RXNUQS{k=rB%VqaP-JES7SU0->ykJHs6<2pTB(2YyGE}>wkV3H8F8}Yr?2|VflJ(PQ5-&vO(k~ zt$P-hSh4qoY{(+9QFwyT?Gi`6EZ*NekTE0QhavmgWx}gFuI4uqX$4E7z-7-}m*r~b zo76ma`TO}Dz{(=Dt;Dc_`gUC8L@&-syfTAmTJc9n1TepzQk^)C3?00L&_}MvY!*;C zClTTfX9IvW5^W6MbTp0yP?kZ^hZ13hdA?~id|gZP6G(23F^A@q`O@HLw-szhB`d+cIhNuYnQKXsrv`X%gSTD3ax4llXHF##_r`&q+N09>K$LWR{ zPZd57ZtSgwf*KNvfmLp%sx)lo+X+V@aod_x-zq_mk>j`~230bC{T^S)!^qBA=xT|l z;UbnG_w>Z#5qy@>$mTqE&w{azE7P;6uONVZo2gJp!qagky~rvKCJ9!VAURjQ`p6Aq zi*Iiazuippg5|l#y6sz|cWh{sd5E8YXZ*)YGj-_bsScmVFx7zMpV-9p;<^^-rB`3bArj0`rWC^ zHSWVtso$Moan)rxPRADfoTn-J+k&a3B|^YJjU=cDCt3+XgGW;K-fCt^4YQX#1C_t- zoDhTOsXLgeF+HqzF8+jNZ$_{;PyoWdDiFH6Waz-S9u3`Z?n}WJl*>iyi{&l3Qk+9q zH>o_+&^9`6DVQ=@|1wL-_eM&o>PbBvxj!B+4{rJ!F3X0CxQCQT6a-=g2gQw3HOZWX zk@^;ZZMaZ~QUpx^4iPA8fM2nnsa@0=P z(hE$+w=B|ScS5<9<8PW`DB}>$x*qO9US#Vjk;}b>hzz%HC%Rw~`3N;0WZO0PPh=CR z2t|HT$2bVzCp$u31C+1bZ!yloswLEz&!DqODm+jt)EFV4kh&PtfUWI^wm6|Tz}9B_ z+hg9dr7~xQ_Qlk#if!6gA=FdPxgZ)irEe2(Ku1uV6HSHe@{QOblolvtA+b1*>nvGT zT6*)&9U068f!<7#+_=j4Wk|vmp_FijAp91ahIgHV=zv;*9s2=XZ8f!aW-F_hvp-i- z*mL`YQJtRU2sNu*)N(o#Z?3vW&r379+yJd_9Q&AEc6W7keZt{;2Ubx)3AfO({HrLy z=Ach$LLdxDjs#^EkBcwKTXmc&6X&{s2fKn`#I6?^3rgwVv#?tR=@vB*N)R6mRDs1U zE$YKYu`kiEf%1l_OP&;D(~<>;-!u)-$&%*~WycWWX;Rfi5^yJZjp~nLM;1KQWP%_r zAR@m97|cnhD1tkej&yNlse>~+e0zdkzWjuVD1M|{l}PD{AP7(^BLoUpgcNcODOz?{ z$oSz}$zEcwe0xm6cUb3Cp}fwW7d!~7g|LOA%uT8X<)1_V;)Ud-yBLxLc@;2g<_S5; zP~wxrRken`iin9Fm!~#k?%&u216-0C2dL`Tk7OAoTMa4f?JQz0{uKAwdh6}>YxPv6aJfA6k-I0!i?MjYJVIfc)h~HUgcW+D<;QZLHthS%h(%4jHpBe1{tBcP>_`@ z{*DTKceu&fiI7PlAa9Nz##XXu8dW-ODTe160pH0$fkD&=d8-7b2T|XcTD^s2*P|+t z8bptjEjDi zi*0G%`sKaZp?59%M&ZMLz$=cY9UrlHHJ? zki5fS@{H8O_PT=bMcP|7vqR5vvzt|;*xb08{i|(#_T)O8P1E|-HPx7PQEVVCV1QIH zHX)&pl68!pL^(yCa=c3fyBQWJ*@(A`n4j>+uOrJMU~gr^w1a1<0kup-2fnRDXm}ve z=iH~X<<^ny!_i)qzil);FN)aC(GME8y%6z%@U-hj%ArX5$M9oW_c>g>oo=>VstLM5 zB2^tDuY}jY4&`LE((;a@%*_5HXCDl-CKg^5wX@Hs$gvj=d=Y+O+OEAYlTN1c!;FY} zYi$s%j?vX5v&4kH|henR+8WqKd>*|8Iwn zt}b~k0>B3)1M(sp>XCSRTJOtlP~=d@zd|Rt`(i-Tq7vE;FNMSn&kfVGU@#yM3e-fz zg^68LO*lytbUm1eDg|P{|22H&Q>y79q$7kVifBaeHpZDBVU%2VaQh}0aPB~z2CFGj zH8OBGN?f==3~1E!hqi*(A&X*wT;hd)wm^GatOiLJgh0Z}Qa5J6IBf|%Fc}qr^%C<- zpf~fAUKSI-U&r`Ur#?MTxMx3cJ&kS`+Zi!muRNbj<4>E9gcmvGZIxk>y3vP^zdiid zWa}~ZoVyhzt!MA^j)_@$aYR1WXqXp0)ilmYm-6Glm%k2fLAN)T_|fa|pLvscw@UHt zp~-a(*XMh`V!7q?)RMY8iK)$u){Z{FA1unDsjK`*>nVDQEo9xcXw(S_bVLV_P zIT?6e^X$D-iNW_zsC0xC?r;~i^1HG@?BcuwZ0g4gyHgEIAPuA{1tyk@h-V3?0FuTQBroz<$T4Ukw(W(`O_;5`- zbT6UabYbFUxuUHFg8~~mLQ0qR8JG^%YB4eM%#>Z-mhsrAt}DhL*{^Zz{3r%LOqw)S z2ZNaC5|4UE2~_tS8xgSo8Pd7!Acehpu*k~egwO6w4NvDpUdrClO0Q~s{6=mtsLV7X zjCaPeW2ws)Un6a|{I%_F%Q9sO79z1SP47Kzuv%QdCu;vlQG$t%qUp!`+NwhC(6uWi ztC4UpjE`hVE;@bQ1M%C^*&Wq5Xvh|LlG91BUDRSVl6~kNzfjM2u=<8D4sHMi08W_T zCqnu_26*h_B7BU{>w^a401be;9qt(c=o|v+Vhl-;`KLFUAPwRr&~0o(BN>C3rW2r7 zCUKrPmD%Yoi%{Ynz|ThW2{{!zVB#qX-CRbMM*fE#@>m}Wjf0bZm`KtBYeN$B0O4{)ap$e;jk#;RP@calEXSZHsH{u;&Fw$B1S z?L?c$!}Tz&Y`<{Lg3(9Yw@Fw)?e>>&(S?Cu$E+9^MTkVVmuP{eT zSBMN=NmhGzcjR)XSUU=9ZpH86&Zkv@_kkVV>Ut7vnn%5Vpso3h;K@gy5Z|4OW98PZR+`qwdwzH8XjqUH<=uC=i=SCTr5zir03qoE<#{&RV0jgx*=I3R4 z2ci@Rr^tQ}5^aP=ta`<6C*$)gP-{^@61{lu_;VSB!3#JjT>M3}k){gs=`Em&`H&R= z#dhYn@`fEdmNGX@l30l!1C{j^Ax~utY<-xRFbw|BOO*Qj$E715_iD$q zCD>=Rm3*$?%}RPQalJr}Px?H|vx_nO)rIeq)qV(FQRP?K+OQ#5S?&Nevq(c;0FLRew9PSQ+L&9@}AH%x=6H<$Vz z+` zNrj8cDU?UVO}yvVPO~d2U*384s-ajU->bYknl3Vd_wGkp**(FNmwcm@b$)^)km`E) z+xg2D7HcBfKg@oK4HSHT;=mK#5R#$)>#0aYV@RHB~a z977KWiz3*s|2g~V(dJ`mny)P)jPWLXn4C00&(e4N-3e}16VV2(^%ok_x+S(WfyjSI zC|9B@A#v~pwh7l+cqBD>L6#E!4C;Vth+trnAsw&?<*=PmSk?56JZSM?`jG%gl#431 zdFPRvWF)mRip3mu3D*nn@Kq!O#~xv)mD^wsB^;@an0}Qrdi>casTc!b2csiqWS|0< z@%ax67g@>TCT?q1Py^D}?6xUy3hY13l+ce!2xHIbhaDmbaR*+Y10qbVtDmoV*lEXql_Y9?%Bc_X2~-C-}B1|(dt(0y@ z?-R{XvHzz9sL6c6=a~0!T+A@&e*D@;H#Rea_}3;6zV3V=RjQQg!8Ts^;d9A&_e6Ez zN{r;gR_WQ-k$hGOoD{T{^aH=Un*ONT;jeu-AvL}t_z%6EXM6Q}DshQ)C&4%ykoqgdC zgOxI3kLgzYaU2zUSU7cRq-BD8Qt;dFWm+2#AD%+9#MiHpK~!1uP0ZZ!^!T;);U7lX z_~$l_{j_OX%nh{_+#Yl>fOz2XFu|E8|rH0 zJ)q_0K4Vp|=B3};kv7hhba;clWwYbdQM#d?fSpq>H>aykNts93WLpNWkNEYy!b>M; z(}tV3ZYfMW8T{|Rq)*+1s=AsQc>rS85ujP8iZbrO$ zc%uk_f&B}&iGeWn+Ld7qi2!Ul_}h($A4Kkv1aK1F)YzzkkGM-OBx=g-_yr~ROk~P;BZ%f)T*D;xhOpC>u@eCiS;`2h zCs_)Y(CdEhR$KA&#^Gn`N^HSz`-KMwe;iq$adTXD9%FE*oAWq*X^YQ5*L+c?Lm!(} zQMY0>?@H@*)I$NGK}8BCXG`9RP_cXT^Jm-)R%)M41ff>2IPUoS(q5HzfZnk}IxC0f zacE0#$EVyEyM)EUD4%FWgbDDQZ*X2W^7~5CqCE2(s}{kgPaJhGk=~}8UDwVL2-*uc~!Bu zr}vz-x33kqYoL8+oQDTe{EyYa{t;c6&_i9YOP^(#Z>GT=lk7%e&;RE zO0~?VJxC0?(aKPTOOw>{L)0?rBVCx8x%Tb{?LS4Q1c$PP<{TDJhgwe1{I*iGxzC=! zf|uU5r3h?^n#U0x>LQ@WzOP=@jJH!p{Wvb^024O?9$zk7Co z^Qbo~Gkt*Yn?W6}(wiqw8g*5Ngs)|xyVQ~nogNmkv;W-`eO`3EHeKCNhR&daC`JUH zd=Xc?x{K!1zmQ{;Wze41=ESl#UYB{Z;gHzkJ+YU~)+Y6zfwZy2opcVb>(kcqo- ze%6EUeot|qkJNt#W87`O=esbzkB;5H^RslrHZLkG>z0J~W{*qiw4*1U?6OY#1;3nl zxa}){94+5(Z5bFiB;{lCqOVWw5Wjt3LQ(4GOi#wBJF@^B9jo6m1kbe37nw{>-r2Nc zkwG<)>v*4Kbo|iysA%&o%1VF31Ik94oxdla+?S)Uay`7|^5R^c&cRdns8X--7nd;I zU2j^w|3!$a6>MhF}X%jm+MSv{dVKQaP@45Agd8Js*-0s{gh!SE3* znmF7cBBt!PipF5KPrRa&ozR`Y_n6LZ^phy;z5~fO>XCW9)i5VG(Da4~Q?%nJ)5i9Ta>3 zyk$ju?WOj*h#|VkBi`O~&mAp~ifTIqb;pUZEss(z=ZRO>Giq*|<-0Rl8ym&8Z~6N? z-%M)Vo1#_jKSjEgC-rFGZHFdj!%6qk&$q^9|6o_(Tes8hU?PB#t471}pSP&?RxBl4uQN{@ye+Of(l! zb^=R*RU9xEs1TN7^MUP}Wi0)(^9i6x5u#HC#c#5Cz^Mt~|0J}6R3XCY4h!_?Jn&66 zel zg+a5lfu0=Nk2PB@MfTjaq^O@OC|0c5n=SYZpt-<@+Fuz>V~ZAe%>{ki^(Rb1xkm4; zOX?^+ZP|%0T9?#47PzF*{5Nf=@$@AR&VuIE9iO;lALu_iRvtVbO;7Pk;}0#~OZUgZ zs0n*IM@zo#^HSHX9})a8@bLF$^V+P5#TT~jyF}fj=MBvmQh=v0ygpJs)4wyzXRM5DGO1K3t>9Y1=+5Z7DSa~AF3iJ{3*1lExndVl#+E!AqG;BB7EidJ>64szw zG;qys{e!ex$%{I-Dr%XJ2-&$R(1i_-$EhS6HRLPD{FXlZU?<}ry^ZZU#!*Wer#t_~ zxBaZHZeLq$ot{`q+rNLndbQAc#G&@$jrhmatk(37h1U;b&eqJa;-XLw3Zg)I%~{KE z*Bv)Fs{5GG)~WB4so8MK56H_vkT)(ou-{v*D~x*J9m7^ z%L&TPraAQD;EO{a`^EUDRv1wVMq6!&RD9xfBviX5$L4IN zL@E>Ya}q}vU3Tk3aI+8ZPzk)=5dLIBg-edrEwH+gBNbFEiHb%=R3&gEMf^<6ohod{ zGgiKws$LBdC`rmClsU<)fIb)N4#n0YTq^JU_>U3fg)DUN0UKDa+rj(&fcT;zAw9~u zdz-Qp5%nMu0Hi8jW&;T1U{S)B2Y3BBx1%NRpjh^T0)*&x65_TnN~VzjKq!BvkO(qR zWFq*w*_b#1v3(sx_Pe(IDM9)_PYGqn1r{`h|JLCwY;Ac{-uyYSm2Zx7Z=Lq1;#7;m zi1k+t46Fwv3;y)7oZx8vPvqtaxxDSY4yIN6=Ie&7t`@((9a%B5AnHFmn?)NLvZ%}# zv@2c7C`h!Mcjm#cLQv(2V&3S|1>-+Iw}oh`b^T#D?5^>_|L1-CdW~!KL)nALH&uOA zi&6)d%L~34w{D#AwC+?aje7p6?I+b;X*Us{@GDkU5-rZJuG_|`q{w*W`7UXAHLP4J z2s&5#G2*}L0wqLk|7GaWW@FAPwRM0rqx&|UL4LF zY)$`fK2IU?Iac&gRlJ$Arca+tpO0LmJ1Zixi6Y#wJ$>@-#I{eZX1qS_-)rQxHqlZl zuZq59ch8)%KUFrO=78U2!iS+0pKz}&;L5oy`wB*FyF#tPCH1#P9-ygMSXgO(zgjC) zH~;Tn zejtjBFJHQH2P5J3Qy)e?nw_4WUbIT`$+M2rgWpPWhRii5v;v0guvF9n2wOSX@&aKF zR1hQ+y}@X@Q!|7G-v}LLpf`eAHp^!&oP<;bFk=JUIxq&LgNCX)gY~@-d4f$LJLVC7 z4WOt3((41Dp>A_JZs`ZEj!?ok=G*<5FP@VSp##`Y0s`T8?SCBLgLmd7@F=7mNx}jG zNRz&JZ|~m%?Ei^s)kk%ki=!|ms-TyMv)rPj~dtBM-y$+>cU;ldkval)Os1a#@Q+BZ&MY`@w-LpBwI^%lQB3U}<;pNBewqx+)QF{!3NMErc|vCQw08r0 znY7C2N}&X?Dp~esu1!&)a?CuWbIP+fTY0ansh!MJ%oHZ+augd>cd*SN6wbxxphrTc zCPX;>=MbTWxt{D*1UapOy0mQhHyFB?kHwb;FJK~5qoL@{E&3y$wF!IR`y}K~G|*D< z-)gR^TEEMZmRqaPRefn_y>IvjKL(C+PH(fd>+``sPY-{NLFJC={IqL^`VhPl1T(3T zA7h>`047f1wlm6M=&nnybkg_3C{y&pmUQ+#7K?OE#f&2krB9s`r$w|Y5|A-=Xq5BU zegXe!wVQhLNmX1|TB8DtM$rRV10(rn`lkHPgyXRjB4JWHw9N9j#AIx2HcfrsXOcR2 zBYtL=Z3=B~C*7B%2AxctNvrdfM+*NguUU03zP~8+prP{FJ;u^rO%09RNVFnxADD9> zN{E3FONk_NA}bC{e~-Wdg_tQq`&&7I-ygOyaxxWS2r`&LZs$fwvq%pFLH8qQaf#k4 zB0?)!f49CrbXUm7i%(31SYgYp9z3Iupq+r;j+nqvUX>r{>*@XXKOKfV;1e`PM-W-~ zVJU{a2<;8_!EfxNo*sDn1~SPIxI>AE7jY(W=xgpHbc3YSKuyp!GLm9`Wa_|~|0GjC zu~Z~#YKaRDaM+4PNjHI8uyEnLXLwf2W>ccWj@M49XL!D@x_>`g!`OdqJwQ!hX0@qd z>mS`w?2vhSwpKEx?pse=dEU#q_)(<|Xa3{J=;b_9cxc{nE5(bzV~^=I77JVJuTs?O z8>md=x?R;v?(E^7H9 zi%>-5F4kJRp7(4L%%*EaSE|d=@b0!=ZDjr+YQC_YE9~rvIWzI!g7(uzzUE_%o~gff zp6V`IJ5rICycs`ScYHa}`n{rpLN^8kqehmL-fr&*#qqw>h7gmrt^O9K-ZK@`m#yiG ztY`QgQ`@(`Y=1gdIX`wi``-3XkuQ6#>Bav+7D4=};bJChnHMNI4nI%c^5KSRE4z)2 zYQBOfd(q(47$?Er@|`ya)8g{QO;|5<*jbsRN()*I@y$;dPEN}?Q2tys;X8ENxaE=F zl+$s7KsP!jVHwNfz3m6LSnsOcZBto$l@WEJm&D=))53*0>nh;t&Apn z%RWQXGB;Qm`=D+oD>^D#bB$68wlY%jKq3uIRu2;0@$>H>OCEwPMgf5k^;G&u>JwF< zIvJ2`lmC`jN;OWzn_5rsa*qj?ufz-EUwtvl z{u$-o`0=@;!~29|tTC7CD4f@!wm0ND4(vD2eSBB0>`h>@#+j7UhE>gnDdNl72F7*T ze{BOIV0x#Hmo)oJ3;i#91+2bxhwibb4?lR6`531^zi4mF;PlOkvge~K3~gzAR!XM+ z%gLN{1}MX_;^XB zMdM?X-C)d-pSHvItSvdf{A4eR(^1k}=C3c{&(ygq_$w&L?}!e^f9lpLCu~D)T zW)0*+`hi3_PIvJ@E>dSHj*C$r<3Mf$(PQHD#O@DoXXnqV44inCq@^p`T%w=tW(xip znK|8X*L2Qy){C|`GN=6q?~3(UbJ|<&EN2X>y&VPlE*8PuI=ZF5qWu4UTJnjxV1xLC zV!&(S?^eFuDeCGSyO?ckot|Zx*{L{ae#9=!jEybPKs?bA#AUPbs>a`A*%2wH?aLpY zSbQu>feAbg$XQ4Dq-fJ?o_?U?PU;WHH=ijVX&;_4-Td3Ox&M3T*-XQS>cu*3*&8h; zM5RWX4+GYsPgR%xkd_MPmcf+YV+6wal*zT2%naP;E-m#7Fn6QpvHS#p{8&+%;kO~4 zMcay71~tnOA6y+v(zyvN{T5>4XdJPAZ}+6Bo*g zsnb=hBRj|54q7hp&daZp+UZCsEPQzHKL0!4CL8>vvait@)|K_G+V}r18lD_Io!=%p zvf5IV&Zb#+Z0&B@D{D^8TpQug&}$e~FqlLJ1T+?W|8w$866f((=eOM2jvkFHOh;c& z*2khHsw%OFy@Ac+H=*ey$;iOwswF0&bi}*fxLCh2P-+T6jRpvDfhg`I7Q&Go8CZTG zJNl|bpr1NcJLl2)ZWf6xs)qb!&w?mqvDFl61rm>iZC`OJm2W&H0?6Lt!o`8Z#C3^U zObjRJehm?IBOp|@`9%){OhrgBc?!T+be3wS=N2^9%ix#gLr$Jom)q+Ca=9GB!0P_0 zmta>-WXOB}MR*q2R&emNJD_Gp$dMoVR7$ zPYD_yAwIk8!{EF6s#cXa)UyZc-*)CinY-2G%@e}Pcf`_6&!Qy*7qvFEpmnA7MjG9= z4M&a5wls&^-~=lyr5C9juN&|KbpCBYl0!ZDxqbUJqZ6E6s}i>3+C`NeJOir5KRqEe z^4QW*dG~xL;JW!AH5r=~GSMZr6*&0U*v=<+Yeg;i?-^aWEtdR!?`RHt-DewN`@t`{Ta^LawA}L2E$=Y;ZxX5!?UaD^`<3qUwTaMP@M_qQq|q!^_kFxQ z{{;XZ^nfe%4jkE3>A}LLE9NZSobOGizuz<;KKSRx!oi@{-lm@oPvvaAO)Z)&{B&;% zX4&oA|DML$q{UHrW#qzoGfp`_p3+AAeLq^32Uorhi}UZEZmx^JQBd4Ia@ONUk=K9X zXZQWBKD5(ejq`fvS`g=wLVZufs(^TXa*s(x^+dLEt~S@4!|Z99hO3wGM^{tvSR3{@FJ$pELrzOdnW1V&ZM(%%r`y8s@UkNUR#Z=B z26=QJq{VVeMWd;ImP9MM}b1mSG~P^{U4d7TyEyT@zUV;{(ipZ-(Q`7pbj$#-DzTJy=XX9rV~y|#+mK7IC#<#*1v z(x%TYw2==hW)FW@=t;Rqpo&o|f#Sn+yWid8*f|&YqhRoWYT}B7iYaNy;`C?A@%{w2 znmGZmyO5yLP#B?@{5EIJ=*?SieS=Ja{~DAuofx-TnHtvm-GqAO2F2S^-r`{6XhW?8h3YoA8yr!oo>xl!NX` znVST7LWkxJYpN3V`d}fzSD-sy?`(2T-WQ74iFXGRMkRI_272paU*XcjkLJTAP-XYe zvQcqCp@w+TAm8Q;xjG1{$RZ))2Sn~Xehq&@pOn1P(~AFpS^$@ANI(uTkLBH)ms3o? zw}G=hX8ev`eB0Ni*~`I^PeU&jUtMXs`xqFBO7A|19yFnD?NsQO(xA5BK9k&cqd;jX z=!~(N`6u6<0i&@DvMWYAful?GxzS&RmpM5Ug6!_ryM)Dr|d2=t8rz*FoBZ>CIdF! zV5rc8f0?LhclrbZJ*gx4+mM`oM!DR30uAXn|y8Fh>;G5Y&q`cMEIYIt|wzh9)CX)BD7)v!Vi z@|j0z`X}Z&)t(&U+i~t#`;q6K-P}gZyst+BleH2*7W~(~e*)eM0=ld0Vx)?PaR_cvvfzh&25{U3-R^>ZxvQLGC9zeMf!0=8YzzHdhNDwcF9{~P~9`J*D$R1UDoAimp zy(B3lG_)aJW*_vxf!?=OOx5dQ+Ex?r*j=uRQ3dVGF8B!(;sRul0(Kh~G9Zm=RJ&fd zGkCu`=CZNzMJ&ZsaSumyec2TVc5bQT#hUxAKbnXO>xd?Dh?ju^&@e z+v$Zut7-Xf8@w)WAB!5l6d}aNX4L=ww(!+eHBHBwHs2CJHcd9;xq}NB)Bb5Tu$mV< zihxki=xrN`fHP>u$WnI_xsNp6eL%Rd;Q$KpXB22Ti3e23mEAyao9zCpY$XVBBfH9= z+Z)EFWf;a1VTUL)y{9aO;It~cZH$s0r#)8l&}t$kZ40mxI33aezsdgu_d}u(U~@1; z9fDKz1uiM1w+WL<)FBAes1RYBB1)3EVi!&S&zXJy-?iSg-nHI)t>;|_9grF|=+pxgn-8iB1!j=J6UD1{MB*H*9n-^@*GPCnSuDt-rlp{JVa}F|n)v zTJ^TwzpZVGc=qnz-YPP*-?!Atd)Ag)AfWTk8QD*G6fod+!lR-~Z6oh&G~Li@y=Gf_ z6NewFHIuIIIZ5(_JR0!RD`@w$HSs0&!YtFUA-7^{N91EseZ@n_Ol$hK75LqpT2nG> z`iAON06n)Umj!gH$4cet(>fK=W0D860`1c^d&m_m1jMI=4L+7&pvBVY?^fv?V7!ub zvrN?j=c(pRT=rW=SBSwZdlY+RM^-DSxgF4}G20SFd*&V#&qN5#%ds@$ow&KRwVQ{& zHxsqKKOlFQ@OuRe|Y;uXQ36S9gh#%Ixu z2?0qI(2%89nQLjcLl)zqiVJPla=%$|J=0aJ$cwg&^y!+QgXoHe0j(#TvWcCnvO@al|U2r11TFGoWCFO{3d}_Z1Ul zkpO3R^w+D=DwBzPlaD(Epm24`<6CF`A^7Dfsv{U%(?1toL{N|P(Cgm<-cjgf-S|bL z+BNj6ywkdO@`nV6nYMFP|4IB3X5B3yp(6>)01QT*~oJS8R_u+U!64 z8<@*|!|C;3^Lpv)s!UOUL$@KV#k-LO3c-64Qgf&J&o?=LD4}tL&ax$%n{|$2U?2&K zQdA}jgd((+<5(9p4>OOQ#nvR)mJ|XsmF1z9|x4ugEVYVc&NahUPvbF#@!Jn zE7mSM5os2}vj{3*;YB#$xnLUe5EbY|ca@M`WeP0t`f5k;-xN*O^mNTbK0({&|GlB~{ZZAc!0K$vgWpE%&6;>ZPd%&q z{Qh%(S=*jFb0%tq+soXMPEI}gEkEVnT*-0vDuvYw+lShVk+TlkLb7*wZsA1X3H}$h zSP%KVP-JFbdsi-o@DnQ|nO?#U20U-;Zud$E!qx}ONvsv{`y=|#Z!NZGsJ8G+1AJMB z=S04rLcttrSDW$zQV{5XY-U~eo^11vk&c7&Dy@V zgX)u0hctRSq)jazOgIayqkyaXP~2ddXHI<J|W6(QLID@oO_;Q&e|qgs5>0!YsNS(H_f?xX~y|CGMZ&z(D2X z+3gpXL^&N5Z3-Mttc*@KwHrfLy?b!@KH86{Ckw}e%-*o7ptFCDkI9ye2N5`QT@7G@vrQqJz@&JyexQ&X8(>jsY=Hk{jn=lTxoxRAVVW1_@- z6;6nrx=Dl&*p|pbi-(ff{LCr>Nc;=Vs^*wh@uR1yKXx1)+2r?MOSH6huIbm_AUprt zGu@O&Szq1bPc-mchbag=JC1qu< zSYuHwy|4MTMYD49suqfqQx66iIz2btqPx&=WrHw%BW66)faqj-S?F$X>sf=35GY@C z8d$)SO;LqBDI3tPd>j=F4qy=JDy@&fmO{JF_8a)hI z4h7&jNj#M7mJtuzYTVyDU>lgQ(}}4GEdK}ogXXPRh@rD63$JkKTSE%CcI{fu!!bkN z6cpSJY~L?*hfCiTOYGtBjs+|XT`y^e0)zprq@BT(GF(Mh*bA2q#BHAc@KAKe0rSk= zHu`tlQRy?=rGN>}9cKV%qX5c)P4%AUL2K&Jh{4Od zGG;g|JK5>2%)0CA9~;v=b<8hWLeR2|xJkA2fok3VAk%py8aP~+@PFgki^l_s9lQ{0 z=9!BpS0*hjZ;)TGGX^gF7-ZR*9s z)qT!hxR6frryS|aeaX#FX1&g3zVpt?dPAm7Il8e%>qEh7D;n#Qv#0<59HS?n$La`iy=JwWBxc9XjGauR-k1Hwxoo$1Qmiti9yU zD$PeTb|u*DO*?04JLU1f0ryVjuJj+Hf7aoFgW0G?gU;p-vb9xtKF525&tbO7uHC!qp`gRQy+^uUxF7R74$ zt@^1cD(y$|and+)x$L;HjD{_I1m24ekL}s-ZW(IuN2{9XTepzWx?e`=TOnF<9)xC% zy0SeKY^@?-2RWZCWHHBV^Ll;xH1h3)fkUje24E|d#u2(iU5fIVd3qmDQYMSE7Qbw_ z-axB(2LiRRu4>x}CFn#N<5_{_prg?a?YXNR=Js!SIQU-B)VB)0KKkwY4)pM_dzu#5 zyZ_-91I_w>`ktLpmepUatSk$U1;Rrt_Pe*x;iuZ6iS1TsQgVT9Q{jAJF{;7&ZnGNm zQ!&*-ElMoJv#Lv2T4j~@F+_k|4T~l&FW{0-cj{|tVV?JTxNKIAzRR%^-Xs&?_b5ovx8*NwTjCo(?CXgZo%+oB zi)s-WKRtQvqqQ`gtZzhm@v`smDa7=62(Am{O=-TQK8&z;7(i|LPBcj12szBsavrgt zNP*rVLa|dB^F@TBG=!$XGjy;B{@o!NxnNa9)Bf(rsEEN_)q3I)^7`79AUf`C1Pm|*FE!RU^|t#JUvJ`~dD~hP=e}v&dzY2V zbNhY`)vQ`2B-%|Vtv>17-sX|=phdR(p4pfjoROBLa&QI{ad2OPb(IALxt5le+5HIp zn)7Iv!JgWLKu?a{X8+5~ikT*)qSOJ!FW$IwKeUZIcI@~(5<2n(2Zt1HNMjMqUkL(ySbm$`#S%}OTSy=^acd{LL3Mz9w1Wg|-IQLiMpixJku#bG}ZZpN_hiTn6C9YIqm{q^I@CC7&=BP*O@0*7% z>cakeOApx2H&h$!T{Re($Q4x#kuIjNE-fqj^}Tvoa?R2%_7Nwd9dr%V%me&BD)dM- znY}kcIeG9;Bv1{UfYzRQ_FN%j151Z{a+MjfOZ(QH}Nz~c#~MuVP>Z96yPwxVikl5M>4eDfPc+fN^E_;cBj^AE$4 zYjixl+bd02>wRwC!;Lm0s~refGfL@CHz|#HLl?E8txd@VhMEm~g!J>Rhzke^fV-ni zDif{zXD2P$vj4=)>YUe7SM888zn)rDc=GHSo<;>pxt6jt20l#y6Gpa3{`{R2 zIh#w&V@=LT7!bcC%zDgSg@B!1XQ@Ud>FK?2}5X`RpU zr+ghl}=GRzDu#U$h&wRxxfMlqJ2n{nxJwgiEFm7poV_fJ5$`TpF;$%0h4qGe?ng znunGfZnu2&&CPl>oa5#;p6sJL>f}?*C;vuxo{pHSzH{&1OpbJYj2v3o4F9QuUpjhH z^?N*;gd+l5qc8@)T!7$hz@w4h%9dfTIBw~oGkHgMjZE9+u%f=WAE z++3e(5H=+K*l5S*kIxyNF08Nhg?|;lL~;CP!g`m!aL9^xO*}n&)GpaKV4)u^jVw<| zEqL)Fugc+Vn?6wEOc7f!I&k9iit;g<=+;3>E2AF@x0-YA>{+jya}!$ZeQ{`hGr!#6 z*3oZ`)SB)3GQn+GcDAisqXqkd{S$PD-0!;C&`Lrzw5@1*W9f@Yb(tBD$AtAm2%53k zEu`(Vd-tA$+kyQkmFP~n>Rr2pDCq@l+}MDuz=G%1(Jn5s(=K^}yUvDs6Le7xKArYe zF3dc2Zig$b7&4}1`la!GdRSQg zNE-J+L+^lIy-<~sA3h4p^b<$leSa-w%Z+TM?H&5i+=E4WmS*$}Yd+=vyI(&)R6j5K z)O0~v_jAh+W3F)j)+}_A>d{|l7MirdU2+XT=vIIKU8PYKQ-B3P0PR2mM~l>?$cod_ zT)c8+;s@8PcP5&;8e9Yt2G#5+=jVn)hU`I(Zsw9DJ9u}DB!94~PQKd}87V)69Gd=& z>-*8UiWWk0bR$evDFxBEUhd(Mo|bl`Q|qJVN1n`I&|teyesJIDw{1VHv=|X?H6}E} z)zQzqk>8b&7Dsohv~YBaZKu;X>;hL=9x`&W;;_SfKA*i>x4C<7OqujGC$@QQ`G(rK zNg2xK*8h6ZXH^FH2^f3mP(7wXtVw1zd&KGb?QwEl=6O3Sc6${ES@izhF?3Pn?3c5v zzV_-kId{U$6aN0a`m{FQI`RoxuJTeKw_-P~IdEWGGJC9RQ@beH@udPrNM@ug^a0+d z&|ExiUZVY~?$lV#@b(@d-rs`wQ%B(Z;?H2_40f5ZF-`4`a2fml0&X~A`TkWhY{ISh z{c+^cxt%PL<^T`$J3>Cns;a3}9cqJ@bs?gJpIO;7<~&I#SFH{Z{4IVTk)5<#7qH}6&kDilasv)^HvPz*%*^2VtMd(HmkrNx(rX*upcz&M zVnl|qsA^3GISQQLu>y#!^Y(QXgIJO{92xtWd)6qiq;l%|R9piK7&Kb`LQy?Gp_Q+FED>ZNKf5F1Qv&!j*UD=c&b`b~H z^}Lf{9@k;=--&5UHLQMAA4;G*Ok|r7NOdff7OrwcBBfhnO7J|;vWwXQ^x}#^xdJf!JC#P^og34hL8CNG% ze259Uxb~+mTct;+1`Tm8nff-wW`qlip(^d#l||N8ZDGNb8sM;df6ba;NSPGO)Y5D= zB)E49>4|M_MV{y{Ub-}dAsVV1(TWNU`DnN4Hy{h^s*jDR*ZlD?{{c3$w%5Nnu5m-iU(|A~qJ3MvSYzJ~+G#!=RJSKsTP%1x&g%2&ccc56F}gBevt}?%e5|)hXF zeS9=;oc%FjvSoKAMbq-v#TQ;S>-N1ea?9njDQ-VsW>0kUS80)DGktpJElL_%#7o2` zC>912z$jAb0I_oz#p6Jn?Oj6L!D!~>7zG}3(kt(G2`?-9d{JVi*uZEpo2K*Oy#B*V zQrb|MNq@=tL@_ZvIXc?HEios0QHz^x`};(_xlnxEFLzyLPLh?bM)`&rkzWRe6S2Tu zH=bNt9=uqwLuyV_&CRVB{BtY=vze@|t-67p&&7lj_e@(>lO5ur!0mwV$ZA6>w@r*& z(8&{g%zkIamLs2dxL)6HH3k4vV?04!Gme((dDFu`*ItXRthag1PB5gE;IVnu1G{fl z4vH8bs)WNG`oLoP(tmyqB2~s}z9NtYFH@>wT0zWQ3y`+Eh2CiKJmadxOzmk%jHpPY zvW}m2WgulcnMv7X~lLJ5)@2kz$a#+r?UB*64;MK?y!)lX99^c+DGy#_!H_ z=OrusUhaQC&_i3nd*2-==iN;bY@_N2nBPby;+eJBYriQy{_o*WYD<0$A#^w$?SZKb zGb0XVdb44H|KkF*AFx0L5=39bX8s_#PtC7{*dCm5Lnnx%xy;>Nf1h?Y%OH$WS>H=Z zNg4Ocw#o(rmu@|KHm3ZQw!0K#1_Eh&S~Jyk1|fU)=!8u3HMHluh~AyFK9VIE9ncbP zB`gOsj?CK#A68(4aWLb1|5E@W7T{V-$Woy0_LDJ{kTf z{bTORYn>H6%me&$b*jr=)&7&WGVe;8)4HFA8uo}cHz@a>;n<^1n!}U7KgK>vHy_!x z@_Qx#^;0@Qj9u`hmu8)QLKLnSzc@Sk=o7)*BmmP^=2u4G9x=qbYK`+lX(^b(aQUds zIF_grZ==WsTuxhOuNP)oJp0;}ms%$CHBX<_x0+u3*VB#bzQ*WQ&+Yc|@W}GY()X|O z8V<>Iac5#2TYpS5A1k3@jMIA4K=^Iv6ntFQM_~&+V zRJFlMMHC2pxjnfORb;0(vsH~9MtE##GVa#{cQz+Z;r%F1hrFGWMAC*&-GE)xVmRD( z4h~~*Ye1Co*C+N-Qbx{hU3eS(8hEk}`3+DGu&}Z!#FW&PGDrx2ptY?!bO?xzEu4|( z+@zaqS|QHKBQqbHpn?+oI4dj1x--hl|Ld>6pb^{Qu+e4Mu>HKE7Z;YYcwyHxA}V_R ze9g?GKQ4b#S+>Wk_sT66xo;bI<{mn=C}CTB-5)-$$FyydU=epu)#Xiv$Ivy=EZe#6 z7#{x2PJK$EtHpqi-#@gx>3DMb0dyRhOF#b)Lg0E)>*nb zI3Ap#((cTLj6oNJ)^%%hww?9O~Ox-+Y^I+t>}) z%VQGSP1~OL%0K>3{qSny3vm?(vlpo9>GX9ixZN}`cKTYwu&Qv*;N0$Fr>TMN9=bKO%|6j320AU$b8e@U&H95``R$1^u*$4~njD z-@c*+QFn>~w1MOrgSX8_$}cHs#?~$F7=JkEhV7@jlf4Ke3{e`kVKD9=82HY&-Sk78 zVWq3rEW_KRefU~(6a+(@h%$X2?p89uM+NEYD4`Nx@~ z7cK~!HqqyxezS|y*IqKK@BD7%cHzGkWlxTp><{k0k`$UdPp8!~Et zlviErpgN#WOz-!P4SIP`8@^`ap6cW^F1gz*YnM&;{W9)6GW3ky;j?iD#pDLD(QdlB z%>YWN8Nuls-!JkHEBUpmM`4q1ex^|YBU1uSUO#dqb(7Le2i0Da&&uQx;7&=CJxy8- znJv}LOFFq6rnNbJ=1fTI-4#=$wB=E^=N-`cPtYGbdUSnGs+8r8gkeS?##1Zvh?fkn zkGYrqm-;!ar_Y`1rB^In4J)%z$0ogF*0g(fJM@E5!fj5Zckccp?yg0^io}sqI!#pc zGp5Z-Yi@8g<^HrQL-t=j@XzsmVQv35H}IQPbG4rPw;v;G(!Ycr`u%Ebb;G6SbmlZR zsL8u>?Dy~CUPd1Jy(%KY!WHk0c3WLL)-DP=$1HZ}1U}KxX-c6=u(mz=L?mj#A4ubUky#=2Go^;@g*_n?BvC&FLoqkY5iNh>-t%hX_GEj>r^Zr z>fm&!=FH+A>=P_*wbBIS|)oG-iUz;vt5iriy4LZ$Ao13!0C zS68*}wmCj9u;$frc8x?_H}~Rlu#V_tyqZZ1cd>lV0%!{4C5dYyV{ylKqk`j`apHe5 z0@K#lPsyFy^7=@{DO09!cS?GSq4lkqhZwGGSYKeS%M?^t4I%{Ab*bH3eOp(XRi8b- zcMW@~5@OM6kVV$4ODem@_VH8+2|73|;Nqr(LqF(17Ha5Qu3x36-D}P0@g-UL2YrXW zNBJ(f(|{*-uKs&JM%bwjc=FJ;VGE}SyXGqw%rdjO8-J_e>h2d3vgx>F6xhhqqe3Qh zUUQQGO_^ce-9IEms+f{H;-uMMz1oRpzdn2r7?C+_qQjbxnHSE( zRaDq?HL`W|epOY~ygT|C!!_fHi5^QZ$PP8yVS8oodOL6we4T z6enI`d?v2tRH$*-Vj%vNgZ&ygvc|}#VoE@OBAx}tOt{6u2yw8ptBb$)yfDz#-br5} z;OnoI#i_OqYdfwlPFfyE{01Tvs#w-m6ECLsix} z_`JVxV?u(?ko_m>haLIx&Aakj?^l!azg*jL!aGI;1|ezf_MO{I24V1t%EMY1%(xzC z78AwDfl3lTcpq*LwRbG*QX8tr>)oXKM24}KUI$FMzSHB^3spTryx!q-G?t^0^u6-$ z$FYxU5^Gbx+paG@AN#}pyp?W)O$UR&Y_B=^GHgkZ_VuEg9xwMk-jr^4)N$C)+0E;P zo2EagDlr@OrQnu^as1aM6TU84Xa+^r~1pY~Ua^_zw^`q`v&pN+wb zty7ORKXv-FCc2gnW5%9g*OMYfD7Sm)Rsa#Ptao~-^A1%YJ4m6Up%4k14B0So4@BF++?f_Lvu=b>(YfAf-Z8X?Rd7)|Zo^P^$PZQJ?*WY)=yx5`&q z5E_2A!>ruKClnObd|*a3R8Rz=Ji}i#ZL7MVe+M@IN-%lA><<3BKOGUTRs%n28Yqt3 zUxNl+XqJry!rNazp%%$QTl?d~Xo_tA?c003>@)RA?(l{)%*^~km8>SQQ-~J)JC?uc zY7Ol%y>k4W(k1^}C3@x0agK*f;N+qFIop}b9h(~NryXRzD-!WvzAWxPGAKH_E4%Zn^HiQTFT&#a2E_?E()IDu=yVb=M^B^ZTbk$Y7TxKij=*_43r) zw+o_17LAN`I-2$Ga5iK9<{gw#8nQsw3AVK{iJJVmySSGC9C>+>61Bj*IKoO|QVTdE z0EZ#%wz%3K^SOw-b87j$rY-@qTSP9u zmw49v`Od3{S+GAoAZElzs&@x`o^Am*fxV9L6-`j+d_&Om?aY)wiZJPG_PjBTg}!9T z+;yC_b$IDplcaO!8kyh!t~a#z=8H4v$-}1SQZUWIS470O-QFHhR>GNa`mq@|4w86R zVx1#H_-YR~+-_I`#7b&EdzTC|!@n4MtX{3f%ox+_q^C`j*Fd#o2-g`qKET7ba14u1 zr+1!USS$Cr^o&V}GFGnTLK7nTZHoBC|RrrmQ@Nl%N z`kJWNtXVUmF^JI@8N3IVSn#*b>pu4ZU&W(bjdf|lshZV8LKw6hVLtS2p3~9KP0s>z%>W60c4=i#008Xew*gz!ZAfXK9D1}#N zQQvOs2F;;Er(}LIdqdsFmQ5si6q^XH#d|OZ&v@4o33*3>EwVtl$6V_3A}rk_d-7$r z@}0Z%(!D02EEX(%Ipb_3+$Na|3xlsDh<@RHmY}KqI718{FXk+_oXjYyK1;gh&r{Uk z|8gJtt^N$FQ9GKN3g^!-8n=U<@7v2xgHG=7ti>Pz?RkF4?1tH0T}s2PLr{P#Lm3JI zTXd#{m_9dheK)It03aT0n4jJU8J4MRhfo-8-I^csj^l?wd4!ed<>eJIa>EGMv|&{$XA|F};{njQg_-ep zdQhIlo$Ty5Vu>Ig412>>TYUNaIdsPqEj$R3FTf^~k%K_Ppa8Sx%rPT=W*+IV*3JrARBwOh9 zq3{RF{+Y70m9p|Eq8nqNfH^A0TT5~OnR-6^Iv*bZ*74H%f1?*%nKJ4}Sy>G00oW^z zZno99sv#ky*Ocs@y3@Ie)U#q|ObYJDDhCXIjf@fAI0^5?F5%HfD{UQFP` z;1iz@Jwv2#m;g{H=x#IJz7r=R;fcaKNPF}sgv>76Cb6!L+Q8;;91`3WOO!b+z_eYo zwEPHTCJ58t0okw5Wbg2@)-HFYn!zIdIcpV!MDz6e=9ycl#~i)hUQkZ^O8lVoZ>^yr zav09fA3S-Y3Lms<*RCI4oYUjSdR?(0bz(s>6Q<|qXQwxDMITVVN+AQFxdy>hPdu^0 zDx(umv547^{26XA!y1@K>i&7T7fX;E) z4L`aYQ7QjFz$?WTV~%z}3ub4O3ZOTFmPxzV8}#|sOvC@C=geByczQysTbr%?_SYC07i5EZ<6^h5u&C$^ zS(MUVeAI=$z;N=%x4hb2UtjJfsZM(S?Agu(2aeP9kLlqST6mkaL+MA`5(I>q>Z9XR2JIcV zI1>ySWpYItd|RW$i(^TQ6?9}`F2Tbopxi=n$%dep#!P}>3nOM&cQBpnRizdfzs`1O zGk$Za^#2$$vhYKHX!a3v3gH<85W=eH|5dwkY^bGR*htH?+j>h;U}Qr7E<{d2iA0;N5B_U7%|(L6KCDc*j@LSJ205Foa{$RS51eaejS zYSJU!hCqIYOR)?!2}8s0yGEwnj-P(bhzbTUo1-h3m26D2R6!K%1Fj3u8{=-Nxp__Z zkN+IcD$m=H&2N=90z6QW@@uT~{HRA50Zp92n>jgH8sA_~vb>T~BeF3ch#(>Za~-%Amaz z1+Yf$@6ryG8MCnz zS;mC1{j08LN^{^u*AYV%OLkJ?u@BT`;J|SDXJ%n)yP$1Tt^%tDK7*l?0DjK(o?w)@ zJ}D_F@m;04rnkYMLA%MPr%0DrpAPY=FoXspISn%tsh}y?z7GAmYu~;susWobgn2}v z^~a!a761p3rmBaB#~%F!-FfM$Y(R=GASYuE#Yr8nagtUX^*dQrw5z~jF}*MRRRn+0 z$@h14_s4lQ0~DJ!?Q=Q7kCSon8sz|1y&JZx%MiVL!v=k^4WK!rwjD zdrJ$@2I`D{h)?W4aA5nt*Fqr)@v_Mjr{~=3KvGMOHrvb_n- z>@95}XKfTXzb-s2t$%uH-gP<+JMSCKOWHv{EbKm@&@%3kjDx5ZOu5y+Zq!zeOk=lz z5S{sRx!WB-Lq48U?&VdmHfb#~KRAu)j7=If*y$y&jDDr+>u&$U%&Yi%Qk;pTRU6fIz{oUT}}ik(>Qx#3fJBLv^tef#$1^wFJ4k0%sY?0aJnNrIjeZC{3` z0k0K&Mg0GStRJ)C__zFgV;Jn>h0QWwcMx|1h;*5m*ea{b(&! z94&A0yrBKJW_E!SDyJ7{RelUstI((UZ)OvDBs>!QE489@i^&V<^)OQ(%Rm)W=p7fW zT(x_*u3cdfGA0lQ^4M<8yU_#GEL#x|{JrAUmVsd0qP_qd@HwGE!@HY{~^$Czhoh>5rHz5l?6OUh}BSi~wgD-&;#ZaM^LQymkny zhfv=nhvY}GZ6+Aw&~I07^Q94E%*WO`H7{=lFo@a#ewz$;&CLTA)oKI-TjmGJH?y_f z$%)H_$dNz{CJYH&Y5swo{*D6|b)m=-uxEBg>yT&9k3F1+p=By;Gx>l}Fr|WFg#}I* zahzszr>=AUz_z+!0ZJn(gyu4R&D%yeqS%ZXvpMH!rChugo5z1UP9fDD8vy z?X#d$6Q|90cXqiK=QKiupz`ZVN-{~ClrdwcPVL03HcBe>;v8Q-yR6>grgiMW#O^ib z(7BK@*W?&6Cqe?htLf3PhuJVdh#I9EC9yZ<5>UG*zkWTvc%D-1pR5;dHIRBv1EStx z*e^oj0?o#dR@4w6@=q}84b!gENbmg&oBnhHorbSf!Gf4zPj-aY0V-m}NICFG7o9+h zB};nqy>7mGRek-_wt#@lb6)ds@#CEl`)I&7f=#Pc`(J&sVAb;x>G(>W!p&hsO@-j2 zCR|tO*|C6{W*Zs|B1wdFTjw8ZuT_0*XEq*|m}X{( zU6_&$0iRNdjJ0RHevV51Xqs|lp;UP#`Lrv-z>;Og`z`fSW=Ot=M^>z+brO+ZM$9&Z zPPOe-RbHeG-#UJd~7vU6|~SW>6EJot@tXEP3>Cr!%ZvhOAw>@c#{a zB=O&~EEELwi%J4gVU^3S)A4FFu2Kd8RPA9+wTy2P@wn_$W{_uQ4ZX^mC;n*w~-?%iW4=g|}hd_daHWJim*XlInk{-s;S%83q>Ilf}Ifv0xs zjvcY-QDC=9f**}J6<3zE^74}~h|e#2ZpNP;O4C0nlXXHPooZ6lEM zb4^oZ7`Ki3J0l~bj(#;MEC+!me&`LkQZ^lsgLy#6jCC!4>U86OT!8AurlzK1#vs%k zz~Egw(aqSJM3AIMS7jUx*>$0cTQm(^SeW9s>0*rw7sB&nLL8T-2a5ju%=2u`n)8&| zKi01I-K|s~027p@SN4cXeW`iylqmeYCdi)FOV-s`C*TYBB{YJ`ZU!zF(-AIT|9KBa z6-O91DGB1}+rj-b+tFz}d7J~_8M}X3uar%oG2g4p^Q4Xz%RBMT?RlzIz6aO4{$Wxf zfBw0{Ps&o)g$uK&7-cLOH2mL)S(kwSKbNbRQ56Re`s;|%Ix)H$W@ctme(^bo8=5tz z`Da*@Btr$=lNnPQLnd12-jjx1OF zAlDdvgk2#^^ru;2`Tg&gZDuhp6c$>ZX;-L#1Tumw1UVVd2LIxF02Q8eY3(6;gAR*d zs`=RC_EIa*7$Cp;78s{af3w{Mom;G>@;jiWVd7b`Q?M!lr8yv73r*^eVuOs@3pYm5 zP>}N~r-J6@`^}9ZeJ-y4(m@(h%GIE|Fsd`DgKa4GVMu}$wgHHO3%H%kPr}|XY4D_} zQvuW0N%?^`Lqql=<5-{@R(7`^gN}6Ks%Y~{1WaJjh~zld+PbA^U+^;fWR#ygl0uV5 zI~}g-PLRr^XxhH|^b4v==|YgpkX2dgG3jxENwx+AB&Vl0rtD6Q97NUKT}LP3*zAjd zj+B{bn8dND@khQf!0G6KfUC*w>Vud0FfM+GxOC--lUqwQWl4@|S{$AwngTAJ&($ci z%bC}oVz&SSAG2$jyYVyck6(D*mDI$m;+BQgC0p?x6LK+8P_)nKk+PPzv2)|ZNny*6 z6=U>dIZ7qp<7>E5;h2uK_wlu^fCTf4FEWHR0P(D200G4)r=M$MUPX3G90(k; zS=%PFR-w008i8D$PtE+>?y8}3{HX6OwAa}zP! zws@Qp_&F0t+3NS^iw zvm>+FiIZh|;iWPqwKM7f53nwfrl+3)^`fesp zge?QvtOWU>pD|&^K;y~RR?X7Yjil!WHL6{Z{Jg=*(r<9m2sSi3+ua{O7iPqjD^(e9i8>yS>5u|8@>C zZ-+Z2n?vqrE3y4`*3b+LW`Ltym@#j%H(@%KYe|oS?Bv!Pa$>I5)>L}c{3?<& zuzUJie^QsT`2^!C3&!cAGK|Me7&;-Y54P>Hc+S7x{?)!EnxQ)(3R0saI<)ry^CTpV zoj$R7)G0~cKcCJJbq4yiJp&eo=j`e{ndgMGe|Ks&PGu6!631G)X_^-|6v9{@^aBmk zRzH{Xi7!railabkRB>l}4g zbeRp~;8xE_uViK!f&Z58pjS4?PW4%RRQ(ILu5>)m1 zVVefF*Ve9r{EpwMS=^)3%nT_nlX=6m^s}(Z79EMYe7RdHeQJMCsP9Z@T==lV$Wel7 z7)vbt4=xbuBZ`}f8m%@4M`=M#_*bX4#gHLGWF|*dyNsC)BR5o!TG9IrdJ*zH^PP#y zu{s>r#;jzY0W>xCX$(;Z8S?3z;aXvUG9+T7Ac?uMy z{_ueZ11!*d&Uv2X#&n+RdW-g)7w4DLNADa1%TuoDEzz66bXfN0%*U=h%ot6RwFmzz z+k9MIU8M>mK_=>VQr)18_k2uDfkxXE9YeU2jQaJPn{FPD57}(mY;v0|XeMbl9lGKg zS*u(1QAJQgvN*{k&%?4eM2bI~&X91#vfKgs8sB6k01nkURnG4GD1YYFDloDDp&s7Y zuz_7c-Bgoq5Aeodv?2whbeW*o)J9xIs+>KdL38aIaTEYB2w=OEN>&O(QY&pT>z>4u zDN(7nDX(EY+~z3nU=+(d@O?(l$k}`h_{WeKFn~7TaV>kknC=uV>~1-72e9X$<9qYv z%lf>ZERWVxz1-!Wv@}05oy?VK1SYryO?k};km8+Lg)DypLCCJt`I99aFY~dC32GCl zA*!GdL6Lm`M*g4Yvu+^i7uZnF9=5HUxoo2Ud=cga;jL$*b0b|0)nv3I-sIrEmV5jA z^D9?=e={1epY~(Gi+s&HoVTn0J8y~a;VItE$qBB58ces2TqTR1Ejx_^!eZq4UTAzE zQXCG)4|^1S9hiJ`qa&^OwL6XQx@aDzG_vANLsnYmJl?k2H-3RQ z^log_d=0usbt1saGif1&o3ft=MZBm_F+%C&bNqNOFigOEvzC3s+py!!`<1~Bp_648 z`{Hpyfi$M{Q29Vc{5d6LT~O)OD>S*qqlL^EO|M+e4$NHII-$3ltvCCDiBvrXpfRid z{p>7UPO2{STjf$qSZm)tgM;_%`ud>)R{#Xw_~tDvl|PuCh(0lc4cfA$F=zKZk5?ib zNVr8p`ex`YQV#%l-ljfz2EB#1c^D9i(MoKG{_}2fU8M#mMv*g^0)H9%?=Q&AQm!-n zXRP)RJeVIc<3&0{S!4JjJa43jA5hIT8~T1vNQem)o3keclb;C5GLmf5rVU)FhE%{Z zJ7XTkGm609m5}VXV8cm6)SkbJl{42g*Q5HC@l;cTfW=Qws0#wYQX-u2)5aQCu7cac z>dpj4uXwvf1N-%vJdj~E6$N5PD2umsCvc=2_To(A#%ycbYt8#Tb9G-0oV>MG7D6dR z8F#m5{KGU%?CI>-#;EHm)Xa+5{3OdfWL1+-kK{)Y$E$#2?!{`+u%C}7n2)WRGP^XY z4wi%Ok<~#Rn8dbfUJZmFnXxb-jaIq1+0K02xGs>Y8Bnw&J;**458|C~jB?>kS_GJB z+UmCtBb&w4R#4)4G_)0@(4%+T|5}=R@fJASU8I z6S~8p_t&<8RGd_b^#!km$<9e`3?KqK7M}mDd-tr0AOBm`*D&G-fjsOF0xV-cY69M_>gd3sa!F>Ag>dGL9w#fQiGmhKuUmAw> z6AVq_dp8)uV&CE766LO6QjZl*LK{V@$yD;x!k zV2J8OEu18;8E4<0!FDq{QmpEYihCq^0E&*nruu*QAsD!(z*Ic$wD56Ai!o2aA|kf# z+xJrApR?M1etkc|K1VS6Jmfv>J7vD8dN68O!jq3l>$l4+nCB|3jKn#{Dx5rXU^)h4 zK;_0;D;Y+7hf5=KT*?WVUNO|PHwsr)jppiu_U=LtMv7?;mfQB&_#~Q8Y#Oe!^tKV{ zByJW1rmdizw7o58FjL^dF+!PW^!i5K^nk{uf%)$tJWZ#;+m)k}?5e`5ffO&TuRL!# zT*b`v&)X!uu#cFahQ)kc4rty+s&#ayKBq(m-<-sRF=b#sy z2C)RBr3Z`U71IQMrwv|F{d*NJQZ(bZu~Xp+(Z8UXh17m{ew5*4t|s5C_U+mpSz7=x z;c0e4h8jp$uc}1vKk%c7YTSkKSv|NPTj4f{b{=(q;xc1RXgeTQldi3;+x!KTl_H)f z7M%E!f#A8O}*vo44}R$d!)qh34979P%_wyjic?UwDfbX(qWbejt+COh=M zr!}-~r!&#k?JtJzf4n)uvu8sEBLhX-38RO5 zF5;OCK7Dc?Zl0%1#WmK`a|mVg;GskH)Z^~U0y?9Os)0I9z4Z(pdlVKH3cgKpgb#59 zg`t$;6jye(wm#^~ksa%(M&r&Uzj)Ds-im9BqA1(_GL#i@Iq;+m@B(yJGBsB3Xs1+E z{wfq?*Pl!Zwl;^HXrBK2B@|H_Y7(Us5U!-e z^0mOeRK1~rnt!pN5`W$B00d1!9t;|48Xa}3tqQ64@9&`2+8Gg{U3hyeXor;$0{U#W z%|*{=9$bk{lR9+(oO5z&%c8I?jFbEkfq{V)yhR;fz~WTXcy|xF5U0mgM=h{p#D5a~yWa z95FFb_m}$8Lo`p@_8$#{PdAkY(tF8!6kPmr5T0$oS>t(>uk`l(4slI6K3|>}`bR;!1>5hOWHNo0@tKfrD>J3H^l<9*A zf_7(k&VNAWQo)iy2?UK|BKIJESAJ!e=62nfi!pzl`Qbs-hBcPOrJ6Tsdo$qEJ2SNB z8~Tb{o+pwq(I#!KxB^|JvhwQtN)$C9C4xB z%EK?TsM(^RW*RqHZ~r5pmR~RRB+tb>O}WK0=#i7Sn^HaL7#I|>v+{<$%AFmPjI~pq zJyR31&;g@Z_fVsIbXI^PnbFf9zL|!{$n-CJSB;c^Z4WsZsL)Q1mjV9LvhqpKCwved zX)HjAd3xfiBS(%fdt{5&1pJ#CfQ@0S^LDWE#Ts_J#}$o#+VYe||4Ax+PQRdbw35WH zDa?a^L2zPZzu*q{-jm=U_$1R0JEI-(Zn3ek4AQ@&0)U8%+E#iLn&SyQk91C6T6o*< z)amWEPHt{JFyC49^89vKzJ9^Mtwora;4A|-o^r+T$aP?u;97nx7(&)1L^8^|&&R;U zYJD&7cE(LPGy0QG`M`=+?%a9$-04$NXP}ADmT!IwoR<-3W>ywbDsGe~UVK_cpx4)q zwzE1KAK#@%kHQlPe*Bqk#4jQMyfoGYRuZk|07MJuVK8K~;a>tsL*0njx3BhX9}{hj z2C~A*uHtuk)0KctYcE|apUweb(Ki0c0%^)yv~Z)l7cf%HRJin+s~GF&Pxt=i2Ds%( zDsEyh{Y zmnG2Z`Vg?{X3xW}3B%X6`ucL0@#FpfWW-s8x8W{87Z?E{DbeAthd%6*(>8SwKAbdm zdMB@L{6pjyF5E33{K!xx4LhQr5P@lD>S*bMjkS+Ng(`6b*jgM65F`A!{Q3jt=WHe{ z2z!;|1oYKnZ9^5t(ojRG!2htIL@ycqDEayG_Mle8B=5Y`fAVoGG&?r+QZOU<62KV9 z8WuBW9?Ci0c`|>Qm43uj<27ab3^a*K%lXICdeuDV(D3jaRBNdA8j4dW*a2jK6aBVD z$9if1(7^_JlaC6QZjCqL zH>S~)4O#QO3)`hGq`I?82bE)*ZLi}=h$pT{3A`5L-&V&<}rz2Wz>Z-uwlS@k%9&iX(%@-+po z%tHk^G%eFkCALFd`6IL1PT*HRKc^dh2~QSqnq*io?~vg13`k$Ue$CcGIG4oi^^I)` zE@;?M3Ll_Gc!b`9AYyW4^yJ7qJ#iqX&w{CTcCBz35|9Kg!A{!pw=Bww_c1+W2TM&G z=AtG)D;3&t^6^VCempjyy0DT2B<^rUhOr3!|DNSd;U7?PI!xpEbrm^-e48(aB^`%Y_$0070AfE`DzGaf`?Ol^MVj@yG zpl?DWb2?fKu@8!lAXQu{E`k*!6Na?~L_!aBy;PHj4?@Gj#5|8Y`fprN9z!(#L(;U* z%BZ=+C{QfL%3rSw0!M8$S%rr9B$3E2wv zlVm@R0VdUVBJMu%s=_`7Ashm0!TUh2{)DYt9FcgNKVOGVXrht%cFJ`iDur{Cw=;6# zk4VT`S!BIp#R?{fE}Z%nN7gjCQ9TG*6vHue`^Fza=t93i{+23^1T}i=oT4BlrMI#&jIyz9ByCxjddUVnM0cYag58C1lAY%yvQ@lO#mL6gory>AngzE~r9i;j!{{lcNW zyh@J>kJUj)T0~n zousY5L^vl7|69JI05x#%{gvd6$CZJ+}!-D^N73Pk(^_NmFsKZ|7!wIiQ)lO+^h0x zQn~%k=8^;c;KQ0ZEvAilq@Mpz${%+ zQsr5Q~C(u(0!PjD&YaGfC<@>TbE|Jt2Vz&y=1w#eCqH z`{BkS5xr|yD^Ly)l>sS_9<`xzB1SSO3_m%EA1AKM&^Ebq)wsN{y*l zKleM)voxiR&3F3Uel!Yz-dpPkT;&H-edwd1tqaZrW-yG|5GHARnNv$QsMC2M6;Thy z4zed91Aj=;xIOL6cTsmBdQTYAxa?dc&(%~~ilvIupwU-Oi zIbno*3_r*+qjg-jE?w%u^`XE-^FiPca1ul4fvj7Ov$xOD*b$Z=rMy7}bobJwU&G@r zwrktA!{a>HZr!@^6L%;bJwF}45W2(FR>+)XW!-Qf05hy-2zO8R)Zm6$YP2zaoCr#} zg6-+fxN3YX_b~4Nmy8$ymEHr4_Uzx^0sV{*_o%Jw(H3k<9^d&j*psxDTnOPnLsr=P ztE_0{+vG+tOhM>cTql?vw-HL4a<%uhNwBn=thaq?&Sk7?hr|Di z>3{aLiAsBOcGcL+9|sR9br}wrkw#dA1YvI!5bq{rGvVZ=D=T!t&>R$#6*2scx4`iz z@c<(g0b=^qk{>_1)AtbJma|d8pm6!JWfhN#2!*d4ogl=%Wxug|uU;(yx`pLgC|EDZ@rS5k^;GV zdG?KKuzM8BM?7S-!z(Z4Lhz%Q8g6o(HESbtSI$0Tb{Tadks+6YyGvv>E8c3nRY5!} z>9BLIcq|oYf*Go4;~ro0^GV%VT!XU|ece8w^#|LiU;?*q|8%#*FUdvhj=x1f7sSb&-i)xLdavqm`Q9zH!-$$VkHop#sM~ z_K7>VHh|o7hQ5L~7e+P(^O6?}cNYvK{qbYj({Y_Y-+%IP5~Lp}0Y{0K-)={zA;xrt zHb}rx!kCZ!ZE^nmdC3Y>@1C1 zGZ_DsDx&;ho`C+8^NK9n3Dc682>Yjeze9OtS^#>S&?Zp0N|Q3;+q%;5hO=#vwTZ-UWy`;(OlifPiMqgc*nv zcm+(gwN(xa3nT6@lfA_}51On7P4Kl(&m_%-T58rv1Im|x{dc9PkKgYR%fSHHz7~!g z#CZ4uh^EaQ3%8f2L8%@L4Vv4>+?XnmHmwhs(uZ}2vV?o8_gSC-d7c@0THNgMt* z@!gf0o{6k1iF4rjBO||`mE6b=5>_~hWo!TzP?%CS^EqcyD9F+@8wxDL6f=qdSv^8T zW&h-9vWL!?Y7cg{|J!f;>KPanu2f&zY)nW!iw<~%?wIxc4?G~6hVYe0lfn<=Fya(i4>K^~*qd<@$Rrw&Yc`u^Bdc_Uyy|J32I_AZx&s+VQ*y7!1_IQv8Wj*zNP$W^qGYZ#AX;H&5S#DgecCGC%4R#$H2W6hNpNA@lF`s%|SOM>GZ6I z;o;$aVD%*AxwP7Jhr&gPb@gv-J9)A>8WN0rL~Bi$-9)Pu|7|`2#((ov|3*(BG}}&{ z?!s<54KfWCl&#NJY&$S5f^}9zkYXk0+V4pehs^U?J$TQ*``?-rPigkwyOam8{-@Bm z@s`Th3k}~{>9RN_O#opw{8ONks0xA{P;ySXw4w+14ONf}zhC6@zr%KDZ;syrd@k@I z%J}s;-swWEA7}jG07WGtU_?}DcVK0nl;C8E?%l0WB|TkTIK%LkA4Qoo1}GeFVd2W) zQl{Zg+*1C~tgLrY2<;qzM#hO2b*JfDDV<$NY3T}DbfPeO_S!mn ze8ajeMXEC&(pG)7A6@5}l&@=A3H4Rbg7!bJc?tcJp@slsA_Mwh6N1ZIVP3N+Ybr#G zh!4Q=;WG@B9A6lhKy@{&YU>|2%ZdjAUz(u6!Wp3^C)WQgHU+QjZI7pATrA2n$yAF$1KLr zlx{6qL8GMl`YRU(%*XAjNGhkX9nLU1WV>p|i+mRHELFM^j3?3YZ{50UVYSg4YQ3w! z-tTk&noG;zDZax}sY1~C&f+V7$3uMvRW>C5$;aCwoDM| zk1cqtLmx?&TmdIU2z7*4%4E*00=s`On?mc35JRnJ7ngVA#Jv}hao~G7LSY;sUM;FU z+t}c_DeQja+Oq1(}4E_&eZvxHr`tA)k zAe6`uDN|+&X+kn9WX_Z%Q$&bFLX;t)j2V+DWC&42C7H@pC=v~Z$W)m^qCB75-shbE z`#$S^pXaP~);epSz4`fl@9%wG*Jru{Jw0(VlEt3D9i5MBtd4_0Y4FC+%IGpzuF9zy6WSG&hv8q4}7Zw&^H-%R4#-Tg* z_a_b^zVPsKKyv|VBR2f!I&?h-Mn=&oDe%SV1>p5Qtfb_>C^x{aj2<>W-3Y0EH0aulT9HE@^{2@(Jtv{dLkA5Zwl5RE^eaSLnfTFerp zCnf?IDXI4s9!jiDYRJmO2!*0bEG?Kt5K$8Ornv6pf9(LoYfMTKkzE4OAvu%z`DbQb z!Iwgrg&7aR&zG1!!4qs2GgE_w8k7g&Zh&2Ua=)jM_4~M=H;8W{i9l7ZhlCoEw|9e& zcB%wK!R?LXi>CkSgez&G4=gbF9^bGPvIT$@a1QID6R>e~yngG}Rt$6lK&KICn1Bb= zj>{Aj3S_KEI8lOP@R}D%+p>UzfXEo2(`cwO)SF05NI;e?i3Y@`LT(-&MI07hqL5Nf6==c7WTCup?v zp(hT_X&tIXqrt$z@d~{UrtQGCJNS}{5krpOM=02D8b-=3EiK53z(o^-+*U9`_{4xN zh-C>aCgQL(Ufwg*O4?%y%mI7=f_jM4H#Yn{E945G`Ou{rl8Xo)g$&?QAiS^yOR1Hl zJz+}8^m+gM)6QQ!Zt~%gWkUnpb#%IF+pXmj7JHnMgvJ!xafrQ1xM6_ZfAkzQ97;+6@9dw24DA)JAj>~n7o+q8KWeo+I zT%MnhGI)@{O0;|=lMXlW0VEN_zk$>d4ZMl4JfX_3K{_tpB1|q&kPC4S>T?45QhjE$OI1Vid;>YAB(bn z*62bwV0HGa4(?4{U&DZ6VVgQSYBIpt)YL@s005)lM^C-Cj@X2E2=!P*R1X3G#>Qq5a4`=}8bTMhqSYWYBrw|y{Nuj_TLH}WbKk-wKKKQe zjo4nZfJ_sD1W1EFhlu1~k4pSZST9kQHV|cLTfC_-ne?YnmNJa;?IDtPO4jet!{`UQ zG`JDMZR0%Pc3aL(@fA9tO5N^4T5ZTxa1?Kb>)T07Nk!hgnTd1(hfnxN;D!rhPt@H6 z&-of(J?@Shgj*?n4gvrZBd*j1gcbuXKZ{Ki|K9_C_UB#&2}wy}O9922fP{&)DEk2m zDNbmVT>Aar>{6k_CAe+f#%+;Xxn|99*I@OEyVb73wp36il0a)$B=akWiLQ$f)sPQ@ z4e19KO#~vi(fY&%Io6QGdR&Yc;GoQ+f)0+%7umR5N+ZqKN`Rc<^&#s5V7SKU)(<7? zeANbnW5>4Ow`bxm0E!WeE{QA!L`fx#4R8V?bptPe{*;EEUJ$D8{~6mVDuj)s_DM=A zVNQhF7ep)@z$3u%Mtorm?&|o#aQ6}$xZg!Hh@5YGroP8mM1lx#SfGF~kkPKR`acf% z9AA+Phav-Z8!>Wb`$m~&KU+r}e1UNuef$gP>Q@*RnyEHl@vttNg-Klg(EE@uBGLna zr>-NIBj##S?{SafK1Pdr=3DZ>Ulf@^uM`QB724!T!A&AKAq_P~KS!rz?G8n3E#Sk9 zk6vjPKnd98v1>~SCJxU@i>xm+Jj{p)Q30n8Tu)C%O%fD*`t|H9iXqNn%IUD7|d`&2;cdiL%&}}P7cv;5L*fQQ@~L-# zCXOG8-p5BEJOcd4k_~k2xU2}64QPY-aqtK<(WbCHBsM&dEjZFYygx!yxoWKC&=uGi z>;M)K6Km&$tLiHV4lrc7VQmdsH_Wm`4nW{b2&OBBcLx6YfHH`Hf?DJsA%t=z_5~Nv z7z)%dzG*TI;O}kj(9s+2Fj$ZP>48lj{|u9TP%`m@aenOL2^R%=yPQWfVFN{&SJ*^W zCj2a;reGqEhp8M%Ay4*c3ywuTeJYEV&=dWsCxnVbT!FU{aH{q#tjhz^BktyziKNs*W zdD(%FymgLdXZ8(6N9ng=CEp zVG~T5#8{4>FR`yM_QUsxdw8%gz;Zz{NDRQH1=*RIDu}UV%LI~&^NvYu{8B`7W8>=Q zA3r|bXVrNPvmbCh6PT9qT=s%611f~&09N4E(4j#R(K~h~wDe+u7PX!{1S`aLN7`M~ zx51>moOwcF;tGZ%od)gZX@x=Z*Fme`mnQUpeWyd3pLW{tWYcL&`jX&qn?@tAW5q3rb+--*T}z%HV&Ak{V(p zJftZS*$t?U%)uWk9=w?fWT1Ku6&1FXl1y^Yt#6-Q@)icCHatH~`eYVu{TU2faHf`< zsWE3<`3)_Vi>s?8TFTC&=BnTS|CIt8tduOY^m7e}w+k-?F5C;P8K*FN5rJOu3_5;7 zr~#&grf~o&uzn&R19gu_`6T>%Za+vWX$}Xs_Hj?G!ip=U||gr^|a;tGlx1A7fS~o>3C6 zwNEOa^8aG~S5Df0_BF6|0BD$@Fkr3_uz5Jaq{c&!(2p!?kUJAzvXYXFc+>wb_AZOu z)V(Gj55^BH-brWMxhIeUkzv%;H63IIu_wXv0r*V?J|p0d{UnMRbEB8G7-t;JD_4ccBFB?MIB{Bq{ zUFyW>K%^hUlKn={!2mT8qFoI7xHhQMBXL3=fV@PqLJKnT%H4*;-$b!*1H2A>EM9J~ z^8js>kPrf30`wd@7|i1aGPXCMXQ3bwA&`NC5ORZh_@dDo0Iy68;ERSCb%lBXLRAXR77&FnOe?hen#5{+F3Tw|}Rt^}(WsLFAuBW0Y zW`JoCi3V z8(?Xq93agl?~NY&1^_bnf{8baHSg^5mH*NLAo>WxA0h(8-QNG>hc@asln5FxnUy+L zW03C8FM2irwSgrNIuejX{5D0HuV6fr09OD*OQF~97IeTw7wg>nY-iQFnm)3k!ruO3 z>r23zd4g;nV;wZWLSSF_#|OfV!;AMH-8b1Sx>j^8(PHwTxrk2H;|Vk$0U`-uE2hp& zlXuU-2%>){s6U2T!rKF6fIbIxrF`XLYXWwHH?>J@TZ94xMm%VQ^5c)vBV?r=qJ%tz-*J{^$=^#lAFIwQnaM}QPwgtdh zhX^P0;mre~Nlb`^!>b3_MOUVY7h>akGckpAsX+8M;?c?w%N*X*Wax$%W1~Xog6awjmiL9)ZY6G>MRV9DHyX zW2P;Y_6PwKet4z}nu5JzAhb})VWP=FV;@*U^wAim7ocQ=vk1XS6jh&oA!?BqfuW$H z@IDe+0aO$kPFT^oPN$coj{y({wtfdMJxR(&PXVE4-d)DH_;?aa((!&F#dClLi4vDu zZ=HF8fQ`M`Da2)ptA~7dq`61L4mXp=)^Z$62z2#^PV;v3h=xv68{;2`{NrW#0DY*qxADQ zKOxE&UOe;}gb2VDPzR(6nY$o_32BI8i`E{l4YE=g;|&TKC}HF)h?9_87-pgNr9!Ak zR#ld17t%TKb71;iPvmcaVsM45?He9G3}9vz;MO4&REeKN=7 zDAa@Ii-98Beh)jzKswBIiR`yi zyLhnz^1HTM1p4COxPd?>q8S4~*EyaB(wAgE01K;Ip7&mu#5hDyKC%Z2tlA`L+Mtyp zmM$!`!1YbMpJ*};k2VaPjXqOTql@W)I$hjrCl^Sqx8SD}U%z<{L>nSYve6HZ1C|XE zi;F=7B7he_wul5m1{H@BXYXGb6xovsny!23$R43t_vwC2OYj54gc&PQuY#uYA`m^| zl)`4ZYl!Ds?nh=YxF6hdP^xm^$KbpW$)H1N67VdUi|JiZ5@Bw_BB9q%*$Lq;GH=lZ zkAVIa)Kh-(OeOTw^Gmn7Fr?#-(X}3CY?}W0a}WbkeoPhXz~2@0y_V_+qGzselhz+) zi};4Zt}l1b4m>XSVA7=#@EGADi&s)EAcq+Cj%GY^&!JdjvON>!T}xyHxG!vX@7 zXP3ipaHd*zw-SsM9Rt1Z-vzrwO&T%_f#?K(N5tmP9z*wc6@rDnNA*u}8~m=+FD0A4d$3mv)vsG$wqIqM^?g=E$lBiA6H4AVI;Xh3Iv%%M0%bjxsb7 zMlu-;H3|?Eqq!y?5r{hn<>U_S;< zA7ETk2M#>I0(8i%s&TP2yn018{h(!d15hpNOXy*~`Mp6rF$6h1`O{R6(1mCjCHo7n z2<_ZSBDLWaf^{6U5Lvw0`4)=20ZTB5Z1|AETykVv7rO(**u|xwfN&8LurKGjT&>8bqWr4fq;N)wsupi7Wr5j}V|) zs92DZta9vF_lXEd@KzK!?<-Ii;CQW0)t1Nq6{~dgAetS(kl{YIxpweY;t@ync2c3k zxDI%#D{N)2 z1j0hPF^mG+A$Y?F8ngcN@#E=t_qtPkUtw5jLxelAY@tmDvv?NxQ{m7=iwjxvin|?f z^>lEn2U;n!XFdyssh4=h?ts+CV7wJktWydvyM{mxl1mBg*9vVQE{>(0{=J2Qd7Tb; zyVP;>;d0n<;xRKYddT_b+q$$-n*O@b=}_w}YbHos!Tr7oPzn(cuZYb8bM)~0FkzP< zVbYt^4SQI?!8My|^4FaOvj}Gdsc`rNLt;=(ut#R1@^lIjx&`L;&TDD(d_ zXoAy$^Z>UvIl0fYc{ZqE?!>i@W$-s(&XWW;OGG}S=T|mxdE(M~jdlzd7#v>5pbGd3 zSwrOV)eOZIg>KJ7J()u{LV^4O$%PV_Oaqn*IDRCw3v1z^?n#{f|E0JzZ9 zVgqFzE-2E4g9s#+RS;o%dhN=7pYTLX7njZT^=klnz)Q81DrO4t=@&GtdF?lpiQ^9I z*nZxPn4RdYdhwd~W+y^SVcB?&&W?Z+Z75Z{{$~^*P81+~_gGh0D7A(AoES|u65R)+ z(nL*3{&#+d(4Qjoo01qlQ6GV&*kMZc(iYv&NJzWc*@C~rprA=>L-rEe>z+?yFwm=TS4PV8ph&3IuUOTj&WD-TK zYn+%mh=pWe(29~4D!6q!+xCv5AOchhZ?Y<4lcJ$ zGsnwN?1H5r>!=_m-UR&~8n*l*{?7nW#j9Rm-rcg_IayPiIb$^`P$>31yLZQc;+TYn ziYy{$CnyE*4x+ICaXbT>bQ@fv`VSerE+9@1=nlam>g$65T~5MfvU(ExXK#_%G1wKr z6V#z(WF;F#G>+epu$k`R4QykrjHRE)i;I^7yk|$3a9|D0vKr{~b!4X~pbD{u4g^Ez zYWPgRQpJV~2IdI*igPusE2}EN4al~ZcDgkH?uKyTjJnFTi=;DPZ zv_alkN9x+IAPfJ|k)cDdM#=yf__(7@-5!yHfopf$0? zgC_o(-_O2GyxeF1W-$FV(yA)PreENVB)l;}1Af0Adj^#jI;V53t(VYXg2PM9;2+Dv z06{Eu=xw-uNxNT~=2`M^n!0`AGf@yhkcKq8B^vb97_i8?AILj_43m93|I`IRUfwS{ zsTZ(Hj;QJZgx3K!K|L$@)TeaK)DBMpHj2x|#k5Y?Go~X=N z&c_r0_5rJcpY((Zu!EgpmP587VXA@Iz;rK&+6abs8=%G7U<#!eDAKBdjPF4+F6y&n{&|+nz zxWXBcmZsqBdC-3a_0ZiTL_n?!>z{>l$-h3Tb1)0=N8pt)?872R337&@5>OwN8dwd| z9Sd}cj}C7gv_trKuo@EsGe)f5d6$29DSW+(U^1mH{eJkl#23{cB+iJqxGpfAO)M;` z_#$uIUIfhfyrbjc@6;RDuLCi#xN+%{B^xeuSj5V|)t!u3f?^Grxd|lBit zdO&(0{&aE;JJXO~1y&X65NM{>kxmE)0Fq_QF2JAAiQ}^P z8uj`Q7$_31O!i*jwnW&7E!`#K*`okPkhWbpVJn4OjKol41UJ#W&X^N@?{8BH-V>xC+t$zookB((19i!rP~#_Ct*$j+>8Lj!(R$3$EQ-u8i3du z7|StB4uTYUfn1_cHKjePAT>j}LLi!KvVjc~36N=7_rWys8rshy6rM0i8UT?{$+XT$5Snwr)?R-n70A;r|Y zLK7&757h!GhaRPdP{R@8;>={#G9YR6goNG(Nd|W1#dsiWj$D52zco+3kyeV+3 z@N)vd0h25+Q$)TS6g35-@I&CJABw$$i_-{4;#&T-4*up9frr!p&wt|`g`Xz{|5G#3 z#^oUxaqU_fRy^SSfE;m)tfvIZhgai#&3bVXD^3b2pzNUHV%J&i2g~_*!@%BWzIgo! zr1IaX2tR{fP3*xcUedZ3j8PS&^B151#!y+1ehtd%<_U+j@d)U+ym~Fxjq{Fuq1sQU zisfZ^bNgZLgSvtZQoD7&&R`-?@@-+oB&{zI#YU(H@c`uAf{mh2hXWs>fRK%RUS3{1 z1$Ud_w2%;cTu%^a!q)L$6G1@0YLgNh8e+x4NP>R_Xplc9tLp0X7n>dNnXof3Fg~6Y z;SJCba-KOe&c4tyYY4G5hSKMitkZuBGcx=M>Vo9Lo@)Xs1>MN#A%f}KIWvAIz%Sr) zKqfhxthr23Oh^Mre*#uVS0>z(oGBtIKu#?}Sym;WaVF~ou+U{i+37U9NB|We_5|(& zU|}rzm?2{`DgGo39|3)R{Zq^DpG-^&<;`CC(%Y>iNK?6gRFy($msJjxs;Y{j!S;+j zs>L7kg^X9%`|JN)XTH@x%|ca7h*m==gHb~$J-&@eO-)I?+a|^_ap6z#gJuD~$dX&# zj<1I?+;@LUy!0Rue9YIU!K+N@`B609@h0m)L z+WghNG0G;Y$uUz@pZFN<^9#NrZgoa{zeNX(#LJ&!_~Y0g<&4|oD*k$+79apRYO*u| zBd|3B_l$G60YhM(7%B~PrzIGc3zTyoLb-J{L&&+{Dlc_PorMHC!#sC3F_JZfZ?~?` zNs+-B-TE=Ivkj$`tfMHX-PDwW*OVv|aMDP=4WgzRFqLAp!Y*v15k#|5dwS0_3@Zny zf=mmHh%j;_J@^-VAOSm?#Uk=CXOOEAwTI*;K-ad;?0`h4RWZZXt<7M*%;r85=m1Uf zssv2|Kz~0<+}Ee1qg;?sVO)p>%A3r%K|JFy=+WfS9?{eUND>6#;WS6+5r7^CdU(>O zQ5R3)>qX0R1(XuzoLWe z7w4IXuVxh>#^J*IA|3dD*msxkBReAeT{?AETGu$)69>An51-_t_e3R0F$8!P4!Czs zQK`ueym1m3D?sBc+cOt)Q?uaL5%cJAjpgStIW7kNA$d_?~PQ1fPH} zHFP}0FfhkQ$WtWBM~K@0N%_zQvXbnhd)Eo`y(1rPA(#0kJkfH{RU*UT#JBNp>cPZ? zirEmK&kd<%fPOF49uucjWH8Ic(civse;fJgP&C0dzm;KDba?`7qs8`t@$KLrNCt#a zv>j?+oCu2QT5SF!056~Vb`cSc4Qqa`!DAUlZ0G=FGQ_!o4fZI9#1oAlU2jz^Wu7lY z8=4^j;Wb(9(SG{;5lt-DyUuwqiT7~$eIV#pH*$oU7l}&<85VVsMDcijMU-a}!YA!Z zzka=2qZehXB$Q`SJ|p~u7lu#`Hwg5L z+zNOL<2<`De(ZvcjJ!fnpB$0BuQthvHWN%>>`1BYgG97ZGqCNJON)FT8XP21b_8%E zX9A0X0XlvKo@oOD6lp?{&_k!55^fW~B z5Co8zUhu8YH1I|+Ctf?f?-pW0FSB)sdftF^FAl^Nm ziK$F9kJ3<|AR;hBhy%mz!0pv=CEF;UC9J-NH$t`s4ML&fO@D3!K78qbGYGl~ECOhd zv}rIOwb*X-Fi@So1m=g0P|`2}s7FgAYWe_w!>oU7oPm-R>bh-bD`$-=x~!3h2QZo3 zV;D~|FmWw`suRGe!3L)w{KdrXhJ)DzQ4y$2?ZnT5JUmyRdyG9`UOf|1CsrL3GN`P` z@Uebqi_KijLnJtsdv$WE9;&{^!fP~LZ1ut;@^x+KnvtlN!2u%huRsvE2V;(+O-!^<^QIbJxN$nWC&!;Me-P#xzWyi!7XKp zHXh$@IhoAB7UB#=A!ZEsQz%E@j%G#zETUr3yJ?HI}TW-Dckw$YW@ zU)%eSs>ruj_-(nyNkijTdRF*%Yzn!3QSZo4j~7u_nUuwyflji2Vxq`h$o~*QnLuMz zW}L)wrW+YT=2MRh`0>0qlOzcRRID~gl0}>Y!U8*`@SXdRi;)6rd*!G~pz>0-X-JSc?2k(&9pyHB4kGh-QNVbEuaw6QXI^&3hUV?)kD2l-0LfMEa6Y7YGlWk zzoj}ZrJrsd}KOV_$9;}3Vc%(7pdY0VJVH!a!m0C*py zCfDn&`a6wJ@=HkEuWLTOV>4M_j~22UFRyu_yol2WItth0%$3^SkCnm;K{S+|__l)w5`SKH^)cI4x2Hk>u#4HCG7ufDgF_vf? ziBMVP<^(ttK4B`Vy|IaA=#-KGt7wHuW37gqq^-?#)UI6lTak@N{r2%%*ZHe+wAm{ia%KN$ zucTO^{U%LtTKTRyRTK#?G8{+(2jI~Io&#k7`pQ#*Ul*lQQ`zMy?w@onP%EU#0{ zr;$i%6&-FF|4G-MtbaP6Ww`b3QoC&xL0P{cq2tP@ z%^%|b*ws6F(`~-1qSR$jB__RhO6`s1lkd6f8oTBmWEykLtZrO4X_)$CZkx6qGf}gm z-`-|8_?-rO+hQ^OW57|yoR7d2Lii@}_1w+OB*`R1$roQRgP918b#0U*0ydDfA%OlD z*^9T4|2zepnFPy24rMm?tk9~c551EZk#yiDFWuOfPeDZ`>G=N72JcDp>FJVVkDL#R z8ZEVm=XY7{`6}uBO=#a)({R4rkigLTxld6xBeD%$sV{lY|CbhkDR=Dz|Kfd`%I`Ivqg=iKHYk-TtzlEn^Gmf1bRJ-+tiFw~vRIV{Jx+Lp3zc zJ8%8=-M_HSZEmJ@+9%GxkCQ+S7$VTe?gC)(#G;Co;==t$EDqlN32ka(KcDAKh8e!1h5yb~>Eb%I>WT;f$O>z+MJ@hNnk2zxJRQ2a<#ru2mC-xGebb}uJh zJ4IaJX9mAb65EJz&ZgTV1^v7CC-2WeF?3*|a0!ZmIw!kfNMeyOUq4Z9gQIn|n-#k5BjQ!*9%? zNtKx+hl@%wA_Ic9?J(n}SHHBuQQhDMb((PJX>EpAG&NnS905@I5Ze{Kis=? z=HXrDI0p+meoGM-p5Hy07C?Pf|NM}>pf_b7=c~O|V{N;h7Kbi-j;~>DF!!vtgq%U` zI}p>iux8Gn=(8I-8mVv~DP z+97oh(}SLqrJJRNW5n3<R`tj=8c4_m=KZO)m=$F{sWg=(^Nb?Q{0kk*0U`Hc zxl%>aJ=pY@;7~8ZxcqRVYFiuVL4ta}vn&rpw`&IEkBCg!pg7VwIBSp_hpB%r3FSkj zGt602v?i3MVI6<3aARAbQ(t+AKg%lG)K{KOf2h1;RaeD)=b?05JCSU?FYagT~oo$+##0`WC~Q zM^@Sa7(tC!jypx>33OKEMI(8zu+RMbrSSq|0OS%RJ`+D5eMX4znA};9p84+qKHo#? z=Txk{t*9w}JzqOtI(%i(oLAmYa(w@fK0nd@B|Z!DvcD&}Wrxdk+2=Hbvi<2rbtlX1 zs+vtYdUFJ_->+NsfhmonF~oPwdXD0B`+=W)FiEH5d1i5P`=HbpZ96*ErcA#J+iXc* zKejPsyGtnvLwQwHmFc0BDdPW?ZzsEMxN~$vxCFon@=8;7jV#5=!lbIO*lzT{SkiR>p#31s5=vy#Ec_R1=68SZdeNHENkNFGg zcX-r%?h@+okm_OauIZo6W9W&fte>57TC?Wo)1O5zJ-uoqs!5sx zIC6;xE)qlVU!M)6!ez{&D2;RhNT8!H5++8p>WVR`~ zY(0BK?mE&itctHCwo@ny#b7jn<^BccyJH|35-zqLA>`$4?ctmk=MI+a;B6)wl=?CF zgMeSJTExr26u--rk|{Bv@wv*?9=liW>=J_?_gCsw{T$miM61>|{e#-{Gsl%FeJ|<1 zJ^nv^pPlEtRMq_M!lkk^%HdVHY_DT9v#e6xjFhgdIe3YKv9s+c$4Q5N9e1Cca4z&y zn|%WZM6ae2(0Tw@)Jw;GVTq4Kb3vA93NQiTG!5Q4yln=!ncP@9tEeUJib^(DGQ7*()2M&Uyx}X{n=m{eo*_v}uyd=H)G8$Hr+6>Ds=c?!)9jjrAtqn(k$MY5xm>a6_VBXU{~2;6k_ zt}LkDX`RIXPs{CCm!3f=+C5*hCZxEO5ed~7CJ zv5hZgtxa?Q<-urcg@l59{mIM6qwcONJI+)#|0p9e&B*ejf(RW=+WNgCD(?PAeieN{ zNa}@;uImonnM$ftwgX_o8WNnvcPBC^=)7il9s|`58w&vrrtXABx5wOPZq4YQGtdw! zk7c=+c+4|0Bkkbv__ANiAzOkrwAkd(gn8XvzB{x0X5Hd?RosL?e zLzov3xsm$L(!dmAiZl=&h^IP=QN{d~d2G#b5g$%@-)&HJ6eTMjW1yG^$WKLvb7Cwa z0X~olx5@COC)*suiF+ojH(+T=T#siWetf+$Vb_1xi2mXH@z8OzdVke)%(w#`$SC;4!qh99VKn z4?%5~=^Xk_0VLmm!h9n9I5b0wf6G^YD+4CF@AFr`g-EFK4;c{JkE znV{pT1Lk&L*6MSsDLPnX{QgAOHH*du=bmgPSnI;aIX3Hs$=O$HI=$WsI}AVTwYz|Y z1|G<)s&^XbCP>>AZ#jDO$;n9#`R-bPMkJ4u_#Lt1F6~{vfkbzipXkE-vbR2W1AE>G zZ2picy6F1+?V^28`DZ%^9fKA(4TBwKw>w!sTs}Fwe(xq#+O+NKR(U@m8wvnRp}9U% zi5ASRVl?}f8Q0BqY}k8;@I4EJIl;53g)d8={3G03l-%Ottjh0BZ8#RMrc-sTIx?I` zlp}zLDS#*J`t=HDb9GVpk-fz3a#r1k&e`g-$W>YsqIpg!O19HmUqfg&9l!lDI zc2c^WM9tXOA$M(`iBKhw{}L>ZAVDsmkjeLr@U6EpJF4#_bjn?&Im}htJ}+^!@3B9h zG{=B*$8e5GM(Ua}kL;Y6w_{k`)*G6hH&-YUs6Qac*CVJmwT|^;6{2NM0k}ruCzE<~ z=+kw1LbM2nN9rZnra{8eNUS0mBXJsZOhJj@1(Wo z=jZJ5@6Y}38L{kg-N-9*{<6Nshsnc-wcPL9zglzh*{Q-n3}Gc32}Z zah7gWW%wu}FVA%u0*@QKt~a3501J90^c~0_I^JM`+de zq()VKbt};KMCc4O^neJv^M^9JJMG9Sp(g4mR2`z%Gq3czcw%o1@U<8;nQ@3Pk$@Y! zpw^XlyfZXQL#*sd)ggC=`wueaE{0yzoRn4FRnR+sP|qyY8M7WIjXO z3q)0$wD-t<*EgU+cCl?RzvaUQzcc9jdLl;#!d>~*H_Z5G%X`M8?@YRbjA^aBY1vAj zk`!io6gX6#^o@qfoD|Q~a*+Ei# z6jU<5H(79xp5Sf~3HvA~v*X21*VLX(ZCCvxUZDL!Rj>1tyMvNX+V}jMG1(;87S##i z)t#ydB!C(+-4Lpi;dt5bZyt{uI>yGg`9Lx}UqPTDosD2@RbuFYx;M)8^{&kMG- z@i-U6CKeUUvPc;R$JXq5+R!_{O=YRVBUO3Vln4BNnBAu}MJ6=w9~J9j8Vxc+slg1R zO}hzq*<*eWo%pcWFuXK!tc`-PW@1*`gY);FFEZYwWFW%aRI{(|XU`oyIZ5Hcs6)@Z zMt?bEY097PsEMG`UaLJmfX1ux@3brY1Bkq+KD~#LnK{#4Dpns`@Bke=nOaYo&e+`C zTnk8(iz`0mtHW1ldWmp)T!KO|XOLL+u?6`RS}aX8L^&Uih6sCcJlna|CB^J@f3x&; zwhrI?aCWslS?o>j*}{ynxAjk-V_(H<^x9%@Tg5kn#b6n}vA)A@dF_D;>`ZD-OF(Bm zyG~pnUTC6Pbr(|F0&4|H=R3`DH7%XIf?&0)s;b_lmj_l`VC_VR`l4(?qs;)k`d`XE zI9o%ImSwsR%fv{43kJWu@wjku&=aapf*Pj=k z_H_oNB4Umh?@&Fs06urgZ0mB}Ft<1F!%?xmWKUBwf1a+3W;sit>?2Oa{AtW;GQs(= z$8IyF*JpavOM84n4ftjOr$(0f9F+5`IHiRj<&!-@Bz**2_h&tIok<3b&z&P20?1~2r={Johw_eXU)iO^?m(52;XIC4dyt#eSN(c_gAv}1ruXFwi- z{VPg5pDTnEF)*9ecZx3HRwpZ%@(h_SIONmneC7;opvzI~sVv`3L5oAjpNL zrz#qRzVY0yQsZUqwm)=nLMow$>63oL@Nve|O57LPFWXW~fw+-`8CO%_Xw-iG??BJH zx;!4db=(JS$~Lm&$Nc2qb0aBD*EK~JGV?-CtYTu{63a#0R#(Dn-5oYO&~ zma7tI`2~6&9pU10_@cwRCMQ6CmL`p7wSk*ccttj@_xq+RvA%d_1+}?1ok8;ep;83m z3`f#iG8u)zxmlDHG>`M0F&4p1J(P`Y<;a`@tTF_i!UmTRsE(Vun{8iP@zLX z`V5W9bFKE+_zfj)C6;ns8>yLxFQ?RxE~lF)sIPnD6mi6t+wc)T@0gOX+3M$3#RShI zq4L)IZmll#j%c-zxDWRxs6Ue|fduqr2pc8Iw>a8wn!J6CG=mrqUw=r;kqgM*B9o0_}=jxxP1`1O16YZI3x@CWl+-bReARdtt2A{t;W!X_l zA9fNgxt*sMLL)?Br)qe_Am;kE)&q~$bt)Ls>FqLJ1@S8tv9H46PhdKtp#a%`h9geb z);99S<%5k9hYP~T4YCRwY?Ru4sfV(d^ZauK8bk%S$H%PI?)`Pzs&jC6z{7_}R`F}d zQhb=b40R7-OO2_1=wqTsx`WxcL?G?<|D5ViWnn$VMn6A4Z2cV1GmPt&zJ5<2v3bz@ zQdfgqxkRE_oD0>dKfbnfTLKzwa0pq|qiGG~e$LKjA$XhYQX=sY2t*-1HH;p_AZq)d z`%E-_fsomYI?8kE0ugR(>iqPgp{5k(k8NGD3m9)dI=k0@ztGd$rn+kU5n+ROzKo@H zaR1yRaP0*}n{L6?O=jv$jK@nIR6+Iwo?%(LrCCT;cAI)MF?_)q@{XL#^_bXYfyWVH zHDG*(rwT;11bGeq1vosSUvheDjz804m1V{u|q0#zW&ZzQBl>%Sn@9@A;Sf8KdlCb(5 z)!db1+q>_VoYOwE=gPS)B_umh~d#t*uX(R$T1QP2hq0T`2E1G`W+O??!87O zMQ>a0GZ}86+-de{GgIpc4EVLz*?iZ94C_m$-qg_7XO9=R+syXmUe`FJ#SnO4Tn)|O zZkB|)P%&;u@^-B;G^rGTrnBAIlqeZv9#W@h{7XMIE5O{AjhsFTO8X10J=a^j^t)fN z@Riak81k%be6n%VpSg7ppN@OT?6+@xMR)6MraBYh?I8cKZ%bPZdqby;!6WsTD*iGJ zKV%PySt;p>Dk)U2zF1b#m-lA#b^{hkjVnh~58X?C{@lKVV^KjuZV%5jTZ;B%Zg$4Y zg^U{%V)@ACH)3odS{+;sssQeg`@zx}?B6w=JqR0t0YvF5d_g+3e;+@#8giz1|B!}? zMGf;+{Z##0q34w6q(iSTv8nNM-G6oPjJ%(*ZsBO9*Wd0ZX)KhKVQ*VWD4=21Hp6eR^pvfD zrAQ72KzC9ov&?;=h()#jJ6q&e!Snb{w4(O9g;3K14Zdw&;)|W$ls9)s7V+(#y`i(P z6vonUZuD;}RAVF$9xc_&Sxc`R%*_Fq)Mh~5F_K1Js_X7xK(u|nlAzt4@X1H=qf0fR z5n4GJ$rGHW9TfBDXD?J1tcf!?p(Qu`dFf(B@=QTA=%31OLfOX36Vme++bR3JH|z&$E1(m;>Rgd%Ve zL=G)k!W;9CkpAJuBSO#f1ah`^6v-Bv%dcv0We^Fl)!Hg?X{bOfxsW%u6`9($h^&y|E05-xZ~> z(QendB*&8CwAy!BWipk8IiU=n7ec6&rjldMJ}73;*(@kwp<2xvfRR( z$l*i%+bXv4hbh}c-=I9Gf5pvX+&zvp@J)&Ft37vILLIeZYA4Lnc&?n!kl~NLhzUI#PaIn36>PkH7d7w43cYNAB$h{*%aB~kw!I=_ob$X%0Kv) ztViNy5bzdn$DmykcXPVvN;(|ME6QHB=}ofxpWYqVq!Z1@z9&aDfU0!lO~s8rdb7;x zpMJPk3k6ygQ#r7W&XRM)!jiRej^-sO{~J9w<5;mPi<@^imOWsynPCcPFyqkWe{NnF z85pIvNAUf6F^VC}A?EJ7m{;l>*owF3?iKrfVyx!TaP`)+!PH6%!e&}6d+)fg^V;pQ zQmtMGM7=$Qp~vezcL&_0D8hmDR>HGs+p7g2mLO3)$KvW$t*S+bhKIckAv1=y*M3_F zH}&T_c)Gd#mZAWHlae)!{U7!m`ms?OoUWME{H?f67s}b6^NG|G<3(o1|jUhMhx10uT-iMoKgo?;(*_d7@vBa2OJ$PLja@LzCtW ziWyMULGbC4g$x)XirOGk(idNbY{v?)g@mR5){G~c>f;=R?&cZN($eo?&5PbwaH~Dr z{ee#&CVr8~Kfbr5%GYO@2=a`+;735bhe085yzy7Rov^w%Fmv zGp`R+0Jr`HG8Ji6#Q?jkjApk@hVG0SOcF87c*P(a^md=H-I`+#tB1MUI;l=*OFsaZ8Dbm z{;wRG>AkYHH8;^>BSE5WaKP~Te-g3L6`1$5z>kk0G(yzKSR}Z?hDBY-u;g9;Y~yp) z>0i-rW!2X^=q`wuW?FCOT>G+Ndz9JX_#Qclqf5P%>EDu{$YErD97-AVU@-D>l)PH{ zKHu})H$4K|0=c!GjKe|p??PgPgWt2{i#5h{3wStL%GDpeojpf5cX{%DelA3dAT&$~ zi{8L4GEj)WEj)36sMX058lvwZf!ywD=AvAQ$~GloqM4Dw^o*OMT!cKShtG)E4?aj? z-WRE{PH9wI%Q+*-_D>ZKo?gDuPEdS&(O7khf)$gJA_mcdD^$m;$fi~H!viu@0g7ld z6)-mnBBu!FCeD5Vq>KbQGSuIpfri4vM)}*aFI#zdnI$vP26dN(^f}1Ll+E0=Ud&D# zx9^aPvHveE0J!*@Kdnnm!MG`blYxoI{;)y{OvR(fv950UiM}^{56qJeE>6s zErx7Nr#c_<+GE2jUzOhza1Cj?s&vXmM{~b_C-pnGG8Ot0P7&&J3?IKhE;tCC;P91o zoEFGuBylwvbS_(WH*9gJu?&CvWv)z#Z!2w$;haa~nx<2c;+FZLCNmDR9yfXbtf(-n zZfXoRy!IbrWV3VoMPy`5WAcI*8!h;Uqi&1z(oh~-y>|1n!980N&i?Y!0Xx0ZY`|K3 za+9EmjtI@*_Was`x>Z_=F7iS7u{Pq?RtMsbwQTw7a(%BEcZiwRz!+>qP+>yCZyYl} zPX*S7Z2f>qnut6fH30oU80@%&*>)JfVYNNOah03ed<@FmJCL)zr5FuXYMNI!JMLXP6yOb{bI zWjY1(1E&wWxJvlNa{yA{EyXG){+Sl99e3Ir2uKD3k3_{>jY_Ca+VC~NLfSsxEa-Y= zSvj}o{zVV54`r8{X+Au&s9Y6mvvlPXDlg#By?7(ZwE>HBw_`SZi(=PX9-zUdRn;Rq zU>|PGioV|?kbM9BhwB?i#qn+G6ql~WO5%+@W$rKcbooER_P|v@h>2ejal&}@A8u?6 z6B@f{_|(hXedA3>+HYt4xj$Y$>R;$XdGGG?r(E}Ff*3D~9zq9o8H~P_3Zg=f{-dPK z`q&tZcb0U8D0&s!Qy32%*_f~Hk*pLd@YK_Y`CRezPMSgQ(@EKsLA*9oJ84?JP~1}g zA}O%y@SAjQ>YifyeXr^@wvFx>*u&-K?_?&h^+-@XHsu@!Rt;@|G;%{purajs*$@l% zZQdM4d9t_3_km`;x;>0<86iqL^UvJ5iy#r+Yoz;si6}(Pr&m7!^3y+%dR3Kdo@Pl ztB_l2!_a_TzffUH5t#$w7TNYX7$n9mqcbIXcXUi*;rFORH|==o7(iXjO+`<8>h7w| zA6CgU@4`A2)u&T0wnBG9pqtZ7m!s_#KfVf9(58I(hoM-0y1tm= za-Q}v@thAnjIld;P6#C)cdiJ+x=k2?$tpOg-8y74o3wW2I@PbfpVG;vsKM~`Xu68Z z5m}S)yx2{mwoj4rum)`iRDt%SbROqsF;}< zo4^8Q?OtE<;Y+rO3CDD3xm>QZBoFWD7HS9&#R>A{91gvh(Ndq(c1$PZDJS z!CHRg{In4g7Rlz56=5sb@b*zN{g21p5Yv${jf3Ir4n@>1vdFL{u@)_I>BhVI&4<6z z>;DoLymnNy-d=B~HiMZKRY~#WI@W}ju5&SZmJ=LXwuE4REA(3|b16zh(fu>TR^ ziZZ8WFV3^QWvJ4mTde^UDEgN@G5SpY4_oOBBWdQ&!xa6dbF?P$PK%*KnLR%)W|P$k zxarNkMzhXoC7nZ}I*IXuigW#)86PB;5H%3ul3FZw0> zM8TYx2#?oobW}um?$D8=h^3izp0`VMuRGMYDW_#_pJP&V5%iAsDRfejm|0zV>D<|9 z9|VZyc$w4-g>GkjN)aKzXamVa@VSVVztAHSbqi?a^QyA@GgsxS*92a_p2M!oZp5q| zRcrpHbR!<(k`g1AtG`KM-OiU<(dofY zBB~wUOtNC(E+os_$#onbb81Vac@fYutg!t@ufHUw-ReHI$0S891ZE%tCv!8Z^5EP&V-qZn0U+Sok?Tgr%(#>kbIW-e z5e*NIGBvrM3?(~=_I?+1xPXn0XS)*+4mNTZK)p|-WCTOIy>FzUW^s+kr;-+d_+q&Q?SS z;}W_n3Jb$&e`?jYy*VLwHYewFW~zke6c z0-yl{bqSX60BD0ZYRH+i=KNV7@H?T5heoM0L!eQV^-~I8Dw0K_>GRN=^OP@7MG*0@dJx*t9svghNiRkK@ z9Hw=m=E+=I{;S_y+hi+Nvi`%4be5wXOTS+)Z8@SncItz8blodnDxT4>)@H4bCBgS* za>IK+&{eMOO}o6Ns8J@qCa9b@lT#`@^Q~UKmK*#0Hws3Z+d5gtCY<+QAMg0>G-&?J zRrQL;JpJ=WrhRlLjX7E8w((q?=Mm#PsHIl>xMSjD+~x~`cjm=?jns^Ns7{^Qo2ZW8 z^X1In?4jG0r`^t;yeF{xu<_?#1I8BL*?&>|GHfVL&#~53xWQoB`}QUOc#+!NCFvla zXZ%;bQn-rK=8zbb6aSR-e3> zd>~ch_k~3fLV4(MpaG_4``S20b?5(5oJ9oyuM&6W%Cxfq2#GDe6YPV7S(Pb)`*y0${-JI0>$i;5Z>7%z!-3?Ze7o)q? zpDuome|pe*yB2%APjp3z*zlH)I;I85kz1Dw%igVCZLx=a0mcCm(umSIWZH!o`#i_a zd1R&&?JZez;2M4};dzqF-l)tq7xlgS^JWz8?22eMrVS^nx9(_-+dg#ey!l*VIoeMl zRzYuB`Q%Biv3I%ZcMiGRzkPhH;$0QLt+?OvgJA0^yDd{~3RgFdo-CY=4PRs8*l0A( z-?o2U?zc``%2u+$0A3cNrXrRpFlb-UD7}-}L4S(!Oo@}cOPj#z=P^BW#IWHGQ{Vn=4!-ewX3=eT zv5dRH(;$|h0<*_c>rZ@Rqmuhd@uVWd=*Y|lt+NxM()&|m^@>W)4T^57(DqM~7L4b* zD%aYSW85t>FFJO?`8fAfn}g(o{#g27<=-tBAN|O(d=$Q?vQl*PZtIll{3f4{Y3FDU z&K-JYbhR=rzAt@^4plb&Zsf9P+|P6Tluf?oGoIkVPr(bPTJ~%R5@RTjp0bj`XC3n6 zJ;`(5gU;)Z_Z}@Tcgy9HlM7FqB^a#-3jY^VXBk!H7j1nc1W6^Nq`L*AQ;=@ymhP4= z5fSM;APpkYAl;30NOwqgHyqBp&;O2l$NNzS%8C8#z1LcE{-$mZB0l4M326&9nd*bD#^HDhrjV_dCL$o($vLilq~VUg<8T( z<{pLJ#Yxz-Yq_?<)%v-2q+f^4Bkk}e#25sbg@aHbAm(H@bkcmEuS^EKguS3S1=k7~ zjM&!rD4m%Ae(dApvb&__bL7!UU|@qIbb#m{%q1F55fO>M>vl6?n~@r<7wzNI)%Y)S zO{+Y9!f=u4Q*P* z2%pP`lKXrEH3r061b}7XI6L4kX?!gRiOGyoJg}33(tD23%Z3tGdD0c_q%!yMFzAL0ztTS0zqZ^wrY&hH1h9E6dWRg-yl%{$fx1; z(2Ng|Q^9?Zu7hms;U%ubB0g_Gi41CHxqa2@Jfe2j$wCRoKW9I$IyJY044bMqj|11f zfp=f7c>ArS3YB9^YJwF9f@QtW|Ps-bM5wo(=wcd*} zcxC#ri$)EWBb7#_=zGpRWT{X%)537X=q6^+Q=E{M?U1%5jC)BUZI(&;7>=u2$+M)5 zd=0WO)w{G|+wEa=V0Z3z%Ux--u3D^deTZvnXkcx`gZt?#OSVGUe1l-)up zjC?j>H^&TONp>Q1|H>ZU>dXNCyNE3Kxs-=Jzq9jUol-8X;>eB<=GU3Ik;E{qhI^^Z zKg-&3$b)j(7a+(67>R(_*AEX34HEPJnK%>eiuyp`jC#;DgpPuoKH?Q&QVVv8W=5GA zx%qxN-K670`tJ%H!OZ*Z3>5o-bv(tdugG=oj2f1$z(%mkb@xars-;%Kc<>J$TBv~F zQ`eRi*-1Y>J3vQUee~XVkfA+GIcB*lHQ$O-zr;SR=}Q^~xyFXwHJf47@=WbQb!!u! zyOZOg*GPQwX#BU{23O{|UOrZ4)w$zePwHIHzrFPn`GC2FYcz{dq@Tc^8;X0sa$GRg zNNkwpx0*U5EBLIq-yl`2u6rSqjw6fCpIl~pz3a;?1zG_yy7=W*l=X5QDyh-!r}BG| z{_lZF<8P=B_PE#|Fb9gj-guGzCSC+Xo1c78u~|GO42S#XoUhCqYRoN4!yytel6#ap zk$a7x(O2>Icw6B<$Md-=&6j3OqzoCXj{L-`D;sat2J(eCJ*uw?>GWwb)?1af#h}iD z%UnPebk>eEb3`c74;*;Z;dVHZM_M5YPf*+*lC7v;q4%d(Mdi| zD{3WmIVxZD2AUDx*h7PlFC$2APX3egsJ`VTsGR!EO+h^d_vku$p>_~}l3UAyB@hiI zMUnpDp}F|STcAm8C|*a~yaqJ|fT8pP=k#DrCg^)MT0M3B^AlUAsNSthuSSCSyc;@n z`+>If!WD3U)Oanc%3`@+SSket|s5U>NH-Lc5VV@P-;`ubkK zX5KTBaZep@_S7|kjrEE-pZt}ZF3CLp4u$oPNqXJQrR0&ky588KVl}SFDgbC9TKmq`Ip&3svKrFMwWvcW zpn4-BaOW^))sstRcL3^p=U%%u1Kg1>VaKr$NLLX7Mg2NWsWXr5my-=V$?u};ZhAHL z?^lmC@k1bDPNs|MPE~F*R9ft?PqDGtxaGcgk)sXJ+7SR#;PT(|>WT6FM4A6=iX{oL zuhxw%ON%nZ7C&^=HlFqrT#Vj>Lkeyv1diW9fOD(H9^~#zZue1!{^6FE^)YL5@hxW` zO1VVD!3<0R21Kw*pI9#yF&&TkMaxk5VpYvah<`E;@)Gp0?=KZ`+S&|^VZPqJ`};cx zY(srxW>y0&W%140x_1P8??FPabWCFmEZ~d=ba^(xH&*5yrOaT$yg55L@K$YfKl*bk zmh7e-OQ{wMuonXb!J^dZGf2??*LWPzd3+sqA}#TOUe2brMJ(TcX!EA(BI~q-=Jc;_8($_>wlrE>WXhH-{l{J_RV_h^ z1uWM41L|M)G$Qn(uERhlx-=+u%%0t&6xDD&VH4fEhk@Sy_!mUHjOu9*6U~VG*NsA8|<5hF;1v);a75Zc zj|3QA89~REX~qX&)ZgQj`!S!3Z40dS$7)7FejU^Y4_N;bkwBYDtMpN~%;rz_; z0!0k#pt%J>$=&s1)2Q36>+Vs|?q#Fvu-4=DmSHpRWdaw6vFKjAWAQzzNMl;d_%86n z544OXuP#k?|1%KY#Qrr~E)pD*i=%&L5iayJ(fyP2zs+iqp2Sc@A{Jq}l{rxKcY%H! z2!?fSm~jVaf(xG(UwZBWTA+ez2iwJLTOd%qX$b#8OPcVKNc#sKUYBPcYB9@EF)^7t zSPK{$TSW&4S?(s_;R4S9>w_N&DR0lXReSw=I)6|{4sgm9)5^WE-T7K{3@jLo>xm8& zxXqxGuMP*VfFhF$2ur$5T?|nwLwJt?G#m^{wi2WKX6UVrSr(0>_kxChH6&MiJMWV4COr z*@?`!9Ao9-R~I9nm#Bd^8JVM^1N~yPu|BK(Ek*&j88PINt|SaI4s`o|=)=^V)-SwC z5v=%*H+oTx#N%nN{7&(xqW1m~zWO+9*828|d8R@|OL-dw*;lN0U@?x51RDsuhPS8Y zRFnFI4#Ilyh<4=IlFMi2eBKKv{t9(3jG*5I5*gvIQ)a&^+>f*u->gm}j%MAMVMO_O z{Lq66&akFsxQ3OwC9RU;uNH8rC9e| zLN>Rtnv@GcuAGM9lIyh1QF?rLhkuRzK{A2@ZSpaw&yIX>bjWhkOdWyf>ab*=-AVgq z7U2WehV$Arn}M)T>Yftm-@UShXAXOb_(hEAP+vZ#`{BI=18H$L!`3H>OvH zHF5e`F>7ma>fPnbikG04-K^-46*P?NO|F%^TX`M8rlZ!^F~Bu)hFN+74ZIo=W-lu8 zUtJO6E~y;E4yRoG9A1BXpDAzgE2+WKwk5AcOHZp-=aH4I7|ipzdFqB1-3U<@uXzYn z-@QYzSTWhU?nU@qiTSz<)44Tk)Gtx!T6DX?^GIM@bX!#6&)V`6I8_%|R;NFE@FatW z1`uxG*ea$QW9_=Ak`kvztM z${zJ1|4_k(;SkLQ*?PRFj2Ki$ht$=-1)}i=T15{7l|d|cbk5(2{C;JtKnvmQhq@{@bC~q_gwL)Wl?De?60di3tKJ zu1kPGq9P(hy1t6)8{YPfogXawCR!@_6TM&cR?2(tvU5T_lF|0nfIZg)NyX>dcCaH` zT^KeV7)KjMrvL+4d_iwV-I-4BtSKOOMjAaqL$&b>)8s%pz7C8LK*FqX9kuz6*Z{^B z{TX@}z;iT{dNosBjah4tVS3VDCLHNKG!iIrexG5$zTOesYrhnLmZE676T5sn@^_OM z2i+Aajoce;ywUlG^y9(bbV9@?Bz&Q#j1YNjGEu;zBreszb$Pvm&!B9CnC;;}YD94@ zjPN#8+3lfQ>J`}`k&usbT(1b*%HmLBUlR_(YfjF!Kij?^OihQv5|SHSd0y%3D|!RA7}z@Yu5Fx%w;G2<+sSHMEGM1cTR`l2 zK7UFmcGlJz#F-kb)$V=;R^2;7cJ?bw@>$JwUiVP+*hzocfBBDX+4FEeGDz$o0-W&} z3Ne5z;rX6o6BsqSszygp;HBeUP~;(IV=5CEX#-zn5|ttK3cw z#=;fsJS*3SIr{sDB=R&|E$57d`2(?zA2Z~9@yk6J(}Xec6x=`LzzRArb#6F+)oStc zoNta@E=)SEh80H9wR11n-cPS*F?EGC_$7FDdQkDHS%rGoO(YKIikaRdWmN|R$ggT0 z@j!O1O}4QMU#-Uh3~2bTa^c>fn81xKu@2#8FQndIqPHt#`oF^iFf5<99?x?3E{XXP zSZMKHVF{lX&k}?z&VK9RfIO_p<0Z}sAP2T2QUwnE85$u0|L|Q_L+2JJw+*i=<**Uy z7up0D$3K=|p*098aX;3M-?1TbW*ZS%JLYSjK`?pey!J7vEGeX*Ti@Adg2?Z0J;<;w%(O9l# zH00@RJ-=ow{~lJ=S)Wg%jg&8TcJ}OXwg)E8e-J%6jhXdooN(N;TNH9n$#5EG=e#+& ztEH@sgngO(&JWP`;B_d?p4X(E_wIEyJln!4GoPF z2wlNI{@^eR3+-iMG;q2Am^6@4qA{qwt&u3y*s{7P*#l!wGt>93f4_=TKDSN--CuZ| z%(B-y7GMCWmlhFfCcdlW?=WjYB~OAZpsL_EIX={lW(Xt0q%T=u(?RP#H9_uS$Or49W(D=!+Y=!C4IYE??0!@nP`}Xt zM4qSdEOhl5;QvoC-@Im1%8+Z3791viE(X281Nw`65LH2t1OYjk&=vJt1W7lEm6mJ9 zxj6yQulcNy+y#Pdeg&1wgv}j9MMZfPet-96bMv4faB%WUtVv?9WdEB9^v3k+y>dpY zL)R*elJ=S^GwDpBLk9;JJohc+CWrGc2ECA|vxzgP>|S0ZiuyA2eWCePx-lSqN0JCU&qdsiL=9H1@PM+@tGo)&vtY{%v?0lr7VYh% zu!0}NJ#D8boDGjJ3E7t^>3O4Ltk~9$mO}mb4Krp-e^#_mpDWqi*~mBX4$t1IFm_N` z?M_yBhjEDr8>kje_H(7D+fGzU(Xg^&GO6n2m9ghVK1s=Kg}ks%0p46V_6&~y0>BhF z0ukgX-f0!%s=ZbI(h6ZD)SMdWGrO?cTkSFqT!^ReyE(2|xP`a|LLJ-!PX0lP|INN0t*kBGO`E?e=jh@bb zS0RG+5LP>G%JgDC`iVK|Rm=zq35Aw#vv0>hj7_Yp^3>8&XNA6op=->=;$gYgxyr#& z&fqQt_|ew7d_hz+h)u{}Bhf_h(U2Q|ELxa=eyNnLt!jTqX+(r zP-PeMWpv)C^yq{@B%=p2_QzZ#n;QuZu-ED|2ypH$8aKPUlhzs?+51D)@BGEcwm(U~ zA)hB~GlB9qSd)3iWb`(8OWF#|=Dg;~F{+#9=X288;H7a>_Zdz>Z!bmaJ$ILnj_#-k z!>RG#-`z@Ai<6I5Hb?q`TO4v{35fukyN9~W6KC^fr`rVzqsAb`oc0_SD0Pgl*DgH* zZ{{YqxcquYh+WBnKqf?_x9Z0NQLEejNXF_!$kizYnQT=YQbVN+M~u@u=e0mPqQ(GG z%NhrS@aF6AraFs;Ifs%(1#H|ZS8b~o(G7l81~aQ0oi+S7-odmc>Z4fOTUZU5X*qql zb}V`-Ai zj?ZV**EmSes4x&V8OxbTDqFrJ4Q-RjCG;8F`D655Xm&hco`?kVXr%U8)wc%Rr_2QT zfpgz7JPi>H^l!&LIG^gqBKV=Y=l;2&Lg44Qq;kGZj-0K1p8PVZ;cUhzduL_huiB3_ z+L(Uv^OZvWvsXBvnV@Z=%aa1g!f+6z6AvUpjaML=B)R2=~R!eGYd60n`9NWbABC5ODWopJl6$?H@{tw3>?X>K%u{Pn?ddCE-LGzQgo=b4m_aQHPbA4@bKhh;WW+uKa zZRB@%`o(I)Pb`pxD<$$!DEPc?DXdwgJk!D1&7JkE{>MgIS{m1OF$}?Zb+!M&KR4IR zW^FsFJSIqMv7oy(8DLo9m}iiFP^ev=sby{in3_PEZY!mwX$i1Yz!6vpiX#8w_uhW8BLQGKYxlz zHXdOjdH;K7TTH;?fjT&Izw@Rd=#wDTpR>HG*{f?rJ>)kV&L0Z54qR2_GF8bqHJcfjZ(_n9My>Jjd3;7fua=7vIYT-av%l@ zgz%2n$wNZ9D&&z1BrntW_Iw*ADuTtfISjUk<^rGSRJf8-1YQV|&ELD-4QY-T*JHO2 zObL0pcO!_OyEOjvUbFd(onbjeA;jym! z#7w_kJ=dl(#MZ}ZG#{^%%CHgM^s!|)uKZ2lR^W?=By}v~Y;7MWzaoopfC>t?5{LN; z1!nJ{M&{SuVjqP2({MxwTnn-Fw4ud!|KSljj%gBGtLW8IdWCw`)5v+4-QxK%e3OSi^O6g+J@lR;&}+TiY8(rj=K5H&q^|Lm-jt@zF;u7NI##_EWeCmt;hS4@S z0`m*02oc~Ydu;Ptium!f;veV@bU*rHTziCY8%!TB#6{S7IA6^uU8KN7Ye*-})_>bz z-feP|AYWy7`I^a3shL>D2ReH5zqwl5I_eBE)g1oRFa1Yk{N(4&-uKkiogDxk#QBEu;Oh zwGX>$D-XHSVN?BYp`Sg%^bFh>4HYj&9#ieDQvaI0WTx9Uu=P$qgS;Q?f19GMLAL=S|2!{U!=$Dkv)}W0IF-T+?!; zl&B)eho}+voSRIxgbtda_z*2ASA(wf*ghwHl1Ox z;mF2!r@A*0UCz603d$_y4jlSIy1=Llgh)*3iMs)bB!HTAuB^0OWE2aKlas@VyI__B z4}J14R)5BbwbgKJQ#9zO_FP>Z&(Ck~Q$XyN#a zC&fnw5`9NJB%YauqW5QXGzN~ryE;?=``T=aFCVbCtWkmgEb z(_Zv>Cza2B4&*kjbrkBh%2K2i5P;CgOf9r!@kI^mW1sCRx;wrEgg%(mTcKeSCu zaPLkRJO9n4cd#`*CSq?G^?N_Zf*KkUqSh8LCZ&W7`UMn3LxMHnBH@uJw8siC)Nlus zdNOYRWJQqHLT_-8f+fLyOCo6^6#?3am)9+Q5<52N3b^!lMv!!8Ez`?=^b2Iw@A2=9 z%ILTeo(Vbe@3j`%tg(ujqD~P+$IrkW@_=aIE(}DZrC-NO-Cx9c-Q620W8c8LuS~1z*&x%hmQ0&>vKWh1LvCw6*$*V0K z8u?eQElSDF1i${I7{~qQmnR`TV>Twz$LAFk5iBOOG%fpz^m;Xr`_^qIQ1|*l$m`0! zH&$%xB{7j6NxZ@1fu1ITuWVv$^-D$a=g-@L2~J@}O_dc?INQKD1rPiNS=~GOWZ*{j z91ZztHvof;0u?+MQ*eO{0>X#{aX|sb;`YJy&(_V3YRI5p8abp?;p$0Gx8+iCZ*7kA zvi^9$m3>opeQdI|c&3FdneSjrxsO=bx0;TPJqXm>%|2o-vF!4#J=+iX1U2v-h7ze% zqmd&V@FU>%@V$4n*$<$-`3Zo$;Ou4pV(RBRUz$O3AazSXUtiw`KqH1DF7%2EY^NRe$y`}!G8z$35SiZc?FgB}MpNJxjBN^o8dJj0}0(7(_Ljwani_IIWwf|ki zFt{EzTQBy;l3tYiceg@&y#sr24xmhFW!b`9Hy5 z7Y)efs;-F^JfBX~C}4p5066%kB<`&RpEmQ@5RIa=c1<6KdIdQ1jbycTY-cGmU)JYu zD#Ul+Pe^k*c5WX$FeGk2{b;%pw65sw`(=wkYga?rVj2Lv;X)&jpGvW~Sgqc&4HPgS z=mF3YH19@uK7m-2*MN-#Kn0w998JL5`_ebHnc2u;;mug8Vi#p7dOZs| z<|`Z=9C$hcoU{5j2Wg?sDc`VZ4SHCFs+oW0=bp}I6i~=_+IvL zAty)MWEvAJqj!%-Xm_cK3=H!-77bc@@^`-%?FygH5w=k#4}!Get{?3}^bW(?n<8bt zbz1hb^~te+!EJmwwZ8rx7kAapQk6qtrJ_>Qt#uFoP`H}ac7r`c z`rq*g$>j{b9~oyqc|){F=H{zEzMi0JS!^6%lqg?z%>M;kiXKzALO1R!MqlOkM{o#H z;IJ;ek^_wl9|O~h`%O*Rl8GGehO&+hm4LOA1GHFe+)6BziWq>4+Ur3>1W(81*f6WdpOIb5!v%x5bWQJK0zpe};WyM+fq*cURZ!#!#&IxG0QqL0ITvt) z=Q?R3BWA=B`Y|$7?1f^H^1_o@ff}TYCuL-0WD!h4FUWYLh2F+B{9j!OlY zZ$RuU$Q08{(1pO$K|#zmFfJRe6lox$7nwq8i{2RH|8YYS>UBrwqzv;ulK&kE9 zbS*QCp)CHq|0Ol@aPuwcU7-f^XUP%jgkCG6C5gb_Bc5w|6#jwY=rjC&U8>co!q!k00Gt#0CQiekk{AA77vrZ z=XuIZ`M1CA2{-`L@4WqU4tG!G(haJWp`pkF>G|ZX5%W*`qN1$%-0|yhGCz#opFbnI z_q&Bm#Om!FZAx<67e$->l9$rjODIWBDvN$YDiAyL6CYk}B>aOa2rrh@Vl9aVVrWLk zw@?gmxUAe;DU2j)X@Pzcb_20_w0~Rt*B}w1$}Lh?uButi+rdsDLbqd)C`Br(c9>;+ zLdu_03T?s$m4hi~#{+&v@PD2H63WmF<)apUs1--fTwl;F!7EMqB}=SGe!p-~RQ>+w zX8xBWi=aW}WJY0%*!v9;>EZ(KV6uK}XtLvvp@E*37BKjz&FbX?qNqJN(~Ue&@gr~#16Hdw!UqZky>N_ZwIq+c9AN z-IE*Uk80~XH~uGcJ1{K@R9_eO0fLA5QB0bxqV}r;J!sE7KdK*Q1M$Z9loS_m1ZMOR zCdPmul5t?L2Ep`~rScGZFo3ngjz&C;&nz?IcnQI|>;eYe4$y}LnU2$`iXiujnx^Kv zuqu~i7Wvmy^Nw=Eh15~83|ZyqcpS?I)wNcuQNux4-~z7_IQBR0qP|gIiv+CUmg@6N z!yoXK)>^h><@@N!$RUZ9DHqQlK~5qFii(qO+0jGNFEEGWu|=1ZO-<3E_a3z1Hm@0Y z&^|t%9wIjKp*M*ltd(N$*DxxAYq1DXr%y|wuag!T2+Gr~u_XY?GiiF3nd1FQ8t$R( zqF?46fjw92+0sGumd) zS{>-;hZ_;_Sk--X_Sf8=gJb^h@zV7cyu;86Z7T%5sHt$pU~w(iOYXOqIUuRTeyI@x z_mj7`i%*wMEZw8E(9CVz9}+W9xhymGef#JCj>7iK+lAg3EM!U+p)~TPEa6@o zu3t$OnI}$LgRp?_BaK*1DKO|B;=-kn2MfNdK|0xu!<^L{yS=XK^Ix2YOK}!S+^$2t z7De4Uv6GrP2v;JYWSSIeBPzoztK-<*r)*izw3{jozDMf8QuXMvDGuA@) z*PlB?xVhx98IKzl>Y>*?pJ~Ug4z=TmMf#f|&nC_0+e413ZOh3tx0c zHAcZCq8I#P8g2nivld*}g}x>gjQEVCjw8=)YB^jk8WbFkrB#o=at|`7rt7<)&q{xK zyahGTfzmE~P=hxrc*VQ6eaEjdv<0|eVE7pN@{avBfHkc*ATmS6FjN0RuA%JhvU`2C z2Ln)1Ei#$JvzM-@O+}uHn@P&Q3?&`)ESg0};5GO4EA*q}xL5;g*u@Pk*t>${ z^VULE+D6K4)nZRtWExsU&_G8!s^=*K?CDJmHtpJp4epU}1I5vo^p26<;3OwZ5Ib3z zVdfTfa_2Aj!O=*v*ug5@TORdM+$yxqOfvo{%8&=MD8U;JS3DZ5N z0GF32PX|J^#zBEA2Z~s@?I4K12mbYnQ@(x!$NhsJ$nw8RY1JGPYSl3f5}q00VI6m4 zY5d86uRN5~--x10wSXa>k|B98b@I?wZoe2TGoy9e5vsCa1uhyY3qq|(O-VlN1fZ(u zZbjm+@eOl8S)8S=^xI^TQEuILqQpm{k~(g?Ew-9yVzaA z_Vpz_aGSX^G&pF0t-knI_X7>1O(EQ9dY>+K&P2B3Me1*#OIu*o1T;RyO&;c|uII%^ zlNSM4sh2Z9X)jw*?gLya8%IUhKL~AJc749Lp%$Z>`8u4Ca(z61*#xo$sQ5QnLnTL^ z6J~*YA!a$bLaFE{#Ke1^eiaoVD;_dEf2~-LFeSPop-rKzSpC(7!!i&9?quqU1p*3=+mh-@en>P1m=(O{4##vDh zSMHGr^6F!-4(7|0gjSyC8r0|^pTQiK(_#SM$a|AuYm`GE&L1MhHK^ohTJNC)3LA8; zY-0v6MD@OeJcbm7)H%&yf;(vQ^I5Wnhp@D2deG`Pe`o8M6LE0xswc)jQ;i0d3z|zY z+sq@o?jfI6o^5?Ep0NIsW3CU3EWu2do|`*DDDL`vyY^w9#D&7kH3lDSlfj-VX)&~N zM8r&QY`J6N56HUSp;Vq}@`JKVChvXN>i^!G5O1wEPbi1X8T0;E3t#~HZvbmx3PdY{ zs)g39oNGieePe5%jb@Kju}Ab|4Q>p%aO35`P^)u}T!F7w;ywfFj>kY)P6PT1Hw$Vy zzV)V?TVE8Zdh?AL9FNd9#~TCr8=ToVwYzq&mr!+l3n-+cY*SoJHnm1dXCom^cBF&?3G}dne&_U&}Cw!bJLdDFLt%!w9>G% z#uwlbR(N>!^h{v6q3V+x$7Jv4C#Zc-jfJF+^utR3fl-$^?XTG9E-^zJ8sL&7>G)GT zzTaB7n!{t+U7+eCjm%d0s`3eO=QWwdG3v_c$(noPQ2IB8i1@184HuVTY>6#aI;K4; zCLD4Xf8XcHGskO-;lrw(KEW}8&kH#ezrW))f8xzp2qWG)c3sJ{RG*?B+lT*3>8#pKRdD=F?G+e zdXj3+t~myI3N|&;y8EoloG{kTzAjB(oo1gZ_`^5yIGGWX-931fDeHamt)%*6I+WBE z_Q3PG?Ji_vhbaC?q#Fz)*BqsBxvZGNJSk$Y_{qVL&->L&xxZEzVHgp#w;eS0dyUV9 zt(f9+tT-zwDNm1(*dHrsU~Z4sY{;XJA!Zm_|7Ir%S+r%qc8_ozkOBWqtK|V5^-08I z`Q^?I3vZ2h2_EYmTmh(o!~% zYuG+Is?vN=i~v%(;dve4vSDCg0IEuH6$20k4YH-QBHH7{U>a86NCiI@Wbzd9!*k`q zl@jzG!2}Qu`7=o*hnh%L&Ik-t>sz7EuSbngz#)Gm?g50P1GS*M{x2aGwP%f=e^Qv>G49;CblPlPZv9RAC5pApujzQRBI z0;dxsU}3@6&*lBc)w4T8seze1EPE~eYY0uaWQb2xKc;|WVX)fmS-MR(C>wP^=p^ub zvTTS`{>1@!CU~?R5bdvnq#`HxqBo%VZvoObhJb7ZlzHFx%wwLw6E@+gav+jQB2owf zcNqes_w%-gGYpV0sh5zJlF|=)$8a}NZLJ=9K&+y;?(IlR)AcKhX+kkPa&jpNQ?9YG z3Vxxfp5eL(|Px9@qU|ucNXXHTDnT^iEJ`n>=z} z3LET>H=x+f99teW6966Y*J1tOn}7K{UfzwTn^plm@2+}f(1(Vb>|bC$GdxkI!7t^0DzUv?sWb7m?ohgB!K@rpHl$A ztIXM^Ge^1Lo;ke12ZVk}4a9JD+@Ar5`X+(#LbFfG0r&B7;zlZDtLh;D!h;Bh;rq0^ z^!H6dwF$Jt9Fih;X7->8`{l&MDMOj(EI8!C)NE{Ifq};G7MwQhnq}?HmqY{aPw|q&h0A_&_H=iD`zCa~yU-*8n8+u3m5b`z5ZxG%J`EUEaNZ|~ zH7K0kSZ)i<0?uRrWW)p+ebw}JMeCcJe>_+GWx!jv9_w^oQMW_sN0vo`95Gkf%Dbm? z@H&XL9|*MJf?)y&?zq zglLLZ->g%!tkJe<^pNIvDR9~6V0qFRkf$uR!M=edQ@H&vys!{JdeCXAo}^qcFJKfs z1vKX-PbUz<>jfCUpo_x^QWuH?_F3cU3dl`lgZ8{NdcD_e@X-ZeMiHx}{T$m2XannG z>&SQ4ho6#@eRH4+B}J}Hrric#~4 z{gcPv!oeIjVR6Is?Cf?35NRU;`tKAVC9K`a)IZ#4)Lm13-ji}~6bpg<6#t;Qn5eNS zdrI>Bxp=uz%MIZFyXRW<53k(4)L>oS*}9WSS_`MGo2|b zL`gos(88!AM5HH1Iqa>1n4&}LTw(TW?9AdepV~6YWMdRI{^gN^17Y&2RNFjH#9wv1 zMH@Foj;Y%KtG9EmweP-}@lC^1@E0K;`}_OeIljNdtcd(#PHxm129zl!ix@)YELCo* zOc2_Yn5mn2NZ!)fLnb8b%NMa}YWu7U6su&XwS*xzTIuE9?s-H!7L2H9wqbJCk>#M6`s@ADv#2@#@LsFHskSA$}|Fd-f4qO8FQ%^8ZV%j>3fsq=YM~;X?;2CQ<0Zvn{4Ce;^JibFbZ+UlvPsd zU0l>K%TS14v1(7V*Wo54CA%j~ByA`jK~e@S`NM@e@B`@puVJlu1sYXon3w?8_fklx zX&k5EEhd>@B1qn?0tFoCggo02zp7b8=q{?|D)_}bOqh!6!l0MY-0;ncTZz%ZzMPR@ zs=U&C@1-1Bd$Bc|prQf&Yd_HE_yg#^#2_CC9HlJiQd9D&@0p9<^tEC$78ad%PiW+M z)9~^>rnF0{YF|`UmuME8nY@)JRj=Vu*)cmYC-<>2X(=MSJuC|H@KMG3;fSQT*tclDiKzHwyZG|Y@?cA#BQX_Hg zsAc?hZAplJTBXG|)?E_(ME%&Jy^l7g4sSECha(=8f5jrXX7KkUU0;`Anm0&$JEdEz zIAm160NaJNb%C<^3_h*g4=^f6MnU<%5<`kQp3hW@mbYB_SK zZ#K~`tSpYe!c;-T30*5YZDmAt|&D& zDd}rrVUAFrh8Un|2>4tu!Z{h!7W#U6pKuPN{}ZXG5iO#+`fcafZTZYvcuPAkr7RECr;cGLT0T z5fks0Wb7$}cG3-ieE@&!TlVDr{~Jro0@emGFu;OSo*Zl--JPAz2_JSyo_W3CJ9xeJ zoU^ZB?#e;SmSo`I6<2~fC;P8XMfZO|gh?ya>ufnE-Rx7-JKqHXrS7|o`o3U{ncatf z$o|DTHhpobl$_~}5L_=bFoxU(@$_Km4d1gN^D6?M~eWCXK+)C^z_?PIWT$fOJnDb*jBXRTUEJnqjc7{=!PYKU;$t z9?t=ih9u%I3Yvy={jsW?f)i;Pe`m`(gPyJE%?WBM?x%P{I_j$GC@EZ7a2J3=WUr|QCeXh*eNP<8+GW`U{e|21`c zRJW=nKpqjePQC(}&xSkd%t(F1;<{1b=zo{d+}%Ksw##*nWxuz}PLq!L%vaGm`iSs0 zs|Q~I$=OoasDAS)O@GmxQz27S=oQ6A#K~E*i7Py!0BwlF1It2)E z4`449bjWXtU3t(y>+38M8Zm@6ity1{YJ@m^@-&v3$!{60{zw>!A@ADq?j0Q6D zVjFrp3^9QA{fhaF;6qTlGXGyh(#Qew1tWIAW{)f^WCFEwE(r65j9a>QkB;JadV2oPh%-;y zlHk9Epvvvy?7Rwsx=jI`4Q>Ji0F*s_x|a1Q6sPqra&qU?-oDtPVZ9Lg8|;Ixqi%-h zFs<)I`)XDg*#9mA!C$|A-D%}YgN5=3sPRF}X!OWD99S0}9Sx#c;&8+sR0qc` zD9iK9vXk6!)I^oC^=V_9J`c&QgeRuKLDk@FTm|SrCrww*_tz#VA{&cOG#gt9aM8l^ z+*!oP#n2?^6JmE~+p-m9Eh)?O+sBNq;T$P&53K}qqznyZ!GH&T@Th>~yJzt5Q9w5{ zH8pj1cK%x@2nik1GMr*#Ku?TO6{?Qd77Ie?$HsR|?4nas4Yr;vcmWqq1i~KSYBX>; z*A&a5C`=MWP$R|}U{tl((WiNfB@s{iDCABH%Mgq&DY1{VoxLyV+z`!`dr9eu)Nf!H z50QtbFa4)B1>eTosGK2|G4SlrQBsN%Hd-qZzH;s=(c6@cXW9_N5k}sLz#Ad@+VzF+ zWn@>vGp~O!Skkfu=f+|GkE-_o$GUIB$CXl{RJKSOwyYM3kP(tSGP0A3jEWLPX7-9g z)-5Zmk`W@Z8c36n70Rw8>wkXgdH=uP?>&x=_j%rWbKl?Z=W|`>b)M&SU1#N1%IhCa z?mTr!?9^IEjrv<9AM{W3@?49I+(fpNqrEWpo!teBVS)Mg?n;v$hyT=v^H{y-bLS3B zw+ls8`r>RF5#noEpMN=;)YaVcN8`6{LcEcQg@bj%vUdDPra~l-PV`EKLDk0V1|O#P z$zGyD0&oHFiOPSR_)?cBM_#KeS}mMQBK%y;Qp9f{%;K{A^Tb6zDNW9{VS zZHHex=@Hxp>#z$QJ=W4^s1q3ZJr7IB>+RoY&%F*e{g8nlHG`{*%WniPGN-dj--D%T zB~$3(@zkn!qoJ4ek8b0q^;2-9x*kw=RZ&8J&4eI_fkUsQvN8>Z(xl;iV5p!5-#N5I z_4f7o+`4s3bHH#7Y+3FG3htT1r&2;iLm6Tvgnmsk5F*O~HU$vAlSroJ%XTAMf7=FrP?81pP~ zfc~#{sFB+yB_)LwA@UP70WLe0wOHvw96}UNDn;_N(H{JyZPJq?@#K3@-znJui}k9Ci$? zyMCB;;G@9v(VvXznPu0j%a2B2ggwo+&9VQEe3p1jli~mdRb^ykw5BQ1nT@224>htM zJLJH_D(^tqwj#99is}`<$dQl;+^+sf8(LYn`W37iGr2s$!GSBUdo_N$!oqJKBw{^f zBUpvsIur6Ej|(F*5>XbU>SX_bw4aGlxM;i8mOt{(W|d9AEc7-BEE%1mH(0ebUXtcG zu3385PA-YV2?-RZx2t?~noRijsA%$iPY7mMJpa6%%4fq2353`QXJZ>AOA*C$CO`)G zY9A5lb{#szrK|g<{SuRXC`wO2mHe5Dmwyb)qXsdq@+=E8iE_!^_UC%cS0nyz*R{=R z<5zcl^o`_hYggIwNdMW?&+GZ> z>&e~yvv1`&>BD#y!XPIyRt~#P^(j>?{xX5lS}{rbf?K;Xx_~iQ$8GGBKHqdMBMt)M zO+ZG*&a1g;CwIC=T*8M0Vh)*0hQ+;2m#@c*uJS34e(z*cCSTQ^VxMLn{bs7-K2Vjg zu<&^|w~o^XiJS^R?yr!LoR1kQH*wby`rgIL+SYEcM#iLdj8v`~zg zBylugt4rCXiR7$>R3$97)aIw>dulkjN_(!*1s&9Vz;a}{nY5F7)K0P^;JDmk9d@z# z1qFrq^6uR6NHO)r>KKN%+*DH<{QQwm)Fd`+yR?d0bye0eoP_6CjrQ}t^2dl5hsX2t zlT*}I4q9tHPaSXBoOYZphtFfSBqW1r_3Ze)^WTqbL?+)RBC?(;LBk)`d`xhC_Usuo zR5yI&JIl+MPGafkn6G~yi!m^(mkFb*?4}2rPQ;o;z+e~|6LW;r0q>MA@L)M9mQod6 znRUd-)?HU~)4g{_^SSy~HsGv`NC z_-fh{7V30on-rSP>8#t4a6T%Chmlz@BqGvJrzeMYmHy_R?x{;13i4NlC+j%5g^R>e zMp^2=OiYAp@RFW>L{y(2W1Y7!2X@$G{l5dMe+^Gu!fjZ~?p0z_ioCCbUVY||A8u%o zF&^NPkl0MoId`YLw6u3@EcEf?{RP$1v`$V=3&%Xy?zkzmGfHD0?atzQHUE@$Z5|#) z1;5SbYhyBv-Y}iX%ekgoQBWWXbKF02;t-(;fd9~y(D7LCtv`0a-alwf_t1AO*$!=5 zdKl}TFst`|%rCMQ7Jio|G!c}JN~OnE6%&AoDsa$dow z_v~c4sL+0=ZW2T3Irgabga3i9UTq6b<1#x&*{#+dwfwD zWh&3GMYGIfh8Jl_o;UjR%y&AnlUqhcW^!t(&3Mb()v#z{>DW`;Hl;~Ro}G^*W%g}* zZLlVmzyEOT^uU!VPJS^}+K{Fwzdy2ZA9c9y9$W42yYr~$uaBoX^3Co*Yj>IGK2){5 zbS3H4Pk-OEYwP2q&sgvDk=WEYbo4IMMgNpcoo#G}5-%TV=h5nIc*}s{`Tr-&r)lJ_ z#3xH7-MsCTuJ|3Nn0_8OLLU$$ub^P;8+!kSiS~g~Y026Q+2oG)$I>V2*RsnR_4=-+ zO5iV3=eVT$g+-uiS7>5abD)~u-ru`7t_^PBe_vzFg?$KHA5GT!NXPdFepz+vOt7Ed z>hA7tB6^YW96h6Yr_p!Ng4n1FE$?;cD43x4#8Fs%1u@iTZ8h+hw@-nIz>m|*hV zrmb6FVOL-oR=ig+eg?NVLrs6~+_@R9q30p&zHoP#o12sE9JaRl8Q*E1QklA|(ip1t z%B-u4H0BowJe)!|F!0%0qDzdj?%kf}IclpoWskuS0x!!(?C@-TEVwreIS9kD&uBG` z(Q* z2Y=GlUamjl88e^c&XMQAl(*A5{o=mZoY@a#3arEX{9}lwKko;#L<~yzbq>j%zc*x{ z6yhydc;v^q>pZ%xk?&XS+;ZXkIf1YzI7}ZteZn+x!+}|-iCvi6?|q13k53OE8xxIZRv5}3f5f5J; zRU{O~KL!m{+F3#zEu2)8^37?2JdcANH&|6|9KOr<){&0pZZ5aWDxc9vGFTH5P$g139)OlTbhPn>pe$g;KCogIsbGZ5(8H3P^;d~L`rscV@u`kus z%#5(qWX=dyCJg2WrU|jJh_J@#iMhGD?%1|1#iG{)`Y~MkSHI6cZrFU~`$*s+L)EV+ zkNa2zG9s1oHF9<=Niyg7yj_1zJYBq`)I#0*Y_{I3HS6c*=OrPX6c-l@et60_I0nDd zb?P;OT+cEZn**M!8_4d-1L^PvQ~Z7N?ZvQD4bcWNJtwB&(Ny#(=*3POYQE`sDJnFW zIm93+eBcVt1kJHKg5HyfpEN53b>_Une`OKQpq)ZzXP4>hm9|lzvT*a$ipF*p^>O<( zboahht()s)X%;MZP_-S)F^Cm-$$URAFON1Xm5C3tJ?L0>GgVx+!U`UMfeZ>|1tHR) zcoaQ;{54!|DFt;s!P9UIj&@}GK6v1oU40L2t1K#EoL?xn%mv@xJ=2W3rvYQFFy1<{ zeMs?ii<#c)V~Y#tl=4fAqHg&!so$_1PPWEC$6@A!XCor@6i#Embi=DxVL18i*!>FT zL(iEnP{(-aWY)UdGGjOREUsiK4HpqSNccO9;e7Zu4S&QA($Jyrl zCAmpb&Dg!pHwWXaInNBe^qF{jY^#1(a}dCFCWdk^ z3-*A(YWzE4@m2UDn-B*dA78TP^wFyM@q+@~OF}sd)heMPT5B5L#%*$9)m2{g(LAsr zeR)Cq%;Pos4?C&vEOg!wlfa_fA*`Akz&@2s^;^5i!ckti@u@ElZ7pM$JaUD{y!;(c z_V1nz+cEr0(x#IqL@9DsQc&_-jn@1V1O2ooXQT7YE1Ti~ZCNrO#;4ZaJ>jkudUfIDYg5q@3p?75tU~2bxnJ&90W{1VMYer)K^ln%B4N}n z#%f3mt{`m|gk@j5emw=7=rX0!?ZpLCQ#Y0D>FW+=8X1_}&%XMW+|jS15~b;eYI@Pj zi2{G}BCXQ2qLk;qzY%4B_tZz)NS9Ildr<~UoF2vM{z7YxzR+&-CylW}hTxdAq&3T6 zZr%^*h2aj$WhRxXxHcR8zYY&KVqeW`j7moAyRlvJ^(ey;p==9#oMNobq@_t3VWq#b z-^o#r!mwVDLnp{zFKx#!o5&X1_A*tDuVpP#<1Tm3>U~-?Fy<<<(uwre;17_|%gPQ~ zt@%NV^~|WlEW@$64@x-6_z)I=bYIKs7xuJo&Q*5y#{)e zj?3>`Sb6_;7ga9_)W^PGKZXK~iXl-$iM+nr4w>nS$3(owqAV?}p$_nV5Sis8Re8QH;C9^< zLqnPThO$Ag>mH9T^3Ds!zq!tV1L(0%(hEbhrrT7wr?B0o2)KttB~%C)cDe!N8TOOX zf|{b1TRCW)nkpNcb^OcqLw_iB-i-qs2@8re`y02b&%bD+;^-KNF#I0OsH4fW9D8D( zzWq?OURG8J``*G7nz)XqE3XJ=8?R9J-!(NkN!1Gp*zMc9V_)_RnpjwDBYVU#Rt?L- zPL3QP0i1sg7Q@y6PLds)SkfvSJ@2kngUGm!%GK3%^nJm}vo)9&!!xXmc0ujimQa9TanLGOcQs@a$B;Bvj%O}U%H z=@JBE)v(4`4whrGZCI@#TMVJgW4eiN`DZXsUk!HU3|w-^uo+Z*hGkAGA3ODAA{yZ! z_V!xH96DrNXtAQlb0)NAV);w3$-1v`7k4FgDjC#j%a_Sf8zhe~Oym68^0UUa76GUgg)Vd-&$fn=))fu9@1gm}Z6bCfKJk zFfc$x;B;1esn_D=g~dfIvwU7(?+2zMtxYfQtpm3TRz!OAhwlGPmf5tW`L#Q1+*taR zmiep1w6d=}UoT4Y3-bl}5?1EJHKU)jO6~3M&pwHqO-u81b#}JImH08-Mvc;tY!rw- zE}QKp+@D$eqI#Hhb5q;+8T(nu>GtbxV^#i+%+im3?Nut_?(1pok<-53tY9MC(W6pS z7xU}*wrWojQNS3*hHWP?(^4$lRCb|1T#iX<%7o*4VG3*5s@}sZ-%Hi$=STa|G-^wC z?Pz~#e^-60re5tGj#8bu$et)rzLFMCsi3Ysg;|4$cW|?_V`WF}%a@@msAR+Z_;U2^0q!-Cv71999Z!m{pzZnF@VSj6cp5rCqKSxg|P!0lLYa=`*HIIEvV8t z^z`L*-3A{XWHMj3#-`Q7SYY~!$it|R(7c^98?XHO&I1TP!ltZo!RfpmPuVQZT7rLQ z8JKqecoJPbKYhP+SzX_&NlQOyLH@~QRz}fSOiCp6!Ji)^&mNwBv-Gz55zy@cf4xMw zD^T{I?->mO>)Vf-8B)L<@G~pt8ZsQ-<$3fp2bI5NOiIK&@uIoc;g6r3=`0Z;Mrr(U z9a&-B(S@K5dL@2NuUc9=HHVwOCv@FOQP^+k$E4oOy4P>{wc9R5vyWXTDvlNE?M~Zh zn+M{GaJ5T|^KXi*Rj}=`7Q447Zh0=su1?jDB4jGZRGwGrGd5j&a<+0JdNDM3xbx)| zTuPqtmu96-JsGWDLAxvxPRitM0}xTfmSOSzxBPbeg>B9Yxznke`MlJlnK?e``u^(Z z-F|wZcD?3#--9;k^0sbD;)`!zk6Ij4&*{_D7hG-_e12!oX@w(4Rw3b8z0WtxJ6WBK zY53t-?bY|~TMOu~k)CQfoGr?fn1;WI-3KdWU#sAtj|0v(g&m__u9qk~x^I6|pR{q; zwwrg9XoJr?Sy*n>(b=<_LoZS8JpGmc4!v`F1+DL2Xlt{(=2&U&70wD~*B5(V5pU^7 zAG1&Z%0g9DRZH6cDA@{h@Y1+Vjn8T|l}!k-N2J70x9>#2KV*<+B=7F-9@Jy_&;p8R zV?p&&Gp2QxIrr00v9Pdo>zsE-^{Zfl z=?-5c1a1k{UD4ka>gyKX{&b-v8u7YCs|{+qZ|4x&vpToaupw&n)4J0+*4O=l7`81I zAUYA61==}IjPl3<-U(1boN``?IN1DL^#iCpj?T5JQtsVrX%3*7hAg97dHDjCB&9Yk zV(rr%AQ(w(VBB~1LyD?@!@cUwnj&N8%A=z46En;<-D{PiHI^Ft61)_)=dw`au-*9n z#rET;n?YKl=Y%LVBm9FAQZNe`P3}d@0Yc!pjFWve)_64YltO-tSr^bXDOu=}ME!#b|t+%@ut;>E2w#y(w$7>h7KHH9hAI@11s%PINA+-XaIwHAq+@^9;J zmm9qa{bag5RI+P`>2ay5blJej`f^Fm#o|jY`Y^&Y9~I@Gw+MH^kt8IbZf$V zIpVH&*X!u+b0hQLw?SgR@t|@?oW$>^+i)40zw~bF?*Q(_nXftNy|_!s4Z&MMCJIPH z(rdxJ+iU)u{{}9UMTWGoba46|fJ+E4d?hU_{h>pLa8PSLf9Aq%5MYZdUUMwN_2yZ} z;bXU5eT8+J1}+Ch4`1WBP_vZP!89}b*7ZTLxa9r{C;g*)1<$r>F}vni8;fmvSs8Tt zg{}9L+<8~mXWiY&@S&^CwNmx<^)&H)0bi^?` zAlYMxT{H23JgQ6P79D9dK>^#IEjCN7@?WJh|9BN-G-Sy&c8+#$bBf)y+!vF>UlYX0 zS9)c3H>fv5>ELzR%=EM(Rkz}Dxwa)zxY+V4-f&Bj zGXPMsZ)C*y`z!?Z?#C`xI7!%VLN<26LliADcFhr1!g;lzKT1llYwL&_2@*ygCTU{H z6g14wbK_ibxnOTey{EW})18#+q{eOD6_H1qI@bvZ#C?~q-tqZYr|G<`ZiSgv!Wp>| zs)Q#e0_ubzDR%SC@hijmH#^Ps zZuB$wX9zt|oT@&4EOK%4=aPoJ#-*mpb6PK|e9vN!99Dn!4u0Om&CQJii?Aoy-(aNgiAOZ~S}3F9E^PJHbuI`TRuPeC9Nc^w_k%9O`FcfH`yFPT z^v@$6U9qEXxt|AJoHDPh7j&?YrxyH@^-_nf#YZBI$LPd~%}h*3&`SUX&lZ#;JXZ;% z+v(IRP6XZ&G=dm0~E8c999XNeBsT039v3O_gyktwph+dE0UyyT(#Eza>M zMH(raNcDG$$#)!D-?7bPKU6aLys@cRbkC6X2}#${yMOe~9B&+9`04qfC!2jq*H$a3-HkE3BmK9P(ms!_4$Tzn2^_SWqkeUh%Psl-{?;e3XPxBeYw1PHjC)$K9gp3{H;96`wD^_j8Q)u`~vUw^2XWU~kjR%jfF%4KuH{ z&W_N~p6aRK-7@V0hZOzm>I2agm)-<+&X$$r{Z6Triv8uJ?fp~hbD4ZUyO!ryO^$v0 z%4aQduDs8AvgS$HaF#rUXL;{44X3C1-$G^nE8UkW#T*|aRViT z>%wnmmffbmRePLHoeD@wG7F*(|5rJ*Ulrm*nj(vT)zoOEq~F@}%3Q{Gh#eRE=cc-Pu|;LP*oOTstA-`MZTGcDT;u7;>TFvEZv*OE4< zrwHAzQT!$4^5fUuAF{7n+A5A+`Y!+Yn1@kQ<#3hC7yWKnm?tXZwutCQev1kRa=0W& z$8xpyiIgZRHWQn>ijR}p#-iGwb};5#dj8qO8#3(WEg>d(OTku}Gj)!!P4>6XVge*JzY9S zh(Wf_u0OLA$AQh8UcIuzf01jAE&;L+D95ls6BhuYwcA8Dmx_uCWyc-Py*WPeDd9VO zO^X|M>6+-g*d8wI(zMMG|FmrSxYo-5VuXFzuZ!0Xeri9L`RkX{J<&{kRk25(&3=x5 zU1H|AAaRrHBCS20_paD8Gs_ppuO3TZ+_JLpow-R`jmEsB+sOy*OG2(4@#)WXuC!fs z^y8o#Yhd|Q5PPx4@V-I+w{JHgz?Chl|NU5mS3TedT)Lu6hVmg zichB&Ojwh%vxdOTYU=9Iu?(SFnwlHnch;fb8v$_!&Ym=T8Vq~Ht`xQd=eMCqNyn`Y z9uk-NZ1HH#dg(Qvsh-Y!)gA8Lf7>wgn8j#}vl7kiGdGWVNPP;Q;b&Vg{7!pDsi%`U zDdPx*OXlAE?cjy$t{h`u%g=ni=5%Zw^~8;KjCwf&i=xeTj`R$nKAlO9h@_;Kpp`rj ze~?Tq!Dw6jy3t+T)HZ+cwaB!`hJg`tMwhZ#>4b~4ej>C~Dm z;-qF(Sci4Idikaa>lk?_5w<6n<|kUJ{I%ayI-VHv{?jO$^y&Sw!u(bxx%cM`$GN;! z7k*w^d1b??ZU7rmGbp3&u^{goIQ}_ zawF@}!H>*WLofxWcWB5!p{h7_3!?`{Om=(D98(Tqt3lr%TmjO^joDgX?cEqd_^-<7 z{w3vFx0ZR@!)$~~vPC*vTS6t2+Tg%>r?~!;*6*BWUaZc1Z*OAHETwDxPbnDg$Yz9r z+PsF|6Jqs~AMNTO?Y97PqC^AB)`7x?RP8xgvqmB);5t@3yY@d{4_#Ih`=?^V ztc%gk{}Qk5MaI$Sm@uoT{FBw1IN-5iJi)5!>eLa_sn<=*T>M~%7UJ^tTKw|`O>`mb zk{_zBRW4S)jZcrhO)k*s9zHiS>CL-pZtxihAbu`I86TLw65!YITKtKP zu!GESKN!ErxP4iPDG8nPmiCRSx|e(DYLo9Cx3S4+cRsQS?Dmi!tGNa8D45UY-dS#T z_M-?@>-PwT5SIae|Dh3oj23C*S zn6`@0qVS`Vk&=kZMUJ1Pae22cF(^r;$$gASUUSwEqr^tuOek^eIiKorbKJs?!`is> z@$46rlJr|;;-R5UqQc+A!eTec2@%H=3v*$GEVggkt{leMgsIsHa^A8iLH4B8^VPw>qzPsO zPe=CZ{4ZN{V1SF@=XzwSo2~co?8hiXAOWuWok)^NFzLEL2%tUirh-t0(vVLNcrSSt zt$qe5=Tmc(L6B|fj`5bUu`!SFvae*H4vy6mPL++!{umU6qi79s3g*m0j~P4Jg-J!E z;C#0|(eGf#0}s^%|2@Ui$bSRp0r;lkI9Ua$;b8y;fw9>4+?cd)S*3sXhI<{EP#m5RlgIjb=OxB@B!>uRCqu~=iR}U+A*lf0>DkVcDmP9`?%#h3#}@-S zlOfF#4m;t7+1efN;DZDOj78a3hvBB_xjM^*gaPJ3OBFW*?c%$jBSYRu==ydEpXmea z5K!^@F_MpO-@Z5$*n%#e&p&@o!p>;29e{*UD8?$V$$Fq)ix>`TX4rIGTqLM4v$UCp zP*yj@3RO5(lftuQh5R884-c%>7Ke;ZN#}3=^r<|>X6+pHDzJa`FglUOD2%ocWh*5u zmnh+FSSDQTA&4i+c_)Ln6~vk9C^&f+<*|fw-;vFXj2Oj94YS;n<)wL`5^)gA{tVo^ zCHrM~;S%^Y(No|?A5BCwPEO9>*edc5>9CbW(fWhpO~kMuVC9qnA4~AhSztS|2R-Hn zZ;|=*A4{EgVEX>MG+gH3&19dRdt{cqRS&~$JRq(WrWJrKmNwqM>ihGBg_gxroSZN(8bD(regqXR?c z@w>0SJPQ!&S{3uRX#o@CKH%p=yVsQt<5wY|&D=a$gUzyzBo6RJjd&PFMOLe=pNEK# zynhOZt2ijNOwA-UoCw?MmutU&uDFHjo>+hIs^O(rY$wTHx*opR7s*a%#tyC1M5W$86&V zneEyw>v6OU@=cGzr-^Y4Y7GMKI~?|+(mxAE1<_8BONA6DlL(^#ShZINYw@EnjD`t& zX0O#!-+)`3&`7vND5kcYm0&w{>J+hEAh5IVv5)vZ8$^5W%IrAl+YRBCOU9=2+aOvd z$15guP?}KE6Lxxgd)vKEK87315lRSH0bX7j{BIQN_?@4(on+6j@Pwa|O2hG@n{`Y= z0_K@*z@h>*6@fye5KOhKCj-I}m14rIG0AK*+kQvRg34bUDD%l_J4H?#kY%>XE;@UP^{UHxVs-fFP_D4Ybt4xz?Tu?%C1H41~;AsAwwsulmCzEoefDG=-ee(8;OEbk9}4bKD4z{AG}P3#L#9o6n6>;MScn&P zMkeW{ED(_}!W_K#-2ys0jYpzFObJ%*OaZ&RfzgDh?Pm%qGu?Lb)KNdQZ}Wj1O^Otl zAVHYdy?v`cVpMxAEiKIm3+~Rm&!@n=h&Sbmpw@@vMZ7^IHo|Jjf0;9vAf3gZ?=c)* z;_4qaG#)DgI*^D)`~g;F%?d6q#UT`CLcsg|Xq|>fAYz2d=W$ zl+y*`%|vBn5>amy;wWDH{-Fk(R=nh?4Hrf`2wz5w=qR3PUAO1Tkg5Qo`~GCEXWZUL zCqhxh!CozF{v`fC(iM>BD4sC>&GzZF6*4m~BqfY~@_-J-{I=f5JznWxn(&Qgah%9Z z3@G0*@;oHouE1RL^HY8G3iS$~E$$-iMBTYV$F!Tx9}N!U<4XmnxJAz(N~Gh7Ec|$L zoD8`G=fh?S@#Z)7vy)kdxIead0;nfrOKGpWd%}Z465{fF^>Va+XA3cdF3v{Dqi67bx^zd`um9(iR33zY8E)1fkWeolz~t050y|HA{k}JI-adh(J_js zIE5!iyp!lSvM3fR2&zTDMKb^#s)@^fm+w2G(*-|A1Dm3G6#dT+G;RXu$og=_feI~r zNK3CF?8fgs!-8&@kS+VeFmNK_#Y%br^7@Y-jYrtXYurdP+j=Ph{a8C73pNK_M!H9n zNfhI&W$-%GQ22p~s3M^JAa4eSh1va{{DPKJ0t!(3uUN5y80_s942&=g8yl7d@O(ae z_`uI~ueR{v!=3#6fe3|gPCbXRM{+0{DEn~Bx1-S>5WE#RNr{1pEf>FQZELH9Mv@o? zb$KAZqLPv!BosbjVU2%8;nCK=JfXTETX|U-I-j+~sIuVHMrCLGMP=$df;}lmi4jRh zmWlZj1{UI5SP{T@<%%T6LSgc*kZqh!2l|d75!L*Ib2Ml{Rz-sj@~WDO_|amxOWI=@ z200IZe1p>dTx=7`5%_EmTn3wIt4|!qeS9rDFI-ku=85!O++OG|jL7t~v(p66@*8#` zV0&vEd^*#Jsf?R8S?cXNuZVMDhm!(&HV&!x!Ra@=(I!7%#VaW*OJG5kKRtUbvM|%< z=h(Cs168tRTc4GYvGJk8#4Neg6FNFNH4Z=!K_s?q-mG)}#hd2l(JE%fpN2YrO(r_* z(_hw2X_3cDemu+=s0A@lBqnU<4R@+FYu2Exu0`^-3~|%Kjj$fY1(hTNRCr&@76!N$KeB{O2PZF-J1C%Ff>%(EyzXpzto3%90sC*-@n~qLWKXo z4oM*Etpgc@tflCH8?q*@fBQXvN0Os>6}SFbQh(c0jAS zg-1qYe$T5{W5XQwym;~A{H04@Nri)kca#*#n1GK%is6a+%>g*>b=48rT!HL4F2o9M z^YebjQh55{#PXx{2Mm%7T6dVB8*uG-=pdwokYwxk*tcE-1sDkeL=tvO(y54Ykn@bt zE;wIdj|;~5Q{H2@Gu$|%85tRUqoW!B8g+t?svSF4k6!VeCG(lekZlq}Lg=5C8py6X z@8V*Gl8!t=RCKpry!ajtgvAbQw{goBlT>epzNx{Xp(tEBsBSS~I$tOhN)eJO!NDYJ z;GTRhh^~J93ufN-Y+XKrk+*N(9uua=Lyi&r4wB&Ky06ZfDXHI`nwsL2b_=}J?V(ac zKbSzF*ai(A0T#e>e2!%Rbj*ww8q@$HQOWc0@vY&nO3eD39D4@_cCNNe4TNbSA~8_| zQ2v1DZ!v&3QhxTWID76K8cFEjMCHRR2kgVXqAWLIZ5kB0BZ$LrJVVf~QaB#J2Qdv# zVfcLkH^F4M48g2JFJHc7N40|ZLUIu*k778HiQr6HhU`n0w@XPGKi@^XwrL8N?dK-( ztbk>GQN(Q79^O{rGDr*OS8YRs3M4U1z|91{pF|BqHZkH@eJsBqM64d4K5;;%@$~dW z)l(1u5RF$%Dy$B{pnegDZSCZDe1WG8Hz(nM^Y-e+Ut7?P%Z!LTh`|sI|M^7Deh@>` zYMz^3y@$Jd1Xd^m>TlxYd_mwbgfk>ped#b#a_&Jwtb&d z_Y17NsYiVITXKi--+Oge?lnF$WgxQzV1#F|<6_hc0%k?Z!w*>b z$)2IB22WT#cs^VT%vHar*08DG9`g~jSb&V~3O1t9Fdmmlb=&C+ zKOqx%8-g$*cc`E)iLvH8p1dj|wwl>x?9*Oi)`NSV(36A(&mtI*$E!R4!0V8 zice}Q$G6ntuO2~^0Oqv=9U!y#0Cu&}U#Oc0DIU>Lp+^$8;5NAL70J(#4vVufD?YX(O z5rB{A`s6j^LaRdPg1uc2DRS4ulbHioe>zh@=3wHb9D(rz)mE<7gK>ne^D{%o07lhij_%r;R9Q)U z+o&X!{-#9@9cRLm5vGGoJJ50={>f0lV~+YJ4(q)x1FEQrl+aPk$g81+!>C;I;zbCy zYLU)PXucvR9`^b&$dVhUrXuv%tzp!yVeH5V$ro@c6i-{Smpk|S$1sG(fR=!Hm$p$< zW=lGOLuma$=Bxu;$a3TKMQhF}R7`|4#!P!kf1t}ahNi)Ks|{xlC0&mnv6o0$y?%tZ=j2TgIA!8)A+ucIuU z>Q~fezXvlGsg55%4ld~xlJ?x6Zv|jYbfr0{z-R2i&$Ppz)ku~}K>b*VBf7cg8+$Y= zt(A>Fvj2syY)=w<6m0}pA$3mu{HZUk>^B5(jz%5G=jeBzsa{?Thu%90|0E%^ke*>@ zTZg~=c~1|woSYm?r?FvXBx+xO+pYq=tgQ7`!T)%q6a*Z&V0$$sX>F#;GFgI;g;xFf?7e z^1!MBU3KH*n!s2nOMtOjLOv|ZgSukJo_JhKYp}S*5|1`s28=y`nL)al8kWc!(1xNh zaQ~X1ehxp^{VqH_xUV;{vNphxUVzZGiIGva@Enuvj=g)|+S7Oj)@FFxA9!vqtC#y$ z*tmEVz9{mc27F4fVKy7lz_1gI6oBe13*76bN)c6*{<5pusR---WHBkIOy%&cFOhPN z4K~MucikO-=gtGTlmJUrPz;iu^td>b#)9t=^%1?lk{f{2n|I<-vpw&zMGz@yZ~1~% z8>lUeajN#5Zoh$mGE&qM5MB$5u0?xyAJZXO&yn_ByH8eW;B+8r4uDMZ^D=O*ufqlI z{r+78$*lRibKo?>@`k@Fq(I%1LJ_(9Z=qO&#`$dXN@)bO?bu0xHB_6C5-8R|4M1%# zB6t+p_SkRy>l_Qy{)US9Un^!C2xnpqgY_^bZ1pvuWF)B{-`5r6;NWt=no_e*WvQ@M~^PlIHaQZvqmOEBx}c5 zK(ILOLkXwW!dunQ(6DojcPG^3(NT;XSP3QuDCg+f4IAu$ol&b}0R=aupVT1r?c9gc z{sMev4wVMo3voh*uD~ zRlob_;K@jFd+3569Dw_%H-hBL%d2c~NZ8tYX^sz11Pw*?jo4;^qqeqOK?U<;YLBW7 z{qt@n>^Z#|ab@q^imwDz0&kEqQ0Fi!r4M^wlpoY4WVbXoTOn`*8?<5qKLF|J_xVZf zMa^93ASF9Wfm@M@Z4ttGJ!D^QM6ueKrJY{tKDAw2Tl=qvMs+pLo;zw$G8X~um}(8; zr%BkrLl3t5y?^kCnYcL4`S9?t0^^4fFM~FnG{;@_B(5JTGl;p5wlY+z)$k;*!iynu zlG-C-SKbCdkBHHlYbc5UUjqP}ed1A0dr@6Av0>qs6Fmm9jt=@nTK^65QYB13Hp*bs zUkbt|ZUy-bumprXCP5Duo19)CT(uGVdNobWxT1!?A*^t#k?f16rY}&iQD;5X@(B5a zkt^sPkLvT=1VWrN-mE^TiehyTgc|QZ{PjGH3)6aVLpo~Szh@;7|LRp}As77QPBUQ* z324qa2q3mJ#~F3N#QDT3yiPj!x0@I&XER?>F~l0 zA&If%IzAs0Wy`9xle6(J-Hn7;!z z6AZJ^v%JWS3LT5W?h5E;ilN{Zs9d1?M@`)U+|Vj8KSb$|xdLq#LgC-kmmdER^d8$w zjW=mx#&fObg+)X_FGFt<;2OLhCv2<$d_?3q79{!os5-X$%48~qsPabgwZ za!ak!(2Gwr!uf+6m%9;I;bYoEO+!!S6(H;La~)kfwf0G6hqYs#@SyM_@jD-+L_=r_n{ITV}cow@9lFNM_Qo;fDtal46#bJ}D_lXrXTVbACvy7{)${JE2o?@f_lw zWefqaxU6If9yCQef6Kj|pId<%LI4M32GO z3IZ$=7H9>Ej-}nNr@H)UF+`O?=n~}Wzm9(Amw1QJjX9uNqIUKSY52AS*}D->+zF4jK$l zqgVml5mgCl79#Oq7#6p&ZxhtMB2=dU*&Xd=@TnJwSbZEK;4ia<;n}!MxM#zS6Q@6V9owkIRBbb zwd$x}C*D1HX~Q)HuPr-6if)F7-(tSoEF~%Vz=!=C@-hBAk?v96Y{rHD&ryOn^Sq_y zCQ1ZCa!gN4jC_uFTy?Leq;q9liB9y% zVH9i_ceS_Ncu%h% z>Uu;~8GMf!rl8D_Oo;8^xIrqgx5tECxC_1x`XjP37t9tu?aqR$keN?Bw67s>z_BHO zAzg^C1h)$@`D?7y4~nfB*I{@OU)uu`JWFVjk|>?rVY1$fz3N z+hHgQ6_+OBX4@5F7{Nd6M0x{ZPR2)oZny8Ls$4@IBlABmKzq@Vb;K3nvzqSraC-RU z%#1EFFm`}|?MT6W4B?cD!Z`uf@$_-_ zMLUWrK)__LPwLH^H*3QcVtDaniNzZn$97cPTS<~b=itum+kHr}Y1_hr=0&By^pRZ$ zE)0Atx(LC)(ce2vz>m1bC)6maXfW;WHXq?nVi}^h?7;E0JeCx4Nz!f!}J`; zKaxNNG=<$r2GU_-Jmo=-Fo~3tPFi)*$~xQ=Vup8zu_m;5!1izJE+`HU09tV3u`}69 zq^JRxh6}9%2ei>+$0Y57jWT2lppMP~uZ2?W`_opVc(jBg0dx%54y&c1*M&EgyW(jG<(!raNQR{%RT%NzC*G=)kE zHJkvKQVb6WHyFME;r8O9ti&vGU{-t5DgF;WlA*&;kr0^4nSf0o122;Hp0^CB&aViC zfYAJ0O8nRt8I0=#sj?I-28bITLBU|4NnL0Qq;5qHhBPPs$G8&42zekw^gl&RTMD3< zgpjQGmkObc(G%0q&=>$nNA*m-iM+fi(NJ_ zFc3B^jes^mdJ3VO5_uEDV6>%gw@pt?S)zO-COtGHBI}yK`-WO20);c2OBrTmE~^hi z8u;5*kCV2_{!Qk3M9wFW<>6}jJWOMEC=4Yu-oi6r2gI&${LCOJ(3K94ZsR)<`xDU8 zG%6WM4Dy0t^8tk^z9q~yO>jwp?eGT!3eX-D9$qln@DM=n8JVj?z6GGv2)b~f5I`jp z;u^b7Y##(z;an5G2@wx)np^hI@Q#lsMdeY7LR|sGg`|G#p-Ugm;ZbPnd-p!-z49}> z;oI(VeI~qdP5e3fpM`=1gWy=;qO(U0))&J@#v1oMHnqR;Z(roTQ{A)DApho;`b*K%eY$>@q6k zzn*GVdVa;>FlSN$rqx0;Cg8~p&FnBLaS0PEdIGbd;qW@4mg=H>D)iD7g+($#X(ppJfYr$l4^ri zMGRKeUW;rP4rq07CLAf-7Y0hWC1P+UiO?svykNbVIu}4x#uPJKFrmA&!1OoL8-Xft zPiVOxR{Z~2kvC}U$uYQ}Gnu~ec^WP$vAdD9gG0JNhkqy4kR9|*x9=Y!!NkGZvpd?4 z88*CID6!!`k~d36aR51!!-jUbQv4!JQa!9qNUDvHi;1us5BURWP+$6$x69X8 zT!b$Nw_AhutC+AI8m$Og81B(fTdRPsxNhY7b@2G{@Lb0^0;U;i95tY^v9zoKrXnE* z_i8(wB6!VkZ*+l>sKwf}BYJvF1S`VY0n8G2vtI_1vo-23GE4)ZMi7cIL0DKBfrXws ziVNo0wwAb9fkc2*Syhn81|sfX-=T8NEQ_ILhZ$@}*AhNb2Sf&~A+2Pnqiis5WRF8f zAn?myY9ultfgQS?I0C*EJ{V!R@O}lja%)@uc>fwdl>c>pdHMH!*T}V!v07n2FY-T% zqTS@GmX>()rSgXRAC>#9U2ne$S#QmzXt`PP)FyF?ZIrH*%8i6jsW(%z0R^+ib*1zR zMi)!XcTcnoEqcv*_4I7`=_Pj;`wSBzuOm=F{Q%QzE^ElL0#5_gFtP6fc%X}DJ)8^_ z>qA5);5>AhD8K!qqs_#H2jM9AP(TcWAE{SHXgT+myNyI~Zd&vv1i`z!1kb=t#G3|~ zD2cdDHQrsR?&&E57XXl9G3JzPm2tlo6toUy&FGs=W@cvM5)wN57Q7+gk?9-kVw+ay zXs6RaK85fC=O04nDg+!*Ijo3K$Te%%u5G+jtSEqXEubPHu5=B8*)LzdOg7N{_07U} zbcDwPn;H!BO`G(EJ_Qao#M~Vp&%Ypeqi2S}`umgRAowy%wfaNK6GbH^Lgfzvc}gZIHWJ#t(Rlii&h(J*feik!u)*goG&R zF{goURn*nh_st5Vf^&RAyqUP$g6 z1i@j3u*S7Lg`>NrLxs9(^I?+WoN zD=9gnAVmyLuX2(ftb^!%x^A{||J27*cb&((r0`NzG&Dlao)kqUoZTn|x>DB*1m=1-LhBSZR>PsQ(MQe+8_ciMZ^WFrS!s zv4HeRsg0W={7yFs*GdCIr1;*wA|+p$2p7YD)Z9q+JJO7^tw0-T&R}1~?2)6Dx)NFy zI`>vaV1o_rAhw@_2lHnZG7tlw>~`S-F)x<~egJEx6rNKJX_k07a|^1{V4DaY+(@~p zMnOqAg&sVY-lr=Nx{WX!0Tn7H53B|+3-h4KcABez`lN0L(L+)2qlM*&F(fn;;~e^K>A99?{M>$ExB$XIwIgK5CH|b(qB{nG{B}B>0`1k7G;F@zWOW( zmmpoHz_IE)kXIsx^|fm)V1apv-_YAFO$&Ms%r&tWTs+IFG=%r((mb){L&>=<_|*OQ zG(;;x_<#85QEV8c4O=$hW;_HmVT}Xx*O{cM)Q2hUXFn8PKj}5+2Vt6?o*rOSlGw{& zpVSknecjY#3Be&FGjlUH_eqEDGciga&Zj-hc+f=|fBSZtPWCibqun`f zOlX9)Z$-+zdjS|NZf9o)?pj?+oSVEDm@i133;)H(K>0u&UT~h^)Jb2&43v&y2rukA zbec0cC~7 z>C?u-ukXgi8JvB+ix4l`n=1=F`JLjDzu&lohBML=4ZpL_VU&GltsHnuRB&4A-`d0o zO$|dm@E`0b&29qTDU=G#iFY4&Nq$6U?>n> zPW=AeO)y;6wdsIdI-@ztDD zSK;yO_*YsHZn<$C*8)fg`?aKRezUTb^=X}rk ze7@iB`(3@BugCLoUDthGvc_vkvh9?3#$&ELavvk<*5Pw^XAo`)=ld;lQoU{Q@z0+< zTd{hz)y~s{CpZP2N@>kyx{s{&?rU6J6X$@i_Z;1nfUyn%xd19X?+=Z19Xr1qw4rnHW&Qe+C|zn9-?ifRaodyDKJ`XA(Tjl(yb2Ug z%3lmGy`M{_Y5Vr=KUF14)4|*#qZ0Fx^vTRo;b^TGQLNogU%a_A3ADK-FAEjH<=WcN zt8fW0IlNshx%Lh$Xr~=g)GyGn=FjQL`wkp%0E4=t{=Kke<5@FjdixL8Kg?SpQ#~*9 zl$kSeKWp3TvLuI)Tg=7-5I}2FXr#rjodg``@w$k%ij-SS0?7*!Tt!aLd?<_t#WRpz zD(2W1HKWd*trnf^Hk3x&#=&7d$WHYBnklsHaee2|YJZeR+O1nR>Sq)Xh!iET^=)Pg z_hW%+^MwOm3}2Dz6{QId7ZMsOr*blRxpMgyC9MXg=s+LQZ|P?v2T~~*O+8nlgeq7h4Yu5v=3)5#3j5-@|u3_1VRh zG%~T!T2%x&E&wHaJTHf%S+o82zPI(TVIxn^cBdOlTM*Ub9Tm;L#$KsQMb2}s zIF5({n$yu{*SdaSXw%YKLAJv@(sF7&HYu$%5rUzkdS^-|kVypTl+&Z0mz6j6Gd`UX z&twGv&>2b%Z4_g8^rk31FE20Z$;CgvzYHejq(3hT2ccVf_HxD@h+>Ib?&nAZw7lkKC^5Y0YX)w?I#9nGXh?2 z1bQ7_mJcNz&opaqmJ7Ve6}mpiww29(KDRi*Ku9D$n}Ky4dKPYjRDQ777?_`1ROPp0 z62Rwi`f3M{k>3!Edgdz9z^>+G(PpV8kGkfUJ_x{uOXv5mFCJQdRwc1Z5++3du6k&w z{%|fo8uUKAf(|fZmLp&*mi_p*FCqWg2&?WP(O~an(Y;VyIuF3D)OkNTcs1|V&CG1P zQv-u8h^``^zEK-~ZSCbk)JHJ)`t4tw6d4YUflNTa@RO3Ad)?;;f%=Po27G@6U}617 znSmpn8U?Q84ucWBK}|udr)y&3)Uszxr@=qp*XLs2&Bx^oi=ZR5bKSZ0;8?tBfpWTB zni)nW2F)Re2?>TZ2glGi4ODq3>T<%cp=9Xq9IE;~|KscDM~JW`N3ZkH4P0FMLlvUc zv8A6OD2HEDa6Exd%^vKs&YCrAUXN7!vlPu^(`dudhHqm(TVi%82apjF%`SQYn`NE0 zswThh4NoB?5Fza)nSt{W`ddID%WXxoAPpNCB-wm~_KV(j}%U_e=R=wA*#5OGsOMzItM zEnHab(L5iIE#z zMpX82cYsp!K%N)}5J~K!HxnTc$}r#Dyj!%A$@BzK-8^;zkY8;$TXzGWjzdZ)kG=(R zhwgp*f|(91^!EfIM}vibb1uTWiMp48-od9KK>LiC+y5AcE&RNmkW(Oe&pCb6W{gBinj;y|4_fKSmSH z^E|{;{lATfQgm+Qem*mEgGnMAbwvf)#79&|LJm z_7@r_mBB@c0)dTCg7dX(na3z`2~sE=5|#r2?K~pMGPLh96UGG8QL_6>+!-Ms>+Sr< z=|0@me^s+6fW|B_Mujxle)C^8<~39BZ^i%N?P$Xm7@u6bYiJ$-36L8V!D2zxT1$;& z42Sd3ed2l*At<^@S!rWftk=DTf(!?nJ35aaA3wZ7miUUc?%e5w5&^yUOVRjpnp*tG zUQk^lM^J`i*h2vu@H^XI3G`u-5zh#Igbh4eD$4E!DHC_@)Y`>CQ2A|hEYQrvwYAqT zpBp?=A<9LVh;dRKr&Giih158fuu$WZs9wCgVNzcqfLm3~--%g~w^4-D9L_7;Kcat{ zhpPT~q4{oJb!hO(lP8Zz>2IG*y%QD!B&2)q-l(9zZl=13NDNhRr@eXWVv~;?Ibx#v zvf{q~^IHW#Aa^QqX_<+ot3Pnt3tA2s>3=dJJ!xXre;ibR@Sy+l-vjCEbrDBAE$tkl zpFu6n1soFbI1g0_Kzg@vRbzcDQ6n-j>xzg0SveBfubTmTWa#G%@_O;QjH|N!_L^Cm zb~A~4UZ7IimX;5?oS_kJ7|~zvZ?jg<**t1wv&4iY`*!cPs#QdF%AJoBVV=K#c7DFy z`L4hI>YU=fFUUo}!2;bTpdQ7grB@)-ah)VFW+NQrVpq;mPD-Ob-`=|vlfha(iJUjy z0$UhxTFgsGKtQ82KYJblEcNvEw)XT)j%uc|jgbMv5!c+XMTc8jMg=;ntSS6^(vVE> zLe;-`@nRhn6%{T#q4AKJy|#NpTeADmA*@}h$=+$B($pwNWQdFdA=XHzJK4?y>-m?K zv7zUNMZ2}nCYHB&n44QH_f--8HW&#_@HH$ugg76jb?erf-U4 z_j~XHU`bK7xE$W%KHvz4S1<_fA_jC1-_429(KbjiIFMowNFa3>IS}xWqhtO0_34BDlT!(;gXVBZ)!5Vr zbih@RUmR6>Ioqm!ojSr=T)KEsdRghmYk9Jip#F3)fDvS$2$O@JIyAkhIW!ze1yX8z zO<1Yd@dD(=!;Zi$$_S-T))nwb&nwrlmDnespTQTN(0`bsqmoX49xX3{8Ly+a~_Iit6 zy?!kU1(Ydm`punOe7;VT@)s|1XuA1EwreyDQT55@6`kKgC2FT`mL#GKSI< z9gJ$`VZjkZV_<)!NRgI~Z*79pcl}G{zwD|H&+T&UsE7h?CS2PlXCY|&;zFfrSF0uYGJ4sX`HgoqaiJSDoV;MMLD8;%6^tT;A zDziAjk4nh(EOI&!-W?ECo_>A~JTeYI_Wk>9+PB|f8KjWPzxS}#M?dvO{Hs zf(-E9+(O2P@VwL0E1~+K+znzr2a%I9K}G_N$*u(lU90#A67|DlY1wTOgMM{A-q3QI zI~uokR#sMk}5px%Ux;t4?kKAlWV4#~0?^`6shckk6Jh0Z=S%C(jW z`)KgK+{&P%xj{!*w}}|lGPm%2)!Mh0O&$yjUEh1J3`Q&RJtP;0)!V08n*nU-6>`Wi z2<8g3WCAR6)9w|@c>?@v(4fKGZ#6z*8jyDp;2*nk7w~}>=f6B*D0!ROp^)f0dg@M2 zhXVJHN?S#lMO-QnZj>_PIx3T@45e~jN{NTz)m`yu>lKP;vhTuwA4Ef}0?az_=*X0^ z-gcYv%XqW@$#oxIFc^!j?GKFoKk!x%Rxt%bWOi+D)0rQw1UcAdPS;Bm@`}Q}akM@- zd~CT}XrQ3C{EnYE;msukR#*1+?cuL$e80SVx|es3FpjjoT{V)=FwKTBsR`jn?~Yl& z4|5fZK=j)?Xf)^R;UR9|M&jk4!fSeD;LbQIAoDJin8cT&wvhq|3}jDV60RRuwTP!B z=`2(*y7OZt^Kw-<74zRevq<$)to!qiquz(EdgctPv{@D7YF#sA36FW&H_JbnMwkB1 z+Rd#McRw^|?G8;A*f8jr9F8>%(YMCtAZB)&aWyOZ7`@{jgODdWfT~I?fOymJV_Ej&y+sNT8@wAp^ICa zsk}H-Rbqsw17k~9^ZrJ;+sA`q6L|QOUhDN6fHYJ3&4L1z73g-jJH*KOJ)OZBE@}uI z18S;*(Y7a!9ou4|?oy5_L8)m|!JQcy>8(WL%0T&dKgJcV;xy{!h0RF1uF!b{#BQm( z!t!Nh~AxOsfCd;|PtD_5zk`R3SNMO!%$`O6ZQop5OSW^>Me zYRPh>N@&)Xx10z2&{-QzIJJQn1XY|Zz-CQOv%yy@qhn7X^8zKFem_06#HCj@2J|$U z0ZgsymX}-k2>pr^j@fhLLMj(3VN_MQ6ooNAKO|ZOXYe5 zyq_#4cW!m2q%AflH7|mJ!qxKn4do1a>>umTrWf%Nf%IB)Mo|(7$cqh*pTE)5)_sZ3 z)Ty$Yj@Kv~1ejN1(yHUfd-8U4?%LJiN#Z)S!mC&JUCh``lP5}2@ncVv5_YKgnyk6*`|lLBIOF8$)LS~hbZ5M4Qpjz7anPJ-p5+fvRZlIH*_y+ zsByUhy7P*~Zf$0h7K0c|fL+Qc4fc&M%goHo$Vs7;aj#t5YSRbzj?h}Xs`Eg_;HE|2 z!|&?lcegP$k0zLtw3~w4!$K?k`mL-)X#f$KYa#IA8WuAX0&meFE&uZyVUliX>3zH( zFxu#8yocShd`ZFMFB5)-4+r|AYH3yO)?MViG@oLn`_`&)+uk#*x&K-$Yhk%=FCr~u zIqm6$T+PB&ed2j|I7;MN=WF5XNBDn5ywtunc~B8t9AYWn-e(rcXU}bh4ZB6b<=xz~ zKx1PB^FR15N>t^DEnBoJR25{Xf=p+|b$#7;jgVggD}uYwbjubs&q7r;IP!F8 z1-adwK_i66;dYAbUm6R{E#VCP0^aW$8oR?moe>H~xd1%Bc4xu7kbutEZ&Lx%BuXam z$uiE~#QEcdtw~IgT8+40Jcl&gh5KbZ~DY^ z929}hHT6UT%E=eg5?3#Z<;*p3^VPI&gyL;xO&SRLC^Od!To&TApmUIQmJk50$2>2) zElaq4`*yu%!=$AODQe(fGes~|$l0*r4Z~cGk>E1%Vb)mV_Io_j|EHVRI|jY4TL%F` zy8(-ayW1j)=*zKSTip&g%Hk9|b5Lf_9%< z=Sg5?d*QU{Z;I~RSZsf|hzVORF*+!F4#oO^149Gu@`Dfz7~akLp?e9%6=Iftf+ryv zm6QV4mPI23ssUunB&s^9tJ@}Ssrn_U4K##oY3DiP0R!4X2a87%0TuBRS_pZOldBT3#gx3n z{2;urc;gobjvsD>_F!ICFYVl(U=cYi`w(e`*o*1k{)&eTw}^;Q3@{W-GShZadE3hS zA{jw<1{c)Y!J>{p!Hd^Nj47W#Ple$;wbrWdfJn*aJZQm_E2QjkPZo5s9CQs18|qr}uclSbMfh~vV~ z8i&-~z99gn=$fQgMyGBZyF2^T2Q&N+rGj$ssW_%2dTmVfYt;PuKi>Lce*ds9^IbvJ$rQX#VuVN!)vgUSbk^ zT58niL?iYQ-6t2iHu@W{zP5vr?BSdUoUI;1nN>$i%8}dFXI8vrmGzY3yLVrLNQt5j zuIvK`RM?bMuZjZzNDSQSXgcKGrAT`$IiB(tqNFXU#V;}kJ{>e@+0Qs8fEhvk^*M31 zdIqa?rKfPpN|Q~)5&kg{%z{adf=f4gyVT?SlF{zA!)iC+T>>N(@KJ_r4N*7CuySg+Ts zS{@%{-1_(FiE$p6itgTRiBj)ViZ7?Q_lzy^s`0jTwJ44yx{Q~U4kIM5sHCJ5J}vTJ z`JijbQ4rqv=1r$6-_UCSG4`#x3F}h-;^W8eWjgU<8G_^)ac!+`LR7Qp7iDFaVD7nV z4b=5Qsr$#_V3vITCk!?MbDUvKWdi&fg z776K5O-rcX{J5>a>|&ebgCWJU2XO*YaYG+#0evLbh^z~S?|xNPC4s0C3FZ^g_b5pX zqLXGQ0a^i=3b14BL9y#KbLMrZkbVTwaJg47+|{8%PXe#m%?zK8YCInGB-pM5(ll(? zuns>LQ>w&O$hAYs$++V5yC_*QmJIGO){6Kz+}~ zj0CS*G2rEIAk!W{w*6v6+szwtkdR#v!)N(pCjgQfxE*fCgO2_($0vk_k*g#R=^}Dg z)mE+6vUI8BSPdF;>6wJAMf`$S#kiFz()_PNIIwuTT+H%N$r}7roV7VHp zMH^PHUR^RzIrMMV12X(oobp!F@Bct?CHfIWWlc#v@3gdo_U{6uQIH*YXsRF0+RS14 z^oB1)!|h-vkK(7_%{Hi?Hko&dgO= ztM}g&uoBVqhdXW_L@5-~=V7`YHeo_rej9hz?Ju`VN|Jd6l)JRBY{P5r1L`EXSB#Ie z1A8vaqV&VB^uQ`t%C_^`2UG>cY?~bx_2;sY+ zx`6-MI3#Lkw~-n&3Y|goRxl6&Kd{Kt{neW{UE6o{VE&l~txta@)+lg;57|fT932%R z0=xWoVHT`))?3pnBPak88l<4$diklMfihLWV}gNoZLb@v*?We>>P!sHWqOp5>`zKz zzN1_2@lV@{(9qEZ7(=^(E3(iV{0B{UiRI?B$h% za9ib9b*TP2_(nj&X=I=CL@JjKhI?nsblZ?0p2s*YD~UKfyJ--qptlH9$CRwrg4HVc?y=^bwUFLU&D^~w$)3)t#@-Ky~VXqw%3cXgV6@Vv2xTU3z(xwwyawvPc zN-39KQE{<0PlY)GsA3r6%WwR4$x~!;RMom?sOvh+u&@kwfniQq>kn>GPNQ7 zf)`^+S^h)*IQ+T5?~{fr$@r{ozXw9%cDaHo01Il7f~L3O*wFw&U`aA07b>Q=P}ogr zpy2mkzY*375dr_a_(DkYJD*sZiW!| zQ_Az>3RVDPv|Ac7GMDfbZQ}8yli0zw%p_HgBAT8Jz<@-V;Pu+V%ihY)G`SyGWmB@U zxydXjL(!W?c9KyQPzW*mVJ2oNac$Fpt9trtT4}xVVdh`8maDgXTR>dts!|mx_6(f^Jdz^HIt@=sYbZ2EgQ^En#}>I45EKNvgt678O4)WE$xO}Ey} zWF=@g7A*YmQ((&@j?h9P)5O;CTrW99|BYOp%x|xVU?QHHm@EzYhE%Wf&FMA)_oFwt zc>eqNTq}-L?O>Q}$_?06Wro8_1{$V#rkG=b1@VP5d2%I@-V~ZwR20EX@SH#bi9w?4 z;#)9^y5dAv&F>R^uTyi?@W9F)i;t$KKc_nle6n-P77LEv`u=wc@~>YHDvK)>(3X^= zZ&-M+;MWR&OG?t?)WS>3X>@eJNs-VAi!5CG1;=5-)`Csq&anbGNLle!lefi*Q_`mU z2(jAR93xu z)t#Ie0`fJS#`lBd%%yGhcmMKH;|_g^Y-Wrh_P?!W>=ZgvPd-ZR!t1n=YZ>qi+ouhY z*NA~x+^m8kJk42xVgdwqjOku=L3#88YZ7cSSXRS_FMZYQE0-NuJE3#y++rBwuxpWi zlKNMxyx?zdiLxT?!dniQj;^jeKj5c4X4-qimQmX3?c#ihdrg#e6mjaGHP)4sfk{&U zgO~_|-Y%iT_-kwwXkQc$98(PIX%jPgh)j|I6>0WF`XtjL2KA zvIabp3z?*J>C~GH+}7(L&I_ah%wU|QzuMw_lN3uu8z_w)R9&XY@W}K>=IIkI5};aIegzPT%sf3 zB*iRBTfoh_PxO$Cg>pCqz@gV+aE)pxq7PVUR9+vX{?2=zJ8Y51Q zK-J}?7DkTmQ(4C(nD0D~=?&m;QQBae(dxl;RWyU9Piv+ys)hI8qN-Z}6Z8t>3E5+t z&&GWm1)f5<#4`!wIo;YNp>dNYDv0#>T_SA}*!$08-aq)B*QL{D&fI|CixZon9OnGz zkK^F3N-nMvatn2^h+*}>*aY%w(Q47!?S;Ts?qbxAa&PV7!J^%dm9q=-^RWAmxGU`v`M$1#lI8`e$v;9Wt?L2T`yT2o=7}P$rQ;+$}_2#Mv9zK(S`WQ9w zH&cyD*Z!)TZ+Osbe z2GRdF`G5IzZkBWgjaYY5j4BV8BEoq3G%GiFPVm?F+BAU(g%hCa$v+I4csdcksa#TY zB2rwa#+0A19#d?>V&db&spbr$K0Iik<--?$ym|FXe1SYE@n3K>VmEH_$X@(3m?7Ap z7C>~#^`pUPD6zFD#b1w%*ja*x?AG?sq3gj$;2b~%2fGanG9()s-mW|Oqn=J*UW>|| zH)(ot^5yxbVRZZ@@ds(a8!_@TF-fa-`%CY>eG5kq4LX(JOU!8Ea_cl%!ADn6Gtr84 z#vI9Q13z>4^fQ=O0XQtMWwXTdg?v0oyrekS+~41L0^Bl{2>(+o{thuez!RVU_4y&- zHJd5&xJBd`C!Q-LMocmew020xX`LVWE`M$OL~|iRDC*#n*l9VUOo?SLURdGDjoOra zCez98I-$UnhS#p1L@U7RiYARO60uAgs%R9#8R22+bzmCtUVbDo*Y>O)-v^9j=10*KQOQdUlIsMMTSEfH)+6pl)h-3_ZNi9W|9A_ zEzaR}F^i$k726!Ibmn&SRssfx=ggu)#G<>+iz?%2^D zgkuj-hW(W#1b8X~guopD;Qu+Z=wD4KLDJvpYl=~3;If}|;BB$0w4$qxvDu*f1|js5 zCr^A9O{+$Ra-3gDp|^r(&sX2yds2<$BudcUB43_v1r zj5C@ekf#LYO{N+``>61nm;=QeB}NumunV_E5b(IN6Uiyz>{x(8VM>|@bv&bOpRZ2<#O6Hw+#;>;W!y9ai{8MK}Axug>aA3l-v@j5emoyTu1B>^@idHqgbMPYd zyMHFVzI*70tDj|vep9L0s5A<{e1-y+lz0AdI+7u#UAj)>$vmfietYtJLBb(MOvyS4 zU+a?~#t{5P+*rab9GrB1e3h*Ls-8?bBwIvLRlMmxoZwN^C zZJt`hJ=h<{l|8o|njg7}azRoK+7I}A?cA09qYNc6pJrP^;&|mqA&91d04I^~WA0FN zgUU8h7raaE-X&Y79Y>7!`u!u54X7QSU*5U1{A6-Y zry&PFvf$b!C}hd--@JLVbC}UWr5h~>#%JL5-zdINuQ_v$Ox|B9VrRJ3m{AoZK zI%xBe@%H3?#_6=4ZeW$2ja|#;%_X~(Uoe^P=SXIrrL*&9Ue6L%Sql!qt>(SDJV+WU z*aNZ7@P_rB?CX0~+DgBj9d^#tA_zP<)Kw|Th|xucGCT=L7x`@4VO=X_{LkU0V#%N_ zS=jj(FYdbN|C~;G=XN(of^1QJ!FcRn{%*LV;|HTI<0niQ$v9W~;3v1*C$3vOMqjgk zRDkc&LEIwfiZ5rq_P8=+7FN#A-3m7rEX3D1_E;x+0CMuOZeKTE*Vk+M^n7kJp=oa2 z+KT4KgY){GfD_?dByF5L%Q3O{$QQZ_5aex~A$MzoZ&A(OJwCU$xFQEo#B16#xBZ*b zTg6WYmZI!9bxECsk{&%o)52d*Wc=kNk_jHAli)lOmW=Ru1yYXC=7yv8 zUF3}IP_s3`K0) z1zZUw(K@!bk620C5jtEsT>W@Wx{f)xi&!Z8VM`5|vp~XdR^}4(j6T z9Sq_MiPnwfRmK%op64I^-X=+Z zp6r{Tj@`++TUy#}o?ZY@ehn7d3eB9G(1zyb9k@E!5Kzb!{lWdCNrQ{YHtU7T2eyq@J&AD5HP{5{M6?Kfa~~l(l$xX>U)mSh z!AN~F{j2JpzoY5*D8^rjq98kAq?S+q|GjvD*X{ zgyG!0{43pB5LRQr>u;PwhO%X|t={eB0u<8#uvphxTu{2%ajO`>ME>J=L%q%^`H|aOf}S=JZ`r-x7&*SLhet?Yik2p2`hC) z#9)!!+%)RGypt%8_Xu|?D>E1!%Fq60K4f-ETOS6IA&|nOtmPg5lc568if1}_%SsKO z-b_)jDwcspDAky3L{bUlAq(xuNu{t$B(Jy((Rql|>w4@OOcfVteX97!4!=QJ*NZ^( z|Bsv}6Ai4B_pegUpF}_v{QRP-9TISjUKAmYApJCeN2^w2IH@>3R;hMCH5%vo^3T5mjpK1q zDv$vI1v@FAI$jK8YQr;Ukcve-Fk8ea;1e#D;qQiXf>EHj#JpI(w)=N6jjCuUHojXk> zQT)N%wm~8No@ffi*b?#m^Pq9b8pqio)oP6!@;!RF3{p2hPYPRXIG&y!M`|G>*0Qu8 z30b@v6Q3S1wR;NR&cAJ9~+HXi_0G4dYXK^0%NcHm#oCQF&1$eS!-OcO?eZ@ z`DsmjJ>$}mk7t;S#I$AHVtqR#de;Oa0Xg8+YltuIS`5~5elNjCL(e-*S*DN!)+*7n z;w*vO;*zEzjDr<)TlQ2ZMBiLmA^v8N{YDIc=#|DkcS`@(jsGs&r%1o$9~fok6c!N^ zlSj;tx5a!@2YdV4)biHPb@@40$GR&OA#tRSDnMQ)+C7H#6w;VwZysjK`Uv4=L(4Z4 z-}AWBQA>8A;zEkGnD44RX%j`3vOR!H1|TCPH(}~0UJLY<+3=Jf20AM4H2VGviQYJ9 z5MY$l%VJ{V8^&;@)xG=Cq7H5}$x@g3Hs#-foFvs|R??tl)3HXH3B*jW6*d@cm@-*3 zCRy-Xwyey^_@>g=L)CI51ZDGf?Kb>nv}oYW++0M-Du5nXl77O8j|Q)9=l*=TN_^d* z1;Py;zLNj$w)MClooi&z4DYQZ;DP^&QyxPJ)2@H?=MICHUFWgldDydRy2oR%f;-FK zefs#ZsI*j!9FS-AfDl7(DW!7uj}aZ;u6_G$2v9g-Zf344B|r;vS!+s$d`J8w|JSwp z>)b#2r-R07hBvjL3F{Tuq?e+L>kblMIpJunOjeIo?pf=c`I(V_gbRIsO}X7d?P`vQ zIFsmA>Nz*mOWe81*UM|QeQGiSBa$gbhQ+!}z5npf;LmRd985dD@x|A^N)AzFVMYjwloHCN}6G&8cl_3-10=+`l zw0`Z{MqEH5d?T{X=S+u+W#={&Xe{&}0#I=-8>1S!tJobCrWy zq-BTl#-vR>*DGiR4p6_w(WQK_>x;T5u6o}P21ATaT~)9&cl+U(Z|IVfnh z7>FWu;8FD!_a7=6FQg!jeFGHFuB^m3=}n=A1$;Sqq2=uNXy|&P!<^ZygJ$b`>ty1j zF_*6uSZwN#MgH5N4R4_bz>8IGVsmw<5Oh>tGSsM_T^9FWHF+Ka1D6uDPp&7?QD(IPakL3U=wnw^yehvZYJY=gxLAH@cLqA8jupF#xy> zf?Nfu;pPKCNiOysK~yo*8HAZjlBGgM!Hr1X2N3a%FILkdj631GB`$89t&sCnBnbo3 zfUV)~G+1ocW;~NWjH+mX>BnWR%WzO@V4>Q;;;3TshbhW3*P^6Ic%I}U zX=%@QV<<{9*9xjB4>P^z`SmO^STKC$70{X36X|q&j=N$#&$Z?gjS+u9oY&(8|Amfo zn1pubZm!`@l?CLi_Ou0BWw+1b_|@xV0Sz6Oi(xb>!ziHf?m$$>OMiBWve$(OVaMuO zS>CAU+DY?ykyg@6A63)l#+q9bXN^dH?lbp+)1TwUhBIAU>zJy?M+C#dpP66jls-AB ztbQ{8cH04q;~O^S3-$}@aM(3f8Q*M=!O9k@A(?bZ%JhE-_4poDLyUmlJrN6u3Kq0P zz!%|7>|=}!7Ehlphm9FL>RjXXGFQ`suB_fPtD9CY?%qkq*OKM#-U=y;$`>e~aBf9?zyIX%LK^j_0kA8&oh z7xkT>m$Y>8x&gin0+LuaB5f3By9SD&h*NufR$<9wtp8jNrlhiDI5bbU?)WyQ*NTw0 z_q24g9FO=mZ#%Ux{@N?k7w`8?s;W5Fsf~hu$$&ok3s39)n3Ohn=c}w%Ap>{e?~)yO z{3d~;CuIi6rW|JL;k%EmSeCW*MBIfw4jF%{S~}VX@32%z3Flr;>UXjete5<;#WN5 zB-dTKf5n&Y`QJa3epnsRTR3vDtc&E3X(~&nrwZVF= z?6n45h^!6uIo9)}ilx2a*brj8hxd}7Mk!72I`K?*hVvwL+2kKyPD%*ZBsPOE`dW$k zqhd*FOWfzeMyz1Go*W z3n$GkaLxq)v!LRd)8=~6y$DBeXU2)~#!#3QT;tGHqhhwX>pnA>u`|N9@r<2YtsC17 z)C<$oscF|l$#=v6`xAebHXodMXKTk4MdfM)?sHbFwT-%$l&#dY-O;?}e#)MqyMI@9 zx;MGos_=Seo3@x9s&Y%E^^$-9={{bp9l+ns)q3@(K2N1a52aRfbB&ORd$>*MOa&Q& z8M&7k*pqg|KQCEwx(IHCxd0y0w7uvrUb1-9`(q#~`9 zshE?@jF$TF*U+mT(u|{lDTILg#*20R!XRj8rVqLr(XO#KuLU>h@j0bxv&eqJ1`4Lv zd9gv@*hupb?|@}}m7>}%zw4o=yY1&pP4BB;<05u8w~9wZp}T*S|B}mIHe<-C+mK`! z{Wke%r+-y5?XwR49_u~PN!35HWr}smY#0^@Q5uDY+$^1jd40SbuzieqmBG$$;t6IKy@M&W`F@*BJJhs@o8rxVv+oCi`d^aD1INj?48_*g3GhE zJwIqlPkNQh2sf}T$sfa9BI}}XQ+adjaKqgKgpx%d;}7+D;vA_X_6vG*k+(6V_HYQU z_C4cV&n5T6I_nNwE?TJthHD=Boum9XZOG%n8>=70hMzt6JnMJYt9ec9hWXlA7tD_g zuwC_AW4D@;!RS_(v+s>)JRy9t)x4SdVeKy;b-e5Da`hKTUf8;Iwk=Esvd#c>NMuec zOeXsVnDlDWI=pE*PbMZGM2X9vzLKC~9KM6x>>V!=>`szTlsbAjQe%{-;d0Vq3 z`&RagC^=w}rlM{5Pn`+Bz9@VgoE6kG3tkp^V*aYNYw`#7)@;J0)C+eSymc|aH&GOc z?*=6{uW+>}|fZh$)$a$13OhHaYl)Kwy4`Ou!zrs*v<$XKU+ z!dr2Z-ua*LM!vp^YI`n!%qZ3RVdXexjNye}FGog3_IQ)`@$B$T?F|N)+eI8)y4A9- z>yj%2LhT~1UDFxjqo}88Il505_p%1sgCdtD4)4D0y|zo%(=M-CvI^&KZdCzqPUs>B-M*cK=an6$^A z8{1ZE2hH){Fudi}(v;u*Z{?32{$*v3x|v7!dM;C^6GNTU^_m_W_56r#JwXHaK!d_OOlqm25%pH9=cO9k$f!n*ZdFV|OrC_-0PbTQhd!ToQMi0s#tq~< zQ7L(ljNUn*a&JpQCJw9bYGm8(*KK)_~F<-`g+X$G^J2`+KiwD0QsrA@hS#>rBpgzjE5{ThsgU z{5_UQ&HS^j&0lhJ;RwGw>E<&Qx^9};wfEL5aZZaTzVOc*5?(ety!^DDmtx<0aUp6= zb}XIs(W2|TfAT-*v}3dT}G}MYj5~gJL1tc#6yR*QY+3cY8{rp=3fH zxT9IRWlZXu0&?h4G1fHk!QMlVo{o_S-eHLk#pay0~TC ztnR)$SZn_5!#;E8pZqy*;^)tc+B9h95gqmNbenE-6j#MR=~gk{ddXJhxQ1$u15S%J%3$OgCiwyPKT#vJjEt@aux7Fc`PJSiKJsRV zDX6p@-qN;L6MX@iHm&vQ1I|Wn;HBqNkK!|!LUn^Qi(#6T6^&ii%NChs+x zsEyG#*l2uMBe|Wz+*GYTo@p9p8jLV>uv2E2ejVv&+7-2(>m2loKzcV$JTuO zXdS6TOeT7TosTNO4#MfiB!PxePx7*eh2gdLZGODetbczDxHoy7YJ$IZ2fCw^4sRON z--s&!5l_DRnh2YiMNjmzM(S(ieVEEHoRcQ9F70O_NBx44i4GaW6% z)@-_9*z=B2+}ivQ#XYTF{Ejd7ZgwPV`OA%84t~Fq_*!?rwoc3Kp5v@4-_+~UYH3NE z-*I~08pCmDNcPzDhU%coVe8k|zlgjN7D`j^L+|s@FPHAM7*waayICyAevnX53=Ut9Xtmq#bcr*C9%dR)|d^Jt3|7(%smef1& zpq+1qO}j6)&$^G-(AN($zBBh?`$qO7hg|oFaV$}m6~^Q#S&~=~vFu_IwG;%%(?{3o zE=_ECBbZhMT%3t6*=tuttpE1?yFc=9@KZ|}k|0(A6Qj-qTFnJr-LXAkPpa?`MB`MB}`}d#0yUbFHV@p2GKaRhZ&9BE?Hk1m4)~uIU`I^{yU4f!OM9IZ|QbqC8-hZ%FmlJ^zUo^kT-A0bNWD38R)A_>AM#0LIZ;=^BvCT)CqW#AmA z9#ubmUTv7FXw=41ecQslHx7=BpWLQIDWOgMp4|chulF%J&`W8|{d$YKxIb-h-%jbf zT?bE(WjBuQUhsQKlbG|azu%tdme@1wWyObGE%cRNuUdD_^6a}0m;44ynDDUifVOB3 z)HF5Y4dYsO=rB8B-=n;|HF%Ks+&6Yf8ljaM&}>TUEB-I9w*fS}A=@m;q{a+0uFt?u zReUofooYi=v5n`18YGL#g*OmQ#rPQ0gFltQvfQ!TuSc@$9sYy6+xO&y ziEZ=)N0Jk|mrCBUx@@JE_f*ImNX{B|V{+6Z)^EER2_oC~#V5^;YZ%aoN~rLTC8%#3 z;IU?-$jvSG7PFiMeJqU*`6UjOrG4aBnZ!g_r>BU3>}8^ZYG znry9f+c#r)}YsJd2GyT0+;1_poEu>D;YN^Ak0XWoeULysHEIQES-5xsdYWw{NLmtuC?{o_v> zVjJ8Gij3!a1Ii5XHI4I=7<)w3-^@lWpnyr_G^l5}%pA(fmPsR?RaEFMHn41I7pXI0 zacAvW3d$Oj(HIL)DS%`>g_b&$)4(+t?ebIs;X;F$Lou6s@YV2Cjz^3^Kvn?GP9#E;eMQ%TKX;giP z9K2m#bRi`pjMW%9UQxb zPCz!iVq7rD>!T!RIbu$#nfk0(3w-9xNqlkn>c7addF!p-_GqB(KsjZ!2`nfgkTLScj?QXRq6%eVP1^g6gAn9uLt4 zaz*!J#l_)spz|Q!v);d(9=F_GEL+KElzw`7D{FbD!(+xpMvQo$UXZBRcIuAl{XQtz zB|K|>B_O2p-P?I#$5*xw^UxB_K1H0)N`L84(Z3sbU0CYyZ`M zENT+)=#;r-*#bGZENf~oA)Tb372>^x`J&SY@t^wTpZh)8Co&vM-uo|K8tuYTFMu~N zL>y1T6k8x)pw`1(Qyyobi5(boz$oa|@b-*_XWy7U`YefT zsBTa^)BCsV&|$Qr*^e%}R9fZfzMHgf#H({xQ+t~a{m094b{C8Nc9kc;ADvb2{XZ4{ zD@@|{HS46A6Sn5vhqu+4^d1tl#mtnzTRHZT^;~2zdq6Dmj%COSa(ZT2`7PObFJIR( z6sqN041;_FM*7a$@n`C7(TJjqOM2v^Xvr>av&*nmM0G};)6nh+S-%@l0n)AKomniv zU;x#9vuqLjP)UKj$;a7PcQJY)LLfG@FKldaB|%v)aOqO@cI{@~ot3$Xn{8`c9F*p? zvjw)1*6eP2yL5s354B>oy+u8a6zV^5H;wk+n3DFz8^0R&9u}B8rGu;T08Q5@ z&3;Kea>6dqV37F}%8PR9$bhbm>ssBKTgEjb;V*!0b>O>P8G9j4ZGoUkk&2twanZts zE$a7@;ZlqO*D$|Sm{_TX%uF6-h;r%dJkM}M<)q3CM<%`~c`Fr+$01E=gTPC1hRC`nV*k{`|@f zdp0;Il{9(kP_-~ZJtWiQ(Bx$EgMN=Z8ef^;_A&VpzmB;-?QObQwy}toQfN?e++xlp zcw@#K&S%^>7`ey}UI<}KVAu@CpV+tIPVG&pb+z;8uSM^t7F{#E;~4mW7cwLG$EjCA z`sK18SUOk9hkonYK)VgzTdz6>#?wRNc|gO^i4^Xvn!2dRzwt3O&&$fT7#}~qWa(1E zH!}N9a$eNcHARu};pT#jwK{X-)=qq8pw?|bJLQ+rDSrkHYhF0!?a{URnywlh!zbr# zU;8iQ_&4NbVh5&r_V)YQ9ewDyqwfLC>u4B`TGy)Ef{y!8Yr23%OAHhRHGM@Ai@RHg z7=Z4?ZG@2kRM>j1v4v{-HduOT-tnu+<~7<10F14>d&`*xBH(wi3uf4+*$>rxPmYIm zgq%o!lv+N3Tsj~M*S9@F+=K=@jAir#ilb^-mxT>Kqrh}K9&yYMmt_HOn3`_MMA_Mh zcB?17*oH}78PkW#tp{N8tG>UWwOx3zKB3mx}YBbRohh#DE2Rg_PW z3=9tT&v(oJcoE4;O-qxVwAAxk7lN1aYFtK|X_P+l#hVAmr!|ArzKE*qt*h&ZH)c#~ z-`6L#jfyPau|0SG$%tF74b?ui?-y3G@YCpfE3+-0emkVgn(kU8medA(`1&3d!4 zkw+S$)4Y9XMsus;WQ+{)3PXy_5 z7xG{pBxkRsn*F4?6Rb7=a3c0d**GtmkVw*^)6D)-Qr}YSThHjF`MAk9qo4p(uR3=2 z$G666jTJ6f{2UY?{lx~W-d|I0Wip&E9NqQo{SO;o%8iQUjLhRIeBn<|=XA%IppW)@ixD^gjJ`I0k=6npS6KeiD93icazdb$BVs{%mb`4*KCnH4CN z+0O2;!2G%oqmh3!(H5fhM@dbh=vKYK1>uC(v&)62YI^HvCg&S=K^&;EGG311kx7o+ zj{f_`UouK*wJYp)==hR1YMsipe!cT(yIZB5LAxOpoh;V{%C=qd7?a?1(;CK&PX~4U zz&uclXAchh>fk>=t*B8ICS50xd>jjHe9gUKo@(spZHK$YYg{Rq9A5R|c%O|wlvh0( ze(plm0K@6;cE3p}-}Ub2%ecK}`aVweAJE16rVoCz+__UgTw&|qStrkKihZEBBKpFc zg)Z)s`zE3^tv{)^ufF1{aXJHrPXFkBy2*|ux+BI`4d~D|d)?>qn6QSj`mz{fjtIwJ zsE^sBhx7+r5^+n!KTFUWOQ^P8wI-^NxSDF1qZYt6U)d=H$=)>bw+XKKupRrX5tlu z_teaBFDC1dT){hm8Gou$M>crKA1Ejr#~ExSXt%0cJI&8(HrnbTZeva;%S=U%~ zbIh+tl^z{R))|B1XJFCVW)hiqh1?=+Vd~NU*45VxuI%V&cvaSI;Ps26@GB- zieO3JP!8{wa|tv1QY6G6hw9__iA)woVgWfZ=jl$|Q!c1D!LRb*;uG|8wgtv(G>f0m zCCN(ll9hv}VwZtyQ@RH$9t$#8nOW{GA{Fp%w5R5!gBHX2Z=t6EPj7`_@j9eOda(cX zgqCV**?a(khIR~ZVf+1PnYz1{f^q(Uw&9giwNLkG(%HPezcC;yPOF)mPdlDB!=-1MUSqYuvcRcFc{E%Y%@!gHp=K0>c>Aot^ zQt#S`gcFH-WepD#4=d$D-(DDRJbqS9n|bswf!{wGAP$_~u(6e;<(Z&w>D3D-EUAkM z-1+#zFB;OI&Nmoyuyq}V02EUeS9fz_siCQGbdupHVG0P!pZ_!S_oacHFA_;2@EeSv z4Lm-lFcQsm5pPKG4db=#;cV&rT{6$Kj*H&D?&jKZz~quyVgn zj9J9UtB*LN-{5m4Ig8sc@?1ixYl>}iQ5~R)llUsJz)%bPV?RB>5H~B~M6Y3Xg`e6N z@2sO4xj3=KjwYd*SLY6QXppQ`we#@9?dj`GHtajP<>c9!+UM*1JE+LqW_jN*pCJNf6rrV6H!tbno z_o-4-BlM$%^|1BZXFellMPMiPvxfldbHe0+;k23*f7&40o{4lg`Y!2yz%&cX{x>Xi z&R)AjFc<~_|5$BBL5A8FCJvs4S6fhwmV{6?<=f+6+{*k#w~}{p49P8g+6sVceGTQ` zKR-CrZ#R~$=c0d-(WGhk9+vJJdS|F#LC#cX!^(8*10_%;;+q7RXYZlgo-6lT=^Wek zaAF1chVAp!5fd#eJ4FV>s9SWkFN*Wb+pHy_Y=nZ`z-G1eV8N6nV*DC4DysUO@bmmn zC}51lf$~FVX7&T2__js5P0O2fp8C5~I*uWC{pE}X7Tx#4{7O?M=2OO43UCT4>ZyWi#7M2%)UbnZdH9O=Q5v^T;>ZC1-9miilCrtk-t4ecGP?wwNO+ZqD z&E0}@I>IQQ`W?yva{>sH&3Zx<-`>|;RBh|KUAVd>BI~^-^)sVkq~_zv0rNWa`%?7B zWBR+59~DQnu$aYJf-zEM-@Kc|b*iDnC08HAOW=~O2em3Pj&IC`M(+j?8R-<+fSamW9o=_&)V+L|>c z2nZ+$0s<1!p@bqGBGO1ogLHSN3ZjH4-6>tt(jwh0(%sz+cedw#zfO6GckeZ8=9woZ zZB&-T;iWRy_#rO2@vsU%#42y$rV*u}%1bh#j?Q2^4fhh6y;I*8E82Mw>L-33`v$qp z<8_w@*P<7Hk^Djrl|IR9#%gho-30al(EX;NU;65Ht$ZNZ!hy+_k`_y1 z5406Ty#hjsv=w>+$kzhp4g|9&7uY5P#RxP`93St#<|+(q-)dZljcD&yKZV&7}h!Ku9!C zp7b86GElzZkPQD3?)&8xO;*Rf1Ey~dAJBKRDeTKgtmz*Y)8z#f8xO9!BhGpJn1Knfs>pLXt}UcT#{Oy}4$ z53DvGE&omt(@CU9ZF_4&K&96UCkyd^f&NMt2z1cnGeJLrEQwxyqd+=;#MBiCpA^c0 z=YVD*(ng>^4O9^a&)92d7t6dNy}<8oe!si?C+@jm(o4P79+(t5`|4FJPZYF_m z(buv@w`Yj|+ZNA3*oG%v%%|!nBqa9se@{#0!jtI=Q_j9(efp(c1oQ; zmCy3; zpIL=(_DuPfqiQNQ*&6uB(S%GsF5U>-IP*RrulVvw#ID)Z$NY;DynbX{4r?uN(E!ET z45r`##NfhpvpQn==omf`#LN{8kAwi;+-+zuLO$b%Xi;MO%g!E{NUkj@3S2o+40pWu zV6prD=53Nq4{twk=A&WrU14sKA0I9xyaCk_;djuf)?XwqjD4B6v5(( zf|)As0aS(k~*ais-!u5u5mk@grfQ3WWNADKCvK1cE5on1i4%(|jtqX?FItZu` z2zy@zwKQ5DwgP{FAcX86U;_*dp~gmVp&q;yz+I994>~hV+hB`H$%^ZJw&(UUMVx{y zT<*TI>(^wpdQkBg^~r+mlHPW52z;0ycr+*V(S17UA~KlPQIO8aew;9bS)lLU9Udr? z{*v4jd|uyiUZD^9MB2WBJqE38A_{bD9R=oT$aVt(LV&*<9*#`t00AIW(2lVGP@y*; z6>h;Gl6HpAhwxc}WD!=0C-|x#=GWm0dj{Zoe}#W;VS_hc6vl5fEUYx>?ea^oprHj@ z5o>#UDF=7NOV*xO(w|D~Rd54nX^@Z7>d542APr_(S5MxX(a~xpDdW$7ZM}br_C_%) zm&i-xVBoiuu1EKWWS8BF-REVhz3-zt91Nv1?W#yz=8iO5R#iXdJ@f|!X}jm|)p^{* zA#xCbPJxME4%DnfVzao=Q16#1f+@W?L`3wvl>ds@F&>?qH$XxN3lEJIG1x+wBk-mo z+%34S!NC34Z2Tki9M3Gqrr>MApQlnAGXD%*eh?g@0m>6r8S1tOmkzX~{919Q-3(AJ z#&jWl1`7Cl*mSabUbvOFJ2S!d3-Q*3EMIIjwcSp7h!&6n;c9y=h)%)d|0T%SmVnNW zm^7AJ_zU41Su9oTMCzbyO?!SQcc-Brwg<9UvPdkgRt+BHZBSJ*ZCT+sQf$&xc8!eq z%`~FV&d9~mhsoF8KOA*jtmdWl}g?k%U1Z+O1GXDT4o`72hZ)B?P6Y{0)2*DD$o9^ zGk~N}@%cV~Hc8%~N$^TiReV-eZAY>RT=Fjd$_pt6R~* zH#O}pS=(iq6TJ{^{$YFQ*_vlMS$f9@gWF&)n>D841&8nDZG&chU*lbeYZJ>ooV(oB zX+zIzYW(UiZ`#ssu}A#Q>(4bc$LM6HAw806CqEoYz=!nX_%aOx7|2A7hEUK7N;1Qb0USTqmvNrhGrU@tsXju zjf3d%UHr|F4NO|1F{p5x!GJbC_R>vH z1qa7wLnp_H_}x4AMmd_Y1P-uR>DM*lMw`0|%ZHo}0@MWLgeX)4@pE5F2z6jk$oTv) zpTc`97rRxW=lDVBd65CbVYgOzWhi6s!|l))UqWU30bc?ytPa4j5y3jRcC3w*_(P|T zOtP@G@ankyg0vUpEMTAj3Cn`8niKqr7+fJJ8Vu3kI`S1RWrNj|>gwum|At_LRTri~ z5aB?qW66;q&uzTo|8W7DoO=P$HU9ep*`?$QdSlyS18otx$AM-f0c*Xn`Km$yl#tv) za9x(kRvIQ4XnO^81K779g%=5ufOH~o#Aqnbh)s0Qz)p=aMERk-o@KargvnO_qE zsN${HuY-m!93QSv5Q^+aZx%RCTF>s3m?)7`%sj0=kv8}>wanvs@E#RA8TnJZE>aD- zek}57?!KyVdR5)e{GUCxIHP#~p2d1|f)eY-&ED)yJ*A5uKJe#nRl0q!#J~JKrK6>{ zs*8bM(-NIdE)=8%Bb`G+wXki$HpynWjA1>c)Bj@yvHQ9hqb4`fKV_g}7e^ zp3|#%kw1CenT|^^y)oVFDcU91TuBs2^k-pZkbA&A8~ffkxAn~2jVcr6M{7H`XLmi` zU3E~%UNKP*O3@W;i(u%CEzgeP-lS;@V-jh{x2Kc+)#a4ni=ATJTQ$L8S!tazqK;lE z4IiQLu)+O^dP^$T4rythjFkD(}L&q`X-uKg8<0a5hTdNYr9l*g121$M6-aS z#D0-w*dDAR#DaTFN&t~YvOa+PAr4RrU{gAk^}2amS97Co#{DH=kzDtPdw#Kg(@%jp zXb7cNp`A7qo&EEQvg+n=iRbG|t@Jhe-LTU6-V&w+KF$F5g5S>z&({)f{C2KWNzM!` z+CBk59ub=Z*lbv}0Y?**CqVl|_YwMN@~>EFK7IO>0&w%=SV;Fo^b&yKq(hT&21|Zm zNN}kASqJM0P~swb5`uSC(54|8&Ft)KSky3p&D}fziHPgihMf1%!-=3pM6{1+yxgF5 zgwPX>4I9l?z<8y>`Uv)4?c3%c){2H+0WpUFdMIMS33v>mHG&^?-ig;aJ`^o_G_q(H zJS=&uT^+RdM0df0LTAsHH{jYrnl$N0nUos4oy$+{Nu#vNrBr~tU@mR8FZM^sXTDYW zi0!_qUmo1Bkb6qVvxXrZTlH&Uk^opPGD7d8-76#HtD}hlQ`}{l%pVDWq7p#3&xaDy zgxyf-k#FX1rg5&e`_P8J(eJro&5uXDV}15@um84ad`>Kb0S)G;T7uq#nlHk@1lAv$;;3MXi8$_nt)tz?^3 zYS&%uh~#=-zUwiw+`o8KeR!++QqBLvhidCl`>O2T6g9PC)zA2ytI?}NF^}NiY)`jr z>F=*~9$?59HLFu~RgAzX_^zNLvtd~bUec%q zmV-mP|7lTRAnf&9u}p_H6SWe)2xw05?|B9(4cd|Xwh4H7=+fU~KPoiec%JsUexxIY z`)2JS-*lrtrZvr z+~{X_`38*GL5U@1$A`!G2UKdHE{({It9m%64=6171>Ge}aHk0XTLal_dzu=M90FdU z+wzqh8M)vE+1^{02k5gCz&*rWpnMi3!r7v9D(RgRHO&IC+W>ZRp-O_v`pCQ4wS?j& zsdkqX^ZB%?X^Fess1+sB@VaRup{s}6Yn@tRO=nv3S`3TgD zGjKO+`a_S7UR-eR>~MTd5l*rj>W2r%5Fw+pSu@LS{yY*|NGT#$!VkX7Ae#|;n#fr> zS20DNxa#F3u|aXY8rCALVD<(q0N>i$+OhdLP9LE_q#h?a%t-N21N|jWsXfJqF$D#ouCI_DxZ$FF0{Dsg{R{QQ4OX9O zEph~*R4fvT5xD$`Ty(d9XN(M)fV;7_pRg6ezzgJ1P16U*Fx?|wg3!@D71sX`QwXP= zbmXhDnMblf5OFzzCP^XeZBUrDZx5?qC+7!j>1D1GE)kJ9j7^35aX^FtuSKFtA}&r& zy`N_~q=_$d4z_e&=B=GXu<~&f*wZ(h?@qsn$GRerDfc?loO0u)&koPZ9ePs+p31Vt zg<8S0g=aV6!7guJ{;Es8zEQ*U$#W-QxAsE#9D8E1t*ib;T%}~a%+17Nx$UJLdkZpd z(Sh>zP|G!`66RKJEE>L``M%O?Jm{4#KSysUSPb1)OBYhd=KQu$N|hT<>?^G!-$EL3 z!Xk4<)l~KHETNv~r_;T3o79Yf(mP+~H9yiPj8`-_GM#P_j{Bn~-SIvr^pZdB8(2GM z_Iq$&f%eMhSFz+oWPXwEuEweSvb0OvliB7(icuP-B3Uyba#ek3nGbPfqi>JO&SY#4w7* z(11mA>83P3edInCE69BH*H1{!igx*>V=<@uWlr>$J)jplHqOn%&CJc^fcX?0{iYjQ zafDbjQ>}DRVNgSvI*6ma7$I$GnbvrYcfVnyT9kHH?tR_0^8k%kAPM!o`hiv<17&}8 znUAH?p4*Q}4g2v)J*l^5Ra1f|2{@U{?QIN`58EE?E*9jBZec&O98VRW-#Hq{7u+|o z$WVB`&BOBUfQ}YdKxepH;p>d`FLYG2#9z zZ(I}^tpkY%7uJ>dqAomGD}t!R9-w2+bPPXMpohv|(VMof7Bvwb722#UyhUEEighEN znre?826d!|uhA-r>Pz+S&D7mxG-ok9)@yc@M}7p;aae(D2wx1*HMY737>S`#JF=(XWT%$;jf zQ%U^~_^spbKJx2H(wH4O;RdSTe1gWM4U|q8M8rm)-lkJNn6HT^DY?BiN!LI5S-(ey z3uSm>A9z5~z_3B=qQJ|#2tYF!QT0Gu2p8r_$%Z93GlDS+@F4#Mfx`B4SRIZbaw7Fx z4&$(40|%Co$*`tEmT;M19vcAw9~)dAphooOX@x8TXw)F2EY^G#WJgs6**XSw^@bVc z!m&AZ!sfvr>ur^i{$TUay)HtBB?mvMH2K?ZPdr8yJRiB%sD#qjb z*Djn$)59+4R_IP9jNGAIsaH9D z1L=fWRu3x)-FjB2qFxg*`NGz5os#;ElP$WAMQlx+DId)-b)0)GP7Qx?JEvV$Oe z7#u2_5mO*A;Sf2`y$6(H_%7C9a{xe96Vxo&AR_YhfBpZC4a>4vSFwt?uTr*t^Q7;w zZog*qvup`?Ei{)eZo8RWu{xT}Nf5RCn~0BrpQk(Zb-8L@9v4J_C~hmRJA-El0pqyO z&MHDw?I#S!ye*Hk_tgKGAH~=%))Suh@~wbY1dtx5 z-Ju@20Oq|IiNgDphoq0_#DqhdG}X~Q3*<^CC#ywaR-z35ebYb4Pb?Ho{k~h>W!;>B zd99_i6N65nCEi#oM;kt!{_4wQOHZ96)S~6lQ;nDIJs*Oane>hiV^B1_G91PamxmYG zlyb%zU|yeY>a5(`cos!kO}$gUV(!N3L5_M=n$@lWh)W52px?173>|Q@cUXN z^CtLE~ z;IZUk7#Yt04C}RKV}kLk=c}(n)YjIdr zZG+++;HX8OYauZ3!qeJ5icB5Nz@ zWy+NunWHV(xhY)myB?BED(v%Fo!N%i$-f+yHE3tFL!sB!rxZ?OWRU;*{wQqvEv@UB zz%UwZ8=fraJ3`5C=xu5oklH`_Zuji?{M&asLFMR}r`@OfE7|5Ywq50PB*xBU}TQ5tjTns6`B)Q%?$@Sfg1bqV@eC$ckk_K;?A5;DB6h*byQ~g z7>#@Ummd+^tOn_dm2R&N<4;=Ta@HDfV>3_AZ7DM>7n=|<-`Kq-+fmDE;ltbWocncY zodn))et=eYse;Aib$4|hX9@h&%hr-AvWm~iHTRyg9-^Y3I(i1Kun<^b8gW^m-J?pu}JKg|lpliu`} zPwPsouB^BX_=}qp6=rT4UGRB^`Q;MJrpTb8_$lQJjEcHMJQ{TKue!0? zTXC-a5z{5+>-yvrB(o(sWGS*q2b}3@oph&ER&ecl;$EWu>iSA~t8B9N5_{0C3YXg3 z@wQ1FG1Jx0ety%Q*SLzT>S&)@Ms~JzPt3RU+A^vZLb_%f+sbZ@*ofu%OWu>JetfT$ z!77!#b)%=}JRw9^!c(f8Q%61|uQpvC^!|Y3@Qt!+L?wihRD$|X- zFD`BCe7Yw5l-a@H6Z@m#Z2p_9lx2a$`8)AdszX8Y=`7Y~4L4B28AlryDJN1bNcg{y zV9yUMOQ0~S)kNh9GQHa)E7PYQ%jW9fAsRPQvt&2Iek#_@S@vhKpx=C3Z7L1|f#F%<{P0_}G7I0{@7wL6jIXKcyX_?<87=Ke zq)#1gI~QqC!g}?Ws4(=Jio7QW3BQheO!57hMEfR7oI+qeDP3`{2Ee1{{6G!KI4ml% zO&fiU=L4h350IQlC-9lqq5TU0F%$L6UR(&VEiLXdao_?eC6JGlxiQJ*dRF(5NNNB( z43|Fy;>(SjrUu-=b zYqI;pye2GXl!~?e%!6x{tyo^)_YyZJzAD>N>|&p^AN=|p|)*y^zeAdu6KJU zoYy<9O2Fq?yi^OLW(s|M!h^K8$^Le&r+r+H;vU-0msOwHPIJYVgj_Ibc4|K2qYlT# z7`l>ZYt7oI#HSPUTd{rj=nwc*X*u{c|MJXmyrTt0N3Gr7SXGi`06+!+KZrc@&CY%z`{adZwl zgR}E);kR!C7T=z`G0ZG1{9fl)%6Jvx&6t;x2JM>-te%lqqcZB+H%)12X@pw=*iHdN zk08v@^V2`onr};?Z~V`cv_)0;qm>ys-Lmt>#Hs&fOkw1psUrk-b%zHQJ$K$i1%>b@ z>GT^9H7(C=--a)pb~*$enK_Y>@?)iI_y#%cQ0eb<=1mej)>%XO^+s&@AdVlz<_^El z;qtwb=u(1yt4uNL4gTYe`c8lXCG6}l4>yP>L7iyA@a=W48vd~yosvxy_jB3;XVXN>lu(f3d*sAR{A@iQCc?`mD(})ehWRokY=k1yOr@A@SXce~x$-)T*!6 zTAoKwmU(pMkzo9E)@RGFQfI1n4`)#hUg%u;VbpqaW+tF}G5HZOn#a(aBl48)eaq1U z+v%CxCbhA49@a%et2ns0F|zx8cMIlUeKhhXi;xJT*B_j#2japu0C>neGhYgTz9?Wk zk&kuW-=O%HR`G-P;Pu4T4MY$J+VVjx;ZJzrIfHO|m!NYWA;utQWdczSNZhgulie9z z28T2UpL1`Ie5$!6=4`-BdW;-J;z<$_$s=2(1qlZ^wI}D7p?a61hry5)Va^}nF)THF zQnIy0-&n1?cm<8y{toIhf-!WO>c||aniB^inx0EOOZB*pCqbscqwQ5n{Z5`sC5wDY zy(Ws~SR|(P1hxN4jrR|IP-5%Bjf$v{;gBJ^Gq{walb+&<)C~G!~^EitHv9;lm zCuN}pLdS4*m1q=(&_FV6j4-w<+Ov>=Jg zh|UIJOoX%!kRd|1LOl3jjx_N#s>EDT^y>&|4ja09&57x;7ljCVPtl=K#r|1r3Ti}p zx9R`?tqAS zzYz6;c6z%%dVOu&G5Fyw>dso(ckcdnVC{D_X$suv&XkY%TkMR@J3%P6YhWKTrd9ajPN_M6 z3ya!CqDM86Q`q6$-|ZfP(&e?a$eE|8sIv;`=`txOoQ@atjsExEZmj7nf8pQ_IyU(u z%T>)0>OjJmY@HIJQea0R;_vd^S<8iruf~AdV-!Ck(0sJ(2}fDb;-c7v2SaYb*QmMr zSYAH7!hL&_Pd7fiXQCOYeP!|BSseFM{i&}kD#x>y>=t{h_NzzJYiq9-zeo}8O)G@w zj|ufRl{g=#n*6LF!X4;4t&rZdw(aEKPo-dF}CiyvA6bXN8v$FwNL|C^jZ0Dg- zASN(OC$NZ6&DlKM{7r0*TDToCUToU$C7;gB=AhvDaJGB@cz5VZ@R`;XO$yt~Td5!R&;bXYD%i~`|OtrmR zT5~k4TGK#zjj-yn6x;tcvXbZMz-S2Jf?mMn{a#&wL(va5CJ@lP2y`5!&CwgVQn7dQ z2GYp$e9&?Bmu|WAuc+Rvj+cmWoK+bO(n38ao7TDf?xgO*g6AC&TOWUGvd6B?S7Etl zAac#{ZO`gwccRw)uk|cul({wPJUdscPJd-ml`S&JKM4GQ6>-(M|6Vpnd7>0#?I7_< zUrHT4 z6k(Mtm0$DV)gDBai=oUK(ZIBQvo33OU2Jm$#EoWoRsT!vH`Y>w*T_UhZePe4FJ?-a2B3&UIY?1E1Z>!78g*WRv?PoYI` zkC0BZNiEEo{OPY^>+#CwvgOHc)RyPu6a78`u42moCDSO~?@HP8GpR8RO=8*e7;e9_2SK;V5aAQQ{9OF;+|v^4Zy4>J3@stIY%o0OS~j z&Ba&_?Tr4pR%~>UQyaiHL`vFJ{t^`{UfRYrs;|-7s^|5?TGxtMafZ@Zu`Bb9w~`6x zr>4B>w87#0l;9p>8jb|g0Qs!!O$?OZX7Dcn3Ak#G)W0`SO=qapmw-i+3jEN)%(_JQ z4#j6+Li~V;JBUU7H^sU@XW3j=Cm41sUBrrdg1Qeo@Q*z)dKyM6sv%>F&FD+JH^(=& zpA?vRSi1EE-s?%9ebJq=>Nw0cP3%@#BA$_F)WgqBs9EeHg3^^U7CUGC?UHZicXw@i zB}=z*K(@&Em@Rwjx@TPVd%mYwGW`uiYSRHX9q9y^{yQPzpy2xiKLV1}iZpEqh5h_5 zY_*{omQq)jj;acM0^VgvkRv!Xl?WFwKz!>1z{db(%p~!{aWDr8B`joFAqAjBSnM&} zT^Ham4A#;~4z&2wb8|2LKb8wbV(B2gK%A#QajY(saKS(+~)v4e&Tt~i0 z{apnCJowM|aKVFCAFL9 z1ierKR?PlybD7wx$gN!l7G+8Q z&}a%4wP`$()l}DKkzhY={oK!Md;0U1OEw`2bC>jhYwpY6>+TcA7y@SM4+4p5Lakg~ zG=~VETbvv#&1I_yA8)7UO2!oM^scXbA(LBow?s;0y!*2%kx+iAEHn?3kATQKrzhoq-3^D$LwHf1|yniGjrK(^FhR!YI=a zN{H4K14YgNR{aJdi-h1&5KCqN9QL;a<~YP07YTxZJjWylPW2kMC>U#4A*vCu%S;DO zd}YKQl0~Zvn&2bElpNM|ATdY-Z2|E6L&3|iL|7prc*sOUxVWfw-maWk{`p}rjs>k8w2bqx$&TlFJ-u(#IOO#h+)oXGM^LrhL=2Y9AvAlc z3CXkwffSbEh}i`+9e*M2uJiz?aUMX7{*Z3?CoAr1B3$f4Xk6BqzU>J0l6B57%kz`)tJCokr#3OPo)6@nhu~2s7wB z*LdrI%H@2t#Q(dV62?CY9WpRb51FyXCgsUCIv=o;>Z{U#`%J#Ah?WdHt~H`R{Eo{s z7k}=sH2g$&>7}BA6c-NqTmtG)v{>H6SV=lp8=IrwYm-S5I@WR`(>ptgjz8L*IK}Y# z!G9^XeOXH4_hebzx^u#Uoz&PeB+zEo$wQOdxO!6Dlo5|b^Ar53`H}rf^=b#-bQwz9 z%Olyb!gBO{{NhJH8eg0ewC2t><>>DUjE!q7pE&qa4f3rH9HhQ?G#)84kJP&oxmT6f zZ#%}$aur5inFPlX;Lb37{1VxC5?I+cF5|+dtiQNe5c90w%P{|20|jLY;m$TY3^a9u z5qW%_E{7)mK(CyDjjN-Ki+Wp&?K;3{@#AU*i$Swv6(r$5Iw#y|GN&}6ryM6G4=*Ws z3+5TojTpBsc%#5;22Z5mjnCTRFt~~WSA7xuSIV45!7Yp$2qqybzW>@&`!%lPEpTE0 z&+Jxl-`@+!8xBouFf97>K0fk(g@c2WD87?)jVS9Iw)xY9`+P+vIcVta4g#6S?8XMN>H^<)sof_qT#KalTOX{c zFuX9*fY1OIz(T{WbKWx>Ee(W_ZCOBnpq=@>vA@*&0YvdVMTRoJ>k|_0>)!@tdlQIO z!4@NfNc5lG0#M+lfWLzLui%J*Z2MnVIawopHaw64tk)z&s|wR6=Bpkq2c&V2hYPw) ztBrb3u2s>OBuSl;hcYV$XmHm^Me0=;?~>khKYFAcyQWb#!Cf_BgOWRP`|Xx*zm>K1 z%+`f|NBp*!Uky}@Ba;dG3(K~*C~&e{8!pvaN>&}^%~m%y#APEE_EvgN$_q@{(RXV! zJJah8?+lnkMW(w+u!Gk%bBO)m^%!iC?lN}e?Y_D`(Zljs1 zf(Qo$lZG%knD_?kLc*TmN+0-oiMI*a=hZPdmq{sNxOyb+Z~`s&(7Gzq>WMadeL3ei|h6s$mtE zhdD_|<>iTHkp-&Y_)8o@LaCT%sJMlzMt-&Pf#L50$aXb+@yV*LGzKXb)TdFxk?nrCm?JN)S<;{1One#Z>Qm&@?_CRxjH1#NqcB`(S8#x6E(pH(^ZodUi+`(55Q?LOvBlbXITrdlv`%A+jzbTg9B^CXL= z$fB7xcmX4N>vL}Iz8dos?{3x4)g%M4(j?JTftBUUu6kdL&O@U2%cKF+)kFD!)oj=Sxp;_tTh&UnW>6c0PVC1tMo+0pdeOleo z5PGt}x0@ZY)xp$(nqrO#2Bf6Uw^sUMJz&cAXj!s7-yiE<>dn0e1QWgG!`dHK+b*SN zr4f^5?tv*OA4GK92|Jq4Y!W$Ds`hIyFJb@+GCYmlfB~crygEQS!8lQxOp65D1A%}` zS<~|_QW?+XFk8d_ApZ4`2PE-PJZw?HvU(pM$rl2WE7D~lhFP=4d8NDuY*Yc3ysbXF&ik98ai^my?7mb0ILg}7oZu5#kieq)UA@rBg$xMW%g)1;ra zgdfs1IObqc2yN8`gyC=?W`QiP3!Gcnw$J;FDrYHtMl4Cdlt`6MX!T9C3kL|~pCUEN zc~?A@#B}HIFdbYaAiGn3T{egL8A9bkI6Cmi6I;*7ced8K@kveA{NH2<9+#l&x01@zH&x zo#MReYbmFZpP?r|MIC%|B_FcriU872F{}1U`@he zel00gCg=W~*o$C#e%O(5KB_c`ya&uA(bst5G5E@zZMsm-dROKBzQEt4wwAuG+^wmTr(`x3~&G#2Fx|7eX zYQ$XTfV7?|C`Dlz_{6MxNu=(c4SZ-}>bABH~$13X}fHNgU>FxA})oDg;wVk{BIM`Zbu zie0T41Y{{NzXnnZkJ<^&N}JS>@QaO*7|jHmYH75XofzqLv;jm|270?Rhx)+@My^rK@M2Td*aV}n14#pRC(P^Dz7g5U)Nya;& zO~tk~gmmo9hq7R&t{8N;CgsS<8u_M6Jt9T_*Ta8{K@@_pPJ%Q(32+X8v;y#)UML?u zJvy@5P+ws%U(|z%8j@ip?qcVzfp`-M$3e`V*WnvdBb!K2ts;JMU~Mt6vN#R~3CGZ^ zgU?@KdxNkSm<8iJcpwRRa)>W2a8(f(TtIevOU>0_C~pKOgfG$&?JO!L{_m#m+)r-F z#r=@52wS*Nmc=NO86BHc#-EX61+z(eD{RqfL#2s>CR+zCN?|{B&Q;Hf4JsQ?#N)2| zu^E|J+qi8!1^*5dAor!(P?dl9uf>L}W*i_WAz=G6OHw#_r6MEzkkt-d><{&MVK#GP zfom?SEIcM+H_+##N`Ck4&b7|AL4Hz3-{CHmG|zQ8s)s79+c=4m%K9*37E7 zW1~5fWE>tcV<1_m#CUqaQ~(Puz16X5XevQ*_7aBvLZ)pTft22@R+@w@&}JeICg5XG zl*{t(>6(hUi{0Z+99k{6TfPf0n;bVD`Q4>`7muUqf7zxlb<67I(Xuhn&;(xNfon{X z_+`G_*SDN0VWGw9Qdgp7Ln$~B+yp7aIOWmFwD4|xgw!zP9Y=B*VeKqG{kJJV|=i42g@iKajM7ZOnpM7>>#@gR)S-6P0r-IV@iVl|ul!^hf01aw9 z6c7I4d3&6M}Ln6(Cz^uVmrTLj$C9Rwdz7Jrl=LyewSQ4DVdKyXUv%aC>1eP zLhhQm_6V7EE1P=&cp)xdu&#iJIbtYn4|#Za+SkFM0SCMTVTZotSMl-T<%AtscCWO=YrSZ%I+_$?6lO1!F(RdPIc5O6qMcd$=3h5M0i_eUL_Yr)k%i6BKM=mrU^m}i?mS}h);@_vu@z>m;9|m9eB@@AH z=ifaCH-I&S0zwX17BWJI!3BzVrVj>VbI{tQVjf$6z22ZMe&vi-z#Kj6e^1Q;@x?;C z*Aa8JXA@2zkejFRDbSygC>_Z0yGPMM3QuDehL2#kjQ0QwBBa-No^Z86Ei@g%NpRr9 zCganC0aj^s7ZyH%&-#FROs=9hj6wS^CuB_^=NOTvJMU5pf5e=Ij5P9x4^iL)MY1}; z9b*8ie+Q31SMectBwo(Y>T{dD2NL1tGey(xv})A*SvMFwj>3R5p#Av%eXh4pX=F5t z-(Xg|6dSCB)*&sd+ZorlS}XU8Ln1LJr|YvX56g`1#VZ)M6EjSqWkb#-o`@e_lIP_G zw5kly0z?LI zc}zRS0p1B?3Bua7sq?TOiW`a9*E3XFHB2Rc4k>bw9_sO+5htE3KKUlHAnwc6e~}t( zd>LE~c4*IC56nsxsoWq-8rgWkhXezhz69Cl=UiOK`g)gMH#XerSNwPQe_12`EWUv*t}&96>d8#Fcn9XMIY!Vj?) znVb9Wz*(+}2pH{G@BlkY23ayD8DA`9$xD{l1BFP_W%&_?Xk@^Qc8*s@_E%al`ooP6 zJ}rD{)+uz_l0rTB&D3de#^_O5UB=%Em~!ev$I_Xua9IZA^Aaa=M$v~Hd!^BK&jeeO z=g3rd>r$9@i1~JmgI#W@0NwSrYn z?w@qzkiKvzcvmE_g7{B@=Blxt@>F>ahk_T0qJvtvG+dNEl7yxc0oT5w6yNn0|7-5F zqIY6@TW(FM&+79S(R}_l`r`;?EPxDk;n%xsfK1ClK?H_kl$93z?mf$PK#r1bL}Oxr z=dP^jd;>}mf@*`xVgY`fs*96Vs0`jtUtlZR3qCPOyc(3!qLO^*58{9j#|no*%&XN4 zS_$NDp-dxrWOVQ*AhuG-!2z;^*+}u{qa&x1`VKBBkDf4^GG(gXWsuvk)ZoRjXp!zL zI?5c`ShvP+&rE3tinF69awwGz%#{gwQj{Z2ALKZ^fBzmhTg*s?54@IajvMNL>q)>u z2MmQAKaPCz^P2(h3uq!3Vv;3aT0c`V?hk)LZFJwVSb9=uPS3BrPe)VN=b5>Ru3SFT z>m4uQuounRgrgM1bka@U%2H2CD8=Gtj3fi>wm6vlzC{?yztA^BTP^B>6Y0Eg{vM0n zC$QN?<6aM5!^mj>R2;cNJu&dovDhv}qNTtA`aZV<NJ~3Mx{6Q~<(J z2)Tb?MiFe#m;K{`$ZN0}SO6s?B8P@KO3jX>t$Txp@fuIy8eEF5H9RJwp;&$ea+!ZH z9%RMb^&M|r_fJG4@2juE?%~URxHe@v)|}}CyEtn~xW+_YGu8$XK`I{j9fHmO(2RMy z{?=3-l9L7hRi)bUU&WIs9A(=?MA-i>K=K#w0Vw_krCrTl{~mb*8_)z`B!_+nqmS2)l8m*}Bvt&u!&HS%-d71+2V&MCRA>dD%6fyK1C|(d;ohQau z1^#uwBn_Jrz6XrwICyFr)Rh=Iv*5Av2CRXh`2}VTgW3s_p$c`@05(X&eKpmH7#u8e z5Lg@RSdnH3zO*;wYr@TnT#=wXl~{kwCTh*Dgx7;7NR6_nupllg0*_@T!$H8ov?KD# zK(1N@h!C?${50sn90Gh9=fMz84{8s@ZWO@5WG8dnTY8O-N9z?45pgeB(q{&X%Tkvj zIqfm+LKaUUKmI|--iflhpjun#kGZI#FV^Cu@?rgbX+QNP{c|2yPs*cz5H5MKIc`hD zWW*ED%^kaBkklVK>dCE%&!w*JlzlRJa|4k!0rr<(z z1o$)JVhWy9WT2jDS8Vl#hXD2;R80`S5w(xVSp?DT3fMgGjz%+|3{{xM?h)cGoUU z&{{AU#}<8;%1(LKHl68nY@Kp9DCquzT?dGW<+<@Hhd_G|V1qA=aY)h|a5H(Fcjn4R z$-wFv1QGfY`XQLFW2M4!+yX;>aNKZynx>z?xaQ@INiUtqWRYW&k!^;gG)T4?Kb)vz9%Np2eYM`b;aZvGT-kKCrTVG+ML zvDH$N>yIL;21ozzs~dm&-X!q4K7~?%koNJ-4}n{YEEk|7>w_#M|I)ZSU`+HDY7S@| zv+zIsySbEx=M}%gEn)*O17v$ALO+S}1I*UJQULt?ec;|AW%$(gKQ4gI5Zqzr^v5{A zZj+GEipjLeVa|%&3A`P5cBe_gf(Xy8wOfFGhm~{(^VWZ@N+hoSk-1X3<|M4I@%RR&3=l%C%AMw*vsI<1m&h4uslY+C zebw*7lW&5`t)cAn1A2Kb84EAuwk5%91<^vn+Dade8qCsyo{8!jZELPEp1*?L4LN8_{+VUQoRbncl5{5bSm#EKOKk)zAc48^8AP}B#`3< zZk**0CYg919e596-Hem_rx1e-;%eW6eQV9xj)Z?{%xf@K{0{pvM5sN;`R}qR{LLJK zov&X0zE1ns=%^YTHWY2RbKsUBA|NOip!1G~d&`XZxF_d<#r0Vc>^8Xph1W8{ID@Go zf>-FjMI3IYF+H;CUMC>^@9t_5LEMv|7(E9LByh4Ha63q@e=TH$wgaq*GLW&Z#+@4~ zKz)Bdz*OEi%invAkb{bllc9Rv$Nb1x<_uo4$UYBj(%?G#ArMNz3q^DZth>Ndcox1m zSa^pbv?z$<0Z_gHWTF3f+&XCqX^ENWg3n{(@Qe~VLO4kz2PxbFK4S{mgTs_I{Lgax zJvZ$kcn@mg9XP$fsTTt|I`pb?zt0gb$SSAagJ5i2+9s+;=Em|OFUV%ETQuIzM1N#M z)yTuk=)9jo-(=!@@KrK@?uNOu)fNYJcvLodmWI1xMn~+AlqZVqIc5(CqJRHgEEW$m z&Ix_|i1LIu#IZy_;4;LUKG}fP!}~`~!zp#66Xp=!Q>L%-oktUjYFO+d0j-VCe?h

Ix~>j8a6>{W*ou86@6oVY9^|9>aYV0boN4^GAVmnlgw zi9s889a7|x>jWC!e_RC?;QPVVLP1G6h&5l{788t9Dfe;bXOgz$d)(o6p7Rd3<+?k! zS*Ghy6%yG}X+Nd-_5OGK$XT<&rVhZuL|Sw(V+LiF^7>cSb(r1MD;)x%|AQN69I+n) zwO+-D4jMUY2Dn`y%r$t?9y@M~F_s+y;{n`!oWa|O2`8>409@@5yKo!Wuz(Yp1f(Mz zuVm+gQ|tq<*+TSaKX3{CG`-+KUcJ>!DO@$B?~r>cN~gbqw<*QFXqKY1(BnnQH9E(rfu=_Kbc5T#5MtM!z%GRZq)nv~Bup8NN08r~n#vqY_6xYfgU@``7&84i_|c;HZ_9vvyWUw}_`S^p}Zil z&tXf=A8^C^cN(AktEH}rMk~d z^U)Nmn&s*}c@>VZ7-;lQuF3bS&`r2-<5jwYK8n_4n{%NcT#IC;hOGO@RN0HUaQzHY;qqCNG8a?NYzTId*6`zJS-Uq~uZ`T2K&;+_g$X4_A_ zu*irAT|;wd%g|eS=??2In=* zlZO?~A!!dEXw4m~z4`R&A2bZi#E zq`cTkbvss!!6rWi*N?EPtFc?^^VhFa0GQyT?5x?u#|^c1uGe)^oX|0!6EV~1&rUHk zXrmdPHa6-``J>0HFh@)2ojkWTTOd+Q{69uu(w^{hsD|(&y8+@bV5S|O@d1X->ZtTJ zf#-;&=ID!>Sa^-Gnmg@Vvl?|eNy(s1!5RR73pWmY#z5Ro;I9QZb8d>M*@p-rP#yXwDas|)fwr&EE$m&*N#;2^@(!klYLyDs$&NhPf~qZ z(mhflYP_vyNnXY4-1=QD7+)%Yz1q&$mWu2pTZ91|sFdiiMio9*jLD{2`Zc3mtJe~W#qCd%aCWLs87PTUtJxK~#^&z!C zV%Dv4kJjG8`dIUiV1&zB&hDJ77Tc%Am$~{%?9bIP(@(XjQ_hVU@Xn2Ad7WL3Hfq$H zu}^6n2Y^ubi?doIzDpOdKCA)621@yTO11JYA6!Vs1|4GFmv@VUMvBkXff*sw}i0; z(e{09K3t{~b}Jk{X7e{#rfMw>nb~z%vdf5zrxg{sfGM)reqbQ=n!acOP4|Lo+mW;} z3C}d_D#Pd{N__r8FHr$j*tOwbaKtq9H>Zf~)B$k8iIMbVHZYV!Q>8~AvK9Q|7`4BB z7cO4ybR&hc>!xlfpLw=t?&LtUJ`Jrxx;Wnsm0y)liVs$6dQdd2`Yio2YkTBCVdw+< zt_|rAHo$?^)MI=@X@8VGm*VRR;Je?Q4!R#bDDOPZJSocH7a-=XxMLTmy&vbR?}3@Q z{w~sw;^$I|WL}E2=-Roqecu&&;tT}_X0vP6$@H9A^FcUPT8=#PtI8MJQFKV2`{;z~ zCIfrVQQ1O~LYTO z1u~NeX>~x61VC`=Zia7)nO|Iu5z9I*qZH2h7s7G-HQeJ1U+~9q&Wmzh+tfULH&El1 zBTHoQoI~x~vX1aoPVTw#TN0WR1r$2ORF*3*{tqcwwG99dNX!fj_2AFXBV@KDCbE%P zp_m)8PwCOR=Xk;3l(66)mBWX2IKvIGe(FT+Y%n>{5)de&(d5w$?hb%M6AiU}KAl*+ z=M9z{N4ZKZP(TS^m)rw<*R$xK#!yUq)GuV%9I?xSU+cqsNBrVKuOe5|0|q*$o22(% zR`H%-dU^MuRu@;I)m@heZ*|Y5z!#5vb2;RXH|unTrHef?D&czV2moq_*h>aXxX8~P zc&&lcGKsN17!*quc@njOoR}S+LPY(>W)Uasi2Zhw{-8&Lg6l5tUMHWNz;Kto@1lLj zdh)an=*0|wpWRXaC62ACU~=`BlOJ7vKFcWLv)Fu+AyRBya&OM?L_HHtu;`z)_qrld z521H?&*My+fP446D^}?U8D>r{ZHjdLP_y$_!!!Bg8Xxmygbyh_w0+8XME7STr8;-> zq{f%;mVMv*yUu@Yu#v|1gm z@QUV9YF>B9ryl=ksTGutLXf#;0RQx&dT~8E4NMk)(qMiKO9Qg~&msp%ae~=2c>%B`sV; zz8|Z}z;h|wC)cx4*L)%bx0X?21b;LV0Q?S%`vc+l)lh*G@wkq#blNnH>wYb zJ+U=P*>#?ud=P}=2rju*r}FjLnFS44UkU1mN{ECtCkWa7n)Z)mGh&l|!}@a4MYrM9 z3jI+hlXEu+-%DmRFE>|dI`(1`3`NntQZ9<9s3_8C!N&Fo(KJQDLjcQI?J(19{^Ls} z3ki<29nUp%wiSo!B^-!VSkZWZNBnV(0qyH{qnMN57Tol%F2q^KU5awnp^YjQ5>pUp z`*i0@(vhc2_E>&L1Rh{tnWI0nxnC|u-u$xmwa~;H=R`wOGlg3rfko55ujp1zzHkh^ z8<(-!MEaA1&Z{ZrBf4r4ay%OxWJKuFqvC@t5uko$ZvPW;g-|^fr+1y<>hrL6KG&7vYxr%~_{AMI&V?x9J_7{E!o7@%5Ox(_f&v0$QY!e3>HFVD zZd%@ZhBmEaB>tP8Q@T3JY=~1DQTAt?T?wAe5ruw*Q&oNvd{JXpS0s?n@*!hJoq)8C zkqR0&^p*7uSJ1xFu*)cFzR7MbczOCzj<@z&#>?X?Di$4n?vicOjB%#%rJ!2-refzw zmb^=sc-7-HwCQQRyN#K&XeR>KFtF7zGxmK_yuL{{S#;)^8Acjw3`uMa6M-;d| zFmlou?73M>^m;a=ErL$LT~?r=AzK3QE7pU3M)he>6jLl(edgmVek559h>JxQxRSkq z`;L^fW+|*(U_Dm4-QeQ(y@A^ef;TCC4ZR%}_om=O8e7@UUr9Ok2|MmIwpr2$H%*>O z6-pc4g>7s>bnE8OYVqogXlVWpa~Bs;41*U!i>l6XU|?r_Mk0wr?E3t0>31~nncVRg z3YaDBax=WXsAZ?s$P}f{x?l~R%Q$7BEL%*l@@PEB;%8^*Xz2GR)fqxghVHrplB?q#xwoS zx&3a5!+cHx71jf#tPjt~wZvr%%J1tmSMJhrhzdP^rrfZmfgyjpPLKZ5hqJCf!y-fN zXYSH>W_+a&Vc;p;|MZ)@+v2&fnO^0nG_kgeh8GWX9UFMZ`l*b~XzltR2V8Y6_f>Ij zrce96Db&}u=ZT___cJeUY_dQ-375zx>|&7)uZ9cAovc;x`Y>b{KkXJrM@wrDJWBB6 znl(G92pcTmTz*f^7Ti)kxB{3|mQN)b`g7m|*V(&`mfwsFsz#sp8af8nFqK!t|TS2PuYtXgd6azZ!J?uvcH9C}sMl)fP)&^oZW?}kUHVU1#r zj>15p=I#(G9@@t)9(w}ltoxo=ALyQlirV?cy~Q7Y(@cN4#PIK=@)Q9t!zCkj{KRne za>FqU3so*XmvF)2;Vdz;Hfn(ecIV=6MKr4zfiCuh#hYxv#Aip30IUOWN040rz(ajd z#6W;v$?1KGxc38ja{=p#r_Pyf!FSWfoLq%#oZ)Llpy?W zhSH{x)g0iUVUo^3XoNW^rdd$FK-d4twbz`lj^8`3ks;<;C`j2`~;?9u01 zp^|CybLYK2z$*4(*f%atINa#QQ89<6k=4)hM%hp1_=~(fqpA0Zr#WOC?Dp42iC8W7)m7OAk z2=_YH3&K10rCl^Edd-_TKO5unYx+fIx07{fw5z$f!8dQork7aZwtb^-SBo{v%*Lx{ zd~<$N6>MWYE;nP5@aTK^iwQiEs-w^108wO4jO+}rz7PEb1$HCa$fGf{P;>Y(rWc;F zLvtS_zYx@J*Lb3q*}%I)FE=fsm@)m$O#hmrf~3ty%|)-egN11MrFnc9r> z(Ik$bT7{T(cWO2-*P?-~yRfQ@481qGUxwn4{8w1`Ktv9>oes;bs{oz~jgMz7tDQqV zKa>c~!}#tgv_@VaX0lj%*jz~FKK-sg8<&lk8rw?VLU%zp-e2oW zrb#`})Y9^0z~T@QtnthH8MKy<8lZ#jNhKH#u;Qp5k}FdEHfY(-2$tmF5t&f!*N#}l zlL9sZ;v3hnWodn4sQo&)pLo$;+6KNST-nas!#T0o3Bmr=xNV z7&H%HhmZkCMb_6}e%Oasg@=d-LQokASS{uEgzp_kQSQ%pNzD=X&I`TZ>Yx|MwU4De zIhS4kImi6r-`B>ZHYo!2^8hC4-^rxBfZfknje!|4&^Itx&UT90^fqJ@h>ZbQtVP}% zWNole!$NJ^YL{Q+17>3*)K$z}lST{;9EP8*6#+kW+p#pwO?sgjO{1e2N8jxJrkkI4 zk&L?;?7zRXVv&ar+pY!F`7f_6+oN%<#^}W=x0mLd89tOhf1drddhp=)y3qS>x3-iB zT)rF-E?RUeOEm1Xs-u*@kVIAvo1$PUyBOJ+E+BgYz8>Un0MPLX9zFubHv2f3)&X3=O!YuBxhj_YwETH1@ayd>IPs&8YW+(WOgTb6${VqkskN=m zd+PMroxC}@xpvsT0om#mZjP@0P&rIkSaO#+!znH-DM^pd&k4?U*qEB%0I&Gs5Oy-* zO8BGlqM!f=NsTL_Si={41o}Vu(AWh{o+Z`@lS&MG!!N@PuFCvX&z+XC_r0epu352^>DA@22#Dm3z zyw9Ce6Jp^oV9R;%WS>?hU5fL#I zrL7%qW^GNYqM`zUfr3m7h~nO{a!c}X(Qt~2ud<1W37n-b1Q;K`dH+8A`gMs%EiE^B zmYMR&$f6hgR;H$=cFxW%UTbq29A(!N!4{yu5`SWj7D3oQEsg8==mUeG)BiXYV`jW4 zikOUywY<^a+uyI>u;CR1oD_Li7OYgigvz;cpQ_H@y;^Q=;zVm~|7K30-P*Nli{^DM zhaokK#Kpx)!w=@@uZEe+k`}V~znrKqHa{v7KbL`84wzf98SpOoX z@c8W6?!G>CPtQ3O8#tlXfx5y7jg^SP7($pA82A;JU^hn3L1T1u`c?9dd?sZd1^KO8 zpGB!r8^d|qa*`%Js0?XX^*qCbH zuKoU#la4r^Se*6l{!>|L={nFyu}Mi}IK&uESNZMRWCS((_Gwb}2dP7KPUhUW5rs=Y ze10>cdF=6Rj$lyLLC2FzVzzIefVjA>^6wa?-bzq@8(;+tDJ_)*gp33#Cfln?BRxAK zjrU%GSZYY5WPRJ%yLVyeXWrhXT>1UeXbYLi`0~uC9R{98K6oHY&!fnOo^MAbD)N|H zHy9VUg%lSTQ>ad@(r@J33m^gi^OUpKL!xL8ZKpy zhMSuki8%;PMD)-WV&UZCs^kf;TDg;#5q|;OCT3df-ydF8B`+i_JdS$r?B}r+=*bF( zyHia(aV5oCdV0tqfoM-?Y-*we150iYX4~yQ6BHxzWpUvoM5@&UmGt+Uy&GyTHPO}8 z&D|@~)7#sC#4ZExG^hYU#57o@_Mo7e1*)<~Q8oW_C=5O26EGOGc6J704cxGY_GW=Z zU6M>7nUMulgpVS7yC4dd^F%VuT}_!jgZXA4W&lGh@UWL>R6H@Kab0av%tqEk5)(E> z9q#Zf%-iy9)i7*OfjqCdch3RH-k_4+i3_agw@;(dhz=N3Y4&^T@j0}Ejwm4DBhq5`== z(>Jh=hbIyrVe{$q5`gTJMWv-p@L(XEP#fpGd*_Bf#Q=^|LsOFy!cHJ!X0=1?K3%LS zQ@(QqMG2H66?fRQYiep#4;>;SmDa-n5MELu4j&N4m6cWeOs#H$o+#V4a|yJ!71{$^oLc=mva$sin0KPkW_N*#`A<$_PpeY#*hBX}gJ9ezk&(Ft{ z+ie6AFsdvv;n+c?e}t3H&qSS7Rz`Mvz!pUXs=pa#8)ocI4b^D)c2ICK5<}$d@iC>h zZ+BLrbzN;Bvrx{D&L(w0ITKS;vQP>ar6c?$K9#|P3%#eRs;Za$K zKQ4nkLN!_FjR1kKnJx0`#R2g|d-Nop1rLp-c(!(SJwn6A+Z-GmPJJ5T!8R!Szqz7S z#cd(v;#oR`F_+N?yM|>h(;|U!*BsaafYa*5rq-%r`$v5oh=9E74%cN32Y(X{0OCaK z9(`M#>HB8~i6+z2Ybq=wkVkhLl)jDn&B4P%f9%*X4BorhR=xXO$&DM$sL*D?L6aAq zqk);WEwI{te&(DBXDkD$-XRJAp<9xCOIUIx0oVMn@bK|ZpQ3TEY@s_^qK*jA`uen| z#~)clm9OaJMIbZm?T*0)CN$0P;o0Fi6YSRB(Xpa-sI6;cgm=r9EhM;MsmtOgdCEZf zHGqx8fKS#O;5KLjPb26iR_{7_5)%olsL38ad=#`1`{7;ZqHPw-xVDgl4tOXk$>>TB zIsq{n0?ZMSknJ+SnOR+}r?y|mk z@z^m*2tr{9U#~D=j(~4CzX^f@0Bk!kjLkg?J9gB!wb7su)IjBd)U;YpuVc@>%)rHX z006%y)46C{07{O`0t~XRuoR1DJXBCz917je4(GfE91CK*}!ew4R z=UuVqj)ZYiV2OqTbD`)ZO%{y}4LOgUpezJw3pK#7VSDuGT2u~6CUJwWhbkOWCu6* zo6`yH?0*Ef(ObV=Cs%y)=07M)FFZ9-Ou3t}DR;X!cvgi00v=FI@hX9v1JT8ufu%KWK+~zYYsQKFy zlaoWhw$OtC5)~DNX_@ij@2?hQ_9w1k6>VZ-qQd!a5(Fkd4r}b~Wx*vSSCPoARovLU z`Gagb?vQ$D3o=1>_=fD)k1sb+xW8(q#}Ko)DfwlXP*z|v)i^(Y3NyVcc>;=x5HD46 zRXRGt382_6#6;~5Co(GS|B59RoGF(hM+A{(z+jx4K20W6E@1&V0o zvP}RmBr~d*0DPzF6Qc|U1_t?uyL)>tUAuN9ppOpm3b78Q*W}bA{7&>T&}`khm4X6U z!Fzpd>fJXJ6PHk7?FM8i{vK52gNvvRG($*05+_sMmbAaHS~yLD{UiOzbt5)G(*^ShCBa|Ih;^LRQY9`(ULWhJ&l)c$CHJl?OBLqy1y?T{9 zpBauWN*VOnE%>jp-i$gHfrQBa^UnkbNKf0ExR78b5SxYn3=4ornJuoU$R#2of~BAi z$bpmeG^O9eyEZaC0|V?R1&_Yq>0Jp&S5Y#1GVX!Ym7Zf!jiE2~gUV+pR?eBGT>*tFk}X<;u9-smedbR-qHIf@j%t4cuPfGxQ=VN6T#QsZ;U* zdlWdR%b^j5*q40qZ80e++Di1yf3Mi(FjD^-8Xix$1suhULWy5JI179bvE5*A^62@O z@Uv$j*vP-!9f~f9NQ9;a7!8+m+cPk_z&jANzCVBOp}jJB_O)vr%?Aa#NL+_ckfa?DczY7ATzUE7`_t~8o_ahf8LYfOkbi|iRV3TM$hORd zWGFD>6}h>qNf>Y8jb6jZ$O!akv=BoWT8NwUEZI`)=|0 z^4fq9UigLz=jMxa^#wjb8zmO5e+b07bg8g%sU?B2w6xU9P|eI3SspA$IR=g`zp6_p zw>vvKLB*gz{x293<_N8vC#t?azkMQ_+$qT0xCl~PY-*`DZ7Te3{RO-;(A8lT2s+%cklFT&@Z+P`(frv0-kwj_6W3FQ;18_zU0F>&DNAIW8?VT0VJ&cnmA zTtWvGWs%$_!O{3Hx83f~*IOqfBvk(QmM&LnXcHX+&WXHRke@G%l?&2PgyDNvYB zRlc)@x4=Cj-3Mc6jJ(^PIX7J222e3F!1?5mBsfAoL56C;qS9~8w|n~gAK|ddxR0r> z<=x4N9;@=Is-q1FdBU5wY-t8Z1#4j#M8t87XtF47sR91aR*PY7;~MLjLN7!{xS?|ho!ak1X_mck@d4nOS`<} z)moLpA|o{shT#f9)#wi|k}bT~RS!4upU@Fc6p)c&Mk7`;h!=##RTY+NQRATFg&H(a zGqeLcTiZIXenkiX<1;h#kle|^vbMH9s%4Ufvfr<9d<>=EUxGyYX1?rHV`r!S&+Lfu z*Jyu2Jt2w3yM!P37D5{G$Sv*o;P@W-1$`&jG5G}@ zpVRxxSpU_C;PrYcW1lKPGr&5aZY+vjJ{wtCSrq7QZNNhtb$OR9fY^&3PXtW!Z4E!>3LS#$Sp0|u>%INYK@{n*;oW!~QZ7Vxsazh4#Lp}Lv_r|8zLTcTUG z>_Nq;tEXp-6o-Y*io(ixsHyrQ4;d&B^0P}yXc2q`W$;pwcjNBQB9c$=!N}E|>gKi>5Occk;M0R8j@iWpZknw|x*TQ+nH8kUXY^b==$q;4>heHy zDkRW#$OTQ1P?UE1Tb!O z4J}R0pjy!%A}MpJNl6^1PM=;;E1HhVP@Qmrk{TFziAXW#u0R+UoUnHZFKn*X z6<)ix|3sXYy5{z+TW?W~YH_7e4|OM~G`(2c^x_i&>q`7!-}l3_3qGhp8B;)TZ8*4O z&dRHYvxuKNy|YQ6C?{C=YFNIJra)}bh&MgE8v7?-U_{6JA3)ZtTwvLXg8A418J6pL=Y0b)XvT>!h6i>X0@y-xa zjsk@Uy7B$a*P~vtukXzvP65fnC{!Ra%3=2ujkW~Vz`()=hd05PMHw2}bV-?+(Xdh5 zq7mlow-4*V{FOU(a1a9#iZb~lvZ-s^+S)FMhpYSe>;y6*%1vdZEa!#|WRn9H?}*{C zc0-Qhm`(kL(w@xp&q8yP!pYbA_r<155YUdNL2nYx--^(|5v>OR}AaMt>>~d`e2i6KAEg%4OY@)p%4wm~BLL{fO zEd{CY2qR+A7Er~2G!8A$#~;tl0f9*Tp4>sxY5kQ~ORrYQYYjmmbGC~Rdd+Mi)2(fQy;ZINY`cMt!R|Z)MphdtWcK@AOUmnlkNza2}JE7KQ;3jnG-S z8MGeo6tL-7R}+AO?m`9cIU&U}A0xnHzCwjp@cpowbupX{M9khO@}V0`u}FRUh( z3S^3*s6E;@6H-&fq}I!BLLA28w53N zcXzic`7TLGgO0=9KrN`eSAawz(gJv(I%Kq^SuZg$F);9jPf`=!KnH_>rwYH&vc7id z(8UExNMxUOel=pwd{Sni>L{{;d4Lp71c5{CZGi2NP~g>q#oXc|+qU5PqUk*wKV+mB zd6ANm^6TUC-nu*#3mOWDzzdmBv2d3V{5A2xaE*mjWb)N6T(|&gp@ht6;HJABE9}R-e&Su~?~f>r*|2PF_^ccWP=7_C7;yE80!b^hF10 z0RE|n4cl*M>bnaB_6tKrVrLIRCl9GxfWd!2bdp9F+&R`X8e?-Pnl-*l$`B;{9zD`P zg9Zg4mO8ExVl2A8R-_itp%yF)`q*NE0i;sTvO(IxKNO^pe)8L&wH z&%yYMc`!pbYKBvT^56rX^{-#QhO%i#$OE1tumlK3|Bv{Jb)T9j_~VZw;`5*{)9>zG zMUXck_%_hS9(>z|1Voe-3`*?Dd)B%{P!~95Y=hv_V4s?vc7TWp@#%E#%;Fmu_d1fL z0Kw^q(FhcJv0srr%5rHqAzwh(B&iU!^l)se-bj85CmWlPR7X{ky*-E<;FFjuS0Wb| zeH@*g1*N1I@7%cqZ$&ZT@SLs;zkBnh4!R>)V`(`#b+nFRIiZNkrzuv`ZAagnmqSHG z%0K*b)4_wAbmI~eDJjHFmCYQF9*uwz%&s?2C#KDjJaJ?vfUzJ#J|R0MB_)w!lSFMC zA{?|zo?nS+9U4Z5xg1a-KKS`=Gx^-OeM){y>>E>agyiaDQ-A#Mj5YRB+SMj0P7z^YekG+1b>Xhv1e%{b z*$DEQH1g%bAKCTVxxAU|U?No1w-3+I<>4HjJ~YJk!$-NYveL-L#<1xqsc7Z(#Eq4& z-?*^{;UAp)X40eziLft31XUa4Ul?Eh(ttT?;2~nKULBbnHny-Jqc5@x3q!~h7eop` znHQVOHiEZ+l%uAncdhLvGau|Nw@-{VBMSTt7;rNX*$~#0$h*ghIftE{680AIico76 z>L`d4u#dh`|KMOM;ulracB1RI4hscgiXfzQ?wleKN}!E_VsvzLZ0!irZwt1ww_gba zVQFdU*YXNSX$4$70e9}~kdTl7!?i_ZtUSr&{x4JSJXagP2fr`j@Ex0E4KT=0Y`lUgT%f5 z*NcmHBZ=R?HNqxWVO)U&a@Ob0+BUZJU+3quii@qv)-K#Fj_S0I6a$$>W`UC@g5NKI z{}(M`ZvDqldy=vF=pJ|kG^1)VKXUXe=_4iuj1gY=G)l@*4&RtqXVa{O1K2#9hJN^M`Eq z49A0gilE-`7sSVyrMF{a6nH`|F0~83uclwW769W78WlV>c1ck6_Vp1v z2MS0Sm=;bCSGlgj_dw-95FEO113)0a^VQkaHAShujls(UV*o*O_MW=7Pkj6Kb@(_J zuC-K)WX)HLXc=O9jk^zA1|{3iAE-(Vkzn>2x$7JdW-95|4LYWdqi7Y+m^ zs2ve#6(=*zbf1Zs`pC=37`J~*ag9VwEP@76f3tZcTut_Xodu%E;gx zA!9ayJD5}|a&vL1d;HkYX3r^icRw)P(DlT{#eu{`9v(vtiQ0TcZA#V9je|(3mQCa-a3}_iLcFqx+hL)PgrE zez?wv+Y4G=In2-moFkvZ#E10nkG5r?OA-Qr8xx0PuXIe=gJMH1Zfw0^^ejauNdIj` z@zy~zEszg?aq@|hTn&NP69FE-z8wRXHGS(DSK7N)eaC(%G&gP>zh4}sFJ@BFTBPu@ zBAX_*(;C*HYb7OWu+D8eF%kh+A1kU=B7ULsN&g{TEC*qDHf_>Umb@y)DgI}diprsj z7kGGh;4T7RnR{aN0bp?a#shm&SwE%Uo162*(sz2OT*N*LCZHL|rKO=^CCY@>jt(M* zAX#Y#n3edr96$cplO@Luwh-h`e=tGIP?#4ZD(a>@$;bacpfHv!Lr7Eu*8%fNLiJ0~ zbGy~mSKU0^rDkQd9<=(VhaW)c0x{RE+31s1wX;M5Py~R!5m21CXI$-Z#fG5SLm?QQ z%+G)XH4eiEr@RXjXi_490R+jv-4;3rAB-&m9APq$#UVmH@e=A?d;dmCN@8LV^hzQ{ zA}bI+7t8LWP)35!UHF<3YRtjG@ushkk-RaG+(^FxEw9ABe3U2G0Um8SKrCY45P%9~ zm3$~&4u~47nBeOMLg1Om-06J@kWxrQgs>c>5Fs1x@v})AIB_3(dEMAOGIf_tcHMPikt($=%$u|2FDQ+}=i*9{5;7Kcgj$%rU`H^3E-eg5iWEbTZMD zCzU1^(EfCR;6^m7FHoc2i<5R~JeGe083D&Tro&{YSqEttf5{4{|2W^$)CY@kCc z3zX~LED}r*FQG%V!f1m81Cby$K0W~cM7V4S=<)XUF1m4p>hr`IDO8sW^#?$+m`#su zfj}1dQ~8M3rPMnm`j;RJbg9i_lmXFEFT$ZUu2;aCl@C>BSh-x&! zR7%>QymZsMnhu>v_DDvE(N=Zq{wd-YJ@k3mxc7DQ}kevJq60KSLw?ALYe2G|vgnkKHFIfn- z^CSa)j|7eOFmo6sQ}T^}4sfMkF#{!9sH;40sP9td90N3LJLj?lDNqSkH&;{h3GrfbhnLIDp00VC3iHT z7wCQM_xPW{b>JKyd95Y5I)B%`=&RJkF_lan+x$MFI9kjO_!FYX}i!M5Jy36&Q_Vn90wVXPp#AP$8j zB(MQ>_~C-!?Za(E$Ojb7ATrj1n85>oIJ*r&7N60kECClL6h4^Tyu8&EK&mw0hpECt zQG;CP$cDL%9+nPql`4BP<)i0t33mTYM`eoB7Ut%}vn^#zv zd;Plp#e*d94-K`_g`z%{-numi5F6^-qS*-9#G4dmv;i{;zKO%d;q|)2B~+_ZV9} zq{DF%WeJ5G%f}Hum9JgU3Xnlq@pGEZC_2q7EVkEhAaWg(cG^?$qBVghbxu%jfZ1>H zS2G(=>V%+apd;^S=c}}iDK&g+n<6s_b=e~^uMLpZ#Kmb*c&eX0tALUV;}!zoU+Qyq zp1h9-4MhqJ8UEg}mnBr=qK&a}Y^~W3oWzBv;7H4ECf&Vz?nPHyNP7|`_g-to_L1O9qSosN!V!3&&x;5AoVUa{;wXQ@wCk z?$tdC*uER-1pE$3CvddnSkGO=*fTHD zMKj#T!=AaS)8UHupM<2OoV$0eZH_y(M|GYIvQigMR1;-e>9=^=-}|cUldVnD{m8p@ ztvmm$Xf2eJ)zof!FDI-6c5_dYtdtyzQ1g{b=OyiJ3fT_Dr_98!1K#w2--n1A$T)rw zC_osK(LT#wC*~ySDHpJb0AI*kIJQ}!DE{gPL3o@vZ_wRAq#5B&m6?e`a=c$Cm-1vf zG9rT5vY@~WJ$sf7*7z&KW!uAtsemLncGcgx72D=GRO>BAEH;D>1w~r$ba1=IU!7gv z8LUKSM@Md3h{juZQv&fs(tNbFH^a$aidN@M0S)n)+C20(fPu}PjU9>Ft5g{M+z~^t@n$a(opy(f4 zn~56J9*FG6SO6pOJuf`&(Krpi7!jG^03c@;RwN@+(^dGEFy`7~%Ejl;pGn0gAt`Cq z;fn8%QWU58>Aer;O^?u8kXKO9PN&k`++3EC;^O4=)n);*C;0Dh_%t6rRm}6oH||P? zxsh0uCMM>dzaJPJY~RGl&cTsWR74Ge5F#N-?BFDf_w5VDTe;k1PZAnx$vMxs3889V z@o!=r$tk_e>J>4MY-u%+N>L0dz!QsFjPGHF7%MCyr`~k0;ASW^4At?V~77R&wn zVM42{S4piL{3R+TR!=<17k{5KGdCx*hAeB(&Ypj05p$-o`IMICKV4~2rgLXOs!5*x z`njoHCNKgEkhme=?B@EA!bKUh51#KzD5 zbhS|-XK@WZ#p!l4{c)C}Uw50>5;mBkWeHZ^iVMHIAYs}y1kzB`(q2kW-=BLtq*kR# zcGs6hW1mc?5!2LZ$}eYLdkb@fgW!FyZ{sv*mQnK)%!zk>`Q5ue6TMSfa#1fV@=TC?W({|YyOMHIZzA+V2EJJ=#;Q!_A-(?>j; zizuz}v%lh3$)NS&oKhN#nsqV|Gym4D>?AT=+d<47ps4`!iO?j!t1M{fp|1+DkK4;7V-K~!BC`RAwF)LL6|#1ycB&ocl^ka%~HFz=0O-x z^7>E*e!&RcA7oM&`K|`v_IW5ODt5j8eMRht?36gg9803T@q2@gXnh^a*=?N*i2D>q z&XLLCF`a2)&$t>pnp~UOV#2u6m;f+C;Nb&b$cLKZz?OA@@1&3dBqBbah102G@nLLq zu@M#qcg-bCs#oiK?2Vmp(21RR<)8gy$hg1TY&>~Wh_LHK@RHIa1K0RWyO%;$d z{ozpX!P?TYb)$;@?!lpMRV+}$&@!Y2hz7-RC`$c5tuJ); z>`o-Ea-LNbMzG?c0TAs?^aw*_z|*s+em7*+S8yCqQ&TTDDux1ufv44X;UI*u6526I zU(~W=3E5aV^NE*4FX1|HKuA9=5iCJJH={5OM5gpum~--e_8GvfdvI_Mz??K>OUT*T zs1HlOEv-a&naYn(Hn*@41mTN{>$D*Xbb!3rPZGtsxvP{j8NvT7go@oFc>tIZeL>>; zSxkiC$!MQ|p8_)-OF{E7hCxTK_*Td$@25V)yG3?Lf*GMaUvRHfUrg5>WsEzoW4kITjuhKs5Z;-Ny*G) z{D<3EH*N&$%t)-bT(SS3rP?2TFPJsZ;k6b~4>iRKBDxV19^Me3s{<&>qgqE2ao360 z0}aB21L+MUS{YF*q23NXy9h!ww6i1S)l(^K%Y%3+r{E8ogtN-vi~V;f|ZYyw7^rH(Z}TR)NC+ z?x{f3UogQuA3F_zHW`1y)Wn33jdm8Zo5#^(5TBe3MBV-1!gmbmp`!&O z)f%wN{AU~*c-IjE3oBEo#@{v>V?^PtH5ew1z6+vmxN5*Y1l7|1Z)Y93s>0=!m1(;;(*VV3$jW* zVghL_eC{#F12vF=v^!%|)a3LGdXxwUmz_^)F?j$28 z7XWs6(HT(OjFhY}$`F|s7U%%DrpHj4)SUUmi>6-zDPe0XE3|7Kyf`;MPaJCLXF`}( zl0QKhR`?Ru;OJo_*D81t0`XzcoXRh$k5Bs?3GNyVL&hbOCuk?Hjqs6 zGMcc^9%ozvr_4??e1VQ!E~Ev30Kw}6NJV(5{cEO+*%#IFDjNw2FCJ{d^(nO967>UG z#|jF$!<~LO$LOyFK}H$_1}krEBldjYEEp!6mSLu@zWyWMrC*2815?hEzZ)tB@$)KU z?j$*@2$KY!DkbT5bagew@T-$(j?a&$7&N0jxr;npc&rsLs-0Y6OG|39n*{zI($xm? z7PRrO%>FA#;}`|Si}Xn5s(}cDQS35Na{$07Y!-*5n>3nCA*Q3ex&#;v5lHI!(2%^P zJ}iWJH0Qe_Gz3;qfDO$DS6mM=fXI4~dGqq~S5T03?4FfLXwqcK)g5a}Ke$KBKO5Jp00<+s?4!$cY+$v^?f=vA3V1!HydPi65eOO^Xk6s%T_XACtF77>BU zNVjYt1q~wbTKf$KU(`cDu`>LhJSm1ei9W%}*RLCzn}ct0gMcrUlcDnSnf`#$Dyr}m zsr>mNxS_}T3MNC7%me}ZFROxJKtwW3i?CB_-~9I7J5p>yI%>vCaz~^)eC765utbgc zeGnIj&2hPvBD6MyFtNm$2zLxI!hvgbK-U*u7-i-YXC<3!Eo@J&s`y5sg%k2uF04JI z-wKz7SZrW7g3W=RIaK3oSg8IE8Q?sSs&(%RMbHUxRYXVB%GFhj!sw2_d@(GagefLI z4Y+^FZvw-QEJ|A!-YaWRdEq?i{Y6M2bsdt7jSc71?z3M%9tMunf{RH8LoXM+A%c>L z%vh|{#WguS4eYXtw92FY!&eMIjo*N)y8cWgQ=$>l2aW^=6!0Rt;?Qbfc@)_pHN~OU zs)R#Ok1Y!2m@pN=qr^c5hAg-A54fRiD;E<;{yCdmjjl;;M2=obaX~>dK^)lxJY(7K zxjV}G! zPDisp8Ppi*lNqQK(0ABJQ;JikSUFcpM(DufCl+5=jHj<%SJq3s^I3H2ocV`63| zL_xHD*&?+NBQQpb0l+s?J(b?JE%@HO^8uz?fo}kPpV`XHqInDz+$steSJ!OPY{9{b zQ6{T*?YdvEKvh(ZCR_@skzs0ATBL>@h>L+x0Nn2!Sa66E<6Y?of*C%+p|GI|4E|k* z5kn1-tj5su^3QE_ak`Qvx&;QAYo^+4v_WK*1(r6U;XD*C9?z-{APIj|D|5-=)8ob* z@llniht5On%x0bR-!JHBb!v!iFPC@kkn9v*C(kY>*^!x_bpDVW`@=)Yo=;zxu)Z*s zW4~qM(RHD|^Z*N`Mv~P<-?e)5 z)Hq6l!%&tHGLjM95EC8)r@D4$`S<42@Y9x~D#q@dU06s(rsH9in8{tCaI8WXe9I{X zOmx|&VTDu&dc-Q42tb+vI+CQu7Puxx-h`mH9bC@`awg?NwP z7S*^m(2J#`WY-l|p4~X*8nh2lprX3kke)I>k%g((?G_I2!~Q>LFFkbk$OKwXFf2)R z@F1()@a@jJ}h!uF68ChFY=1JC(_bG-tprhkrkjcyT}keD z+Y0Xo8SM|tb-!xj;>(UxXx!8V!XR@{QPZQVO6*`cgkr+-LOt2T`(tjqii7>tr z>{Y^+((aR9UXSO7pyoBf?&kWUrb4IrNy!m=7(0<)y!lgz6^%$TZnykqxyUGYGfW>s zJ~KgK)c;u@<&*G%DtOZjn$bv~g#fkB8 z{uU17H*de5gSoyPNMs1jX;_*7r)e)N$2{jJQ z+O?Cw+OfxbMc8;jMI61u&%a8SqHX0WW~UN2l5YOQ%_quo>Zg;O5FE*fC5(9# zJs8H+pn=QbS8r>Jg*Lj$b0%n>6t$`pLU5W!ge2`|pn>x{Dit7fwLE#k2%ivo#|zcg znTWQc{izFY#|o}#d|To*|MW@9KhP%+hc9)+*}*{_Eo7L4UbTMnx#p1(<-W(k7`240 znzc;&YjHQAS?;{J$SJM7X8ZQrYwro~E3?_vF@55#kdJ65VXdH_q`*nwH1xaMR+_DZ z=`ooViAx7x`D4%VNPJDQw*1@2m*IG_NLjF0rB?KIVhI>-Yyf0DQgwn-9)|;!4Co?b zo6s2_#vvI7W)SiP{sUvoHqGzgXgG?d7pqD~8WK3j)G4?TNYB~KOzA0CwaY8j%AWQi zkU+rG!i~nh6YaZ{4k(41{8p^$cDscpshv2Fhf5+>utIc)D)!Ie2Y4@oq*z%D74$5*`;nJ&!4lHDlUdwOb865Hgtp= z-<_MvM${ogF`ic+>%ggV5?)$4fog`VXaO|nxo#x~>x4QEXyO(<$GT_F*59{TYM2pE zqyZAXQ zs`rlPdjH?YwIf9mLPUs2v_&dA63K|H>{;2$EVGDYD=RB0l2jynh0IDBNmk01y?)oD zbI$ku`Tg-e=k`9w(d+emJ|6dR-LLy~5lY}9j4lu+AukDzrdSy7(JJ!h5P$LJPy*aV zu?V}KbL1^xm^lkyS|WcvS}?hVaK>wEYaazado-5sI(GmOiA?iywLZ9vzN@MZ*`2PI z5%D+aMG<*QOoAzJ%_~vk6Mae~D)LZJ#-Q1)!I{H_NG|=PRfv;Ip^We4!~geXRbNcp z$Syx1dHEcaT(B|biwMm}uGHGS8kuKr({aN^@ZMPBzmfLhF>Xu`jijy(3Vbl)gtwKCorBjk%Y>=@u!pca6Z zK{a?Ao=|eR@h%R9@&sZ&;bwiiKCsh$Wywj`W%zJPtvlagi;oG=n#F+iA$S7lxxPX= z85f+)V$gcQwD{-8^ldl>%}rYL&LnyhWCRj$_zFZl<^VKE&1-gfJM-aNn?On?ebW&< zY5Yp*Jlj4pjV4@E5H$wCztDKoTuN+GD4>|Zr+u5eE~!d^2E~L6!d(cB8Nm{fpi8!#?ncA?*RPv3nU+cUeW~AeahlLpfbFy>p9H zKbmmozHkkyA#Vi^scB%z*Wp|uVA52KJ`uO}=0}PjID*Nw6-A_cCp)aLk^u@W^Gux| z*|HLpuN~+raW)CoO{Dpnzdoj@emt27CK4`Q8tP*zHDfI>4j?f702kcU*#qFO1+VaM z6(vS6|(l~v08!AexmH{!76LYqPC@*rkKR%sE%G5krzy|!KE_jWdi30ZMh*NRVj z=>7YI2aL0M9BC*GMqgB_8qS?>Y`k#3dSG5?&-b_P-0@=8$%*~M4OM-OGxY0P@Ztna zR(sKM8X`S`B`-aA;Qzihe$37_jE2wxf=4s0vdvx==K}=>mLV`sIfyf~P1Q^UMd=`@ zq~40&&y~Rszl`ud)RA{#P-Q|je6Jc2T)`G+0)j8e0fU3-_L}Q(80}_%CIyq_Z48E0 z^I1dgqTt5yt3Ze$@`ohLU`{U|$!+^{E>p}Rml>O5n3XBJ_pFhNOrPGaEDCBh-_P$uazngbA_3@j}(>_z^*K>X!wGExVz zLvr71?zRp_~n`!uKEKQls(!pUa=T$iHo z-i}*7OdlbO0CWV+LuZYs5hj>XOr}OqQ!~Px9nytbgSJvfNLB}1mk8WI3^WawKt7Vo zHXV_2un=LAC`u#L@v5F*HZe2|W!_aMhdF=+)A(HGZBTc2W2i3Vs0UviSKpFylvPnF z88Y&-jhHR=8d9#R>{`IQrTO_~$(LHzzsheYY-Y#oJq$Y`MoeNKe@|hD3#|?-VBgGB z4mIdmSP9yJxd4V1-rzUCK)H@~nTP;^xq`3nha@7O#*z32_#?gVHRf2$%e_-I*6S5w0TF*={Q+;Xii3&05pvJ{Fu_AW95KQIM@%leMK^x z%9=ii9Rd`a^0*$^uV1I3o4Br;*hlDf-@e5Wv75h%kxksS8a-#Uu;Kc>;qrsFXCKLh za1tX-4oTleYy=}NA_Mz38~3@8rl_|%1fl|(xBS+fl9StrhmnffnatzD_%+TA-Y-{> zYoBXGXNY}P1iUnT>2(j@y>pA`F2~4>@z!m=?sB}(q}JazpT6Z$f1*ms&!6F;V<|r% zGKdN@9baES^MyC2+R5KcZg-bK@)iuQ6>2X(K16!d3`8Jl{M=)Ceyx|hkP$((2yjga zs5^e^0CtLaczFprjGRkk%lK51{hRylNT5{A0m~KjYZ>A$Q4GdcNkw?Z?iH_29Bt_> zLKsF2IXI=YYc~=hp5{TQPJl0cx$;*zp7svp5YnyTksH*6Pq=e{L-(1E3`p zCcE^&e&r)~zZfs0IZ0%{LGL>S1RW^|_eWO+MPG`_dF-CR1M|@}>4*l$`g@}Y$ z>X~{iic#zVdTIuD%QItXm8b`Unu|^5ARGsk0%x0)+8PazfU2Q~QjOw|%lRUaiXuAu zu!q|LDq(XUy~>SZiuJMM2lIQ|H@}}Te*TUlsa=hJ-=j(p?Q*p$Vm<{tf32|Ei$QL% zG-bVN!ixj$GPf*J4NOgEnstaK#f36&U;4b?~ z-BQ13a9<%1BTix*&IWQCvpZ~8pu&0@1|@?{NgGH6fa-*NE2b1JgXnx@I z77Um%3Sod>Cx+HXu4d|N&6Gmh?+1064sv!nVK+bij$$17{`Ig@O)FpP3H_i+Uu4T3 z2!hF{)Cjpoy^!-imzIPJ1+%6=WWnkm947VZC>j5Ozr1}ESj3+yC*Jy6xtWHhsDECB#}yH+bneK^H6GG?N}|JKIaz%-0-I)qZcL!8Vtx( z(1qYtGcLpHhmMJ<8nqS^`t0UDe=8zb4v3g2?LhYLiM`0WFgEHlr&K1mz8+#XFFMMV zlDFTwQD`BEDKByL9Y&|#74hFnWjCf1-i4LPaw|2er3;^{%UvBlm6Me%ANS_LwB>_d zYk?cbz26&sIxLJVkCM8O_N*9iEA)y)aCUI|0#u|w(*8hk1HQu+u(r{{?xm9#P*n*M zZ9Am5M`^ZU%*A?slwzS8$*8kaBux(YeXQ7uQD? z!g{_;c3s-zu{7lT3N6)HFF$PHf({rG78W+*4vIXYGnmPdo)?b5)vN)M9b_#F|73vp zxFSFT|J;T^gK*?oR8%A|!C^a$0Rb>gKiqniYy)WmBBQ*v?KpFBW1^Csc%s_~v+PR8 z;d;B7lubMOhaJv+Q$DdE_nJwe&CWOMckD~Ov=e%Ac{1|o?wP?a1Q%JQVKdPeu*gMI zjzUZpygb11<&d{PT1iwl&E4oFOn$$2b=Z}YOQ@B_-{RQIkDN7<^wm}i4kxQSbTge)|rKAGo}?}a~YhE z2o$y{jagsV0f?b{I|q*>5^^rDCdD8QmXB?7J^pz;Uex&HWD=qp33Hgx?bV5RL|hqA zSm0oVf4{tnEK{$iVXK2K1Yb!RwRy?CC|2gPa$9TtH-*&rQ+uK<~ZgS z8tk=bH|`(CJT<6rxHyM0-?N5dhy9pb?8}T7l}vIkOO6S*^31thDn2sjLRs1ejSR)0 ze4cN4c4RaYfVzP!#ZeH)FO=N+LxmR$UFWFZ@}P>lzz|j6`ln&1<$WQx$opPC={E;n zCVJKd9p+mJzA$q1gK)a~2l>V4-xY?2trcIa)N%W*9Qd{I!Mv(kgIoQR(8QQemQGD+ zqfz!H5`ZrDs`4s;@(eGO16Q{1RY|wq-qEoa>xnXe2vMo5992qg#05M;q~6H?z=Su% zI;$%{E+}=;VG$Q61q{Ty-s#e*P`AJX+)Q?ciS`jNKwyw0h+s=oshytF@1;4z*)uMR zNp903wZB>9JlNvdy?jJM`rC%)M(WaA#owza#U998KBM!pn0d|Tf|X@j?D?%`V&pT! z?hT;f;+B?x{tqYm-i^Ed03ZM^8}GjrT7F%gZn>d;HjFu(~vJY(jG-bPa#uy2vVL6GuD=twOFN*0)XKB``K$UNW|T(nY5u= z{Z6+5r2t6E-hb=q?>N;M;6_5~J4NCASw!Hk_+jh}7R>cONZ+QtDT%;o$okkut%BrA zs=Wv&3)y)CGl96(WEIY%z@vY(PEw4CE|5c#?k-4F+Z9GJ z9vVjbv!bVuW>~B62v&J)G ztmK)*4*77~_eLl8Dsxk`o{nTKtvn)fFV^;94tJ8^nIF=aU4!G|NyzTt6A=0iG}0yS zG9QM587V{vu%MG#y$9uB6~GyE^~6Tre&|aG@p}UBhKjv3(B3@LoUYk>)3)mjysje; z7gHFxc^}^_>ku-UHTG>!@jY_6q%>Z62VJx{w|_s|X7eAqdp;OY?^W(xW33t^t@-r2 zU_q^_Wxojy?kH z=XyWP#8sbOY%<#R8PuMQl$0gdUx677aTY>wKYKvk-4O;G%gYN_L1s+&o3)~jUS-?9 zS2Y1aM?UfqFB%Qh{pFwvTn8RWe3GzzuwOM+lRzP(?`B9t2WV57bjMh@L7bF;RM;%U z-_Q;6q$+J;;_;(CLs8b!n{|Qbd+MUz2Mb4Ycj{)N`jV1!-BkCz&h1|eO^r^r^zW(g za8a|Bt73b8)R#`pF~PRDG)=pg5>n#HeV`Y}M+z=U91|wWMp%Qb7m9KQUWsws%`m~M z+YeClsAs6}%k_FEf)ejhlNkt$2IxB=ts7-M)SOU5L~)>!lHywbHk(N?oF4GXjVIHZXX^4?-P4 zSw{#w#HHNn+jT!QfQ^9GT({k4=y&*0PKlROg}UMzxBwn2%jm_m`|nfM8q1Zxsg^Z} z`5ogukZDN~zW0NIlF7i9{?WQCgT8C+jpa_Yo*hwi+59IgFzck6dHtrLmWM1~xb;}J z$IV2Z#S+JTR8k73bV!3R7bjh`jSYIUXc(dzka^Oz^IniXqplb|8Xy}oUP8|pCMZjO zoFt&zm<)9cbxQ*E4-JAgTRA?l*{3Jlp^-DxRTK}=mni$XMPeX@xidyDCrEwVn+?zo zQ<8IV&OAH24tpt4N35CQVr&SQ_aW@t$fV%=_XK-$p4Wh0vAJFX4Wk_9N|O8EnfO7>*&k66ey^92kj#OuHt@*x*r2{y98` z&;cTz5X?tS>K}sf;7X)Nll3>Aj~AO;;cK|%GcNY~NSJzCy+lK3PjFw&&ncOB9-;f1 zW4pK?{=DbzDgMDHrei8*PpO1yB>)+6SOzvaFjDbuOWlU|N& zYN)=~&&t8j(;zaO=j||&cT+OPl4C=1hV2L$RS@a(RK@?M4hjrA#l!0TN;}Xr^7G%@ zc-|l0agYSe{68bw$3QqRfcYX|h|v{h@uj`*Llwm%uxtfZS}*o>k})zMp6>+cb?sQ> zJakAkpN;BrB6cm6R8{FQB+|$ab0y!9IL#uw;RCP`=}}y{XZD&rcG&s=W+aF1m`F5I zslBecWq}E_RcC%Uq*&?4x;}66$@}EbutnsTdnz)*#1V zGH8~og|4>->#UNXNkA1Wno`m~zqdYJsl_8fAxBZYTjE8Y61{HpIvSPZ#+4HWLQUd| zW5uhk@!EIN4G#?w;bfc=qP{|)a&+bgv0qMRs2C^|c>L8=u}p z-Ioob5RlUhiEQO4a`mWQNo*AlQ}g!D!-A8N`o3+CXq(IqnMBj>{SU$v0qMqM6MGzh z93nn9IA|U*j_0ljd;()t9$>F*%lx3?Bewiv?ZwtM8^5Ae?>rS;UCpTqkL}fS(ig2HJ1c{D;~?TuL=} z6}KHZOQ~T@KOb^0(O6+&@-WwiGCEI>z^?y8wp=xV6 zxIK2@#-O8yknu&mw?>+fPiIAkMG_y0Nn}98!{{IkXgf zr#)Y;L^PjJi@G2adpVxRsqButUD2nUbI;RD$~nb;2O8%+(a5R?HL(^4TN6qkgi`>$ zi8pWG0;ePndCy<(FSu#1KvuE{M*z3>477(~;)2?S_@yH;b4IE#H2J#-nr)1BIuK^b z91=3%u0*Z1tBvXGS*I)a=;Y4MX}@9MuSWZ52&Ok+aovBX122rnyCuWrx%nkF=73co z<~plf>L)?Zi6*2ULvJFb|2G}~Z-jd)+kmX~9I3sC^ouz;F&51U+yH+H8S+*O#@B=0 zVuWobhLe<606iW%)|#2J_CGGbv8a8$eBMIwDE!IA!y-Q%n?Jb5%Wy} z3xm$6IQU|s4*z$2YAOXC^;4}}Doe|N+*Zv%hIHiI_WADD0j<>c5M3FmQQX-@Nwi649V z;Ic_9HTT+G6J7%zM;#hg?@OP_2-FEyx%FkQY`_SW<<+Zz3ET*IoK))=TN3CRlRUy7 zz}579@ZdqS@f~fsIT3scW<*}HZ-QYA@A*e4ZYe_~+j<3uv){AZB(uf$-H?frYU|pq zGcnb;EiSf5%Paq4jGb3$t5H7&g?MTAaDXoTzgODiVdDb7bm=?vr&C_k9UYWjChQBG zPzv)%3zn(xal~DKqF`;aD=A9s7pTbepX(7{tK6xD@2B#WK96$QDWC$eAV-qXam+a z2HN1)uhAIhYPv>!Q+cZMHUdgKsMzi?E7$1#sl1oiZ8PB)!T8p*x?DSi#oYa>O1{tF zr~!4~v0H6BRO=Z&t>fa}m}xXC#E*uXcuawo(TGlwaU?h>=-g(mRM$e(+kkyViAq6M zgVGehxx^lGHt*w-lp2zYdMfIm}I*;XxWMc-{!OU zx_DIKD z8?1wX-s4XUO9NSAm#wWo0Ih+!-a6C(#1j%&^$>fMQbl?B7=m1ASQsg?Y#TM@dp7{e z#f&0`Mts&2kBMLB9P{zUlWRNG9=4Ji_fF;U`f$G7w63t#`S zr(8^IZJS-f+s*T`=C}NIbyE8nyA<+U3H)4HKg`|pJ9GNcxJ%hKf#IoF5*9%;f>xuNp?(*GE7Egg2@|<01-F+@jD9Y%JAIs0 z#bwp~b2mqrf3BRdJIB|0fb*onmbzc~Do@8Hoobm9a*MkzVU$Xm*1xr>G^tHFWd-K5 zviM?Ye1!Zk{-q$}YciFO3YAF;`QOO>Ir^C>Zr52b)NQ~G1&iRUxVj0k^~U4;3Yh?O zN*YhMTsVH?4=;{1DR&6eT5Sjwj9olD#14W_NB(9rU|>w$s}Z!%AU}e$8raO;rv;5= zQXQcGC9cn?g?TZkO+=Mox3cU8O?-4kkkb!7?Id#j{)j`*OmnAll+MIxOgG=p5iX_t zrEPy^Ja6Tll9Sh%nw@p_;eUS#II|c&O8YPnE=R{#>0P47zSu50ueEF)E!MwB;YllF z?)4=*VTE7hm|f{?+f$EIr%$XmDTmx7#LmZneqoZl3gd1`=x09G%;7=C?+0QjA9>M? zNJat{#EmY;Vge*#H(?NWndAnmY-)~XA+c4RA9~jb)bD8ExUipb*Y|yvT_aqn zfA`78$2zC_sQ0!%omSSzat?&=DiG-4vP*^~r1v9KKFq7+BLvdzZ!>@jwE13fq}iC7B$bQ{@dXR+!HDD zLnT%P-NRl(<0`}>AX+V0PLL1dB`GsZkgoyVMbj(mOR7(9iEy0W7y^kTIrq6fMl44> zw&zHDt=Kl^d}y3-S*smmeR?S3^3AB|7x++P&``WY%xxmwmX-DMc*tkE|%_JLpR=StuC z%@#jCEvo5Sszjz{eM*yYIGQ(2%c+!Xf9l5S{A1r49 z3a{kD#h>o;u25i+ay8SI+i2PILqI+AR7o^{X3HQ^n!}#Yh5z0|&g@tsP{EVZA;IV` z;YG%K^%Uj#YSf-<$OBPtOA=_~tgFLtuE#YrAPciX+yLbgZm(0J({G z5ngv1Qigmaj}*_#%5%f{E|pmqsvQD(KdQK|ET$X4s9J!? zg$9LQ0<~ZrXc0tS6vG;Ro%*6zxT^NYV+Gi_ynR4v0%I)@pORZ?mT^TL!pWG{^rxbMlz_2PgH;7W1i@7QJfJQGOdO%)fyIhblbbF4Hw<$(>K<}bJn+q|aNI{| zyX1Xg@5d($hy0_IKx5QWpKYX7Xsy3{@x|C~acXB4Cq+dotEVA7cWC8>n1Vgp0uoMG zQvbYIyaH89Sx`6MfUbm&xEBjXIA}cs16AOqhY4n#LKn^ivExJ-SQ4lbe>zRDQ z%$jjJ%rNRMU419*L$$q5C}!0k53gxg+t+2i?cUE1`EoVttm)jo>&&2qF0NoTj@OGW zp`wFgtA^JZR-a+_8h3uAk-wKi%Hn9b_o16swHrCKE?pu_Pe3L00BNtI*2kqpB*zxl z6Z`9Py4VpRrxUE0L*~uiP*MuTbQ-%@5Ri z_DJULor2HFf_ua7TzWl%y0g5~WhL3=?68(v&h68Qi+zHq+vH+__C#NAFtNO z?vzTkhvLkCOiP|{K33q>QGD_UuX1QCk%RKj>-%pNQVXVex2>*Ls$xtt2$HHw9yK%1 z>G;*H`~F1NzER`#iZtD=t$k;_;bic* z*|bH_bO>Xs!JOAB>XlO}^cTZ7IPj%xlFx+a@)@ z-UJVCI*CPo@aDkr1C#W@QssZSii#fOke6C5nL#d?;Gw3T80HejpbfO}J-XNXwj;q1 zRcKVmZ73}AK)(fA{I{%@1Q+`N(1 zc7UD2SWX9j4^xz@P|QI%Gi|#`-Sob5%LjI`wU70(j_*0ATV6B+X5Dg7n$k8XmpLx3u_%M<$);yxEVRF;ujUaXHlc>r?xiqGfS4OULgsC+iy@ zU*0FE9Y}uDqDyc^Nl9E=?%uSKs`u%<+dFFx7`GXuy5-QnrZP7B)Vy=UhJ}w+;HUXV z?2GBWF+_jnjFwDrv|>23`_R_~(akKM6Vz&30~f5fd0OTj8Jg>JqNsoPt~5WsH0tnx z?8u_S$*L9ilhz$&#Uwy~#l$2+F+TXB0enME- zhV_JF5Y2k`@C>cV_}+7_`M(q1KC>52XWhAT(@0m-ADYuH41f4a)Qm-G`qFv=oF1g! z*{N4&U6m;rIQtXRsJ90@hx6Qm`kxHrIz|X=>i#oWtNHhAUi4jSn5NRHD3GpTF5g-P z1Q44S#Hj-BoLv3ZOZAhkJHTw_;^p-RB}^CuFUSzpVKsyj(o5eHt5^QuXbVW*GT`n_ zn+z-{40=zK^)(f%W=bvnZWoI#A9WusIP?B~#g0j7q1;~%-D4paM7}BMY6tYOtY4FG zFmA)oOr|3Bizq}^Kw}`hmVzuI-Qd5v>QVdZ|FR1o-x>EVZ{B3g#=(`s&FSgxM(X(Q zG)~+@d8=9K2Sq@kL8g@m^zHz!%UfEuVRB1W1Ck6&23d*m47jd)TZbhsMj;A98N3)& z@HBfqhAdFnkt+%LCgzZNDQYH|5j@khB#ufLXAyG@t^HCubK!X$xPk(GukRVRd_qpL%%~~5__tKUw>rz2P>85RBX`B zyAkkw7#k>UW}jYAcIMw`sS)*j^Tt^|?3#i8$~o7=HXMDm;i(t=A_gnf(p8<0T$KyH zVojEnIyGdA7>i3r1@n=2<@0 z?Y!&mrb}J&f%m3K;NJORyhb{rEme| z(|Y;1xsNjBVE(0qqTuEL){DQc``*v`+E6qdV^NgjrC~Q;XZ*@4F1+o-8+_CCG_eme zD%2)^XbB|EhZzew`XAL^`nFv1){xhAc!x z<`F!P)<$uTlFl8J=qAX4wrn==SK7kHtbF4~X6S{=&`v+MFFUc-kRR_z(rR-0$!lUi z#Nva7La)$S-LX*PAM5*aTI{xqMaNa)DuEfA??c+urURy%q(R2NBf_vM!Fk;D^?>8h z`xb`r1$NW9qK5gjP3u!oUKmW*DYYoJ<-U3)pUKf;d(g-@Ww|xB)EjGfR9^#KQVt2StK2qU>z&@4@4@%z9_?LU=+2ObS$5n{a6R zp%<$Ug2|jaw_EJFDp(1YYUsJ8{B7IpLAnP0k~p1(38pC9*xMUn`A-1ehp5UyrLRF% z&Ih3SeI@m#O+7HVG=_uR?A*IADQD?fi6jd!Uety$S7lP$yT z^M{h`%_FTW0}-p*gS;M!dTf48mDTvUYRzk^9e&GOc8b5Re_mG5mau-*@k;1OVL&9O z$V9vOx!6K)(@7cokuQ7Ovk&GN4sgU2s-JW)nEY_b>FXQw{Wr^Qj1A;jT5b6%TXDzu z=ajA}HUo=>L~BMp9;6PGSwO*~Zp4u)3cUMHucz%s5-9ImS-&_)fA5GOn_$4{{W|db~ zd^hY}J|~J~^hl|y9?EDPG5UG$idEOv`t+7arYW1NxVX-cUTA?qL zEI!jAUPb?P=fVrok>u(pM?ju#$XW>QfvUNs;;-@A!X*1&$LYf5D{hS*RnC0KkHj`t z>UdqpblHGHlFn?umxJ~9u5}%gNjRj>Z%kPbN(@2S(8+?Lc^M!GmP4oX{N^VE2>A)D z449ofOg(jZFZdF#f`q>q-4CRy(&oR;$&f@1x!AI=u{fu%V$ zcbs_+^&YFJ`xc?~6zw-$aN}8>Mo$pR?}(1uF(!A;vZYs3=9Q>8eztpvJ#dc+$xo2K zO?NJE@u%A^rvW9t18*4)GEpz)uN*`9R9qvkh(dg9+#RcT&kA}e9*yu^R6DTn6AYmr z7@G;`J>B|kCcCkxNOknC4Eg)t2V-?yMjl586()grR^J$gbDDUN< zM`fbNiLFwS*=7+F{|%jb@*3kR&1`!0TC?L7qp?TlE{`{m+ChKFqHVxUuhQd0{MV9< z3$Gh~9m}?=VA!i_F56hWA~fS+xnr_ITb!MxE`A`>w%dT~>cW<^(@VcxPb^D9$+WzI zV?kxjRuqf(ma_NnsoJ@#y=_^{DV%ND(5%z(nuTXcMG6xD(3`Qb`*JPRE1#9}@3;~f z>CmtAKGDmy?bD$woOnM}j&?w|5V0hI)|-8Px&!+^@{!Y7h+KgHsmb~rSy}+MjSTQD zW^jnuyoA@PohofyH+5Vly>%#1*JYLaSEn#az5SCcNySU1%E`EHm5FG^AF@w9+LI@3eebNbrDx|G@=<4^+0dKajbrJ5PywkaXrK*;->}Ge*iGi zu=NE|@L6-8kvTXmVf!vcXyv|$Tf5(z_aZi36@k%X;&&lGOdo-SNCva@ru`=aq zV5s-7F*+(rszKNAXGi*Wo#VNcpFa7VXD?FP&~Y|o~FS*Bk z_!|0q@Mr7&@RL^z7lN))EQ?;2 zKU)%9`(BG&8~e%`iun27ljiv9%J=yJMeIsHQ#B8L{%BH`dLq5uZDyDknc~u`opSGn zD?b#CUug-O=#w9K%+PYsb6HqFUs~-&&(KgEWGv}fPHOz23CrA7MYS-Va&CC<;49E# zH-5^%L2G$N@k$U^H`|SN`Rk1@B8JE)b_7pOOU0IabY}u_jUt*AER0! z6lg?A)hDXAfkQSIT(_GZ;@fy~&u*;WU}+L+Vgw}u?|=k+h&9#2B7|4%Nmw&C)%XN; zw!R$KN!>EfzK4G+mnO@rR#vQQHh6q+Iw+H9t{QM<^hQh4rAy04Jx-uK+|1OVgzCRR ziN(ooaAI?R{iWJAwH7R=I;SqI<5ek7(MkUJ9~U6*?oPR@~{`#F=EJI4ec zus&w$^&c$)-0yI*H~pTPSm2T3NNqC1obNlZ+pkyuTMl|uteo))icZ3xxW|qlV zok4c%e_seyts2zZnpjN*W90e^rNoCYl^N@OzpcfQQ$4}%^tp~gyI>^x=k8@!kOtZ% z`mg=?X@P;*?c7`&4xQLylbyWF}`Xw6lLl<8f+5NJ{5l;d2m;%+aIBUmt&u8s4tDj$Okl=AU zOfTd(pMU+gV5DGYUDM?C+|!$#ZG>G?ZOcf`Fi3;%lzOg8#(c5?5K%My~=lZ zV%yW-mENWCOeOAh*M$Cf^9QrsN{`wKg`?Yqo+||X5{mD=qDRH2+znyqxx;J6#6${> z_P_0s%Ij^^l|9+xJqL^;XD0IG?C{LNmljQ24x*?}P_2Y?XbZJA2&YvQ4h4ydq;HN} zdLXWpBHyL+dv18*Nxf^sy|9jbdDqMu6IPMK`%imIhczb10YVTy9#flN5X~Xo7a9K( z!F_FQv@tzEw%4v*TRnC2IkoSe-hoWN2-~ zmsnz27e#C)B!c2xv@~@B(pC3be0nMstQ(&rV$V(yA2<|i?KbCE!nAxi3D9~B5nuqj ztL16W-?fWgZu1r%MD5<25M+e1n-Z+8K|_Ah-1i@f%1Z(FpfmVFH-}uK3_ya?E^?0r zMYASipJm$>nf<5JT5M3gpu8s2O@FbMDCTe)xl4Yyme$nV!Jo;Du_M-20zgJUA40e@ z``EdZz`>%ECQQ(SG3~D_Udj^` z)bFo*$b!bBzHah_-eXlK#?*HrZmcqauA5Gde(^iMpSn0?_nxieO@H>(B zrEivtUpU5CK5pBu^e~{jYfJaLF*B~ki4T%9bG$Qb0s8{Bc)7YV$-FzZse$I#%_&R9 zZ)#lT9Tk3_90RLR?DG?gaFBDDt>Q6olA13*VvWBYhtM_TK5s(lEIWzzlV$2uDi7GV zTR%C0&ESpwcwC2ypb1rQSA`&PQQc0_kt-r>R$JJOCBFZ1CS<CqT`Y5b-X zF6mLez>c|W2|l5+ra6_5Tff1E#@qA93P1Lqsl0vv{sRh6Nj}-px0x0z!3zh)KYW>a z^OddteEZM6X=iAERj$m35@TJo+I~nHJ(wy%GC=}FP(oU7I>61%%^@U23ypPHGVLK! zaM;>j4^2z~vE+OOA+Kx(Ht{=rAO1Te8ql4b$vTKhW4E0_ipuTSxA(ud=Ny#iT3Q_` z*mv@eyVA;1@T)bKx4XDlK3yI$luMyoEZo0YTDp~;f9BoD35MUl2JZxhZFV-yXDu34 z@Nx>)P*zq}F%<7Hin{J8pHhmAJ%3P%9{f4OdmBSD3I=w%ty>2JBO@6hS6v=-S~ZK0 z{!W^%z63c&M!e*lWMz%&>|{6_vTGy3i@*rG3H{OT#ksb9$ArCsDRoDi#+?R+SstV^ zFzy^k%?&d{D0Mr-@Vz2P;xMVs$pRTsNCzLE4ZApZF+ieLrmUsqLXqg!7>Q1i@?#%UXFu0x@^Ok&-IPcye>nEj@5+Pg$21lk8rax)_h%LB z?P>V}RZudix6 ziX8P4-EYiRFMZ~{A~nkd>p5Iw2G{8mJOu|>BO-oX@saQIdiz)`h%&3e<>?Re)3idn zrGmW6C1)ox9Gs08g<^Xf_wCqq@y;tJ%ny*H0YwKyB!1>PB9xk)%)_ep(dYnQO-(Jk z^HONgwph`Ow^SovAIuk9v(1>g#$=D$C7p5I{EuGJBzWBkLNW5Y8FkB;j1Zd&vFa;JojETiFlsY{~Q47q4Gm_xV}ZZ5~BtgSqBw zLmh?mjQe%UBCK63>P%hNo@)NM%S8+7Jn%~zho>pCkq0?E^G0nMS~y~X{y1D9);-EO z`ug_Iahq&@5`v=d_x2iL=B+Tqbo{c3i7!~b#h*Vj>@OHweWl|Kha(qWn#bZzP@|%Y zqazgAgR82QiA?5(4SvTDx__3wwQJX*L-c?@VKN~J;y1ST{#3W~(NhsmEQrn#oFC<(bneS|V);3A$mK`I?y>1h zS^Dh_MZ0_N`n++-7|I-;oD4`*=H&?grs=D!{WOm8+ne)L6k|g_Zng5P{~o-wtco7SyEc*dsHjGn!Yv6y|9&QR3{bOf$S>-La?_7S>U|oP2gMB(?vX z0$%JX5~pKe=rG3%{nIgpPND-KUEd`+;Fiyd-QzIIqRJ8$c(EV!&)KJ?pm*2R;AR=Rf{gsoa>9N z!k;i>otE*iQgNMJ{B}|ACfc>DZ1Y$VJg_~n10zBrGD?IKlaqU!oW|Bd(ZHKXoB`^_ zu1AbxtTe{ty|yBHmlEbB%_!ua>RZ_bBvcl2XG2-JhOC)V`Pk#R3*mk{Q8*UgiHd)DazNih?@RlovTxt=D_zwl z_w{fz6}TtpK~{_`D`5b!7KQISBIW8Y*LBfVPD(0yHzuwSP(Q7!8~5eB|F3<5j@;Pd z=Dc77RfLECm@68{Hthh3m#|7_!CofziA@bxo~rJ(0sRid7^RP_Q|oXqXhGv6>j2oN zjP^0-Nq{nU+Z88Ls{p=czwzT0NR9M}DzmtoU;2`R(vO?#;l@n8-Cd%RxYcdJ+5BotQ9O-%XC5muRN4E(wEF|yH}vRI%Eqq>wOMfFMow0EYyIP@pOE!@ zTAM@xUrD@~sEXM8!bn%)O$#%b5{~tJ_J5eXA}c?XEKC;4G$ser3hkwDNe!$_oeH3! z;7b?rzeu}=;^JFDwxY!u3JU#-2^!i%928}1x=Py|M4$iiv;H#G#kKg#WgV>8C@2zF zZmhe@a>=0D--F{v3)5MT$%9aOUVP)YiXtIL*5$0b8`u3UtiDPO8a6}DY=z4fTds8Q zR#Y=~RV0QDElj_=+~OfT+S5nj`7~)y(+8*3aqI_nu37SG%5ATGZhnM9Z(k=x(diS} zqrvu8ov#=v#x#2^wDZG)6<3zGFN7WdZE>ILi|?YU>ffSAq1)NrXCt}wz;H#CNAb@G zyVh`hkh)9!bBd+z&~U6u9zLWOa5AnVpr@8|czS|yi6na-rGQg2y4x;Wcdixx7Tfr# zW&26%&dF*U1L-=Cmn#ET>$JVYKC)U*>p8mKJ-4$xab>dQ`_TOAZ<`jVItx1S^Xoj= z#BSBdR~W7Y1~V^M92}u=HhQ(jgYEN`w<1@LI*!OUFBUE)s-%B!nN%B^=cfEBl4j9y zj!`5dI9NuunUyxiKeqH|RCF{4ocPGhR0w=7;zNo}5dS-OB<8l+S3fxe- zyMB`SijHpSo=t^i3ztKilFvvEEuGkWGwGX*tcI-hWxWSS_EAu@qd#=LV<*;GZt6Ura${MWGlMZYBa_PDuIOMs>c# zC`yZ)ybB7TYq9tZ@%rN0+TTq_cO@mLq!YDapn)5Ri#)^!zzDeXE%yWFiqK&@1>l?> z8ymh5VAn$*;)5*$7Sx>Ud0Ew0hwq_K6A4V;^rHvC`!uduRP_7r&58T0te>&vFCoWW z8=5sI0dn6Zah)08s?M3=_V8nKMLE3ti^$0;DJ@;hp4QNIT_aL;uB0S!oz`m$-JT;U zDSdAu^t_Kevn*VmpStAaz$~yo3k5@Pq@>1`&b^Xlz6_6s-kQX$9F5+z>k!@HGq760 z4(M~N6hH+tASUH=n6&4Qm;Ed)tV$zl8dZ@Q8k@%J4*pu*`r^f%g;#DdHa~uSk~m~# zc2nlA04PuU4qaLNUZ0w~w8Qe?^x*MJQ*H`e_q80%KB=AS;h>)jjeM$v(AY+TKHsKQ6dr3mbVmSwhv*rGto);o=fZVxup)36=(Sk2}x zpstzjiQkW$c6gaO_~3vL>uEO?26O&*ql2h!QOA{F-;g+`4Z3+4IcqnZs(dPVLVV7B zXUO@vtYxLHQ&Li@N*A@XN+DW;rb|Gai;hy%8XBitL(+-p6B@MN+T9!!go$kV`DqEz z5n}rVirbz0J(yLSVd??8gh0*mZx$bkRndW0MeeyAT9z(P<+&Rjz{1R!8ZfQ{&1#oyAkI!V9M4BK`C?&iE74zo>awamEJ&$$U(#D zo-8=F95?Kp7>&D3Ob)zpu)XnP=`gD8cP`h(?O7CR*V71yt-aP|pq@=dvx>>QJ2B^{ zkDq70LcZ$W!y)y4%ygEgep0B$txoVxXIx9+;N+UFb&MvV(q~fX;5pTzQQ7S?pQcTp ze)y91+v?Md&ZYbsKJgFEyw;R*aZihr#BcORn-b;D?oOvJB5pNa!=LpXQlQ1idAFhY zD?TxeLl3nwc4B)7p%TnVXo!;n)R?I6#Z{MYRHV>!`S4J3-Gx}YsAjRUdktS{Zj4y} zZhTQ$8~?{WgYnuc^UlS@D&^v&0j1)y;0o066oYF5_OP4QCwi==2*1I$%Pqgl#ri|s z3HYRbhP+e6>1kQgBW# zi3c$z2fh-C#TaC5R(&YrI}N$i1U3F8Cx$nY>#L8iHd||5vg-Uh&Qm)6?W<_nzD-pq z<3M3G7E%;3|LZibX3yS3MdW|>rhJM7%zmL1Ea*u8E=JTz z5CTo)6~nKy;`_o$P}#7>WIVR?SwoC%w;P7jOtyA*MASMvsqq42_e+7K5pxd`3?Y+N zjHeO^4lxWUZto2K(~ASMUQm23MS6bYsWz&%3SX%yAAIn<^i2bS{ur^FJBWY0ze>ea zQP^}%b{Xw?>y0r3?q@b7vC=4pKnId++K|>BE9Tc69Hh<69>01l1~qFW2_FC!SZpB= z2;jRuP&rVWlBx%9pY?7$rQ^wKz3$Yb9ku>H-=QlU zyF=CDq!Fj~sqn*TI^NsY=L4MjJ3h04EXR|`H($d4KBLpnyT5bi&M((-SjORNHk_DY z#mvSBH1Zu*MR2!+5xr6Dh@iQZvzW~MD-6A$#J~!LbNrT_WHFlX=E%hW*Al8h2C|$d z4!91K?OnagJaurF0bl9zZE87M3b{`^PZ$k_wZ3cD=)qUC#$C>&@BmF6c zDK~hVQXHgF^xG|Xw}l(bCnPF;&`rqp9YV)l=rb??5UBXq(gsTGL`WT~*nEF>J-PHG z=yJ!ZlKy&QDOCkEX}`@B(E^&b`p~}Y8J92jjyyBbaPo_0g8?ZpWtT z`%C+)GU5w!H>mQz6dp04f$0psw*O8^*|nz(G6Xl`rmbwb_bo5TpE|*U^`(l_;rkBj zx%QPjl3aQZr)3}=;2CB+j~f(Bw^`0&Ngw7@0nkg+hsPV72@N&uICbclaX}sSNZmg1 z(vW?txoWI;!fg}r@0sG$N5@ufBL!osNo;!yChJB2eN>6hNqmv3!o&eR7uS7!*{JAo zMd`n1=nBpdh{=9mgsE%b=1d4L_?|?>{HL48Kd4vMw;4&NF(aX5B`C!b?-kH4xE$%5 zZ^8={w1V!*hLf_0;S?0_ZcIs_97e98rKRE8K$VgdDp~z^^pscK9RT4re znW3ygMzY8Eew6F_e15;*_mAIoyUyEno|jYJ@7L@3JdVflI3CC2xT-K}N$8vM8M9_h ztZS%scj%FEe>HCyD&~3m#ORi9(VdFFh*80wMBfcQpC{*3oaxhc(x7iMKU;4z??^q& z0@=otk_^i?#;92ym6*MAu+uTpWo%H4R%BO;^jYvv@mO+0M`iPEg`ktUH~Q_dxiv&# z=u;0XV(&?$eEcEjLN#6&l^RN>MVHV7DA)x zY$EVfmIoJAHz6(#hTZIT+6pgD*;IVbWPiAf_A+(Zg?i zyna-1x}J@Rzh;3_vyNY$PI={WF2Un#h+$&ticx!gY`UQ-{(H zv^ZtZ)<4zsHSkPs40SgWd2QF`^2Ama8+De*{*uUk;qRYT#A=D`UaZmEvPfH1$go^Z zmOHarZ&_N`!L@wUr+GJ(2~@V8A0>{by)B_3#I|C$v^U*#Pv+%~-=n`m#0R#6PF^)s2$>n-oBMXt z$j{RYQd>pTP?=J>$r4}IAgjlp^M2@(-_qUuUf~y?4T9k z74Wcjmlo+I=U9ZBoc5(9@qR68oz0qlJmitd-&|>C1PAcghGFo3=#g=|r~eX!rzD66 zCv@q+WdyW~V3Kk=QjwiK9c$+0<+-o=%Z3|H;;YFU8ouT3;EA;VUaz=DKd|&|8)lAe z+Bm@#54cMdICI5Dk)35rUju z&4}7tEhCa<*es0SeBnrN*|D)9qxHTbO2ye^f$au2!wI#DNZ#?=$nQ*L&j zRC9Qr%5#%fM73?z;$g^FipmzkxnViw(mVW~8&B8&^R?46ojA50L$MsYjo{#45-!s1 z(#83swwzjxl>Fwe6CD4e1<1FSB1L7??^Sa=v2l``!!)4vMr!S{&*%H}?k$ZdBIv;7 z&UqSgf@hGbWGNYPXtMb72JD!`vgit(;*adYEiCKXJ6su$fh^#?OtQI`KhmHNmA7zQ z-Wlp@MW6cJFDI7Sy^PaUbDeg0uExdT+Id?OoJNEn2sN|WF>vCTOOB5tZarWJSyWWb zehVHoG1_#s!&kNTo^tXXM8gg~4ylwZbevME}!S2f$EjrR($+1KsU zO@m>-di+iQRr^h^FJX4{vS-#mdFtYI|Ewu)M5?WlI1cYEK@(((TLJ$)xf(M;AU!^;#%f zpW3ynNe5exO=@c~^{9jFVfje&vojYgX!O*wY1AAQg-Z>B>}t%ey-#JFLtX2_8aDO! zC7eF4X9(~!+~ztDot@xdF=gzgc?p{)vAOH^X*cKKJ1tbh5A+F6dAXw5 zKE1lu{SsGhdv^2N<)a%c*3>G?ihp@jZ)g1Gxg@*WBY%fyrbOYJ-9Q{cy_wAyTW2{z z`1tJO8!mr%5StLz!+oR>biA~-w)hE)N5Q$zd83y<)UjGQp1n9A>bCTsfVi?6j%70A zY;EhXWfs}AOneMW9y4OXl(9n}7_aOaeXjn{{b$r~_8Pgjd_WtOt_4}cLrf!77wxp& zQF8h6aEsmjoAT3uC;rt}LV0Z!L|^`tKu-O0)VWDP7aC2hTsU$hPD@F!lK<7uwE8s# zx?yvg5#Xdo?InJ9z|3|XI@F@iICkY;%T{j<=3FcW!s4U(6E178}sB zjyR@g1PmXmO|oQb$zMMPVcFkRzOkI$n=0h}rGLJ^>IK|q0+8|XI`mA|2HXirvPrX@ z=-|+Ov5I}3d;GesFMmEPGf7R@Fh>T6Y27|a8;DGY@b1E3mPI^WROd{#?I!878zby-bgo6^X}+iE5}^je@;!)N@K zi`L2YBkaNwUY$*FTDu`4>uBtOxku(SQ_Hs@k6l74u?~j*(xXSMC2BKtycOYf3zxsF zdESY+itrB1fynM4RM@ikn$4$9LCVGlEccIl3e$BpJ9`-QAWEkVyLY#4J!DmDo)|^< zA}=pL)-4EigGU&i{X?D_q|PjRHrZzX;0^JA)|lt?RavxZSYYyx64To^>gwxg#YMDl zF{fYp17eH{xWviHi3iK&a_I@Op(s_vamt&gIq=Pp;2OY{8VW|z4{aKpYd&U-@A!D} z0^lv`L&F?J^s%KyubS}oOEFU2TlNQy$3{LlpW{tu?Sd;n90i}`H9(z*tVYTvN@d$v_APAPV z!}kwm$DVqaipEIUj`gqf`N-=sp`?mp z&z*%vxSujt9m5uFPvzweWGfdEhVg6~3@bbE?Ep_<(wW5_ajDz_s~t^|Ey)q5&wZgk zbsoD?d)68jSCZ-Xb@|ZXpoDXFr;d#uW95`mQ+wEL@9dh|B@-rm+-@;p(VcO>Pi@!z zaDP@X+<{Kf-=|9F`pm7tvg}?g-$CVcF)OPs3&FR1FimG=U+-{wxP~3m?pRfH*Bi5D z=$V;sbtkOe_iN8(<3(?^9~oWQy1H`ZqjNT!@cL_ExU@;@2Pf~SHJUWr@JwHyv(Zg8 zj^mLr9TSd8>=%I_`AFZ$nW1ggf-e1axx=7RoO%BIsu;_ZLu(oN7DB-L%l%n6(Ww}< z3?5c+a@YRU)YOx=KU{jO>|xwf@wQr%2;0;nuB)s(XDzUT<|#Ar-#sN?+d#AKsQkdj zmsHBm3@g}JuPp1=Q!sP}gHGVGdY|7tocOlCWUxA!)vs;#lkQ|?zxn=erusBv8stq?RMyHyA!gL&L1eXS-@aZ=`a*0^?&PWVagI{o z1P`?}<`Y_2H}bH$omP9e*W((eeJ1X$m19;}-feu&lbomxmv^NqCA8{S19#gsrFUk@ z25i}Uj)SOdD3SHmWJp;RfahLMOosF+Un;k@tw%e4=EwcR>P2MDSyxv-;>_XhZN@#W zGj6|bhq&8Y%udy?E?T|XuCR!eG6 zdKitw@&z;207@x_$CYt&QZs53d{g7luKf*MWm6lSA#t}`7h31^vG#g$ zYh}d(6+h!XV-?EZFPiGn+9m1x*|H_S-!1m0At|9+J`D9{56{+8)U2z*fWd9*t@WWP z%TDzPZ#x@TnikaT#3s|=P$96J7If{{u{M6*O?bm9wQ7JPhhy8$woQMw+3MH@MTUpR z@2IK1ynl18kip;)B>*2?OEn6_{n-C&;V@J%x5gao1CCGzNogbMD!?#sce<- zTf4R;Wro2&$JF{qL&C34PHu^ceM)lKQ-E)|Nbz{AI zL36J3&3Q8E=VZ@YUmKT?9OUu9-6FEDCYffWrRCj#X@KJmzP`2htSBGwu0_^>9Un)I z9c#v>E0hlYv-T{jBc^C1jr!!~qtONCRE2zZ+4fwFZQgpgN$lU(kxS2i9o;FrbE-yJ znDw2eziNC>(HR)G{>!&Ir```PIjkM8Oe#gG8$(7ge z_QN;~xnM+UEmgjD78Wf>$g%6TG!%I}W9qUq|&X;u`d-xm-k(BeKNQCXV)I7$3M82y!?APaV`(iBO}rz?W?D){)Wu7n&zXg zkDKbP+Rg6Xvs_<`n)yn5XN*&SFuOs$6s36vJLakvww!4-zu@vG+^krS=nOUQ9~fwc zL55Vf&!4YHz{%=^C<@%3eG*e28_%0R|Ni&e9Y(gv9dOhzGxDR^&y?Z6(-O)m(h9qL zeBJ9n!lD)hCk-~ZmAch8@ctcVIo3u~DRx}oYFub;B45w&%d6zp+n3A>q4FLJqt--K zbse8(*W1lMjSs{meETr!Y;@JFFP&m;-k{d7q3}W=r~ExDzf7h?al~szYE-DjP`f8z z=wApI%2fB~ok6bS3%;{Qas2ZR))PCcHDI0^hn>Mq2m>`xz=0-JWt+h09%(K|esjE< zBl?kTL(DJCgCJBK^6P`5(%-EY``jA14(8lnGddtaFY5RqleCQud}?mKFm=oQ_cNW4Yba#DpJz91QGjS3X;qa(#VStX(ZYpyQ{G|P4;?`jasTXW*T+7Xt z-Rj%2aqELVb-TUpL8JE5{?^K^eoSq6>WtT;n&s|I^1YiUT!~8f__pXxLedWFhqlXa zeZ4YZy8-+@`&CHafTD}sFlICTsY_&xBWPrY2T4gRlVI0n(llR#I_~0DNdyHWrNhqm z^!~Pp>5^w>Ub!xR6ww9-9U*orQR9nihWLo$HH3y08`|uc znA12x>%DcV#fm{1!x=Y0Z7S1i4C8OCW^(ka!MG}5TozmR>$gKmYoqeM)2CY~EVZ?f zgV);}ut4+0mu}5Ht1S*VAmU*t#$Xz_BDd(bVCvxoULaD1r@ceQ zZKcBlgDBETRzN3frqe&q2$=ur&yP1f1ixYLF^Ki%A8__}1d>o~G%<>Bki9F|=3im6 z0j#Pr>`;Bu@VCMXe`?2XGwByI?d{CjdbJ*vmQ8#|2jPCIR}cDT8%Q7L__jf1{U7Ih@7`oI(+>2 zaqd9+@u!>j#l_WY*iwJ`s}XrvBYoKiJqV&xZJRh+ zdI~-`z8v}Xp%?9>xv6K_9|QA+MPO6Hj%)>_jAUP11Dam|_2bN z4{8u^)#A-P?j{(STUs`v)|uzy;+_nZ;d!)eBnlTHC&gpudSbmV#h0#yQy53!2s7Uc7luHj;~MhUU-Q&mQfKhqy*)gY zqv|sF-i+!%cF!M;-r04danw8iok2l9fGzxc#R6Koi!uv=RhBaWALhPSe6Jfp$VAt$ z8VVAG?Oj^FzP|Tx+N18lLC0=kgT{%dDx6^J`r~wm72hTtl(bQd7A8+qH)V zly&F-^bvf9rzk79I6|_bs`TYe@MYb~@^y(KZOMdWm;9m)zJA6YPtZ*~ef7$ZAL@wl zm-klEqJO>WFxG`IMp>#c(#@?Gf3V)azR6DkO5hgXQ>RYdv$EJ^(P;#mS7OHNBEMKi z$nsmTH!@O&)D>f+%lPN%^XGT-R8DBG*QJZ-{ghku97^4@6D5lu_ASNi1=@gb$vw9d zELs%fC}-U6{5Nl2$96M5wT|bZ<+1S9{g=E{hWo!~RTjxP0PZ>xI`6SJltob8J!5pf zfFt)IW!ecr!otUUZpv&fp2cHBR-2AR+eeNx+qCPj%~N(ZJ}WPmUDiA~jmq~~7y@Sc zx#ZUx=CgUTl97AaIFd$6WA@hZBkx4;$pi^7(EJ{;ABaBQqX9*21xAW7s@_7fspkzpbrSy33<%Gq43m z{W4f$I$d?o>WlP`WB7!K!_;(x)rH*A))QrHCsJUr|JBa12M^MU#!F|DX6AF01&*Xr z!ea);fIn}~X9vQ~;t|1g9Nl%<YSd=L6F^(*JGWc`(<0)@Pj?IJ}kiagH41LSd z68{9i8JYjGsMgp@Tbq$hI;9lbg-BBn&hBQ;5jQ6S?06 zFR)uiz$|N!9=|NDhYPD$3lkf3{l)INcPG4^Inwy-iIqP+S@c&+L@e^O9UT#NSA{KM z0$_CHX^$FJ9~Zf9o@!Bs$++QHajeEJ+Zac9T3meD^6}WKxU6vY(uG&VO|<2y0VtIq zm`}GI+ktD(AazrtIt5MXtr@Ykp*~D6C55wi;jdz^4~_>-NJ34FZYrkCyRSmee1wIC zGL1%Mnxrxg>y(vH!J|-6fUi>-FzUA(F8R>4Q8b+p&5DK5y3&SNNCkmXgg%clczsBB^;)@DyF&G+SzzqK{Hu8 z*zZ$C#nIJ&SJ5{8m$JZcjGT3{U+*w=>K0ZKVh`tti$0l*{SIqS{@jmP?_Sd}*I4)? zOejkk+k!T52f9enni*g+cFkkujaP%NUBBK7%YP*7B^0!>c%e#+VnS|rajzDFvklT< zI5GnM$wdKS#oG>&`Hf9=+qYK~7@5^`86Zv|3#{m73dAQK_C&3>@7~>SHnhWA?~!N6 zTUo8a`5-jYuhUEDA}LyFC3R4_v+NE1Pe(u~4H($_Zl0~9XD(dW_{>xxltdvjB_lK_NMZHr z)hA}>)&w(|5D(z+8ir&ej8S0VXnN4^rh_&TYlg*J7XuMhjLg$Ig=XJoO*N>xUAJxx zWtS~gpu97*6mpsuEnY0>138sNv9Sv4i;S6U#=F%waPW_MAfr6b#T6A5sz!T89Y1j* zf3Ph&hXCB?1Wz^a9sYLq=Oz+!oUp=B!#!y$+mQu75S^3m1#@-%w=^Gn3%O;?ET*N& z)V+P8qT2O0G~A@QPJZ=ucUc2UX1(`)TwOGC^o9KvJU;9A>zlOrZtq$1jrnWzoJ|Kf z{?5GV7t@7a&1v>>ZEie1PY+o5OAaj8c0$fFNr?fcJCwB-MV5Om-}G~7fQegUXas<({31wxD_Chn_Z{+IS}Kezja6LdKw&`&xsI~b|< zCgvW+%MemQj^=QhA2_=x;-K$&!Y~>Oq^sAisTi3?rXUzbq~ZuZ6J9K``@loJXWnQb z{}=3F6*6|S2*3zT0?q#eu+lnsVgERTNNwfdkaYYv%JC)?Q`}Y49GYU5mX=*3`Z*y9 z<9;*pJc1z>sR=O*lS)vQw!(#ZPV}1C>&kABHGdErk{s=_j^YpO8K=Ns3rE6FwF(BFY9Vh5zA!m+}Ir@&q%}a0$x(eB7lRen%|T`QtZ8vxPe@#ffy4cKps=w`}QB zRxB${I`2I|HY>{pQJI+JWpY~#*GWdmXU}9Syq7^_wWR?gyJ4$Of2VcTZ{<)zYVA}l zmC``EkHd!5z`(G&Wohib13rUh<7Un1o6Feo+><3CLV!ri6;;gr@8dckF_f|0`a537 zGt=H0+o&o5=zcqvCp8gjq4D5vR1t3Qw4x3siWxGntf*<7~=3paJNXkP~B8jgz^jRpH1l)9;6>re;G_ z^Sq{(koH{%t7T(7Q$vCCsXm~7_*pI@*!jq}+v|lEqMMcJQ$vwsu8w9S69;T@LMFY5 zjs(q-Q&#WE%+SonB9)KMxU3FB!MR4dBKwB(Zf+EU-%q(HHJs2KcU8+%Btr|4F?etr zRAb*N3#SS66K_kwLUt!+i`P2r>N5aS%Gt3PW)l8#-{7uD9n1its0iW{Qr|F??Dq18 z#%@E82CS#iFdsddB6$<9KAkrJ&m`G_?|%6Glz8iQ{9&}^Wse7F?I>P^zhDk<^!6^Z zJQ`y}@Z#UjV7Ni37?D(fjGGy4x6+Q3M6)V_TR3bH*sShZj*q0L^5QLzMI@CJyR z;7bQy7C3)nxj<$>)I^Auo#@XAAIi|~qS`lO}xp+S_3)8;3 zcv$)LH=v)Nd)p^_W1DGk$uuj!+|KG9-bqL2VCtp>RTY&cw9Oy}`Az9}@7fw|j~uY% zz?GjeLC7CK`O*_*^Q1|W0ay@ZCtnn;z0!jWaLid?OM>;Nfy_h=8d zBQD7ZBYSoytm7@5`*f`fg-QSCi_bu^@E?ojRa~I54<*148yoMd$3wX{O@n(;6V}}~ zxKoGUfb)h9tG>@rxQN|++r<$-;uF3dfi`NVqdmdv^=)m8+8ZMJfPJ--m829Gz2@EP zDcWRo^AeB5eh;W2vU)r!?j5zT#2Chn-+9z|=Lwo)vTj-)8L8$rQl+EqHEM%%K%p+P zX0_MTGk@E^aszJ#>w%zc+t!o29g*Nu5ME-r)_N+=%lGe#GZZKGTw>>KkQEKE?5L&i zHqI`~rkRadH5BDM3cyKm4*#E$3-lM_?x47-n+hEN_ zLph|R1lcT2c%Sli((=p&8<+zVS#@ZqF>BGRREuK8CLhXmljc?)@70*>j7Bp5qXiQ# z3M|SY?_TRhHl`Slkh*wJ!Yq}IwcsvgrQOpvZ$uvLuNm(kzPB(}Rr*}D z-fk4EECW=h9KK8)auneaTR6`Yd7P#ym%|7`a9I7@LmD#3_QiqpUao}0CTMWx5C_i228sylOAJ18qKv%hv^oJMOtz zn2XkLON%w2XGehQkyEGCjY6!JBS88{sB;F0GGX-WZ_G%}pErf;Ms&1|c+_`)?;b_HJEp`;(c3;}+;YVUs@Hu@)U5M|Wz=5eXTchlRjWJ4 zyzG8M<7tKWz@-Z5;o)D~?&;I>$=B~!pQkUsFB zzCD6g#YX630Gc?K?_PhpxhwdcWKT`C4V$1lw3JB$S(LY70iGksRV0VRgy}mYBFvE> zK}luZy}MoN`qI)-@KJd3Z#5mk#g19uetq1Mn|p`cqQbSLm&-#eNhx%2Mjo;_uYJ`n z3)cg-hCX7#rp3bK8tUrmh=jKVv@?!$M|L`SYPIXsAxk)I@Va?cTm=IZ86e9XI<;HP zV`Yuw&YYRC&IPRqxhJUgN?Sy2hi7VqGLY0}R@%9^&Yy23jlo3#XjQ_Km0>^>aOXak zMmqd34dVWf1wv=d>j`IY38pIkKKOAI)w@iL0t#}-@UcsmYPzOGFd()TSzOVwSDLXU z{+r=gs3F?3!wAM)gaitlAVDJRKB6#FVU_%{WoItW@%=WMJQwRdsd2OB%>h8esO8uq zsEqCWy!*#|QLlZXMyfztDFhfwDA^`}jB?=b&v&HEXDpSw!iY)Oh0*!FVH%wY)yggP z{dM*%UCZ{?n|lT&x_5n=+-@Ebk~9HsVG{^Nz3e&r@Zm#(>b@LSBNI-ntgY8OBqyH@ zV9Q2M&X`Sp!~G3oPn_5W&4P?}Sw&92Wk~X}b8?u7AI`6etCGRcYgK>aORNmuvnR=2 zS-UKT0kzTJtC!MG3Ijle?AW36VuVtEavB^^1_q`K=*m6mL#tTc&-lS=1;X2+rVM}* z>7r@!=pvCnJ}&MltFR{;ZnD8Dul>M*yNSAJ$BCHE#Tgs%_voUTqX(kqMRa?SKIH>I ztPjm2R%BcQTFuFi3(gBZwn_wzvNS^C*wiu;;v>0#^TUy~l;ySWgQf zx_M@2J-v1V24Kb4g2c&}lx@uf&OYSk^FPYEzz6`mo#<=evBnP@gE9_<3>9bbt5-U= zG<=(QJfPtCPM02$->a?tik@OG-%&@$kDrr$R=es_wRA~zSK#lW&V$DsnItmLY7%8B z`yqHZHijFjT@7t$9oC5Po|Fz%lt~N}6`}%j&NAouf~R~CRRjf??(QSyUAlI~ZhJ!2 z-D0yP0-+0ey)qhd^CU3vk^^Zx=D8g*=Z4D?K1!3P2>NGYj|;XH!CiRw#l8Ru7KH5W ztQl=9IFCc~QvM~_#khjS4$pQO(9#n9F}mYXTzJ`JU>I_GJyrhdUmxps3ayW4FYA8W zwOdQqKV;|5ksNkXn#-fpZj@$yT&^~8H`F9d92?uL`HN@IE)ly1c$97H>XIC7(MeSj z4_d;GxYj}Ct7vNGFxt7G^d6k3I0lim6hIx22~w;(U)dtkb;?}AA_e?DgeUYJ3i8uc zyj};JwbAa=CzLF*?@p;eY<4gmz~8aJQ;XG9=suX(G9h=cwYXE4E}NnDruW^22e5H; zF7DHG3ob#bQzq#)YoJ}0LK#DIZt{uQO^GjX!ylNvylPkVBI_vyPwXrfl}aDKe1Qxc zL`z3c)5PCUhqL=c2H_=GqwSr>Z}!n4ZVStOv;jC`CsYtB#1jzu&J$e-lWsLEJWy$d3tOC-!<#TUcj}P${^9 z!!YvtO_Yum9Bft>HD>;$@Zs5R;WK%FUY!OFiX?)Tr+sx`pY6>q$>%OpJAUU+oDmsR zbx~?(C#p#t^yQFEu(BFPBRJ2B#1`ZI?*)u;bxp7sbi#+RXGQBVgV!r<&Vkz5LTyXZ z)i;f{ieFlJnW?SrKmRDXB@(NzQ@4El^l7}|rqgR=qcq$}9swdYdXfR8&)}bL`;Y=y zCy6`(g6YetkTEM!VD^yRYsf^R+|?3Y^jqT4|03;ck@K_5z7~;&Hl-s|?%I1j&IEjC zV10grvM(&4eRs4|wJtKTl5}PaG%mirvKoeG6BHhv4Rc3`dlr9iPZVc|55c9duQXcI zq~I{Tvi^ccldk!B_&X%eB45K1^+wiEr%~&Xh(&q$uiekK3{QFhQ00aoed>f@9!q6< zG-GKh!7NBVr=v=g8)8Y)zpk<&g?{!w`9Lx8wOOjP>d%on5*AXg6-hJ zd+6lCI^YQm>CeF3Sl%>&n@Ee;PS&LmK8Gh4PP8{Wct?oP&{e)oD)(f&P&n@a!$5c5 zLs?A6PdxoWjn=;{B_h_-?rQcghdl!EiC-t-J~q0Z)vJ;JNn*Q5TTkD;JM6y2kS20t zb@d$=B7Z+7j03BWp^Xz($v3ZHC7GreJH8!b_NW!xzC#0b{JsTx2|!B{#!x$AVmbhC zlij!3rQ&w-#Y~>f!7NBeysb`?t6diCpTcj&MlQUxr)GTCAdy$+oaK1~~b_y%Q- z%P0gaY1=3EIUhF*X2Ru@V>cTIhnt8pMHbKY3gg6rWAq#MEPJVeBZ%{vseror_3E`{ zuFdCPcH>1d0^pJtGl~~vGr!_$`@q|5N%Eag*yDfF3hm6wa#JN z(e!fm?Ab&77#R;nTd?N-yqTbW8g%|F_jQ^zD+|G1I#f@$RUrZthSzhO|H(Cg|8*Qz zR8#~vsjE4{-;gPDt>gE*zNmKpb~K<*vGM-A1GHR8G!-P8q$%FJ=%mmj>MWrS#Bg%@ zu^-x8pD=S1dKX*@SJ`@e?N8pd@SK?fa76V#Yv+YAa9K=09H&XW#k4)h3gIVB+HC;` z{Ao}wLia%rdRu@~GYax$^g9U;j*u1O2OgS9HGJ;(mxt%R7Ofy*gY|~mxV`ke?zdy{ zqD4GEAC8Q)#NSj}>>V7*6Z~*%^`B5WnrKF(H;41`nUbHXm17~+pU*nDeE_rzMF7vZ z7aay}$Ypk6S<>EMi>v|bZsrDnQ^v>;dET#eGXFlLDc!Obtqe(=XkmyEI*hi_so)6j5NqR1@I0P z#x}gQMt`gV)R(VS2c;uz!5?H_-`v^OhMSsrh;5F~w#HRgYJI`gt5+}P=2{)NH2LDz zYksURKw9Xe-;%OoOYP8t#$1yV^X`vtes`l$NN}+BixFK;xs{l*FM+Sc+pA;{Vw9!j zOg5v6N}U-Knz+4o<(QjcK+~fK5kH-Dvn?R%G_9IET8A_@WbpxFmx+esBh~18fO~Oh z-d;HCkPoSj26(~v!RJEgI}!XbdkNXQ_ZF1B+ma>iDT?87sW0kNEP=l`Ij$F0TYaU& z6~(9B?n zPnYUy!OD!5++V-GBbamdpcS^IS5r3R&W1$sqk~WJ1S@A6o%<9iG1>rV*O&tbq6%Ee zjE!K*qY%sSM}a5*{wTa4{SGSoe*ln*u4lM~`4D~W^+%R>3f)M6Cqub;cyy%LKrFYD zOhUSba}U$KAUL6kt$B5>sf~@uA}E+D#6(Gp>MGDYRtigVv!+%5X3cMjBXK+5hI!+Q zSFi5SQGK&O>d*7vU$$cCF^A4Tw{3@3owoWu!M|0nmRp74y5?tFPDPQy8b^4j&YH27 ztRp7a1w}@VA&ZdZMJ4_A(U}RQvzzn7mp%_RD_i+}5hdrq4;K|#Oe@svwGPi(#&AlJ z1;h0Vfo`7Fbn4DklT=@%k7k3^T2cWgV!*Ob9e6(NK!v0-Rd`UE`-YJLgh)gnuKJtf z(g<%oTW)RLf6-8CZ9RZCgPC9n8gQbB!KBX!On(H&iFwJ(2tUK| z6N2#)0mB+I{M_&MXy1Mv&Dz}kBkD5oD&7|UTersU+vh`biymgIyK!~EQzVH9Fc=w~ zD?Y+@b`gT=`Vep2JUy>mx-_h`bJaTC?sbEkKSB+@*-OH2ta#Y1r-u^+CN&(63 z3c|*Ci|yREoJ<66dOM^{-#vvF!^_KMbEai7MS7rzhlTq@~}k zT@SlGPG*rRR}0!R9Ed5S2y`S|Ut2ZMHhy=Ekut8~YnIW827tASOiqiqjo|rfB})(?Rp6Fw*VSfj%=RlR zVF@w~GOmFXC?MsN%UNu_I?ajK_E-HUCAaikp7X$kDe_B?iM|^f;p}S~; zq32NnJX=$@jWkEZHtS9)SKQpp+W19GA*Wb2gz~*5!yxyQ#<0vo!x8<1e|6RkE4}I! zbM}A+&F>=*dIKsq)1=0+CKDrJmcLI*88_S(U{tF9?F9(a+T z(w{z!%=;h!9RHt}((t5tU3ooat)z6-YGAb$%FmPz@V0>J*HKFW<=-np*7(6Ed=NbP z?CP%d;K74qbg_8CC@w;FZ#>@;kDaEiTOV>)w%Ux!MTx{S;QEXyR&9|(fG68OXGPO>{_HC+G)`VW*HbKH3Vq8b=|sk0Qc8H77wa!VH4Zv#hZ3ey&9TFdL_OX z;R9)>s;ZhUTrM|%j7g$8E*hOXcMf`zm7xhI75KKtVSJWf(eM$QYHn6PtYtP*8ZwH; z5ET^p2;@AGkrAKnIR^^S0ymmx<+}U+Jai^&Wq0k|yIm>!W0%GS30K5>@5P#7q11?b z*CVd^?HHd}KrP630lOR^rURNv_<~zB`Urc)T04Rx13FV*9n9aP6yqJY1qlZo>`Qb} z1HmgWGIGu33^r}5oteHX|NmXTVnw7NVmWcLg2V-t(kkuTrOSj4uW~H<)IwFXKJ$P^ zQIcPq<^J@UKSGN1M%Yc2tM>Ceac<20Qwz1E9|P;KCl0wxqvj@A>EY$n7r6ohK)))wf~B;jQ>Gl)6n-C1XQ$`*1| zlV;6)X&y?0k4HV7T8ZJ)CMqiJI&Lt+{zw8SKa%ltNk?dEF?d{3kWoR64<5V6^463m z7ydWA<08YNau)ut@D8n1n#1b*9`N-EgQj@67M&X)-tjWMK%?^tP>Oe{t2vrdX%|10 zVi}^Bm}pLo0Ii&nle3jLZZ&S4FxDFSvx8bERu{INtE<=M;x7Y3jLv`uA9c6SuAJ5b z78_T?z$TYnK?=9|%(2e-O46o)(Kj+mopQdMrrYT^NvTVj1P0w11SOR}#P|f&4a7-o zw7=aom)`pe-;m%kWn6)o4Md}x^Q_7`vIip0DjKhsPSDQS#<5@YI<|3P0k-p*xhC~I zLmHj>_7h>B#NN!@CXKra1fB_PEs3AptE)Lm0cyB}?a(f8NTS;^&x+sSI{N#E@ldaa zBHDP;3ntGj!-ECsk1}BY3Qmb+3toYXxq~Kb-6hUZHq@2^)(NwyFpwM+^>GG}l|k$X*>;d616b=A4}##OmZ~O%D5X$h8Y9#6uP!hdYgCvca!X|<0JvFf6w>pg@GUs z@(dNtQfk@UQg_Jx*l3&0I(xlCWb-o2p|nYW(y})l?{;&uRA+L#Hsvf>umVU~@j5zC zPjl2%adMK*5A7wir~3(v2de>L7tIo(fFw3rSi}$;#Z07MzkYBXvH_T<%Im@R5?5hVhDn2{v@ogO&s7)*<0@9Eq{7(fyROw$59B((G=noEE7T#J zV136_75S5r=^@6u>J=jtqHuD|@NY_1`;;~3Gx1Wr}iKh~lNCLA-w*S^9xl1tjQeR|Te zK{fO0+9P~nH{xXHiw_@C7Y(;wN9a`eFQFtX0?YQmR!V0=KWR_>_V^dW4Kv9@()Oh5 zm)H_M3DB}*qepQ7B)HblRRM?cVU)h}z?UIg6xdvbV-lf=!e3kwrIEu$%X+x*!We>9 zSb*0Q6g_k99nmJnN#%-|#5xT54SCDUnIinx=R0H1eJkF)`llV`d*HxN^?tXnxq=f(7PfCXX*rCA$E??&0mWCn=-jKqN(>)fle>K*(ny`_ zQr($&3aq~n{lwWgrxn{wY1Gdz=oJrc2G&rM^mu6bVGf}z z9TVnG@;=tW6dBA>U0h4syhcPWL)FlNyhMgnp^BBY?Pu!XM3*`bt4{z?Sa#BV&cGsu%?7bZpKS!FciS@LO0 zLdOnvBtnu&(4K7-+U3ER(PPHUpb;r`^F)VbwL`PlXS-aU-qU)_ZS2t|_J6T84YM~H zzChSv@A;i#3!i|-P_T4%O|I$MzC}mzg3j&?w5;GX>(c&}<`j@`tckODgwbKcMs5^X zkoX97MNAW~EU(8N>gWfdu&>VbwJoDVdSPBW*JaDTKj{?HclK?C!?trvXQvbq1z;G<%C$NLI^;9V;;R90&}AKiB`+eQ&Nw;K#&>@_jCNdcR_JX%8tff z<&UyOS#W>eOWLY4=u;@5nv1O4W~mQ0I!9p8P;>5EG~TT}zRz`dlrE@1K)Msl7JvU> zzF@%uzBOI{TO5J!B-C8j6eb^qoRS)mo<7ed#i?xW%AT`tw`I6A@bKYx2B%2v3DOXq@4( zs<(P%cy&Q9ml@GUyFr8Oxxo3ZvQUpa!b_}TT56siHyEARb|y46P}P-x^OObY=<*4) z?X|V{w+ty*NdS>c)JbcTQM)^R4j1yWrC3G5G>+6;gRn@x6L%SE0eS(n`ftCf?00T~ zx%ssx2l`LG%pTVbd-pzRsMAVAxsFoDvx9hWt~R<@4pR-v(5MW6L5m1o?&Td)%TWU? zE+>JLDJej zXLp02bQF_~Z0^n0&jSf6bxK&NTt|^U`921Bc`H%^!ciL|;iWX`UBkY{M9V(;|Gz+O z((ak}2y1|35sC3kO_K{NUhZ1Bn8(P-&QORyj`|GZI5}+c?}~w=>yuOvaPhDZRg6Ky zIPbO|$|vFzM(6={ofMuA8lKYxxvL$amyfDk%EoyP95pgIB2 z68T`r^>lKoSW{e(A@oTtu%+gY?qMYou}JFC^#@`L`QNb;Z>9)F;H8o>gr|yJrIcaiUV%Y zwzwC(V>E18@kSkP+acf3wJ_7Nd==nA``&(u(OidZ=efm@PKmuEEIKhG6h3fS?;15~ zh{9Tig`aIJwiSE@Z;#iY>6|(7d2VI30YaqoDpJU5i``+iNB^UtvFC6>z#vf&NjT>< z5PD4>wT_N+-(6t=QI4vB(IDDL)9*vP7FW~Y|Diu9^-R$5nsmoGq`l44tc-ufd> z$l9MV-PnWp$%yamlk=yDxCy-o&{bAq*!(PE*Krv9^P>;zhgMzQ;ZsLdzxClXVO@y# zUi1;h-n=Z!+UjW^T3fyFn>V=+wM6mj*OTU-`idCjHlqW~a3sF#`zC?$1o-MdecuiB z-!-FWi>o;~VW0Mg;ccubgA2IkLNGUHact1`?N>m~m!-Sl<)ve2_+w${u0Iuf|Kjz3 ziwV0+)DzwI+(7`8GPlqPk-FW=${mS^Q@m&Q-34i8j*7z^E*58ED2)Mb#p{QcW<-Ab zdg1RF%4@Av-}X~s$s1RwLUB%msHkYRcSH(ALkBKUN?e(9pu|UU7J+&IieZ?W+tEC? zH@>uG<~Da>5X!o8$<)I6AYDlw@a3q&lg~Vc*N}bToX2yOcc%>en4xMj;S0I8tNQ6Z z@$qvu6vR@^G29L!${~Ky#gbMCrT(X~#N<4L+5hdL#5=T6XOtVlTzsccTz`T?n|AVj zFZTX|IT>8h+d00T;}}@FD@ZIP`w$c1ojzPv>LHJi4)AwO+htahfgWvoSQjr|TwZa` zr0RO+x30#~4UnE}m)AKmx$wHv#HyR?*bIsM2-q8XwK3S|;S@P>?spL%i(e;J0*F0B zTvH#Pg*e$vAv)!N;l_uaXh)RmtovoT(3d6wn}Vl9c2g~%Vs33a-btX<@2`gZ&HlGk znJZme{OClu-D0aLauW!yzA`}9b5!%_;-V(201z`zFtm)EIABy_OpNif4tL|Zam#a-5EyhLkaxnVa#AwPYDq@PVf3A%1_)?m=MKwq2kml<(bC?+)^qb z?W=I7ZFP9s21G$T@OWI=amcW7kBj)}gw&GI5N_p+^_q-9LWNuDk;2 zV!>h~gB+%WU<&41wqL=nuIB?bHK`2Bo$Z41_QtM$fu#G}oQU$XZ@MEZ7czjKM0bfe zXiO#|7bDVe{hfNII=#}Tkhj;11~1s)Zp08zCCB-qMggpFkNyk6D5n(}$e|M&<-TqC z{>8&qd-RABK`^vUhpt^Mn!DSZ0aw9B6AU-RWs>)5UPO5kyGX??77c~?g@#*Bs7pu$ z*k(hy%QypVKJug(C!z;keg7nlpJGnN@ugR&RX)ezv6E=|8UTi>Z?3o*)( zZo>BMDy>?LMrKJgea<QW z3Ks|;T)GnZDBr%9IaEmiTJO%5q=KTELA$&&czK#O2{ciA52Z#0V4p#!mMQ`*^=!XP=PJ#@`|6fYvNh{+&c&1Q9 zk}kNd37uAEW@RzSdl5c80P2vl#RX}Khk0P&t%iSR9$)o)xd=0n0ZnFv94Y`m`sU4- z8~1w;^qhssZ(+CQtn3vtXW6!W+O4GPPRn{$6L@}9bsfQ=bZkR+?^p9riZsr?o*w*2mFKQc_ezUOM3#vf>4KK_HAz%j~ z1u-YqudgMhAGxzLu3t|~@Q*8S{p;C^GYY?3gR%LMD2=40jJ$crD_3=2KfgYVk@21r zx*z|1G%p0|b1Cw{WV^M!TW$s9^#S!ccz-mZPE{K@$*8)sV{OyZ0@i@w(R$$0Cdcn@ zVYcOe>vCqNJV^LGVLEzL*+taGGZ*jlCiZ4 zdR`(R5m7sBDz&B76DJPnWgR>I@uCEtXK~m>2S2|!ai?{5-ymVQTYNQhJ?jC#-D zA<0B8zKPq&t%2k~H?S{XSc{q6uz)UAfGuOj^B%r(I@XF%WbD|9sD@KQI1>d0Hl40l zpNGUFa|^pC+MTv8EO7bWgz;HFiBAAbpS} z=fPRpuUSnDrt|lLz6+<`o~Pdui|h71dj`FGcxuY$_0uqM5~DTY4QMu+nD`ciH6DTx z4=&@c=du~SULoBo;p^_FirOB~$yLT!#5)kB-N3)UDqzz>(O%^+=^;>=s##1pSABn> zPMnZxN#q`{(WWx-&8W+Is!8x7T7Z@e;wZ%FO}fAn5AeNj-%zoo=&<;Z-T&c$tY88CQKVbYWUY?L;xfF7(~*J9qLpb z@&^M8qihp51_mBvZNce9y<-8%w0%WfOf|e8OxR#ZZ-o5Qd3k)E5Ac{F5fPj04ksB7 zyBfxomxecps1?zJT>{^kaW-Ro(r|WuvMD zkmG_Flw$fhQi!&&&&$)!y%uH_IQam8ePK}3;VHiI(3 z!NbsUG9B;?`p4!&@FYK;pHTD2LP~*Vd2R`jG>G)|w;{y+v>~(*W=gt!G-h}D<~=?S zs~T;a$elG<{Ihq?I1Sg7v#xqhh*;r&DC;&-kO-`xDNJZYJ1|%h-?2Bg+rNvhQVu4i z_Ns#TBiq@%etWiJFnD9qDO*t40?Pdz40VHk{r%h|q7K1?h<_i56& zWdju?t-<2(&5<6I7AEhtFsNo#Q$nicW3}1s(uZa%RkRsMY+FEkK9;7jqV!k$ZBT0oS-ILC5! z$me@Gq!kD>uV>dUJA%4n2c0H}pk;)Wuz(4#tOxJts;g_&f7EYbx)Fd;x*>*AC;p6#_H|bym#928wty>(pT0Ryql9S&Ewhwxtma&;!$Y( zbN67hNd)>&*u(V3Ld#WG>ze+EHwCaadzP2!%3stujI{lFzxrPx>0BzVP9cQWy$0>(7_yJ4}6SsAFn(Z*-rmIT7Xsqxk3|{ zrJY-RVP>6*j#|@Bu1@{(r~KIb8&_J*Q`~p{+qoahlO848pM9VD`TNhxy*rc~8&b4p zU%fh=Pfzv?+Ox+J_Y(!^Nf@i%Om&Fq8PiV45bs~Ch7#7Q|H{TsU%p&%=`F@5RUN<9 z+OEyg9Hu$X(i2vnW{<7dRe;`jICRMtqG&37OdsKSj${rPr97a50MNS_P|MIF#oT@NJrj4*r}vZ{ey2`lP478f z|4+)1d((R!ng6ga23$8eC0<+eqUzshb}_Tx@n9vT$gS$5HFvCXaLazRqr20epKD)T zTBEtMvi$n`3%%5x?>j(^PCWl@#rO0LD}OdVjv%FV>$mkaKCZS{x=jD^*=39O_aCo3 zvsL$V&lh-oT)zEA7uOJaSZK3l{lz(o?&`LD!UV{XV@$$k@O~{8E&4F#cbit~>RB|E zHg4Wr0%@Fl$>qxRK%E_$6S_B_al=$^^c(f={p=S65J{n7h4_1x6h^G>ZelMknU`sn-cH-coL^Fi!| z-P$Br>tSs`D}`7J3rQn%#>e8!fiZHUq8^2a+%{m*SJpX*z49lD?11qc-?y3JJ z_Ru`TR(%)DC@AY-yJ~O7N7aKGA0Pca+HpX0BcoOcbEnN3lyvfMVpkmp@AFB=(yq+ZOOr*XOP4ptqMm^O`mgxXmF_rQO+F3lSM-@RME8UgC*FNtb=-2@ z@-M`B;J^sO$vh#08X4U%l@mF0Rb#yxzG%f>mWNiKmV z;`onVb0Ey7`X$qz-Wgj|=lGfnn>N%*I)8eyhvU}dGmGuAw;t57&&i)?c5LD5HU!&y z_w-L6et3G2dWA!88@Fds$;-Y@D{0YZd5fDj)pcxl2H1OlEBw*sUX7FL>LVtun&Mm=aTy;2mK$a-U2MEwuu%7B}7m_q?AxZQAAR@ z6hTmsR0+X{kdW?9=@3M^K|!QTx?5?arCai$JI-u;zjOZI>++s71tiO!F~} zm1I70dZ0Mmtafm6?huFdu54@KqX(NO9ATloqnUx@KNt5Wt@otJi8Oyiu? zXUR>roD@+hk$SD;_`^jJj_qW;3lgKqtO@AtcFNtR@B*QY0b2?Lw*ao<(fH{xEexO$ z))gq2r4|PNr8=e1|03;GydBGbBMnAGdn|S5|Bj$RX5$N;+<2R_TQ*QM^O%n|yAX#~N1Ri=IBy^JQnVFFmOSF^Ya_s-2I(vF4 zM=0sVbq4196t78*vy-Pf{M@-2e=B!rJvq>NIQF)*YEE_kxHJkK5{2S2)MzLOVt+qn zs;a`%ou6{+0sK-o6#Vq#a*i2)y5vP3YxTC-{JP4P@an+#;k<#+G;@Hf8RP=%J~|^{ z2Lq~6)713z8)g43(4^c47Z&cyN&s`zS&<>tN%4+@rjP>|nnj!Ld!X;9JxVE?scu9G8n<}67cQzv_A}5w$WoO4NZ1@$~bWX)$J5@0w1Iuf&D=f!@Ue(e9nhxvxRiUI= zfbg;bSpc$8M!Ibk%xmDlV;~yao}Lh3T5SS5AhBBy2^wgOFEWt-ixRsHKZJXd#0p&g zGrbSNP5rQcNcaC0kk!F8XSZ599~vl^12hyR!;PDdfO%xQlvRxQyz#|dhGDz^XffwA zn3%()s!tz?3Ho_}$6<8A-RBwNBMI0=NKA|*bY1YF)kw^?6m{lur4RQHmo{6;L{YrT z*nkzU{Wa&NQCs!Wa4}MrGduQG;;bDT`%FTZv!Wx(JD^+EbnUOd7_|kS;^A(ItjZ7E zu=DCJ8r|l7^V<$r3T_Jm9790GgN$H7#}cl85JiLmlZen?-WM5JSmpu8XfotNsmhu( zy?ZF9@lf;Rjq(A@&d#O5;Jgrqc&ggZjV3+&V}aaeCM{BonfJK3tiC?FvNf}PCq->( zyw&knL-B9_n6%P^>b!%`@|y1V$A--&2dxjA!Ex*%%(2d_(p0jl<~;bro_jw1S_@aY zfq_5Bss!z~U?2StefzLjiWFuxx6)V`UC>NK3qv=g55yMH0-cX$hGSQC=jVRtFGy|9 zy)d;jY$0676QKQ4UTb!$&k#XmRS&Pdjl6Z&t2$f$l}g2*?fVSL!)hB<`MFLDRr$sb z=D}Hj1De^wJ&V7PpAY~XjwYA|Ajux|o=9N?>=}@DhQQn0glS(7*zX`ZqT!} zcF`62V&^x=luZ97!~+PbRPcks4gClUm3z5<0=(@HeG= z?Y$3-=3>2lq6yH@PeakG3waTlGr^DU!(to&!GT%!A&}Zc$1RUY(FW?miMpW~&uy51 z0y>5`WI%R_(W#JC;fQ$a$nP>KNE%_NP`b9QZ|t1(Bg^QRe@=OU7{24)07kI3^+}(j&{h-M~W9@j5STvLZoV$8^)>hsM1`45>QLg^4u6vN>1UEq^_n z*gSgmqk8Jyg;yai_x*jtNL*RMS945ZY5)r1U%?VlRIR_KHk1(fEMDaN){popP1pAFBBtsc z*mc0^ICO;DVF4V!KysrCYJ(GLFGza5Vu*jCs3_yJ$tQsOhNL7XBd8VlFu>4IC*szX zD^UGDlaOF7Cx8zV69eA?|Bv~o(i(clzY@tA~xS31fMa zX&Ni{12Oi~Cuqf9Hmk5Jh#{2OuiFu(U^Kx2UX^uqTO3&kEdZ>bV$_~eUm4ur$t})U z)G&$Q8;31X^oN1e*EU=HZKCA9_e!QF6 zpE)9QO3K_;lX7P zqvi#?9G?rIt$}^m;lON+QhQ#h`E>q?D~yL$s}7B!`R{;v>!O+j13kxJ8I5rM0as8U7cr%&uj5tW<9Gzn3V>E}JFCXgrG}AZ5)Q_w#0soe;XPs(OUJ zR6lp==2P1Jz?ASM0w+SjEg~rTkij9e#W8Bqaq0y_M@cu*uxvCQ<*u1N@_spPt8QEU z{G#^zj!)`y%##lmadtI!=9eeu-Xy4>)M=jtrjhw$$F%#6uGXwDA6KrJmx8aJc6-=^ zR}+^nkm7iJJH~v%Qa|M+6MBW+DuPys6wfFHyEtwPzX!{U#EI!P7Rhy6lL6J{24E5) z(rP5rxeRtrnyMG7{OahKgIPbb4K)NLLIs3N?IpFX1Mhijrhk{FK?ae#$Cfy&nevRK_ent-a(yS6zh2qF%Q(BD6Q!XZymuh_0EyaH{B=+F6 z48Ru({D?Ln&~*ZS@GaMxGgl>xC$3|IJhRwwlFFo{i(HCfP51R5)uerq#qg$&U!#uy zRANvGM2bJ1yTi`TT_B_drEiRKrOx>`MXL>yYs<96#FIR6(x)qcI>M4xNlVKg?{kvI z%!k*p2sSGKI&0h%OSKveL!$ z44~Ym0t64H<>@VjFj50IrMzwwF+A-Lj{sr@YJ*P1%_~=+;BSQH2pIpYmx#M+d*WsMTNl1==f@Ri(&r9yzVDt&e=TodymVm(vOdkc^L>HSINf`~`fO9RK_$d8sfj`k*EJNpXNKaNeZfx_Z@;(1jzivoW zspmFjj8Y+=|D|e^+bn2S1Lwof(9t>YVZ6EaMPV*I=Kc-!NX0syIsT%%??-+s-H|_j zUPj?o?+|O|LwER%80Tp+cj#c(bqOYifDx!2kf#oJd6Q1Tq;gxl)lP!bu*0UspSez z<`|KtR_?=%5i$$}js<$8?N+yV6sUaoa;Ux@Pzzbwx$}ApsF|o$1$w1;TJ#=ECJSh2 za7~q4->5S1{z@}kH7!GT{UOExs>T?-N;Zi{cddIY_l3Jk4zFctrQ7>)9_#Oe*qjxu zS6u>quzWQWo{W0Nvs|XKYrC)+806+AiVv)Xb??g$$ncpX{6T;rUwr1CriBZY)H@i; z1Loa$N=iba;GQFQmI~5i>b&9MJx0XvF!KlJ0mv>fL$f|uh2S{@R#Tz?Mzt}YU9gL# zK#oR4IsgZ^F{h0E0;v=``|sXspzIR@xqB=0X!`&-zQ{`90rD;4*=n(_B&$c0Ri@e)WpD6?ZS*;1xqh^fQK%9n8au$pF3Fhq#g?0;2yMDq2liA_Fz~q?jRj8vjfArr<86m(4)W$PM|BKZV<#jpsj9te!I&oHG$P zj3;I4j$fPQMP*$1=3PO(?`Bf;me|YH#{4A~u2ePc{leB9o0CIr z&RW^0ds$za&49XvD5?8U*~lsO>18~&dIXCPE+97@4UII=ZiiBQuqxZyq&zK=r$T=h zacHLS3Y2*PKEv>-9%-EL+iNf>Zu3v*!_(sI5MsNku+K2j`4#Q4eGk@Cpay6dlv_;k;Q)p}J zqM=!jhp6J%ves3+M1F3&9a`}_B{tX|))>Xt+b_}STpYoTi@)60ku{;Tv~O;_>9Mk? zwkuaWPtjjULZv*$X6T;!B>#{|EXat{%ePl8-f3jkJkN5-=f zUemJtBDHtDTe}WNIe|3q>{VEo_!F#jWWd*8Xtp;JtfSzPL2S0*lA#9Q-Y38%XlH(M z4sj-Z6h|23+hf6Ar1f#P!4QQ@-Gw(KZ&MW2qr;RX**L`16Mv?i zDy!{8ytCED@ZayfwNP_fp_3=`Z>+mbo={sLGuo8XIzB1eamD#?Tkx&jx^Z^ZhN}G? zt6H6cb5KG&C!k;aLVcEil4OwbGx!E*tuoh=B(MP;CZeS^v8FuxC`3sQ40s`RM8rxn zyw2!bX2-AvPM#@W9BeYIUzXQz1EF0&>nx&F)`_6AssVx=c!+S76W}2;#YdC%>1M7L z-rVZ>=SQs3#}^|c)Mnv4u^fywYv{i!d;qgN1oTIMehAKjRy<`Z2FJf!IM(cyalfrU z@Q)uxmVNN`D020GR&tqU;oaiM@`?||)M4@P>Ln!|yZJ5Q3hKb~*{hX?SQ$tgxRq3R=EM7)@YBSU8Yt<*avBPHDperMSsnJ?1iy&ePz zrod!9NZzKb%h?F(m(4{#{07n%xcm7_uaP0~lZY(70f154nsQs7)sqn13OfLb?I2ZD zt%Zp_1xSg8Zoeu=+-t61&rtvT62E*@+SayYNL#`c*(;H!q&JkGGL+&$l**twbHXR)ji&>rf}Rw zJP%DLU%at3QSZ4)^apFrzz69o2fam65~LIoy)#>FvE z;6fdSeE0Splcq>z2mQxTO0Q(?RUs^d+YXflBA*^y+1W@S(nPqWkRjj{EcyU<3le!7 z9Ec-eyg!5`OEE77n6iilgmP0I+`Sj|ZkyA4>_ym&59(S!F09kcGaXQ~NjscmyU@Ot zG)yvRmU+Gz$7D^`!cF3MdU&3CV(e0&rK$0j*Zzl4{?4Af?kb$v;dA>+7h~*N((=?oZog0-a_h7Y|pNL+rMySN>}hBSZp!+td3864l(mYAWKBQ3LK~5W%Klp!z+jxmcZVGI}-06kQQ|z z)c~V)aGCu>LV1@(T@n94XgkXZTi6Q!36nX>9f$ab$$($B8XuTJTKaY#Y7HC9_w*Oo zZ=;o%KoS`HXk2KNjlkV#_#`>Et7BDom&{HYLiMvl^Z8sC7iN^xrb2LY4A=X%s@P+( zRfFF=UL4}_FVl<&h0<(N!qEfV!L%;Vr~PxB-|a1&=UHm|GMw?CwA9YA`mdt1%EtAe zj%fSd=`g2JEAQ*3t`;OEJFbOKE?BvxM+18w@q$V})FAa#-RmkOR2{B0Vu&oG!s$8c zx_c-3Jg$F7$g3#YlcOaQ5RxCa+VCV@@*U-;Ev&4uG8tcI@OP2g2JagaLcZoAmhJi1 zAb-N&*XYi16m-Gs6tH^}HlRQ}6jQ`u(Z3{MI&SsDMA2z{!_zwj8wB1%ecmUh#s6R=w*cLD`h1<>=Jrnyw}3pD;3`tQ$T zLY{5W@h-#>JtFUc?XwU-@ZzuhfJxmGC@EM8j?bweMM+yBBnU&U>(H<1M98yXYwdxg zB@nWtJDAsff}$KsfkLEchiTToOBJGL)R;k_!q{6*1R<=#LDPvK9vQ){$)g$Zmb#xL zu1Qs$)uMUiu^?4`d~ahDU#Zgm{O-shoe_U*?Z?wyz2L;B8cA`(tB%pxqs_VR78vC} zlTbX&B_A3Z=FL0RZm_0q_e1snhO043`3;4z2H!M;6a#xcCf+*r@e)*uHyNnLy_AF6 z=7L=+f59`G?p2VcXU}&#<#pJZF>UD*3LCT5jzGm!1rrLZ{OswhY7LBY>1*k%q#tKe zYUz!knLZ|*BQLGa&ncI-n77}Ja@SFm|C;&w{_coHP#NuOxt|_{qu#Z_v%GR+Y7)8F zHXq(QQ&`(q>qpTB8jQvs(%6QrlYA>spEN&+9gKt4X)um(K;w~UhmU1E?s#R?{spkr6MDi{4Hz#W3iA{d-QmQRpqbB zY2}m6YfUnd9a+V~FCM#5r}lXEEKE(*3OK8k#^28=tyY=uO^uJLM?S2tf&+sK?e3|U z$REhaaj8SO%zlb0^h}Mni^#}vO8iqqDNv#1-s&*&cjR)36w^E_kMnK->cn3cYhZ6y zfxI~{-H@NJO!MYMdLX5po%aH_9^L8j-kT0yhYOHX=dvB*ZwakChCe{5O>R4G{jyQz z*nd2BI1%&Qs9J!NldQl0U|Tuyi{s4(5mV!B%O{p$w4vlk;w9evm!OG&O>`67G>)*v z7Smv`4L-f^{@)c19Jth6uV)|F951i}-w2tU8kbDsRPBGWm#JfK1(utypWheVPCqqF zRI&iniqI7xu2a_@UijR>RQoe*8ZQ<@Cq8#HQ~6eQh2z6h`=bYC4RJNE6l0fMmTSG= z&L`|vHvrGPg7eV%GA;8=a*|>`o5OYdYUeZwn~(68>cz+}PxopJe2%b*1Vd}H_E%aZ zr?raj2Z~6wo+ik@EBDec{hjzWpi&QuE2h0V+oF^5IjF>EW~gTJ*L8_07kKZaw-wzl zcYJPsj$5iUQW15U{Kus#%xrSMeh)1^zOmF|b#lmfShgg@J+b9MlbILKENj(!J3{r$ zIRt2$h`|$7m!Y37(3b7kO9v2YTA4W`XW`WT9itX=WD{_tJ-i*tbegS%;=O6hf+d+N z;fe+t)}+|t!kA#VvlB^_^`>_7kwxX&kp|PL-K8ZCuCQuTPQ#@f>Tyuqgy^f8w1&Tk zvK_h$LFY6z6*%wbJ5N;@(5NY^q?c1-}*$-Qt~fWO$6$=;eL*j6#DJDROR{= zjMcK^=bsM);j?gPQ5V)_Owqe-?uDb+-G$d<-Kg)nb6Ea83nSxlx^zArfz1(zOl9aH z+Z_Ik@1x$xqQH6N-$z=s^easmugWat&3DL#CR(I5}GJ@UMZKFrwnQPU}XWi<4O3hGk}fN z;h+bIRC`)UnmPF-rXATL+KH$+XGkpEiTh@Oc9V>%b_SgWl+eAz*5zvG)EgFiYZ{(} zlG7dAIE15E_0NVun9H<&a{ZesJfF$>AToGHx^wk8A<^NrM#WN0>!NcVc`H$DPFK7) zHUyVG`Z8M_1MJ?=mHh0-X^{p+gQz%WSIK(t;r;TJ7G{$I<;r1}!d?}PJf&Qvz@xOv z{G6{RrVcW9xN;2iUTj(k$8zWfLdKEr@+MR(uPyadk2>EXPd@K$(Lp0}Xq~mc?B56u z?3kzK^KlN0a3*zDE6~4w-TR|vHKywyX}U0!(yyY-^=1Y8hCUs^d2m;GH8;)uf*MVD z^Obik!}bm?p(F`0@mqS;*EXfKY8Zh5t{v{2?bsdTm1^YfF3T5Ro+W|uFX`+$M@5Vz z5v`4G=f#3rY2x<@!J-?LW~H1(7NEs*<8*wt+H_!RKB%mEZ;8>UbWz2{s$17hYjVlM z7K3W3CM)4=&5A_s?-XQ3;0Fni_#}w;~hY(BtyLM+0X^FJd+;NC6*&mN=#%`r<01WkMhY}fnaJ1nFeD|qx-q@+dQw=Ss z9#rjZi0>@7Vr*Fx{pG#<=sYxjgR@RIt{>w0RU z(fE~;O?}hrg)E`SEmh8_^;9efPn>|Z#+&xR%tpql_NsW$p?fok!KcDw1gN!yPtDl? zPzO61KZERR^+?t~PGHF$rUqc>Lmv4@o<&Y3wIaWL{D^LjG<@<{o3hiB-+{30Y*MjF z)fV4NW39!2wx`HQ5-vXp-<*s+^GBuIuPl#+n(d{sJJ0nstl&^h{KR@AvSJhPuQfOC zYad_r_wn)g4)lHEdRA~p<}AM&oCq6>uVGk4AUTV;XXp&jgzf7w(15(Dr4qujUCwI; zWsx@cN$NzHOM!pbnYfkxoe$EIf9de96^|p7oID~KkrqkPYCH05HRXvV5K7}V=;78Z z=J#3Y&2BRm2h2d#_9Rz7>()wfz;mPW{MHDazC|YKYxcJR<1#K;)r8^j!q}$B*hwe( ziS}ygu9)-q9xkMY&KgX?()ls+qadf#`kay7n)~#-(ur@1r2|S$uW?H`HJsY&^piae zEDKJiF%vLFU)@>$HQCeYyq0kHZPVjpwLg+J&`%y&3TjX0*0y3 zlirg(8N9r9!Ow77o~Ape&Mp)z>9Wz(HSaPvK^RO zazY!l))C8sfaj+r3n&6Xrz_UwU+ab+2H7x~=_q`i_OmGGwxu}GQcRSkZD#zM4&lAq zZl)z}Ubo)74pl?)R(Yt+oZ|wDD@~kgVuA1QU|FUVN)t?(-Co~_k5gl~Z|9=s$L`CU zJa&t-=qUG94(gbzrgdud)H2bnBjq>>im*N!g<~feQU;rur5y(Xsm80UAh45X8Rb!8 z1B87RXK~%WvM}M-x_q|RRWzC6>^A)%0s3&>Ne>c`q;vc)q`~+~5*V!Q|AQxCXrf*` zd^YI|wZA`D?+rVwra(tC))~ep^IOqLik;bQc1t(=znNeqDl}UczE#vNR--N?Bl}Z2^ShkK zq%94}E5NpD`4PjSwe|g`RGIM|$S>2@<#yZKGCoU=0vJxx%N>8^o?yx}e>b=zT%!;q za|`kkxf*K#WPypsh||`M1VQpA|w?G9Q*+5$M=d=;;G;bSm6T#-wN2@lFVE9B|9y&avU|*OatLztCqWH7 zW!4KAH7U~_Gs_&f7JH^Qx!=05ojPwPIP#*Eb)>4jP|h!OcVaf5tGcY2xgWBY>L;*ldc7x`j0HLd7}x#!4?IO|EH(2G zazcS*TJeZ+arLllZZtSB!31c;cKTz;R073~EwW!nj^ao}NG|pR>P7c?Ld8nkT4wjV>C^L{ho0ltwAr@`f=bV_DKb#$? zQmvdD8qn5G@K~BQ zu@S7lq(D3Al@^q1F@UlRH0nfOKb>$HKdtM$-*3LyC3IqS-RtqVkni4QF~&naMtP1$ z$;G$ci-?GyvO{>}L$sa@=f(YD+X!%LbGD$l?5%rPFdo}nI1r0UQqd0^zU(35ot~bj zl7(0sfac8mU;i(WtHe}m7rV^&=sS+>V#^Vc-jw!NjLyM1%d)-YO|bwP&R*J<$m2Ny zcq|DWhw*G*WiVT4hn<}FR$u9ixd=`y+}UX^0@sx_+{Vh?TJEFWX-|REHfrDrVvnFs ztQpzE#YL$`Nh|0&hfB<^yQ~a}Yb4D_ra(FXpye0saNy;x9jV1Sn@!YQ`98~LeQ{3y z>@Lf~c#b#(ZQN$Z_X6o}Z$ud49S?+0@+L-it2L%P3jCP{ay97TY&Wcm^ErTlXH zz9u`3R9RSwZpPTHjaDw?w`|UuTAbo}P5FwNgR#s6W`6-W!Y+ZkCmjCa4`TAyh7+Ex z^2d+AepO{*p}DIxRc`;G&P#(8$`=gB{cRa-8kfVXr;XfmQG@dHK&)U-%|UI2n2AnK3ZnC^u@V(}z@s}6t- zJpE?C?cPBL2R!5kBv|zm_%HCAVgJ2ib1tWXCvHBW)Scg?`a{wa=`G4x?Y!md52IieK+)&nGr= zDXqbu_h75axldKbw~PV}YVkYA7ETY$#|n<(*@9Y|5@ylg`@V{+25;lWx2X;d$aP0c zY8KK^_m@qU<$=?ucW0H7N9(L+U;3pj-aH3S{WPo9vg<-vGQ0JN-uG;vDgJIa1jE3R7Z&_5$v%iM|V`@LERwi`%! z7<};j-xwq0^XEEf3-)2C02eI19z?t@E;kU^x*RF9MbzkkK;O4IrU6!op}IdLoCd6 z5Ekk@4PWAUrL5QN1x4z`5mbKsrV~UM!Z}J7y;@Zy(f1+gs91=_@tPAsnpua6db9mV zJC@g6HYFaF5s)vFO=$HxBkc6B`g9t0Prm~zAm|KVX?ko?$%e~D)1Kpef2E#Rmrw)V zn5s=Z(;d}CylpXYakiZ=#7G-_2X#tB!YugvK~6>9sBV)J3)|-8fSqOkOJ*LlW#(%G z-&Uu+v0H|JD&n3Ev@@Bzh!ra+WS1@qd>eJ792jNwKXpEOa9VMC8)?f|sRNb^ zoHdWwSof5Z(+AJ2I`|_3`9rLY-mEwDppnzyJF0c8*3cp^EBiBh)B&pRs+M6cad)CO zCZ>3WW|?J0YI52uF)>^wyEZqr-b2+11p|3TUmc;p^KFLtK|TvE{oYT1|4L|T4P&Oz zx*SGQ3uXR`0z4dwU>)+Cbn@TQRi&V3rtiIXhSyvz?xU=sy{`ir#4 z=tDvlM(d1P0OA4>W3~F!8Sbo5kY#EVs!%@s&K&!Lo=#r*HS4u#wFWsxb4`WKxsRo% z2_a^DY9nu@aYKHLvmc+Xj_2TFV|zkdC_j}CuTFAYNZY3C`*Kl+ib3MZu{}oaUTQDh zZqAEwpV3wI3DX{m$;L=jdX6H!lA#KOJZ|aFc+Db1ySV_lBt86qa?IH~yR6ZZybE94_ zY^z!~3Wo97m9cM1+bvxpB%J=1Hobr1jVfK~&@I{6=q63q*zYvpaV+^HryHj_S=K&} zBUu1mi<|Y1mpm&~-u+jqaMoT5Cp!y+JO7*8LS9gLwd+#O z0`R>iD6ho9{Px+47Y|%Cg6&~@?njXFgK*`4Jb|ds*`MR0qSDrqUMfM^4g|hC$euSS zayZMu^#$kxe}QJl#uipSRpuiRr}5s%8e4qb>ef(&op@C1i%K&pauiRjjL^US{?gcztmS5Ul`hGdHyb3{JV5n zDa=UGdjI&)0u%aL7=3(dWeCt*4@xsU)`~c_6MnG&k=cyFbcJ(%+Pc0q$9Y*e&8cAx z6FGLkie`nQjXb*IvGs>Rg6mvJBAyh-FSTxwx}$2(^;P`R?VDA%pxE_m6t;KPt=5`H zF&&uQ9xgilwa9rLTH`Q#YSOf!&CTtK{yLFz7jVe40F8mbBGz$6HctfX9`}W=fQ?NK zE9J&Wsy?#q7Djf|$Rh%WJ|z2S7-2uvixX7=)a{Y(M=B{PsjCrz!UaEdx7^O#|GvG7 z)xp2}5*fe>hjACx2iwh55>|oz(-Wwfulc(?*G6?#O7{zszdBpkFW_h*pkvBQ~-o zrK8h^ZL#zM0wZUYw|>|^GR$2d!ywGLRwBG>Fr)(a>FfSt-Z{t+OTOHZf$Kneaj?pX zA87VS>YI%=$WF3BkBwONynuO?20l6SJ8=60st27WjU)-HW}*i^aiqq{2kjBZB@zte z(T3!>_&|fgVx}C^-hzu3s^d2i`uV}Lb)nbl>U_Klz9Q-nW8HV&;xMk0b!84OR)A;d zG!}}gcP9}nKn8fLIo+wTWyj57eH2F^G|RYbjSHj6MbyqP+F9qf72$z97W@sa)&9?* zSB;ugJo?;m%z?t5$g&ZdUor{DSlhtwLBRJ8K3ztW%1!K3=V^tigE@w(H*4$&^CPvs zZx63$|8Izi-Npj1RFvaQ7(GBc&a+u!tgh9<2?Pg&vg3zj@i`P)n=NflFG$G z;G7D)mcHu@*Szze+x)4*xl6YJ$mPrU?&Jeuvw&#jCVj`sBcGK z+M+b2OieJOPQ6?mKIYWa{iE-m!0~c90e_ZDVJE+Jx%)io$km(H>AWkF^#}!zO!B#n zg!P9aBkwkSr2a)p(s|EJ4TH?T)}Q4xVi;}jWfn2o9{zxT-*L4kg_%~BfR(QHPn8b0 z*86k))|}-ZugOQi2{VKf_B1hnr=7;v3}90Z!#nY` z*mPspQ*;UYX51N-8FwSm`%UjfqELqLfM`3nkC;x-P3s`QH*Xr^Ha~UGF(18D0OlM= z^I1_R+o9G+D??4DfK@Z>REOqNo%j|mT$glIYm6`$WX%`(|Mb6&YaW-g7$TtomM8_{ zGEj?<6GA7SL12?7nS^L+z~OY~`~75(FW}xwu~u;hm`1xXJ}*;&FAxLf6T$IsH(2__ z(iQGfoo=JY6Tl;Jt&O8IQtf#bfDxd*t#Ju}(k0>VW|$9F2<+eR@ngCltO~gwI!E?P zg2`IUSSl>(Wlyvr*3%GC2sdJV`s&KylO^rMoUZ7XnBX$v zU9-+VK^Hpjn(y)ZC|6e|uv+VNB2-J z?=T(h=px_-OlDv*QaLkAJtzBCh}P-o!85@!)A<#}-oHB;7Gnq|;<&f^6^eYQtC7NW z$fV=zT36>$o)P!Q>ta3Mb$dKX(7x+;ntw4(0%pdpqK^&EYmj zmB8E}^G_L(c1n4m_|}P3t=eR0k?#&JbS>QV~rEVmtv<8{X$# zr&TFewsz@*6E{A#FJFXec191Ro<~clQ)Cembn%QX0>o*Q(y1Y!Ku3I6|HshzdAENB z;j9CD=$`G}FtC=qfo#EhP&`scsT&I&tjEypFnw@nK|Daui0x1Z|1wnf#}y}&z3|v^ zJv$$aB)&ID%cp?R-4}pk6^hh`X3ujPQ?)0$RX%rY1MXNq`;(j0(s~MW2Tly!=e2PN zlcsXMW=6w~UuiC`8Xt@|u3103VH*Ijol zC#h^M4)8vtbr?B~c;t(jIx%ys_Bn-9X;?Pn@ij?~&b`@@Wjr}8S@LF<1leoN=@!G< zuojwtK!64y+tNdYi9C~MwNGHLjF0?)!q~dabW^vsadpLPOGeI@rQHW_)S71!JI{q_ z0Z!~BQn?t)OqV1R2V>D>q2IT6kZGJO(4yhdgCrbsxz7T~z+}MZ@7J$a{0nE>u4k0? z>b$F@Cjp57l6$1`XOCQjI|TIHb#U^EQF|T*dj@}kxI0@o-rom2;j1;ENFdwmrw55Q*N zADm6xlk)8w;+_XO%m1O-c{OVqutHoa`>Dt)Ai9)J2l6ArH&_V6S{{3am+CUIeF{X| z#@0amf821fze9b+r;dS6o0XsjE&+A_uR_)W1eTze%ZD|yAV=1>zGt4v)P5rqS1GXG zBKqSTCffj9ER*ZvCR4|R^C5#vbkRSkT0HLSe2R%_KEL}`F)a|KV_K?uv|+%94AFYf zWzlf^hnI}Ns86T1xYe|Lbi{180H(AB;rFxXZ`D~;=q=4H2N5QINLpT>oYhvt1oerEId7q_#DKC37`JKD zXK++x-N1eqB7z{k^`YF|6{~pIxE!`T+PasomiYsDyLH(-FdxM z-xp$sYYWLceM5{3GOpmA8*{4F!zr@<`w%M#+>em8zDQgk8jOP0U@aYNgX`oUzSsSa z3y@ocH9%u}jAzUcjoUx~l#A9E5oYjHqnID8>axs=ff9H!c6^@9->p&pz-m)G&Wc?( zfp^e_pN_7gSG#>O=JcBVhlh`cN?S1`Ejl9(F-lI(4Pc_Ru2qXBbL};?NaX(5a?F0+ zd6gK?3=?#>?jid=)%-fO>&Ljo@($AlC+qQy_vO_)J==BXFRHUx2m_ z1Q`s#xSdI-59QSBaz%~@u-Lu9wQvY|AmG0Vl6p~)KO!MTFEJ!As%5wirvt5kOPQ8a zfp)spR3M|opE#i*S3F{lk9dK=7EA8(t7%+ZGPt5|KBv}4r4YwE)$ZPwFBf@W`&X+# zxs`zC+(Tok7eF~V$$`_alAg^}bv$x0oJ?JEtemZ%qK>^JO%P=^#eHbVUM*qsF`} z)qOG1=ZG~t)n#u!Kt&`f|HJp6!%7CQhXvw05IlU|gWC0$Ny-Op~OUV0QcX3 zkrX&vMJWaMlFA5fUj@4OG;m@;dr%EeAQ(1l!TPte*Jw!*9N(c>B+9A+xke~Cq$nkj z-7tQ)>_PYD7&l#e_TBHwS+BvEx?y>!00{aVE}9#y+LR78aAxC{`Y;3o5JOXm1aCzModZy8$Jh8iNWC zq5W~iWF0a1gnosVDS%cu9=N%2z@RE<#S~B@yi`B&qemJBe8j0ZDl-jUn!Q(D3`DE74IRNRZ6%2OYfh_Mj5@tAW6iq%c^cS2` zXjEZ$Rou7|aPG-NId$HSVai-`C4Re|X+D?exV}xkEb7|+9)~2i>B{E9vKlXmW1Xw` z*Pptle6)#OUcqC1qvB4ip&v#^SEvDI9~dyTZ<=`ycb9%d$7hI0JbAzkf!GVj6M&C~ zhhTn#4{DMx(yM3Wpq{H}$3ZAaNHT)U=3wl02R!#8-rD=d7?%NOR;k4FCMccyw8-XwuyXm=FN-GAY@~S#BRb3H|ObNN9p@Xi!X8Puq2J;e5@T zcZfr;y>vkAC*G&VJq2U!e?m?jwrjRkjw9A4uJfOE?+4x5{4jSRcu@;ebAEq1*3(hph|m6s!vZ zz+e2V@JoAjVBm)68YHEq=fD%Ge%3s!I#+@kyoSUMeR_fI`PeLhX2K$xF*Bx) z!%d?(JT~kjVP40mbdWlkjd zNSJ}y5n|@`uS;9%-3R>?y$@(>O(D;LPUuX;Mis152(}s^PCGu>Mvg6VLp3|b5po;- z5rrKFLNU(@{e68kKy@}^-ugf)ULXowh!hqPM@i5Uc4Mo)6lMT<2P+5RFKH%wCpp4jgO!)#Ntw9xxh^mks*AV@(`Su?cpGws@F{7!1 zX}i>z624Ghd2Hd?D@-PUb{KaUC+o_(|JxyxR72BgJM2e;Aylf#MGEN<8#AvI4b*`8vo{?yg!*M;+Rm0DWw9+4}k8H$P~GlC_? zvolc?h+dQX{{iF;Aa+8wo`bD3L&@{X0?o#YKnZvTA@;v=jt#ZP%E3WW&k7GxzX8_F z+JS51+4c+2TfRusfOaC*`Cwtt@SwoWM`DE|(1ZB>?E9K&W{lmNCO;bvsk!;s-n5YI zovc;nT*GlxyihNtsA`6d7}J2QEBJsmE}PT8Q>r*LssCbAj_+1K!Mx*{6B0RxpN8*O z9dt>?r^yHF8Wmm_1@YgjC2&Z`g+SH_y3;$b>=#k_!m2z_`GRxwxkON2fmJS;a<$Gz zpq_#GGFZnUO4D48t0gP8P5C07>p3o}1qxf5REg_S4XL(!*Gy_y>C~kH)*QL%WPi$v zCfjT4>c&_TKZAJSSl|ZOnC>wXh=<{t2nL&7AS1LfizmN629?wndVKu9xi^N)UM`$7 zu!j$YlXrW_kP8uTfG2Y^^j`8y)DspK7Knws9T>mrTb0ALf^+KorM<$Yq>@2%9^0~7 z{%5i?{<5ClX1pF1Y1j6>b5@)L%n)Z9;NMztw9$Hzwk40F&dpSYp@%LOQ={QrV$F3u zmYJWim~NY1!z**0!n@sNRve=GiW35_nA9aoY>e^eCAwrS-Wb6WXvAnvtj-e@?+CFI zIuT4FP=vv6B8qefqv<~eIk&mE!r|-RC_lH~oPUMJf?VE`U=#Z)e(g%4-df94lG_ziA~jlB?lfM)Uk5AF#xcMYG8K4G1pjeMX(IbOw|o9RizeDx)A}d+9ZK zDNKy4e4Lnw{g?2DC&xq@nJM{Fz|EUAYjgPLPpkJuyvBAv<`t=SK1TN4 zfzK#A)DR(=w{4zd)nKoR#C8a<_vdJV1HR+osHU^hkJ#5Rmfk5Q^k+7vz*O*_BTDnT zQf8sys?kUreY1|_%R27+I$57@*3hyP8IP)HlGg)iblTkRoD*!PShr!Of;~8(>tTRh zyI^6Wnb-SBm(ztcFB#vhv=X!7oJmAO-4{%;;yAkIdgt4f3}X83wZZ=0S6xmi$95ee zZBz*eDaf7No>;L!EsX;JIJkdv`W5R#8GF*SB}9pf zEO1~|cZGrl8Dj~OQwYJXU9Qq=X-mk8Z)u_ZcSwr~g_nU*ITY2r@FC4LRM}lSJ<+Fe;l&C0mMDApp~+ikL#fXV=9mBoetuiTX9!LJu!7R>5&m9wwOtI%C!NGS@nPpYvTPn60|sJdIXI}~ zLS7I5g@p;g_`42EUGG$XcvPkJEth>vy2|y7iK>NZvcVTY^@{t}hEydV*~iiH)pp~w zUgd+0BIjthGhNY6Do5oHCW->r#Y9CK!II0YR29tak$M&$uL2^grT=-GfdL>fA$Y&f zA%mQqZLmSb@^Act@LZrk{0P!f=CZ$Z1+Aa>i~)0twdz+Mu^Lc=Jq?+!nMGzS`Su|f zl&%yF>pQ-IgB_EZV)-1a(|54yGFxLcu9u`=oahqTH6Ko)OSJvb!5O>(*m{{eTV8hCk_hz<(+7{px?91P3=HbVB}Ad9nL4XKnfcHg}l ziGM4V`38dX@O5i!=eEY?c^20z9W3_XRz{dsCA;yz2x$9-)yrLndGd|%!nv%rsDi>kE&2xmk_4dB9}JF=VxIMACAixxoj=-=Bxyvu+L0%l^CACdC!gC{YO z^L-=A-QbYy<2X$!?UDH}Z6Q|24C;sBc>SNAJ)&qbjUXv{xMpd)5ofr(^7e{t-MZZF zJ*B&*aLI9i?>l1blwEb854|?u4cG{dY@P=Xu{=N~5VN#@n?x@G?p2#5?^-e}b$gV#DE3roTt$!t+FX&hP)mZz?+y0+ zWPfC{Yp>CNnf~7h71_8`vDpD_Td)f9bfozf=+ABhV&e6LfLZHuc&RF|v8rJ(Pb*5u ziBGF3pjIbi2sI5o?K~VySRp9;br{CAvLu7|?&N=%yrS4mk{xt03@iTK%FbBOuIRGs z@CiC}#I3tH>k8?mXNE9XZI7{Gx74e4b;!aTccP9vXRNjENJ-Wr^jO)AAT1iCnuzEf z$idLmzWfDC;u=8*a~yX`F;mG6WLI$Gg-G)u{;lC)YTc8jz)&E$eeuG55mNKPvC{gL zl`3JCTZ@KO$+cvZP-{Qs+#-{8ER zUAdzI2@gzHZ^NYm#$1s{7Z-6-dwv1D(Fy%#J9vxz>g=3{S{ngZRZVNL!BS-HXWgqm zvlY{!rzHc*Ely+W=|9)=3jXrd2=}+6)=0+NPz@wOqpO$rBUp<{sY$=*RJgw5ZEiSW zOW(8b3$k!)p2gJCoX8hz;zu7hHjAFxpBuPIw{f~WYNHggdm^;PkBKEF*ULyno=EoM zrNno?J1_5*G5ED}>D=9^G)xBUuBTFI@!QmX%+B89H`Fy(y_}^Y& zU>&;XL_{nnww{}-yS=OYfuAs=ny?XBsR2@Ei#o!nP>_3m0gqvD6Y+*UynlJ#O@T=R zEdA7qHH`f92_x<0MMXtL_|{;n$7N)5>f%5S3!nZyJEeRFL*J076D5-wI(MfRxB&@! zC@_WobjV;oceNh$Gk>=aG!+P5F^1*6yBpCu`STqogh{_Z~h|+9IW+Jml zqDX`!O@<~avj`PZp_Dm9<}$O_b?bS*Z|`I8Zy(3|9Pj_>soeMPcU|YO&ULPJt4>;V&bC5%eopiuAlwjBCcLh!wW4J-6)f$asQrwhY}5xSfZ z{H2Go^QVWV1}=sk%k?uk;fJ#mnw~juXhGv`?y^C2S#5%i8$7fzC|cUasct|t>rql2 zg&J|5LpyPpk;Hw)G;I}1UpD@sbn{oPEASuHfhy(r%z3Oz#Oct+k7YrUXdfIDC*L=E zrI;WP==de+`k~k#C)S4!4h}2%gYOwa`acDQyMv=68-E~4A#d|`Wk_Y)rg_V6|kbvH|es z>hK_Vu~gt$9)Oh2rdVyrl3Rmb=r;5F#lZrP^YsTaFTrfZYIbtuhU}SyoQQqh%QAQp zl2J^+FMb{TU{QSs6ci{E-zZFR)YA3ijocv_$O?P(i?Oj>C`cGjojO%dHi4=yL)HW) zgXD7DE47)rf-l01pGhf3Wmb%`v?F&09=E1sFX-+R2f1@@vie;0|oqsgPzAd7nYM>1`=2}BS7LBMiWbEN4W`+F= zXt0u-V;X1C`x(8KHFQ_W*Cxh#sM3Pz{Dv|o z4Y6z(0=(GUg1DM9v~W|=Mfx{1bixA+BqbQC`a>ZbRR}lCmdlXJq!2_59~kSpls8JF zRw23*I9BRlE@@U`LM?g$xum|(+w)067)Wu3S4~tl2nk7ZXs5HAJu-G-PSrm@(xC|v zG{@0(ByPk=%r=z>An#Yo^=J7+EUh~m)I@nxw*KO!;A^VVS4%57#u)OL=I+n zq|vWfVK;SUUzmna35Jt7Sb!$SE%BYHUQ2-|H#VUws)Epk!>$DibIYLgDtY_^A7bk! zPDZVC{d&i}*_djy1q=EVBQHkb1?r`9--e4Dl!u^5Py#&$h_l)#p}Rgq*$GUJ$X63B z0d%pN*bai-HY0T1d}`mp;es7{12F2OMVwdP7}E|vxH2ffwzsvdRkREx(&msSh(stR zrh|C1La9!DaAdfl-%1Lyi^+gZ`P>WnrDTo$30!AcPaCz40W>$)UK- zMVv>f#?$ZJzD?nlu+%_Th!{v5Kw*{w-M}@hN_OYYvBvMCg(xn$JWlz1xOQIq-!fYi zcyPhU9cgkmEGNk|fs&IAw$i)LejP@tk#y|PATp-VK;YsJMno{z-oKw5%!+_M4z`1V z6-5t`dE*%Z)h>d}unsD}ki<;wTp1gNKLLqEjxS%n{7cSDD8QzcP*$wowleXO=zZ{D zZJ-S?2?6YII6}v2nMy*nx4yofo{>@X;w4<*yAo^HQt%o}F^wiB2=$I35g;LiVK&A@ zy>NB=h;Eg<>%a}i+!W&nftFdp;o(e%qFfM{55iR{tE$@TVkpf4C$l%W^25Fh6TZEz zMXDfriYQ(+t@-dl+*sVpZ5o9WloPX`KGi@fT^CaY8^3U5f?XS9O5g`f*CXYOk)@ig z?FMp$pjv`!wZg~82OrcQTKXHE6li59Soc#T< zHlJ$!fyV(=uyFJ;aXS_9w>H2V#UGxv|MHOnzC;=3B;-#SJ~lUX;q!QhECR*Sh?o@| z?Cfh}wc*vvh_i&ejWd~s_>-D;mG>sLq+!q{g$;4Y?}kMlU4;mCd3o8M@F3hb3I!Pl zDi%CAJMiF>)RVea)194@!MAvlwgPw*4*Xo*J{Nk}xpSkIKhhK<4HQQPfY$#4nDCVXZ ziUs_;X1iJO8-+gKJGhL5A!6c)^HcKS!{D>C=fL13Vyg1>2t%URV4Dt~VnG<3UV8TI z8L3*}!hoE++I8s1WgPUdNP~9FsFAQ?+5s8`jsSAn8k`{5jKFD`$1h8@!3J*##>^5<+D)t6R$1~$W>FMcR(N6al zToN0HC$dgno(Hlph~{#2k1ckPYlT;(jv`8fmFYIC2B5V2j`e zfkjP{t=Pl5)kz5I`1zCek?|H1f`}ucsL}mPC~m_dsjFqSf++b4Z zr9c83(nrDQZ`dOcsebqv9Avl)`4eexpg*O!8rc_yEK#L|MylI(wY5QSQ&)NQuH(B+x@jIFpZVM>=}6Nawvy#om4!669Kep zyqvQPv!s?+7g#B6h+p~UmZz^;1Iuee*p*j~MfJ;xvt|Qrq&%-FXRdH-t;$Vs9gJX>P*d>Dg`jt5zVrRAXT?u(27*6SELfw!(dB zbX|NR35hU<1lzT3JXQZrL!ZO+_=!&2GK{+L$=BR7dnO7$1u2MNB6q>y(@{;7A?I|n zGzKxuN4!RsqgE7A)C;A?8_9kD5?6HelD2soEi@A(nWNCSfyNg>kruzQ%5Td(3}Y}q z<%1u5$mPqLaP@2(8j4!7jCSWE#)|qejCAG%oGKBj0xfDGay7vF8JS)7P(II60r-I^>0jEbq`pfr_Az zqFz1>$}XWk?X*?DygLAAKNaI(Fj-eX@@okW8IEmfb+xvOxsbfPywzY!K0PyYISdQm z|DAY_-whv)Didk1Nd=4;C|0PY@X6H0ua{L;(xEfh1LU)PV1OCkY9)PppQ1bgM#_)p z)l}dq2MuHrZfIy}Qz0ms{q$j84S&(}uPq?^GlHZyJU-4zO=oINuP#Wy$8b_H76IdR z*vvP1QZwpr;)KuqB*08!iHO9b{f?kgAi>^7Ui+T|_1dl8Eg^=rit`hK5qhn1XvzkF zqt`2VoyhI`z-}8Bnz`55Ne}WI!LB1MN~IK;$$jlM>CHHX{`#3X&oni`S?%~$Sc2nS zZ(qeS^!*jxo;`bTnur7R$!Dukm9d9vxR|GAB*4THorV;ou^}X0d?)zxGS-M0iv z$p{CzURoP7@WV~uW{V$LrT;;vx~i%KYD5v5Wq8WBZ{IF9ku?X5k3bD2z}|Zr67Ne( zm%`MBANMc^=3wY$Oipl-|CW($}+x z(xBkQ8^qy=y+@uzS=lnQNgV&0%U+br4)AtE>9kRiG5R2){xDVsY)BsfcN+xp@sEv{ zLqhywVmRRZs3V1{JNg6@J$><=y)h0baN%l7!t)3An!Aq z_rKRbuLMoxlH zpnALka%u|l`y`w{HW2B~ z3!Y;C;s=*AIxGZDLA=YOco^C^iBd>+G|QJ;!_-{j+2k0?IC;3tp}0Fl%RpMt>j>{~ z7L0(6W*lo(7p&!>M>tT7-a&H@o6z>{pG~$!L`Lq0ua(%=t?eijV48sqM>@D0*vT%B z)VhP(_b9Lkpy1m;vx~%YneY5&Rdq$<<%J;uEU~enkpy`F_ZIcQI%#Qk^iths!Q7j~ z#5C|!kZV?yS5~Is)~BvVTWGWi75m$&s$D2lH20vdlxA3r4ZJ{H@Nm$5l)ZniOCG=~ z4vuA8wroLAqvq_8kg$BW5g}@>qOCVrPD`t{F$RCZQaJWVwD_Qq15)Fck#U^&4yjbm zpmHNOaelgAf{G)d`GyLO6|NXLOb4=VIYGcxNLY9|&bubsDdN3H z@q;H)g4{WleDg>^uB|50E>2DzABqNs;uAMIjqQ1S62 z`&P530D#}18q}y<=W&MELZCRLR>*)gej?6NtP*8QQMjd|>fM!TNNkrOdF%7j6(ZgE zhTB$2Sege>i&+ASZxyN`EP?)w)kwcUB`5*|z)uK01n2@5V1sM530jKj=~H5TdCom7IM62( zPv1jxF!V!NUQto)k?~Q~$#6b7AR2o`YXjs@*HW_Gw74vxUMFt(Is{D+*Ue*YzrSv$ z_#u#?m<+=G=)i_*IqvBSgbd_CdOba^dOYcsyu6|4C`ow5B@X})=N)&t)pI@^0Ysh-v!-o&6<@s?{ z`vA!VARvIeC|MJd8dA{e#~>d_vrU zF;;tdzPY%fXmk~lm{+PT!M@R-8QwQ!0Kk0_>mx$rJv&ARk5y=DJDLRH!6${)0RZ0%%$){WLMnY?{ zEM5hHneH`OC9?D*`R(GcP9_=TA4X2l^V9|U3f4%pivp-%lsH&=B^MM|~Qpb{e2$VEt@ZrO!2*E`O z|Gzyely3e&;c;K_@SdbM_7m8StlRvH&dTeyZe0Nw05<@?Qc#Ccjud2D(eDq3zWITN zb5B2=ap3?Uk8w_9wchWq6^#!n-OOT^6Tu# zY~oeHYBUr;sJra#H_4uD38}d*0ZAUM-vK(%)-%HI@C2D z-sl*}ObyN;qbp%fP@t9}L7)yN_yk;Z+q%00q4s@kuYiz2OnkiQLtD3BpEkn^ zOaM+h7~8~l6hbUGM`#lA^75|P2Vu5Kn$a5o#9-JC6xl5G#eS{^;5MK}MYgqB zVWgf4`-|a;iAujE%WfM#(5&1tp)xzHPQ0DKpwK`nrlRck>wrOA0_V^QbOq}1i04}z zV_y4jjM*ED+L9Fj-EK77)Dj9=YrDU;pCublFr{R>Wg;-=9?>-q+taF9*&x@1jVHdLH|+m@v07EO({U6 z98?jff4t_UhGPOTmmY=u`q z3r58`YtyZ+r?SCd0t!iOSh*{P)teta9EE~er0~I#q!cY^$nRa{z`;T`* zakwacIId|R3d(y;I)q+h4G#;u0=9SJ={&@(S;%|eGk&xh`b^<4faQTb9X|4|bnRH} zHnx@V!Jx;i!^6VJTGj{6DFdE3yyeJa`r*;P6^#xp4(63ATfjy4>)yr1#Z99BBS7FR z)a8j%c%7213Px$z_wd6RL%3dxk>8IWKZxo$9JQ@ao!X*k6PSCvRsbFc{Af8ecJB0B zjO#zpwmRZy!?Z`A+Lp$YFScU(qOqVQ(h{%?O6!R0^U(lGh;=6>uqzjPQ|hgxQ1EJr zH!}r6t>O5&b5X>j9DKMNV3DAg$N~SCP;%rM$kZ{ZtFtozuV<~87<01EbSAl&fGJjA z{u%oiBRmW6D%WBZjIxPLLUF(kzBp?^I#7fS1~jLbqPY3(yuT7(_py1tKRWS5#q-sZ zj?~Hk9?H0sxcdIJDl^Oi0s{6wUguZMFA(4el-mHj&D-cB?^zbS?A5X@1xb}mztAeK z-?D`Xzn$3q5{<)575v3_tVjzF-r0YsJlhhJr}k_}4+@uWgoO0+E+#+&)Sfs?=- zGz*vQXyUOOH*U}a>?55B4gv{RKVBF)l5KC2}^{ zHPl(Wt*sUCF%z)n#Le?4A|fIYtG6>kaJc)<@sh_!idc~DAPlhd)R%{B1PBYE;1AQ{ z)xANwTWsV^7vuWo9Xoa)Ebe^pId!oHom&r>aTkJBJ*w4ztz6QTxVRu73cEyOS9AY# zLhZebq;uGD!?R-7!Gmn@)o$zQ5m5wW5M4!34b*+Gv|x_kM{pItneH+iOZ#VL=r^7> z*%4F%cD$rEKpO|M!?f(|mB^?_9Rw7@!K1-x-PIRby&K&gI|s+*7-o<)MnELRbEc4M z*PJViP+$>|k>EaCjtcr$(NyRTLV&RGh`d&@Q$Z+HU~VQ&aOtlv-%Qkfsh>q4iP({s>7D z-MaO6sOC$Yv3wFKM?UNrA_z4pcuqDx-l~Y>6J0enI;w_RX&9?AHaH0=`X=(Xs2<^gz3>k>PJs9SU`S}_?21|MUx^*c{m4F4&jgc8Ska5VG zGoYQhq@Q^yJUqPjZTeZDmZWJVvsKh?q}_?su*0C(6AJyiwY2ClcwdKMQBO}W5CNCp zU%7AwQ`di7hS?QPQXtYEuorlqt|yN2*ZS%w8#Gfx3Uq?3S4-~FzaPoS6oceBJlw?0$NBtn{UN{MgXLy0C|y$V?Fo% zWgwV-yvV8=_V)Lh{0!T1B?mU~= z&Ufw)HvvaU6}A23rz>BA6+y8o42rJQmi{L3oB8@)agg`V##WgiL)Zi|Z znxPHBK)qi+d2Z2wpA&&oB`SNa0@y|k>2FWd(9l>Rc4I=RhF3(UT_A6u=P`2GcAtXT z@V}ddu`?+%vU79QZYiF(lH?(lxx^@h8e8va2oGiz%@bR2$BuI7HMp~r79YRFNCC@Y z-8F4tR7y1I`V9C#z||$8y5Z*Hm89H-YctW8U}0e)R`&#Q1e|XJs}NYQ$MoJXTuOrW zs#QT?hp$yu=10wn*(NVm-53yH>qmMO;D{y#qY=! z>@1HfwHV;+#Y^FmFEU;*q66c_@&mbeux6rOR_b7E{1P4k4hlv~`At)}feKh!gVyzO zJYBoQj=i|h`>!V_N1@p5z$6F*!|lZ8gaFtsij>4ly2AT28rm@`CgYfW`Ltos&yo=rTE_TOJ_$DqqfY&A^V z4m;S45!wT|o9)0sDv`&KAy_H*3^UnbNoK0D?I^ZKHQ_7{*dHCfAD;PbG&uweLo(2) zOuG*MbTTxvfnx}=bt<(a7!ScIFZ=vC)_}0)ESE0gClB#u?;R;pq0UxqS0VlW9cqmN zX!CD+IBt08vH3;4i~#hh6meORF#`kzoahw%Gl}9r3QQ7eoB&K~>x6H05pCvCV0C$( z6XK{64w{(IQz|;v6*mTqPb21|dZGt)PK@u^@#AGETTw8T02aaAu*{RO}j2~h+13AsDChb6VOtjLmx1ns9dWUiuAM3_^5WZYS_ zFqif3ff1|+^$hS8QdN?PTD;QYolN|nVm%$;=X!L(cphB;s;5kp29#p?so{2iaa5kp zju@|yTJeV5IRTV9Iq(lf@vrWJO%b6O1Mt6&j@03*g$GA5I8dJvhuC7ZMiy8b+gSc$4 z7N`$BiNHeJ#Cv@O;i0z&-9*#!{-VDF|&zNb4opQJthVc5gKUJ z)Y9tLii@+5*bVTe?&%2wAkg~~wlORgmI~o5>1~LCq|61KdI=L#xJXzqD*;$RG24v^ zLACt4f{6bg2qEpz9e73BzFi6WpOA`*0Lc#gxOX7}IcR_&Gt!BL3$Ip0v0mXEFU+uQ zf1)~3S(tThd3l}*;hr1)az22mNW`tMNJKWowtZ-pD>8#A+&5#~rFfW|o}XFs!*{`( zQjE7fK*GMVxq#Hcf`IJ34M@B~EFAVZwhKaocf7~JK z`PnJ^#>f2V_^SFW?aHkr5x3{^->A3E`-ou&v|F8nIAdWf0X&EePcCTR#xjuAu>14Y zW@vBpR06jAv13NCgwX{7lsTcBMMX<7ny81_FlOeMZQ-fNPDaA~E;`;|6DKfEg4F_) zT&u`ZFJp%kkM0WN^#9mawc`&**NGsG6C~*$y@WEs#07#;F{->gt6QYJ$H+Js1>{l8 zE`VKnbT|n__yZ>TeUWFh>}5$`~xM~69DJP-ymw8S7(TtXp6ExF$@E(Y|+SogSR@k$l}z4i6R znCCccO-)V1?qs7^W8+qoo0)qQF+_N`3wm5+S^!6N3TaRhtIys4j|%`0As85Qo9e<8 zDFF&WJFTv>22R8B`Yi2^z;M= zve__pTGWK1l@6+j!M+^C`{lx7N3d2j0vA|oklhGV)zU=eT}@3Hn3rsPd=Y>}NeV{2 zOrSATOce|JyX%k*Ny$d;1Zo^yE^-xPP*Nc&9<9E%*}f$&hZ^;d1rFID(8n$V0J_L~ z?D?8=ln!zGAh^5#bvK&<=&j!!A?fpeubi!3YHDiTgF{(1wcn(URuG_w^j=tWT27_Z zSbzW*5*DTgAn|rXUl_lee|Ooa#P;o6i@a#eWLKgaKaj4?h2jz&5@80Dg9PHwrLG4U zDg1EjTmhAclFG_GTC}1^AWi9jUXiry1n?o%7noS2m&RElEL)7cbjY&Ef`x&#j{{7ejnS%~2Cmj|~KtEJw?EJ2hNOGq(Y0!~x1{M#tKj52T&R^n-5 zJ_G}|l5gMEpcoD;DpCb{s9ByNjrNY#*VlJ^pqT?*B?t9+CfOhX5bn$T(8B!UF#Jgw zK^+b%VA@6ov`7I-n?dS>6a+cW!vA_{neLxI2`&h9%cnz{fHl`KdPeqbL;oh`T8RE1 zi$!4|Tp+9f*zX}23M!>=oOP}p$#iL(j-YTspBjuqg|$Q?x@e5P3KH#Q0J{or4b zDGUZepgM7GS^LXH5l9C3mJIvs3(;oQqm=_CmRDp0WRYwTMSCGt>^HN#_Wz5*zsJ@~ zbQ!wYAWSa^xe^z8xQ&Zk&0Zt~a_GV34nr@DIv?TBl?q0P64-WrrgfnM=@VFS7*6Vb z!t_EC#9&13e?OI!uvpgoro?xe=q(86B}F}0M10K-SF!28zr%s*5^~TYARmnXB!omr zSQ2=AltO`R7c@0BLF3-0C;Q2MTb}#aMsoDX#82kfJ3nB}An04$*$FES%2ahb0S-iB zI<_;b5jz(`n27<|34%E{0e9g1Op+?-UwG=M2|ypenlkzm2^@_uAk?KR`T5VZTnAC1 z9r&G?V4=UD?<^Z;p&ADdM(4QEQvlx+3NChj13+DACtQj1=ieaDk$E`K2l{=wc9|gl z0(X4-;X?(6wesJg3;&h|J2Qkw-wWqVoW}K}wTd?F*b$0H-0g=>7e^acz8=LUu&*RI zF0lYPNx?z-ulY1U^SObY0R)+d9%b{>A29s+MJ_n0J5f@y1jCtfkmd0%=>SPT@%Yg201J>L;1RSO z?0{WD(RdA=n0ltB#d8Ie_@RKeL4vNx5;Owg3OiTG`^*>t6eAvj$2Pg}aOpJQ1~|`! zgPB4I7}WB%-ayPGn}W~Kl<%BD9VQ+Nr`|XxvMderZFRi8nqb?jq=-g@_^&WAM`42D z=b(W|HNyPe0emtN)^J5SOO%TA9K<#voM>CSk(It}Z9Z)&A zgqsvu7+k?UBh?BbEA|t2;lrLjeH!1F000;zC0LZiX~!YgK~jtc!;gs{o~$r$!*WXM z(fG^I>Vb?eCr|{h_L*JaB$gtERBz&qPdHaNMN4i8dQj|5pTfaGA+ec!Sh51spH(F8 zI(!h7?)340*A?dn!=mMclgU`mK>`z@xq#C5-yu7MLzZ~!R`{*THwm^Zc$&*^=>-D> zS9ZRMqill=Ksal@svtUuR#0}b@{CWYsz>=MeA!w4<$Z7OcP@4Yin`v&?-egITCbHa zEpD(>RS}!lp=b^HY6*Dx{QBG7i1RAxJMTqK2ijBwmxX&gH<0j9`>YXJbMl!PXjr&N z#f^>Jfa!4x`0LQJ>U(k8Wg$dR{9u_K$GT-Lx(ZUp0InzJ5~6WfFTkL$9{X?PuTIx5 zsi@fPV#xlhy|8a+?o&wnvif(Q8IH=^FQcRg5lmO}^Y)7(Rr8f~VH%HJU8~`yv;{))q0lq7fZC@{hhGP$z>I!*; zp{F6FThcnBpv24{hv^g*n~Wvf3i!LgH0osl4Q3}Mb5y?GLA)`bZCg;HhNdN{hzSxz zGM7;B-Q82LBU0N^fnu24GqO8Ja#rkmkKzL~w^#ZN?y~ME2~O$l%eb5#L6=^3{D9|| z^2YEC>o>myFQ$g4&&ms2lZdcm37-*UuQ{IRGt6tu`r*1tr>m|Ga3CNU#GM+50lMTi zyah70Npio1-J^f42%0?XJ&<|c`SX~%>_*W7$O{nNZ)vX$c9@TNWIumShIwRPN8XSY z4t#02TCOB4B3_we*jYf# zttF_|dK5ckanJCiz|bwyMT=4!x@xi{FjP3h0?-AB6DEXj?a{|$R2L8!_$FKqw#VQ& zZ^Ao^PY04(We9l}fRSqm>z(O^H(1bQVG{^W$B~8ULsV9fhmm6O0m|*R`Qt}Rvgsu` zf2f|>R2~z^RJA@?(DLuEtWK50ZS)g^-9@8+j{FE<@9N~>T2Wl1ys&dUYf zxQYEb4=ILAH^d(BVl-;b2aG|wGB510gD)YecNL@<#Fov^&p-qy$DW6u|1#e1{~cY# z_^hCyAS75Q0{cp!?};BN6jNl3O$F`T3c}l@7zADf78)TTp(;hu2Uf~z)+_2loXSmt zT*{N~b2x9Y-_J*JGAHlx?@;Z$*w}nQ`EuIPGkg)I0Ww9`T;u1@_b$xOJ`FxHpwt&2 zW9jOBW%cQ`A zP~g#6GULu@9yqWPL*X!t@2IcN_U~da6G80(YC|-dIb0NUWi%A9Bh?TIK=%DNp7clo zl?OQVy(V|_roDFuan4Eoh2fiJ-Xj!^*jtZ48XtK(i!J&aERrqDn5QVCL);82rX=H5 zgmcjgcq{)+RV(i2W)YO@>|_&mJ)HH^P9SDJI(OsnfUitd0K1LwPMf*gH|*!yp03bN zO9Z@hmJpXPDN_Y@l5}Ik`MK%y@V#Gy;kY~&WNuK>1?O}ly!chL%6bCY%M z#C`B zjyO#|81%I4c_~r*^(DJmk+8&{nayi39+a3FI#%4;TGMf8JC9#hAxp)6)!%{UUnb|{ z*>4}aeDVrUMyHll;=4`xzF!}k88tN-F4@42T7YRHSx#xEgF6N)%HzL2Gl4*cB^+G* zRaDR*sRQ^G8NQyw}t6b#KNp z)Iz=ak0sHixqT^$Z;viLK4|d#ncD%4hh7UZ0@v7uWj9&cd*xtRk&rzm!Q{YUY9PQw6wjKKw;NqB8yvv68#MDuR1MMb@eCMEVXnxF zT45Io>Zw`ZGptO_fl;wcOoBTWa*|`&8LTEnG)u2ayf$c#(Ha!AZ|i229ggt#ZI_sk zh%srK-_W7GNjAEPW+PieKVTBlBEtUg62Pt3BNc0?EX8`6eK#bRK&G<<(_pK+L;WNw z3H*yn*jyu%Fz^;okb)IXUpzNzjRbfQE!uyjHZlo6C25nO3dXAO_fhhewYDy#zYv7T z2icB9?=sv5NYv1YIgm2ABuJ^)VWOnRbJFwR{1{_U?G^$3KKHNvhrhSB7TJ8$61cWe zblFu=R+ZBNoSey^hz4QSwI2Iklq6Fnn!)R=%a$$$Y!GzFX9HK@lP5BSMqV$~%S9Gm zRTpNd|4!y3c&XsA6V)Bkm*6|7xoF6w`DV9n&O35XwySf zT)gt``&iQYpgkLp{cN9i9y$?dym@U-`J8k|*<4@Ra?Mp&bn8JNBrCn(%c+S=NEm1U z#Hvn4+d`&^h-AQ^1E@iydy$dX9r8cJE{Y%MN$uctK=f9SO29()CXoUZS}dYxH%%!C ziN@ywv^0P1#s*TbS07ms2dC&LAr3$&Lq`hCs@Nl%e)B9=dCtBbN$uhh%hf`=O1@54 za{qi{Wp634FwZ-mv?}PE-+Z)w<{iehnT%Rz9RIvH{d!?u1O6Bs?4e!hENx`%06_6| zhxyS=M88RZFDVUuR@Nn%rgz1WoiKlC0@nn6FzNEa2v~tRD3Ph8u9LFqCJye(8E!9c z*^|+u@^Zg>yv;hMzzx+;7$31_IIn8)RThp`GWLo6At9vw(6MOp9D>yQ0Dqy_XP}DN zpocMm#2>CMl>w4^94pBc;BXV?O)3sdxN1&;i*>d}$^k0?a@anjLe2-4lT}KDaMXsO zgmZ*otp?H}!GuB2$QcuiVo4dtxrA(+a6jf?s}JWL zRN1szMQqI~rM$My4a`#snTaw=UsCFp1)1}V=bMaK$g9NXbG~pM+$kChiZVOu^x9h< zlXbu%9sm3?0xh}d)79&Ak&%&P5d!KE3I!z^*p(6z6(tK4a9vWrym}$IU`JH={T~bR z^NMAUZ`K%twvXUR>zw}7zR)ZkK(3-PWZj`gl zw>Z8(8R}nZCTxxHg6cA8kD&K8tdusv;u%s`6qGUO1FnG`GCJL#b<-jeQUigDLWj%Q zSFS8Z`$*^jAh5|nF{lgN(S0~5BY*!w#t`R-EqY5>XlMy;cJUmeptk8#aAC3bX3<3< zt*-m;XN{96iO@&xVK9QaNq5}V6{q+9z4=G%ist;S^iS^(48RWe`_Mo+t4@aVw!a%H zqbiRVU0(mQ&M~qg3Cacyi94=$xJ6j=FG7QysW7wLPhIN%|EGQ+U8&Mw#68{X*;ZSA6)koBiG&JKB=x z2;G4M9F_hFNjw4e+f?7DNrt1^rP8k-{&oq9V8au(KysCDDqbF23?p;nNLwSWjCmuWCv)E%*-B$rhTCob! z($L&6*X@ptjeUc>%D}?1al?j7i1i>OR06gmMh-+NbXEA90cqX16Rg~3waq(tuU`C0C}<(|Lx9}h zVfIA%VVY~pfJqYWQ7iSJiEf}ezKO2Hq!P^{ndbqSBuA>;ILq?=)L0Mi|EM;FaB8Dq z1c&UEt*72(-ASX2<(m&QIB+ z*wK5#d1UW^(3{fvXI<^>yPs_QWB+AC&#CtmofVQN{n8UMx#H-Ol9CWUoCcbtU~S?8 zh}RS}BhrXjyu60oi8YV5)lEJL#p9EjD8ic1SYHNqC{#JnR ztgc9_PIE5EV<=2BEnfXKQue{tgwohM8M0Lk1bCJ6d1x-lHV^DlKb%<5&@OyYz2Ham z$E*FPJ|s{QFN!S_v$XnD%_4MvnY#~eQYEtRd+{`Vl)E-~_MmHGuDTL!zb*!1ZeXqR z;xZ87$5$FLO}VdDZ?wBmqa3Atz}~!R==SXtt>)+%Pnnwextp;r*00)WgSdG<7kBKn zQ%xVfb>Ro0bdo0vI^YcwVnR5{stGtbVTcT4kZg%x3_Qm93;JMA=r37LLo*EJwRnpl zL!0>ccyJ{Bxh>sFsESA$8jM5&22(@Oj3k~u?+c^wPZ^}8^NId=V^HFQ=n zQB?yU9mAw9=zRcbPQW}o5udXG>-A4`wgqqfEMSB48}b{DoP zuQ2s%kLK4HUs@JZ?Q+l$%&<^==!?*uyose{YHSVRY(sAkEP+5PAXA)hRlu>}N}_sH zaP31ojMnidItr8wbr1$;{|W*Dwkw!dZ+rVcUmiJVZR@bL9^_w)_}APSAWMAF(eP6J zHjxl1gRKq$x3(q7?wMdqN|CT@7qpc(H?lcEC}?T0eq@vMMUE@(Ek6RQGA&()cilgf zr3b!Fvz_6l{AIzo0zl6q5GiD^`;LZwFB0^7@p>BBnbkJR%bs5v7}^`SLQ}M`#k!o+ z^SD93V{vv?Wn6+)CX0N$kyR*4TS3eU4oqx7WRw<%4k5UC;3if9)O2)i2nrwvI^GXP__cg0#tJ;{60ouupG-I?LXbC7oKra6vWH4tJ<$Rcj?6o zIg6Jr`FA^+`Q%rkg2syP2gJSbOhq;}sasn&?{K*hk*0I`rM!-N%-Hr*I{xoAcuv+; zz4#cs5|ax(XjI_a(j%T@zwkOjZV=ARN4yZQ5{kjA2jCvt+#SDO#KB%Upuphq^0!kK zCjB8=-7)>8T+g3eIln45V&H5DmqZAUpkUVEUcA9>KlqG7kPt-}l$YcTP@O!{0W~9& zlatsGXIcT|Ceu{tNiMqEuaAvDDuIv}Z7if@bWyH!y!0hnb+d%I(m3eL2c8Bk#m zK#HsSzUqyF7?lbx1o))TN*2;*YxK<{ z&1obbC;yPo#rjMUCy#Nv>LNZ8DMDbS*b=+v3G7*m_wT@y+FW2&P+!;u{091P2w@*# zo`V0kl#!Wv(SZdg7(12Z$3n(U>R-*E2Ki7>5+qu^NzD)ggJ#U&+>tiIyWN1z*#Xi9 z(ZB%IE*pirAtBdf*VyvY^^d&%rXhMQQ7@!tt+Sx~=jA#U;xuQr1cTvBc9&tuoj-~- z3MnX*VCq>3z}CJ#bvZ_wcKD*PGa5$UOy4S64~Zv;INbZAuJL$7V=dFE)VX7M{^_zN zUfCCPw;oAy>tMh{q8d3Htog|1ZbT}rCHS`r&!K`!Y@_vkesG=otA?Ufg)hUM;4cyG zI|Nl@>u|(JCMGg4nEIy#t#6O@u*sR3o>%+Z)i>3Y@md)Uh#VqZU`WN4SjvQiSq7>wMWgKo!+-IIF5pe#aQS4_wIiWjg5Al)^|!e zv;Dqjeb%`~q4(aW8d)?~x8@tHkv+rG6D%lK|DaO0<+H?)SGur*Lg1e@KF7x-cEnFl zbDW+#&s{H-bI2?4=FKeubmt`k8N(0%ZFK+Qn4PpFqayY`lMNCunWDUkkd}aI7|2Oz zl5nn>khzY&y|Ru}m!Kwm#xb+gr8)Jm;P6@A{;P-C8si?szgn>PK0JEgDW8>#5`AzF zyj3OK?5fMQ-8=F$+t9;<*15={B>5FbK4ec zxnktkG8j-+67?|jNav`rI96|Ja_bS?#;^@**ZQGIaRxO9Rs-6{z$k0MIl!yNg%{G_ zfV1nKi#16AKQIe1&Ed;JWrG=EOj}!E zkrsn#d&8HUUN|Gif7ZV0$jnim^9#1SzpL`HvR*KIHhzIG1H9^OCrzRnTNB^hJm;-j zMti=mIZZ}DU@)?>{Ee_f z^Tz$F5bj!w<;wx->N{Ya0DMyiyauWck!Rg@;^QR{F@b=TA@gmyFkBbM7(cVF|Mr~s z%x(jnmnNF#haVq1yT7({`TereiP6skb{N!N6!K0q(AV$ts^RhH4rF(^AouvyV?~L= z@pW6jF(2#Cdd29SIHdk%w5@zW%D3dc(0gCuLo=`6srYo8`bt#N+U_zIv)$b!!G53u zzI%NV?UQQ`B{!0m_fY6+M@ z8K^ur9$Fs@n1hCpX^!|zr7wz%hH&mhxr%Q)HHf;uIsqgQtcMystOQ80iB)BCE!ZSj z*?eLWwN*$+xZI=S$H+>_^-B6rj%|kxQ1RiRcX!>N>{c3%x)|xb;Q5U^lPeMjn+pP;NZ|l}6=RfJ8!DJi>el@F#WXQt&xs89kPs!L9 z^Sl4t&K&UgMN9E;N`WJozVAK^*RH9i#y)ZRB@-*FoS)Epi%%mLmppPCh_-$= zD|DwxwNO*a)?vSY5o`AZzb8dYr)KSV#{T?5n8zE>=Ec{l9MK3~V>Vjext`)SlJ7|4 zvf9q<{Tq=CCYud)JYw7TJ-WLMTYp!Rl6<-^#%f^NgDksIUj7CKMj&#MwFiQ45cyN1 z`{wzc=IK_-Cx*0snn+X|_e$;|2f%f(lt(&GB*Uh$qtoDNvUh`OVl8g|aM{NR{#y(4 zQX4};qY91hNY1HN(B!Oj+kWuip73o8Z+?1>Ejv2cKa_W*ZtSI-xuf8MnbG4v6WXV( zYWyB<$`B_kSn0f6xcng0w<(S*R7d{)x;nh?{CH zH$(=x-l1B2*_25QrXD@?$Ol z?GtF$yf%s2LSDM7_zpMwvUild&rTYReV=byUk0mNv00z(h}y5GE4VKO4s|wXRCKMm zZ~yhqk_EY`bsy3bUkEnVjOA9+!G$M$^>!uxi4|qVH4OsN_bum2|E7MxJN)oLuX&8y zs^;@M3zI_}x4%tQ9)TYxh^5z$ z&#cLsk7>vV|FZW>Rh7Tvitx6Ve~Lyrx}wCJeMZJa?adwei{uSI{CTnRG{cpAxmN}k znz2({j$I+bn+2i2@NU*o(oHLXg<*|>4n&zQ!70!D)N>@*?JzinaYfF5}z-rLOe4g5Z=5Ox8@7W>j^{J{7!IArX6eD6p>_@@bh zx+PcL*iK%fV{kC+jg8f_ukt<}+s+lp+!Qrxaqk$3UaoR%U~bOzZ&{F9t#yvM!hpl9 zTm4V*Uz0Vsh3%C_H=AEcgaxhmRrjj#{kGEwDsx(oJ;|{?%Clo(l1W5_>5-Z2-9xqF zk#jkfdO5!`wt}g0758sv)Znc#K2?=@vDV;A?ED-xm-!DLebUS)7JEAy0)#QL5XVaIP4CQt4v^{@ooTKloSW^aA^>)MMGbRgT zLnPr)8Z8b5&knJ$D?$3Ai6liD~<}f#lLAS>g@FaiD7$^$EXS= zF01KnNx+`r@rR`WtjrKH2~=pE-MM@B#y`KNB)#m1bdt*A9{CP8Bs_xkZKCH;zC%f( z|CiT)R2M$nUbo+xhc?-}kp4)k8O`_aTU&e1kI1)${o(pMsqpxz>ybWZ{mjPJnw(}o z=C@y2KQtPw(ldI8rWN*lC>o#O76yJsl&-#qI@}o^jARY85ZWiVqA+5!k$zN88ZJY0 zTEOv0*;bB95od)?J&5_g`c#N?+LFv^J+YOOqo;UC1p7o?( zS9KjYj90SHy<29f;?s`l{xvf8ZyS{Umfwt=LuyVrw@`Va@i}kS>sfk7M+Py|zs}KF z^S)!czukMj=SO%tFj^?SfEodp--laYCI9@+;{SfL@K({)zZciL{hXR`8&5tbJ@Jie zV0!G_{8ZQBmLHwaKadXJcCIR?xk&C|#(VKQ8u`>Hf7X>Z{U_KduR$pQ)xHi-1ssEN zbj!`?M2i;YcfjuCnt$-}oQjLvO9n*4bloiuKdu<%TGQ8Lw+&`^EP`I+{6mEcD~ir8 z#7K3{mwkG1d|CGKa~sO`6lhKS;Am!h&h58jC@*^J;R_?BU92a*!93ON#RaCWC$;Lm z-}^UGcC!rWqy?Ry@~#wEx+Ch?;EOGMN54HgL%Xx?`}awkFYNO(Me!6jcO&a}-gE9# zvAp{h9DI^I8a_(XzwFs-nXDMzHl)rgJ*zOdP`RM+m;32Y=mFFhS~$0~n4f4aO~!Ta znt46C=Fp94Mo+K2(XSRaYWG?jz5eq;5~=0VyG>7+mRLc)4KxoTnukQOSUg^hN^Bzr zPlWvZ;ls}(#XHdqKCU;$=e#`xxkHyIsk+_?h-V(@HlEzNRD zdX?rE(hSjn12#n$zGL=_6P1gif?c5y&*Uen!kY|YPylZpJ-3o?^SKPzGoWM+{{=wFSu;_LT5_w z5xd$STBl{#$Q041m^K7aTAFgUFPm;<+3DoO$g1ZRIPt?h!H;DtugAIlL9D;ui^%v- zo&T0hiSTYyZE^J6bG9&38A(WK+q}T9;}>*1s(LHwEw4%A#BOxJHD+dpN>MDR`sdbIx8v?ns@t@FdgmF6rGS)!58w!BEo5ph5Mt7y`? z%0+0N{+LxAzn9F=9^=Q;-MObMQ6%ZtRIa%ocW5xLU_A=;_@S}tbLQ5+whW9gJ#pp! z>8x+U&R;$wr$qY4-1J;{0`G?Uh2w37(fX{xG4OD6ym*lF6>2%$SCGEl-! zvuIEp8+7GzyrxF~ou$K!c3by30eL^SZ!WA&GX*DYq%)VbX==vn*Ovm8+5sx%G^yo)vVNq&+rt>SMZ!_bC@i<$BvnMwPS=Z$T3YP6DD*o85x@`EJ!Nf92 z-;(`_`*l0>xiiL^IL?jYAE$xI%?Yw6iZ2EPo8o*tKhygD){E9&`R9;3f0?sF^RyTJ z&V^TJJEx5=yHCuW%WfVxa%imZ@S7VmLmy-wpEP0xx^CYvttRq_JBdH|$rFw>a)Dgl z9an92q+a>6gM+MLY~1Io8XJTjPZHv;pd1!MZUh@E-4LF_id39}^H1!f)e2pheE9Tq zrd^@VV65S_XWb{=^Ik2hyB}M0^l*RwO^4oL$4YMqn(GKO-f{Gv{+l0fdPG84roplk z$5gt#q{O}AGg4q|jjHXuT$aIuIJr}5FWBl%aH1r5@b=mB6W=ezZ5{AE1P9AK8(EfE zy{UeG-D1qieAfF`EA>2B^i2kuzDjXOjw!u=rT<(CkCm?UnZH=BBbI~)`<34yl5_h5p{A>(05et-gZd<0IzgiTG9zANn8hwX?N_6rV?PC+GRW2bq6t zJpXDeY3qxB@!;>77qpb@3(4LKdm5565)K*BexKQ*zJlszlGiyG9aQIan+!fqR@5O8O|}zdS%gNu3LP1;V~YPin-1rQeIU zB^X_MmM-7p>Xa+*fAacRQ(2jUt5~F+>gnQ>&qe_uIUlY3G8M@$^^nzbeljUZ`Q=LP z>%~tb_7!!EWOdyY|BWiUydr5SqvekB8geFuro_$;eKQnLT;mt^b^LJV%5I z==dNFb;TV%+fG(E(m`Nn%YTh5;qUKH21?LidL-@#_Z0n#O~i;@|Kj=Hx{G-Euu)(< z3mzk&-z(S~U6lVvWw8&~kpyH4wD9ggc6SYZ&&J7F4t?V(tl8+C2In(>6>XcXE1Tv= zsbLQ#CUqne7dXU^6tCqL~{Hc;@bQG zf3OBywoQ4C>#=;@_UOfr4%F**TFzoE? zGAx{*hrX9S@4vT$Q3U>%a5VxhHW`74yMJC7hblOrW`lkE-r4OxZG^Tz3?zX%48YlM zrD3U_n10}9UGG&A5^`E0_IcBmlKZ7D)A@rhf6Y#)a#U64j<#^U+#EPGTQlNw{lgic zKgSnZrKTdkKlhfqb@p9Rc*Exp-p`)>{F3f`m?C?YrRItEh4Njf$MUD{{>9^!L8XTB z#?eJq$yF)xig15kinlYy;3^;Y*Y}JCix*rk`)H=waokh11mxQ>?;ovXR!De31S;a-f!P)k=A)`OY1iJ}#F&XD`K^B;<13Xx<$ zHSjOAvjj>DMpBE<%x__pL%^~y1KBd-4!2oR)00aMu^hV=l=wlbzCPzV{{%o0UfDa` z>vX=1)RirC&Q87Fb@7IJ<&ELD4>pKo$Una)h0Yu*EZW_L$L63CW?X-*x`{N&-+=clUgQS0&1T zoC`;;bc+YgJMO-PXZ1yI@198B$LI|3M?R!kcSg{FOOyF@0;`93M-n@4x zD@pM{EN2GowMqkj(GHYl&dIvD3-9#y*E*aI-*IcFnc2&ub6Pr2hQh;j^13?5idAXR zn`=M0yJBSYen-<_w^87=v7Y$J-c#;NLwpBSijxYWTU4jdDk%-zlJT5)8Jd?zQnT|D{#U={{ZFwO`ku56ecZfiQkZ#Xf$z;tS+kb4z36Rm8;+ zLmV3@%f6oadGpwHFuR4WrxbO-gvHPbtJZjIqYy-Z;fM%aQ5bvSE|O+f69*x}|3;T# zVxrYPqhGp9gM+NCc!ElUZSI4x2zch8=yxk*2qJeo1v2poELersVs@u#>*k+M+r*x- z@_UMQ_5KGhq<_!lQ}`6U5`lZj{x81X1RTqDjT(MPGnt2!5=Al>Wr~WVK_L}F8A?%m!!D({;;mfd} zBd`*(Eq<}ZwS7nIJ=Ub{FIEENazF`q!lUU~?c2*oL)px7!=@J86cYa)ad~i7@`i6# z04UZc6#I7 zYpg}nKg{#wdk;0Ov(LZfq-|EUXFXJT@$}t84L_%&nSksmJhH`r5d?12xO-fm)i^8s zx~`y{qt>2Sh4jl^PVG2CQH8%=ryst{tkDIBb@VMmgGaH2$Q`G8JfS0`N%r+y-O{pt zccZPjk9RBvp`V84s18Zf4MOb1K8#TN5;%TAFE(^pbM1^Q%cYWu-z3vg4{p})YP{nx zJ>CN9(*$h3Ei1;%6ys6=ya@^IcJmzlSoZLscpZ!``F=g-CK|5;H`*UT+o)9#G zrnS5%p#O2Z)!X~JE6$v)uDLrP3LFRyn}QTSkaXRCRf-F>`8U2l3(S2mU-M7LXIm%N z&)yNQklKL>+PrFYR{N1JEVf!bxa-gAc=h8NRkt4;Ypx$sva9>jd8r{oCEO`T@ksaM z$1$VpX9(qncAmem@VZmV{k-A+51SL-7PkTR30zmVtG;cI?Pr;aF6%ELZIYjU?iOe` zc<-8hTGb=$z9xA6v^96@;03SB;D%EOHcdLfhzrN=b|zFEX}X3fX@v|eji=||F*`PT z4MI#%svY#qC^KwC)5dy7LpCnyeLSW~B=Q65<~ z;y!xqf;psfW1f!xyjj#$R#ry(x?|WJ>P$;XST;0TmQ*(KZO6N>L((2!f99%{`Bt3R zyE!F~Ws{?-Q>Rp}=p0adwqUjfbpCTz+u5_*>+h~2q)#uSG21y?vggBkq0751Ethk8 z%z2%vZ-zb|q| zxT(drC%yW7RhKq}37TK%^Z1eZ_Tsm12Cu6Rw+%*d8)kF@4W9bcOXkEhf%N7NvyLv$ zjp5o6UEPIfLu++J!UmvKgLN#LOXE2>I6FVK&Ul=POl91`JJuFd` zBP$L(0NuB2gIAwXoK<7thOMYx*9`Axn{B!Qj|Dp0jSSqzwtlZq--p2*DvIBF#p0C8 zg}&U^u@_=uLW?a+YZB!(riSGjobX%iRaNi%rvHq=lebOlvTCdPpPRTt2pjSR++;^b zlVpF3b3K%K4X{-dPV(1Cr;yV~M5BqgXpm@l_34A|KO05%l`Wf`q~uHS%?5Q;oCq!k zSD8(odaZ`}!OsqGcYxO2Mwdd+T0`@qdhZ7YU7GSWc>9~K^)9L}yboDBi{fD3^DAlY zJ)(SayAzPV`>bWVV~XDA3O@KKsMkG|kg%is!>8BjyROL}*MHHq^YJ6`2Om5&pZr48 z$Vg#6<;U;}>oEg{xOR4P?5P0nzIWTsK4<&Frfw?rbZ<}&tDI?m+Em`vu10)I7B9YY zv}K+8uf7%F@6ZsLS_+Uf3qigqn;v<_CT-61ZzGJP&uSfqE0^B-a*ryX3upHXa+Gkp z9;&}m#p|8kWq#z#>;=q-th}yqlDFOJZt|yF9bVg(Zn(!H;_{07SF&>#pBuoa0><83 zy++bMUh77CNApFj?ktBO!c=PS$|6zkquM7~c3|a+7^qAp9lxuSoHKp_ff9_BD`Yg6 zT>*)T8-I(Y;K<(*#jYiQ0=&KdNQMJAs5l1(7+Dv<_hIwlDwqKczSLxgSz2g{P0O}g z9?mF(b2S~(!@~6jsi_uR63VL2M!tLqsUb{J<4AqMne{cZ=3hE zS6VgIv?BfL>pLd52??Y42|@tiB(P6y@HUC?xhNv5JBoq0+Waz&yx-F$ZI z>C`gwDN@<_X$!8MuwY!OB=<>`)hY%IyZfH+sTbSTAkCV*Q zOs(X*I~x?{s56kT%EvY{yq4uq)U82zOpb80s`{5`aFb6+$Sl=ouoZ7Z8xvgi<0**8Ia z20R>0POsK>Vd@bzRvD*!_R1Au#N%gJD&|!Kr9>j&@0Oe0pQXx|Lu4}a3%Kg?~q9sbMSKK+`0W5?VD z&Fx3LC6_FNc^)e9lbGhjf&VlUL`=dofM?jgO7d&yDBY1+|CVjDG}r^ZrG43jYs`+V z-(;R+?kyX|ZSKMx67jn$*rIVN6S>tvRP6`W_Hu@+R42g@8NBG`Qt`{ySd$`hyBZua zC$GbMgiYkRp!9AGZQ3yQXI4mJID+INO>-_9{9~6 zVccQ=yYd24wB26Q>Crtgk7WklKZro#ynKI!0PzL4AEdrA7gI?&(6}HNP>M~+9Kh_A zlgV~%!38~ld{MIsii`a~rUQ4%9uC=SA@oH=5;Ui_|E|8YghUY9qjhF_nk@*X81j_? zjxg;R9_gtI!A6rKwyq5>V{(xmZ84zK_JJ=>@MMdpMXruA58soBBb~oXI;C@!kJYXd zyWJOm{;Q%HX{r)?6!KBng}%P+auvQdm8xKwv4OR-WAIMW@*6(eryR9suaeGsTJ89T zBYx*%17pyp&qhUY>pUNSV;~eKc&ePOxt2#tQO?6m-Kmomyk`i?`eTPG#srl{VEt|A zCm~@$Nah93=fqi0V@#fPt{D?E!Qe{xdqEgFZ(NQFaFGr=+&-}2yk3j}koO-iK&b{j zPE9WF4;!W#_<`Psy`vunm%-{t_p@LRH%h;IJS!_9>v*<-xTM6YzCAY+d!LO~pJUhA ze4W!-?;jUn^Yr|NhKt}4*QDx;;tUN94=1ApA_XddZeV?Y_8|A*tK)$`Y~3xVBVu{wDG#2fAu||CAainDs`R($4$gNxjFw&%bLzE_Jc7kJ zCExZN9jDoUkBy}(?Ziz51nCFS<;%}N#2Npf^x_Je`5QnPui_3a$>}(B z5b6Wt+n9l3kV^zekfkJw|Lxm85UbU`l!*HM6xz6K$`n@FqhHFNTxNQ+_|B4((wv8K zauX#&ml}+B+$!{6efm&Z)niTZ=C|#9WC|D*)Pi+jtjk@(W_1+SZ@@VG z#>gq5JxTUrMu!&%+Zj;tU*9rbfez16YSE&Tl&7qovrZU}BRh$K^MwiNB{2TX9d20& z)E`p0Xt1dX`}|u`L!|Av87(pV9d~e5qwAELbr?y@6GSK>hIFdPlJaw}F5~@NkH8{M zfma8GG zeL`G^KQ**TEp3-Ec+=6pw}(ZW_m1m3%>aLK<$_i*-Gen(ZF`v`&Nw;v#Lb@4p7#+{ zPhdo%Vq*U2sg<91nV*vFPw4LL-HgsTxOT2Bu*@x&R)!%y@cs}aQI|~<)=60I0m--( zeRAjZOZI;s@qXU#8J&0utu##}7Ck%rt{-~o8<7eb5L8{BL$eLUXK)%%J$>q(`25Cj zV$43Avky=#xn9|XA#Z|P=Uiymti=p%3xVgsXFJxp7L~?+Eba+i9T|8&Pdqu~-08Tz zXNngnDBQ4_J|{l?XCP#7!Uy+yA+{-FZ95@7NcjQg#@s?ex-eN`Ky(i=l&4-f6O|XX zXFF848J`DT5llbglg(Rs=nB?{)i8b^Yg_o|3c}X@3*sH;TkM}kIVGNxx^vA(QCT(8 zwdzTwy1;E|k^Q9~6KffTyrDPvef^);9T&}eUCflfK(FHQc&C>)zRY}e&lspdzW5F&>x zP#s(Ed^D>;)yVj4z6;->uFT7~?61t(>3G=DZviX2+>L$5mA_VGXINu8Y`!vX2LGc~ zX7fX#1JeP@4Fn{Vp1XT^biG%U|9(HK8Q0WvxN;TMM&!(j<_4dPX!Z_{kAB`s(HW1+ zA7oB3Z86<_V|C;K)yt35ulh)@@UZD$b1sl4;=|fKvjyxM)@nxd?dFx~moa^f?O{X~ zP&6U$Un-=BgZ~f;p}?fpfaPnIhq@Wv8m{6Q5Kth^HhilTA__g7VC5Lh+M1wNs>!~( z2;zLMa3B9s?LD5XXhihY$vN8@D7!3{lBxh7e||_<*ggoIRa{zC{g?9Njb0w0ikAi5odQ{H$_1wT_kU_>uwyW$n~$crBz_Z%9L{{2j8 z>iYI9#}i=!=_6JC{`^L266Go4rfD8EC?sS*#R|-u*E?gW_J$3rUN$8kvn8HJCSAU~ zC&=&5BsOb>kP9}h-p!rTRAPxns2OyJWCZfe+i<+-!*bcvoQJ#a76zr68tvxU#FHaZ z$k?4ez*$(gKuST)C+NfIRUcxImDCTxE!7KHM2| zk|~o34@~T+wiC$yl>EMZ+c5(fwOtU3^nutYiUH&JE|el5USj7$oM?k*W&L};Bg0%Z z0)|dg8caAG523Zi<^>lIkM-YD6aC`GS1(g%Mc**ITEnTPrY7@# zwY;=+7)afnpX$#!&BjRtqaK2Y|tCnlSgezY8}faYO0K+uyFn> zMN+Z=p3?CW%;dRnv_LHTOFVYeJ#+S~@`;}cIP89c82rUpAi98w+}74+WhaEZD2fdV z^p+PFoJKFPBFE>Nir(*MVjEuEaN<`nve-B9WNG+1EW%ikQ38}Nm z#btUgd}!mn%{pK<+p0DEQ)bPaX#oJ1;1M_9fW7P^zkdE~?d{#Ym%r^p@6rB{siyWq zRY#;@|0Mz3spL3mq68np-6g&!_MoY?KpLEcuQo+ZtRkF;mN2a%O!f^8=%Z+-0zx_2 z|AOUR1WQ^o*#ZWoxSZU}zU8C`26~YY)T|7N^!{bJTHmVlDZ-F^hpI;azHUv*ccHI+ zb*idyF{<;=G?k7RxR{QO%J;QQPu?`rrSi+k{$Z@)p3%bMRPDwUt`F?7BiJ*%js?$d2|^^Sx_FGA1j==itYVR*jaR*S4C2L(N znnKQ^IWb_t@?2Kd!YdGCqEHIf;sks5oIG|yX`ASHqgwzFC2H~hCXoV8&#ZmZ*JP>g zYB2b`>UDl}!LjcY+rP`N%$mY(&(EyxzkB4w+mHpKOG=^h1j{9yrLzO$e<=gB zkw?|Xj2Rda{Y3H_M30vVPy-tfOxPp52KSN+#}1Z#YHlAG*al6&&BLF9&T-gyJWxvB z#PsWM!$I9?^~*D-b2~NeZ+~?8Vzrg*_-IOYn&Wbryqv{)Ge+$5WqdY|JotZ^=n1&AEQwwV5Z@c#1~r)L;iGs`WWu}l;OoM$IznL%J{O|*=24XS_z zegUaq=-F)9m`M|PolLy`>!2k0slVEQne$YI1DJ zoaJl1;^APy;~&nw#qrUOzWy?%-4CyRdwdJTRNC9$)XR7f{^BHO&OcA2 zMc=NJyfB_usc6&RwrTF(_7kg`I4tIfdtBk|n!V^*T;$ER+uS3Oi7RIDMoZnSD+AGL zgSPfG62qyh%j++PD0aB>at%xes4jzkiioIaP;fAIfP*290m@r@ciaJiX-}R!fiq+b zq$Jwi-UCnq8!Y4LW3;lLK+z^UM$*)K`1$^O+6)H+HnCwJX(I+rZU$-5TUU0v-mp(c z`7Zia8k3`R|J#~fC510o-|guh^0&ZCyat_Qv-(3T?H{&GyStgGucgo?!Ob7&jRTC8 zCN|7ss2wF{9vZUg2o!`JLpEY7_(U0B0x!%K>nsufVNuTFsAAmFxHCprCp?R9hQy|@ z=n!8{WuXf)vo;IJ)KB3uXe8*0TH0;uqqHtcvS0|En@|=5U@KYWI%8xFC6(EI?~cLs zWug;tz~7GnvLS(q@;M#tZ?h$i>%3}eS{SlEabDWeP*aU<64qkxV;_%LHypWtYxck% zPmS+NS?L_+6&WkP7;}}qQ*n`Y)L1Ke`Lo}NbiQ9!tm1vWm$#?ixw5_SGk?>nxRj zwnz)uVoct2-dE)@#&$dryplTyu^)0aGBO_v3KyXu>pO(Yl=L(fFUe30Js%A`(b$7# zgC(c3Af)FSv>RX-?fqN96vJcZkxq+dNO7wY)2^!uNYTxoKc8S*8{SGP`_MD}nELa@d$q?#*QSzRb6Jykz{Rp$k_&AuNwwyV!@=|4HXXhL-2*+N+Xw?CX`xi}O zy>&M?pzEBEi145nt0MOQK^{J37_^yTI2FJ4ecOEX)_Ztck(E-ActZ2Z=?mm?N*DN z`!7Vj03=xfMVLw%^y`~2Ph>%s*@veOmyKWwJ|GyhwO>v55Gn2eN1M#ENOpzBVo-p^ z($)6sf4re@(>i0rF;t;V^01;Uec;pziE>i@#_KyFe;i+m#tsXv*@kUy2_;j z;F0PnoT|yykL_YuVBvFh@PSknyi<#?v`Y0X%uL$Ro6`Q+d^K0-s_-x%2R3|c3)p2j zZExTy!KxW#!x>eEV$cjEnJ7%g;z?oQt+@vq#26=`xa9~9RKAPJ$wf}`yc}CW@UkGO z9#_}@WM7h;MKy*ho&Tpi*6|%2Z|T_Lufavr21h#I`)m;KUB)|&? z=nz2Ne_)1$zrR1Wv^2qU*gH^U1oJdcRq>VB-h$jhOW&;;bFd9(Axq+bZrrvF*OUc8 zE^pdM&Z!Bh#>O-aLrXRGy@0P*)L~VbsP8zytE$NyNun@bG}eP zA%({;kk6@si!G$)%0Eoyq*n3Jt34L@-(?qJUJR@g2czsH&I-v$KN`@OvLLq$&U%QZ2XSHG}YFsEs>>c`Lf=_{Is zhJQZEFuyIY_)1};yt49Kn3zFuQDH!KhHr6N5ENShJ_I04D6&Tc2KLa3JxM{4T#osV z)RQq{d>Y8b*$YV(5^s-J$E;SW3^eYoS1JeE+vp?YlY5(@}HVOQT$ z1O+WEw&#ZGUs1XBc0sb~%`sGK3}{jEC~wroi(HRC7eb8XP@U6XaR$Z{z&c392`Dw0 zui~r~zh0z2MS0TpF#riZ3Bs4&zuq^Ip(KL%p1uPs%P}1@J(qgWJt<8p3UmA9t8ihf zc)x{Z?Hwh>SNAI4zP;ex#mU*=gNfH(?3I%b26uu_7!XImj zjUYRAPz4LYDlUD2kc0{mx)u%RF>sZ4_6cZd)iR))M#E^dJ3L4O&rmOf;c?&f(X3^V z#V+|x7~h>nmLxd6Lp?V$TEUK|ee9y}w^AR{rI;Aku3dv`S{ja#p#ceHC~>&p$9#J|0F2=ntPsX5^9L!rDG1mV8JSLoNeqcY0x;Ay)`J zhR$`Z2=e55f`EhEF$EG{uz-d9X{U%KMBggE=fVNG3a&-jdx7J`toB$5Sp{EQG}6`v ztj41XD-=#e`7!@EV+i*>2BS!Z5ugTkZoU5lF0D5 zudq>EY^vT;oQmVy_#Z41Ns7g*k;B{$Vh$EKW0o%xRiR=8iT#t1B_!rdTV`Gf zf_fG{Fock_Q9P5FD7H)(JFfjfJH9T>a9yIFu&^)#T8`NC_qloVrT~24YY*}A^0w4$ z(q5xQedo=;Jah(Ib!zvfu4UrJ|HJdILL4ctZO zF_fK9#>`%`Xwf3-wu-{nu3WZi6+a^36iPV3lcoi!1-98HG-~?(b$*Z*yfTe-v9yZV zv&4lp1g^?(jV78a#VGDGAV@&LV;% z7Ef7%gJo@>Yb}Fitq(NdOm5%*;flA9dj@&ePT!=RHx(~$DC_tlc&%vn=3rED5SqQ) z*@9?wnryX5EE*sz*r$tJ=G$rEwUbo%!4t9vZA~meUm%fu#AXHqa^a-XD|nU*dTHno ztG{m(NxFm&)z|cNA<4<%tf4jbN5i}jahF$BkS^Smzt88d627f14B&F=9ZH^)K_sRf z*mUMsg%>NH?x`BPY}fvruKrKTh~C=CnNeJvACE$JkkTu}0=ZR#*Tazlh|Uj0L~`WL zglWVpA^O*@UGc{;=9#7j0Zbh^U`T;?T{?T<7wVogBOa&}!!KZd-6okYX-HnfPOE&hr!9^TH?PmEx zSS0B^^!`Z#dK|q2Y)g0nPZuC-7>A172tc%;YKrD|kTjP^$RVe9jPSTr1sj%L+~V@y zQH0Tb?2+JhZrvs8;TT1^O+%w8FGF|+Uy4{`URYpi8YXU}@GIy3^+4XpyMvZ57R{@J zK@6&9PK?)XWUhu#c~|x240&k>oM?C>o-EkwbL!L-8l_upN`lNC!a9hTQdI>UoQh|# z{yr6ArZSX(;5IHmjEc9+n9=DcPbe#U!41?`{9jl~sk3A9 z>CntFMiT_b>3|0h9@Oji@IZqd38nCWLRQf_E$dV0eEiT0w%|>~sGm?Fi$OF7oBE8j zbaz7Tm;^j=wAXU5z1oIEptsLT8R4Wc^p)6i|Rrz6pzp zw%y-u3RdPLNorgBqcSW5OBLR==!H1Bz1fl+%kFf!Tc%N*TrIkgCSdmAxI{Ilm6^)Ws(`f zxJ%+&dPYpd>2Pg@*NWY?V{_LKO*FC?f*>_#=_E5rTgYq{W$iwx-p-dqS*qRL;heD%88 zweWS;a@=w-(y9$T4BJKo1;~esyN~oqAYLy*=73-Xr+|QwRW7`-_U{)Xt0#W`0JIv1 zK0e}wUMp@o@?SR)RlIC~f8?8FxU8kOx4hb4%i0+T?+>gmkbwYZiIxEKq=bmiv17tG zr4|uundi5MCZ)R>J}3Uvkqwkp0dh!F>i*-)Ezv_Ya@#HZwJa`tH%6 zUu{Vs43}TT?iC#Vs8G6PmOH^~hYTAVA}d~oA`+D{1tZ8Rg`YXYMUDbgV8U*({#9U) zE(c4<_A6VCshAR6*ieoci%}i2)F_HvJi2 z1%eVDlL#EgE;Uu#%M6~oaDl3DQ=KiFHa$ZtCJzm7q%g=538D(Wsjq`erG>(Fy_%qi zT{;F7gP?yklc^q-GRQjsqlF=-Rd@-;LYJnY0FX9B{f&zs85=tb=60yRnJ_&lMrfpsXCDU2XGP>EDfur{<%I7v(fxszNn@os<{Wr7w(+q7qQ z0shiam@EVIkoa)oAq0$|&0wH3N2It`FOLfo7$~RiV+k>K7zk4&x)TfQB#8T2O0>!q?YY!(xfxU^_SAkwo^k;E~IqJ~UF#4eF8GBYz-i%s0DfJ1BWg@KdEy0A_Z*4oK+c9hzy ztIz5zmRe|#Os?aM{P*v7w=X`a*E?kIXL!u{ek{E+O*SK#JGFq0(GtOBR?iMf_TZddpyVoleqo7?I6n zbick9QnImMN=Zoo%_S--*Y3oCBIv2t_TgPmn8J~;7Jet;1OR5x1KDwbu#<_^*jwh0 z1@Wr{R@u)V|CZrRt^<}EMD64!ZX&EW_!i1aORt9*3$h$y6?zZsr@$m?x}IWCCi)0U zboS7aYvI{0G7ns}AWS=0fBc`J;+1CsY7XKZb^x_cqstQmu z!+OB9XkZs}1=Ty~EXEg@%77-EdHZ67GcB#K4L9qU8IaQ*7|k(AJ9m~n?G?PB)^V^* z6hcdnx5K^#rbd9;pogthTSE2==$iQOWsTtA4HI<{I%X{pHhKmwN;ptYQm96QPyoIM z`61z$y^=;3kfU~B2(hT1FV} z8XX9lG;9p4g)nWg3X6yx1Mhw!x+0_Hn1)|4cb^Fe*zW8@ITQw**`|{*YcGD|=;$b@ zz^TIvzow4<0!fO=@Wd?JOtV4dp#VD|yHigJMB zK_Wnd4n%DL5a*9?*YgCLa7~s?o>(tb0x6`{PVr5~o(RZd7B(hq77dJD26IN>wG?&j zvfs6;tHh_jL66d|RkMs>9gVnvOqwwiMf51C`59Aah=_=8X*=%P0-}@^0{&^Nekd_~p@zNr>B&bChXw5`xb5G+MLdMxqat?GR$lzF zh(Wy*s%~mK?4n_$Np6)?DsI2Nr2tGQ;j^WP+tzo3Lqdi?D7AnxJZymleXi zYDov8tq7SX_W#0_&aY8{b>%_3q)(k49mVTbyb=Nlkd0r~ya)h5OMClbm-$Izr8t8? ziv(64igA07>dFD7Nl|g}A~^I=bOex~Z)`jhr<3?pP3(1cim0$=qV{Rk=g^1KA+_OH z*c=%Tb?J0gF*cb0Nd!W2lN7Edn0^MQnIQUcC4Z zBhdy%GVrUXdg3AN+m{F^!t%w#gFsg|96NT8vSDmIS}H5Zt5O#QWznIE71e=4K_&am z9=r3B=rlxpXQMLT3#KKhgg<@y6xY1uIkf7X++Lmm3}pJ)JsS<}_6Z;tMc~q9%a;Ei zKyLP&u#!%~TB!RYak`C%wAd=(tUIIfhlsd^;wG5VETekh*&wt6;49rx9O=~(B9 zss90V`MH9MOaeAoE206(M*$dwi_?m$&#yX1KLls?is3R;(S%Mh)}Z^a% z{0LEttOL}6HFgeUX5=WRx$+SA+kPTQaE+UrGEPqbf_WSG?1NvvJOiLQ7~wrOWdb!p zGsmg_crf%N!IX&BKfcy%LwP7d=2cK0U*Pq_Vj}egrZ$w9l;pom)Ewx|L8~8j8y+7G z4Gs8#T&iVe!^6Xx@RGul;N;*CMm$Iot304U);ENWCY%^CraBxrGm=}DGAvRErKB`KY~dNqwRX<&9YrY4L(X#RPAx`P6f1kEy}LUQ@&9dX?14wH z(#&L8ryC9jD75{9^;QurD8L^8?lV!q@jyJDj;$*BBR5l1q4nZ;d!41eJ|} zFFd^ySY}_v8R3&^n*-ZfvLC}O#RnPBhm=Mzp^*Si$F@N8Q>${CMjdeN?4ty_fjwLN{lss-4E;@c*;j#5S5Ey> zE9?c)ccNUt1Pi@ID&Avi!uE{jE8kx3y~2}QV^K)z366vXuByZ4^}#3Qu2fhGHaC4F>pw?z2FKQgpJy2q|v z7#izy=gu)wmtDB`e*tUleA7*Hd{I$ZL9C5B=VFxkVOK$wM9rvaWEA7J8%G_q>>%(3 zaCllYV9ALmF#!+$!kKy7lwXXTBqyfOE!VTLP!x(T+rk=pkx{RL%|zHCxttPX3i?tv11mB zvZXGe9&f;V!eYs88pr9Dp<5#pXb6VP2k#?qpjuq3vKWu@4tx&?LPvQ_9$utf4pk``Y`K9SfHm02K{kAo;Agczw}VE$7WJ z-oOCh4h$1;3)aExneHuQ+a}=(DwF==0Gt?k;0cgpF5cSKKBd|c3iwp{R#xi%o$BsP zoNRcTs%=Ii1>XZ+Cwfk%)rYWi1pBAEedv5F++61Y#+qp(rTN6S%F%3hlUZ8Ix^ z04D2M5>f#+ciztww_A*|nPRP7cJT{mmH6V)AVer!Ulg6413K-FZt>R$a|2Nm)g2;s zNic*C!w`bWbha);m81B0fMIEwAuXptTdVVaVtf zI4(-4z2WmjzU&~Z&Or#{Ri!*1r8|LL2Xb(6F*BfPTx1ooTFg<QN1U?xV11B^tcWBxj(slllh#@LNc*P2COtM8%7KvmXMk*@?nI;nmdfxcYUW7?5 zKMW}0YDt7r@{@o*^LC$ADb zaS>7pwvJ}MlmnfcgPd)(tV&o}jnw96dtpK%>2J}>75Olr3y?YT|rB|yRv2wvbqc^GM zlO1yVdBWCUKTbob;V1tlv;KD__@nqavO-j(M3xB`URGU&Cwu)3GnJ>Bz%{qoA>I0U-14rl%UX>;WKpx_Wqo#3jT&f{pBarK3a_qkUv{ z#3Y)0Q2Bu=k!&!e{P#Xv!kia)s0ImIZm7IrK*P{*o@O{`= z{pxcUJOnW}`75~X`6%{*#9MB_`PqnoAe%SHOyxLu(ln^1p(#}<(Ne~~Wo4U&?<3Do zVE}Nhd=ETqFvI)zY|QSn+_iUahXoM!dRy*Rt83cZ%YgeA0+MJVz%jrhxO9tWth>E& z*Qy%Cr0ZhWQ&L26R3Ms#uG;6-0eGHuIEG-F^d1$w@cB)*-CU(jP*elG#ab3SnnhDI z2DPmCRiNaGC@9qCeSY&P5W8TSR1$ss2yxB95*yDV8&1ia~*P_Mph!b z5FEq+j5(7L`Ykum5~m&41n?%pSObURNDccAWuYsZ@(V| z#2xk-v8TH}Gr3;AA1T)?^89&BaYaNfZ8tWiTEqf>s1m4L3%ti1GDY=Qql{$-#?H6! z7kH!xKfga?_S8#=>JL~y>4De6zsHmFe=}X+Az-@y|Cf?cV!a$IEpJeFFO&HB^XD_v z{jmXWZ#~8lCzuUPv_H9A`pKCJLNI&gqiBM2+~_f|8a?9`1SKlSu)jn8;WRPD1cgI+ zb%XENm?!N@)x#X~$!O<1SXe?Rmxb_b-1sm&!VsY-x^blwU{WB%P*;5nqXRu7qZy!P zWwz-}0Sbeffd$LDb1rTH8wC$qMC9fxyKIJDMri=5NdzwiiZs>LN3uFJWo2dIM=bKl z@6~}KT%kMIq{6KKLUG~#XK40tD_}`}&rPuAHaZ^ws^CJ{bR4_ig4^%{1XeOX#OSVd z!26GCqg$5{YL|^vI@O+rhj{Gl)6TCx9aEebEKvfiir0kW(cc7UxRi$mBC}^4w?+F; zV$nd%<^atOf!DGL2hgAm3*1;JT>9Jy`HgMo7;#Yq^!Y~~f8#^bl4y`tQNxKPZVP;B z?e?$M(!esGqr|;~Io*6^M;73um~uV?ydeig0m#hl>vibI%R}F0AXIBLE^rAL9{px@gK6G)o;~wA& zN2wOK;^1sx1&TvUdZc%T^BgwOHS5&+fF^z#1w(9#^v5!U8vKB~^V@@D!J#3|Aqqn1 zOj?LzgfUf>-xEB)0}~_72`a(Ev^dw^_M-nFz;DOQU^$+ls5sP_L=zYEFN*Bdolv=% zLwF8;1gW-ws1;~}3R89I`AztXoQfHd0FtT70=*mzN27ZOIIkK=U@!P2A|AyxJTJSf zrh+s3P)gGM0r!0f#}0>piR3Wg`fw7|^JzjV$2e3)5Crw_5?=z&MFdtZn!!AYNcqz` z0k&fYXVuX2u5E?=Ag;=@f`XPOdo-7whcl^SEKW32s)8)FF5>Yk#K0YyQ=DQ0) zl!6qZCj2u_Qb#7W{CB+C1jqn@l&E%Kn3EGReNuq9fL4O={M10agJ$*K$1)~5Z)_9< zsb@j>wZHG6r$K56nq8~ti^l+NOAC`iDH8|6G(AAUMU zY=yXB|EhauG&xBB-`v@v+0*2aGno!Nnz+0m8x`!8yZ2)whn5x*%+V3taqiuz_WNrM z=tAr%(;UH|O3Jxf&OMXSgd-jO@`8lA-ae{A#D%}cXUgSWL#So*mQv=KZ5doio zfDQ3A+|Cmd)$16?9~PS^W)8gT?Cm{xb|3`NS3l&IgBQiF^g*fd{%(C!-}ynxQ3RX zEV=firNBA5C|qaal1^A{YV8Noj=o(BnSZ{J5WX&(FkBi5o<(8wmzcMB7O0FEderqQ z8ljZIJa;+#z(0%HxTkMaPmT1#@Ubp?%O2zk!}9XlP!m0+Wc4PX9q@5ks- zbc7;{Z#*Ts(n8NcCPqGjBhK&&*)l}|R-Bz@=)`@Y~8<`;O10Z ziQg-@uLx{ExK_xb1EIPZ=qcJ?CckwSjYnW+qC3Lucz-L*$I*ddo_Ui3SC`U*}J;Vv_0a;nZz^pSn?gV|SjZ*8hR6?*tjmI{(Z zMMZ`Co{RCw$Xit6=lBW-3bj3fGAI*c5NiP;ai;@y=3_vMF_Z#2%u}dT5fX2$;b2ii z-$p*9m3~ZAlET!RU2V{(HS7u2IyTNN~9LRc-r8*C3t?>h}GXD zGz22op?GPh@^=dKx2MMx$lYB9nAcI1t315C7r*nf6o7w)ZVYTZf)Wa{VAyDZRYGEO zG-B~=nunQ)$nK8TR)geFSU?9ti9s{@)f(Ic>|cT%NpWo&`+`suI&?1W?d?Uxk37Pz z>QEuO27XyHE-j$(b(rptk34wVLI?zQHTM!0w1uA3jlU1|8-^I5t4&O<@626_VG{^= z6|co5qiB4Up;aE5N{t0`nYc<=(V1U*yJQ0g9O7?083dL3My zTF=r6KIF+8v-#>2|L=Ur@44f7DsX5gkcn*8Ll$b)iePj8%~DY;-ScYv{>qJwlSGiU z(IlefU8JN`pSK6y8eUFG>ET_tPjeQkACj5B-^NB0Z~td^G7;YfQTQd{*4+FRTE4L_bPD;AAxJFF2* ztVRCY-fx~DWL1=w%JcJNgOH^vonvYa?$E)Fuds=Pk4m-D$|H@T$dv`47R3f^*0R3) z?!l1=P@akX%D54H4ArwA68B#cAyBAA=sy4q&75ibieF-xgv8n{TSDF3tvx;Sa_%U@ z!;Fd<66F03hA=8V7DOWuMK#f8phN+b&$bu)MYI-+v6a-nr-Ehid{jEvsQ%_IG(izn zjJ>Wt%8_c~Sy+m2_L?>d$l4SjNlRxZ5xtkAl_p#WP#iOZ{twQlNXjD*K%BSkx*lk4 zZuY^UBXW|Kbs77?#~5P$;iVbF!iP_2}e8i+=-F_b9s95I;|YC|B>$tqugI4Q=`a zK|~+n4FL|SK1{e(?w8+#4k-}!eA=eOJVC|Tvf&Lh(dBKe|)Ee_vA$At|fMG8B39*GYh3ZTp}RjN6C+bEOS zE?ba&_1DP1V+}2$gJ21L;BC|d(=$vAI4&qm+^X7-vA1^eEPGIDF;OP=SHzsedN@C@ za~{<>A6JPoH0v^+m-QSzziPF)@h^$al%33Str?m>pH<%GWi$^JoM4=qF(F`woaFa+3E{SMvT-}F;K^JB!?SvpspHTI8>9Z^{o zx%0@8F{deZYPh3%H|y{hHde(zMs;W};Uw4y+NfsFJD1#t_2z+xIyp>_)vO7Tl$33X@u?D=&* z)ueg%@0*!lo}Uo7@m=xvAqDzs0 zY2Ux;mG@KqYMsV=raKvp-=DXR!$tc}Rcj*Hv1pl=En8;i*?+j^I$PCcjR%m+eXW!?>#!zJKHSycI zfB*j7(%SmE`^DzUplidYFIDk|UU%{@+g-)Uy6XJ2dHwSfTP{|yU44MhXa6(r$gbb@ zx?R&AD9Z}>IypO&uPO>7ru?z*$q170T_frp3hI~?5#q;W2MvT|0D=d6ipEbE3^8nz zQGquJ+V}&@BhNNAMsd%2Y7$sh>5HeE7w<}}b)obkuur|~KdL9|nh&|Xmc$i4Ub znCFHKFaGT<#KyUfe%Xg92n4B!m9xGx3K)-o4tAYhDHj!TtYVn-ZMq+ICA#m zu>x*8ssD*gJ9m=fWGf=K(y?w1^!&3gZt`)Db&781=0DQ~9L+q2OEd-+uWWRd(Zgtv%K_sB*<75d>F>SFR zh%UEo-I|uugVMY<2276$T1Ke*rKXa@#k}?gkO?vToix8)`N@=0RGET3z9?JHjRbugg0p*{JwKjFPHq10PkAGQQ zBXoOrZtalCh>sS#@a)ucOh;4AefnnTSnpW1bt_6>J3d?^Idp@-W@%w7Y~!kt;FEkV93j} zZ|~Yn3sg3-;tOOjCq>6fRW<2gK$ez4NE7XNpl>IATZ8~P4E1_`|LW}O!Vr;(RGGPro==|}M)k~`&*;zV{%+34{XYD<9MjzkS(5G&DaNi>)BiMH zUtfC7N8jMZ`0Go-fpyokN^bCpZk}J@2vkSEW)KPwG)2vI3yF*g zK63nLRkm${xB}aQUq^NuuXf0~=gyzz_xtmapGZ0UkxY@h`1wD1{TqNLc#pe*N{W#u z!By0Iy}q^?fztQsScfdOR$erXkF3Hk{uG{JjCm!Nmg1Bgn2~gd;%R5M4B!l6Gfi3{ z{l5@Bz0pnl474-_qYN^RFxf0?1&9 zFFaEzDI;V5C8QAvkBI@M!hxFWVI{Vh)<*-FLWm@>1W)idEnj4ES$%75cFZ?2cx?2L zX9xGDW%dnk6(kC|yu9pw+7CayJzDK|&9CisPw@*!LuvKsrmuHD^RGlEH}S=)0UwyO z1=z}jY00+Cwhz(C*hODs#E%Psf$QX;9z8u!*Dc+UR(N&*s$eLJ6X@8y>e5NPlywa(zDc`p(J0F`uvm$<^ z+JHGi&(PnJwA~gUIH;bUqfa9FkOUbI&;y1I3z0_fLWqTgf{rMYq*_UeW#|V7%+B*u zK@!NA;K!8sf_jTG5saL>p7p08sW1a5JeaSK|5Z>}30ZWZd|vy)Y8r~v&MynNZIaE* zz?ZA9U|ubfLK;nDdVgi&zKrtS{N>Q*_Mfo}DE?qG%aa)p;cD*AzQtEl0%?q0Rs0vV)?G z!UK8|7PrPfNdA{uo4IN3Ai^~;tLcQ1qO7n4*GuFa$G5u6y}?Hwoln*-?Ylo!({5ZU zo?YN(wPN{^chev0Z#tHy&VDrg=lSxOfndP1pkw+8gweP$!1aZIN=Vsz0&q`B z2wf%3CzCTI8G1)8r|PSMjKKAua*bJYa@;qCXELuD4?7%bxJ}a`CzD~^YMLF7S1d@2 zm)NiXF$uUZ7T0cavM`|zO*1s{%){xxJ^@DG7&8G3pphIVTMTfvnm>Iq22T*@SZ}Fd zdu{?oep48j=RvL0wIX5lJc2MmUPAZ3Yv65$F1tX8y^77!NAjblB5C8MHi_2ShAHpQ zb2+bCu*&R8k*5>Wg_UowzU_@VbH?|_57*((Ab2iax|Ft<@IXoW3zCoASVzVBh2Byg zq8y-HqFP^_g{mF9)*mzJ+ekrSYAtol^4&7=%1+a0c@W~(|IkSL0mC8~kkiJDY+Xk`K(NHD$50HJGYz zm4yW3ZXhyV6t*sjHS!+w;`F+Z$c{G=XgX>u=saNQfjYm6u3$mz|Ak!FAqxW6@W(``NxlYU)~u^P}a&i>9w z|3tbTi$KOMZ@wu~TUWFnPp-XU|9f}`lfW>O>C>SYt(_+p?0pn;T!u)_Kx%IO_5z!X z=HaNHh^Ps&G2O$Z5)vnqlSOIYg^SAuVnBrHLwZas_soH02Z#@E>WVZ#L5{y=Qpfp_~w zX3!H}t)|utK_Cn(>ReCMd_RjJAJtW$rvy-6idNIl)Qi7Z%F5We^bSJ~TlQKX`NbD; z73zAAgm(Do2h8K<((PiluUqv(#XPx%#?AwI!*hr(MEkhD!V2BJ^H`_FX?QO{WJJew zz10DI6(_b92(*V*oHj6vbDKJZHow5~$i(6a2un#=D4hIu7D>~juogovwY!;$0@iiWLjxL{QbTuDDVGkem2f=NpwM24;xhZZ3n)rl znoglZ34HaEmA}EluZOoYm~A!9A+zU&X0~4UD}1ZJW92=$M3ymDP2G=`-q*j?c{l2E z>-RCG*$z2Kt}%!x)xf*1`~dia)IG&U&3>%(m<@Ig7kiGQ0tOGjt z``$R6ymVc3leN!PMd8C{igP(%Py1!Y&BaAqbDmHvyYnE!#PS4y1e7>kPs}rL$@pbV z!H8Ur6>$irhQh6hjrh7~XF#(?93ciNdMXjfAY=6vgQm@oBd!6C?@Y1)!ISjEXyuP) zc|c_RfO*jR6xMm2$3KFk0Vo6q{_CHrNdyq-Sz$Z>@Ic~MEhKC_CJ*>VJ8!~bV|k8cnlL$ zlx}nU-2Q53H@1ofdw*r;#+DORnEO`0OjXa0yR3(nzLxQu6(k+CuUF0f)9DkoGB;XwF_JCM}Yetq-Qd&ikRu0HXW zi;**Xj|T(;SEGyaDsf9zhBsK+O_RD8x|lI5IDbKp>FY@#R-eU7iV=F zTzTqJ*1#5THEp@G|Mxpvr*zv-dAFOf_ykkZtza)HhFj3ce2_D-bYO+V(Xc*%IB=!b zfe{h1_kIilLB#0okjqJnH*FYhVfu-Q_%twT;X=WYk@sa5=GiYH>I)^W|BtRW0jIis zw}3aI3?*X}WeQ0|lVpl*Oo=ooDN}RF@Ro{bFiU1Bg)O1UT&YB6QjwxTnNl=~Xf%B5 z-s+rlUElY)&i^|9bKdgq{rf%7J*<1Jb!%C5?0*4H^Vc6gf=WvC#nl~>HU~?f??CuV zgZ~>%s-b-02MGRVIEikGhhsn0^xY2{8-9*giJB?K4?%esiOlZZ575B|ABwxEWFHA6`MwR4?fR>S^ZuKZ1z8&QM zeP+s?w7vsBZ4Vl)nt3Tyt$Jz73N9~m|L;69a~N5dQ>W%e-}1&8GuaC5z;oF1Vu8^T zEiJ9!2&2ba9UVEqrw3rN9D*XX1o;IE^37h=xd?;470}-9zM)W)^W2hv)S}ZFj&t-| z6g=a)OmuEfGOFKjOayUdsAKZ^4hnmOnV4s zNVEjw4z|n>_XT!paN{_fGnL&w<<&Iz?25iw70ia1gFrt?>_A)<*nm}XH|}J7-fQqS6_z4eOL* z1q=>~G$?XJKUp2TVe{A`bOzkQGiHP#fjWa7xdZy(9xYoY7zTlcsWmr$u8vkfwgP?t z7RasJPnVx-*8BQn&He0^3l{F`;Y+;w_4r)5Zx^`=Y8lbTEO{fBa^_9bLB1%bK_RA=SQpv>%TWWcC4r8)i6^^amMLW2->>rT`8mQ8j^*6200)sc zxFqMkyzZKcHd%`cMKuELF-W(FTa6j8&5K!Kf>~ExR?5UY=sq5!qYqw*&e7owUZDF4 zH|>%#XBPVMlZI{hFlta9ng*1?E2%}FB>Q3siFrW0oYVi36ZQIj|y~?j-VJs zDr8BWPFf^6aQj}D<8`$lrtM*Y_i>BuwzSW+A}0N?tB|M0*N5@@55~E-8rT|c+^cxN_s86Qt+#mJA6}I2rtN~@2DNO@ zcNnA^1MRk}UbqV`rBzDFKF5hukL*sc86q(kT)7bAC8)Q+pI}zA$7Pyjk7z11XbG}N zrd_@wCUC^8ZFE--BBulRh=I3%^6!_Py*A{67dEW6iZ)RmR zjov&{aaB?<&*bSO4C?kYcr7opK&U}iHMvW-+^xj4<7LSbPu=aVt|7NqEo$$zp7s6v zjbHl?cJC5qvAXtucxqhZBCMm6)Ni=L4O#rkdN;!~bJHge$2|5nH9Qcz{LX>l|L4b= zujOybi{h7QKkxcd+{(Rm%J;a&?nNa|(#sYNX^h_S?8|cAR&=nBuQo_Ufmazmis=at+6*Qp`kErOUI13=rV^DekJd^c;tEs(Jb zqb)syt^3;UokB)W!N?f=mK4N6PDD|zNDddpo@MF$AG~&aaSl|Cj~D;C|6t&qO}ZO4 zZ4w{h)?6<3pA`DN`FnO)3CwsY!ibC>n53cfxPv+9niPERB>3$SI4_1*o&ne7)IP7) zvi&?l0H)n=(-9hymxzPO6nXfeWh+M_&jnB9WIzC6Wr)U$(0~vtDAl98jx|0}nB(}K zuC59u&W4b1^+?24vy8(Uu5VsOs>y#>c8&OX!T+@1tW2^x*=f4ljqX-)Xt?TQ+>4Dd1vZclxMA(_O($dnYC(UegE>W zIv3M-=C!o!c+y`|yP~7_wFtHcpUl22`?BEs{qz+r4XkGd3%`Df=<+*n;yFt_X_=oS z7f--e{5m|Q)YOC(-;aL!q;kK=VeiR@BLbf9vrUU{7k>5lBc5~PM%|lt-#;JO(RST6 z_w?tMs)^el&!)e4x3yO{sbv4smdAVC-1yb4rqw6@Sh_9Xn$hQt&pO&=_G!NDUC{sh zwy%D?$)2i`7Pq(u8ezXTuG6}0J5rRjQusV>UQZE{ivYlBkW9p-11u~OoO&93mVD%u z)u?x`Z)mL+2|5~9=D%F_XWPa73QGDFSTTP_ce}L8`u^%j$7Gq=#>3v%3f!e4&t1E= zXn5qTytkLtp5ae^S_i*R_|jH#8jg6A)#pB7X5NDJ_33*(cB&RlMijr^27!zb)YS7dkn4Wp!8e^q++@LVvDUpF36^S9II) zZtFeRbo2%%EV~!<^l5dbP34rndrcxu+piy6bAEcyi(=pFT^7+3N*3$&wB1}F%4huj z-r)%aCr%i-w%+-{;F{?5@QapBlJok@E~k2Dovvv8_0fIoDBt1lqf`B6z6h?1+naa# z^Oaq}qrS_Gt~^Wiy(8{AG$0;=lXToi_mq5CmZ!FW;m)AW6QP9?Gt=9p9| zsAcfx8B&K`#vZRPXM%^)lvC?A11j(+`lop2dlN zpGb;mtypQ1D1-Q^w+1I?^S|5aNkf^!mo|MqHK>pI-`V=qAV#}{Vlqw*jjCPV#qiS? zxir-|ULJAvN$SkczY^Q`ZF$=7<%%(mAHVxH?0BNF`_V?GadPEY)x>vaGtX9DTfW(n zUos*n>-6BCYkM}ek8+gWPt}x?+LK?BpuiiqcgXno_wQC0)W76%l)k<;Q~TgyUia9+&lQfCo2#N>`||sneWJHXlO__ zgN^Q)3I#tV2Lx$LJSYra8X=jtZ&h@Q|B@{y3}vgW{+#aqfPH6LQ^ zgwRg3p370*8dqn1-S_5h2pO~?Z)-~S$Af!(9jVTcZ^;P>e}=_8~HMaMnBZR>q7ObHjhNU)#QKf%obqpWb+8 z)>Na-3OKOrmV25@^*ZIZ&j%`{?lv5rdf>~bSbkZvi*<m1`B<@%82QI(ha|rzw7ChO(N%)6`B;^UX-7(rReNQ>9*11jmt-bW@J=de_c}c zqDcJB(JTB2OH)RFFNqlYZ#rXj;bpEjz8Ol4_7)?hukZW)R;QVW2}rjVH?*Yr^fF#^ z$$Zn6$(Gj^KyZq>n33TO#vi(xDv)NF)v3`9I|rA{(-69(x2?v?!a_xJL7|z|WA9ye zS2qkDa%`!vV}>uq8JHp+naU&j#@|I&JNyNDad3$y;TVDL7XTwuHim|AI~CY)JSW-a zu~REYjqlUjbdl0>Cd`uWY07dgbb2x>D#&k~RM`<3Z2Cg8fA{I)x+{)uZh{zm+PqSt zYW~ccepy7-sH{Xd=)p}l4Auu1_Xu7*BCx})ES67@qdjA!8jDGJQ4VPND$eZfmE6(( zVX%IREMu!`X+n4s(#+r_iB62o!0v$ zI;|^v>!&juJ4S34_zc#D8YaZOEz~*mL1*~ouV{i1R6bPJ}96S7T-&7&t^wHjKOun3zDU4&&KYJxR)^%^cdn^UN1fsTQI zooAE{d%Uzq8_!vs|5xZl!vMh%VHXA+Dj@Q$y)m)rjmoQ$glMEQvs=UJQ$`MO@=tRs zE4@GKenz6wz1I0NG9FiOG3+-d)#yP6;)a_CO$Ym4NhV)^8K^%xtkk9& zus5x#H)q@DDYx!C<6;!-={WV}^-B(eV-G_AY}~c57r_4<@3i+1dYFptG9J!fFj8 zr_RZ$_IG)^6jhIZ2;c}_cBQI0`<-L=z?>H!MGyEoJl*YN?K~xdD|E$nt!am13iA|V zYH7Gm-cV$Lh(<*Ss5^R|ROk~4-9(cktF1^ad3PzhAytXZ&Q=c-JVm(2O#P$bV9aj$ zcgf=-BN@}CCD^>qu)H)T5%*d!tH8B5L&01)>FuxDZjTG{OczZ!&G7Bsy&KKz?N5T2 zjxd}r7$kM06VcfI=Kb^U4>-j@?vpMuOmED2C6Pz~EM!`(=00!8Yq8-30#xhdpOM{#w86W}rz-#DB?s zoQw^d?0Wsa2dcgJ=)Gi@f5luY#n8q3|0~;_eWPmo$Ahx+Mt;MOoBPU+^nF*c5qI|r z^u(&k8t>P|N2Z}rfjx^7G^BEPrLk&aReJm8S8JSroJdFKgJbz6-PKC=Mn5}wdtTjf zzJ5K(xabn7$+?*t6RSC9r!Gi}v7LE&eRc$9Hl3I|K`68E_QAdgasfgMPKlfLuDy|f z5Fxl`k}}_x0Q?sf?Kq17_|Jp+T8fdrR}$YGc!ko;mnJs2mm$!{Qj{-%7~t!Z73y&x z^gP99oiz&5#z_oSg()y8^r*?Sh*OCx7kc0~u-DxC)-vaz4B205yFY#AVH7D=iJN5E z8bm9&Y}30lUsqR`Yw_Y6++Q*jsvkWLw=#jv;kTb({S7s>-49UA(^*0f9!M}8r6&qsivB{Jjm%fic!#uabnw$H0u{GePZ zweMU^L;jB-@AUGppC09Vo?f*}FLkZ-o#*WQjKSEn>74!JvE&jy#?*uBM(X!=d%Rc^ zV|2pgd-X@%s;xgR7@=;~U3KBEKT2X%8}Z!d{pe1@Ux5(}<*AUQ=Lu<4$kUX4v;;I6Gq;5{=s z(rHQi*EE2X0nK4E*5Cw!cSIhgMAw8AWBIA+RWBFC&?~x|i+)f@NDL~8<=`a)#AKz} zZXlf)XfYZ9i5tgu_Q)LH5~40R407IJ?P+SQ=C`h1(lrw0 z+y61Oq~lK~qqQi;zCEw=Ui{k2Jxcbo{&d-1fB$h=3w%QS(~P?1#w-~P-Gz&h&`+Wj z*xF}RP5)_d^%L9=>*{Ii`jzW6RgvXUns|B(T4w+IEknrPno01fL zMJ7+7W$>5KqId0DDJK;oxR~(WDFeQ{9|Cro;ShBILRjl;2VK%C!*8#>Z8uK;B=gSK zjNou?fZd>bu14E;{M4z*z+Q|^vm$}wkxZD_yMWYLuolISp@bP3heKXvMS`<1ihRK(JR zk^intJ0~-5sqZ2u>BzI@yH?ieQcj?d11F1k;Wg$f0023?5BjW&@+PliT2}qI zBe#E~YVW7#zgDob(~ZNqyo~mn<<>><=k-KR4-N_x9L=)Jb>KITo)5L-C;hKV;`3gg z5s!rna43=S7~hAxu8YE$e~Gp=CM`Mn;dax=kNRw zGZOpute$!lWf=>@DQ1fUvQ4_#mQU{=89O=2!H?(^iiH$ZF0|7JT_eU^s@fp?#2tg1 zBEvs`+ijA8i|Pgkab0VTs=P9Ow7yNXLpmP#zQxdvyMH zcgZes%-iylXCO0Qy*5v1;kGYpK0e-*GxMSET~yp(rs&oR&ipVdW>);q=PhonRfT?T zo&C-a*XRc&Z1?pkay;;TNSbl+q7Iz0hK3xdkp;5V|Efc|wKyR>Hr7_hI|ZR&=gzYk zH|}`8KlR$87Z5ak!&%WSnC=Eo%@y*$=fbS=w!|~`bU=!)q+d5=T9>Mo!0aH zZ|)Qelq~Q)dP-6E$oW@euZ=dIeV1ka8t4KC#7n4KjJoTp^b*%|Din3F3rRJoeu;Su zqyAv{&jS%pH{^V~$T+Ab0lnjw*DExJEnD(iqH0~9-_;Np`p{g#n!RN!k`g2Iz{)Mp z7v=U)9;%e(7}z-f-ML9?Z5JLaO5Zl$`OfPUE?FL)7&rG-`_C=g=i@IjN&{E6byOFd^1bG1 zIJio3zVd`u2c=3o)3-RGIwr^{74_>8`$D-1=oM0TmrCq;UNG^aUR%hl?=!0&|5ksJU>Xwq3NNd1`=H;FBcbV)wec72VEQouwW$HjbAHx9GKyT88 zAkX(h=cip+>sfkZ-Zw|b)QV;0AkUtJ3GN}=_Mt=8*F$D3@)BG8PPw-4QfCC0f$P%fi1}x)EBX~>-uvlxc>FoMZ1X+)QZuf$I`Lq4h~dFK@GwM&ZWOax{A*U z;rSUK^*!axg<%W!@zZWhr9w}3&6QKhB0e+JQnwC$+m`hOvw>m~h60s@c>j*g>m_mF zMfU3Fn!M|iM#uK5^{G2owzT{_)AVaoBuTW8`iua+e89A4l%wG0v3h2YlJL1vzaLm6 zUIkorwTjr+!OYVtYx(Y(SeTm|?@5}Di^=@_@>$)`^T!_F-krDKY&%oO?BTNj`FSh3 zR;&nnUw5_%DIas3M?<@Ge=L@iOoYwFt*F5*x$)g=pSBE)j)*3OoC?bKocHvNqk+GTTDTZk-NeRz%;n;WeBMMu z90xWAkeX5UGz{(J)@(!SedIJJ6Y=EdS6SMa09s;b#2QB;DiunSJ(mp5Cxle#?0KYn6)H4m$^9-+7-u?`^zPXqEa=ETGX!i-&QD%V3-O zV)&I?>k<7NrkR>-YZ^!u^=Qy)6kN3J)&-s`CuPm%JFxxWi< zjqV2T9W1~-SXmhg+GHne=QiXzag)Ia#KgeCQze!iP{pDr8S22qj4-ui0BqA#)NJIS zB5~ouy)Q*UAA&>>)u9BWU=>mFrt_f>{#zYd9)|^dSlEiJzJy8|FkSkLl?z(%uL7w; zZEa!Cf#WRa`i$i5j4!)SJ!wi*+)rF@bqC@$q5yOd*}Z!^W;?*sX|sf}sfOs1MHAjW zVu-SurV1%AJPaIK=69SqxCZM%xE@U ztl9OkWcv~kmd7@&zPE)8*EI&~xO7l=)@*=*og<-kKYo~EV-ZGL7cSQMmu=b-JW0~K z*l_T!LQmL{^9*BW1E&^GPoPrh0=Zo_~C3j*o^bvg-x>)7{J*B z+ZC9xl^aIOOz`3r$q)pBYVGr@yhQV-iHirqQR%+cmnxd8F?R{-SzuE5@vt3Tlc+27vN>n}+;m&Z=vk`)CCR_ZAu9Q}VI1T^o2SP+9 zHBhmtYQqDk8#|6B9653Xs4tNzc!os@T?{2XHTb4rV&(NHZ<`0R5GVq-wXknI%L#fQ z#%jgNAiJ2`&&k%bW{}M6V5<`V-?tuR?$w+F+P}Z-_Lydnr=jyWB$An4zF*CJ@o!Jd z7q)(nme0||vPkPF^7A1W45IaRDC)GQ@TS*j?Aybs@3rt5FdtLETK z%`(#gm&NCIZw8UW$T}IvF9nS@oh&qH#?|t2ay?;!FNPv(Zso8UBlI0G8o)~cK$4tNARSdrX1zp*Rv!;mfjAU5>j*?2EBHeR8 zwnnNl>{gBxrR}(^pP(=|_XQ4u1?{&mgI71C5HkJKBM0PPNNO+p(=*HUz*bqgwK`8? zOzoPNHd>A;uN6NNW*GqLEr4urnW^pm^s}Z2kQ42H ze_yV-5EMoz2D-2pO!RLwx(M|??Ki8v*X^;CG5%K0;&7#+pv|<+itbT}EE+9V%XahbyCZq~n8&V#V##PsX)+1m&k0eH(kQI|<~x18 z(xLT_3s5mhTvk{pE*~d`h2PF{o@zbiZW)?smJ{|SVQ6-;M`BwqM%l0c-~wg?XMEYe zWE*qqE6)h4ZF0sQ2hG>|cyn-2{)igta-(a0s^*jzl`F1;S(Gq_}a zR11f~rkuHQiPw{yId+d|ZRl`R*7AB*@?LgYd_;X1yhLGkO=gDx0f0Z}Oo|H5Oqz|A zpNgtXlR$PRvsHyV0Q4xgj*i?$NZ1Z@FKj}n#!WFE*R*Rcb+z+RHctu%g5|P{q|nR`sZ!m&UAPjnN|DiUYtO{&1V8JJ?Ez1o}oSC z_SyZ>8n}oFz(YGga)p0uVUM!QK;HGVU7UQ6b)0#2=bY1)%*HqQDCK-?+wcDDR&)KC z?~WwYt$rj&M6^zfwobyc3Qs-=4On5W{EMs40h|x=m)f^ZBlh4;QyPRELrmPPv5C9Ux-QCQOYrRMD}DP| zd#?BKC>`Wg?E zr^-+T0>w@H}&!jfS?E5gVG0^aOQj_`8Z7BoM--_e^i#fkB@KK;%pi}wPTz^Ab zv&*Hp&7{>Pi5SID9B{9GHUH9pLigy#JRX;|0s(4qjLzeFNQZPcqFn9vg)@PQu%>*J&i7e`c7F_)m%#Xv!1GJr3E;lYptCcX+2&1}3 zqrM7u1wmLKDT_sRH*Vbc3os=n!PShR{EbZqa+yx%2Opc~LBYG+OH}@1gH?O1%6sos z6MLR8UdxZ@>+pD;<~Yye-<-2*-FEH0Z={90jW|;tj1;>#Djz6(qHocRDs$CV1h~VL zYvCz@=u_0AY#U|1?zi85pMj)R&JuGkPOsuSJrF)EkFP?@L8iTS(Y-IVKcc&1+!a9rlZ)own6G2Sp%ej_bTGlJCl*~|xG|O=J?=vJiUl;C_8aBo%g09r zi-9lWNQFi?E(VQNfS;eA7Uld!ZxR)N-oUdHz89J={MNCjfw*Xa7(S)hq+1a8M!J$| z_RDHMkAO&MlYmJ0WbRNiF0bC2&Gw25d>(&H50&k6aVqzW7WVIsDKo6C`&w-L%M|k| zO${oA$!;91^3;umyYO_o740Oh_kQx!&u(h3eYheoRCpFwO?{Djb6vM^T%FOQ8NqLd zi&Z>CCAXc@xTZBzCVy?=uC=Q6x28H*M^plS)$rEb%-dMNU_j2Bf+uyn>CBC**Mq=J|M!wr!LPsMSNiY+8_&B$ zwm1^=xB4R$sa<(+Uh{{2hrOnNv~ZKB&Nhjei~>s3NhV?Doa(g2W8E)GR`8cQ zH~$EgYV+L1filewQ^orLhI3(fi7;UiqH5Z5XE=WQJ4q22-CZ6!+d6x54c?r0zq&dS zKq@-j=H_*W;@^I|ZQ-F)RAlx@BhGkERLdhcPeegRPNeXS z^e-;Ab$rXCnxtPPY6i$et6rT)7YR*Y__xk&tOdC5FFLTmNb~MHKE{BO$Vo8uyib3KvmknoZRKo0ozjQVP zdvJw!Ju1b{d6Ff#?na6+9pvFJ9S~~CV;0X)9cmLV>Md9|W|hF}>&RL+mbpM@n{Gyv zp}xkF$7yQiImz`>e;&9OC%9#ZrL>os_Dbp-tW%0g`slh+YoU(%91k6JVs0EBl8mrg zUmtMVN~HX-he5RDy~R2fc3V6-5=4tn(Hn<;OcZIgz^}|M~ zXulv zOO&kF(8U?1+psHy0(eq!AYd-s`GkoU;oohO0|G*de&g!-cApLtM9#F;CdM&L96fs3 zcdSYsx_TH5p&pth9Z;8)+P-gh7UuHF3aU;{bpoD~k9{Lrwbs#?O zNBaipNKCT6kZuraNGAyKpJUrE3h1xUM;O(;*nIW)1qU4cDqI!{hZDHD@549+{+46& zUF$@FLxx6}+REBy*>K}7K;TL~Iva272_bzFri#k}%TZ^fsZGckf{ffz~Qb+R#JP*~a?h-tnPtS9?P}F0U;N0t5 zO4PK8r4Yx$$_Hm`U!=2&G8vVVrX8j}1|Z#H_h%T6A52?BH6=4D-wmR|C0`MucH*Ts zLV|$>c3ZquS$vh)5kTAFD34&w$-DCG!u$B}TNa8r!3+_#Qs}1m+NT>VPh>eB}K|29Q$v!3k&YcvgvZr20hSI5hhR>&aS;nl=W5TY!b zHP<#S`UG0F;7lFbqSODi!-)OGdX`>8f9^NjKN0SH+(q_k+Eb!x%|Z7E;gU3Dw8#tp z6^1`2dNwGgLa0Fo%Vc7R_nHP#A@tT*ZFQ+<2UE->PGv2vm6g&xEQ(x98!zDATJbG1 zSmiDXEm$?Ow}aqg58NNGNi-dv>26%DL8uDCMJSvxG@qNab zGeMu%c+1_H`h!{Hv>Rb80Qlsy!4f65(_iqz2D~bQJJqVkduw;B=s01icp@Vs19fNm zBPP^?YrGyL;cH{HS_Ol%#MMfvFaWLPDWG>yIrBr4x788K~TM~1&WCfa4) z;H7e=t;hd<`f)Y)9BhO<*6e9%E8YGbQ{u`ZCW<%7A>RjF4-W~+sVJ>xKN%ud<6V@54q#HGY>so2=gB`|tI2!Qt<40{Oas;vw2KQ7G>Blh4ci{WQ4b1>pRk3C!r~=7 zKNOnsOPAVtEoAYPVSQ<&JN^RsnELB{|Z;ZHg8oup2IG z4w@vu%gzyQpWO#U=E10-PCQQX#tWPxP3ISe+^gtecLhvyFhKoE)&0#khxz4A z!b@S5XIzaQVl5tfIb6jM69f@@G8yBS_dVt34^QVnXVz#P-i%aDRhq=dJkfHXFhzdTiC?d6l$ z$w6TPVb};uSJ0lTYl{n6XT5+;5B_ll@|4N=`5ClFqXw6|sh|^Uhgt(q6sL8Ahv$Kg z&A9l-Y_d**Xor2fRMc2!(dHb?iTEIW`@gT{Nv5?tg5)^wHfRPpGvfi*VeIL3g>*cH#+oyp_@PjS)+`_(38lM z9PWwaK|>h}$qAQ}4;oBbYX^-JIW%XNjA~Qaf&Q1ujtOw28~*;vjfeo4=mnuZ0Yy2C zf+}qzD@WN)#v=4}rv5!;atRL_3wEwy6HA@EghfPX$r|l%0-xX?L~?%MgU^`&b`+?Z z3kn)ztDBp;7H^aU>cHoC(S-FO6NM3X&9(!up%W2JA(e+;6V*`KG{AgzS&Y_e(B52d zTawm08t!VjehL@5Ghxfo{jmmHakyUmnm-Hm3h`()_B@}DZ%IG((c=@j#92yL{vN8UokrkF z-!~7g0QY?|O#XvWZxO!2{=#c_&{hU4TEQF{BDko=7cePw@b2KIw~j&|g~>GO5Q`q@ z^Q-W!VSOHmzs^FKM)6+Kvwn_n`G0uvi$fT~;w-II8&7!bkmWsFNeRN<@|Q13 zm6%Fz9M~Ai&tXfE&rTL%PyVLht8lP`Un;(#<6WyEVBkGtrLAEV>98G6pz}*cEaC-MZg=-5qup7 zFVQp&m{&oGOc(VZPB9xb;CQT)WBl$cN5`A*tRdtN2$R%iJuTU@^lt)4Q`rut3?Z^) zwT!_AFnpJVw7CLl0jtv{s1RNd1`x4U=ml0WN=M3J~$_$fQV zkD2Zi{VMWPjlg+T!0xSMhN)yRh-}J|`RpG8}BeV`-HG85!Z=i%Eyo9m5<2Dcv2J%r@IW8lIzY{d;@LI=JpREE{vM zqsRyA!D#sc#H&nGB&Zg^U+z$CBb$aI)ftbga#h68?0xc?M24|s)1?7z|EkrPwcvyp z{UyF9IJ<6sl~0#Esvo93LTqlljHXKAu4iSa;rwHitemjZjeW}#i!lZ#2^mZS0fU&` zLWE)AOn^C}NVPjc=cCk2e=J)fiat%UaL~wP4nYY_Pvk$%O%O_#VUOlXOiWUs_C*td zOarKq=J<#oNU7=+qJ+kQN?ROQm@%*YS$hjBNnrV=@8CPMc05XrCKvySIQ?t1i!plp zfu?hd;_`5t=mi#8u`G+YOQ$4{G;I`$=F8o+Fx9Y7*}`eIiS^ne9|ccgi*%=)hEqmj z^rjMhwQ0PGt*_rl-@S0!bXN48KHrk;H{E~k7q$FYX`2Zucv_s`f1$tI4k9F4CK{&t z!^8?Gs$vGxCn>lP1t+0QVi!Do*U+w!XdYRz(`AXu6YQ`FAwz@OT3%X`2ao}U2a1>b zWQ~M(4_gCnh=O6W%fwC}gusAiQWxQnwxfTi4QfmOiw(96wMZ|+wW77yXA%>M>U^kz z?TywOV5wLRczzN&rfXd(bQn0q=pUhH zI-}(-mystVX@+WYe`f`+j_+?#tjfLRH+GMLH^ZN-etz_|Rio%6;LT^;#B#6@fl=+RJ2TZ5`U+enGLuQ1#D`>!(D92%hginKIqJ~`-7q*DI|2^e z@jQqA9Qs_9SZoI&I|haUp5<4-0Qb>9`$H%ui8-n<&Mk$yf8T(`3=u}P&w+lJX(~j! zx^KZ>4n3XHIM>2D^~dlp&tdc>Cg*%I*^9UE6_iC`71?bd7e)1X=DKT??7<~aAVA1E zwIAZOG<1m&VJ9Hgm_UplM1DYkxFqy^wCGbKI--_WT!r6&Rs*(AJXq{NC>O1$N87?m z6B5&ggG@C}9=t4$L9Il_=Ln9Iq@{hE{3`T>g!9LAT-Ni_-Bnc5!2d#;lgn+zHbITJq>VHtGxX2Ru1Ua1A@C zAA!j_fg3*}Gi%6m4+eny2Yal6SIt5+8a^V~z2etEH*8?T5L!Cn7D92H$oX)iL(b%j z14+LFrPzJ{egk5pNSNFNe+`N^F_d|K zTdYho7?j}mK&*brIwIpwyMz*(uAr7~Q;TnOXsfgH33#%}K}CyD1OftXL#gM%gQj?$ zY!b0`aJUIn2RQPmkBsonXlQcOKk1D*hASv3$)$s?3DB)dyeZsn6z zk6VW7)Yw#xC8vlDi%43ugZH9M^O<12=@$y|OfN2>WskoH=U`T-gl-pb1;#iNv4GYD zIp*&)RYe%2MeE|j|ABBKIfOl>I4+55aTb+=s#Cks_nyxI2b}6pz=u=EzXg#O(7Iv0 z-A@eVCh$N^^7p;gZoP9*5Fzoe znNDVn_SJpW|F{5nJ4m97UiN#DF<5Yo7yL>bl>L=w0S=|*N^o?-biJaNU<|(%2eWAu&Eo zF^O7+jHE$CxM#cA-v&-+w1t>l*TKA^DC>62?;EC7a>baN2taFj0#zbveR&1>3tvh$RphY$Xu1eKB?W~C~4zNcUq9%pfFEo)vFo&nPs$m(xq>h}2nVuUYNJ7u(kERdN)m#rprnI)gX8G%FA1&vGHjyXl&IyeZ@F{r zeOYjy5Giyd^vDqtgr&nmfl~9+5^{_Ta$scy@9u^>2i zcl1?oMsp%OP>$iZ|2(k71UM*kvoP%^|Iu|AgL`-eybrLSKTpXtN^){O$B#O@}-gTbB& zj$j(w;?m|&^@6?jWO4<5D`FLYoW*SI>DI@ZZ@O*40t`otnSr~&+JR|nhPTX*fN^5n z@MCbw-@p_NS0$_yK#*gaYGe}g3QrcSB~Wqj8JJ9CELfy{^(SKm?RMapYi?$5t`2!) zL%0+svEjf!@$7`@Lf2f}xo|qod7%<9K_;W7Js9?V_|RJ^J-}K972zy)9c_FP9X=UW zQFf-Mg=pN4{a(qaF}PpCNu1sW*_lw8-Zj-)783$FAM6?2@#JC%KHUF&gI#a#E@g;* z=nbOrFwR1}g8_R&AlC()gt7JMK`$Izt8qp}B7Zb%S2EV5Bf*wT?P$6Z1z zPrwS&9X!reC?m+xumojQMwN&dCp#uaIjp_9L1+;u9#6ZCfIR_ZAbRTG=1FWR+K8N- z90QcL;Rh^Vza?TGJ#|r)I14WU7UzT3Rw)SFFb<{F1?)cOeO{WS0rW%<;8 zF53kN5~*y*s~hv6J_|tVpz_7U!Zg+orBgKk1KJ5i)^(GoFU0;kb#+VTpg3x%5EK%! z@G6OIf2aPxoe`B79gu~6lft}aNX^n`5tH>)Z3>)pXvboPCJ7y z+8n(a%NPIuRkwn*lILp)4x*yv8AhCiYsE$8rE6|&_h?TYaU~&KqL;#b1_d}>8r=MG zlQ8Dt(h{=5jd}wYUqtbVKx$ZNJ?pm@Lna~0bV3Su#^+*)q<{FyJih@zcG+= z6ZK$Th7=E+nlAul?|l%9@Yfby(D%c53BS^u%&cfd4I3IVj8#VnGD}|U35^&n^7cP4 zojfHQ(^pKRR83nsOlSEjXsR?W%LlIvHz*e=mofqDN=_yxZ;5~P8$ttcrS^MzF7U9B zYx<7uRH=pmeAtjufFoe*Pi$8t9NNH)v@wWXXMc|%57yD)Xop0wmS7+V|1z*<=wh;` z8fYN%nDK&3$5V&hh7H(b5Oo2bi7-bsN?pAb7M8=F^YH}yA>2&C$_}zZL;YNr4`c-L zHuaH_m4GrpPsP`n2&P0e@udJHJHd5HdDD%n?FG!=vQcL6N|ynS&xKN-kQZ73k5xc} zdr=P&S(5RR^$ZOA3F)&nb!S_|mLf2Iq3(#ZoH_=M7XYk9)d}q>uKTrP{_$4}_pzk8)% z3vD}`KWLUA}AbL%92>v$z!%G?Or7FGp1gU-=54 zZ#2)Pgo!^yOPaB^`u7ch_!V$aoN#Hj<~$m_0dNRFf7gZoP|)Vc2ekwjx0FOjqH<5< z@68~Dn}^OnJ9Z3qLe@c7fMz%N%j^(9`4THC@P;Ox8_$j|1O>J-m)xdyOu+#K79_o@ulQDk9Aey{cK#)0Z zBb+D>D18_s9*U|6KT5c+Vq`0?Y?r5?L!Mv=cFuGif(5X*jbq8aRs$y|R*!PuTUgB! zevSEOC`wa`DfqFy2zWtM-9ZZJPT0eT?fz_;ke=>(DT|wVan`$c?+9Rkp)SBMsONDc z8>KNR1CWmpg915R`FX68sC2}cRU8w(dJlF%vVH^5*8nzQU=w5`V~0G1d>U8%qpaWH3lPhP($6eJI-UP3*v( zM&%X=ppEe0paZ1<=N1eliX4)R;dcy#9Nfg=JECH|m?a*E9bK%2>y1|!worh;c9?}u znsQAyXeBJLUN(>#5Nz2>NFOFjsAiCy20!AQIMQ_@@%uNqWB10Yr2K_=fP!8FvAf!RAOBfC>xCY1eJ~HaN%x&Q4yncy9DF zsk1If`)?PBTcCNDHhv+v0cBs0I1xr5_seR8_H1 zo!|ikT?w=nM4keDgBI>$wQBBN8gSNGmr8g;>5M zY!Gv-J*~H_>B%n#oJi9P*tnepUxGpikCU1<1Hn|x0gExvjfqHiUBmc%E6xCgP+BsG z(?&l#GGdnD0F2xk{yLf7MSe~W>V}%qy7+ngetv!+mU7UNVk*i2cFJig38Oa zT--31)h{)L7w%$wsK3dv^QP-TYt6|i)~=pgriV!Se|obeR_5FAr2K*{>Hf^$FZV9p z1Sd%>(V5i#%;hI2k1VueJ#aL@TBC5xhTrYn!VFjms1cw07yAuMwiy4V6NiDN3xbLky&J0a@-*CpY z|G&`|36+<0IMIHWfs}-Ia>BOmg(-8e4qZP@xDYJD0O0bBV|OUu}O?N zKAREj7ttQ8jw4M%9A@U`_klPBSn55E`=6A&aU(cdFfskcwVKH@i1 za64MAOCy&A0qWsmkT)J~b2~<}K=cKGaz~xL41Ho5CPe*(YpkSn^F+kOpGY-JzkYdA zfZIr>`bkQy`6lNl55lvXCCr{QM-BEh9rf+{Q&4E^6qv*xWjl2x=J$wj)u?LWaRSD* z5mT`fd_Lkek*h3HwiP0frp)MM@|6&%LU@KP_$_QN$Fy8cd)0*zJRYsXgUYLt^&avn zQFz90z^{VL#PEM_8cH{YzhSEK{%MBtDmyTWKS6_b3}?u=m0&SCn@{ebm`S4^8o9#Q zbk50z{wBNzsUuct6<3^6g=*?#w-;h*FRsTWr63Yv@R1U`oCE3Uou zNSTqj`mssK;ldedC7wo%6Bu^7_YO?9|M^4Z(Ux1s`Ntfv=P4%FDRG&@`4s{EZG2u$ zlKC5qn#K+;xLPF4IGYsO`a~d|`FdmYjjD@&d;34^4&mOgVc}l%^i|uFeFGs{Ciig$ zYUBU}#59nVQHo`v+IQJH-gVt4w^j81hLD#Xn=|XurAuYtNgxLq{cpL*T8Pxe0O004 z==_bPfG2#(YW-1*l`DZh)DSVB)M(FNy`uf+AjHM98GnbTK}Ck*F%_?pl_n~4ThmG< z#k>*^QttDC%^W>LPGQ$8{@z_}`1Q8Df%g44XXV`P*8z1pZMF_b$BG zbMJ=Po!2U#TUevo!3$7Id0|m2wq>v)2+Qs;@9qYMM%nuC>%}8G|XJDOT{q?sd zP8W-}y|^cJxxi^XUy3>Nu${)0mMu;pgPKm4oLJWlDg?8dK6(W_k8R-#yj^G#VyT}b zY(6vWLEk!CwM{n$H|a*?ML+l$J9@-YI8R;0VnM9XyaiVmN$!(BL6$CO7w$ZcTA4&5 zRNxsvVH|*&5Q?S-&;kJV)J*#OC;*v&k0~rIZ{={;`xrOBcqUF>oIYtUxqg{Pm6Ey%Ot zOF5MIeQ0;(Y5NCyzYsP=gUvNXg~K?6uM}ioD`@ldaFUI8 zzh=H_le0tT+Nh=FkAwI9*>f+1y& z>Hlg?gB|1(9>D*3?%U`8ka(0G3|DaY3(PEysdXXVA&rDY>La=~sY=~sM zztqA&kW_PoLt}7IUUq!eBL$q}xtLIhsn{B@HO93{lT*waS7|&|*r`;zGdeQMHp(?M zQbZujzfqZ^B4g!>rz67_jF8zfa}w8ytE7&c4PcfxC_8N0Egacf*uK$-J5cdk%h`mN zZ7YP%b?ALtzZ=47nR&cN2WJuqiv;t)_|cl!Q_>X1T!{2>c(>zo>)>!pmGQD}ALOAs z;1oR`xtdWz5N?Y3TZW$*F;4-8lP%)~JzqXBG-az>R#L+z*OY!_i&d8GyS&*#z2|II zDp4BH=mBgti1cBfy9!RV*tBKKs2k)n7~x!P%vJZ%zf&{iE>ET$$52y&Q}gb0K9=EZ z=fru}e6Aej$o#@pch0|4I7Oi4g8YXKjNv<-udKPwdK(N)UH!)5h(kGJ?Sz!06Lxfd zt=hfZHf3kzulF0WMwYfz?C|>{mb&x3ztn1d^K&ZpgQOb>#tvz)V5ysv9{?haP=fvK z6OsBUPStq-;->mj3jiG(l+GhwDH`@Ftw26trMWEU$P_6Msaoj1GbYh%TK(Y>-MOnI z(pVpc=4`9oS(%dIZ^31Dl@YQ?W)8R63Xb_h(Yce(7VHe{_t(}lin0q`(jtC+k?l#B z;UBW6I2$TDpPgiS8f=^%8QXkaJ=*EG;dCp+V=@~eGB)P;6l24&QF`G>aS7(l)TVNd zZyn)zkIov63T7o{>6aFHA404Gn=gPZ85vJelZ))9gfQjy{0}0$V#%*aTvd07&qD!v zI{y6HL5l@`A2LVlyPAC5(Dxq4qNX0@262Dk0+Clw9t8T|*q?c*aI#RhoU@}ccY_Z1 z*9og-uZ3^miHvU)4}8L3Y#gq*cGE?h>U%0PEEEzStW%vXT>P%EH~2%#gWzWWi&wv| zKhwOudywRMKvqQIEgcRHA1_rRD4A&&9NwZ?WZ5sJ>GT@spf7De(Dj}WpC zwCOG%TNWI}3m#sAQBvh^&y1>}-DL z>-IdK@Bi=kJjd~=9QXZxzs7Z)*Lhvnc|qP?TuLfI?dw0%EHR!;iQUx0yCO0A93SU0 zL3ZZCl*Y=N{k+W%Dt7u;{v<`qwI~aA?^p2d-;N{BmrhBZZ7zNJXS&mG>gK4zHNAm5 z%<9D-hG(a(Wal?}A2};M?|{L)IG0pGB8K&BO^AWfnNJJmZOp{AK4<>@3`epx8LwczvMG52twu*c56g~Ewq{j%?HV$2(|J^|* z+(Ez4wN6xMvG+{=ZXpbn<&Jv%cq=KPLjebM3_=L0g_pxwB(m3C?CQbviE)N3Ok%e# z>nwC$Q9o*8CQc`IEB*G(j28Zsk8^65T6Ng(~1ir{WaZ^|)P$wGZwlg|4mUaa1*{%Z|mTl44^)bpW!@)Vjw z_F`DwEfl@Qp*|itwp#?9{EJVY0KSSm8tp`ZQ3eW+NOPgCuI_)UEQD2t_R7xRQ~9IY z|4pttI5xj~}Rk#*25w@w!HanekSDdLmL}5;V5}tz3N!h{OwyOsx8o9 z6G%hSr?`JjIaXV5Zx$v*`Xh=1ReL1S98X_@f&h}u#JjDkLNTp~>!=x#dO}49bLchV zr*4k^1Xh9V-yk`yeuK(@*FAfzj;f8oJ~Vh929YB|Iz9}tP7o?9?h0Xr^uF@*BQ8_m3kj zvFi74i`a8_Cc$yr4z-y+jTadHHS$t9;9^tBCZ@k@D3rzdFzLxX$y8f3l81TpykDucla@)KtN-g`+g$j#KPW zhXOu2z5WyJwc2tZXu8?O&}_oM$@bDM0Ud#-UW=1HFK^BZOV7`GdgS*Xx}oZ6bfZ*d z6})MGxp$W2wmrg<>nLI|Zp#x*Yl|A`2ZdSQXa5`t?giPP(q818mTW%f*?Pb~%&vWs z>)`vOx^$uXw&Zgg>eIA#w)E~fAZ!%><88&ZIgepM_ptoJ3D40V{&Uhlg-_neds!ZH zY@%|d6jS3$%@^$d)dGaB-mf_LR&!#ftigu+q3a|0^e~MCL3ttyuAW}N$$x__9zp5C z6Wm=AN8BQG9jrJ5L!jTo)xV2cV&7N$VC@6N zXC2%}pK77#kBIV+hA(q-63rex`i%iYz+v9DKj&mDuAJ4LuM(d$j{ZqR` zr}N!6U`xCQvZ7&puYUe~YIuBR#a9cj>o&YXpR}JVsOXe@^kC~RZfCr(n78_ooSb`o zJR52~1AcPl$EeN=+jX|@eqqxqBK%dX*AG`DCHUY_9 zlaYmf@mx)vQ@6H}-`shuM(%Ng%09er%zXLYON`>aL%ZhbXV0%$9kjDJT`n+A!=lEn zXV2icD!N_!^1-^Yi8C)_{iO;iIpFl)QDH+CqeYS^9xrO zXfJeh#4g5`@$RXcJdzgN5#Crs$fnp>j#T6A5#8E_%@{emP*Oa0dibxv~ zoaRfWY9sq54@O%Z5C^Oy{bTWmkS>Ap53$E+2L3QlLoDu5?g*sl9z9|snjwPM{y(|Y z)3Y^E#Ecn`Mg~GSVh|SL0fm1F z=6=0g?>u2)+;l&xZ}Q`;@t*S^r&+N6O|Lwe42zWIPnE~seC4qA#^Qol-FOmHbe8wn zfymFXb$r}Bg-6L}h^B7-S$*nS|JOFTbYYna$J4itUd`bWljG_Y0u`awu2;k9k3`vi z6VtBF+F}^K+-2VG9H(;U%Q>!>ArahLV|_HwzJZbzT+!?$cL2Fz=0gmeZf1#zKT4137)!(mrHLhqgOoY(5!Hk{iTYa zcN)(WS5!Yf#B^^<|Kbm;X%CLuQCX9B#8!EaZaHhX`M%kqFEwZDYbZL}KM(GT5qU1g zm3{F#*Jc&j^z<`<4IUq|q}?uX^O@j0kjJkwiNSWQD;8Bq&y1y@W~kqt>mo@&=auWX>fv!k{7<$WTFr zK1ZiFv$3r@b!y%yTS`Ve5-n06#*v*tJ%cUt4!1Li=}9LtDPIFcPK6)mGC^7+n{r%c zXwf`~a?bb9W0&^mK$hL-S0!mL%Qm?7@OaJelbT~8d>X4a6b*(Anyy?sx9sD&d!z2F zleEJJ95^-v7n}0#+SSF|zK2gMeq)52Q?-2y+)PQ5-tq7G9DXGnH)tqdCOO}@ywgSW zb2@K}57(yW*A{;k$LRK2ne_Zj^LldrUL~JV+ZL2ObcX4)&``X%#P7Uo+Zv;7A$)hV zqjN)Q`wKdU-o@)r%7qFtqQC#)lA77NargOKVwNtzuMX2@?F)5NsY;K>6)X?fwEDHj zdpwk!=f%al9B=iqD)EcC?T>DG!Ba&mcI#S~b?)q?>0WgDd@DfhNXcKhhlgy$8s>|( z;t|g^OXv2^!;}mDZS%(Wzi^)aGhQAk?z;X?;en3Hdskk5+!3`>y^`kMdIqijld?`V z!{wshSMwWw{grY&u@=bNWUOJnuLZ@jB@OYCLBU!t#5&H#m)oon_m=*2rnb0dFoMor zI?O0{D7~(!W0Lousrg&;UeO=x>_#&e&}Yjov)2q=~!i23Q9Q$eW@IYHVJ4sT?MuL=KcF)gm*Z+#EpGH z)7rty!xYr89+UZtNQcyiLGKA=Yt%CKxLn?_DwX*EDqxgcdb~(NOoefipm$!L#QExn z+ex^ik&g@wj6Io__N9hNC-9=t#_GxYOq>f`A&M-`+1ce^Q`W2Vg(RAuI#k|=H0GwM z_esHq4!)=JqtZ={3Z3at0+DT@>!Te$U%uV4F`0ovzvi`{%%Y^ zn}c52o1*Po#4_d6ZBC1Nmd1_GcRR~akWpf~cDhLR(xrn9HXly=e|s^ac9*q*k@Diw z^rpLUE6qA}1P$95)kb@v=B*yM@P3|C@I!@j&?WsmADr)iFJ7+ZVh z^HaMsm)-7`6cwv>(cWk?9~)Vx9F^~DS#|0Qh53QPCVy0#B-)ZzM~uB1L3v`F7VrFm zr_xbB%-zJsn(asa@&*b|Pn@`^5pbpZ!+O%vEi*s90jY(%ZkGTQ(b;~$KJWC@SC*wh zBM;)-n?X5}k0XstRO%Vg6+MMW?vVil=(}>Cj6|gRQEB7TAI6%sN=Mr~yn_>jN-reI zoL+e)PQPxZsbGZebY5~~hq#w}gE5B13vsxMxH6+Rh9Vd+nH~Db3wwO+Rj-q(4 z4X-boX)hS=<*M4|V16^wi`}CuBi1-~xbK1~^*_5Cor$`$`wm{7TJG&E*{F9&3d4b8 z-6ke&`OSBimO01yTRGijJ+xV7`c>(hBASTeKfbt|!&S+H;x5vwSFKWzXp8>ReTx>^ zU7V57@jl}KE}8O|y&2{+J{**@J?TCG?PriCL4s-J?D>fdo5dvdeV(76ayF#4`nfq- zE~6Oi_u?}0?3~g~mxKHApu60WV#v`^pRyA{16^Z<(A4OizpN7HrJwt?SB#A<)G_O! z=;wEfm*jj7kUBxE$$D3W)m(jR3+kV*x*q4r6w`6~a>9#LF-fO^dRbtPPWxXf%Ws^f zqg)!E-4N9tP;%TVywk*1T|s|3?uD~6Rr2b=rM`Ns&py4(H(OK7X7r!8{$+3 z;(>gsCd6GO*0$Sd)4e=+{Jf;DVU5wyGfzY%@5%?+)icfPE_=!>qkJy5(VOe;s?6@O zx`_CA1;y_d_amS}jW;gfoBthSSAvQU5|VEKmrLNHN}hd>I^?O)CA)R-A%;DXo^({` ze@4006OJ%yNYNH~?8zIHNc*Wt*BdWYKlSa3fO7yL#3zL$=5e^a>BBHid)ZJGQ+lA? zJ=n7|$tBL8F6PEO>lcKE8MY%sO+{lEQp@sp=#0P8;Zp=yJ$!5_{3lj(YjH!vYNVlJ$;vP(Cn-Fj(__|5Jx{)az1?_j)$@tm*xW!ACf*o~6G zo4-yE)gnbwF>O5*p-ikf{6>uZS+&tEy#dzUsQ(qNOv(0c1ux9sTD zy^7q-`xA|}daQh9S`*Dnp=c$nUVeYEv9l!B%Xa=4w?XdAwz|P+r;FF>wdH3*UKJc1 za=MiAWZ;6;3(qo6z6Z@+>2L~9j*0j1-?_{zYgNL3HvFoXaVm}o+Zy}nW!`^#HJ@pk z4n^~h^lbL;Tk&dQ>t75THl2*>`ZdwROS#|cAf4-=f5EbZ=2E*WtIVwGjc3o~ueUhJ zs2YBf+nsVi_)k<=x%|=ZWx)x;_rsI-RESv`aPcT@IzC=_oboECVC$L~)r}lGHjsR- ztfJy=goES%kc1OqaS3#MdHxxq)1fXmE>3<|Fq_k8Cu+7Juzw4CjMG6v2h{1H zbNy{qm@qsLQgZmQQA2q^c{v@r3f^;h&H1Dk%_x#goIoj*Q?H|E{*dQ~oDSvfbr~so zj457^0((5}wWl*u^fwu1ni?B}L=BRDB)pr!j~V4`m3A`IhjOfEuS|0GzB)60$cje( z0KdrY^XF?1p7Bm~ceT8%%oV;+_{W4V--u?=_Z?UOlOFp?!Aa4Iue{~6M!k|3xBZ=W z+M?vy>}wMtXs6h+8&i0b9T&tv*t*H3H^1GDbmqU)?lac<0 zMz4R=`KP^bMaSUjJoh4_8Ae))k54_VT%*BGa?KFtT0ComU1mJmw0-imci$zZ&4^%m5a}3tM3@gx&6FcjHuN5 zdjX^0j)Axn)|175HkALoFR}k^-k9;p4EwEHij8=+*e?A1Z6xZ|X&`7QLSy7L!H>M) zXqFLz_I2*YjPLK+y}uQF_SIxL$u{p8cjaf}-M z<=!^2vpyru|7-E!Tc2x-WxZ!)DjU1}f@ELsV!gDe%O}XFdf32nuK)s0H%FU*&B8xK z&d)7d&Hj0fch0uP@;t^UnSioib~0x>y#MqCR18Q&H#$hz4(#}_bI7#&;q)WxnxW=6 zo1ND^R=|g_?(?L{89I1X-@)@;>2!PSz=dXqhn7{ZKeIYpp_#M?d|??X0!JV(LY0Ul z<&GswCi;Q$E;&qeLA|W?uqoQWVvu8h2!W6{0mz-;X9jQ(QX03YQ$eUL|3}?2QJ79- zv6n{op;_Yv(j92a69h zITlx;jsLyC=|GiL4GJnk_p~(*WPJSiad>RB?}UoZ+3A{=%T`Rrcv9xFYrcwJYM z%Bi%Ao~cbu;$YqooMG|NUpcq@{rfJ&2M&cYyR~-ZnR_{%y1l;4P$e+*cw7103d^Ms zzEKtOh%ciV5`u$*7#2Tz#X9yepUnHt;Weo5e?wF)!*Vjiy_gA4w2UI|v}^2LV*2TO zs7N{bxM6y?2h8$aj={TS$3K}??DZNSnsqJW6b?D|L5Au|040SPHd16#AhkHlmZPe^xY{D8)B_GT(zjMhR zUA|P!_Q4>_oCd|jfZ*3SdC`f7zFTknG791^el{f+Y<-|HN%uMrHs4pA{)aloN5dGj z@---TmsC|%@og4>4Rwn|#uU|^Bd9_hut{LvEo(rt!gz~5@G)iE-qFMUEhXei{I|t+}zLF|8X~0+bC@92R~StF>f-ohOlu%g?iF;gLWgg znvJ@c+h>{zi{_RiUcAFoHD@>cd2z4R)(vB;<&IZhKT{Y!bc?wQ0emDXDg}6-0=9YaS$hMnghfN*-K4s(H&5|7p+E2Aui=q> zi^Txt$KKsOM+gzh^c9Y9Y}Fgu;*zAgH#cwl0~&z;Bj$#9*J;;Awtt@T5+e)JMI+yF z)yCD#vIe47lCiN&#%oR}mew~u1_NMLpJpi)B6MaM?Ti=Gt?sXuU*es#n!cv^rMo$M zKl+y9)$*ZAB09`Lg1?W40z7Iw_1TcMdvry-*U+8TD{9@-1dnNHW=$UQK<$l0^}Jp2 z^EMxj*Z#7x>N~`Ad;kmImS6B(fam3TX(2K(7KPC-XzlLAC_~g1E$PDT5Rjcp;vjTx zGWeD!xV}i7fAZ+ceG0zb?#EFgHG`3EqD>?f1!~|0h}}z8s6~f^#?PU#;bCu>OUO4; ztKwJ=qmLs|J$4y82gk%~)0bPk-!jLaUM+t4m)FCCPOB)OKUY2}pZ7+#l?~zck?G6Q!yp;$DAxzxi)pm;&3#gX_3*9Zq=NHJ$w_KGlf2>w|KUD-R9# z=mmdCD3)sW*o)Di%y%{`pJ@O4;ma8CG3Uap+9_5xX$v9eLFvB@<$urgUr$?L6n$sK zU(~m64ddoTf6=bZ9l@$QzvO9Io@QviZr_tiL*Z3B^Ooy%0H!Jk8U#Fic%f<2<#h=) zz8GV;if{alpcwWcn=-6dhj^1BP8U8m9D*hP%Uy*8^?8t*KoJU0Ap zR;BpO_vzv{rZXbg-5rgyFHMY%{a3aBefOc$=v@B%wOtb;mrkffNL*RH36x~lH+rorDrh_fLPU%XXFQH5yleaFYpZ`as zCtz{Y&+KCfCqbF=RYn}T)sMt}?Xe$S0QY@szq zGwI9gc1IHU!r4@fkYiV~;J}83SxKR9@}&0~lnL$~%eDA=oBp-^Ru0L4BU<`g^nrha{s zL#3l*=aQ%9!a1Xgk8)Q6Z4$VFUY1zYUc_~6q@NoDcJah)UIx-`ik#@07cMJe3RanG z(rlcYkbDBCjKN~d5$0>OKmP}d|H*FF*O&V=V;CW+5)HEBGy*udqJ4)4>>++f13JSs z!E~UkHSxy%6Wrg2Sn3lEC2|*^vGed0R*x=z9e>KQ_TvDp$bnDW#VVR7R$6R~pNQXvgWhLjKTqG~Ia(RreC*pOa_6zM$JASO! zc;i%Z!mEl@7P|qt8>41sg(YJhhpCqgLjK1;fBri9}z9iV) z^h{}BsA)$1weDA!e3>T^m3!0Gl&h8WE53hU?X4eGso?6t0ab9nfad*GPOl62M0&O* zIW_M;veWavktVx{&GJNR+VG7VLzkHVXJra-E|Ue_>)?Lcx_7Q6qRPgB-QzXVecQ_l z*EwB~sjhySsF!5nY#zE=#pa62T?cg@!M>sljx-6?r|7MPB^2aj z{&Gt6W7RfL-Wst#QO<$B{vDW&Iy4I;B^?wTOuA&iu#<(kdG|PU?2%l4k&&?;EkWdG zbqO>vP`3LPg-^p&$uU&w$iKxeX(Vg&JNDOCcpn#~t?plTKBqZdpLLtSQ*O#rZ~Z-k z5;oO8jNO(iSi;r?Xu=}gY>~TuItHQK zEJ0Cs2lSiJ0N3Z#PTg9w)99$Yb|iMG7Y*&E4(Mb;a8BfI&G-A6YBHiTD+k49oiA&o zG0N^i=h|I+=uYl$P~Bs~k6%}iihlNha%Y!!R@~IV+RA3;xUA}wmYa7keTd;4)<3wa zW!c&|yL}fz(zGy2BdlS>By__iB^l znR8b3O6x;*-1klP7JB4ed)T1AI-)n=k?(RE{tEZtidm;K4j;`bC0t6YJ7qt4NbAqk zMK3(XOI?J-WU_wUxHO}8reLWfg+ftZc>C^M5=0R(k3|Eek$0@}(0OF>{Z$5X+B%o2 zmg9HM9&>Zc=hl!W|G)G*)+GhagXZYJ&d2Z=m2w)2Zw92yETDW9F74q)-?(MF#DJpz z7|)_=MX~T@nP*pGey`dz!!Aa9PG)!IrHC$lmSw@U>^FGYnJT2?WY6aupkGs!IbPDf zvd^b@jizCgUSJ@5oTnRu%_*Uf)Dti5D84JAYZ73YFGBdp0HWK)4s^DknqJaUD97NV z_{7Arn?fi15~BN|CifYFbsN{e5n>`Q*I)(3AMnNb9akBZkJFI9x+?Vg_uf{=Iu*C^ zFUKbmWabr^Zj?E4Q)C~8OSwF^cW`hT%x=8y*`piMohmFL%&>9Y{1qN4y^YtrYlWuR zvg5A4iy7m7Flut2Ww-oW#lK%la^4rqOi^04_%gjKt22{dxr-yz&x#Sb8`L?4@4MiS zo~9IZ-9GfE-M0FL3mt`W*YWBPH&!$dy%u^6Z5kRB~Rz9l(IW=cp5IT zQ;aX7KuA$dtr6`FUz4#*djRN3gsv*w*{#+c&FmoIBv^*8KN{)~GrhE^?;6D!G+ z?H|5;@b;ZM`#7){6j^#qchRO@x%#tdz@c5~jh2#3lx?fO<)jhj1KlV8aP+Y5*0q1H z5SYeu;ZQ|#oav1*yCXu|vQkYObsv;Gt^Ls8Q)8|#$SJu$^~8U*0Gm2jheYfMrxU_~ z+ATT7+Oj3ajHN9{n<>O+=P89x*Eg=E3Au?9QcLvBD5|O=>L^q$r&)K5j|)q;^R!S{ zfnhp&8eLSYrg1{{qZIqlba!wv3eiNLk%vBOfWr-GJab9%Lf-3K=SIr2FrdF%(|;GfWxr1SNa|co=)U1c4u*pA@9CuP z_>VdM-p6_@m9;|u`0ZEPx6QXpSSsnho1=U8cO@Uwbo9>SXG@J2ZmrxAuIO(Nv}5&o z+I63z-1_rg?H-rN5LnJ|ef_;_Euq)TBh@JsMIz>y2;G{~*13;2%q`k_!gP(7 z0Mr)I8MBXrj46GV2t3+?mRZaziQAoC zkoho}7#5L>Abas1A#3p`Z~I*kF2sDyFKF`YnQ)^T$y?~d;=^zO61#Bpu&-d$_Gk20 z!TAu77+9Y0Kz_4_(1t2?YxYUc+&J3kRTm;V%*uRAvR|skY`)V=FJU+}GA+jkaEFR5!hWsKat?=;OU`Qv&rl45Z$Scf6IJb)8Zho=y8 z8#gESTJ$fL+*?#AOewwaZ}{lw=%>r}oxy6-N#HUqf4sfL6GAMfH-BGWU(i$Z28FL7 zCTLqXDj!l%R)^9E{rriBQ`9#iN?NB;i>waG1C`_a=XK8pJ=V$l>>*w8NzhS3;9FjK zl<=*jb9^oSSGZ1T_$XZ0eP_B^LdB2KNY}4~$7^rg@2(uNbIO>!fJEgD*htpgmb8cncIusJ&7ZhfY>lk2 z8~VT|zB|Eb9{k$sIE<^VcE|Dc;4Oop%i^Zwc=hXlf`)?8+6^jnOuLw>-g3m%c6DoIb|!v8d^> z!z05`=@#Rlla-L2UWeOJ2UQ{{6=aWLy{0QT4ph?r}1U(>3v36iTHCTqJsK@i7&S8?Qz1@~u)RSG=YF=GHlh zH|Y-AW~0H}l}Gs4c*FN^Vi9D~jWIjx@gQQ&^PysKTMq4?FRle7sZ}YZ{@N0Lg5kur{e$V`QJp@nuoILb8{~YVqWHiy$iQ-Qb*4hGBhgRFNHCtpn3#&kDtx)0+c6O)X6PR+!divph z!co2mlT)U>$-n;g9OW_ZYnrXt)UqX_fR)QGwd9igZgmqT>kHziIb|PWZg=vZ;zduD z2yqSQ6N-`@C~ez_i(5J9yqkxoCoAd-I_nROf0oPd@|UVd&nL4gF|Z{eaL3t~zSTOC z7on`2FJ7EntdCdO`Y}>U4^nyiVVcyB?K$~EcJpalAMjhol8S5_`1J#Wbf%XFO!G*o zXjZnsO1eab4WI&qSv{c5jgbXfi)E^XmzkYJ#BV zWhKevZGU}qJ9(uZ`@ZPKxr8~-Vs?M6Mc%OuY6oL6%LFekdbE$c#>4wjQP1JaAN!L- zR*7Zn-$m?qizO{5fK{)bcsP zZCyG0+BOvY<0Yka*|aPte(I#(b2Z(SPA5XOis{$FD$Hvev&&>7f%cTrHs>k`0$x4gV~BoN?NEz?Gs0(&8`Cn^iZ|`70ns2WH(e3 zVjk9T3DQk(CO?qJ5HV2LIT>qGJe+ynj1*!j@k*R|Ev&R zCwXl$`j@jW-&~Aim2goM_H~6cmtPLQe9j&}n_e~Rk6!+18#X_Ec28zbO+m+T1w~p-m#0&+zXd*h;MTrQ^6Ih z2U_jf*dqsrqz%x>!oub-MAr+gFx|CZ_crL>@FSsKi7Kp zBoGq$oy|t>8YI3Y$M?P9nS5<1J$=>DI|DPRTCqODg2nNeoWQkrF<1A-8Tl;Jh;3nz zK0m9Ib)uV5sC066mf`uBURPrU!wDLn@`kiUg`oQ6b6p+t2?Bq5!kic!I9(!*SP#B2 z4c+-_Zf>vI!syjpM#F*6Yzyi>B4&LjH8gq)B3*kUU7Q+Qy|jh~+{_#3Y!ZJt_a1Fw zOZQhjkeKV*SICy95mDM^*40rd> zpZyJ|Y`&sFF&?nt1WZ+7-w8^kDAiFULbNs;viIon+=8(gtD=J=B2vLMnnQTZUR*qd z6RWiD6LjEtZjq})p(tpgS0ADuv1o-&0o_8iuJ_S^hP6Fr(exs=kB?6@)L&&l>W?*T zRQS|g?mh_N?%zO>T_v6qS@G#p1C;M4FnatV2>|}F3h%x-Q^rG~*v3PXJ9(>3fyQp# z)XxR3WAzBi>jEhu4(x?%fwUc7x1t5|P^T%>MH?6A+ZX#_KXnnB9*H1^M>g?ULP83% zZh)hqeLy1sTs~+WPDbqJ2H|o7oI*tZy|yaAg1$cR5x<~d+=%M^2?!SVgDcn5-uOT3|7Q_myg(Z^eHgZ( z39X)LUs`*=`M&%(RM+&x)vIRk(neb^S%KUY>%Xka^ui92iu2QeRc2r;W>a|fvLua6bkvf7Ar%u1k;baxAVbG={cBnrs zx2+aM%S7b#-P^Yh{Z}A}!z$>2mC}Kr+aCQ)(%TOkN4XsXBTTuQf?;hqLCN*?^;c)3 zuKbZ8;Vgow&K6AOvT%xx&q(2E#x3)fV(sod0+~K*Rk=8OCMB8Yatg%{Yn#L z<-=-v>mWF6O+6Lp4tV^$U{tYiyjIB#6B0sT5>R~@PTi3ltKHE0c4>1>_>(^%1mB_r z0wLa%rbL0tfIPd}GS~o^IMHmG-d81DT#x@!A$~xP6fT|m|4}8jM-U3D1ADf4&RW%J zP$O-4kIAuffT|4V?>k0CI|o2dT0vd|%|klJj$Mc3 zkR|RYerVyjzM_Y430H^MLo8C)&@gIYBHfE>g3o~v*%Mav45e(;XZnCk;n?cb*!So{ z)EDRsrbG7QBs#LiaJJUHztqwI>Lwnig-=ve1AKZQM3r$hy{$K zMGF|O0z8&j1VL4@i9J7mTELPmc}VhTig{z7q|^}Ye!;OeB^NJ5AJ-RMPNv{mVm87X z*bpFs493NgAMYT6w;!f&-A|BWFxtWvaQTUH|Rgle3pLDx(` zUA^zCo{^5DV-`0=d_<`yknhI-!3poWS|p5gk~HP9!F!2CRD{Hi>bGy-ELw8Xh#xP* zW~LzQQw=ycdK3C%F_7nLM>TtR-$@+FNf@nUFt;d3xJqs&N{7Pzms8$drQ&=tXEh%a zFvK9&jzm;phi7gJgp#lfG3?;;^l&#p6d7af;kovbp{EDhEX5f=`FzEz464SKAQ60pH z($U#@++@wb*)u|6o-=*C90xCdR;T)jUC_`^ftiXo#bZ$TTpG|8AXosYMst8oNX_5k3Htgng{!St{=X;1RZ<_CEx% z@#JggG|*K9L9xDY88RfW0qk}Ip-|8QiJ`M)j)Gu|TQbkxA4`f zrRM#2l{M3zzg2HI?M{ zCSs9!J)*Fgii(Q#!NgCA@bmH>mvZ@|O|}A;09)~J_w!drpomZp5?Y0<161-Q^+T6@ z5!S&62Lfd~hGeCqJpSr?j8^a_V`wz>nuIM*){q@STW=xk%58uDe_+rQ*{RRMj3^FIPQ%kxL;W4OmbtDOI)>0p*qH6@MX=#CM--FR`oBWdoA5;&!?M;?m3-qZr zrbCf?!*dDpr?&$F^x*5^DdSO5rXPBadP2#q0fNRi)ncz4F@5qeZtHeAVi$bhG71;O zz_$!=El%A)Tt0LaP#0bWv!(v|H!9Bp^Q;iJbTCq(ji(0a(uftO9*j)Sc{i#rS&di& zR3lbX6G*8(&*6dx{0<75saG|^ii#JW7tL4@Pk8a-#e7V~Re=@1PyJ-Yi1IECP0b*v z5+oooG1oZ;nGh3PNEKl8?I-B486{abBRXjYI(XUxFj}zhZ1qrw1Z@3<{Leo8)!7g5 z9EqrvBMbuHc1(5YZ_Z93oGD7R42kQ24YQyw%3$kjJ)pV?)1InMk+b&TxF{@wyZMJlRiuN9(qVEJ&+$0=G5bTaD z>$j|n!Ne$msO^V5p_aXUCeWYx|8Ezd3pRmEN%D99UZ1nnYocy~6=PYyp2WS;BbKe! zxg;=x*=GJX)iZMWpvC7HpMNdq3vk29Xuq5R$4suPZxhaf4mv5%T<-KEcI5V9d^>DO z3ZTccr%%lxjzlnOr4PD?srIZfy%EY!6D723m)v`d_R@a5g`ZAxY4^}01T_wk+xzt5 z?jR-9De&NPLS!YeF_dTWKsit}{da#P2B6!8%g%QLy(4kZEU-T-LJ6_c*ViY}8-%Ho zrT)B&LKYq2f7v1Ww7=DQt~w60ZLtFbGBf~YNP;Hf z8Z2!hLa*jLhXm=_-}@&1w6+k$FF~g1{30|4LB5d3vP5W0jCs;q;?LE8gWyX;KX2i1 zDPwOI`+shJTea&!P6bVzmo>b^kf}Eyk4OZ|NF+xP_qyhMrxfU0ngMck2oi`5Fd;cq zFcuOTdTeAJMg0dbA5az~WToVf9kYO&+PIdcVgz#<^>U^%|LL?Y#MUM3uF(fr?2)LRk~82IK^+B$pmXDXgJff|uC z1|fvUBu9JuJ3{Ojgu-=pKAL@>W99nWi;Jy`=bc-x3>A{6$89iOI=DdTc)>c%g-^Tk zC+|3d_&ve(G#zV?J|wA%QZiU?VWyFqpv&(GJ@v`e)jIbSk~F{o!Qf*xR<9yU6Y>v$ zA#6Yx5Dkte_LufdzT=k&2?w$3!u*!k#4b{AB!fPjD^Y9h3$QSLJDy*|Wz#56&+Sr;Esht9M+=Ul-~ zCc(Zu2nx~^tfIvesLx3aD^HitGL&rx$=1fX-@I?xoRtJfqUNe8 zR+UK*GtT#Q5jORFq*mdalc7NlloyEkA5fK`D4xc8AbI}`@Fxk+Yw+56&pSDaI4#xS zWT4ybk)dl33xQaWX5xe9 zWw7%wHKli<0|UGkH9msd-Rj(8wOx66h&4L1HAoZeXSuZ(G1Q8fh9wq+1UUGJ2UR^( z0)*%%gL>44)&dDG_WBVpD}F&jLIN!9LvSsz`1p+jnP-GH2g6DN2LBwnEG|x^!7`HI z^P$!D9Kh=#!ACSWg8g4p9EL^iVhT#}oadqf*Q8q^ISEG|((@I<#Xa@)U7luCY}oET zb`L7s-L|&$`zRg1=ka_A?gyo$PEiSoS3eklqtyXi&b6>(_(--~cLk%?}tUnQMZ z2*F{VMsW-ALZ!0!1o+ehBt;ZzTWpHc78fRqgP!8oNVMe!Y&lV{rAF#ylojZ_O{n2- zL^f)We*xY!5Ej?u!gYL@2Ew`}<8S-{7_!eX86%edwJ$r#g(vI_7V9x#0*%4u)~?um z`mE&2$_(sO3a+QUWaNrTga9zSO5nqz-k5o_fg&TG38O#AT>vuUmzHj$Mja5OehPi! zMC_YFP+2Fm|I7AcAR-=H6_-g9VGco2wHuBip~-$q8?3V~ru3#nAr5acWgQfTKlAgg`{#q1@+?) zaI-3}qI6QZEOAr3E}`3S$p7T^Mll;jSM~g$5JR+WHB8{wbffmAP{lYASZ~f6y9bC1 z4rXoeTI18jp7R?yIL-_^X={fd6tNUpzs`+tDemqCprx`f9Gu}5#oGi4yuF8pOK7RY zHZXTjPfrrnv{eC5(0dWvSi*MY@3#xt0NI70oUt!FMbb!%0l6Ynx8f-hBFh!qHFCNB ze|(E?EVxc{aD?)ouCJxg3qz#lvAw-L4CE_tKU6?yX7&`iC{AT-4nW(5kXzgBfZc!s zl#y_6MEp*kjLJRZ>a%`>b~>2RnGKuPj!CdHwc3?)j8406S6)f!p(7UA_EPIk;c8>zdA9Qki z?+2*CB9QbL#xEfYM1Kp;ae(9tP{IKXge%t)v(k|TBC!>bBhHr_)S%^Z+AzWJ*N;2G2;wb1G?3b+m~JZOr>JWZxlL4k zq2H29l5dBx3**M5@;X~)-?gWL)HI{adQUj#m|a*Ye4KlBc$E+x&mzr4L40Ad_AQ+U z0vY{wPEr+K+lHG~896-tZ2yvWK-18+l{fkqZOEn^D@&MJLa-na_>8<3ER-k$LUrFg z6CH==peretrcmCEMg30~RK-VGK4gR*egt_#!kUmY zl41$|okxMtZ4t|VPV=E+b4>9wkT+Z zjD?wq?~)PME45e5|?f#;+VLAGsqtujM{c@%fQ^Wzw1~J*i^G=hdk=up7YNCx zp-U$Pl+JdeVt9EVDE83_>Ov4Z5u^>is7wLtLh(%jHBET3(k3Xh@48VI3oiGu|5avV zy0uSh));Pgn-_XaU?q%_&;ICaCW6{?+ z`#6q*Av2k4r7OJWS^|Aqbf12Tr}rMUgr-COU``7RLz+#|G$C6FwOHyaBOWVqTvPRh zIcq`ASi;WD=T`{F3a~{f+gfA|?sn4)oWETf zMTt}h1X9ZgZmW4tzW_qJ9!wU6UJo`z3;l-#J22a0peq=|XRK9*^m}Y#ul;slWLe|D z_<)fyBlT?Hu%nW1fX-1WlC4Ym?y7vCv?xZ@?w#bidk`vsrOk0 zX-|Inp9}N=95*Z& zLE|C!!DA=m^2VEXgp6LLYuFssv0*O%#I51|Oqsb#vxol*?4)}$t2SynzOs_y9I86k z+eyD^{q7UDrT=;MAvvbxsJw3qdM-6!+UiL_MJksdj79<~w$2B?t2=mYY+2%;a zTv~9TUocl<0@jU0!SC%O;KE3F3?lkpJWztdo&Ur3rWnTl1+|+b#?VPOY;|O($cjF3 zKN;SwHnK`}IAhqTc__HOPbeVdlrEL#IN|EpVA27=;A^WF^Pvwhu@xSm1xFAm0N# z@hVh)_@EB%ZcPFWWn(TFKx#hmu1GKArq$PYwBYgg*5xaWe*nH zUhKHa^R}}5c@MpvYD6Wde@CQ|h!-Wm8^d2nZZw3``TUDZmqpawtD;NvUaWmvr2dO# z=26QxpWy9NE(-R`4P>KyTC-?@BhQ=VK5c&pD3#QxfkfU}XUDC8FcrS} zE3){6--CDeN2-`1{yupjS%pMoe-YQkLJ5PK%ArAgMD@q4#_zfK?o2zMX#1$yW>7I3 z+}*+^{-G%5GM}C8AyuPJP45FD9F@5{hubPo?R53J@7@B}$>I^PJp`$7#6P6);9Yq+ znGAqfUzTBGv%3`c(8`Kg)3e1NK5g_Xs})$RDdYOy+qA1EEx6z@_o8)1It}H*4HDFL zxS$r;2}qT&&H2disFd@=!kuf$LHtQg)7g>7k9Y>AjF>!XewxZ4J_LJ9$YFXdya<({ zeRB6Dt=5`(I-Xhej*gjjmEl0~M9z2V>c(ZC7>XvHm86w2aTFeugzQKOS~he%gd3qA zZq!9kY2ka%-Ts&1D=P@{GU_n7pcKmUEo4nqR4K2lxWM#Yo_66NmfaE-D|vThqRlbk z8gW-sk&q_s2f;+*elz`NyWPid3I2}@I2@4$cr*P5`=1Kvj zogzR@)x%sNbHytehKr^6X-m~SSAE$%?YvybzdxvJM}DGTxZwfLAShN-oYzD<6SB~!H8A01zA1-#);If^zrfb*yo{kV;6^n z{o5s1bOG6bM5t*0o3Elv)=MX;`Vb5G!8CTm;UxG$R)UYo?m=W-9#p-;3e(mMbC=Yhexf# zx({$LP!!kfBEV6h7UfH6UUOYsSfo&)g5e`|cB&}nt3cu$*QviLFBtqz+TBsM^{ zmUIDN(&QS>gC|k5@v=`mVdLh_3E&xtSNeAq`FHN5-Z`Y@P&##;R6qU8p1-T^9joZ< z7(P(3`C)ZXn9Te~VWzm_)26#c*4XKFyzFQZ+O?gN)M+6*PB!XaI-j3&8K2j0_KI1# z7ne^?9bHqR(B$gFUsbev#FIw7ZKPNjPX>9$pt`<#RHB{N4 z?=SU-v;)+G%18Ed+xYLDL6haOG=cLx5&VnN6|eP!8XcJ_BGe0fW%ZYy`L)vn zlhtv1^RY_r2Av5wT{>Cfj7UsjD6$?5F`>|Lg_yd-)~;n2kGUh1|G{<(Mb-|Fhs0{U z=|kgQ#iH>NpYfG~hCy*go~>uPix^nqbaFpUTQooQ0Zr~++Gy2Mq{N>jV?Nj%-EDi) zqV{P~bGFs?s!YV+)=1A^Z2aRPZ&>#`=(;`6=^YA^mxpf_MT}VmmZ!YcZHO(C_hR~* z{Jy{0F!Gam>!U~CnsXO(cceo#UNiXp#Mh}GZntmUlAh;MXM>)M!Luu#^JTr5AJq4L zAf4fG+>i50ql!goL0;+Im$vC^#LM}i+j7*B{z`%Eo)ow?{t9QeNIN z^K10nPKjV5x8?s)^&N0IumAfGj&Y34%!W})sjM`VB5Bax8zD-fsU0Fpr6-m4-pgnx z4J4^l8c%79(iUmY|8+l|bH2a-^Llw5j`4gx_x--#_j_E|^;YznMZOB)KpiYM9{w@V z%c2R$7}7pPt&3E)a1%um+`WK60KKC_Ik|i9-qX~HP{56_GG#`SpO3TQjvR>ousb6! z<9SW}wfZ-2zmI&K&yPq+VM1$8(pzLM$ylH#(S8F5x|Z2rCv$Rax6l6aFmC#0=a_Bj z*^+j-@5?TIbnW?!EgE<78&7dK7Mka8_{LWqSHZG|Nko3ha&MKhXP5H7W=lIK1TKg2 ztlgI0UZb|U!@fpI`mL+1tj5ROA0{gP3d*;4R%zgF4lB+L?h7v7w_Wg7$Z7AuBndY! z<3B%E%RQY~TU_6h5@~ZhZI9F;iAh6VCBCzc8f$0UJ!EBOmC#V-o@g_gnQd=+*)3q& zG*G=trM)(^DEtWXXiKBio$$b-IA7OOD18y=#OOey3R+l-+S=QTB`941^WtA!*X(+_ zj@fHkDpiNSx=PHf0ZVaYq>>GPOx1pDCa$VLGo^5~gXWsx5!xQ_LX;1w;VULa^DgBI z+p%xkx#MfY{-$u6Ffq7Ydwp^3Za%A-!liq2WVm{l z^eDuh_T9gz_oSJlQ z<{wJ#?Q7W=`8B6CH;YywpqF}GW39&J%UOuCqR!jsqOuYcDV$l=FzVc=eKFtv5`bE_ zX1ji{pft&;sa{y1k))le2|(8QHQR6Ly?yfTu-5owcLT!yhTc(u+nw zUk^xb756>p@sOvK!`7J^;>jkZR(o6a6Eb=$M4^3Ta3iS$qg6rL%0Ip|zWsLoitG0| zrA*`J+wF7=M1zj#Z4pS)xj6qZ%hYkE)S*>qMur&U@vza53x?dA`>T#jhKHMcj5tn> z*)e5R%Ms37_f9g|-HO@hga5Vk>+?)vDA>2UbyBHrWAFWu&Yl3Q9tJi{k!Vq@kKs@JaGXMV%Jz+(rE7X5uLDLPQ=cGm~><6Xn- ziCB0PPIA7Qpa-HObmN&lEve+ESglp~fXn3VS^Isv-zBDZ^Kc(}p0K|kTO4ug)}iWZ zB}w;8ieS7{gzybADW>9+L0-{%2eM0L*Y-3cIS?D$wm#r)7a)U$59 z6!$&kAW9pU%86d#Lag(ZUd&8XA#1g;a-7Ra>!73jMT)uV@sXvnDwo9XtyD4>+&?*+ zW&N`$zO*Vo6=lSp0{dklBmCKGenubt`6E6be8pYm!lN;PAS|1;N_kx@>;A*dSH%zksi z82Td*^7Z&OuJRD^_w$QhdwfP4zF&5HCP~9!S~`5r$j71J%^_4T(go&zKb-qrACJz$ zcx>eC@63yuq~WFKEh#gwrmag)n(_bgs(Zx&W*9;pF&Zt zS|FK!%;&1zBu%TVj7yH=_A~bOD(X9<=I5x+6EG-l?;7;2lhNBrKvqrq{%pp*&V9#F4=IA%t|m0AE| zlYrx&2wM?wJ5;<;vWJUuF$WfwvaTRR-e__k>y-7GEQQ!E%9P5aUE3ks{NsAGid1y( z)InhlIAVIECh-n+6C-0{@b$c0O^cYgS7^SK1?7GCYx zaifZAy*<~}uU%u;bFRI+{ZK--zHRS$$FbrIIVWtMmo@Vwa-Z)|18yS> zW=gJJTbN*CZ>^jj#+=y`tTsG36Es?_TQOH9Fjd9D7ouKJOY0b}mmLs1wd3eqO1QwR zRCV=j$Kj_)D-C~}}8!O6#0^-r9N zIt{&Y2hb8`CR6EWl2ceXcjig?U_O`J^3PlR#e9Z>i<3uN{tR9DZ0gNfV5O2jJ@ywl zPi%?jbweL_3kO&kT^y*hs49$}W)0e{@%r{uM@j0`uUVO(x#2H&x|xKiiRbr()vc-$ z<`fjL)OpWy>DTs}y{yco`iu=#J*=%YI@D6>W8gnW86xyTh zf3n1`6`PZV-eUbHo4qFWpW;X3-LBID=5@4{K8k7;^dYK=Hww$up=O-x7-wv@8ElGv zuOCXw^cZ^Cw!`d|YJh>Trlcf$?sS@uUB73^NMoUXeYEpjXn{e2yxIJBgZLSdIu@Pb zp9h)0JtC-0%&X7+5oAK(^u{QeqI?l?N8`n+M|)S4{H}h;wl|DNX3F~J2bq$cG$2O@ zYvoe4kE&q4ZK&9ONyll+H7|m#kGt{*q-f&L{j@ z<&IMeHSxp}U)4f=Q5m3znYqS#8>4-H%-hHmkER#eNvyfhcZTYuS*RAMC4_MQSAVX| z#&%gTnTL8@SyughuM3aozgEB2-!-K zY>AK|fH$g0qreJV=)df`i0%!hJA^Lm3`*=bQHfGKal28?bn!cenfD_q)v*@#`EzCA z$$6;`CntYY1kwr$u{C(t7l(#!j_>0c<=h+B@%K=-CCh8w{`v~bF2?Tu*538G-})Zr z4hM-DH`*MoOVRr7?pQzjO!B#@PM;Z{n5FFapr!D|X17)Af8R_U?Q#z2tF0=eJ&WWG zZQXZ*yQN>@7VBuAB=bw2Lp1`7N5l$y9u2D%zu4dEJfztwJa^M^F1$E*=Ed8o_B)ob zb9487olMW36(#1vXFnEx(`&ntJsY=W+-Exx7R!>&9i6EwsNv+`^0Sw$=al`mjBw; z=v1*wSIg^Dj2-1>r>gsEa`Ll=zOZ}8_dV={&V^#Ke}(bPb8qX(OLs@R-AZ~(cmlWc z|LEAWcjj2AylG2@UTmyUR_<`LuRg8QXfBPo7n5`r{pZGi0+SLQx~}JSC>Otb!u}Nx zOp!TtLbW8bzAm7Rmdl!zpiw2yn9LC>ee>o+>+S)ic(1?tsnMskO8f=y(qMQIsIT^+ zv0RHgXB4awMUlT;zOVfGTqVKV+Y4aZ0=e?XwY{Guw=n#(QhiU>R;&!YyOr`LaOLa| zoO8iMVAlFG8}w@lwhJCG*h|F_N-3~5oNils{F}EP0fP8o^K(PDf21-1h}xEXn47h1 zpVpeQZi1(~XwzPx=bfj~JC%xy*_$$K?fs_X_;ixz zX6@=H3^hhYMd!W@=Jve1JvCf-X7p<~L%TwFo8FUfgM@~*iSG5&tb#YB)ANpwyLxN< zj5j^TKiOMo@~NjB?Ka@i`%?oME#>*!OT(%X5~Stwj50PmwC2C zWRasv=DU3TDzRfqj&?Spg9mG>4VSgcdjHUPE`qA9d|nM3#ntz#^Ehx}l^-#AHwtRY zTELTI@>TTNl0+q-1yG$&c)qs1KZ#1+ASrpTa{VkUYhCW4!-v@yn#5SZKo3AHoSX`J zx8Cl!VkrFfAe;%COj8!mv@38~<7>80HhYXzbF4Zt=f$C>sp;^3u-Rsy#?(e$UB9hk zcke5mG$O9sTcCY=+^!mk^*=1#6}Udu9^zZt_nXMzN2CC6{dVFyRWWVf?bbEvOXt!KdW z;mM!rF)iOdPK6YK;&bY+ldLYzALzcKEny{gAP24OsxUIPBNV*u#^({w)(8{ zSC6I+!Q)L?t>gJj`R!SQjbuISCg-Qc3&Rh{I!os(DUX)yG@ zjX|+9GbaaIgOl^}?(F#>IX%{u6cHgUDe0EI^gfSJ(6Whxi{3E#zgmPME+i-95nTlx z9egj9^tU7~N?TjoDGbt_bQxU@pdr_xLksNbx9Q3NjAY4Cj4206!GJ((J>Pp!GLY4Ibkb<&mRo$|dJ1(4}A4v8gmJBg|~ zJB^t2eHm@o{zXiNN9U+o(>K4q=J@2WrZ+ZYPdGo%yGYrU0-1Kk;#Xz>tZdYH~!$((C(}5H*-oLe^{Oz7)$H; zzgiFUZLsRw>ipiKF+u6k^;dHn*x9X*|1>G;cs5dIVgZgv#-YO&#M#)g7OI8@sGZZK z)(Q5MFGkOoHkjR>1~Dc=BqOB&G*++N%<#{fUOe>}#uhZ*xI6zB)yyHo)IO_{*$(vU zlyo>DNx?mUtKac=6p)xzW=Mavm6=&B_29?S533vW?0woMrln-J-HHyIC}&3VH*hnb z);{m}v(8QfW>e*RvQ65IJTf>dQePZOX9*o~53{>)Cn{?3!L>ERsn4$RGrTceBz}Y7 z%fz>W@z5|rxH<6G%0L6b6>jGUxhv_6w%57?3U}+Kx+T@e49sxqaF>Y2_ z1$xcy&BSQ^J?D>Km{;1vSD)ash4uMhssKyv8I_@97Y@z6 z&6fbOfnA2g2~q>?&n5EIV+w7~7O=O^eSc~ynrkC+y};bZXFa0oeyef42G;IlVm1D$ zfp(XNTTAj=;o|1=M_dlQG{+zt2~;d1w8wXB^^f6fFO1ze3gku)qKO6~E&(KXKQ2tw zvu8h*7Otb*U`sCOyt2=BoKx|8+zlpHy_=JY`0-g~DlDeY^Mw4-%Yx3D?qdVmJKc(u z4$2GLG4b2gv2PdcqpDQe{J2)y*!Jf8VizHTPFkUY@$b<@k3n?iSJ47`FOd=H7s1)1 z33>!n*4mpVH@2%7_s_5vrCMHx2k4 zcbetpj|mM<_nzIQSB1~|6-<0vMLZhnG*f_QTE1PngLXl=ho*L-uHdZCS_5&%}96!m-}w0HlPb|ppf}$MmKyR@k7IT!3S?X*2n(D@V3qS%aVN|QJ~oPE2Cvt%`` z3j#}3hfvUe^k8A-Q^1%qfxzBWbNgHzxJQ9rD*fmRj19G?qZQDT^759UjWCv3iw@jc z^c)KR>h!)4Ud;1KTV4*^RdDGLCS-OTStb~C#_NM}qkQRWje@^NnKHKUCp#DFHwFC3 zWMVkOQ1ZJWcLK?hU=hlT`Sv?BUH1nX2jqQucz9?k3Zk*VM)kj2#aBmq zd#?o5l@_~bpO=(fug6}cURt^FJNwH!CZ80U=W3D;>zmiT9cQ9^-QqBmg!t!bc|`>c zdII1r(P7qc-~T#=W@qOO!A_FtgzcqQ%U8GpvkD}i_rLME@u|r&H~aCQ{2}jSRF*C!wizjb9+LlyK-9LY;+4!39YRXot8Hs8X#~xcCA1Ud~+}^oLu#3s4HcdP(;ec)HVy$5Y-Le+^b-t(Gu9;%gRV z+4}S_WkSE-e<+i+x@g>N*9s4}OP4O$0U7#)N{xE@bStq?bo8t)JFTTWHInhtY#&;g zT+n-9#ZoVILJq72SNyq0iTYY!1Dv68RMWCsAgbp{g~+{b$pAAJ$v&Wb%|47UhHN|zSnt; z9eu7^rUp`-FXzerh}K?Bj0~Y;c3FlwNXk&ed7kyjtZ!u>Vkr&gX}okH#C4D68aAVo ziY%WXOmv<&wRhqG>l4x^bgp&Ck?j>+6oAGj2>QWZ>t6tEMZ;)ZIwEJ?4@AZ^Xaf-f z{z6^`G~Gk6ZcHFY4u{CfEo=Va%zBvuwXaNaUEDkU!(9|rd-(^h{4^LmTsp43w&okK zBy_$zR&r*>fd~$)6&+cJ?$3&4Fp*PHL*oxZE<92Vm<+e)J`H~;X&HTM1x1Sfs3$=i zBhfo)^zKuMd+KHATHd9MGCx6N{!B;xYhK ztUY+=DZ7>@yOCk3)?VAS(qm4g_RWO8aCGw`Oj*jexgw%<|O; ziw(ouN8fK$;N;>GJVT`@+6b{pnHa3Eel0aTx4)4c&#f^LZj>C^d5uSF|5xDg2(8PzitcdTt zvMcdk=ZLIzL1%^EfFpHqz3;&KBm2+1FrCzYDd!+bk=iK3P+OW*oMlP~h~!ym&kd!3 zjxX;r4+O(oFmiaq1(QPf+L~ir;~G7NMUAk&bonyZu3c{zAkwf1AG``q zOrY2LJ4{rXwE14?_4%<6eo_xtX3JhEesZ$hd9kt1WdElQ`!&Mf9MVfa9*48;yb`Av z*q0073!!fXp=wHu5>}{!WLeRWpBfSx^FW_^cyXT`%r zXzz(5a!mlnI`T=cHx<6_nS(;xL7STskAqRW#?6t z!WX&J7R`r|$0j(Pd-v`^zA|^eS5h=sNwc#<&H~JP*q+n9mT@ou=U{Bn&6zGDM9dlY zpY_icbT=no+j>4{2v|?k21eI|{g}avRSe+)3P1eczqeOS9qx~wv7$xP*k+X8;J=Kr z6plzp!Q7My9TW$-LC|+u+ILXiR3&xmELD15ush08arnm+L%rg`y%$6->QDYzw@WB! zLPPaB8`ojVjUN-?Af>JwL6l|!5+C78(K+?rZ4*@<-O{uc?FB3#v`0* zJtt+dE^5sgcs#mitkCs4t|;66MYNBzWY^T*yNkp%$>WGW!1Oeaz49RmkX%#%ktMQM z@WdWKQmBMU>BJi!fy4pzC?ZNq=L)Yd1i6b!mw_VI!w>U6L4D%qCpmc_V!w0ZK+nTg z7UzA>KN`r6gsZCeo?)h%dX!E?ei$BK#Vuym1>~PeWZomC<#Dk;QS~A(L9U3|pEiZH zM8Obu3=#8K)cwn^HKYqDjybicKWt`ULof2&##3KCQn9GJ&66UHfJ^Mn35l}%ly#Jj zdET|KV(>5M0zZVt1xdZD!t#pH8OQ{8i(Z!uy8~>F%msQdTbDFEd>$Ny4mR=%2%tE+ z!Ub?_AtJC%eu=@h)W{)A*F&YeJ_8qIiVOa@m&Xc6J&+cvrp&uKl~b<``820W%T)WR z7p6EguAfLaaSj}Gx^5XR2p-*6ieQ=Y6E%e+OmoV*(M5%O2fxWKzxZ+7fOoY0qj7bK z`N#1;&$@PaoSN29;WbbaI!&#;c8Zd4mw3N*CkeqG&wC zrRiqm(&QHymMZ32jyjysEl1=-YMT&HaLJdLG(g;4Cbc-K6pc*3X~=~dJxJK16;Dx za@?jP6K5XIF-EKDEAFrMF$})J&7sbsp*k1FjwUNl4&IvnLLKz!^ij2&7`~ZpYc(S?)pbcEx#sv=;mCGjhwF_T`*gI2-r6tC8thIzt<6vmfe(evcB!NYJ9%4cOEda#*DQ%=2b>@uD2ajl@(s^Rd(`F568AGo@fi#$mC=CZtN`H6^{#gw;R^NC2E2o5wCff`-L1B_9AW{xXR zP$IIXNdGUf7aBL^+h+qXL5Ca?Z}mxfy3@>WsoH~z$@}NoMx|v& zlN$s7Olh1=u}pGk9h(|U_=pO`_XrC$bBoO9^sP4+J^{m^l)#5GcO^C~y@`-MH_ru7I3@ zj4iu<{pwY?Y!vN53W5d;p~KQY?-T)lJ_2Ef+JoyX%Q(uUSlU#}SIvq}etJobLDo_C zb4g@9{zalpL_|R`I5?KTA*N{QP6WwJaf0fVreei!xf3UD^XBA*&*3*sK0Q5{xn&Jy zoxflU#`m81NyJvbb>_GDaaR4$v4=3SL_8u1MWbCGktZbKDd7dU=75j}L~7-K*LfuP z_5>xYrlr+bYO~D6_Y0im{k5!Vgo_4PXg!e50LD>HwtXx1P}9{-fv8J6!b9;Dbl_R#L(Cj(P#w5*@#0gj^@l(Rl3TbQ%KAsSjvWjBFM*K6vZyL6N8xb* zqjEifWEMdmQH3FVRx0}$$kHC6N6^bq=GJ+2BNCchNv^Jc(Rsgw7Ed`r5_KXG&5z`T z4ujZuNSAjDH*44(^2$)FTX^N?_?6$2Cks7T7-wn^jFasu&I;OSE3i(fHNbj~07lvm zWl6ef4#1ftrV{tmdUkFR_vB)V{0`z(?>shbCcIBob@e#lN~MT^@+N#|03l5w;;&UY zxtN=z9uZl7tT)5{dszv{b%ARd?t4XVwkh64!;&;AmycR=I8=CUW+Y4O8+;`EpbZ}#biYC zm!OLKuiPzO`l;~rz)Q5Q1lb9N6ukwaAlD0ds0NZV(vw*7zB(CKd;p>aNBA;CU3Q)# zh4P&r_k-AoM#r4WjYH!`v1P31_4W;_XsVKd|VFD zps)mvY#a7u7Xc3=#Uf=H8nEKzCcrPv1)s{VqO4FLJZESKKIMQ;q-mbcV#>}3Ov0AZ zL|KLu90`3e#Cf>nd^V3B`SZ+kiI12lQ}(laPltMFURD2~KciAg)AX)X>a;^+|y zW$^{5K@qqJxzNGDenB_n2gLr{EmsRtYR}b%eVj{!2~Dl z0qihcNs4TCCJzE8^z0kxcDZOB8#x|WTJi5C-VGH3?J2-V^gtAc=#9C!Xya^8jr2y- zHO#@cK2H|lz<#9pL{kMveDsTf${gD ztD{FWc91r6$JZjz(!2qBb#pdfSCKEBV(il79~z1VI$e2%{?chSLv2si-WL9ePLvW_ z_C#`wXju_$GT?iO!Vu;33=Rp%ZlS!dzQSAl`*q7^zq8JN#&;z{n1Ki=z`hv+$|Wa% zv60fjnscCB)3(J1~CjdjpvM;_i zk)+>vTJl-<1C~wtwXn(xSoWd|%~=?I8i^z22)ZU+k-j3hWYL>Nl*dHX3h8Mgfm#tq zw(#Z1uZijfE#KY-E#^kc5DeJKQNA^dw77Kxh>MRD!k{qDcI zL=Kh!tY)}LJlJ1vP_{kdFmZ#FRf(7q{MQJIbM@dfQ|^2q{VM2;khp6FU8Uf_IS5gc zOy+V`SSs{8Yj3_&M*70IabppyzZVf@cwrjsx8O>VfhCe_2ev^zipxS>BnLjMf~#@kPpa?00vK-;lcx~c$Q<)-RCLL_8GN@ zSh&(4uZ>wy1;WzOsUWh7L=s@3&nuov-wS-Vi#U;!Mm&63c$tef88t@4qlg|Y(Qbqq z=UE^W4wFL_;p^|ew>itIQmC7*VL*TD6%qI&SAcLK={FJQ#B1YBU+60O{srF#aD5D2 zZf9Z5Lqk*llT*fPON~IC0<;JXEv-N#NyeYS+vbPS5y%y4a5QAD;QMotv$7pm^FAIP zIV=)UIyt@fMW7SZEtKLWuy3-!Kw{N-d%6OdzyMV)KTGPX8iz z_u`9W&!N~s_8fl;MOzL8Dq!L+=!E?h3gaQ1BRY0|=cDw-nY;gD0T7?z9qA-_I+qYf za6PUR;MJ=^;KB>uxDRqUqQsbXWO+n$nz+w1eED^B1Jpl%K9b;l{xyM(bQkY}dUG!h zNCVUXDvT`_J$d>xp{M5x-Jr1E09$Ah$tkz50y>$nE!-O;?hKy11F2z5yq>@f*3bq&-g*^pZ)FaTnF%h ziLiX=28jIv=T3)aJc;=B`xX(5qSt^E)PVke@(&jX`6Q8id^Wsm-5nI!iM|U?Gtsg{ zO^F8h9bV=NF@#<0Fa$_1km3@Ni#b605iZ(K!1ngpBb5Y~X*bmyFIST2OOM=Gx^O#_ zONO3HEux5uVAjid!VsEq)EHj9+^zED z7~Fu9Pep`A=gt=+8&wK3#l2R#i3NeyM{F-(YjL0uccs4v}6Vfd`O= zk{0m_kiED@Vk)}YV}$?N;G=Tr9M(WQmywm#3~P_rf&?2-MhNoSaD~x$S%tkXTkxr+BFIZ3P zsqPuBxn2mQG)QjIi@|mE*)l{JceWk$w~loc$&%NnV+`=ZE(fIONd#UzZZ(7rJht$u z!$x3FGb>lFJaV;$ji8ATU?IFAJ^>f3DKWnDdtiJ-^MZ-NcsIo*sK|^FX8*XMp9YO8 z>^Jzq%x!O${!MP$XH;lE&|x9ssdW8Cvdk*DN8%9Ir)oYYHxCu=F&_GsMEsBN17QGZ z=wURFL;kK3S7|)`gyWVud}KEoz9)#F2??(WIt~4+1I){vaAIeaN{65!R#sW54na;j zF-QFA|GqQVvNsBz*AYr1*jcM4*pX%9rGQ?6!bwlU6GGd7^xsH4itz1SB{)nNBP59x zQv6P$1x1O1sXlHZUr3Ar>K096C`LtI zp03DC-h1m|aIebTTy`N(A+%W74fhf;zHWhZi2{J#Cs(SMHG0{^dl>-#`|5F1Z-wYxLd^Z?! zxVY-}5p@+<#RzE7eUWY~HJDV!fAQlwQa@W^kL@NGB7znpae_QDG?%Jxsnr4 z17YC$w>p+$&(*FqL(YQ@kw@Z%V35)v`zPheeC+7gZA;h@K4W-B9=QTY;16Y@HQdZ7 zy`3W}5-6e(^%-)PtdJm=QNn%nLyaK=PedZUCZgX%BXP8hJDrHQ5dpKeu7cZuYc7QB zYnR#pR1Q7^$V97l@c4iZyr+45h* zsP7e0YE6<4V@%0esS{6op)iP4WKa1Euh-r{DA&e&Bk9=w=Hl(=s1y^f86glLa!Fq} zgnnpzQ|=S>Q8=?1&&?D?ZgK)|Y=Ghnd^?qm*dhY1?U?35*=T2q9E~{=@d;wmW|XnpYhAn=yU1XMS#Ie(}?u zPcihP5^^IPcsg!)1q6U9N=iPMO_{Ro@Z|(_To=jWA5EfS8Uq5TAQA$rkR2C%2*vp; zBm)#UK&r;oqNwijW+kdZ?!59Qm5m@-)D{ZKYb9kxzyNG6Yl%Z2z7A{B-v zmdWRc6N}{G5t0aQK{0q?8L@`Ss;YJCn^BS=T|lxNp!ywnvN|4=ReF%J+K|BSkqpoy zCB@|fEjhmQ$Q|pqZWC`#=LQlQ#u@Hhjo_&lH=|$C&4D9l!JPrMoR5v6CJRYA(Wga3 zQAgyi0pnr0ISoH!g#-yLft$G<_jhERFIq-a$kd$LaZG<98Hqzt2_DZyyXdtTB8`Zc zm{UM4smaKc9?ZtBlSnleIWCz8wWRk(5@L-0nKC!B@|1Nepw8>==}A;2>7UQQz@$L5 zQU;Uqj$)rlhbzha^(8H!o3FXlhUDT3(z{vA2;tyxxNSs}ERG{eGBpUnt#G%Re0_5p zp{Nqt;3V@P;z#nR3UZ+`rvYshd^OoS*L}o6hrF4Y{Noo8VAIlEURKsQYBvfkwcb*W z@YUxIg?NFYPRa^ooJB9^A`PTutWFar{$*mpJw17H1((LIo2Secp4_z%_n!t)p1`yR z$N<0ljJ(;Vg^`k;^CO57FT{_7fD166>`_gPvP{8}n-CxB4-&C`LG(R6CR{0ILkZvF{+ebe@b-8d%h}=mQgMWzr!O^)wrY4}J)yug;0s(6+I*FZ@!rWO% zCW#qf%G|xT7dgh=#AZ&A(sJkTTV7v&S_+dAJMl8wg--ct`D5A=(EJm(!qF$IPtP*8 zl5h2jj))Ks#|)d|>Q=AITK-V$AQDkTab-g(YN?e8qs!K^bnB4Sg>gv{?OmTPq z!yr(FB+e25u*I!lk6a5}=?HZa;(QgHL-#TH)vJl8gNXPDUQ*xTwJUzv#7yTP-qD9x^sX~C%C|F`DTa4 zP8u}t?mm879iULGh|U^uK|~?{-(8kbhBgjCb0{32 z1m)f}5)r%}iW4ZXsvQKdn=`&$omm73=Dd} zXd_LyRo7`@CI;9v(OW|Sa*-@_nB~M~w6Ugr>GX-CZ^Af^CU>so zp9RP$RdAh6@t$L$psHhS{4Qz1chV3*L+3IIopextpM5Y#mJpN)d41eD1PZ(mP#-AU zqcg1??b4@;owMAwyo<@6>mSw7w)B00b<+v`wHuTq1AWcNCZMz7c1BBy|DEvA; z>nx$*l1Mba(GrPs*jjTfA)@qGtHSt&#NlwrZ}|jOK*r&icV{QFaW`2SqkH%??q7# zRg|l^Hqmb+I_1FV0LtSVv=XykjH_|iXW0I^yoO2eGZL4D)mZUB#5O}mvP{WmEb)}R zYDzwrQWyiPT*baK{tm4D{>*=z6i)s67yR@WnM;6?7yI3!e|WjWLMcoN zIHmt2;`DX8@rbB>y)>$-M+;O=>crCYivhA+sh0Zs`$r}`?sNr|d$_7SS3TH!N?Fct zr9yF!QozR-#&#?+v3Fwhlt(M53|ltwlpcSfYTG``*OQz+7yqP_W&44hfc=a5wPXiu zupd>-pIXxye0qBa-yu6PBP-^jWYS&@0|2o22~-EV!DK*5G~z8%l@#|p#^!C!Y0$`} zoV7AjN0MuVwFV25#b(CHI?SRYn36Jf#;GgN+-5fAn7UI!9P>AJnc`vfO&rWGI{hw| ztGn*cRL%INX7D^Ie#|&R-9650>tcj>WLj|T!Nnf{-6G=thIsi1ua5|!{!@qt2Jawo zNOFOPB+2bXltxPaw#X_xt2rRXml$XOh+Ca& zBVWBb^}R$dwL3hNGyYG{?(+{jc~YmGxHRWBT zBMR32AOTk8m*aj{f`>CDmQKk`mZ>G~*D^25&OLXDgLmsPx1)}^YB{q#jN3$CU_GWJ zi_0GKq{mzls?$Fxd}fWM|AkHIQz>3sNq8}e*&Kv!kD&MnbG$ly`xTUE?7rS!kR1|d zevEPt1hU*))nVU{y{!G-o5z1;?HpM5E;P`PT*|1teo=Z;e?Njmg!fNog=bRyVczcD>Pb^M88gXyPoGiGa40@CFH=2d@uL#)eJ#c!z_ITn zp`aB7yZUC|pO5tnj8~F}NA5Bhhs$0prN$N|FK>F$CG@-1)wAs0`wOIG>1% zTK-Odg4=t5%c#aV#3ru4MAhSLl=O4I*A>9+SH;F$_;GXYy^~C-N!>ML0dk^LJ;mYz z^;p`5{>fGDqg;B3e&WAleosUA+z7{i?;xIe>!Qg^hO2(&qtOhddvxTr7>keT9A#yk zR^!$8FH7brtKG~@)lk- zq({jrR4DzL(K8ObjbbK{?Aqyh!|p_~1)c>Bms28h)bqFJTMPt6qR#ak+dumJ>A^eZ zCEOhT>0z2*+vCj-J`cM{8xOzW(ESOxfv>KR%Z@Z~nv|qhp`i!4{1?L-$_?GD7}K%_ z<1XV+bG6;+Ob`qg*#EugyYX-JDWR?eX#?ZzAKX%dY6hjoabdk@Wbe=Y zaWC4>YQ`w>+THX`qHu1Wu?AP}&xVc$&G$Z+PH}(GP=+~D*|M8?&`Lz{j;zgs*&LMZ zq;2mqemG|A?e5LVWH-5U@)6SAa43O2Xf-6bjX2c_&3gaUS7Zhu-Ws^JL zWHGQ|KwuW&o^|UNFRMJT~8x5Y?o5ucnyBn9YAH(3(-|b%&{gNve zov5(yymYKxBaT*8z>vzgPs@`nIr1XEe+s7r$doHmu#f0m5@24!9>KqaDB?@GYMuR} z12SaFGZbQ9boucFuMJ!hmp723HfeW8>}p(=Nr3y=l9eVvvm^IK#pob&Y&{tuhgcP| zc*K8Uqv%C_vaYUoAm$9vb>+g04cRrnq}yhd8yQMp*4uD3cQmUji9GS*VOboRRO7Js zb=~|_mB`pApZ9ZD)D^PGk`nPuc;>zpNRSlWY%iHSAM24ct=llD7FcMx!lKN1PHdk+ zx{1dRt}|{E2Qt(xf3|2LtE zHMSn9>G_*SdevjfE{}*i?h(7)cOG4LO7;C+_X~^ch1|bLzTGma`J8#ZMFmOZJn{*i>}!{OLs?d1YR4P&Pme^{!}>^b}X2Aak#$O)gS=-`~RW$S%Br?6vF{OpV? zSK#@rBs7K-|Kz27>EBA|0I~dEyYctw5B5fdlxv~DQj3V-lb5-9OAgf{zEe}DM$u2d z#r4*$<+V|Z_{)7N9@rL_xEt#Ie*V2h%V9r!$y?-u><^)Z;9@NCXBXwxwt$u?nQe9k zI!_W$1~Hg$Mt9b;XRqw4na?;=n|W{F1HVt#vm2U9-Igw0O5}Qkx23! z*&J&bu0#B&cE;}kIOY8L^DEb`6*#t%^5)EEtd%~Sg1lp#>6BWac{vY@^BKiMT%y2cTOeDi# z^4e~_>zs{$XUl%ZRG*Mu>g&$=jH`lwRi4$_a{)W3mVw!p7Dj==X!of+e*Adn>(=Ym z=x}U_L~Ne--ifhKtO<^n$3*Ce*Yt|IBfN|PkL4RS&!*nJT$0F0vhR2AP9p!Q9N_f3 z4jDKiP(cdk3(NKp@q)~^mBI9Fr2N`Sig|eG3?MOIMoXKYNz11irgnbWnZvNz?EAYK zamIZ@1-i@Ky@g7&Oa1nF;grh-pr3`ceu<-%x1z$0@^vXgqBQH(M&feG?_21bXq-D2fk?Z;OSzX6O3CO@`kv{t?b#zi7fql)i+44EB^X7dclh$B z0|F2FBRVxXgtA$~%s);ti;tRb*~EI+i=S!|-gp%*SW#a;4DksKjkK4D^zt554B)DU zA2pKse%>dz1R=&SLy#^_o6|+FVC6zWv#tTzhC!_~RH_vOw8|gMgj5=7uw~7ae%w zpQUr}o@CjV{OlG(;S96bFKL79GRxOqHhDW<=>J-bO;FnH#fx&&~n%BRPLW1C)& z52&0talUbmXHO8Pa8iZRsF$vNNoA{c?!d2N4|~g@n4_t|tbc5e`GBiA`{H73fzCv5 zT*27atLYYpj+!+_%2XAmKU8Rs{87O*6cQljpI%>YdQ9O}II_32Z7ta~eL-bDz-1c_Xs} z<2*=H3D-^^&wy+IQ)%&<2YdTBwW>c%Rz5NlSHeFR+29wTfjK(@JrA7=W8--EYFoz( zRMULYpFNXad;E~3kJ8=I=Aq<^-h&Zg-NhJt#N20HxgyhxDMoBwJ38&)pkK%fxgs+= zUGihmqPf1$b15&ZPM%!MSRM5+%=x!O{=~49akYqUfNqNfe*cnp=_ip054&*3vdp5Q z?LEB@hm0rWy!+iG%dM=lIq%(HmN?y5Z8uYzO`b3Fmz!8!cht{ICIY54(pD08`N{vZ zFpAr)?HXSFXR2`Nnb9|Q(|bLy8iZ5}bL=_3OQu#VEWU8QO*65-;P_}^(67&%iaAoC zd!o;ywLQHRU;(_NRwiwoy73-V{% zxdfl2Mz)_79o(+eFj||NzS+3DEYoj&PKa9gCzVehPjnfJzA_5zJCdT&o5>ZttCS~E zk(Wm?H?5)9;A&MfrV;j`#PX!5<8g)hu{q-mqIV8v5D{gDpT@D5MrHKfJL9QM5c(&d zh&;4muApu=g`p@`=(A}^NCtGa?9O3Omq_(hDRg>pJ>T}RzSF2-rpb;-rEJ|ljEc)~ zwbOM0)U4ZIR^_M1huP|AY2{2!6d4f$tA4&2Ew19K_DE~9aA8A7;xR{FVVwp8n}<`n z!+em&OLm%F=gGpaStT-^7Q}Cw^7bw-mqx>Z)uVmeq9Yr|eJd_=>+~nx&c{T9XADdq zYaVoHaPEAgK$TCluKIIfWZ2{Tk%^|?KqUF5r+c#{ng(yS>&SU+RpjZNl<;wvvva$- zZB&$Yveft$&qC+-+r-iv^ei6wr%&j}^k;|s*5*(#sj3XGdv?B6R*&%d#CRQan2%*p z*(wZvCAZlQnOJ#VO}}Z=zEj3-BvOa5+3{9ved@NBVu8xg;#!&1)c1LSpEu&NCzu4S z{WEBetFk)vgMrjV)oJI}JI&bedlf^<4g2nnB^RG-WnS$tGiSLu`nvYK=Ke!mldQ5j zo6|olc*_eJzvei?!cw{~yS^_Xt9*ugmmSyZ)-=G@Nr=cCTeBY^79wK3Iyz~do-8ty zLu2>WM4;Z^ObeTLpa^}%IMS{{nxUp!$|H1CCN1gpMj$x4Si+SkEH(^(4R9<~ZAV9ZYOs5bM@3ph>OS?rJ>N5^nWXTs?>XN2N|w@O7pe zpHkwJg!%61HhQ{IEuGTSE_u3@eCzJkNjsmZZq7_)+M!ne7;aAnAq_3FzuI{%Ab(sm zuiwWhF3~ZZI*sN})e8?C)8LIi!)4Ay6MUL!k$u!@KA0gkmODx#MO)9|dd~EpG3L5l zEwP?A^`XXg))_#XsMehF8y@6q%HF3|aKh>$t7GcQm*yFLzP9F@g*LUs_(Zvl@dccp z4JmF4&Xe>!CY3aJDZg{e_Lx+$`9!{D-oEFzy4!c3St?+f^6~bT(n0g9%~ZePHA&HN zt;d-4Ik=^EY~EiR7E`g(bbZ>pe(H0&aAJ;&u2oq^4yevN8k)38oHAp3#_y>wh!1;gi zu_9oC&u+qGC=~TI`5;M3V>FMG{dvt+d5LdfVfy~f61)LAz1!?Zhm%>8<(Zv5U)z5< z$ZGLNPQ$ou-ao{0jYqNhJCFXj_;5Q@kK!mDvuz1R;r0geq0hy~AMu3Mb@%s2s~hpx zmc6nHI%pC3lgUD_@w?Hd8T~&6w)q47p|8h!rtcMU^O$DajXtU_cC=?wJAA3=D38JK zZ1ws46Zv-5G@8b!(B*>p3WK;$`ODd4Ja^C<7z4(I&xh7!tadzX|NQ5+W2*hstSdkB z4DcdpJKXg2kB)xCq^;7LTkwhraL^pHf->m&)8gm#A_fy**QJ@d+TnurV%9D-&g^;n zdyn^IKGVJ|6MM&z(rhZ5m>8?x;aBOP(T#Q+m}K%^ec4A_Rj;;$kIEK1`0;a|SwLUq z!3Og0^XQJeCO)P4Il{CAhM+0wVn;#xGfpJ|jJ0!)BC;fZKIhDOCk6mVX4TCB?_EcB9nek+uLV10u zZlUDM`|^sK0n(#$<9ga+-5heJwFc7y@uh|O58maTD(mZxUN)$+FGlj!SW0t@mIO!7 z_k!q*!`Jm1g|{VBM^B`$e=+f;&T!yB7pq{5Ks3~uIsULQ3P=>x4%#_7w|i*+{@^@X zViL}2I>}YRGMV6H-+PzKG3<;`SG_Q^@@-w3a(WhmGNpL=Py#!!ej@wadQcmH%07TV z|G6Q~+Sv&s9HD=HNpJR$B=`js_SxK`-FZg_Dt&YVhhq?)Xus-NE5sxp+Mb+TpVk@^ zwcAZQ+c@s)S3`rHjSUS_aJn+FKcuB~owYN~3a&=5_1^8ZD9=h&XiK_t=N)y>qAV-@ zOcN%XN&uiBDpONcm{M1}v0dp}0|SJ2{gxRB=o^;gYo@h55jfuP^mSORoB+e;R+}}n zB^&i?n}$8|`694bY!VxMugw*~lTDcWlRzj*bSa z22sAg+WE?czCwYXuxWkuArCVRB_G=@+F}Q@JDXG-_AjBFyMx9edh!QIYj^O<@xNTO zKk{4+Hc!rE9Q-<_H#JN1&iFMKFd{!-Rd%*1rN1yFg}dD;>00=^0o{rnvrnc9=bpVY zJjT^GRlZ3y19P4GSHdN7(%hBIGG0-ze$>UROitd$H5WUeSV zj+C#L7UnzQrwT`*N$SN##DgW#_PHx)^2to~_?nHrH;ktJ$=h07%yE_0 zw@IdkBfO%)vncJcs>qrfBTpaN&C-6m4>svH7}!6&uivg)slL5Q>DXD z(|U3sg7&a_h*sP!N`>|(Il=jNr&&zq>eR~xx$3%AQ+V(p%$2sNT)2Y|F`zyvot?3r`h(yJPI9JhP!Nj z)oJ^edX)$3XvryU&PFz}W9&+!2r*N)v4QjtlUOFI14kiC+@iNgo`1Zq*QC*v$&+6T z0&w=DJIGcAL-B2ivg`VOxAEq*Gh(y1UNfw|cS@R5iEM8yc&G-cq?KFC*%!p^!xIM& zJxjBo?fP&|W0&7(bai8L>Q;mx@!tBz27S)<7stI@+pHJ{z%;BBrv_vdhzpcYTUL5S zE!pJ;cIRJGc*M7w0d5qIs+Cps@#8&m3iZOD^4#({@Wt1_UTv{dlL+qC-_qILdO0Vs zn7n6XTTv1g#GDjrS5v!kUJ9j)B&@ONZAx4qxgvTkU#HZrviQ^>O{C zk0qzq_DPKDkm5|8)vj4^|BFPtT$s{bZx9_kMLm<7fkHY;A7*15ziKru9Z6TSepG+B zl)5iAfBkKsKxR93SMurklb*8$K0VeQfcZx4k0BBq!7zq8m!JY!x3vMkMp&d|WIVy( zIzx74GX$4NS0JRF6iq;XAr**(f3B|PaDM1a6q=3>aI#`v{-GPF0`e;hGTzkN-b!e_e4Mj=L#*{;S2!FI}*VN%NKIGYscgaikt#4-Pn66qA(H7?MpJG1p;_#yIs41ee(8hXjA_et~=c}Mk>w_Gf(03niWuKSv z3FHzE;ljx2=4_;HDkkk|p0P_~yQrk=xwBNf8ExL^y%CQ~Y?IUs?Pl!CeZeUqxSziH zj)h=RBH2l=*_dp|7hD9Z!QEY<@=5Ok9Q4bf?t^g3`tLjiskl>5%SoOC;y=1lr8^8B zWj%TN6!q-Z*ctS-8Nq8emUfDrEz!oJy;1=h}hPVhhW;ihbC& z4+cpc+{pDiaI{!?bCs!u!6>#vLCD}7hMYVd`G>6)9)A3z*<%i^ul+7AYiDV)raVw< zzWn3iCE{?ajb+Q>xv8YFnu)Fqo-l&WLJ6JW4;K~P!r7lQ&bQf%wvDIMLz@$_+kt*G z9+1;Cm4WwaQ)~K|b^1b2!cI8xY8KI&-l+tckhN+Ogf7sE4204L*pUT5y|9ZjL$5Xg z$*fXB`YHN)GO{L=r~YqT?-&?O%7@qM-uGkASnD=xv~jzcX6hKa#RzWCmz@&d(&=3J z@OFj0uC}#qw}G?BYv(cNHnIIQ_IHWP;P0@n909tm_w(w43|$&FtL56)H<#8&3dd%| z^q;|==~Tne37{>qR)cq4$I~&@>q>{ZAUHAw)OGtkVJ)O$*?B#`a6bdqxJRm zO90e>2oHpGnNfN$q-ax}RI@ig0nGWMa4v%*wK+u-<-+gfM54LHm%q0S%|^a?tGBW)A}*Q+D(ezmp+@nXzhnp4^C}vu zWo;kmxPw{tuWe3zK0IyGZBs^M$EXHX$5(iihFb+rv?z**xNbC+<<(``_g@R^-DuLn zC35LHo3|{@S$>)4pgN}P{=>IkW8qoNTW+A65$|~{jNDN0+|FYzj4f8w0M&{;(JR~9 z=cS`BTGTp)59oj?q_^KaS+3~r;o;C%Jg~7I9_lt9lvYX{y?!y&Xx+au6rvFzE}^ZF zmSn>49cU`zHuJkg4Hoaf?`veMEMK9lB}!uq?&yOamBPjkcN}KMcsRfe z-+8+gr0H>03)g00?&XvJcL(K31Hv5sww7s&Y1Xz~e8qN0tAB|_95RG_8FVa&DScrA zTP8EVv$EthCzW-4`7~3$kJzRwRL0ab{>Fcq$kPZ3PJzEd%T~QtY!uaYcBHV9sexe9 zVF@+%#7eOX*m|Y$TRl6Bl8|utOe4esn|@2g=oCbJ%n?JRwdweR}tmurHZ5 zHTNzyO+&YH#wjq?y%@sS2nT)Yu-Dgpa2`!$k9Pl6{Lm)-TMSlv$X+eACJ{z~#YX(c2Vzt|uMS^AS#)kQ9>cs-^64c*DXGET=$S4Je{=MIYsm9dnI(!RO`t#%F z>jw_j-Oro+Hn#)oQg6^Pe`muLokKV zDCu!F10Pt(rJV-iErf;Z(T=`JiW#=?bf3j$t_!v42>PHAJ9@9rgYRIU(vuyGu&uMHY9-Rdc(7lTKv@8Y_S6MJuDmSh#o!)X&4YU`Ig5DeC!N zXggQ?u5@rQAJkksgJXI5^{4Lcx*U4JYU!)VR^3h$-JNOyC0?)ZSzW3%bs~pDJ7}Vu z_4)JXw$$Sa^JLzWX2rV?eYa8eJeZ4a(=S$K&hQyOPaK>(l#2b>t9;TUl}k=7ThH`h zTGb~jG1h8j^P9osb4@*Yh7yijBPVI%z;j+dKuEKV6@5L4!O^ep&t2bSC{P0ZTcXds zzl~CSvf|0pPCiaw_ow@m-WK)WEp)>7q(U%{+=9{R^L9qCg72(~m``2JG#ld#R61&* za$1x6Q_+s?+NL!kCSF?$ekj!qN;XmMyJ^jJR$dAz=()_fDRzL&<>ZdXewP?XpPYbn z7!~L{*r}3E;U$@&jjeBbx;kW;+_kuop623d$rxZr)*Dy2wO-Z7vl5 zJL|h%(_LI5t?bSUCsEA8vfUaN7^nb;VCkOQZ-!=LqoXq%F}iKongX5hMExU))Y7gIwYTRoM zx~b8Pqz@i?p2D1O(mK>@*rm>v_W4`2*Q}b#P&~`J*8Bz2OO-$4hD_JS zD!AO7#3!~hUY?s!^=Wmva|ntO*fR)_6Dl0|Kw@hmCAJNyEN4(|`CZ6yrSS37>N|89 z**c)xG!W06ijgrJh*3&F8`m4*wzlA`m9eu99_C)3*CS5)s0&-n-+A(6G8K*w)UaA@ zF7PA=N|+0-e)B1iXXtcco5(*ysg$f}^75rp3s=#$ZnqH68v<6PTac@6cB*yr0Vt$q zi>xxNqd$bhJU@?V;B?wP9QI~vWUI)DVbz{wa8`oM{uZb=BqYdCl1_xxzlKllfx-^r zaE3gU=7t~*mi8rufR?vgYDK3C)<@KFG8NVpVy21JS!jQB$>FY8yN`Yo4&EWzn~gIw zIhN&5mH}B5JrfhtYesP$L}PETp{lG``_p5{kkFX01bYDz6 zm66W0AJ##I$ug{jR7f`YC;a`MltT+IRL}?jJ_l&q2Ec=Aep$z<1K}Qj{k0bTu;+@J-7DI{L8GRWU}LKb zXm1MCqV@mL)t-=1BT_|1W>3l=`OGe*mHy&DT3ROG+W!8>6tt76$9l5c)8&Wmg?{Ls z0oetyYw&7V5u^Ybxtl_c2ly~)Fzg7JJ}L!Y!PO>;xK^liu&CE9BZ9q)#qwlryLN72 z*sH3+#sdn^uO+dIC&Ryu8rw_Oehs-pchDpG5C=z$4&+vU9fuTV9wROB*Qy+Za6G5p zxhCd2Cf{Xzvz3dp)$G^jr^@P{J$r^aWHS=n-vU7nYK#5^DO#stIC0=tke=jP7Hal6 zfinIfha)2={haosT%m03DK6T3I2FEg0n#`7mqP^TH>jD^3daYH8dSAz)50toqhMBp z^y*$Rmv~e1pV8Qimu;!Werl>-`M|G|S9kn~9!Mf9BMUy2_N<$LXV zqT(r7eGT*BocC~9(Zj78xsGfW(iA5epU*SO2+|#p4g1DgbMy8>7VGqLOgya27)Z&- zs6v?qdgI<#ut2?8F5TWalm7Q>O-o1h=bU`zH!?3IHQ5`jPhbT)%Kg=a2u3H8Fd!;f zE&*q7nC0RMlnhxwq-C-LANwap{uRK4RHsh;S^V&Padm(PQb$QiP?mWCJzFL_$&erC~)9PId*m0)b8$#*0~&1er< zK{X^pLb<0DDhMHss_7Lm_Wf{!7UM;tfx9D zPwi6IX2eh1h{om)P8~dBSD*DaLFLtCdcqB=vl*Su^OR0yJD>B1qMWA& zby-7~%Trh+X^=OM3b+pPGig@+&1Uh7Jvw3t_j{dH;YHHx7p}M{)=gcOB3*vg_gGro zJ=xio7w_9~9oXnyd;Nr8St0a2C#W1N^{~Z} z`{xG_g-A%AqV-qy7G=BHOs>IO`NWbRQUw5z63H-Bj1Yv9yIX3AO7v%mjG!gLz+gp^ zkMOKzI6JE&9zK!`Nx?37c`YK=aL3F?nPS2y(Z{w3K|CJ_)GD?wb~- zMi3g~yiNxwi;VoUD7c|00W2PLBhsZj0!h#u@Wz0}GDpdZHECyj16i1A|6Z?Q_<@uD z@??;5glR`7oB6cxp#7Y<*OxN-DKqO!7QD;h!(MCl)k?SmH)im=9|Il+h@anJ61^wT zvWPlGva}*Nu6Ypd?6n^q^;{X zI&w)0TG^CzMQixJ!d-eXOWrH%l(FU5+@KyoP{H+_mpU?>VM?xCyj3r;<=UFx{`cX- zYLI{j7zRV;NXlr%6fg!7AuF%$Pu89t9N+^u`|N)Q#Al%Wdb3fWc=GOM*r5LC10T#H0+fA+4N?$@ck=|{$}5V-G{QrOZZu;+0z{M zCI|Y{kz2{Q>$~Zy{g~bZs8y)r32QV}gO<{0Ea&aeo2Eb0@QwIxs4#43y?LG5B9^>f zVkKSqk$T)yc1|IN=JU1e^4ga77i2~%9zWoEr^kl*;gx9<6o0m}?OFwvO_C69Q$opM z6W8wMRHlytq&2BOp{sQ=EVT)Lj_f}{gO9(VloSw>7XRpQ?~V_h4@fv%)Mp*4L)9Uk z+7K|j=M{7EV6=H(%Y~aY1KkM{JSCxd#${7qi1pU;O-Dp_MA+cS=+w)RoA)xB)4V8g zNr^!}(+4m46b|Zk$`$SoE#)SIBvC%ea`9pYaMu=zL;;jZTaWCBRL%HBl~ngOxyLd+ zT5REvD=K0)`Nltl%g=6Dxgv`FjeLn6n<4i|ecJgFjbU5!4GrhX7PFeP7vkv;(%-Xm z8ixq{eTHwC<0U6<%OtdtlRQMhlQnj;KKWtgNsZ{>|CAVo>rNV! zzBzW>P>j-sBQkS*qb92?F+Rs7+7T1!(CD~oKJdi3E!U)Vu(2kh?v4{?#-FBU?Sfp& zVa8gWo%Ro*SKIBrh=wsUT53!rm79e84)d@Uxi1b!!f7aJ70_O24_!0cPZl>iAA0M^ zNQ&>p60f>ZD)HRAX%b#5j-7-Yxx7!C5FeU^GY0~M3aCz;xbGBYH`)}72RzGLQUa|q zoExzq1k;6!;2@$aUCGw=1LE%@0wzGoMz(X#d~$P;>boSs!?;rQbTvcquDF2Y)csny zlT2h}yfvuG9#QJi=V>>9&r>xaCntx46e2*@fo~fR6>os$vLvKyn95wb2p$FC&5}s| zjlc~^zI*cI2^EdYvcsc4_m2}S180;P>>w=z*RRuTsW$;n@Y-{2;GjY@6t^K`+4}_o zfRLmG+!N`G7!F`I07OGsS@}(;it=ILT;70Ub5&5Zoho(j0OxY!#*O0l$Ke*(XFX-k z9GsjDq;z!n#5G51@$}r-f7hfNs{#O zX0d=GeE?bnb^hbglc}w3Y)nGsR0q@w;lb8;%W%-_ERZ;$3r;Q~^dVTyv@lFkJyd&P z;IJAR4IszAqu z0!T4M4eEUb;cgb7!I8H}TCvCuy{5V_Tn(TObjU}#cwaY~wgTZZ0VtUO&384e`DC$1 z>@Wn#n4tw2&*11^5rehpEojr5`R_`>Adz_$z>+u^;OFdwQb$XGmne~ZC>5ZGBgu{+ zEhL@GhDr-a*I5M2L*}IT>hA=oiOC!4rxK1<>;Z!el{X9Ats=`Cf}fOSk8zhpnkP99 zR!M&l@VeUKuJ1#{bXdk;DXLKyVgMiCb)rI$Tv%eIi*+1-hBKtLp<%cWit*6poe0Q& zpsvUR424gOT=5eOK5{t97rxPvtZ>q^#a%$j{QW_|4{K_ZQa=pV0K|Oqj7V4xLPj_o z2md=&NXY}SS(lL}tvNp4afT z9B`ndfl%10@7%)*BrqrXsH&4nSIA2A|lYMM-P$4H~63MpE^UC9Q*B|^hQFdVGOfnS2wo{!w1 z{+zU^AYas*4~XzM(ys{|KOe8+1={?9DAIWHm$$^?$?@{$gq1rApnHJKqK;D z+t`wVDWT-t-0lRr8SL@V@s^~QB%U8obr8?5^Pw#T@P3L)o#(P4utAC(#6b1v%vS{b7n$Tgt$7@L}cC#dx4)2II& zFl-2HZbQg$MSKE4Pn$T=Z&kzaqU2^&D(ZU=c0D{nhYIrFWVkPvU0IU?owISds^YG~C zWU~wt0f_u;Gy|I! z)nutcAGd-Iv{(WzUb&)%Dn$P?aG8N^bq66hmnT|DDtRdG3&3UZfHIi^eMTC?Yd(nc zND9uNH*~NfgExeD@_ARv_4n(%+;GfsAtV?FNGUb)!zL#k=6D-bh$?WTU3P#V(%y1Xa+D_2!n?RjU+j#j?zM* zW*k~RldLZj(oj-CzyV4_T3}&9QU#&J-VC|}s9W~nD|d9@`!)Q6CQz$j0J;zXu2o-C18xsIBsIjI!eMKX>bw3-UI?rS$V^AT zmua?nK9J5JB?&r95Ugtk9xmi^{QozM0vp~O&hZel6M*XGPW1R8TVaRY?bWFW%j{-S zPyy{bBND#wGSZ|8Bu&Z&`{@mAM3os>C82NM-m%h({|#yo^?!pR!+0GC21AL}f3df! zT9Euph@PSlC9DD*7(TH8t#_i1>Bub5GV~yjgh>rT4niOtuqUXT>Yp6|riuRzDJcRR z=;kF<)kC}w;mcTAlXNB_(kg|F1^|p?Br&2@!Vc6$Am>&6D>(b9em|^XK)@aZDg-0- z9YYNV3UC49A(PQ<{2VOtI?|BV6nJbp30Sn;l#q}>`!PnJQY$ISh}- zL-;o%sTUw`2wTYML_|r4$jlUg zuRuq@N;?FUV?@D3c1;LUUR6N8NrVALCILVx>K2Uscy-sUvdYvq)v14)XCOkP_#7nEW$tE#S%c6}6daE}0S zh04pw>PQ+%1ylsW-R2op$s>30;lqa-24k>!N!%b%@$3+oh1U#d8I>YMhtW%>aI>)7 zTpDW%hq@?)ZwL-Hf;-lL-3VMG)R!q6Qak_LF$4f9X<(}%t16D3v>&SnY|X(jx-Id{ z0+tZ?YCJ{V`bmzajS)#;_}1MYz+>Sasqa>1dpI!ZTKJg%`>F`A0+ypJAcqJ?gnpm( ztG)*}9sxu{JD`ccT;iwoz2}71ZE!9$iYAEzkT!P02@GWYmyvk^?8OMmduKoy!nVhP z=+Mw)K6maq7*A(J9n3=s==FZILA;at#EJ8UhK8h#j=ss50ZJi4{86Fj#>B-QSXmmL z=k#oXLPL{4Bi;s-a?1Vt_ZyHRwrzm`21yAEljOKGtm4E$p}sv=zI^%e-82vAlNEJX zbU+5?95A_L{=F+`b%c8P&);Umn>EFt#!}00FocDn@DrVHI3tR(4kQO8Vs0S1P&QmYJYJ#l21jsVh2dUEv8Xic= z5y3h}!1qJYNW>3>bUis7D%hC$l_Lf5jVu4183kRM6^vP$Gg%tCmIbGG zIIXhG$|qH_%*8+LJAVAwGnQjFxb19mF)MG^w{tMEXCFT^z7jc1bicZibI-|Xv>d}< z`{U!7QABc2(0kveu~uljngRORx*qg}A|h{TRc?eT)WX9aNPhqR1^_|xkj1fys!i_R zVdLfwvxq?O#vT=3IRQaIR65oM)vzJJ7`E}+>`u?lh93ab44;CUu03!ajvd~b49|)~w zMr33kn9#EH^?|tu>csPNt3{RD3ecWc6N^n(lvp>`_u3|=r=_WAXlRTPSQT1fL1zMi zU^Bn*E-xDfczmy4zedbKlDo}^ zc|OMRc&*oCEi7`xa5G@FUjz=|wX<>Hujqq&gAnclrVTV)h84eOUEq`aUZJ9GbA+Sh z<%H(+2-gS9ODCC6Z1zBU&B)DF4Ku;u_CEH$5&zS33hL-FzW0_bA~z)@kNqu69$V!B zr$-h5;S-%L9zuqN{X9y9RY^%p!&q5akpODwfzN%g9k@}xwOEfd-H)qFw*~n5mrJvo z#^^p9uiPoJ)*s7RzssANp3a_SP_A>-PYMi>4D~R7sdeFPP5D|k%sQ4<)@DI zSQkMm!^X$*ySy${mtH{V4RvdVD2H2B3p0$-UB9j_9gHfh%Eo^WpPGlD;t|CSc)$fi z^fmC-q662rJrVm$x9~x;bLFN!otku5-&_Zr5_Jt3F`VA;0H6~;0OZAi87UP79{1h5 zSW8Qh1Bc0;%c1$Gz5)EMV9I-R(8ED;XCaW>=Z3fhBe@U1<7AtJ&D^ySDZqci|DiA% zVE+9=PQ$}JXZcUcuApJ3v-ubgOl&N`=-uGVi4~)z?-&YxFAv6T@WsXD>Aa>c+AH^w z^@rZp5inv=BKG;V1E0^yfu+G~3u|L>-5ouS$_v=(XD6Y}HZ%mN^ZP)cHH(S|sS5$B zxz#&tR4w@yts5V+l-b%W*MH`6qJlI~&@1O4&PGOdJ}o&}8ln^sX?6mej&w;!g9|4P z?L|b#qU=!xJj7gX!=5k{m3M`Og}SOipO8k(!9Fmu0blvZ<2TqU6D>)=C8NGL3zoz^ zpTkvq$==f<&`?`OYU-P&F*Rs93?irw^=K-WXpddIXQOqWpF#>CX@0Q#GCj?Zrt_7v zvdU^{X&JViZ$JO%Y3?3`p#*HjBu<{Y8O)b5anp!ofTKAKy%y>^$^8V7L)H5#c-Da^ ze}_XWJEUfa_Om+t>b?#YiQ&DFYh?a~_6C`Es@9!5Y@ipP%|IN*u~DD{yb?!UMmjna z%p$sqi7Q9|$_#Off$bo{rcGMxFna@WX!hW`n^#&YT0Z~z@Fv5futbmus9OM7eud|> zhd%;ak^HZ{Jz)UVbG^zazWh_Fl-RC2a|i@6@3n%00vz&To-2~33$<+pb|@rT6pE3@ zMOv3)fa}_GwEuR@)smWhqUDDUJnd;m4l`I$aFla7_0O}U{_nFSD6=I3!9OECGgFf+Dc#LbqHhL>0iYQ>>yA2=fqqDa19EwESpG*xWGA4*Y*Tx1^;cv-791l2 zr;p!t(O86j>(>)hJb;LXjyv5jr63NryQD!JZ2bcIBs7phDgl(~0j`TMAjdAji~TE~ z$mq7mWh7frCzpMv4nO@AhhQsWv&BY#2jBVuqF`ioQ*3tzfX|Ta4>DpBu&afap{S#( ziqO`^28{}!kLN5L@=p7mItYsyv@yG+WZx{!wG^m)orH!6q1`iKkcV>p`t{0~K4M)k zq*0(|9?uS)JRo)fJtWC#;%QZLIE}^@xO-@b<&!a5{*Dn@m0D`(oLtvR$ z&9w7j=|<5(_VWNCgiiIAspqA?fZZf!SRJZmkQQ#>h5-d4m;&eNH1v*+jzIDKfL==6 zt`o$$_fyFHZUH50=1lR*F3hBkVuPAIzm}rV!gS{^52J~7o%KMOkSiB33Xh!FsFs}{ z1+{Hi!wW$39%OgCKs6wXES3cI0X}R_#yow# zH@Vw-OUM;5N5M8Oi#|=h^TWB~3e5nF?|bP#n|vA)XRZYzFxUGC5D+FNNw76%0-hZI zPO&kvN~rG})c854_Mt$;y{|pHTM^(VtQmE8U5 zvwQLChhP9GLSbhgb^k~DseFchzRyl7{ycOsDh~CrgIGoj0;OJzakx?U^B!?o}r@y%HMsYsohXNwqpc{VSpY^ zzWwgLGZlrJDO+4&vQB~EtV$%_z|*k2D*{VxZlTWhv(Wig^&1#=?c7Y|*nr@~B$mnD zFb~W-3(R(1NO*M8%Tuu|e)qofJtcp4-Dj`WViEs$b2b~vwc{~`Y?e01QpBWVijBXr zn0`MQdtT{A#Qk7C>fpEBe!)*!V1Q`O5Q#*z(-|8)AX(&3E&zO=%$p55S>!_lF63=` z?JO}Z4|>J4N>PeudP#0FA!~E9uS}g%(j_JF+M^dA{0{kSDx9M)#oe=+oQhl?Tw0y{ z(8+K*+dB6BFM$ZwnMUi>u_uYmNw3DkhC4TN27;(sJuBzN;6`V2BO)R~Vq&cSXJkNb z8PoWJH*#FCH1%+O}FKAogMzmg4w{@B+5IW7a?@07Hx~;4W zEq_nonSh;5FjEpAy++6Ie%>QICMI)vc~~OTV#dC&dPuW|zvh%953Q4Hz<_G;a~kH_ zlNCbutA#{1qv1HJ|1Ns>$Vkiod3RV9sFMN2a=RJ!t9;A7UBItir=@klQ2$+or9Ab6 zB_AGja|f!WQgNxUPWv>Qwa&4EJ7Igd4EF1MT%5f$8})nKAESIhC_l&_u-`> zV;a49beQCqot>>n(pRL{qhQU*D(CD_;eT+b&-v7-Xu!Tzz0#L~fz9h<(b-E)V)~<= zH7zoE26Fz<`@foEjylG^AII{X|2D(La^~Tn`fZRe$6(jU$=>}1(ZjMDsLylKBpW` zfsPqXsdYiPzs83wZN69Y161``LzCrGM>fxIxng(q-dz{ym{nD?O3NQnD7k+kBtk!K z_+e}4n=r1+)Mz{pUWX4QT{O4jZG##ggmL1H*V{ZI1}c(1SAx7hULdV(Vy+Yxm- zbxI${timU1{jf_c2{iOwJUkgdw7XEan-Q7DHw&P}B!J&)W@%{dHwq+S+4|Bq7PH9L zb&ZATa~lF`eNXwR9f-4}z5J^^Ga`CQL;s_qqI0Hdo*5f!*|kFxA}hY|#@E^=*_e`( zle_*+8>0!hft#?3jq0F@v160RNo^|q8v4FA-$tCG32AV{93l4-e{FlHIf#uGGk|#! zavToV5=Tc(|7Xx32>EA?QarvJsYEoZgP=G0)8eWi{PUN0D8G|`?&27Sgkx0W1U$g8Bk)9! zOJa()9=gu@7o2WrD776>zD~T_c`QMzgYW)RDr|`QdD@4#Aa;=!mZyiSpqrDnnvbzC6N< zb#%9iuyoECkFKGL6*TC~Q`DdjJ_eH_%?guDx~^$mugwf=5XVs~uYNvvy6@|`52aMc zrA%;6^3v~zzvJlB$h`t#VFV>6xPJ%N`dU8f3}EKk1cPi=ZqX7 zghE-U6y`;GP7unt6`E_?vf3irZY5I9(XYYQpo9LB+v=1BkXmGqR8ji$$XN`&n%3%O|C)=}g((6IlH$%WqgE@g%`d8qGP znS#h)=hG6N(Y(1aG7!nEW)~1VTqpoqo2K~M*|QkCvh|Xq|C;z2Ku3q(NKQ3XWN+iW z>jbm0u}*9OWv|YLS=8}ucNOgH7a)YNJz9YlaIQ-*y>}BcGBR2L4LkF1E-?jHh6Z0f zOP;~N)4mf2tL_B`oWEZ{m3s8_F$N=6kp~K3SRU0!=2(fII^^#)zlc=^`BeaHcQE~% zW@&_P?u1EGS8npG>z?_1Sa_E2J|WyX4DVEQp=sCu_rqGJ8kpN_e-Q`-lpZh(@pW`n z9lMv2=jSG@`aZFn>^6ju54RBuEn3S+;Wo9XW8N?sMB!uBNJ-|im-kSLvphK@=? z<<(p{EpGk9oOhRw_jJU4xV?Xyi(PN&!{TW@Hl;1z@36tWJu~q56j-z9@(yas47p)4 zv-{kAV*a&IhlR7YMv+NQ&gHsyywa^HBj66@)QrurXSJ15N;dl*=^nAAi4f${l3@~% z_q~^zpD*X>buCmwpeN=^!rfd6`d$#eeIjh$24$JrR=S{g2Oc71S!qlKZ^(xqK-4zIJRZ!Fl2Be2$RykM2IvCtEU zRkBJLZTPNs`;~4---439SB<1b$FIzUv0ielKg27e#QVT!7#+Y;> zlSex1>7LY)j%`gYE-PTQgU35US@&Zzs$#Reo6tTwr`I<}Io?G#+rF&*lDIM%=rC+% zI$pfrUPC=!cWIP|5Hexd@@USc?YRBnd}3>~j$QL>^aseDgjY{6(cRF8)zY;%M1%%fg^~T&6eGmU`})86bI) zZJ_R&XS)_ol9L?^1wF>{VsU_1Er-ZeAlM76y1JIuMa+MD#?Hq{el+G> zpOu?iF89v2@Z~A7-DC?jd&gSX=kC*HmBofayTgHtZXO%m`y^E?GYo5ZKHl-UmE^WA z=`}6*buJ`0u*KC-L?I>0>76_9cT+A}cCx-C2FGsSI+#+6E-f_p( z48=vPr>1$h)v;LIF^Q^Wl*B$O!v^k)zaus^Q#AATRXx%Y4Ab=vq{m)dfL4xQgl9GqH_ zolmK#Fu)-z9ECB^b#`xqXl-V`)oN`yJyXS^KfVr}xE!x-E!c#TyM%3>)qzv`j~YA5 zsHa7Tm1>&_K5-_zWOaD1q9R-Nim`dq$}0cD_dMSRu`s^RGoejn zFib7Fco&}~D!=GC=SD?06;yriJ3p6(X8U-D^A0pV%PHL`JH4_IWuv#ee|xi}WAh^= z1Ve|;)&z5~AF$~wlj9%`tKlcpIhr~~mHdefm4<58v%(%TpRb5Doy_5s$5-YkPDyq_ z#!Niz{$R%qizQ-ZM>}>wD?8{O&Bl`d#gOReq=d0XiNps6cqNdgVG^CHnJ+|)9KTH* z=D%zBB;~Z> zC}TsAuC~g57OpfzpHSe4O-QI?mS&v!%D9%%t$5D*d;u9YW9(NWd}>moR~6B~%O>x~ zZf{TNHc!)dJWvrUC5fei54f6NSGwMz+?w)=o|<9nN#L+Hh_?v-HdUAOQoZk2rdD6) zFV~+Y1DErbzsS!`22$>7sk)pWIxYDqWM{r9e7VW2clx*DLyOSt@|o)ju~AtZ+*hUW z6?rPLhAZ-+nh+Jhi+`q; z?7%y1uG-$Ao^scT5drc8QlbNE%=r)1;`cs|OTHZgxjkzJu|o^R#87)hx;A>I>^?rW zO;2!g`E7POmbXWoCu1HlHQUU3D$jjf&8hHQXe`|hsC3MBZsqd&x$;?mV}~H0-~S8R zZHH~LK-?1(VZR1lk6qMxJ#ZIBUx_C^V6s|MM*_^cNM6feM}yEIWYHdlAD^R?=opJi ziEMo*H1Jy#KvjZ*o^DVee09ROc))uoPBjwB>HIdX36@Q;O6a{Qdx)!xB{2!J% zEDx-suhvV99M^qPoV%^h(zG}hNv1Y&3*Sy*a4v39JwbfU!_!t<^P?qe^=kHKT%AN^ zcKrQ_a|LZ$6ziTab;oFr9617!DgVH^?O})#qU-J*z9|-Mr<6A=>+V@yIeEA7l?#t& zw;Cn$m+6EoW}_xH#`-+tUq_O&VuCL!&@AdbEtunpal}Y<_CheEyA2X(`Z&(J?*G1hYF;w_K5OPI=X%MvK@j(K!%Zoj|0 zlg4;{6Jx@mPNS9XBCbrgG6+k0??dfppZ}Rfltu(br!*LywBLU2>Rk3%bm`fBS?{>Z z!`-p3NIyQDu^8ibdUXQbSBBKYF&5i@CgIBmof*ZS zU_FLmTsozOB z)d`}qCnaIis8~S0LI|bb@heonD#gv7(gezfdlK{ft$6y0;UMdCKWpXv*3r9wi4e8W zTMgY<=PNoDdWpL|A%FOpb$!pwK}k`eM{k-8?_rWyE=h1FcP}!VDFv}mhia~D{LaQ( z%F_BaDBF&c2J3k$9eb`K$lZQ5SGe`%qy#f&!&v@dti4=IC@{7b7qLiTnM5Q@ zY?wy|Li3vA4$Opuxh~k?N4d`Rjp!h127O?pts9 zVe(loej|#sD(Bpm=T^!j9jEikf>;KBU-+ypw>z>3@4bX#@tc%VxTQGDTTfkOeyHES z|Iy!HUgM5>SIXFzuV2l(+Vo~PFU>_Y6yYPf+)PZ8k8D&N9DH7~UuU&fYU9Vq*hE1` z$K-dTu++lBoTY{Ak?I{&XqOenlI3b9RW#ySG6dBSAz=}1_)IfyQAM>2N z)JeE)byi`An0%tTVAi(LN>3}L5{}%qeO~gQD6T{J?$SS#sYn`A! zUMabk<~scgr;FpQ3p1}?QEd;8+Hg?uIrbc>6zeYq71g!Auw`^qO*hgo*1EfM2ogSv zRAiVO`!ODVrE^lv?V}x%JL{0@FzDDPE;PPwHml-#t02aGLj!}29WGuSll97LlpN*7 zw9wf&N(NN^(T1n!#ZnAiL5fiKNhtB)-L#y0wkf$v`WrmOC387z#|__+OjGY{VK)d1 zh?Y6efjoN4`)QPAJmXg)XUWwCslv+KbWsehD9xm@rfX}@w%gY$Q2xrTwKf@|z%_8m zw{fPGqRf+i+|HzCEFJOFxAPjBLgTFrBji4} z8JvwDPtrvqhmFuO+0mNOs|9vti@%P5V8M9EdLBQs*OQ&?I-Tw5ii>E1mf>9gXQQ)Z z`pLkEbC|l@N}7)4T1nIbT^a@nVVad&k8R^~D&nbxSlh8xo=8+VO@>Q>vFO?Pb7 za_sW15JPX(tRNu>=PM8}_j4c_i>OiD(JwPj^>eG;3`SL?&=tiI$fLOXVfCfh-l{iO zrX{nr4d+5xW`3zSRS~myW_>m$wG=yol`7Nad3N9F=ya8eSL7w?h3hZa3ka->hI>p6 zqE?0p9QX>WN}^4rQBuHL-MGs}EoEFb%f5jcLV|*n=6&K;Db3w1n8nR~(e>$;li*y2 zn`q~9PAGY~zF(qQrA=YVXlPJ3F-?}keG6<-zh&~;-`_doL#ldXBiDAFpz{w0kD>QG z2P^3jWi z_kf)Eh5AK9HB0DQ^WD(>%`(36%O6Y9+1-`+m>-39oi^B1rrg<7z_g@@)j57zozuL3 zBa^dL)ky87zkJ3pgaFKx0rUTqx`ofv<&u@Gvg z0$xUief@Un+V5a$ig(D*DBTSYub;8Q&V2hUQO=!mW$~i&8DA+{SNm!s1{gTr^Zfk$ zY~teE{TzE~LIIw;_i@!Htygvo7mt!63(qry7B`u_kADd||LzcOB$z+{v}0&u_)eKL z+ISe%+H7)u`#uH5EiXi2zErGHpna6X0rDttulizjYH2>~+b?Ccy=|#N; zc;->X4kerN8~aK5$G?iIqq-cb?arNLoUn2M|-6X!&xuYrBN>h$?_39 zeaDggxHf!Kee7(R%8M5Z8(XLG?FIFf*>Jpn+Q3~NzqP8g= z$#`W=hVsv*Pv-26@GCdRU_zHi&rs9?FTs^OQ52b!e^{VA&C%Z~=IRE}9m~ ze=lQ_1~EH{nVCvAd59Vp987ld?m}sV+otDk?5y4!H^TEwY-4R~>*$|U{XSy6v8@GQU4a-2f*aKzf+>oV z`Xi6yvAujBTv52djXfChE|X~A-N%b-e23tf_aj$UYyhs^PkL;B+^)`a^hry*|7KL4 zKx51t9g*~G&hw%renBFTTcE#{+2ckSS4UEIc)uq0x1+~v+B5tvOk~o^(qV>cf-`0X!NK=Q3m-1V-XBotymH=H%Jk43 zGG<6HJpcJN2p6*wzBDw}3y9hfJ4n8eBdCt`!$>kXG2yer*CcNIzwUrPlR@_1Edj2% ztFO-#nk&Df1F4FW7+keT>&n*8H`{oY5rr771D z)w6AJ8FsQ0PzOY&Eq}e*2aAk{cTr^fLgfp;;07+zp!4TmU6uvIavRcHj9wOG^UxNc z#Mm@r{dko`e*A4aD4UfE(m8?EDM-Qvczz^#kP|B4h5JJhJk#AHs(eHEZ zTjzKmC=QY8$Gnwve=!OWkIGYkq=0$75EYi)Fq!xV`@WBaQlN>C>iA_GcSnwf8Oqij z)gHscHzLN8U^(<{+TyBIKvkKe20lugmR^)9tdedgQ?Vz05^uyGd3_H;wLm+sy%P< z(Mn~`U@w|E631NgGD?tH)Wp8pw8A~&t5#!2Sf-M+loUm}E00!2PCX>{s%_>~I(_|e z{#^Bxk=N1OK7~Kkr$(&nXV&O8;cnQ?u!AP>Hy7?fhKYs9PbBLuS*y=S*MfbT9N1U5 z839iUJbJ?wF1HaLdNNoyzoRG` z^y^|^2hM@4W#^k{%tl57F8Q@ss6xw z(%*+|W9a55EQidUN9J<4>l5qZATQERPQ`$9gMQ}|$1C?m9zBjqg0e@xfUt7ch9lA1 zu94K0i}6vnu49`nXR&wqt2r-{Tt7)`fYyKpt%0nva=Xt*t&U}~6R-s#^@QQMU#L>k z(xictlf!ookK{I`rVX`>`e&nVskFc^o>j)|{x1w;`YHnao;L*E;%lc~cE^P-52tYr z!Vs`TNo4-kUL%UN39WR3R++PoR!UvT=@V8KA8tXLGEac4gpI)4NYkcbu zW%c*009c@SB{8vAF#iwOA7EiAq!I8tF;P4tBLggSzCg>ZxsR?-iEHm6=y#i3b2m@ss6I&gFF zg0{Qni1}vT=~9hvTuRI>8WpUXmQ<(cG~NSFV){8t#cH(IroJ z=&3tXunlv1HP!1Eed1rjp}GSQfzc45Xa4QB=feb8dKVwSrF|~J(E{jnj=)Jzx=>*F zAV4RyB`kk_WJd^D0Ds;0xpln(%b}_4Z-=ly zRH!7eRLPOw;cuazMugH;RWONZX^!fRy3TMHe^N)$8rCOClo&9s4MBj!EHMGH-N|PUC44GaJrKi`Yb zVR66&+)Vb1oI=k@;+uL#`LAVsLbJ*~{-#NyB;?U;f>DD$L4L3QHV4u*SQsL(5Bw+^ zOfJ%S>iAIr$*aRe&q1XN#-l0#n6dwcjOIO$cj0M{X{jam<C*27xl?c29dvZGAGb<5!ZH#IeN z01goOj<)YUXNUPeExfs}zw0J>E630`s%^+NKA3lHgZVXo>6LS1{Z_JEICJ7hf?LS= zZ{Kv1Ou*OUkFWfo=W_7^$cGg6rA6~fS4fkFe$r&gplNCr*7&4x{Ra|4&B^JH{!e)$ zuqKUI>gpL)okm{j1UW@lt)ikCUre^ZZFqdI9Dq&$f`OL;b~Z@y07$Mhp1{ZWjRHvm zYLZ@nda4sVh^HRkhJ5o}qiIklgC=QV=!UVb|2q{~5{meyI$a@eFKuOWmo_$srS~dq zxHnHp;;{{m4?x|;VDvBSj{*{Dr6^UJj7JS?q?yzgKHE8&p`Pv-pj8Gyt`q=rVN8Wz z{9+@)5@>e+WuUp?1%Sh*J{K+-N7=YhcwVLl zbU%R3hy=^X$&s=Lo!>5nv1Sy&Hdui{;A$Eg$$5F4rDJ%Ne;@vk@(uJ0b|X9G1=~Vj zdAF>KreV0;eE9ZgdB?8AWpASgkyGdG^vOC7_%`x9=9RWq7fuU9*BY!D9j+R}1@eke zk^+1uSaSkHu%YJ4UXT$7$GvQscuYs(VOs`8%Wb#!E4#B@lj&g<#quw@A8S6gu2>-U zik)@Nx}$t)^XkFv4;o&##71V$>@L<>7lC{FKzmD<{dDTekL3ExVVBAkq(Z7^{G|{t zGKMj$2Qe7%xv>B7M&AInguz0yj-LEzrDri!b^c+(4?=Yj<=y5p3_1X%IxL-A8S;O3 zbD=QvjbN$oJ5s)l=1y(0CtJ3ZjxKM1bxjNnmJg8XAyyEA;-a>wDUhbn{8&&y15U%K zaqAMI&k>2g$G?z~^N1Zeq5YX?jfe5~q)JSN=4T#@?wR2tb%o4tGPaLp)qV}%=J=JS z_=~lPpy7_#o#wKR%NdFy>Qi>&ViIAGVyZ`i+uUtS?%EU?+OI}>bZtE|v}<-`39X(8 zWTeqs{CFHp<-`hAJ<(^8VpIrH`VMEDkFOVV3;jkkM&t@j=S8wBm{v6R=3*9?vnwseWJeD0M(UDnY zC#ozBsN>Bp{!0DZc`v@~{`9mvN5sNhk@NOHWCQ`4z9`ZO^osW1Ife`VFO(Wb?3#i; zFer$cPUY@qR>*ZEUz=XN=E`%MmQ-HQ{Hy!n?(ke_|DwvHN24)Tfa1d=W&%PAI`@j# zuU`j)QXo+42`C{9wr(s3$!}EFPc1*^G-;=@7%b@mzvwCN#h*;a@OUZi-rCM=o!!Cq z@XWVtR`@0G7?wIE*YGZIAypud)&jWG2P%u9Z<;VqrpU5*BGgAtpa>Xo0J_e9RO9Po z{_pyFSz!=4zCt1p(lRm&{_GTB;0pUKP!rX&EjA{`6X$o(1@5zhAM{MgdD2P-gG1m9 zeW2Q3OBU_|UZ?$H@sxx)ITF7ErGWL%!+R3$6~d2p(b+x;0V+7Jf7d_^OGm#W$U)+< z<^31GBw`njT;>gco&=x2NaXcs*1#KaJb=gJ{P#OPWeK|3KZ^Nzd2|;}0oue`k&llL z0@i7!zvm=Lui>Mn4jvmPgkYh@y*OC|bi==n;ci$-R~M0kfj=a6XFXd?Ufv%`_URw) z^xTo-7~O?pD&9`h+`2Rt7q1{ z=(;oLKmH4w@v19<0N}MgUM)gV*@>dyTilL|I>7#u6N+v{d;;9Z(+!7OIsxRE{)NKf z%ulBD**qOl)fBCOee z*R)aycbio(ArgiPXKiggFO7eA1yRn)+_wx6Gp#@lcE&<}&n$3KyMeB4-i*$N-BWXO z@SQQO;DS_jbj%(7#3na)CzhWhC_Elp+W5o-JuR&yVwE8NGw$<{9OvI-OG>n0ZYDs= z=d27!{{-80R+VP_qkyF-z^)Li{}+M2P%Et zpn`>{P`^nNH9%t^KjH6d3HWv;3j%D*%H}~nVvqnV>S*_!R5${IN;~h-(f4$_%Jd)x zgfXEP*7CoH4A-J9ID7I{8npHPSuyDcp@~2O5w#6oa7z^y)&v~xfHn1x@S0RE%(hCpu7Lq4Jc(4mDv4o{ zxbx?rHGOUEn-gMt9vh1Schg`{=a$=Jnon!Tv5GI(2$hdtJbT9HjPm_NY1_cAE;V)c zxks8rJ-O*AX5xeS%<1nuk2kG|Gku}RzRE=Rl7fj;^elbCPpVI!R(B0WDPWe{-JtRP zl1!aj98aRAZM$gT{lTVnxpjf`2U z(2bRocH3)tA5Kur&WohyL;U(y+e1+jHZpdZo z%FynyyV7|SF~|5F=2MW6yT47NR^HQCgKDoCM9%`E7}^9eSK;Ua{}*kAGXk3fw(DT3 z!~K;EU?#Sbk`kI&jn}CKByt28fH4K;{Qt3#BFH=#PzVTUgDeANR7vqMUQIuLB25tc z-G#!YT&9j^4C8Pn+h)7c*Wr?%kb&~lf{}Cji0BYgg=B4D`4H&GF8Iv9{0!_d9Y`Jk zQ*sq&Cn5bgQg`~k^rHdlo{lGQpDlZ z@#=zRR+vTq4(JfcNv2*1s6!-Nyvpo@{arJlpyyij+x>@4lCqADsb5obvl>(qXNXfq z;C+J)sF>-gIIz!m8(Bk&O~y^3GqAC<{#}C_Sg}+Xcy_NKycA1BWk#Z$NMa0bNfdXf zZ=jC$6x23$;2`1ND0&=EtpMDn1C3Q0^0;;+CWKrV1dvxdl;r!V!*t@_v6M)GV$HvO zntvSJc*I*U8gsyg<|2(3MfZyLu?IwHkmwY-`&KOOj?j-Q&Y_ruIPCLhne7W9i-@cD z=liQJ&;{*KYN8 zbu9#Kbdc=Z5p+I;9oYpZoeTU0{O)hKg#AYElR0?I|G8(p|J<_~FympKC_CvyFiwSp z;_e!}DMs}#bi0mF&c%Hy32^WCqpMHj1~72bKn?|Ivd+*w`I*Z!2&6m2$pq;wBYu?o znHIf#c@%oGA3qXzDB-D!0ck$dyuTa%N>-B380WL9sy&Y!8(-Z<&JMow?-QerB49Q^ z)G??)Of=*?$2{o1yO7J&WEb(FXt89j^NS`2A|EHk!ymw2Zf(_&mGvVbjFLF6_zcLR z5WRN*+Yk(cF)pTu14=9<0okOc!R}NQTGV>C)4{F3 zH33TpJRvVAT!I7_JyJ*mg7Y-U3uMgD-MU6Zln7E~b2)WnK|OO_pt^y?P_|u#P+Dep z7k;7h0@|%fK-q_y%UvX4%MVfvvUPmG`KJ7b+pW3}2?5%OD07C}=Z4V9`UaF9A?W)8 z^j9+b;czaqMz_1pYtw1I|45MA ze*&E~oZZk1j(ua26a<3R*8J$cu0XngZcPGCaWWK=%z%;&*1R)z#Xwaxc!UbR!)vtl zcLa$>4=!4njP580xpzzTO^3>L+i`UPCXA zjg&e8$pQdvIu*``^Zt4dm?~(9V{Pg{3%W-UcQ2fvm4Le!rY0mlgl0s2^0!fje+2tR zI9}p?JH*awU===tE#{R2%JJZ7nekBLRF};~Q&1csO8V#LlW~5L4t6gSQltd&7&{19 zKKfs}gQgw<91O8lxAza?rMn;GP%Yx0!}*^p6Uqtsy?@UYah$7RD%v9x z^oLB^6EI2fuLpoJvJTzasI?+LKR*U3I60o-nUKf7tHI+nL^I|=87Uw1JO2CN&u<91 z7C{o00pg5RU?wU}`1Oi^&DfS`^2tHC2=mnGfVyf35s;nKwP~O>&=>mI)D%Po1jU;uV)LYobld1P9WE~e zF8C9$6@NG(5KMt9+VDq84)Q=Ud+aT4=T)ZSf)ga(0}6Q;`Sr3iKz^tL$nK0CN(^1_ z#Gqf4XE-!vQ;hRI6jZ>41aoleEfUCqA!f{t% zatk9(_2T|xFFZlNh#(R7vO#=M>NLKH6u}KnDF|0&LYctL6#X|ogWvZz_~COAc~=Ot z3~;xBE)J4tbi2Tmd2q44vRQi^3Hg*FT>#49zVDdRg6Q%D$`Je>+ zOe4_+8EI)GHu)+QeqB)oMvaQ3BqS!zMA){pRlPY2z9AE=Qxsy6pHcx^s|=AO5}m_s zchFYS1C1McMv9$%cUX@WYX-Ckc-D8&_LLw35gl&sZm``KKp+odwLl~v!Y>`Nvl@N) z1%%4J>Ku6ns&6MRqm!0|QclGioKHVMT0jA*w-2BA_B8%Uy^N`%)1jupy6wRXV_o8TTySH>G`cwbfw zE%fC#S>J}QcOD00azPq|dfP$GaSg<+!u@Sz!35q_0E2p=7R@q1T*+wRVcbSX!jw%c zih}09*;rh0DX<9FpF4n+RV;;gAa)HF+NA!&Ey#P|T{ptjpF}xHKx&6%Od-5g9d8H| zJF@LolY7j4+fBUvVh8mewfIE0wM0>Xj-q^+c4#$yGNUq~Mnc3zCAIY#xI+p8jq5$+WfJVfmm2YT%y;;jRj;GzG9f{HmPbee(KLdn6-oLt=zyx`Nvhs`}^ zq8Hi=E0yYsDUaS@cTG89w+*fJzs_(XmwN62tAQQa@(`9O`K9gEFVZ`x1p)!(GD=N} zp`1{JB^7-HFI=m@{8M{J2Lzp*1s3T)J||i)<)>=8=*p_` zx0!!!$mxfLJmw;n=$0PMY22gFz#J1W(x6Kc7xyvAi-QNsKmhrefgFmHbi!}j_sqCp zk^a!PV+<@mm6Yxk_@2#G8*L79`!O!sG!ksoL`YI%WAtmkP><1@dZCG*cx5GaVY6Xs zvq3{ACGMp;CX~sWx&cf2m%QaMA1p|6{cnDox^5*SS!~=TEnok`rJJvs|T90h||W)VBu=CVB`BqA&$ci21+MOhg1yFrWQj+;|A8pP-@jAfNH;)rlvmYyx6Y zuXZQ+iZq74$)1q*rNV?($Lfdf_}hK!XKrdI_i)J|oFr0LpQls_4kh<^mQJdeGZo`2 zh_Ch`pYnO^&-TkAEvE|OMpcM%B4)7v!2*ORDzu$W^-T?;anu=Ps0WMY=}X5%a3F*M z6Gf-{tcD0oKF+3~FjSro0tEvNA5^0?FL6 z?{Trd(r3NJ8T4yygWX-@L}N)C%MJKo*QqRhyfCV!u(3_Tz!WOw@PaUmF~HUDYn~5r z;zN4&v^8cx!{8Pq{|e5oLfQEY=%lvu47Lv@l2X zbC{ZLX-b9>EQtK!WsHod&J7N}Kz8}0$F|d!jIZj4e3hsO0^{BS^Zw9kqSTN4CcYW{ zbX(=};Y|1yX<&3eBB+G1l$6x3#4x?IwY9ZuCh~tsoIRugrEquobtsc&ocsRHC#d6` z{EgLpe!nf7ZL8eec_fzJvrb^xb!RG8Y+@~$%&Re{G320HzelW2>daLlN*NiSw(pzj zcG)SoFhPX5lCcC?Z6rLV9+87Y4neC0bVO2T=p^Y`eyX`oa!)J_$9>z^Hr{o^PSBO5 zJ^EmQ&#;gdIKpIopPu~>qx!*t1p{xkibEwWOwOI=e}5&qPxTqS98u(h;fKob3j0u5 zzwr*tYu=yasZdf^51sAKFyoj1^nY9WAdp0UkEUcn?HsD7iUPmIzni!@jErnbULEu2 z?{&?k_vFnnbQNr(k(wlX<`xy9jhp@I_qtgo77sLwOL^)wbm*E!J{&EW7o(*&U)8`8C=|?#{56eu;i-QD-ywy< zB`nXqSSOHOTGlN6hnK|_?c_isO|P%;ZaR@}l4__~R+)O?fX%xhm_7}vn{9Rxcc7yQ zfCVm`By;jZz&0c0G^lpQ{`hgf;~5^s>-qM#UQWt?9%h@Tc)p~rZr}BAx|{YZP=86p z_v5rn5rl9i9IZp{C&an3J(t`&O-si1}B)R=;j9#qCnmThLmwatltu`5OQ>v z>X0UN9KWGZZ)J(_>IM7hssdRK0)>jL^54|T6xu6RVXkH`tqvBx_mA@s{R1#_Tsk@S z0){q$m{UZm=GVt4R4$p0dza>FRgooCd|jB)wyBVzu@!5~XWak&@<|8J%lNU6!-y^l zHufFF6PoKL)_2|2uKgGoWMH}3nrnM}=M~ktM)V<<$ycE`c{fdGlni5Q* z^T)7vs4J*7*|C(ETo^>x(}>$uY4}lYC%`eTJHr_CPKh+?KdnHkO8=}@A=K-BP`yqwDhrWphCRt}*mp+x4XVmO7L{D(B$lK8i6 z#ON*4tGj<)N<~(lNR{Vfmy+9~Up$IOu>+)P*KtPyY7rbcHWSho14T;lk^!06{cld6 z`VIzcVA#=n(?@aj)jGpgZ} z^wuKnvG4k9qKX|D_RIVA8Y*^uqTe&IFXQ&e1%Dmf9tR3H?`7M`pGr_G=z_FYdNBD% zQ1akhD1&3Ggk~;P|5e(TRRN@@qI?<#OO^Os+|`v|6`1~tExaA~d<4p6l{2WjkPCvf z(lEtH5rp(1W%hgA(A*qC1u7UfP!Gk^w-}VQxE}pDg&LlqJHrP4lkn?#>4P$CByEFo z@rk7tC4-m4&;_cl zPz*_i-2@dps7gse7K|mJh1(PnCm`il1xw#1!&-(4SW>x(A_e2xwA%;Qn1V@5NO`G` zG_(Y}no%D|vgEkBVaiyG~hA*u->|$NP?aHm<;-SYP z@aOE+KE;gR4k87^$%1oXCSy+ygLzmx?5JRYOy3|=eHH2$P#&4h@6qEReS=HVx`I1q zI^XjQAw6L=2$UfNOKCpZi?w<`KJ0woz_0z5{3{E_2S&|;arLuYk+@t$@g1&=2c2Yk z^3gnK|4QnX*eTWdlZur)Z1{8atqp5JL=|FTE1FXB)k3@GP4CXIuV&*=akm`=rJkno z+1Vf9cBFZrv7Mp$RRXlR^V>*pkx)uGYCuBMr#VUx6+rU?7Xn>{We%9Jy0_1GpNedc zrWRm*AiA~`{6jnlmm#R(>Xj)X6cpaCD*P4MVWpt*;t$%Vr0w<={oR@5!rd)h07Z~Ha_H9>t_vKFpwWo{2N%(Ug(#DiCkVu#FJ1&~L?ic_(2=p|^9ZKI% z!X^=^fy5Lg;i$p_MI}=rfd?m7Gs5OYI}8-#NyA?k=`(0Dp0JU{haUr1awks^+E9=| zB#*)9$2JhB<$UzR=R*dxgdGmDrFsRrUz^LlPX1zHmS?-}edPi?h&*(~Jkx9-sWyWK zJ_8fy=A&k)&?O;!qpBfnrcyK-0y;}5L(hMqOTt8YawGi<@kv#FZLGqI6-(sH`c@pt zFUGV;7Mwt*rL548nU5S#{9A+%UGt#{Wn{LfRR+d+&R9eF*21dV&0v@8KM8f~Grdab z-4=qgzqy-lrWpsFtaJU@B8b1X5>ZoPKY-VzfMIeRb~G!T{!Gqe($wNs5~p!(U9e(| zy@zgjJO59IRsOR%OD-unuC@crHH!VAAJ!olx&!B`Ha46v6gnBal{&Lp@4Fao|{SiW)|lQ zH*6$pv6i$i8xmyz2VC8@0Zkn+EULj!FGM3MK&#l>y!lvvxkgJ%BO?H*cdwdg?XPkV zuK!>X-0nL{6t)Fa5BQJjANuyb_X75Z9Jcwwa}SFRm$v83se9gP1m$&(WtLfXu#^>U znOO{!lnyKi?^`7wuzS3vAzVsNdaul7zw>$JY6!{tb1S8{wR;s$)|Y+BJCmQ_Q`gi@ z_jX=`QHmJ6exh;5HH_7=n+ zb$UI9K;9YqdSg1*eTtr+KW(1<(!j@^MXOK$G1^0Yd%!BOrGp$FDe96Od>&I`S^ zBGJsd@`km;>0$bAlDnHz(^KdA*VevTnY7EDS8F^7X=Dj@y-7v75BM9nz+KY#5=w(96= zh(LkvJI=_S;;z#@<$G~0S{vQ3q@{hB9e4da+)^?Z!s)9fI;|x1lMMD<7#c}qPei-N z-wGoWa$3#uVC|{RDCHV^fiVuc?5)==cD`Av=inH=!nQ4mv*vlXqCNbDK9@h^_|cWD zt7=!Z3mgvfAW(ll;h&*BgD^O%JWw%9O|7dqbrSD2lnH}4t^bH1{eCE%q_6DT+S=l( zVv5bWw#{5nOwNdMo~18?+6eLnCi6!dDm2y9`0plI4jz~LcEBKbFfQCxqIP-kZ+fip zrr_R`2G_#(u;4I_6p!+Qm~TUmbUR(*xGjcK6|R;g=v}jC7AUZaw&i-XWjyQBE62dJ zmIgnxzvGp@{->HXT}caOeyK&<>}rK3zGIn>Q=-iL&@{oIZ8rU32;{#t=O>#KP-R#osqh6Glci0erU3F?SKka4ELS-@lO zLGH0znsY{v6l|)D27bL$6Xr`D$Z1mwOwQY2edmqMGwCPei}N_;^=Tb+oZsKTbuuh*qixC2+^<$tMct6C@#v@9Z`%w?sw(dT1cz#LfcyhD6uGrUNDQk;yZgU7`(UJS1(;tq9WzdH_lz~JVQ7i zOzUWsxCF&P#X-P^{%erOgj(}Q!Z>BDp34H4)7>bBVPRTYZ(O*~FXAtWAD-bLKcU!MIn%fw|7oc6kiINxMQ@!~}mE`ju@+2rH;s(jg- ze5N166Y_65J{@0BF#Dc79GWp)qA7+^URvdUdLXGklh{ixb4LC#N&Avc8Sflrv$Ka& zv1|>skevIpec8^2$J(-Q*Uo;t)pUSIq^`r^s+D^R>Ge-Hc-9_4@S)mTu^o$h$zPeg zZSHidHGo1TUf0{YF%UraWUy~yE<`2#uTNTqw!hyB#kHg1G@i5ufn6AfqUStA4JhHL zy(4(m%17w46_S$3qUt51U2jFVX2Hqm>dXJEsywRlZt^|!v`@1+w5h0X0hsrMM^=*cQc3fEmbjZQ?Y4kJGQv@D>D7b zBVQ0NMjZsB7#=MS6qk(pG6qAKiCtgeC~P8B-S4bEr|mG;vw0v_QNC$aGO`%fxwPZG zHrU6UoUh(Qvu?j?9|nO@hP!UQRj(9Qm6h)vsWy-L>ety+@NQigpCEy%M6yV&H28lQ z^kCf}t?we`A!zf% zr^Y5_aKuHX2c73KKm{HR2}5E0Q2~AB zu4omZ&??ca0?VdfPnycRf)vV9pY;qUvqbhk?G`@#!ez#T!G`mgsZJD&=5Kzu7xuLM zM=Ul${z+l`T-M!~6H7wzC}`PpJfx)OUH?0wF|3px`kopy<**c!esVLE%6_3;J(b@6 z%7nja^w3~ezD&Q$kO0_*fP-yr;QY#zvy{4RF3Ls@=7jX+Su$X5xD1Beurp?LDyu13 zD5PBPYwF1RyFX=jSXR;9GyJ7%j$>FjKI{9;*F+Kj*fN|&<|4H?4=HSc1%kD(E1oj~ z2pt;i0mUS-g2y>^KZ&gRIjvGO4qd>{Ckw{o59^yEh*Mfp>j7yz*8^0^&0n{z$=z!cU* zk6FRrQ;T8@c9E16$6%p>rtYBay}_L4R!4^UzS?Th&)Jod<2VO~j~e5#wZCO!7O`li zc=G(W2MhgNJu0nxG6kd&cH7+%=eZ2_Vr=SaY9*Q`Y|;z?JX|;^XdkD;k{rr>xR|#= zc&@@IjCcTnkD;B0l3u(nQIIVJyhLWnY#JnVyXgl%nsSOLbxWQZ35$zMs5ZFM^7r2P zgUxh4OibmkFf*GVVfv+##mYOj&tGW4;B9Pj_~POBrKrzYYC3komLB8eCCft8ERGUFxOSy|iEkWHC zCRZ5qpYb$pW$jJkIG%6Wb>G8dS+Du|2Fsw^R95FMcF}l~l%WdhMPtD|?|iJ`&28`3 zMbAG_9u4Xzb*i$Lf3oCj%};7}7D^{pNlWt_C>SN-REw5x zewv18vs`;S)ZJzE6!ZT4O?v?=zua8H&_NHHYo(-cnoWb%6+GM~>57XvsfqCZuz*i%Ps`8J#@*RK-b7ls^`75 z)VUewSnJjxtB_LDvA26O+fFw83>$M1#+VnBjqfq1bDZ}=HUk*gxur15t6yL0N7tVU zOZY=X{mz$B&q1exPi*^*-a3C_q_2#t*58>z-}er4L)w{L?>xd2e$L^V( zz+n3;?5~I6bz{(ftps3#M9RHaCwF#-5A~>baYZcMP|gsJ+k;+ zwD7UcJ>TZNb3}iv@`ey8#4paa-J;MZoPIO4*j=?5-LWY6$$6?wfjZR=JGOk-BHY^p z!LX=`JCB4+sC#^>qj37$9({Z1;_|&&NwAzZ?*1KBIW!V&wvpj?Qo4lasR)raHeq`D zX*DLT0%jtJOL($#!>LZ1_k)$H}AymeXr$SuJr3a52 zPmY^RMIGzQ+4Up|rAB`c9;lb;Sp+o`i@tIVu^k79lAqiEI9r;p*7E%*%I%%L)i_%% z_cS&$cD4v=@<0DEr8-To{KqGV8&Ku4Mx=`r}KYkld zu0DUKu-@d-2YHEW+0~G8$T7e-0-Ahvn^zOwqmR$2LAwq)G#*g(!Gi}gyJ*}eR<+P_ zP1Rr6lQY`ex!H3lJ6ab}a|(nkXAvh4-u$Fqgd<`1>-nJvM(U)hT#9N-A+M zNq1gvJapN9sQ35V+V@x9tqRdCLv>nH5B18SxW4swxc?KrjjF0D6IAN@+lTd{^c~8# zeVbZA76^-GS^}sw=_v%+ecz13P?q`f<;v8gt<5X_rhx$%pnQ>ff3ns91btK? z=JeChRj8snV_13P*^a=W(vnPx*i%*}$u?rHi~ zIu>qehsy5nuAt;IkUV-Rda=ahX|bWlo>OV<&~n71xB&(R7A3tG8vS=RnxIQ&>~AG_A8A)IR4Pcz#O@**`7GroGd!4L-Bu;1k< zvDfi8u=cUq@}O*>=G+Si>EYZUTkbhcOD@zyu(1=Jg0kKAExKL)T6K;puL5~v?>wZH@t0PfHN7DFEj`%tkL zv7e9%+WY+8e7~(ue>$u68$G74+%Uj>wO@Fyhes!aY|7#8?1QkT)M6{aq+738+sZa8 zVkRw4rauXg2c~Sh@1c8Erf%PKtngr5fkk+zVA3Y_;CfrtHMQ9%(GJLYZ6I?c?!N#8)LI%Kev@ z*-I=t@$C6ayPj3B5_%_IJLFbqYqNv_R2nBvkTE~s{B*|6O04M?pYplI^LQ!m5t|4> z{k?)zJy2Rc0tiw-_n0B1HX5!4ZKgM_7GVPF4b7#qm7!|63yo!?3zb4sPaj6xGT7~< z?#u~Z_AgnOaq+PKY3O2SnmS=6NY!LO&&|K}x<-GoNIup6mBP`5hM!9EmM@Zqo`*b& zYZQ*XczL3`A}Zp`{D5m0hCnYTO=Hu+Mw09xWaXu8-!%L;C8g+oFaFuin6)!O-bFrd zSGoR!1)$X3*&^Shf7svnv!!F=n!S)od83ggVV8x2KQv}T%KsD3Q$xJTZ0l%5t4nC05TMOS;iXYZ zVvT5}U%bN3GYpm-5?xDy|Ef;2kJS=%7O@`-iF8vm>$X(B|5`@jF1NV-99b!`^|LJ7 zyv4fh##Yu&g}H*1WzF@jY=cInI^FK9WR|%em8`vm1CGAk`*Y?y+rtw=WP-UB5&`r2 ziv6?mw-0)0L27V zq^*D@@XSUiFnSo00&u?c;Psn%3yJl=sWkJajcj$yRf`|#&t9Z;zL7wcs@o(XNpwEI zF6B90s?PFXsl|GqcwcXC-bh06q6pKE&hxt-pR#fvgo<5cf15Tu8He)(F(u&lDM$eN z@A0c8Qh>{GaX@--3R+vf0Rb9DMn;K?aPWT`tQaf+@|hEr5`p^%(Bzbsh-NBAWvnrO z1AV#*?Y(Q8{E}0f^L7KHBZ1&`?eqft>zK&YH-?BtZ1{+-Uyr4Ef0JbO;Kz?5o0@9h z9fS3g`A^+LL3T^Q*?jEl>}OUo{#hA9mXzaoDb4_LRngIjP*!f)bM)?mA;2G3b739S zUG$8>&!r`z5y^mL1^iq}@H(@%%==Qp;Q3j*@KaA38TKFZEO0*{q^+)mu+Y6>Y*`8r zg_U0bcxVQHg0PzAr7JWtz)wg8tZ+zy5Fq_q7aU+rQN0}jG3tS$1|*caVxU0?REsp` zOcXYcifgwwO6_NR4j;=Ek70B@s*jcIw&;^?{)U_q{Laei*>sja?3!3gH5=|b z5y!yYWayTv16+}vG+qKwa(EO2xWvK$O|0Aj0uHXTH%QB$Qyv~ApqjhYm7<=_)KJiw z(0@Ukx|0KS7=Tt1?n+EbYQcNjvu_c|7u|pyhLIa_(*2bGMveV@0#<?yhC`y!g)Z z?JA^CpVRt82wUkw0bvND zM^@&s=$1_TGG_il^Kh;IR7&^0LWQ?ZS7k0&eO5p&{I3bN22rLQss<| zbW12UUvgzBl($fa5_&W7xf?7Y)drD&mwdh-W9^P%bO~{rcaT&U|5nW;^F8|eRV*FxkZmHr>?=p=n8)>3MJxGB;(HZ(tcqG?a0dMS?&1E%o7kD6F8s+h5IiF@E zP3bZ|d98hwHqwl&>DH6`3E`2B%r#>0%t6qorid7TQAr45Cj>*`q%{xW$RM+vG6L~( z2+Zr?KS|&MjMh)?rvLxc2=rnO*VA=IZ;~rHf5vApAohQ@4^Ov%8@=xl^Bea?D`6GNMHt7NUl3%lfZ*z zG=?F=7s%+yMX_3imKo5!LIYT_2q6yLw}&;D%nj_<9IE8TGmk{1G_gd?#eLE(Nmyw4 zAHjB+UxFrkCu@ z?9!M^l1tLU(CYaso5|aVFQhLmSxfJEV!?dzdW%6 zBYvUrtge0)Nw}npK(`$RI|5FqsuDtsJeWjVwmtb7*(P?ThCl{!yI_*_E3SNG)c0Te zOb}ir)P-ZvZ3j)BMkbh64roO-()e1~2Z)?Y@#WvyqzA}8!1IEdj3?9FLaS4EELfE1 zhANb02PG1DY_KUM+0qKrH8ea*{qPU>xv!mk=L4>Zmm1nGp~g6%-BCPjLV9M2G(bLo z0fq3=O8$8gUew_9ypgF_<_ytx^bGN-V_+BBpg&^=I@4gJKKdVvk$8q_kx;%*+wh4d zsbgd^O6|de z6f{Z|kpGp>mKz}hzTkj>7(o6^2ON4*d@$zeFKG*w?U3*&m;AU(FEy?|!s=~hlgMMR z0_B7q4su?$d(wp3!*T@V&5UBuAg>hQ9v_Y@s zbu;@0}=}3?c1UVRfvk6#~APM zo@?vE*yM+j(0jl0i7?9)mrlMZjU}Sw>!5<|)FrgVaqA2TY^hBkrI`Vbq67{OydU-g z^WNJ{xrl*;km9^7QDty52FB2s-+`s#a^129G65Y+{wL(IELh7h>stC0VFJ(B?=_9S z7BT)x@?GCRcagWt%=Sg!Mk%JbrA!NOgy(3%4yEuxndM*U)-#@f>@IIY$9ZJg6a@gd zj=@5bPe6OG$R{8Gu|X2i^h6k$hLQz~M>Y7#1I7H9Ob4u*ey;zwQ^YD4&92V<-4z?& z^=V%!i!V1?CSd~nfYZpEYpCIw|Fo^jF8GEaPzPY|ja6lXalh(5_8M~Jj8Je_;K2as z1XwwhO919|&S=#rQx{bG5E(l#cr*BOj$Zkws3xKJyhx?pj~m}@c#ZM*Y{YBnQk4X# zxy|E0CU7>4j^BjeGXCpa1}6V?287-wfB$?(ezFDd@f=!=;F~YO*~Bv~fjtK}F;l=q zA;Pw7-Mx=RkS(oMon@Uy99*C+nDY~Q_SO3aMzCXVNHYW;-3BC6FFtkY1Mhcc1;u_T z6f)nJ!ie?`w3e}ydby8kfF2@ZzuBdsZvrz{wZ1*i0XNYY%B)Ri3vPl8UG;+cWNUO5 zl2w2y!%6X~e#Z0#mXtN!772NTZmRH{uUvQ-td?kqh{mOC>H(RRnu@ zWky!GL+OG9P_NLWX#{pfl}m3zQd!BPis|A~{`}b4SxQx&-->k*>7yWT*^a6W137)7OSVCDioUC%Z`Ovpd$X3t)v(<*Mana;wWJ7^m z^Vpy6Hn;h(B=wN%#L{ru-p`E2{tC4N?Cpl!mnTX+hwb{ZA8Hcz=2G{Ea@>|)PL(4H z>(fCf*Na3?_~F2cWT>dBBHZqS&k!Xdf)}++Xo}Tvd2(3`cwx0 zABJ-R2ej(v*7Df;Pmb1UI7v9hEJ%=4f01gC4z-(p#CN2Dg~^SP&W%yX&U(h>%-fKu zU-zrqg|(Hwzl>pmZOgGjH|q7ib)?;9TM zZA$~37|opLmzEO0Uy~|7_EjwziFE@)-O0uwoz10i<@~(jvwP~+jnNYyj5WE+KRh>T zgQ1_rhI0(u#W{~=IaOtq!*3e~$x1?j8%H)hCf6S02v-M15&n)tV0`5PP_ z?897ybI*X!b-}+c&mBl_mQdfC1Qjg3~NUq-XC6)MB_qA)`8hD zbE}!pv|BU*M!Su|@&$A>QNH@2yczA6p4$DDYfDTN+q_tZ4!vw7zZ#@`?ZA+P&_M|# z5%Qc?ALGao(6#@^)H-z&Feg#qEL6wz#{p+T>1a+$%{5DbIkP1*-rN+t`N!R9^$rfg z{_4}2Ekga&b{k$J{G(|?v~T=d=B>pU7;cHTon9v*ijGTpttwuVTtDK+b`wcr0y3JV z8%8*nk9|(t1X#&rQ0w_XG3tPCbZe=J`KVy$3wk`};orrg_?(hL%wgAu6Rv zXxp+Wqk$qTd(+TT$X=1X3CX6UV-?xi*&$?ae%JHue9rg(?{UuKbWRSh_w#i>?{VGN zech586-8l@l2YYX={1JchlaCP%tJ+Sc9Xn>|N>oW|AItF?5&t z)MK-&=8W{qHQ~D8Ph;_XB6gMIw~{GMgMSueN zp}t{5Q==YlTh~QVBs(cNrJHyI)KVJei$-P-@kVazc_w?&l;%NQ+&hBV~96E_n07VQga1^;SK1X-?l^X5&T+<%XPaIvKVPlv2nvnkrNuPU;WsW@l4 z!#Va^T5M1Go4D3on*gM^!lznHJrFo4 zs#Kr7Wjj=3*bxP()5;H@9AppPCo|)jZuC6AMO#HZQ?9)DjdA0W`Q=1UxzP;SF0(V; z_uow9M-&f8y{_-{?w%+eIBRi8ysWdTvXgaUbiUgrJ5Ix<7Vn%+&J>xyQ5&k!ZR*LLhq-)DLskoD&IuUA1(ZVmY5K4azwyy ziY86s(+C=S z^rN6kjqZ>}<@X-$zZ(|}7YFojx))TaXCgaS+6&8<*d+Gc8x>_CAF+^A1%K?giXp~3CKEeWXCEP0gBK6b`Y`> zOl-wU*zJ4wqF|#?mY!9f02BE%mJaXWQ2d2esmJMA>hGVnmEH-$_h(Ufjx7>sgJ4Qf z0-|>kyP+fKvX3tmQx_VOc97^$h*wV56M@A)lmU)FTw3+9E#d3vxZ+7=MdsiUO2{MP z*KJu@*_tS6#*?}=A_Q>gJG~#JK)57sC({q=9sS1+G*Qf?h1=dG>|h)^(bDN+MqsKz zy-8Gn=+9c8sGdsY6sMNWG?d~?x^?j}=z>X6)7+IY7@?Q%F7+Zar~isH+$OWwaP^k} zcfbDT?R3!Xbq_M;?*Q85^X=_O<~L1Us_1wh9AqU3wkYJ;T2;#!(-Wsf$=HH_82h7T zz{bfbfw%9MCk?b7r}ARw5&u^uxa~)E@X}ESlZ|A^2Eq$Ie?Do}FQ2=#I5&&2{^if_ z=-8BH7KeqxC$vhpdvU2XV*Wi11j8Nd@*+5VGPU67K-C@El@1C#HK}{4O6}rMxE>RC zatKs*5R&Rp{h1>Fl4xOttt_X=T(Y^=W<)~<dTn(u7N}VCgi}a!Uu75 zl8g}I63iHrKF(W=KV;Je-=q|pgRV|{ZL-R)_AxtKNok72=C2r zq@voH@jcca!i)u)DTvh{wffrf^ToV5WALi)=+0r>B+PG<@k!yxKhgM-U1`=6x(#}~FqC3bPgRHy z7i*`2m4!drO-4VZ&^aYboO8jAN2snAG6?3Mc?XoJfgXhQm9Hnw{Tl=L23%qK_eUFfIQI7Vb zH?4$OQu*ks`(X?TfBqOz?V*^7g@sVejl*#vV^QLgLH?!tP0&T^t_apZZAK%4tM%{_ za$qkwFErrlOt-Jh9O*3L;OD09VFF0^$_sA|ywXQ7qDy?PDvZDfQt_A_K92{${~!`S+%B9s>kO zoIFVgV-*v0`K1z*Z+%%u#I|B(BVJJ72=xGNe8q*Xd3$a}^)cgIbV11yP72eCsOl1+ z8GNn9uMdJ05CPlM_+w5^u}i(Zy}cjoSfoMRWhp4oHXSwpt-OOvRhf#jP%SgD5h7M( z)&t0M^d;w=k)2)a&W3}fC>Wb_?&|F65`_yD8b zxa+8}2di`)U>b~1CK`|blF|S1?i^ej)nArT1z&b0Blm;l5E4{mSQk|`h2o|T#1R?> zE4Td3VEL2g%Rm40L*-(wNgoa1H0Ul!vr7Syw0nn-A#BKlk7$dNkIJ|gv)r@yAP-<;T z3HO<$EyasLF#XxzFldg6U`a@x)q(WyZ;qaG3OFQ0On_pX`INz0g!rWA+gK&8oZEEl zULEHGUfDO~HR7qt+41wZRu z%+%M!bQWf@_9PN2IaH=6EdShqn4V}}%u{#r$8Kd4LoL@a!`1h+`2AkP92r2y-;r5B zx`XRq2O;;tuq_ccCI;$x)(~XdzH_HGzigt({PcZ-(9!dok`XG$vdhFtuMEWX#X~BD zUEWwN!?f%)+0uNW10>A$+}XJruyl|)?;Y|7!tThGYQnB;&Yd4Eqf(`qp6(K`e1{>R z5U3~pv0H(U&Gc)qA@vHNRVAl&JI0~K06*Gj8m>w_%WEwaQb$nJSzhuTnSR33qF^(z zc;3h`VcClpFE+0KiU8W7>qOLq#!?fo6vS$`yqVdMYqOiJ8%E9{R)eWX6{iGv}Sw zQHu^OqIyH2HGoZn#k_oHw-6UVag))VIeOqg0eKD*4L}I+Br|`AA3#pn9Tw*!Z{y28 z$I8bL%za3w^D`^XBM_yxHR zq7efDs=FA)q9`GEKq$z-`4Qu!va(kZ*$Il{OIgOf7}FJwF7e?GCRq|jS&8I|#971~ z9il0K{s2+QArIgOB~4Vok)X>^C8ZFIe`AUf_N;&?`yO*RQiXSZEG@Jx9mdu8pGj~~ zZ|KVAsWyiskdk~|XoRQ+A;LY8Om^%&4n?KI!ON=%qsT)-rAx$y*8XiaP*;nHSTcS= z)f?QFZ-IPraLrXkj1GX0$Oji0&E-vks200Itfx1(hSbQ>wO`+yQG%)y_Y%P4ea_1t z8grH)W%Nhh{z#^&D3mG?L>;ecPI9u zd;DP_Fx|tVu3C>gLj|TBBslx);PUSF!#_5kWLDf6=;H=4Y?b=_>Ub z|)dw8LrdH*Tfw_(gfKlFKj@f-`V!*hTXTw zx1>0#e(W5Hc34`36?-Cw2sFe@%ECv5dVZ*lhKDnIvB{j@#wt~VQNuLIn^Y&mBf7C6e4tDiZ(CYa+RLj4 zOqfpu$EjT&7=wgSj?rO0dD$18|A9zR^FjYQ=>w5@CGvXw@Jzn}Rt7sPX0G0_Yxz8= zN``BrA@6qezvl=l>vnH3@M$Rz-bC{_5-AfP6C{o?7Q?NW3a>@wAPMA(axPpcNj(d3 z=;V!$6f)CI-i>~fB0%`y*{R_qbOoq=Hwx3r1z>`@%^AtyBgUS*S4V^)kJ0}{_Xn~R z(a248fg)1<^hxz|@GrDINHX|sr{4k0h3QqHFOO3mM^Y5eX3CI>0gH?iRSSY9P-eaoB)W0`D&!Z)byUV2XDYVJisuoL2rxZmaSX&M^)>Pnw|3S zaalLf4RqTH69yQ9pUyUz1^qC30n4jon%Nhcaw`LnsmH=s6PaPN$=@pEy*1XnR`G^RS`r8XeFUU;XAzfwD@;?JY_t{4ChnX+4+&Kld4@j_ssA1i zBpeyI0-l_V%{@*}pOz8T4I1J}p)DjF?F>4_>jRfG(}QhZgv-as?mbl(~V6G0>!xQ)Eb)7M^e9jtY{z*MZOy7V{Df$UDAQn z)oNMf@i)xIzMUFCSAnQJPaw+*z(X)Yq{C2?%2BZb$ixzgUn0R2~IkSZOsNlC*V0IMSm}(YS*BD8(79y0*f~uRw3+B>i7}7x6_WHH){Ph!X)e zBMV$3jX=(*(bjC*_Z@Mhs8fovKf!XO12q^*qTV)xGx?5C^{N;CLW`u!4j(TI5Qaje z#BLC*U)MKxZy`)~G!oyVHA|vh@v_Dl&4rnxrs=M{nP{NNN${W%9 z`be$BY*551B&zb^CrGhM1roV_3DAS zJ3ZB~zWnf;b~P-R?(Id`H#aaVlr?b(8~x3hsX!4b1_q7Ya1DsOAff0{>lAS+uta0> z>-&B<+XB-KfkfyXA(6muH6Y@~0XLw_`DT!Q4^RT38UPL5^OJZPU)T#tF=c@EV0!v% zTkUHdl%M{*`u+rtBZ-(n`gQ!}twl5s_>H@s^*y7wCE!{gaxF5cY|`fqAm9`rh*d{X zjela@zyBQ4bf?uaXDf>Oh_X9RQ0J=6ck>q2yv>wBA_7M z#(w{wD<&=?lJTqSf+&G+h`d|Kg{QLY_-MPgbE~V8C;=7cGUvZu>!3?6i{245!n9Nr zpEUh8&ql^%z_y#R@-hHR1sr+9Af0{8EoEh2xV9ZXQ5miDA>0wXs5+!)*g&NbLweN* z+mDkK7*NOmU(T(`N6opJq~7pHKsr-SaKm}(xVtbZ!X9T$Pfv?`W1SNhmlUx%K>xI! zxUgN@5gv$QDapd%$jeOktvr_Alz<_@K6DfTKXqIRcAi1XLmRk(LYs7_A_xY7w=^&j zYtmazBejwuZ1j#(96ynWz9}T%x}*;_03Mf@e!Wj0+--fw7w3~V3m!WQ_Mlj0T~5Y3 zPz__L&(XD1n-I4C56Tk$fYv5II6p$(o5fMM1GB`k();|lZH@qI9Rovg#mL5))tmN3 zQ>E=5F<~DPzgd4c$r#Wa7?@BuIL0kDWS7SVZN;u#0O5^vsD z=KWon7HHc+DFZbz5`z-&tf90CHWI10kETQ+W&6|Cgk>4zX-Wy1&uH_?#XiwrOd?Z%rsG9$S55^}C zNK9~HTn;mpak%)@doQx~JPB0*HfoT#u9rG~e_8hFfhJ`OhI7&@{#XghxJJY{pfbl79=ZT#fV7Vcu1GD=t5iP7CKNwMQ56dqu(aDa22c*FLf<|- zEr7W1@=aoKG<>- zgYe?yQkNKQh~QG|#JQ%+5qsA{51)c0Tw168yZC6wm> zJ+?gPGu6k8Xkx0ta)Z4JkDld%Mmm!`wA!PUlW+Ohx|1e1a_Q>VTf)INCfEdWjsYmRd1|TPig};|)X`SJQF2g4szmH{JkMf!wY%9U zt)Zy<)Q?rIE*hG1a($Clbru^k?TS`9N{sv}7^v}cjz7c7GJNb3e|fZAk-2;L&{W!3 zl7c8*zI3CY$3oHl8P{*aJ?KE-U`X$Th&q$D4@&PEaQN`5oYd`SwCG`^&<`bYu8xjB z6_5xpG2vC2cD_30@A6>1h~3T1vhL$x(IMP^95m-3mFWgb@lJq#O7ghO==rb%Y#`#z zLy&;xl)_6pe+gHYz)C2Nhh#zhO1triR_c%YfaQGmu5`_rGQOBEf@J|icIo{!#YuzL zclM942G_+|icx;Ylq)JBH$xF#n0qQuRvgzaUico5g9gssNw z$MT0Y!j8u)-CUetpRil9W_h|~*K-QiTu!_U&SbDTQ;rmm+oT2dXTJ$P8N!VGf`Fwc z92DRxNy)r+?P39XBD4=no_^w(xU`uXoE@3*c46k{6=BPerHSOoGOUeNK<>!;Y9F60 zobD+W7>ARtwz0440G0&kzE-a>g}parf#|-QtO+t1kEq-_D$82^tgU`!L4E zv(sYqV$;da?weUrYPXN5<#CCWK8@L(yIY7}y!6k^56&esI`#t*90wW?RN3v@->`47 zY^{v!%9MvwIcX(Ui8p*dT+ZZ9xh&eduE=4IQSkZ+ec9`e)|e|GBXWRPq8OZC{XiR0(I6cx)K9 zHmMe9KJ%dHV`9SfPO703pn}$pga>n%)GTlhiPMWXR?IB z{Yv@nT{PZ9W0_r1U6T$io{1|xuNjCrTybb9+8JZwR4CF`^g%>soQ7E=<|s>xf7g;S z*OIlD{Sp49CBLtpYm@B#+q<#S!}`|UB+9^ADV$Bzy9DuzlOVdghA z`1ZohFzWz?DSZZ^xfX2=0&0=2A(Y2XTd6&3Own>yx0_HPm_g3YzbS5Ue~NJlR<7*+ z{L^c;2nmPQ>A!G&9zxr({Vy5He$tSJN6YS*^WjjEBJ>%cG&RuvMf|&SlkjD9i5#k; za1OvXbS)1cZT55VDzjqdXwc~3XVef zMv;UqBy);G3{18q%M6lT7StQUrhWO$1 z_;DONqgYkO{m%FB4g`E~Jv*tqlLZA>NG$kT0LHxt{%bRwtHfyghh|lw<2zfY^8@ku zOzyw4-v{=65Pef%@nEiC%dnM(eVInFv1r}lnZ<9i;-TgaA*|QH^3b^K>~ntqbcFZY zilFOZ@u}{z!Ew3rH2xEZGXnFqMR%{S?UlCKIOX&A*fjUTa2dnLuN234K$!WUj5Ab` znHc1)1B7}LBw$4hpMZFIi?jDg$Aow9wniFC=6Z+wcw(CSJzsZ6(yWB8!~W$4v#kKb zX7mmA_n{uc$Wdnh=uKdh1o9yg9mug1TEY2bBWM<~t6Gu@qUlif{;y{Ocig|=Sp zuDiKM!-Kb9e$Lu^#=$srO7($wQF)8DiO2_A_ajM5N3LzRx#1!{8Z?q5y?9cLVM(8k zV|NO#)06d*HfD1Um)|Hp36{|rPz*9LjK5CV^8VioZTjnKi|yDqi8EhW;OS3*lL<1T zkAopaII++WX$eykDrPveAd$_oF&>-MxP01~VZUovlL{mj+(%Ja01=7S8o-0(kO)BF z@P6$a{9EP)m_Zs^?RMCk04j%(Z$17_TJ4+%=P9a zV_1q&W^w)6$ki+(zKxlmt%SljqYUjv_qjLE%@5RZm6%)|Jv8l*NJDw}i3~B2{UJnG z7Bn&Bk%wN~%`8MZgcd$Yyh-wU6rP-XW){}D#a$Tq#bxDUPFr58M-j;@a*A=?O2g#I z%*-s}PSTXxId&jX1gJx0ynyzoA~2gI>tKA3ark_3v@@#-)QyEDchSmF8U4XLuCn-- z1uKi8Y}Rv`Ug;Cz#gE40O?>KhFFh_?2^Y1tL{T`U+voSpm$E1$t(?W-gzBYtyff*m z7G-A52I4g%MELvjTZaOAbf=QkJ_z*Oq7~-C2D%A!sC6MZ%q|!Cl2jQO?C^JSqBNif zh(=8W;0NuJl8tDQKBr=}DJ|fbfVs6n5mgYCr$m{i%08n^i)M~7YA;Yp$!86+JP+9y z2+L@D|Hi0H*Crs}HKk0%|$d~r)Kji1fJRnZBrAP zj?z6Oax0XBq8WuO;#_)*c>t*jp_p_JAi(y`CRr<$Qr$qWggzD5mS(>HadSuh1E3i=;e?#Du)*yCu^37E#*#S=S!?s&NC|>3+QU? z;Xc3QXHXh)v0=*tkGz+^UgMQX)=!$Y1(Y0GK`ShR9`8%U#z=TD(zt1JSjt7&_r~1a zqH7bF1&!GjNr1Z#27IHoK>ne|%LXpKhN(3M_&kUIvpsU%5)o)($-9}QeSlt#DtS4_ zZeR8u1RuR?6T0cSSelf89z!fzH>3;SC-NkNWmv=A#;2>bFPQ1_ecILG-q))m4Td~a zo8~WF%wsk2sVQiuSu*{+kSFTry_6~c;``b?eWlOpc9)DjHFS@&dAiiwrve#CCf4iN zn}sdQq-lrvY;rBzJb_&)QICHotsYtiME8cYw2+}=`~a#F)GF}9?a`Y?;%5)ik*?|T z1!9dxuqU179fxI^#i!7NLN0WYY*n%w`9en;PJn=7kp=j>Y(HHm>X3XVyNk~=k?FO4 z?6w?ct|t5X7na% z(RStxH$<%L|EeooASU?;DZ#J0s3$<#$Cxu3QwLCZ&SKApe8RPpCv~bWA}XGuKfG6E z@j(41_`3Wb7aF#F;!6AK!D(eLd1~Y9-rDm|rZSS=cDJ&qIJ^lkDsFrn_*E?5e4$4p zd(-iaTPa)xDb#rvQW0X{g@pbi>N(0RVxC9oH$IUF7E~j2OE7=Z-fzP)I=297LD;|r zxnB3}Tesf)|9LK|^%NEs>K$eT5Fk&wZtAupU*2ycYcy3|us=!{0ZF&>aMGYz*=}~696Vt$v>TEjwT7H9$#VtsP)P zvd^hD`Sz7G^iGfEI8!qO?|)%9@?!{p3IdPn7{@qCzi~ArCJC5I+$;u1bx7Oc z9F@>iY#!5nA^Xi!hEJsgO6>R=4}o#xh{qh=*?nbsWg>b;Cn@XR$p8$$NAbV?c>uUi7 z>YX8dWFWATWE%_U`L)>=hHp;aKfk;jDodbs^7w8UR{x>RbUCNCc@ z)@<~u)F)eX)%u?7p9}VL3(t5B8xr)JCd&-caR>J*WGk|OYl2>vhB3by|ESWfCv)?0 z=MR5TOkxrh6XTDFD67}X$Q53+<-b2F|776Sx*nxC?+NaKAE*E--YtZDcF-B~KHHdO z7Ock`qt^ftqg3~GU$%cw-)j+V7WZTAb(1y%8fRaoW ziq!)5A;1)rvI28l4swus6G$a#(#jKR2PrSv=OZAmpn2vHwSJ z$6cG9;BUV;(RU}TJZ=7(!()?u*< z98rf}-J6@VxuUUy!~UtFUGgy|jo#nytjY{>k4rD&`pDt1c`Y z>VM-@mbB>nM#?;iV}F_fD&m?}AqjM@^TEFnbVuT-L|0Y$0%Gs20EyIi{TD9Xr%K?dRFkk znghwWc)#{y+1I-5Y;Osf?M`_hwWz+5b)w>&#z?6f)*nPqEm&|2WoEJ~O5$+;>_1YzF&?ZHcZUYHnNG&bP3)bhlNMS^^eWTV_C5L|{QeQM{vQ&O{u8yp9~Cl; zXwHt`u#xng7HYXVzb7p}`~H(o5btY~lqA*oPons@Y|Lv+(+~Ico#(fo54UcvzgAiK z+TB#8$lG>R@F9!I+MwM0yDk3p3Q^|W?*|9!<06MzuEn$t=6VI%@|NXCHfXgzWa+Q% zOnmQprnO08;1eUum-V zUGMIyAr>${C7kpDqtH6^iw6a(HG9M2=oVpW3;K5djAg z?`MiiQCzFx4=#umE7!93X8U#RPvO(UE|(vIdnPp9}m9KN^hDNnhP%JGu5f$Nz#QUvc4sf zv|&|%yq1{HcVC&!1LJ<0ZT4fm*!Ba?sK~(nB!`{UF=G#JN zyHD!R8$?~+WOMYw$Weum^Q%q_IOc=V>ehA%G2jL1Vw({FhqvH!-uvbkbjJPstKVd*4d9ujK_RP@yVzM@b(+?g98hHo?7{uHU0 zAejThs_r@kuM;VOX4gg+b@;!q0OKe&NG};k8}EI6@ypp$N>-y6b$*7ma9Ib>*|bJT zd)xZ;-TpDSq#86cR#A3lvR$ZSqIvxoxR@cIRt#tVn*27LqfoCZ$M)Im>C&_M(H#R5 zbHffX_PM%QVLET#H<7p_IBk@+$n)0Od{FSMtB^_H18cf4lx;YArKwE*U}tg)dv4zs04o#X9u6%mp`7&dl%vSDby=(YJi zrP;oyHXI@Yx!-RDtS*o3I#Exj;3M^I$^7L++x*)d9QiV}*GpqQpS1{AGgR@; zo7YYKu=q~t=1ubjMAnvuc!S7#ul4$@eT-w>iDn%16^!mj@-@q*Dw=48-4JxC%C8`R zC`4a9r(rwdgbuwX|IUXs@RAtB<|h4SGRa3$=amUev#-#Meaw!KCG_<3CqliX5YYst z6PPWKcb5+rd95c@M{m&_g4?AFT0(<8R@b=Mm=4rQA~Je1BN5^rEOb5h$wWkUi`Rbc z8(&HdyUcBB-rAcDHqUsda;1y;WSyHC>&^USci_OjeoMnt&Tq+D13_i{laa#~xO#n& zdy^nGQOGi-mV3?V{Zzhks%U4hf5MOcCD|`8B5LwFuWsCR`jUIn2KiJ2i;WDkfsy&6 z4%Y1vs~X?k&$gamh>NKx|5hW|Q?3#Ecf>WF?{0S{N?$tdIX1gvBjZGh`QV}ox1_`M zg;}A5pq8dzm5XX8x<=?um`u*Oho5&Ejq5+s4UT!px^6>7L_OX5q2Su?ysf&8Il*~t zIcEl^h4h-DW?xyCwXdyrbg-x!>5P(((Y^BR`n#?a!Of|hC38N8>kiNsiH%4al+hUX zH!_R1WWBF>#gbHw&lhv~&5-|6U6f8!i)=(Za}1)~ME?MzPC?<4s5=PgVd`gxsxqRq zbsEctHGf!$y%5(Q-W^{er%`V+?2zc979?M>=AZBuLF?uXgG+sJ z3jdnKLD$H|Gh^JA<>k_AQT-R?Cj>qskov}ecu6*Q5!N!8j&cHpm%wKN_2Md;q+}H! z_2r)=lE+L<5rQ;QGe<4KTA{A?b7a<-IVvE~OgaU!MXroK%$THD*<}e2Q%@HBpe^aR zj|wkfFei?g5a9ZeFB{FPwGk9g)Vq&)H=t+5{CxuP-1)QW6}d+>&JHmq=qi*ABxFk8 zD=H6W7L732G=Czi?CfOu8=<)m+-B{AN(rseG%KQhwL3`Hd|nEQzAyc)D%jyre~7(w z->sRGne~5{Km@FRsWPndIlZa&!?(fy>g+en8s~mZ@O8eQ{_G=va8l#icssjj zRgBynu1r_reQX*}f=F1o@sw&h9-r1rI-zjy%oWrsd&yeEpDP;6t9r9lMom5k9;GP6J@Ty_ui)_@ie`edgxg$ z*-SioKUW*8B5Kjr&Ec+Tu9o@T+^@vvUi}f#l=A7)9E#ftJ?x4goJwq-t4UNlL#V=l zcspjeRI7lE#!Cy%Tm-55YI}hbH7rC|!UQM{`hWSw|>3e8_JgE^67i7duIdVQUUc-NZ4H% zJ~FFnkbXs6$S;wcyjlGY8Ow}e3w77}ZGTjKY&@VDlZ1xll5Vcgj}3R3aFk`h`FV+FxwRD z9&WKSak|J3d=Cl81|}p?#*^0N*(In<2ub>X*Kj8}v!Bab0 zQ3oYo4byvXt{+!z3!TwN8Dl;8%9UrrYUM_b(@R2sshm@OCbfh8o?Ps`#KZAg&Kh-R z)*p()+rKt5ll~&XE*Q>vDuqWrQU2PF(l+Lj^veQONny-=)mj6ZsSWZW^OF5lb{T@| zIhWnXr`>{f4=qVkV|l!4Iw}sS04WN^#}tGdyftxhqX_>Wcb2*zKr!C8@9tV-LN_4r zJz@Bu)k$c2TgFe5kvIy5f0oN`2G`+LmkDm*4<_XfPUWLFSTCcQFAqaFar>VQ8yN*v zQFqhuaiNt=5A-J#yTju!wnykfWO)hSJ~}QH%`+T-Sp2@SA$$E6bgchjxO7bH^(iN9aHcwUn9CfmLW z-lx_fYI8-+FF6mwM&OtZ`VlU@+z6 zyzBWD*Er?M^D5TAfAsJ0JZ1QP)8g#YP4mXTLYo=}KfJ#s0c--xtl4}9O4l1IrMe#L zyrWCf+WxKw{YDk^bn|;Z3wc?tqnniET+;shVMBeJY3GFT=>i3|LrYq{$BPafE--!8 z{KcCmzm-o%pZ`x;$osz@$Gq72s&c^OpTnGA6HjUwRE>19@=WllN<5&o!sEUd^T|8s zE}wgCm455=huNiUk2>2-(UbknQDIl4!}SfbYx$>FDT7;JY zG_Do|z{3n3DG&j=LU`Cn)4!O6B28U}xc@EB$|VIiY~FkdZR`|9kk2q8L2Lb$bh5xC zsRsdl*Y{2kR-3~}-zm>FQ!!ChC(-e48HYwD`)N&WWBJzyR-L@5CuAj{ewNR+ktMw) z#mumA&TK$lM(l;$oV|eMC;j}Ej0?9S>UBIX&Xxe{3LEuchdL#wMMrE~VPeyt)@Ilafo5);v<0W0E@A8AIi!G?l$01 z>A0rA=8(#K_;{7lHIzHm4W6FjLu0p!`0jVSzm^uAhnswi5(mJG(sG80!%3EUJ7vo3SB0`4xVZ>o%H7>?v2)Uh*Tce}dsw>?d zks0e*u%ptz!-epM8SyM`x0jp1zs+qTgWP~O3f~pClPFdZq`H=HM`;iTmgakfX2EYx zgEw+ygd9fKCb+L^^uWd&?gYnRK4`VniMu|(FGX+!GJDm^vg%{Hpk3VH)SpU&{^k)W zyFZn>XXl5Xi%FF$3-C=3F!s+CGlO?^saNObTTrbNwSX zx%(P=dv&IQR#;Chc#$77@w@e(-~mtOl0E??Wyxu*e;442wO;C+zURAJmF8I5&n#xY z^`8&8crWZ4k5!Hg^|~G*Q0BT|8PI$58utCQzdv} zIF;l*wR)!39DUw!>+l-w){3G>Yb>8ye)l08&2+?>n0XVuy|e>d!#nxH#l z5^2=ru62*kZk98EXR*j;cd&6smkuzIE9R4Y4e;3| zZNhy)Kwp1!EbeP&;64T$TifTf9p!2o?|M^L2z<}>$ab`~ne(2X?i6*W%PDC{xq>-w*u*sN9+QJZmw`8zH3M59?+1f#dIs@yU%zh^ zeSF#U&esg3UB`akoS$b;?aP%=ces6!vh7fLZ}zZDvgr&z@11$q-@i>>?w(qwojRkG zUzF2zs=2Kb+?(Do*YytN?Kd}CPKP9F>NPxBsB8T_^P9r6bkdXOj`6QXee%TPzv>u# z%AD|L@m3s<)Uxw6@$)FkA3F3ElS(K*yBoru4Ojc&BP8EwXYXOj|Ky*xJ7;XNYtQ{am?jO0?@*bz49&<-}lG+E7VQ<{-?)UK51wv&PT|kXP=GW+zbA+ zBv!WQ%Q5N}>gs}X`P2UE=|=BXWeD!zm|g79+HALQ;Ln*&Ds!GmylY6C&|bZrj(iSDQL=*SR>3 z*@Vf>AJ($chb|OjOa1-nfZ>^uB9G?gx0@8=)ECVcK5u4?R!RMHY-DCE(?>1a*qG~2 zXR=34%)(fcwY@zJR!0x#37I!c{F+MS$T!VwEA6Ep*qKpQVG-BSy8=ckB$}5apx4bRs>c|x6v&?_ydH9~0v;^@O zCzc%trFrVFlmGJ^7;8M%l{K6_EQqneuV4U^asB0Y1vcm-<}1Wx$Ra67IKyz)wF^r=^OT3?6p?Kh3}8Xt~Y zCU@Lo{No(ahe5>oj;UnjuZ}Zx&foJb)Mg^e78C`Ol+&BPd|u7Y@Z#BiRW3TPV{hX; zY{Acff|f6O#_hemcT7(l?nTSJ7_+cHps4VIcuxm6*Gd|45`~sKoiBA?09$yg3^@rR zr@FyL=0SeGP)oMO9pL0oRP!MhZRz9dyGz|+!3<0HrpeTJmfQ!s*d0=01uwHdGIhMN zOzpUoSla3w@d1mR4 zcK;sh%bm~}di?dP1U{Fx@@jm55eDRYz1UB68?8@)v9CN4HrMTDm7p6XMpyl(`_t+!&CZEx?>z|t6-W?6t>?=RHRa#NCIfiEE z-sxQyRoiBEM2b1Bx@e-0gH4*CnYk=n^!QTv`0ti%A5a{@F%pMDYY|AhWzdHJ zxjUw^vhac}rV&8segrxT+0$*h4+A*H(*O6yVFQlArBD5F;6a6brtWXv=wnF25wq3L zoYvD}&g%BvP1Lg`G)KsyXycm!Rrj)|1P^@FT_Lv-Pg)^2KBX5+>;2?L;)-9EVt&1H zsdv?4Mcaq34!Bz$+~#ZhNj3d$3b;uZOz`K=EUfSYb_v-FJX*6^8wb3a`Q1+M6i)WJXHjfi^omC~>96hCY0ugH zEX{~E^yEHUgSUUWO|JPAR_{ns+p#`s-!(m_ZPzE#xer8iq205AQ7{mU58#B?v@3$X zfntl^^-~<~=dRw~>V)g3piA@#`U_wLv)JHx<38OorH~tSENIyYB?f;|HvKi3#7 zuI-Xjwl?yzXL!w_DF1!rFV4WADAAh?A8C7-j@HxmCKs5Mm@y=Xcc{Fm=UNI)D{K34 z`ap*n_^)O0DyhDw?;qId?BuXG7QA8KX*bZY_u#yVP7EfU*2Attq55#S2#+zc>)&J6 zPW5YURt>vNj`Z257t$g(lYhO#$-CeJ((V$R+42_hXTW)1LE8J_qerh?Ff4jNT@(03 z;OYAhFtI7SIYNARXpFNIVsNJ>odQa@y<}E zo|M+R6SU3=?|dUiU3z&G*aNF{U;Qk$@KVW`R%5Vceo(JuaPgjpr~V~};K&z0P0lL& zZ_m>i{QI?Rk8viL<*PzMLIh^IJP`gtl+iePzoYQ@eOpC=dQ3z?({vFlOoXH>g3eOU zwd4MHF`3Q3C@%;y$kweCI7S+;&6f&OJtIbMg1Y;wF^vNOpcCRKy!;q#cxJgfwc#u9 z*uEdh2SG&8M)C{JX3;O@8z~R_R{zPQQO*3xzp>oo(zdN?cSn6yv7hreoo{^nwN$Su zUWY<3%>ImwgrH`A?Buj{=g!NPmZveF1LDAzxLV!2x|y?pJj&t48{XYqfw|ion5>_k zoh5GQYhBi*do}ls)QWGZ{v5 z{`~ouE-dOlLFNj>{OtHpO8}zRZu%<-1_%EQ2LBr6pX#m)&X=BUyi{lc5P3E9HNcLr zpDT!Xi~rGdsM!y9-WdG$J>-ABm?Hr$t`+{(==46Eb229S=I7^Mx=d{I;P%yZl-|h1 z7#Ou){8^&h&(f%iG7?>`$NfGk$m^Y)dEhGKJO4@kb$Xq_N+u2tXG9t-?L$ z0^id;KQpGxxf83d#qZu_GtZ_E_;wk;0SWw5QBlzkJCC*_LPEjdJrTzN_f`Z6ix(xD z2iVzP04Q?v^n46u8sqL#Iy;3e8Rc{d;tfB)u3q=Ok-5IAulml&RMLyN;j*sl@+Zbu zFbWB?x^LTh+YUXpm%ENVgv7?*d-s;%8;WUahF2yRitjsX?Fq;9_tveSKsZ^pnB;Nx z1H@EFV8^fj+;f;rzq@cbgcNm6dhE zb}i`sp2CU2)9gB9&WV%`u&@yZH@(=Hp_UZ*_U+qyc|N0aAgi8=zn<=bwv&5MP&taY z7>#^Ei{|@lp!U#}_OhJ+t2Ar%F83c z&cF*KT1&QecCTER4;<)7F72qiO%Cm_*1z@^O(NsrGiS0TB*&7kB{X9!b@@+17Ds*Z z-y!Be82KB9ZZ80Os(fwVq_tk?j&p0d;{feXc6L2SF`?F9?tLbQIDBJwdT)^QTHiL^ z>G4;BA~^3GVKJ@@XPcW+Q&VT=$0}N!3XybqczPB>hitv@jT=nx5JTrfTMSr_A5W1u zD>WjIQ-npidwc%_3Ry#@2`k20L(%00ffd7GYtYFX?@jEwbFX@p(HjoyGb=U&0MI9msZcErfNEuq5fIA|FwwzqhFbN4U zUL`rDxJrQS+V5yAs#|sM5S;tX1915k)lZMenrFXRwSMP!SeilJjCPP^$6sMxL82hk zFLMD7s_nLD@68I`SRR^E(GWVtC$!`52L)ArhnTH7J$6Ko%aweOT6g1!SKQ>-*k^dO{dOe186xw)P=Vr$EKzp{!iB3O2XXAznw@p&UF}m2?Ao40+xHz&ej9GLY4` z(9son9+taX8(W*UuseW#d!CHIxk?3j5rOOPx!!PaN_%L`ue$p%EgntzeOU@2w5I(v&k@%%)1eal+Rv{9V`9a{#Y}vB5S7~pX9HJklyn8WtC}Q@{P*Tk z7jr%$PuqjoUOlRA>b`IckLp2v9x0a(5|2IfqHu$q|GGg~ z?9}>i}b_BZ>+^W2ZxVBF#+4e`Irsv-8+t_8>(r&cW^ZGLur_ z+js4H_PHH`MV>!`yu1`b-7>Vwc0vH73_aUqWzL#}>r;1}3JD`Rv>|C4pdazK%9+M2 zdruiKpE~7(133;29k7_*HR!F5W5&QX-8VoO%hdh;b15sIMQ4OJgK6A{fe zAH0QZIy^G+Zw7|Ms*qgrsP) z%tKe#&0xfCCi-?%=egk&1g0Q=aS_cDs5$eXQF8f8)(Z(buWGIyPXCMM3>kl_i&$O= zUD6nir2U?DlfB;|i>pB~BsyMUBudmca-C=0iO=_9GEPHEaG=#YIJg4r-a#(rp@!6_ zAYl_tDJVJQ<>j5Y`~B_3{gv9OTmSz1*3Y0_1K_jgfT))P$ujI)xQf|bgZu?^f-hj6 z_9EtQUb;;0<-9SQPHK_qP9X_k$0lKv>9Ha&3bKV)ydT?KT zZ;)9Zx9(C?l0IM2t>hc24R|MoMMW!|iq1o{Xo!nBGCbVP*Y_E8UI5y$tb2as+WWU? z7T2E$d*&%k=d<~?D;^_UeVGHloTjT z0&w}pQ0y5a3Q+$KfHJtCGab&{kl{H9g7|(!0bc&9lRabWBQCOWE_TsoIt{B?U1HQ= zvktDP5NC~aE;V7N@d{-7OK8bY`J?6$_TK58UMBHQ!_GpJ$C2Q=xotr<(OmtN0yXgl zpxN1O8Q`uGd&Ouf1qh>mwyC_Th+gCS!%&qts;iV3gEfI;jrWp>WEf<2SFkI_i(s15 zPsl+KRv_(X``e=X>!od@>>52LiOzLVInJ#b8FzEDnoaWjM`s7@2YYXaw$Lxc$jAKs z`N?FINz|F6GuxBY>YQ7Bj@aAV3kBr(dwF$p9n{v=KCb9aW*njNA z3Hj~=Te&~rDRGGkfiB>ku+xkAk-V1NT|B!u)Zmt_SK;3TaM{_e{7$l339U5SAE4UN z($XrYYHvgjH=K%J6_%+aC@RJ)f6`BH`3Jz$H%xLytIimIp)>Pr_$@PHA!#<53kh&aKy+Td%X(>Qr4~ z42XB~@oM{0Uth1rl|zJ8e&pJuXS?~r0YVR>xV(Hd6B}FfMe^ykXSYa2i1~0dd+UQO ze-@YO4hnQzjxPWMN#kgi)7X%gx4Bg+Ii=_1s@7qq-Wy%^ zaQC0|(rdB1goH*dv??Ckr8X8{FTxxiv6aDoj;qDSPmmJicXGj@I-~s2O@3+VaKxfV zV0-UHMjn9{G82QH7y=YSaae-)+kew6RHKHnCOWESBU#tBXC?5Ia~KWteo!_8cyj z38rF6*L%&!M+EbS@Pe9m@DO<8(s>q*F9iTRG`@xUDtc&o9hw{O?J{ZA|2 zqj>LA3~%s(qNl-im<>X^7j2m5iMFzfU}dCxq=Q^e!Ocwy+;4BzDA?)SspQT0fDaHeU^i1Yln1zB6c z)AG%ge!ID^7XNNCJX#48h~VI0M))F>!bHcl`|d&59d#$fN0QIMKDH2Bcea?6LJL2= zN`dAzph(1Y=Qd8xtN1q&=v)Pu)x2hOfM zN*<~1Pya;$vrwGcyyeOl|rq&AFHM;=XbT3)6XH=*%dsQ8k$UX>{~6&Dhct733JeCKo_(FMi7I zw@o%(FwyNp4YK>5){j_X4Mau0ah6e)i-&fGYzhu(Tu0SOxE`I<2R&tx@O^l778Roq!xU_Y9NS59}G7O;1 zZ0J)7zKW)H1v0WR6i-sF&k-3eJ2~l)lK7v;WHf7~xz;bMj&_ zZJL$7N^dQN2U7;H3E#j#3&;!Ha&(l5Pf?HJv?7|6mY(;1#H@nw7XT@-vT{AX?FSqi ziA%o)t)I)_XV_s4eh1~4i-0c9D3Pz1n zy9CAh`ufuTR%Wq9;Ey|;q*l|=IE2vo@p4g9Q*X{$xxLj2r$+|Pw(uPbCb1PpmBbSE?L3R6|)L(vOjDr=f4?a69+G8gU=cElYe3-=X4rmAB%#1W~g< z&HA5$D_>s_CJA^=M=`!KSug$Q$miNxJgQ!pF6F~v6{D|6oXRj2W2e2(dFl6$j@S@` zPW&$#Ltx4!!g}yBQc+bk2KG+)a*XmkLZL%oD&X$@8xKhP6?Y1X0u(@%W%8dYD}(oi z4>}Jvwjl#iAXoc<;rKUG(FOhnZ6OS~f2;chu?E)3aSab=CRlErK?3+W z)D!|UU%SF}dzsl%j$@}$hn)man&I=s+`XOYa1Xb`RN~8%J8_6nhN2VZ=k}XD#KOX& z{!q*p77#VBt+W7UE>vS^`~Lb^^%-=~@E2K!h94b5oO+ZFV2`5kf0v{b_&yJfw{2(V zMq|?4+$=J;{5k>?MA8*#s80}V?XE}yzB;~y4|z6KvXgfnK72l)WLAXRhPtK~#tvdq zw_NxP4Gkw>r}?4lBXuLO(oMzVrH^WQb8ZtXML;j^LW0ZU<;GhMHg}r7iUWQs&r=qp zc4XpmgAD~

kErW&s4-CU`0EEMKw0UV>EyJEs8TqOB^x&AHvmor#dX9uAM&mt_A=ZqCXW7y{%Y2C% zpBPIKcTQ4)!=5T`Mv$7MJut0k;h5PD9zaS)TvuREAf#DLzef#z`3|*YOR#aVml*sl>bf`nctmwgGo8ZnW zALP@9tLA&){2(;t@s-U`UEyFl;2aXZ0ctaAry`N!vv0C&CyH_8i-ArMN`Tz7M^g7O zscVv=V+qIhnep{EuHv@8qU}5Z_EiU;l~fEE|C3~szSs>r<~R~x4l+!)kTH7PaYYbc zIymwG@D}6xUA4cr@!!OrW2RoHIuGF)^u&uT@{?c!T5!lyAI~$>u46gr3W0eof!ZH; z|H)gJktf9-DI~}f1(%YzJo+-+>{N~(z2mvkI27sr8X^I?mc&%kXD!QnuzIS9PF|Cf zL}If3Mwi9CpQ)*-SnuT&La&Vu2`;ekAex$ z9T$gdfQZb2n>W1Q7!noe;`h4HDkZ){c|$ND4BM7rJ}CpX5Ux;WpRj!3&^Ovqh`DxZ zFE1}-q@;e&7=-y?_P?#4Uvc!OMJWuq!7dTwnsP4zoZ?e<;js`!3U@6NR+$6xX%r{o*;9Lg)btJUja2{fV-kSK!apj~?AXth{TEmCC-T zQ$<;ixltqhXauLsadpJGF9L~{37e_g0Xl+cDnOIErVMo`8U=lQ8(~g4~l7WLrMj^?} zrG#BO1rEF^szkh;xGy3&HJN4D?m0F*bn4Wp;nlvyu}?83j=^p!5wz07hyh)3`iu$2L+elH2N)5rj<(w+o*`JfU%)Ws^bsdNe36*gbLH3pb!ii(3 zUTYcK{0BJ8&D*z&tEvKj{&YfNWaPw!4?n%}f2p?mz-}l^@8Ezr=|hy(5fgn?hILkp zM11|N78{saw?09BCxi<=;603aGqaVwV3l#XgAl^PrYO^lKprOTEC@f$<%mUHWPdaO zS8TQX*l%f5%uv15FpZB-A#bY%({B>g>lb9FqNaWjdWU)QW>uJ=Kf`8|W7)@eHZn2_ zVO9$@9#EpEHTE(=pi#ilfz!rbFclS*t$X$m+haUeWfVIX%74?M5i9JlYqyhVZo)Nh zHY);s1OB@Z=avB7N=m^yxO{wkzFX|}k#_sJ14(52!k_v)yG*^GBW+Q{8W4hQ|GTJIq@yD{Ki%kgQV#O&TxFDe6=|AKFfO*CN}eGIo8Uau zQEX?x@QZ*nAb6Ea#y1lm-fqQA^VGC7f;YiQhYJlkkv72T^JwF(1BM`1i-xj%T!6{VO9{eU~%SN1~))@1c}bt<}F?2k+R`XTVNv?&C{nY zR6t45(*CWUkd6N$Bm+?E2ecSa6`S?oX->ZV4^G0Qab(@9Ra*rF*5YqMJ_iIL2F4TA zahq(%5e7uzIfY~og_0=*0Y3-p1JSpDQ0~^4h7WHE#)0<1yi4cJ*^TI^mM&x4zJI9> zD9BZu2#y~&Qc+p;@1S*`GzlC>AxASmJp zTdF5PHAKDhm?6zA0C4|+izg_lspqZfb@%OCh6l`lOmz`UCh~7ayr_oYpWUh>t1Zy6Mh@-q8bCy<>qNMbh22qwF=e6 zB5Hb1%lStGV5PX&SQ4Bd!dXhk&f98i(zOyaxvx$t$b7{g525eKG~YG5;EcJUWrJaq3~q8JQ|0 z-Nz51m@>8#>6)II$zF4yn4yLO@ueZnA}~9c&?3Zi4Y)HQ3h}jvlhV*vDl0DnjFa7^ z#Ae9^nkph~K~8_#<&q0SVgg_whVk+Fg7X%}Tpp4Cp7SJv~EtH@AQ&Jk4ISeF8J~>I35b& zhT_GVJG~a!Eg=yKf@d)c;M3p{(qdP+1yTjk1>k@~4zZfzdwr6Ik`g5v1N>CgxUj(X zOS@Afa6n)PUqJv9vg^W$H4~3;6*h_x;Tw`NSqK6rJ_UjX!buU#u96|J4BBLFv4m=9diJ&T4AuLg9!7EY?VIweh644&0+ zlNU-3a>MUtZ>?|m+rj_`iGKXpn?z$kyDjkyf%k)g-lJ43M}Kex6#1|=9#62zQpus> zyHudL>?YZuHUie(dWWyz_FTJh<6cCzF^e<>6FT*(L3hKkfNB|%RrrRvS#*}-T z?XK3)L&{asMWDZP!1xdez=W1P zyoD)n50+e^eEEQapDd18EE~Et{tdD!Ab*a@NJ>ifJO`hSDq3#3n_)?vHEV^R)EE#~ zGdyaCSKowHgpkyO5($UyRk(~IQa-^9*wkSGrDtQz zU1JrVdDvcCcG%IZ!t~CGQ@Q?pg4`vfeZXd2Z?xae+w6f%>1Egzcr-anuqquqh?x*I zv{_bX+%i#j=p*Qezv5thz$A7MkmPY_QT)(MrJb$gM+0N(Brr`CvXko(Vg*iD z8t6M`J}dO(5we$vwUsaOC8B~}SQ zY$eocJGB#Ikht9D56BpRWsA$Y0Yb1Yl-qVD^%Qe^g0ij+Ab_qx&gc%ohyUGU!TN*4x1}s6BqWgZ(y=PyScN zqdko548Ss!P+W50U%+td^?RAdmxw|3Xx z0TmA%2V_?=ZV_;5%hnu8RI0{!9e)-wShHW>jDTDN39b3wv2^Rk_y3lkJR%(avQvqA z_$)Y50;f{10UjsqDk&C0A4;K%41SK0`dct7yb7L=YzmyA$JJw3U22Hz^YWW}99SZ7 z%#@V;WAMaW9^&yY*5>xbIGL3w#I2WbiWiAc3=&)uimBm@uJwdbTfhz>7Pc47(D@18 zfAByVHP5H2DqaYXRyeFk=R1LK(`rhYGmtU!Yigq^IdAwVox9e8?| zKzOow^LIi1`|0;)K2}XnO@W|4h^G1!S~(1@#sk(y(7qQMs)AnDKVXMfP_c1=c^Y^* z#OIY;(Yt~+&R*jSD?2V8p5+_p>G#8PZRTPt)}`_ve|Dx@FxUzwhrsJ3q=Km<+z;%x z$?#2lLQ3a-lGPAi2@OH|MJx)30m00XSN7uDce!AaDYTXeMz_u$dmRclk zEeZ&P6Lm~YxyY)MLs#%Ti#XwOaTzg(6!}Cs1L*LKQ;b6&;yW&Fre36_VqzkKZxAv- zHPGU3Z_k%Oa~_^XHlT2fW}8B zC-L;ii@_mM!D4X$T*@Opv-^PaqPGT+Qi_j>pK&`D0^n=nsQU--YKJYB4_Bd00pa!@ z|3{KGi9N93pg^~O26`q``0agt2LU0qgw%~C>_?l%gLVOdayV;H5ak@f_<#s=5${>W zF;%Rcc!KH=urTuVvrZD;Z$LIno?Ssn{AdKDlqHCx?VT;8v((TsD7%3wp%Y3Rc)VYO zrOOg!+x;BzgYFV%3waK-+5emYI1)|oBPD=ICi&8gnS;2$a0{k*y*_qJaY#) zSW&45!K9TgY-@``Zf++9hA(;RtWr)NWx0jHK%yNT1xmSW!y>c4TbP@uU`m+F=>C6j z3eOOB{-ve?NKkXr`bAzu*|+Hr=!8}OD^{^v7SpZVgm6OBh2;v>>9&TXxmrX%#po2V zC+i+|zKp>ykZ5fZyrC87r20$NPBKt06{#+J7mL&G-rml^!E;XjJHLW|qxe1C@?tT# zxd`|bzlTSoPnSFDLUR2Zt$Db(u7RDV=Z*#30g#FS3#bjjRRSDC73ykgCQ#>R=m|QH zWn|nzJp|2CP{Ad;UnFay&m~$|s07Q9!plqoWtDOH`~!H5pCN3KsVJNfR}jQ#wS*S0 zWH3FOD?;ibtctrvxhVJ4aNV`YZ6k~aAiC3GckZIB;_kT*)_X)jb(NcoqI)8PFJ!?E zlH$a1xt~V_L;SQ2T(9GGKy3a2(&q1S_P!tQW7o=BW+Cr9SUF(eX6{y=oRCnp{>hyW z!1NFszv$p808Sw&cZ?QU3L{@W-&Qf%S27rY;UiKbaL?+IGGW+Y8wz-yK!hmY#al}K z&;Vl~>0)+E?hthGKR`qSwbTL?b~~o^gB8wd2V&do9e76pTbq7*&?Vid6OPFr6Q+-_04S-Xrm~?a&x+-)_vc zbf9{A?l)~Jh6wE@o)a)rJi_jWqTvH1|Fgp#s4qsLWLRRnP_# zD5EyBy(kBaI&w^AXcUglWNLxv%YYoQz(_q4o(&TyWJSQpBY!qjN{b)GjHhhoGFd1W6+t zq81|^89d5LaqT|96Jpi+^?SGiRZhYGau32CVXZJU9}C=N5ly9A(NC92&Q*rtnZ*BD zzaMtp&GBxcQd+r$q)I+NNhgHA1pD4I?fI91 z)ox}xR=Ucs7#oX7LlFPi+`@uvrN=45xx}@7oZP+{LJ2{xx0W?mFh-zv&l*9EXkyC| z!m%td3OE{^s`o*(^h_^vTs-s0-SHoAbjJ@WhcHQ29x5n!FP8E}TbIK6zr-c+G9k2( zE0=@qBuFXXrzQQgN&w<pW~wJoGGQN1k0Nb4_D*0Z^f2a3 z2y06A)YsgNVf}*vo_(nM)zn#MarB7r0Znvg)?lKjP)iliLk4u4AP6os#WH*$oGuz~ z3C~#xd@IB#()WW<=AvS9Xi}~D<>J#(W6^|O`4bQE^;km!)ueX|7)BtIy?c4d1%N zPp0>rJZ)2!Q+u&O;LVrv&&_WH)XHBU6-|5nrJP&wzy`|er#!vN>33}1Ayhubh|VfytOA`=uYkx^JyNVKKV9zQN`0ulv?j((cMd zV=@cGk%AzFTXe>qj%jU8?8la_Fv5sJnI(!XwB)&wF--hbB6@j!P$XG1m49xW0GrBc^v4{%jaIrbHz>NxX8w-F-U z#XqIVbDK>XC`CE>s=B(H30a$@#=jBpt^X%e(oVh;Ja9_~Itt)8JxCtrz*-2G==Mli z5F5%%$l+=K9@B`j9$KzS(B2^WbK9JEm+pGqy_#znbO3|_VOVb+iaNj3Nh$%MD`36v zfto{y^?)l8SssztLs3Wu1_|{_#u6 zqBKJ(1s}b4f}i>b#h={wef+PK&?r%X~6!O1j&cr1_gL)Y@ zYL0O1O~XVoaU3SSA(25~%;^x|7I*#Vscis6*rM1Y?Q;>AaL@>}1TLr0I0ahI19;Og zCEW(d89I9+!QqI!tTNyLjSu-~P@&nkdLRrEA>~s*$L{!Em|AIDxe;TxDpnhHlD3kZ z^YOsavrQB1{J94KnPz-1P&h;1(EMCYW7b zZ>B;Ar3FbU&{$uGP0wW@2RmGL956<>#8gL5MumAAQ34S+2E1Ur&hcXxxOrt{BG5)* zUU;Zk58CTKWWn89NvpwjyGbX2 z99U~dB?`^z(9j*IJo8a#m*S_#9FLeybHhw1X1z$Kj4bZ%&J!CBo)4y>Ygt6D5!lXi z)+I4#T$NmS!oHl)*6$glFAjW!Fa}H;n_ZKVv4sJ>unSlcxM=La_}MI z%N{JL#SW_57OP!&H6l$xW*}D0Pj%4(t*b<(ffZ3Q_*XLTA_KZ8XY~D=W%Vql@I-F; zECshtj}Dc;v272DZFkV);-(ln%K=f~!HZvdfHB93bQQvu?BOgjxrw4(mnW)_hldB- z1veUoYzyf}%||4NBq9L!0pQR*7{rxt4e+Oa)aWAA!cYZ2Q?HEe0}}#1;C<7t4SGpC zXR(XTy6Nq0QYu~;B(oL!pd&_+g`-!4`70uN!kNWyb7R*{iG}7Ld_rPwgE>D?NRmV_ z1%QMXH*hrr598T+5QI7cS>100fb(&nPPIUV2zQNJ%T`bmlq;fMTq0fg5tQUm$>v@z zLUBTB%|%|!+WO_*I}L!rFng}u*~hD?M^;*bO@xXPH4olo5qLnNHISbjT>-A96GMEz zE`;ImY2F$L3nf?CW#KV7hq&F1apXJ(kr0))o&)P|t^#47$y!v$XqtdI2;Qk30D1+b zJWDG!$BWd5ae~-GB{H40Hj|PNR9Nn?1rLt+PhkH>Q9bt|Z>VT1Co^N}&c@;a5zq$} zbjTUA`C`aw!RDd5E`?U0BX#KJ&^s4M`*Pbx0BBsgdNXpvJ*nrJ%s%^|_#vzt zG&cSm@{u^*3?R9II^aKAybCnUbrUCv1iEX_Io&|U$ij{@2*5eO2FdpXL`T8~+VKQj z>&ue_1Vz3j;kOChNYK+Rvd0C+sPE6d`3!oJ^>PuAn!yp?&JZ%U3u4GokD=E|$`!4V z<>#2yWLO^EjND6-I%Y2~oy_RP$9R*1hU1pX8DKG#v-0kt80Ey}N&rWeR7Uz_zK!S- zG;p!O<#D2c!s`r95LEf@-rpuSJE}-lpb>ckzWYHJmy9H}Ad1%zoyaTopF zGx(Olc4n8KfW$$gdIPwni!Ii!nggS2rKrWvI!y#}zze{lO!|c2GG=^#{(@#>D2)<6 zFm?oNf^cC1N}$h}$Rwky1U{_6Xri9sQ#i+L$A|00A%|&@9KY5%udSmwM>a7s9&az< z;^ieYAqxHv5P~DRm=#+Kn43&%N%(D-K@ai$V3srUU5J#c}?zILsVj@mp$}-7=vmD zx`|~6#Q7+heemM=Ty_-mK!{P__uj{dz}^sOzGychjrvwpo=CDdOst;s(-!E55&l+S zP#D)ah!iu}@9EfR7UEiX1Zb!QQV2xRU+UxA8Srq)EF5k=79ns#tEz$#Qy2;y3Aj@Z zg;XJ)8wFugm?iACf@0D(Q`^SP%S-Gd0C?V8em)Ap7{&I@fPh|zcxeesk5`I!Rh#Fv zU`!i{+B}Nr0}%0%)(>IG6S?mUfFC62D14|I=u^-?erGEqVkTS^Kst=)&Tqdij?6xf zM4)%|22u%7rE2oBM+i^x=?D@yeifKH%;`R>Tr3~W!f~GIRb)0jo^k9`)R-DYR+3A^ zb5@G^nK=*_4neFqK3O!ZACQMX)N^ml2I&Ch;6}NhqL9C>Ws?df^F)yAjp5_EE$rdd zWF;yxPNg%<)ILT;@H{%4jSD_u>J@Z)>llVuGO6h?DrFG2!WTkMbBGfFXj}y;PUHe$ zDa-NR02dg;2COwd4B|7uQzoF6%)VEwoUH?7O6D%GpQ8`B-bcr5ygVViKZN2!7+fDB zOCT|=k9bdnH;9VCXX+#|7l)hSz*YvVg8B?GOX*TZqTD})iG>^L{H2~t_ zLeU)tz_(1nz7o%gS?t>G!5%DQ93b>xTqPHAHju+b(3&v`>goJ=G}_%c`?FSq)M&V% z6ez4eqB{aPlIa|d3pdevX=DtV1-m~#t?<2y@fHVQ6q-~jc;|-+8Q`KISTcSlQjr5( zK>7hybro$oW+r;rO6mjwodL*>RQVMjsXSG*t80S@w8xRnVFeBJst@G;Zgp{-E@|!?5j#8vB{sH4gN<;jl z5L4v;+T4P&GYsNvGHpd*Y4md#`1L0G0-#7oVSLGb zQHG2)xDT*|khtoyTL{ei(v?d;e3i()F6f>|0 zrvi2jsl1I5P!8OZntHR1k{VOV=;iTs1iO*Ei46?&W#ec^u=ULZ1*usPDOr-nP}%we zPa!CVVF>s2Z?zH(f}x{Da`A?hoB5yDVmuANJc2M72F}^Z?%^} zNPr@ULIJ54$?I1@2ikyRV1V{>>;(dcqWvn-4Y~ca#Gl%bY+Jr9vk8;l2pzH`n}sym z@wI%2xCmBD-z!$*EXL&jv|c=vLSgFOQj5ng_`*_>x<)&fIk7FHReTOL$KQ(d%Q+Ci zpiS0+TkHgrVu}m~$m|myWdaZ`oKir3zc26w1x9)P@eQ}h@N)2|aw8rm_lH{j zkIRmfNTx57(4Xun9{9N6xmKurx;0O{Lz=?vXGYlcL@%}m?~o8pldbIj7C7~&c{!os zh?4;BA>p6!kX(n})T5~Z(R>?@UWDu-F%qB;5|7|`77>pf-rI6qz;>Rj91&nDbJeF! z+sU>}NqWKm(#ph?$R-!(E28OwraVIGnawtpzmqIxwlB2DAfwpi|B*{|UiS6oHJgZ(Y>x1VaQooI9`Sp2WUqR+ym?wuS>uOv=bTM8p(A1l>2!lgjS6lP-V+sp+1OG(fj7`Ss8biYOUgPt(vG zb?H6z@aTs1lXC&qhE1s+L#z2*-cv^gel|MyzTV%}8hYbVA)eZ0^;W&543_N?3ioCT zlTBy7mCJYRaD01SChBx^RQR#v6jRW)#ODuNi2D~=3VhRwEvCef)fGZ?)cF`WyNYw% zGlh$t(cgv9HNtSf6vPDz?F`JX+-iTRN8m-^mJSAeiOnv{ZxU-2$hq@wQbezaIHmAa za^mWYp|zy^B=tHE$@!Mcv8-Lyoqsl^&0MVNW6FOxG#?#;scxc7lJ}aYN|!~72wThE z%MAbMrUH~(d``b^wFmM})Wi3$DuqXzSpqF$Gyp#Y&*ii?I z+P3CcC#`JMYmt8x=G|u)zSI3`g{(%m2=!X6x6_ZsDyfDara5amy`S#-)%@+YwNcU5 zd6vMQX2X@43%fF)F-7(uPI9}MnJz$c2mJ}OyJVB)eztf4V$lP9Zt`L>P-bH&O3=LF zw_GrI;J{XhX7GG~hpQ(KR77!z{e-C@1E3f?dNAdhX*!o?BYl3B;ZFs3e|T2~g~Pq3 zKa{bKSnJ#R#Fy$bnk2mN*7Y}$&P|bc zzq~wETW_W>a-CLfw+5~wj}J658%SLiG#gyYMp;_^^?Esjkki88x?SB&0z&hR8b*O@ z`Y37Vv2s~)rn0g)XlqfzC7d@MrUJBIb z%p%1l1EvH5_+#B(1F3^=y_5PDLM$reCT}mVyfAz&{rV|CHAjVvZt?S)AydE7Qd>0d zxC*3Ske+$CuFuQsaJReSvKNDng{9MjZ@u#N?8b{;_zTwlzX?}ws@Ju0FbRJ~!gW06 z?=_bunn-Y#q=ZEvBDyt@n(q2vxrzJ<6(TZoB|&k(*Y8ILBm-^mU7x&gC^ndP)Zur8 z_mgbM8TCSM8)YOp@9u9C`juY!d1rdH(eD|V0>)G-j?}ghqf(}`qfS<7=4(``GT+`^ zgDUhfC^F2&G+t_ghigs?-CmT=KxjV^m`(T9YxuFCh_j`5j_L)siUn0Cv_tJQdof8m z)?gAS3VDH?Vc0H}2Nx?Z`kaekDX?yumu|6P zF9*(<8z>g09$L}Mnp7gmx*nGJlW(LTAs~Z@Vpf`$v#m>~p?2R7mqs!sG6`_zZO^J5 zy&phJq3R-Ts6_4;Zu{;Kv^wLi*ZLL;B?r?d1QP9xcqA2VTr1k9e;D3U%5=CssQWN| zO~w7j6@DzkhYz2Ts9MOaNVaQzIHaFlw(RTn=Zg>@X*}_(GdEvvsc}j@yi}a_Wz4h7 z`TP5GiHmQ{Zt*&Zh+ z1bnP-Fvz|9?ygX~uWafPgX?J?_2g9QD!kj2K4=?areh#~>EPQ1ZPyE0Vwu@*?w4$| zvvanc@ZtFR$HG9yC=aoBc_KmDvU48Qkh|abv*`%+Lk^7% zKS8TLM*RxgQ!Rhj*=>4_;#HeHeY{$CY&|_CRwekBT{pXo=OFtjbLSE@+xR-i?5fBn ztGYCUOJD65JkJ{SY<5k%I&V5*=hx>{_x9J|2M`4$ta#Mui~K$*d4wJVcE*N~h~ZHsUD zCE?65jXnE1DEaodUN>ZIoYydKV@h>Ce|0?3Yop!Adk}9TbCBDD&WM8OGI0JHGVD3Q zW|U2&>r;I@W|lFIl5E&Akj`oRtw#(zW`7 zH@a-~jEWr29CxCkJ8ZN=;rMHyFiN1`+T9L+vEG9jpj?wWV_^pUT$*)TzD65e)&26~ z^i{WC(Fvz{A7WrGL06pSw&d6&y|0WGOm}){;w&t5?5@)*R-Q_mo3UMn#}pg(&n@4e z^)DcwQnjxTdR7XI$$IE53b(zm;J^Yz3UPx((L;#4Z|SxpgQ+w>&^bbMeC*BH6NVw0 zyt$BMZQ31CHZLN@n_4;=Vgg>^XFYIWG0M@68QlEabSy#e^i|i-&wK8>9Y678 z=~0Cw!hef+X8=3;47?EgD?W+W>viEl5L*<0Asm2#oephwz+X6c)p5VMIig!TilIf)wYCy*#0lL zd`zZf-L+95KM^vnpX*~ue4&I2ZUd0x4`gs1)}{n8LFYVv;nXJFt`Rd+Q#)`>@Jdty zxP%sR;=&=SzH+CP>$F-HB8xYQh<#*vy_{;@0S8B$j1K=xtlXKlqF4C@PA6|;uAidO z13&p_@^%y;sRS^WfZbvYanPx=c6rnrEMK_S*AWnom6ChaOtH?H$% zUcG51xue_eRnz*a&BLqDZnkUvCA*%A_JDWu3SZY(jYh+gJjwOeXhxzRw~3KLwCK|1 z%)Y=CZpn@!1}-eP$}=0#cksv9QN6s*a*CN{$s7*XH&ooetU$9;ve}l|uJnzM z$%;bC${)7uiT2!@uTum0CYiZ5PStL7`JLGKy_x7ipJ;Ra^CFk-<39*_mHmos?#zsg zh>s7JO3u|1n8bya3sOV^^P{ir0$)6F;Z!Cz4^yHmAHTq2_L-=kAlxCEIDF!Fg1o$a zEOrqT7W5KnM@J9Fy#DmHxWaWUt8a#s!1e5`43>>!Ra>JOSWEIf8IyZ*^kW(t3hcl9 zGI~xK_uaGkN%_F{oL-4x8vdxJ7NLWqN0n5S-{y;2=snU-@#gz1-nZi>(vw-l(vSY{ zTjwOV_L^(O**E-)8B9}Mori&Fz%XG!q!?u23ET*3sz?C9*J(Y@0Q@7J9HC{w2p84& zWHjnM`oLP^I3O06_scifAaZQL?!sQjh@y>WpLMU_PCb*FamA7AYS$g<(U+13RUh)Q zIxV;6&39r6eX-1Qyw{}CsXm-qB8WmG|LD04m4vQb&&u9EkDBb)`j4M^{)2{-`uOAt z+@&jj)3n~1By4xZ}pK;Vx@BDw{x}{rklhFrQH&jOe#R>BVK{yfTdFVf=N67%iAvrC|sHLDG z=|Mj40KGAKUO2$iZuY)f2w>Z_kw+D&8x|;M=!CSXv`(lVUR7iN{zQ04?>4?&5#H;5 z%oMnmZrm@htBd-^PCLtmaIY-ZD<1-H%1=;6X%*O)&V5)`bB1Q}{3*mHZUU(jY~;U_ zk;atJ1}ToeC&U4pfixgqA@g0BiUtH-UeCQOanuNr*{;Y zh_+;HzUQilfkxY(hj-avWp8N*r>~^VPQ!Ps;^&UX+CP41=7Vny8&bNQ z)p@Qe-#%MAT-wX*Q-Hn(>Yg#@PG8nQt8X#v=XLik+se&-`~HhA$7T)|y2?-85&By> z-xp>~$2II{lNNmYi~IZt?N`rvHr}8h$7bZp4YxOcjYFkExiTcX+XQNkiMo3E4SDv` zyWbtnDH!sYp`B=6BN`?#FNc(O@@2{Rx-AV04pa}yYtB6P-|6yW&H7{xijq(C($T#v z3lSEoR0o634T;q|Q(bY_EfcPn_z;j(Z?i+c>$$Pcj(E*lhvtjIU04~e_eFB!{qk~w zJw>)A)1_!azg#|T6HxK%tzTo{*YjR?a<_CE*d3>EJS@aN^;Q5!+PHhc%bu`uchv|L zk6%R4MXw|CPn=nbvMQ@LV+smpFpxV6t4B!G)b~)pOgg6W1~-`?g24u1kodI|e_W;c zk(eBKJ}|qi3W7dwmNtf=0*eo5efj@tO=>4o>Uj{yxp_X)3ZtPFG9m zMBjNF5f|Ivnx20KCXMAEj7Zp5P^~QZJt(=YJIL6%LNTCwjjirAv8t&)87(P^g0R(Z zTiRuYp3+xle0Vvx^~_T-O4=t*w_j8~O5_i+KhfaGe^%P7we0HUSx~{b=9c>v3jyfM(GJ!|Wb;J1XSu7#XDLzA`muYAY5Y zdEVh2G0cEeo86^-8HiC3K0z9TlCI-iP&LWDdLlpsvoJN-gFTDwfXH`GFOOhJ9OgSx z6&@HIP<`d#@#6=E-=%HZohuWryzZRnY+`HcOr(b=PnEih-!nUWsyKc;9=RjMMD4TSfn%f_i=xBb2s!=(0my6Wm(Jwy7*RPWdILAz#Qm{PFSW(D_PU zJ^KTk%C~bWvRlee4Y9bkr9q?eP($8xIy$g^aZ~`>K_qi3(RUA7rmF_GM+X&RfCF;r2zQD{4Z0pu@?d!E=S0mQZO(^Ak4S zg874=*pfCZx7XX)8*xjqY0qKT(fMWNq0?6H{=OK_$&nucCham*z0_y)+-|7iwtOyH zXdBihrG;Qv{F-ZjnV2PDf9x9ViYF6K>du~6dVd_u;%6BN@dnA^?4aSoxYaHs2O18h zG^p(CK{qWLBb>?i4%(d`);s()_<+?KHgoM17dr#-mqw`AUwcM%9)X1os}X7w>M07u_eVG-5T)XN~D%O zR>e@5E~M$&{C#dac_pf{vYA2>*Z1OthNv#JUZgl(N>Tq^)BLUI0!ftyy|s{2|51{j z;2@?t>s*dT(hf2p5Rs}sGt53g`pSZG2OOapD0*%~?+O1GYWD{Hg5*8vb{NX7y7vj@ z(c`e!avA7pgc(|2$Bp5S6T;5xhYCLT7;c(k=D9a;B}t!6RyPBW=Tacf_{qe8z7WGn ztrzCvSr;=O>WaT`9g%nGx0TbM%~3!hAyexP`R-Z!_G2BB^vh5XR$qie77DBudz|84s0Tbr5d zc?|cGb$6}pufINZyJ@1?)&?IorHRedtg$k@Y5aL1C*J_0pWNIP`Sq+FrJ=o&2B-Dj zc5eASEURQ`xoUFlh~n9^QjT&uM@~Mt{k?9dXtGy5tGK|atjLy2>+M|2e4GXy#5+2k zxOxU+UWWv}>gqG!^c$l;dh&P{jO}GUDRg4jI}?do{e90hRq$3LEkFX0KQ|;ljG>vD z*N0@YoNT;0Y~51qvfj`BetITAuvJm=$d$RHW9(0vK^h;Nv()S1oso3?F+D`lc7EQM zO@2=Khxn_3rtGJa?~pBo7oLjC*cp1AeAW6fAj-3A?BEUKl+XzeJtIBK!@G98YMM{B zkzRIV(D~9i(fsd&WOVM9l9ho6DSczE{e^~>Fd>b;LWR(Jc#(vKh5SD9bur|Pk=B%oerP#OcOh*5=lywF_f~J%XW1&5Ur~FfJx2Di zySi-9cD5`=D(?!)s}K1wu>SKmzcJ=L$s9XA%x%j1(e>RzezW%UC(k2zta0z80*}$k zR8<$Wxb|PZEVHNAD@WXejv}p3Fy1^joMo=T)WB4i2=ky;o`F z&OkueVEvX}`Zr43W!Gu_%D`AuLFb~Ad}bLMBYxySbg`H7sAy|zt42#MbGpwRUcP(5 zR#0)+9f*v0Z((Cq+C*P21pud~MNXeDQ~sj`807zvvL@RDF*%)fey_)jQ}Gr5f84U6G`NNZqb9i`N#ub^g)@j-@CXLwh;c@P%E^HL9k}UV%FTESQ zdsET6`jYBDw|G#0I95IL%^4r>dTrHmZ9e^i`I&{poax^s?&;IK`E_GfNQ^o^2R6(%jCvVui=ULC(HydZWk~<4eHIf2eXXVgg zDWP!SI!y6D($D_g<0e=UUe^~Eugp|dRg}bd+G77oi6h5!dpRpa=S8b9Uu0fB`$hUg zlE2lFB=-7Eqtdz&5$!6w-nB>vXz6}X+ecNJQ7V|{xZI`d)%DkwtrUeq&j8m1v7yWant2G3ZV-dVsMAfl2tzmnYAqaMagM z3-R+mZwNf`m29gb>K`~2JK!H@;#M8poG55A|BJPE^sdtUOy?z?S6J)&>_cg6lEd5u zVG5*7iXQ<%UhGHsehdtpJ~17WH}<$`+8vx$a-^m zU43h@w5|N%H)s2**16^u=m46q{PK)xca8*^x}2pocHRXv5vE^NF+Ux% z_Lmi>4yFaiWvWd0FO-Y=7*)sEvr(^SFY!;0jB&2o!aUJXz5J1FilaFNU2&T2LH<~) zaz>@c{x5!vOY?gF8Ze^9~Zyd$ zfx)+VNlnxeS_M1$2KVFT3I0W9Nj(40FRE$+I3^h!hJKk$974twoip>kp%co;eoqd&CF@9R*+tZmDl(GpiYX0E+)Yi$4X zc>nVc6!rSfYyc-rFl$I;>0rBzWerqSX~0haKHD^CUrG;>33EV)fWm}HI>y=h3188x z=U#ay^lb&iHAZdoia%PMpD6^cUN3m?sm~k9(LTcl>&%r0j&N~DITy^tvLlTiJdi2) zyX|L70Bd@EfFRq;@Kh!>%>+$#eVTSp@ zyCa^CwQ~<7B4;O8dA41;({y82`k-a^{tGTya_3vewVniqPsl_>$UQ319`yR?oV{i! z?U@&k=aUAh9n%`S*Hnm7X=_fX5AJ-Je4$K+JtIkeFmL|yTkUn*`4U32oS1@_F&8() ze%o#ojuu|%4#fic^$W-p8J&NZ}-r`wKzq%`)>yGX_6xGDNVlc6NV1zASAyZNLZ z`LACp+g_im4*-oFfnp<)$f&-2`C=?h_8LCZN$I@4H+VUmdgn_ZYzUKfP8`WgSLT{J zwld_3Q+UF0zKGRT{_ky^M~gD7rfss%&)AIg4JDn0VMiG1Duu)*o7U8O7q$27#v160 zGrzUpP_~Cpy^Y{kP_+tI=-3TyywjSe#RNz8!z{sbM|+~+Iz3n9-&mQSW?-* zHWC*8g(jKK6kJ|+t5kh%&)@HoZuZfZToHlB9?U&GlIGZo40|8*54p{6aFDg2BueZT8>DPB9IJe*{ z{&s3z>aI?8TQ00H%yB;VattS(+LC6vVS_;IvLpRK_8xtr99+LC_uMtAVyE0Zt?#{+ zO4TQ2qcjK|D>IdQiXHef0*u43O;-tl#+^;t`36gINsRm*ZtQPzM z+Wx)di?0&8xI$ifztj|M6<*=>p0J`8w%D|8!LqxKMVou7z~F01iOq?{hr+8p9gAU1 z$Bwnzwm!?X-AS+Ev57I%qT?r*j6)bAR)kSQ9DQb(q^0Hbq{VFZs~dat7l~}4GD7f| z{zv7Nv-j$ArI)^poib7lvYp6o&{Ux#3kXo_F!l($H1NIo^4;+8`?IC=%Zuw5e=_P% z6o}1a_46AwBz<}HRw3Z59#!E|PMDLc&>+6VjiIjb2ctzxvz<%tL&R)lQ|?fPt`yp; zzOxWyEWbJ|Sed;jXwUz+Pgh0IacR=uS^$g6d3;>5C}Cpqrq&?C+H?&$#C&5-V)5)L z3_WBslKO%uNnP)~3Oy!go!3(_$mkYdDFl_qa7*+$*wgn_ zVP?cs5HOg|&$j-yxvs5Ai)LF>E-$|5W;$Y0CjHhXw5&OmG%-Bc`;|<5;UwEKh02~Y z3jNp5p4YPzWHbz&EVMa1Mp)%9(BF|X`7v|4-k0NI-_%PEHfI6Zs}aAbbX>@oXtg~9 z9&P?)s`SEKQp((tHEgxU2p!7`=U>KlI}3eZevQQf+!5p>b+MYQ!MtAbamCS5QT^X` z^G;-JO^(kN{9<`WJ#*dl_R}gCgBl;m(SSzx@7NwnLrEocqMz@oEsHSSF)lN^3fVJ<#HhFT7JRF=~ zc^YQk-gy1QbWNT_x&5jdk;2c?&4te;d!Fd&cz(*zl;et9(3f6Ms(v(eJBl?NH7RZ> z=Y6P&JQCL#btHd5sPw&P@3UMTUNyDTT6Wz!6B*h`t>q<)p|e_Vgz+0XsIEE*TIpmu zF1jDtdpc@U=8WB|W^@1Paa$?XZ2nNoTb+klOG=wMncv)dp17`h>q~vpnV~Jak7|6x z9m55koXoa<)BJs=FnKFFy{~>gR?B7&jf-x?+=!Xs?0LvbBEK(#qO9ac?){xW zYfp@AN<|i*cY1b9Z7uhZed~=p!5d!IM+JYZu9W#rIC56^o_5F$*-}+OcI{`IUXpsg z*Rjr3yAI?2(hdCr17^16u~G%~ISiXeGvu~kZm`pILYC@vB6#rADyU~m&}Lj7)Lb)l z0vrMFEoBaUmR{{V&*`B8=m)lHgR*QU%D{N zm-FG&boF$956z{{PLaT{b$Ux1cPy{&*gnblaAr~ZKntuJ0Qn)T!eHwXm5J{m%;bO( z5Bnq~Se4M!T|An&-|mMfkr6vAORHfT}ch4E>i`?JlXjV;KUJV4a`PQGkk=l%5Zg|p9 z;uEQt0$#t@$kg@dFE>f<{U`(|kUWcE^AH zI=AC*c1;Iuc-D9Dh1SF#FL}N6&rLLcgmw&_q+-=z68oMt@d`(Xp%Y@J%fiCK>-!>h zp+@Xf*Au;QEc$*1mA<6Tk8STM{0?6eUhi=utLVbRo!6eZCB2H2s&&GQjfqn3ZXrG^ z(M)P;>i)pQlq{cG@SIi5{zT_@PnpBkQKU9STSQ1}oXs=89(zxQ!BM}#6XfQc;*%%Y z>?w|yKF(f4yJycmwo?l0w^9CNVlmG<^xEd|gneI3+#qJUC|*g4{-`EnT3? zEBib+7%+)W2_zCz!6m>|TyzV`8MSgiS4prG5jYI-N8A4;^}6!(_qADl=Pn$Qm)uLD zuG70_s6J)>XqfwW6KnGgmt7l}J~gnUed6-W$mux$UZd6Ww%7+IuXi8GK9c)gxaM); z12FF`=l_}q`p2`_^$?Tfgpij!NrMmU6d(tkV3|ifR7D6{?LFq7WB7snG<_BsT zg{fE7A9z_`B<5utWB*5zw;hXoblCWb#RwQdypDm>G4G$TKf0sUFad%+gaPa!#9%$4 zfHQU*h03#{``L+$uXMx@ZuAoI6SVl&)*zUC%0h(4DR<<=IXlhgm&Pg9y~)a92)rfF z-YD^Lgzlr?0O>^X>{aF;w8~AvH;lK$u-|lZMOpi=8RNf)v8c`B;^M?C5B4^)vAWuf zrG4>?r+C*dpE0-FU9dP#>`=C0ak7AO@K8WoNU-{&Y*KEd%Q=ce4?hTcxSL(` zuzKo#E4P4Cnj$eVC^+Y>WPFd-R(DC5&ILBR$c>S~w=Q43nv?VD{<_a}Vux0WQ}v%_ zI~>VOvsm^Zu{wiPbG!QF-@n)IpIx9ov!2-Cz`8*smKjj~cGm3|TDK)?HrTDb@wcyk8q*a{SPH#qFyUoUcA;th=oAe)0^j zNABIGV5ZL%`5Aj7t`(HGZ}~=zAE-8%ADdeUS?jUu{lmt)UbXK}Hm%QY8r|HKMeqst z{%eZ-@28LLFlLLcq4FnIwJ<;W7Q!>6?18|wf{ooKFCdOjlLvh3pKUZa%zGvKBSn1HS_*RRXFg}I#8q#(@P;Gr8kMzslZejx>>`DM zn<`{AUYjeAo*KMVWA1rGfkmZB`Yxh`ftmFc*R`oTgAGaBUY~4E4>bt8cs`2Ort#Rv zbeW(-?>AG2XI}tTd-Gpd?f;dQ_(9$cBap>V2_ks){x(gM)71+iW~_r?KScIg^m?=t zy)cq+0{n?EiFa-XjGVTA90tH6`b ze&JNtNGR)uRP#X@VgL}w4S!!wv7nEav)PkxaPO6&fcXtF$t{#PtIv-5g}Qi7Bx~ir ztbeDcpzYtUO(9z8%4yMI-Irb2IzBze#wUE$TX!ahGWc%ZW9NY)^YnxD^9--dPm_@u zxc@jv_P3X;^yR}Zv2&Dw5eRqM6X&?{XS~4$pw*KBnp^M9jDAfpS`_r0V;%Wd5APJ_ z7I$IeW6`R!({4~?JOz5dV_JEtI9P(l0@i~c-@JKK*BB88&YdBw<*KNw2SWO- zYt+n$Rjk`HLy(?Ssh90-rrG^TL0s(l6FS+*U0X%=uGKu~bnR=GrB{tLOQZUQue2;| zlJX~2<}z+K^*`xjH8H+u@TukFvU*O=1Raxx<~=c%y}CZ9j4To^xXbwVEp;F!?$^`T zXNSTKer&{K`Yt-U1T4~XKpJPat2p#I^@jjIpqE3q3&Sq0k9C*m)Tb*{M2Ut0C;sqenCE z*HQn<@lpTM)u6+cFvNZ(?qCzmp;Gg9E?J!y5l=kKM10u~UcPZ$%FKy^Qk0#7ZljH{ zr_o@*RZf!*>s^;Tj;b_eywp0#Hn4qF3l5J#U+6V16|NWW%LTYpN^|NQ2rGt6pAj6R}meG246c;Fj^-lG? zdvB3@#zXn{)E(_f3BOpS+;ISD{QaAfIAmPKaM+m*t8Ft4@CV>^ujn)r!^X+lOmumg(;^WPaL4XLPt})X?OTM^8%Z zhs0Ks@Zf_gbGD`S9j9GMAIZq-&px4E^Y>f87$jt$g9SfJFzB;$a7YmtH+X#GF`??f zs_l%mY3PS(mX??I*(99E`$(yGdw}&ts?_y|eQ)^h3bf6+rf{&8Ut=xj-?cwYe*YRt zh1#v^=Z=dWR{3?{Jgn} zR>xOg=Tx5iIL?tf;IfOmyAsGhFc!%yu>g7(!A?qqaUVaw7_bBL-2NsDqF@^@kwcDM z5r^C=tK%P)@jABVS2mE$GY2ykm&OXT6CpcQ>x;)g4yUt#ubOgUkwYX_*+y` z#gSgGArs+Y`osE(o(zU7Z(&y+WGOzJIYWn>oShePjuu*C83bIO_JQ1bF2ttdsF`dt z1&J}6BZ{8V?7P;%O+ks~uPbai&07Z=e81WTophq3_)NN`KwBjH-O7eBNVIaBi$o>q z@%ZtGX3JK^?-`>727IzK8V6~`RKF$)hP1d~an8b&%sJ!sCJV zMH#&eyQ_BY21h#?X~jMC2g;blg@Xv&AGGF@v~->Gw^c1(#UkL zw5Qa{Y%ddRt=8Mc^Ww-&>ln&0mi6Izk1IN+pL|SQOlabc_c?Gw;^2oJ=Nvb_B;Pu_ z(6+aH%7XgXyK;f9t4pV$a)O#}*PcCtYF0zl2Qg}WZ|!r4R4IyzJ_H-X_hArJ%GHr>;B$jU8{E)PCpcoQFQ??V!$m6eT1(cwn1oTm!d_9^zTkx3r;{Q2|O>u=*g za*=~+S9=XXNK~9cAtDHRqLI$RLhwM?@POkc+q>#08JS3QuOrJpT!t_~3aklE2^@%5 z$iR-~<|o}T91O!QT^y*o0>J~HB87MGXn^PC=x$f6!IHrAGK_t3Vjh3C&Af{3^l4>` z<9ZM{M?;FXHl!Nff|`=&ZpT>!@+pSoKp1!;N;+)1dtrDy4lE<7$L}F#Jzy6d{O2vC z*0iV*$1-U$p&Je*uUi->=MI|Bu0jk+2mMh#%2sj;iWy5jGP3a9F3+FKA#CEqSR??+ zR)bbP3NaO*I)Y`yT8#V9U{RVd08m_E!x3PBKY>~Gj@%0CX{Ulzwd4>2Xn5d{La)C+ z$p?(3Wn~HgFVd0GSQTcl&b3l;mXH$@}qm@2hLTjxGz z!0a^1@f-Gn6_ypg6c!*UCH0aS>^>!Rdru(4Br;zd)8Ed*jc^tq)Fu@1iao;@YJPwE z>Ytx3>)=oT2^rU;qtHJl6f9X-SPa4OLOhIJd-o1Uk|$odbBCl~6`G7T5~vZB3ph8C zk#!}3cZh?9MI1y2-ci_~8U?UgPdp`T`3`~Wy&iuX6XOw}BZxye7Age~;+dGDZXtlH z|8eDyNH6T;@2_(G%^OTy-$&Z&i@91b5E^3HBB$%oRy$dpSwczGvae)25%3B)H^9nk z!7@9HCPpLd<9MhVQr$l2gfqF0HXa98E_~iSLpC`Z(;)xdQJ>d|Na!2^wp5VPS2oK6?Ik zYH?Q3AE^ct^(jceNI?9l0qg^>2@j&HdlNb<3jpVKZQB+O#`SwSOh1R~itn!SZfK{% zH5gG95ntl}UJn@A6Q?7tqED1g+y@qxc(`PIwiEz|d&oOrt5>W$Y+^xLJ^K4l*j3&> zO$7MA8RaF^cQ}>M_hQOzCxL*h?D|_oG#q2Unwv9*%fC$_P7SnW+yC!#@q@_o%KG{0 zWaw%UrT`5(W@Ocb78zYa;(mfJ6A$%H{;cwESJjn?n*pVp*I4Q`gcl&(K0)*kUq6g^ z5{QO9&TRsc@)5AQ)q@6R7K}HnM~=j{7?pqhS_6h7pBFE}k<#A6v0G2%pGIW-jBtYg zc{#8O3m0NFR>BBkoLGj8!Q!_q{{awt$}yRu-u< zUd$4wgQPc6(f_cx2sJb(5Vx_UHYZ`fk9Y>-?N^Vfr^U_OAF@IKku~4`hjWlc?1wWc z&9}#@FTmZyl(ff1@MA5g$}GW$rKIDesHIWSko!ub?2dbSO!bWj!9`3EIciejI&3)pT|P?tGBXI-sWRHnc>T*wfxxSO zU?2e$JtHmYi6G@m0Jj4Nv>bkWg!J`)BxKYfQom%qQPQU&3cJ(u$*X8u`VwRw@D0k> zos@2XiKi3=DkSfIM+&mMQz%M6H7qG3GGAclTQGvk&q9g zxh7ASTFKe@6?E zEu|w?s#^M~YJbJ9*(bZH8Tk9QFzM^-8^My0*~lUQ3+kN5u|mG8GBS4qmk_-7zwUw6 zFIjeq0~4I-+b1L> z871NUwa*D~3z&->+T!?Ugdz};!gqiVC9DxX{lRPY$W|S3pk#QYCD-5H1PSy%GX@j^h6s_U@`-f) zFINd2X!c}OMqPGde`X3+xtfPx#+P~sgKSr#7LJCfEFm-#S^9;a5ZM@dSH@WfhNt0F zI$VORqLP(B66W!-L#X=s%NKUsCvR|09~}GkRt!;+P$Wu2o`)k!R4FddK!Hm+i2IIv zQF?pe$TWV5f$Lp){LlZr9xws|QmUP=ZUs=JcRC2nNvA+%F^uFZsdiFw3YpR{zCjHL z&UKH|CfM8IoxA#7?>wcUVPHrG;rcBoNqR@2kTE1sl#-Had>Bz{{o7H4dm>igItCDt z$94CP{Ld`GjF(<%KO6%*0o&1|m+{M#aDoQP0~Gpi++PG2dj$9w*;!bk)r*m{y&qnR zCLY6+Cviw+M%r^T4VvMVeg8_H3C{vEKysjnf>u!H6PT;xfAf6;<9%QFXK3{K*d6C* zdIuy2kkOP5J*$Ri;wku3HQmj2W=QUsW{x5@J-wRCuLR)2?V=A8rU&Y+&!0ZA{=WUc ze(2bvN$@XF3#>yVD1PyPjCbdSG}WUcVDwC1+71WwAn?KJTX@C)yp~>k)%C8>Pt2GE z>0cah&}dA~2nbw-;7Ah1MloNHY>*=aTt3{6y$vOP1OYNh6@^>|Wkr-=C>oN0mq=8; z@5i>%_bp772*Oa9RYE-q0jvm+c%lZ5$L(>!BBJRm-drI1r}Z^3;Fc4|8;R$QFK%AQ z^uS$N#Xh>wW5PRAw3Q1LiYbuEIPVj9zidv+x3M>eK%fmQ1VH5}*evQAD8s$qc|jvp z-~FE{$#C68RCv>t^LT5+qd${UJGkH|tZ}j;3?ldE2ki@P9cOCxl%swch#Kud>~tSo zXY9-0@P5|T`C5E5nhhYLpxL)?)J6!&XB7Azt{gD^Up}UpaSU(!!SZJ|I;Dij2STzq zG$xUT>EQ6*C&Gr{gI`3+e&U22oS5%@4ZPWB+-|~3Rqk(j2pgUaW}s)EY-a>#GlQ^$ z2I^a6u0coKZUP-bnfcqgD;fUuY=(@xeH@B#rWGBQE122r#EROf?AK2l{HS@ zV;NP?5Kez1N^y?Xv)yg&74-oqb%$>xtxx zC>mgvvlE@#AUQO!Pg-3X6#fk&U4A9|oMtVL3euAXf~j-eGv!1jn0|vQ4O#eMFy1GC z9cF;Y{rfvV_~Qh6E`iNJ0yMQXP~(dQQK~vfFRM{)SB~&j3C;zB zn=J-*CP~^BmklIIk2^q8!{8KML%ywb`pufx_g&YL{YnQ*&P{OWqVpyxE$!QWXD%tS zHNtT#B_&Xt8ibQ{(EBVSYifaR0k}|w;IW6E9|@I(AS(nI1kv=Vcy&SybJGH&6P+-C z!T<6TOULjnL7miu#iT@JJ6cHe>Oik07qJWxZIB!ewb+}!K z#1~G?K7?k-BK9*afqF=JLkbl{d(o)xYR29;6DYi^s{-yEhU1gLS*eK;lw?943}Mv> zi9b=8aAtL_wH#|vLXoZx_Xeuzp3z$1#5V80kNzX8B@3=({P@(n9$emF($fUz15mG8 zL@Y&6(3_13Kr|`+Zl~66*Jzi-^+tZsav+KXT+NDMnC;V#gv#N395>m6LM)j^0TEJ? zmF-f~&ury^q!VF!uq1Vqe6WwPkL;!-0*ctVvv+>odf}B{kr{V8NiYWE=6B*)NX4j< zEch}(9?gZjOB^*qf55aKSyM*D^uhleGFb7`B_7;du*%jWN%BSBgE0btKtpbeAVmhl zWOD7X%(g=~T9is_dCDlyv>kZ*QBF4i(#o(w+@P+=1mFz=kkw2?$}6Cj+<2&rf$Ayl zKL$W9{&<5;kE8&?sEG^}c{9JmQWofB<8Zmdh&qkno3yME-^0ewuMRPcYHSpxOcX3u zHtDS+d!YWOy*@41pEeX`pF4sZ(uD5|#vh=n!eC9kqIYK%kGbsTDI=^@Hz*#IO@(y8 zWeCxfaHCsqu#v2bU>Qn=8vUnssfda_xh}3Zwh5b#? zTN0g_-yI{=T?BRuTG4RW`w(30jAb+K=f*>Sv{(oh5J(r!gQ$SOYg-EJa|r+sj{-8@ zZ|aSS>>l|NNGV>^ajZA;09_8s@bF7yHR#J!hl>g&k&|_C{ha7bL9fOy+r9lx6BL#b z;Sv%86CM>}OF-%R_16T120T<7b!;8(Gl7XNVLR(tf z-}C~=QtIJXchS&918^LHJLEGCf{VWl2lv~37K(&#L>=pf6T@uq!vrcxE^cl!rb=k3 zf-JBW1a^9vtyNjc2sdz=W$DL^QqW0*wMmBwX%aUPP9zO#s_5qqV~}4FhYS|$@??A2 zg4iLL-IDm9c?h_$cn-l73D^mbwjs;(1_7mlGe*s8R?6?F9Aa5L_^}z4HrG=icq)Q< zg=i)kVqsp0w3)1nnqaXa)VUR~ZxP=LsT-tC$W4|(;M)TFPafsXj(dPufky5M?IeW# zi0YNNb3`GHl!ci4%Vg#gcqXaT~kcmRyU zP*d>j`(7{&5xQXz=lRr>RQW!5hsBRksL}W`J2^SUJFc$${;Ic#fB?*Xr0&sEq+N(v z-oc$8q0W{x7-}m6y`3gNDRE#{S$M5czYQhhNNZ*aNMGV1%y|Xu)v>^f5UUs8mW(xR&feOWA*UC{A8p)mWJja8l6hz@x`0B1}&5(xqx3YO?^p z2}Ok*Fpk=3?w8&0-J8BLi0UfZS$P?zSs5IUn+hUHj8O>uM(0bfZP?Iv=_mc*>5VU$ z#rAGG5qDE~?TzlA;y-zOHMf%eioR}c=*5>AWs^Z~o?@V2JD=%WdVF=|X^2Xcd%4dO zum?hO9I$m(@HjR_cjxuK&^6znsIlkD`%et&Z*v=4UA5?yX*O=v6fHU=>QDYek)1XE ziaAf5wn~%dGymJ2O3l2LU6&_KUJJarY1VNX{X0snId^fcP`$$`W5Z_T^)eaP&0}t9 zS$rdJvL#7f<@_oqJ2iD^F>Bm*pnbaP`A$B`y$<7sF=0fYrsMPP>soT;D=8~!rhKEpn!7=PhbPh#>ldGo?ky*^b{rI+GfNpYv);K*R_ODfR7z_oS%yk@_0EEf#G4|yXU!uczNIT# zc!-N9Iq1E-6L?(Feo=#z#pz$7J4IzRNMkSQdN%*F)~3gi^wSwkxwdn$ z*=gB@UNqjmb7v$Nw51ULYrt9p9(`fBOIxDuPLV>PrR4TU%JUQrid(n;g1&rSy^15w z0E8v~WpycKkF>EIt3`89Gk2}iyBt58r+O|=StPeoDW5l7oWIDcztDbW_tt=4fsvnr z^zPn0c92%#tg3452RALz^QpR*=Q-G)Ah2`v4cnUZ)}T3f{(rbnqNSfw#(Mj4h zG&%D{hqop=1x@J!^t~0~QyXa8j2yE*-zFtTxV2q$)cc&10l7{Y&HfpFeWxns@0kdh@GeMHL<%sD zH>X}ih1CE#&U(ynp&%#PjGzaj`kHNA36?JB`bv zL_bN6l5h0wN;}Re`_iX3_u=AnZ*yMK``4mQ?Yq{wZm3!3vY}y1l!`OpOj)9HV`rC# z)GQr*bAQcEAk1#~GdQp^Ge=!`N)4H-7+`fodll}D2wKWtu*3-slza}_0- zuQhkHL67Yg$_@e#0^B@<{W%r=laqk{jP_NI|NTKcU?iuaBE9Vv0}6!}oguoy+_b^M z9j9q2)Zbith{*z?n|(~}-FcKwLZlhH0oL6|EwrZ;zwwM;{t(d9-cRPJQfk|*<9jmA zySFqUEA!+%%Zn6j-$QS1_R>x8bCJ_*)6|4xNim6F>dfwlOp<+hrs&Co37^^dG`?IP zezX4IL8YXZaUT*Nzs|iu5{RNbe?0#c?xi7ea_pmrVN~=rxc@uATSWFi^1nK7JbZRp zKxc`tj*U!BuYTPBE5gfZnEv5``VmqBg!syfN}*S7lSp^@NDp*8rV9oy&R_7QXJ+Po zJnbI&t+k`Op`Y`r_{XFAU$-gKUO4q62RB}O{DDp=`D3SSGb;%W){JBU4OQ=xPE>2^ z=|2zJ&v9F`E-Tjbd!PMaVa;1pCt5=z>;HD7?B_{*>pCnT$06-YL~|R^d|-+cY6stE zfBGiGC5x#(31n!>#MlEem2`k%pJu_;^bGf%$UeV+zuk_0YJ-N3vA*y3BP>rB%}TQ` zdruetU~$qPy0$r3ZL;dQl3B2c7Bio)%0`uKENwIwD41RhZ4H&}j=!#{>1xg8Q%Xg< zRz$-5;m1UQk+0WVvvUt`v~{Wz(-?fzvYfgMx!)l$x-|&SwM8PEFoL`zf&v+tqIb*k zv5kK>mADAt+epHFQD=iIN84ZF4pM6ZvH>nM!<`v~mKk(5G1YV!#)Nz-Kaf31nx5q0 zJRYu-F5>)*2geG~`jK5FWGk{#p@7P$D3 ze4VpayJo(aNF}9IOSZb?df8TAi~VmTOF0j|y7`lw$$6La&RcS^gmB+gs0I^yMbXqk zzeIrN{B;Fu|HOij)%q}p@S489;6#1KxFrhnDL@$e-CAXk#{$kK`jYS7y(8ux6~&x* zf|-h&4J#aqW+SasGI<6iCnysOPm^(Wh-wFoo(y8)Yir;Bm{}}J*X;$x_5|qNvwzoBRaa3N5G5;6w4-__>2Y+BejvYN+t7&LK6Q?BBLu)g@UK!b@GGKa zEKiKe6IL?#Uslp4TrY?!ifE7Y8kOFKXB?@Cd7` zimeC7O=G3u5Q^au^6BXcJl-n8+Sorlo&lY1#N5cF>93MWhiwA8Hu05 zEX84!4{8k`?kjQ@sTgFqQ0{m82n&O^uD6?<_uJ4!j-L5#-`?c#i-npvB~NRXZBbvx z>$xjnd`iQ-Tds*bQg`#uk-&YNjzYqxjOs6e$@d*vr>9VWqZ*mdVaC)4)t^qgBzIaz znh=Kp>TL)to2J7Wh2l-Hwx&G2P34=2W$HoW$8u&_xi;Ig)))!T z4YmzXFt&P@?meG0nn!!cPECU)RbZWe==*LqKCx39X~wRXv~B9L8xY*o!gA4Llv;6# z-Jq$>#6Y!uTla|DkTxJ5+>)d1;0_-FP!8y}d(;~+wc39bmx15rO^D|Wv^(&Wp_%fc zw&U_Fa11(>YUuW0f`~P;M)j-G!p@+R*K~z@$UABKw{-A+*Bjd$t~^b3Xr()ti9-LY z$wS>dS?=}oX*sDqCI0lq%!?-s9$c`Z8M{5SO-GE3cjp8tTh04eYkK+7y-X}(41?)Q zy^GUCe;epJ%Hvy@@Nsz-CoOs(13ru^lNJ9!LPWOX;DCUT=dj%?I0oQ<3h=}2d<+KA zI91QJN`~TE1i0y&Z)Zp*RD1GHv9zv6J-Wiudc~WmDgDv=gAaN%M0Y+_GFv*VCj2r< zTR`lHLlrv=HE9#`sKeKvsj0mYLnGwqQVV*jhd5Rj{R~n3@myDcwb`?*X*#LqW<7>? zEa6AnO^X?Xl96i!3;x-LXJ==ZM6-R)a&P}TR08Onj-W~t9K1nE&nt_8p9XLd>!voR zVLK$CBE2hC#$)Z*71z|40isj0)J6IEh08aV?S?WBl_8z1Pm@@eZrH9NC)dp~K35n< zHQFnvjrQnW-BWac?oMiUq+_1-F$mAj^bhVC`f=BBS2H$l{YKj2lbMHqP2SF*wYu*$ z>$Sa`-^*81S1lxNGvyGYcEnqAGqc&^nj7Ljw~&)7jw)BwkMy|i+F>@{-uo`qJZ(0= zU9#$1Vzy(UGzQ?Wbgr5Jw84=aX*sxDX|puNI-GuNc>b)){QQQN(1MGjoh>Aeowh?< z>)7Xhz34O9v^_Os&3Um`x<-fgO0L)~xb;5KUDbS-`*GUidechc=}IT7+~uVG3VLjY zcX)&5Uq{)WHePwtGB}@L@gp~Ewxn}4y7}Z?WlRwy-VQ#QZ*X)ngx$Wps*pF1^6o^n ziuP*w{&p?}UENpZ`Y$&gnTwx!TX~mc)99d4d*Z9Ux7(geUlxQ$1Fsf3*b|^Egg$>y zOhGIvtRCH=%Kah#oZl73xSHAxenygdx+LH~1+c)g_unJnN`RDU7;$o^D)oK5PsiS`^AFBRl%9y*FoCJS8E5@ zxwtx0?HwE*j)zXBwWKk=c4G*OlNz+jd2Mi!;q0%}o*YlP%R!mItxrOn-?-J^W9-NBtnVN#8EH9m+vH9FT-ebqR4 zE62hs_Nx-+ADhefu#EM(+7z(c=M8Q>rn%xQv^*2U&gWp$dD7Q-@ZuuRN{pIh?(BWb z+_TD=?UPx~+SZ;z9p>S+#gBq)$J6;fb~RS9v}RULJ5xh$N0n$&V}QmIt+cRucp)#QeC^t`Xb-u5dK=QU zYBp^Z`I!5&hj{LMKOp$?lUe$mhReNo>A$PZ{pehY-eho0QCZo;k1HU$tiN9OR+~3!ipp}0~nqK&P>V5|;>DT*imV^t5f8n8}a4CEp zNs`Kz)K6_TPx|n6OM=3YbHyHdhUIaE_i|K}biZ$;93lSUX3f@=gd4?;fp&Grt1?#A zYcyymHR&{2vMY zmbVjI@9brh$e9Z@9kH8_OWmLP8WUZT_Cg#A{*_~=W>c7EmI@n{7v9RzrBJE--02dm~xI zW*uT3pqQ8jxP=H$SdlPI_dpxFlJd{vc3>a$@7d)@HurRxWZ1ZR;WR+O2yAQbG$ZxPT0I*=i8J8jym2(+Dv8T7?Clwf`hBCF9CNf6BITSoCsMP} zmWfb5^?|HAm@{s8M>EPSAu75i$Lf+W5o{tg!-l81s1ok9Z>E$PXOdVL9{hO!M*HHz zXkYjJiDl1p(`hQ6=Xb)l^g8bvzIHDrM`~&??8wYif_tEuxy$LikO=!Qhh#(Rw(z8+ zmn@uTf}{<2WDFN?w`W{s9Bbi{z|1CpAg{wSX2Vw7fR_21SflFj&@b)`*qRs_Wt{1* zypldqmqOzxeuR>tt;u|8b=gAombR@*rcAy}nB!!Kmg9{efPzsqP1LMY3;G6wLxp#5 z*ZFHNhnI00M<=FyS7WZWJndQGm?g&Yl;yDmw{nG@M#)HUFTIV@S&!8?ck_t38)h7% zsmd+EI;Vq5+foj(kD9A0O)uq~>1@jET#5SeLzeI!YHEDylRfuocBwXGO*-Xp_9qT&3=A3VIf!N zoHJ4yniFRzR<&@l;-SG}C|{Fl;o^!xw83{JEv*77yZL-AwM7qRgFP4S(%8t9-5=xK zx)tkh)LbSrJiAl=k~2v+zCju9ECErORc9 zqpgCxG0R0pS$H~Le)L=FoJh2rac1jmNu+DP39k>oe)!t8+|ykv!LKAi*)GJnfBugbnV>z{OvYPFV(Y#Xe27D zB{k-1a_n1n2CkMn&h*uBjePVJQX0wH#4|V9A9`c|uPIy2GxweOH5%2amphr4=Vpy_ zvf2+YER7GQI#4b9jqNcQY+&#GLB79niI0?L)T+TsV}JSK!!>#ijgmnpg;sm61uQC^ z*R!WeGz+}~+gVBPD-4|dG3^~3vPYqqqFyX@HQr{c)=zqncwwVsvt?FN`lCl{8#1J~ zA_s}UF9;{?vrJjg-Vf`zf*@5l+R!6Un2~ae->}ir>@1(zX zdLp2d_RP^!pLUKUY8R3M&!3TfIkeH`jz(cgR=@pU#um)7c(>C00uO-)5o8w_R1E(; zlw)X>cVy2dMW;isE2c7(AGbwc_|@|aUf)2f4#{Pi>Nmj@*7 zTXh?K&L~s`cy%oBVxmIvY4z2{MepDU-z~kt-GhYpV&OU)Wtk$F%o)-;+|ZP93H|L{ z5~F#TGsQ?Em4CV)aC%Ma4mehN`<3|*gte(FIZJ$hTIJfMgLJR#{$=^*u=LsiH~eKz z^TH|qrYarF%IWb3Sy#`Wk5kvQ^BPJkM{FTeNpXZd#p) zIaFLx#Z_HWGiNmPqJW49=*FtljnhVouCpDD31X}n)TTe$M6X&icUjN9HC$BC(*4#1 zoq)Qat%WRZczu3rbga8g%;3!B6o$b^=GRsmn%BGyL@j(7QYZcxC5ncAwMuIidT`$Z zs`7wA{q3b4r(Ia!u)1um?JpNYP_SS^Km{Oef?l2!XZCr_pb(u>qK|~`cRc358n~^p z`Ib)YQj-y8T#)vx)J%9lmKu24FfOy>RmzhNQ*Y+fW@Zfk8#ib*WxFxZ(?>NXbJcbZ zauPF9Wn3$oV_eVK-c^((o*q%W6FQ!49cs|bRk%WOy%C5G>S}Cou*TTZ&BFZ)g%Y8& zcx?XG?hPGR3X)8u*R9q{`KR5AKN993xAP07--m0}QmZys*LDK5)zFSHM-b*$JGrk(CqI&ZgGZCOi9EBOslywSOKKJNx zh-JpDZnef0Z(1Zu51A1G>eA<4a#>br9}S(=3F|2CbIV=DXm1Gq}3uncc=PqDv!b+RfT;I{6K&YdEDn?+xU zzkLEOjHC<~ReyG0`BtN=jG3>0%GKo5YkwY$_e}30i6TNw-qAV^dDlWUmSA3gp zS!j9r{IaQj5worVx4~hXLeec#KzT6VoV9a+?H%vwfV;dE)9Dp_4;QI01EJJCNRxQl zsJJr4^20n0Pco`e zK)RHMlsw#J-$`9=GvmGqg@PvvOIw%LWN{U?T^(E&7thwEbw0cQZhEVaZ+63L@pJBr zh9%z|V6L?@@i%6AQaPnV=C4W@_RY1VO>Rgx@>MLTFle=oS18U{812ne$@VNfYNzI1 zU+9=Z-lRh1S?{Yuo6|p#XxTnHce8nlGUwjZ=HyBn?K8{zR>^b5HHVZnb1ka7nTm~) zbHUpiS!5&KbVfHgr(;lMT7S4__{_*y^n}ruv=c2kvr_Hmb9qy(xfXX)l$s|Dhu>M! z2^zh*AKIW4lxe5cD-PZY0@p( zJ4eLu?rEHP71h#ttD#~qrH!YuRm{Xklfc1SLFOYlonx(Ym%MlEP*==y=zAvW9aUxh zJ^p9GL-T9)+9yBIoq0vKu+WtnPIcMIZj27o{2R9JCU#76p#6?D{;HM~i+x+y ziEW%yI(KgCSV!uWT&s!1I{TiU>-D)R2?g^%1+v?ftTh+9hbHTa$Ue~KzH>d|S-m7M zFqEiiYdP<0t+;s&Ux>`uQqMkL-|WP^ltS00#ULTRu?**p+Z_3Ay}|FCa*@$iF3h+y zdd9)P*E%i%%;fP@`}tp|-nU3jAHQZ;!fTmd74`h1rLrgILTjgXlZ)?a4gQ&<&7sM0 zHEj3Nu%Y10d-sLOa@RhKMlRXG*+9%r%Z~?ASH)G9^e9HI$58e&1%;5_5%$`_qLEWG z`MA+?Z1-@pU;TBns~VG&yZRhET9vyO?!<@eqUo1U^m}fZ5L=KEaLs++0wiw7=aNK(eTh(mQx7xF}TtfyN**sht|0ULro zK|zVgGzjDcJ1K9XJ?eN{N{pCxs*Tjf$4Lk2!nU~jChu8}j%~fw_A}Dc+E07Gm4hQT zvPN9F3ggXM=g!zCOgsPFy6{a&FvfO##p#P4Rb9gOIg3_CnK6T|2OYTf+Lu@Im30<- zi>GHkyV`e5CXZl?vT`;z$Ms8uuU4_-U;%QF*Pp6!pfrgeX6SfnMuX}pr zr322sYs`5ZeXzHFR>)ar$iFa4u{p7`Dbh1Pj)OBy(V;aoW$xC8byr49ISymt=z@3O zta2wGiG9T}S7kR>ipesyaBy{DM=52qIW4#IK|Z>-`;t;451D!-CJu1#QEsfBQ$OAj zDgSYR_G_q3N55G@R#a3=D@>kwKIfV;!@1dgxLk?amf5T98mq$wxr)jIjh>vevc1d8 zBa4As8nb5QTFvR)Y;v0Ich~!N`_Lzg2_@AH*MlN79^*!G0@mY6%NUP*fBN?<&w;NC z(fXPW%@qGW1`n#AKl#xOT(-~Tn>DRGplXap9KkRdWi){-XzwUBe-9POCaQ&$*8O!%o(17J^EKX0?|A0?w^}q@;c84{i?p;-x6c1H#ht8a zuz{P(&RTVX)S6_!SlEfBH`5 z#juHQ3Mm;q-$C% zug;8hJnr|ryX@@Q05>+Uvb19~U9OCtwPAv1XSu1Xs}xIo(Y=+XcdL_<3A233WuuR) z9yuRpHlS{%VS|cA2F7Y4v20oGH;J*C_TOtD519YfC+m*0x8-Qt?$P~md2#L*CQJgs zq|hE62QHM-uV3ZRry{!A80M*Wi2X9~{qSB>7ay{oQl-_JiIq_~iP}tC>XAKX+ES>6 zmXb=1H92Fo?E6LYf3?}G`!0vxp9y$9?7yUCKG2bvHX~&LS7A9lL8>j;{ z$xCzEmOr|v`8kXeVk(wG^fgU$FSupP{6D_l1Rm;r|Kp#M(uR_xgld!}OQnTum2K>@ z?}@D0_buAcf|^JuvhQTiUR1KLLx@RsV~_0o-=ERBxAVWh|9>9$oOACv=gxeW&+`7f z->=v6ee0GrS||s*Gwuv~>4{F2%|5GsUAQn70L)V1-$!hQ%+`CnL$F?DMnQMHTCa62 zJtSDA0o-(X_@^Iu7UD@6nULOBeh>Xm_qc48tJ9;aIZm@IZ!ZjkPL!wcnDN2 z(~66R9Uy2KGqBM<`rdl6J}P&VfWS5lOHMtDI|VwK4l1cVzB&i_83{joyq`uSVPn zjJLl2OV;>F)uROf`XvZO-L;kBEv`S(|=LQUhNn>1zX0vTa=2xG{=8be-%)9;By)!{M`55TH5)Z_rWEQBKm#493OX)SVOoh5aHP< zRo`fCl^Imj*6Jy;d#r*%)ny+4RJ=O{Fj^?+mx41OU5M-mhGMK6Xd*r-&Hc4Ll9sb~}5u0xPD|A|g<1X@L9 z6$kHHU+yR$3%oqp1lj?5Iyxg40el=1K!ca66%>|pAX5cLbV~8phk+XQQ}{Ze2$GpD z03h2Eqo9HuEbHa&qC#rNowtsPGDw<;no@=Z8T1@h(p4F$Hf3uHzJ~1Q<_JLF(VX6XtwhXBVF9ByWB z%4N;NXBG4&RWvoz4szd2E#c3phJ`hzinJ%W|QnRlVa z5BRV~k-Vt42E;c(IuS)ei73SBY`mwF!{hfmP4()5k*67?MdLg>{LSP?7uGNpHIF6NEg<&6i0}HVO!y!Xv=3td z0V^ne+IkwCukg%wNBoF3c6y9_E=Y@kR6(H9N9cqAdI7A4O|^&gEYq}J$K3kKjuf@) z4;%FJaMEVczZzu=ZjBd>z3fW<(!KVP3TMhB^u1_e_Zvd2Wyr_Mn(IaFOsh%ho8e)h zqSMD~xWtDJhYwq%Ot?`K91aPE+`|U+%uMI@y})XC6NOxwTyC{S43EVm*FD_pl}Skw z=6pEhb?B*^h;2m5Rr~Ap4hr`6R|C$g_Bt;HZEts5>1vxlPd9F7sS-NOe<(93VL?kt zN-~#F*e;!4jJF3K5r~E(*N45=rN9ZR0dDdhva*KBnE{@P&-7mcLRKLZ5BkxtSM*JYf{yB4sl13Vs`$T z>yFq+v&>kDwJx7GC0OfdYMw6Wj$K`?XrlN3YAB9t$Vm(Ii>79N=^!1baJ@|cpYtM< zdPo5CF3N`Ig0^N9ea76oUChfUzm5t<gNSPAdNx65$!JK)wJFjzTWT=8Ejo*1((`&Z+lyfMS@eDpSl(4hef5E`q68A2s zg9N;YI|;-3Ut8cLkmOO&pk}==EBexsFt+iPU%uzJU)B6f` znY8fK#mC0-KKRx%_L%)zofC#uX5Fphm_V0IMozlQH&6A~8Q^{Sni6->pRzbY#gDwlj|G=ND3;(joOb?M3EAy@=B9YGf~8uNtby0ddWSeeXRwA2@_ zX~Y;GlUb4I&A zGEu;(p$nOksb~ebfFyz8=lnZnNCr!gA%h4qsRQE3*o83iBpcuYiZN@*10|X|?~ao)5?L>L1n)rk!zR$5mJFwCFsWwF(Ryx|lIq=GDHdp#x?N zO{FP$6&GDKAMLyKkWJ6LEYLr>>_=Q{!QE^7eraM@(-wymPIPtjy-PfB{)4uGpf+bq zdocKBt|JNq7y!t_Bt*PD1t}H+eE%!J5_27EioOrzF*6s&K}eb>!tva);=xYm(Cf%G z)YK9$dmeBw0W6~W&|)gGhfQrin}DEnMj4(<&))gj9)k~ctj{R;Mb{TfRqS)0>y~;M z;xp7cD*X@MqBMRj9G7%g{aH&V?(BZYF}owjpHgAecJ7HQ$glXG;Q({GI_x-O_2U6E zpW49|wou&|@AY3%&Iq5v`RF@6l3d+;{P(5G;Bd`gEgy6)p5T$d=icr-3kG9Lu)e_6 zn!Ma8qfu)iJ{zg)hE|3qB$@i#hz zHQea4pv($^TSQ#2jemNERgok8)^ z&vb{_hvBV#>xe=GRY_!b0oy#ZFUMd+$Oip?2fm;LgQx2q!IK>L8Xp@!AopB%Exp0NK{a)E;J!m!<1Zhgy|a}Vs=#%7WCUB- zl4k7<3!AlHy`Zb+-V-98?9%Dd7+S~g6io21D!zVl5J-CT>Igft3LUAfPmvP=e0s2AR$s& z)<&fA+p|I11Twd)bf*+@^8(NHISL{?QT3>!1%w0I5Zi!J$;3r#-sscfRX-~)4cD}W z8@-+eq3^bm1TBr4kM5zO_kQ=O<4vRgZ>J2I={Gm6GI(1U)fxC=CE`iKcr9ZmN&Y8_ zPO@oy3uhR%Qa${D$@Olqdp%}m^=W&Z(Hw0`4cMw3!OzJBkdd7`VOoJWdsD;V)@|LPXOQLoFa7^%!_FQ5+p=^J0 z`OXEeEw8T{uvWQD(qIo$SMy8I?zlvE*YH9m!>+)Ehq6>JAH4jf`r+I&t>ekx1Q()I zPlw$~nYPhjK1AtLH0!sALUc!r*RfykRSXUoetKLvPcnts52UzO;C=9eON2a1Zk|Wx zU6#LBI#4FCov!dhPANcCOz@mw2j~E->T%${MRcQ$#VXOcewK}IliBw^T_PBsdZu+U znVt2SCVN;sr>JeD(s3o+pzR}UC0jKE&*>>+db)Sq6~6mUa3nnTKHPe7f%3ur`kQKu za{Sn^2XuFb5+5%a1p0^>%87m8lf14vB6~Xq+*)s87z2bM5{&`FP5&JBFLx)EX&NPE@C1p_pX858f3Z4Tw-Jp8q7B%PzUjg8Hocj1 z#kF57b}#i*VS#5%{)k-yOCbSRu~zAZ@GS9hfV}L|mU_qN8;!s@zzQq^=+)qi>s(IM zTHR#!Rdzn(5Z%!Wjmd#GOdiz~KS)+R+mk}umfdy#(e&O56}3LTL|)CGG|@}N8lRW% z6`AGN-0zwp-2Rb%NRD5YE#%EE?i9JR!YPaHyX6GVDsKI#A%N3Wd&kGgsyX5vwNm*| zS#6xc8QNMjab=doWM`k1keCVEgYoGh%L&Ey|Gjf-U2+tutFK3Fi#Fgb=#b1#gJY{4 zW+jqOgVkfq_lWho;yAt^!A}pikMf&{Eq)>HO)IjE5ue`v(e|f!8KgV5W+Zbgj%8P1 zCDUq()ftEY`*YvR0`mok5}HNVT3CT{tQrPA&>`jTMR&Y*O?CmiQ7?Uq2INaYHQ$~d z$5wgRqLwFYye(aD`|4N@Byqc{4DCKvL~->ZGz_WPn(-@TnaA+%u;cC=4KbhG5=%At zH>sXi_Ip>Qe6W3#nX2{#TL6ITn88|&5tLTC7IgYL>@Y}gj&K67VrvvTS4X?rialc# zq*qlv>X4&PWEzb)HMn!JaQ2of@+7M*#GU;QZN{i?}D zZ^=qcud#1D>Fc092N-&xxRqB75D->%OSt7f(}z4|Xv^UJVR2xf$YVqD%M*#M$zZX6 z;CcHp0+-thzFF>>x|0Z`G_(#lhqiq>k9F+d-J(j}*>L^a_o+>!RNyqoSUL7I%dQ0ykKj&~!?ge!3=!y%b`~N;v}nSp z2WC(*lt=;?&q?wy_({hk!%A>XU9%%mzh0zt%N6krw;OMpbn|Zx8oBA#bcx7^I2u&3CCXJa&(HFE@9sGzu58!equOGDJ zVZ8Wv)L{T`Sp#4_;5)a31U2VC|1fAgOMW$|!1MW9m0ye8&TyX5e z&z_E`h+bfyqCJ#$M(vo7(K2sDNdAn?aC!NZVCzIN&$P2*{EQs&PKt_-?WwmfZiK8} zi4$w^Sy{ezuR$f$vZRMaZ0DZD#o`0od#$5#8U$q>h8qaLe^ArZOaj{hLXV=o>l%%4 z9AKM}#T=NUZ9v&+1B;>#iLydg&B6EHGnQZV0rW%aIn*6HwpUUNUr(;^v?x+LW2;f` ze7B}bsHcO-1gJQ_;4`bbjJ_#788KZ$M&%Zf{T~E0u0Jfytzgm{&2P@+_R`$P3m7zrSLJMNs;nlWf`I&)qs-8i8j8+rn+eZUr!nynsyt zx-qD#s>Y#A;Uu1xe?3rMjp?cs&xxP8-~=z}?*lX+m!m`pc<<+H4c74){$kSGwuhzC zn*1WQHkKxY>bv7Wten>qk4cJy(TP}2a;?FJ4>|`R?RZXwpkV>y_bub!OHnVhw8(`t z>O`z`ugd_xVye8s&={?W{=7Bn>hnx}Cg@XrScUIc5p5YHJX+hZM5XKh}dI;GJ z$95HnC=lRkG&wP{$9b6x#X`H-w{yP}t z0jnb9RT-JbzSKukK;)(Nc%q`>j%ZK-Fqz!hQh!-cGLxSMntxQgAzlFU1dGO{~?bNvb+G<>r`e3tZA6T zJ{kTPEC&ofSir$L5R6{LRk#>k9tJdfDlnT{0Uo-Wdb6S^p8TOQGL7=e2PZqqRX%Y1 zj*uB(us(M5oUWd8=Pjh>p96m_iJ^Rv(%XRIIFsJKyF*;?D-dX^0)G}rzzW^?4 zF)$G{!@L>ip%mNORbZ0|1Ss-i@PBP;lW=NAB13=sB$igl|zE&NIX(6e;FG7t{-5Og0`!0`^MPD2+)IPH3DR%9OiHG{Cy zva-9)7j41Z1q#Tw@RQdrn8dw;&e6z0G8ADmmMFT$@$tmlN3mSTn;eaSuXArV4 zx(U4OtMIbL24>w$!J8ZghpL;9VXz?cL@Ox%cgNoef}A+mMKzg&5}T_Kgc7PqKt609 zF_OrJh|2=HC1@Ag$Mcl0+Hdt2J14Fo&T8*D{c#66(j_Rou|VJcJUCb!0ZacGM}N=b zoxXb*W1xo_JpG*Js^v!S^%Di%h#GWpS@XFyG6j@*7Q#X5yu*+jgdN}X_G2QN==V|C zfF4Z^>WonN_J)JI(i4E)pbXuAMiKd5$m7&U8hSTCvicAp5aOGww9D_5A_5LTPcAHL z%3lHCD1!39=pDn$@*MM_659_i*!Be+0ROB3f^U&JuJ11Sef}Lo_-_OH3*chCr7Qf7 zT)3?yDJdBn)EaCI7)0pehkghdv!RGwEW4Ffa^x}9H{^~0LQ2G+M>EC>UIW+~okL-v z%aI}*H~*f^;*SAagsgc1g1%M#&5&_aTzt0$p}xR;B!!X2-;p^g7^IY|J^V+0^C_A5x^0!L=}E}`2kD{1XxKsCLJB<{w1EfH@tMIu4zo`z_ANY~BIJSFLBrezB78_1 zhzSGVta{KMw!Z)S2!N9eWa5As3ef`J$VzXn`3tZX$MNVDZSx}5>)pWEfn{qO?G}E{ zqT^d%0>&l<@qPfPjBdaWW&$~}^VfH0SNQ2?cA&W9&qrwoFlUru^MNNtJLhH7m5XE0 zwY}1`u)7w}@OjXN2kma)aKZz(bew0W*tshj;`|!$9#G1q=N2X@5wiI}Y3cg=7SPu9 z*9q*nG@7apX#hX5`gV#T5n6I;z}AiSV}LoMhx4_Weqa4(U`HdrynNW%&uHA!p|AMs z?MnaGY0YYnW<3NHSJsX+0y{Pl6+{6bb*1}M%E3coaTLcf#qgE#unNC~Le6>jIWsg~ z6j5sFPfqM#F~#$f@G23U8S;(y^BX~?R^4Z71``NAUZt52yvqO2<+k5Z@I07xN>?U}uXGP1 zx-@vrDXqMdBG4B@s0~b!W52omGr$W7Fjs-Eb_wuDZIgJ+TXjbX@k@wI0=}(3 z^Rx*A*dw_8TvP@K7vB68@*cJM{XWvG1LG7bnd8Ml zX^kXFkW6v}8w|p513K$nF&1M+TXeiaf#uF3)H{S=u=(GB%Ok@405cG9m6Ag2=wN>xVGL-xVH966`(6|DB;`Z{h3*B*lMC zoxgYMWTb6_(Y^3=qx~27fSc#}o;s4+Z)3>m19M*xsPEH;&Vj3|2 znmfB#-2Y$iGvMfDbu``~EQN;Jh>>1Uz9w(rHLn)3p!ME18l}x(7H~k05Kk|{B;;x< zZ6Vo%ejEjR&~sGVuk;ne$W*{6L0mmKz0ypKdgwA4@OeohSaHu4F(>>~Q4pHuW zrhjA?qgVZ42P6$4S@W-<1*AtsAfdH@58kB|P806nMxBR6QyLE){3o;+zBM4=`tFR%8OA`sSJ2;}pMPh-sZ;Xne%KQ%+c zXoNgUOFNAYB&hR5SFX8=$SH-evl37(g9E@fD29&}4o9{+GzuqzCj?2Vth#a$^M)U- zBDEB@+hHjLUpUb%V^Nk=bak5C(FGCj2cfD6b3bLa z3|1`-;OAqj`Q?GzCkCqQR^&Ya#*j9+>JZ}qk!YZOz%wCcRbJp5BK#%%I^c{Lnz!r| z%TXp~_N&tLK(FJH>Em|yugR^c}~I+{qyFW0Jy!##p;!jgQ5 z@Os%VT*%+YOgV-abFdD8A0iTYkKvREaR%nW>vFD}Fd(7ZaSCv1P^TPp+J@PH-XZzK z0&XV9A0M_9*Gf>SQlAV<(7Ll)3l}{P0Biso+aaVdWV|NW_lZ#q3=h|m=G9j=;E~e` z{_kvzy9BswNI`M=RUQkfQt2nULJXf;A_57T1aox{Q5ZQ;6Ya6DP`dMbIDR|V=5(VN&% zeA;yMhR$vH8=D{6GF_g~gS`4_5c)FuD)&1RoVdq90U5Ak?1*nP9M+WpAA)`z;Z&jF z4djZS@xT#(mLg}%+rn6`o4?dlLQP) zh5wDxecnlEd`d`{cydrpf6Bg)ADS@$f$qd7`Yo4K)+c+>@4egXU-7TR=%Yx_SsX&R zDJ1^N?Y6kAQ~)@qM9Mv}F)^q;6r}kClAL1fUOO}hXqUR@AqXJ!^+}0~`ve;l>v%JL z)+kO|`qG48Xl*=tK!B}F+Drb;20yjZayT5A{cqagc@jWN!F87<*P1q)A0C&O7xpZaw|6Z_kH5vsGC)U*9eG^G9e#(&%E_fo=NKMxU!AEsf8zrtf^(~F z0yN!m>+%4(#kc#LXDu86p#B{mHeujQk%=nBuoU9jiFYh^v;2me^Yo||RN4T{oMoF} zvnx`a0Ucil+EpjqnNKz7gp4--&XD5cCZ?v)Gv-{9-oBjdY{${~&@q60UCAh0k_L3O z;URn)uL>e9!X{+upoVGq1p7+rxCPX(uWq_mu+9HvMYG}yb$Jl$1XMlv`GTk}>UO6> z-LcM`L@Y^cO~<-W0w5>>`do(_A=a4(#*IaDjKpR#Q2^5v$FHvO3Gw29!J`7lcUV}C zEGhHLLjepX8vF++gL#o|LyWMS+WNv0i~NCNul|pbSw^i&mP%`%XLd9>!J+ znr*b}*jSD4-?tSKM}!xOBFPYsDI%~vP*}uX(5Gei+mz0~#Ev4a*GSA0M?j3HK!B!7 z6N~c?3JR_2hu8|0|6oHhg2X|ClDnd+nAF z56zwTpBfO>A3QACOE=h!#fsO048v*I>hO7c+r5?ynCH-7`vtmsDmtFx-LO)Kxo$pC z^4it(ssum!(rLO_=d5rx^}U51J1KaJDXf3VBuwchjO}0a7|Sdtcwewqy?!-oU_JYb zRqINAOQ(6y`GunAdDc3@m4b{4#9N7JQ{pZ%zFa@DTU{cioGUr12fM!v7W3X41i~fx z>}%Sjq*%H-rXllDCpcDLY-+r^I;tnl-z=N86RDy1xYE|eN53a|c&0UN<*neF6Z^s=UG3)BnGe`Xm_S5p54sr6iGkAX* z5HOh}29fZPdww6!@i@HNwfl)>PsXs89wF6KCbsQH@@&$&g{z`)`C!E1GTm$RcXyo7 zPOR`Rb2y=Wea{w&D2OsF(a0xd6gxr~34-$m^4O47RMddQ0oJ2LNW66{N;JcS0tST| z{7uwZ03zb_$XGWoQrP}C+Kr3%d`*(mYz;A$eJiW!vIT=hPR7&^Q|}0BQA@oOSs*Qb ztL=Dj{WGgc{Jh~(=&4U%cb$}6;aTb6!lYa!C+K$kPX;jj$i|ia&t(+Tvc^Zn^v8>t zY=68rToha+9N^p&MKQgmo$H_Obfhxrdl=vMR|KJS6R~G8MHK6LWfZGMYIl6f_w}z7 zE-_tj0-hoXLg+R+MWJXo{&h~;gRWvT$(`X;3=#MnA-C%goOA$69K2AT*C7?XMQ2fj zuKuQ0)RViRwF*}1q4RQTdQVS?P2cm|tJWjP#}}umY3`A{T6>_TgR|_#PtRzHw@Wq9 z0_Ez}dyoi#?n{Y8=yis9D@lHb9;@|zu-V90n>@aH?;(|H zPkE5e*`D_D1@k^}zbVYdB~qLjaj=Ub;&}orp+%z!5sq*oM94-p0OL(SsKROvc|HJW zUk65HdiQeii89DW1Nia&%hT%-zIzmMwpy7ySD5;u`+4{{i7`TrL1E4%Va_}3o+#$< zdv)`D?@aodZ1`#ZIn~iQdlR4|0jA=wjtsO*Lin&#ZZx<^Vf>0p^0-m;TG&7*n;W%s zZ>$;iRlj>atWj1$M>)s8P<(cpw& zP80y%NIo>}wlYxwApuB7Vn;hHqK*rF$%xb%-1YHwq}PrhST=eU~Qra zeV^-SM&^u0=I&?jWc(?oMvXlvYw{?L#c@n*<6!&U^+4F?y#;P3=VqWQDh3sW$@2kW_Cgn#Tiw`3=4y{N2BF}z`zfX8 zC$>->JNLFWf%oZ%Ft)J#SxtVV`&x~a>2rErCxRL(9iralknr*u`gr8mP$@>#|M144E za+mjptK8Y1Y(b3L7~c-@JsTtfms^mmpvln=n@_mFc6@W!n20eQ96AsN62ZQQ8ly6E z8b!MEwJ~q2&&sm>+Cf}S5Kn{+@bWfK!+Q&Hadh~qXHU0PH%r>*9uT&o5wnLr-|WgzX&XIRx zhCjP8gqi=n@3;HH)OWBh4C6hDjhS-=DVA&~!i9*W?{%R<#AWJPqLI_ao?~d9ulCWP z!vSoT`&zQLydAaE>6^{AQunE?ThMFl+W!2DrPnck55GM11!nq8qi^x=ns$BM|93W$ z%X7rJ*pm34-Y9SNh42f{2s7ZXBy3T@%Tb$1I+$pmnzBn>N%Tl`5)enGTtvHtD13M4 zD@;>vFfMZKdgrNjK`G{t#tE@cv);;A9}O%?+ItU?+UrP%qruVa6d3U6QC8u87;2kG z97S-A2r&o2u^tkQe?C4ZKlWc{_l_X!`#K;?d$)CoW|sGvP%+y=Vwu9VfLh3muCFek zy9F3ct0W5zCY(Cc#_Lz|z?%Lx>Sq2W{SK34-Uo}x1HvXQ%4U-A^;i(pY#H43ie$EFVe z=4dg{4F=%lsS*{`Z3X&+q(e$J{SR7;64Yvqk6ykLQ{l8% ztK;d{OAAl)X?($o&^}9lWd3s~aRh#uor6Q4Csd_1F>ohT>mG-lDlE{kq?5W_oO*>$ zk{q<`CMWh;N85NUp)1jC)TU|kBaWTg$94La(X(gq?0RRHx}8Q)r_!5W2^0n$&kQxj(nMNw zNAD{-O@81@8Q%jDL6MGgHk zT6T74@T!?vej8?QneR+X)-TS~BL}UcV=y*Zqw&Dn=(+)EHmWx|`)t8YqgbxC)=Z)n z`PNs9xwzWgkqg(?fKLpJrA3zOjq|?*&JE1F1I>gNrU&7(B2RT&AH`G>ILVyKXtsvo zwJaz-^h()Ih$MNqTw+39luH46N{Q8Vb6eU(2I0WXGcRTFUw?{^ z`wTO_WXD8C%)Pj{6bkL~<-uE^;L)D#;)EQk`NybrQICbAy~d>*-m6Zg!TFAuTQ*xd zuPMExvpcTBDDn0!JI?`O_d7gHRc^XfZqw|`YFlesKw z^y=j5j*fkmCH;op<-s{ZFS-LHZXNsyAX6- zZ2*ZEUK!5`xpNznRJIG-cyj5UU%RtQ>ZAVf$JPd6B1_{Q1l&^^5#HrP^oBCMa@9GN zV^@_ZD0w0k$rS=I@`+FSFEY-h?Ite=I&V4A4<0;vlr5tES%;;?R2hZ)_#-W7_ST+D z;^lUV!f{;7U0kCd6!EJ!d0`mbvvvzw>_l|~OJ}y$ckHg8KIlof342wlWbiRDuLYx> z&ZPtVuk`$sk)FqV(vNkU`W5LX3_|ptWj|}9a@PyEyRsaj)YlhN^*znY!ugXk4X-r_ zCUoQ*4U2HQ+JsrZ3Qr?mxJ`)pYyj!NFNeKHSvzl+S;lyj>ZdQ-=OF|8N-&T1`e)Ac z)fo*OJeZ?;0&Wkmqfh8XNBu%bZSM?)^+e2HVZoEQwmi~rljkr@6r5;d7BsyP^`o%0 z|`PlhBDWcg#k$ll03rBXhmG;b_#ai|dP3Ob~r*YeR4VMdSY|FC)&BIN? zR~4C!bEG7N(YbC{i@5PI(_$chu%U1 zRb*_MkqoB;@tt82+tj*@=s0BEQ43B;%6OBfopT*ibp%gX-w~nU$3d2N(k1)DjTm>N zYZWUezHusit>BlSe@=3ARBPdRg3TfUHH;mu=U)_8x9i%SqTvNHf27-m2y8 zH#a|O5f$F@Y^4QZJ{3HOTv8v=`Hu9i7&M)0ET#XRk!C01Hul`J|NX#BL8?aqozs+_ zhIwBMZ(DvppH*iODQTFB#djcGgyF=Md0HxR9pNAE8h%&i0XPS9|97ua-E9(RJjD6> z@>ZyVn|J^2fw8XW{&?|OorQkDpOn=J_xYt z((<{~AKB&3J``pODjl8CsvSNSpFNcNT0B>iz9bPPL*Z z&AvT5cYZK@$9%Uh_u%1B{@a?0@a>)6lL=$Q%;Mz*64XkInC%)Ajw-VM77`J;a7pr6 zphyP0qA+uiMySGjl@q>i(kFWqf-4O>L~Rt5O-urz(_XD|<316&>blUn+o`*+?7d1} ztX#Jicr7|6%jc)03<#HhiK<+=D<#Vynrfh48viBW#enVN$!zzM zNO*-p!;zN^0f!UPaj?37#$pCffB3>c+K+7u8u~ie%#PHDPhMJndbcG+-2rzqCYB9% z^m0Bm59xbyz6y^6W-}3&<)_?Gi%kj5#9;vAmlmTui(fN-AH@)Ay{$DwYwZyl<WwWyW$nC{>rFqND9~g~5prVB(%gwZcE6Fm zL!iR1ub6MA5)M^VtNAKcHX@Mk)sKJ_pR7WEb;(qf8#z^=(e`LUd+hUYV(9w}+2MRV zROf3%-MU8|zw+&I6Y9NQU{}2Rz>y;wLw13K-?tb^zDYFSaMiVGSd$*!Gajq5vY-TU z*O#Y)iWhrVALx5KBsW}6jDllN%C~PL_ACY2`Vl?WFU*;R-<_EcH{Q!EBL9SF5WTN* zyIFm>e9=^-B^F2W?oK-yK(hRjQxIBIUT?zX%rZ?hwQe2BDlq@_RmZX6gNVCP`!$QU zB>lobt*$b|>N#o2L4`Hcq!xK}O(WeTp~naPi_$IP@1~jh+k)-nB?>ks3exeA%ldY+ zw((MFBG$ZeN=LS*prjxFn6vTyPqTT@J}c*0RwZ3oEBc)O=&?O>hd>%#KhC>FQn2dH&e2`@^r@`{o}tBxfyce0E7UGO zZY=M6@s+Fp`xd9MPnNJ0K(rQZnIMuDJi~ySmH(>9>{Uk1T-QYC5RMC;xzFYJy~f>Y z@cc-H3SsDh2`unSuz^qU!~ecd0*WBoH;mg>z(0!&_e37!TcWkm~1;W>G^()AI@#(OHwuBnB<(g`@hN;q17-8ICKDd*UuB(2;bk%p>DvRX-uUKvZQYUvy(uYTAw{q8Ac1 z)$&EYTlV{JzmW2j1&%kV1K+oV29}E9576n!nnpHrynDrWKr_gs;+@f~Z!qXLI7IxE@g1x=npm&se_S@2B+!b$h_hb}V0CU?qY9eNkV zW@fU&XT~R%Z#3t0Wb%wUHHfgFrG)fphw=EGSbcO0JFpOEuUrirtLqjQXd=`uxpqNxlX zge-bP&aD~cs%Sz{?hZAtIZwlWv0xGVYr=b?S*=3^q$IC@WOMPbfZ|m3F}O%LfUD$c)8B%>b5*(!R=zfD+9tR=C}9oqkQYDykIfYk2nE}n@j$0A+?P)177A1T~h;5%>lIBk}mzJK4 z-_smwklt=^`SOZF@wfDh zm{&ofO9~r{!`@h&_r$l<)JzX)(F|>apZPF4e)W2aJLr3eMR_ilDwv6iSMnBWY3MqY z3py5x7xb<_wO*2X+;FMX)D{dQLRu`|eAhe{n3W=^ubm(N>CNu;eL~RdgE0&^_qjgv zk5-~9t2^Wihqgd}-3ZS+pVbz2Tpm4ITSx(I3LR&r@3JWfvAB#rJS;r>eZRpJiU;P3 zy^c=2EZK;M@axXI{KsYa^akrNGI>I=!mD4ox{4QkhRW8m%9fW+A*>!*-(dhf8#9{M zXv(m-@P&p`%Qr?lK9419@LmZ$X^@nf`1EvsiF!J_SBayqc7a8T&XlX{mT2DodSTu> zlcx=BbHh<3Z(c5WTuSV(r+I6z3I%Y5PC)PfThG+Xzm4HQISNrJgWbw#36Z=u)uUxSo_Hcd`& zR^27MLF|TZD5`~Dc=|p*yIr5ogTyduU-@WARqLQ+gEmZsx>jA4J+ICfVVCsjln9G% z6oCPThXAdhKP~(qJo#h*uSNF#9W>J*VNeOz#OnlXO{o_eo!iKsR zqzFek<|76j1>4p?si$aUjz0shec+w$cWT_>7q7z!>6-gwTie|J;#pW>I7P~wli$$P zrk*v>(XzLng$-P9Y#El8=Z1$YI%7P0)*-L~QF&MKlvwgguyft)xaHAnXK!MqJRbgZ z{{@<-Abr<9O4M%{RE{aLzqW{J&fb1r;-{)tb&+7MtI|6`bF`*qnRp=;POBEZY0Y*7 zP3Dz_#N;dYi}0R$bg{9qf!`8hj6(2niKaEA^Riw&A$EbBMxs};33)}k+V~9DHVjyw z65<+Hwmb+4Vp4~>jxZGDgW9VE9Qm&pvCoWoY*ml0e~iMHq-4;|p@wV^_Fvxn@+1$B zI)G2I2EMaVLYp>)H;XdKiRfNyb}`EU3r(KWQOK{7r&@n#V6`PsE7B|7aFJ+gMgRCm zG?p9z4?LGb-6FuQ#e*H*=JO6Nti_}{B6;jmS+YWZ_^fr*t3!zp++2!m;l$Dk1*_hi zR!UjajK@kHDOdXSM~Wv-<4y(>EO;ij)KR8|`B+|6S*;hSlX*I{9-`(O9XFYThsx5R+!~#TFae43fUw7T3}Pks0Qyf0#J@~OR%-_b3?O-iu*k*)Kfo5 z>nE$nhy*dhY*63cjn5Ld=L3sS+0}yCWIrl-eeJU)*Wvtc{HYsyO0M6`4B)|6V#%V)X| zL#Da@fI>gQ6h1geel4^Ej)HLTOy{A1zjtuPz4Yv!lc@VU^uO{^uI=FX+Szl_t8B}b;u>-pvXqzqGD>1CgvlW%cxeEC!o-#3?O z6eD7h{o%p-x8qm7=a*q_zB&RTl%a+lmxfHalzx&ps3gCQ z=dqHaeeQz6f#~PhV!}i880Gk0P{HqAA(!s_Z~tdlvpPOCGq^}Eb&)7;s&mc2?^DIz z(_DKm-I44o-8W2H939~Vct-wmiUQp-7{5}XpQ9NFKh&XSZP+kG@);Rn6)2LHG$Oi6 zT{j%o`CuVY#CK$;AEjx38V~rEF^2y7s3kNNIdLauyy=$0ynDLuRA)c-{0q5IW0OVe z-aR<|rIXST?d?>-9JK6b*aWaT_l&X2lc~y0@37DkUj2`#O3(Hqr8)o!2=|p`voAhx zi?hAmFCSVbx3r#qrC_7xrUy^t=}a$Al%}w#CfIV@K>+Wgpo#B)09(6;SP# z3^r~HRW-==U^}NXYqE5b6wx^=-$o<%c6*w=>o>k$hM4m|u_wONRHS?YsYDv|*ffLQ z#h!PzVd&`(b$=U^<($^j{a80=aQh?oJ^v)nyHOmK7kSR?-&Muw_yejQVwB{_L+n}W zXdH4Z{r9IuFI4-7j?du3rO&dRlRCR*C~lLF4SKxeqfd>=;_&o}ciB^RV&g5o+nTj4 zV^lqG;F^suIgiWfH6^=<=}<5 zV)#K!;3gt+8|d}PtH8cG(tHiy`=8wK&oHd78S%>9E-EL8x)$e%EYfxJ0ETcF*o|E- zF#RdQIq;4(b>HAd*c0v&i67W?=%9%}F(3;%2BMTCIe2(joXo87MZJgpjOS`aGj=|` zb*Mv3Fnh&*qGHDGL7)o!gi;7`tby0R_8wE$R%#ofiIS9kJnP*U zi=~`g8t>OcvUpG@E`z6YC(BkJ!c+F8^*6Go%Y-hyoFN8J(VRLsf#I&^TUBJNRZVaC z65zaXh^u7G#CL^lisj~4;SFLWh)fY>`>(wjkIzO^Td9v$H7_erg z;Z`5M0mlUdN;8_x}#MRkP?K@=Yu2YgVP?4Iz3en(e`A zvFTqIv3w?WO!=p$Uzg{=)xI?$gE4$q6I*d8_r-eek2KY%e;-v#@>WKHOix3JjZ&fY z>eagu8s|(K+UXR_-WuFlRsz)Jx>t$B$u*BB-&aBoQ?YZ?YVz}Int6{MTO+MA%zg0c zNYyVDr*|IRS)yP%Gn~B=X!LC@$cl5d=z!O4-Wg9SZ&;Mup!stQa!tm)P{=M~!idFl z+JB_nXw422yg7dTHWS^Ue%IXvA*;tEm!cSsR=!$alNAhtDNSwBlNsSSDc}V(&|M#o zJnTP%duT)*;r%A|t3$-&Af55gEDRoKAs63NJ^YzWQe+{*`F}VXROdH7EyTQ7c_Oq9 z%38?%0xssfS(6wTZqRzXuTjac zp#1ogl&_C%i0byUPG{?F$70ZS)#k~j_Z#iV`yOvDA_0FAIS+zhTd)9-(qTczq{+fz zW?2h=Xc2C2pRMmXBXM&18Xk)BNRtYxY%Pcb$e*j5ZL05)^OCfkf6|j;u3v!@0)0<_ z_`JJ5Qdq}V`JvT=z?(I}94G|?`iaZ67Gkaf6S=K(P(I%$y_quchu8wfD=pcmOdnK8=Uc@U3ZMBuJEz^Oq1$ z{xZzl$A31TfA+lxa7+LbI(hepu=Xk$d|3A?x--W#6^vTyp>+J49T!W1s;C}%kB=6V zXbo>JlYrTu3n2~pqk87gf-3lieDBADYX|Yzf3Ea7=({DstJ#X$V1w&bOHbhpcp6a0 zGm!L~J8@9a!F``3gWuq}ZP{E7A-wxK;jDw~ftb^@hjx&2Q?NWWb%RF%Ij#F1GK_&% zH^1ohesKOtpq5_%97;#`?K0Ji1pFW%`Okgt+PrUCvI^li1Nko)%sb!iiFVMI(=#w6 z!X4L|>~0(tLhc%1jle0E7e+{h7__+uyJb9R^fmt(Feyr|ceHoHmC2Ixt*rL{2+l3# zpl=`Yhyb7vd3~G&ZXwSEL}jT!Gf0)a`x#mlvsd!Xfk{~BKi{@Vzt~3plK*^{Pm>4S zA{k5o0)4gNhBxUv!$}bLvqPf0&|w&&*wY8$y1}}I1VQMN)c3EgL{|{MT z0aj(!g?n_YQ3L}JR6voCM(Gd`L^`A!>5?vKRKf&3lyrA@gMx^FbV;LhcgMNwJ1{f% zzxO=zJUYVpV(+!rT6^vFzONFjOr(Dpx~==3b(`(B5F16rN=I_HA6!D{+yGws)E@eK zkxzGTc$FmON^JdUv1bWyxWf6Kd6G6(Rz(Nkq zruk*~DhS^#0(b{yU9b}DB~glA*iGE=$}ffXeo8T*Un5jTY6B>N=0aecdjOFAuzPww zWp*>V_FVPP_P19W0jCHm&2Sk)1OR~LKIkFDeg_JKM?jzB0IG4kJ4sPPWWSMZ8v@e; zLc6@Oh_MbRmjG3?6C#2Q!zKtkbsu$zj=zC2J=&xl=g8ydz3}w(^o~!!Jj1A&m}EdA z1`9v{TnkJBK5*siPRIKrglAxC!cb2FaOpon!!c)$9f@x(mPo+!9Eg720aZ_cXdFA6 znD3zgt0;Qb7YF?92#kEzhPDn#a-nCmIg+P$R_-Z+@H@^=P$^%Jm+Fk&QRP?=U_t<@ zd+ek0&q`ryM0gpXsZTMxV)ZS8QLyIB!ckA|}q2X8< zK!6gNKUnt2_Uys(m%o%kKFfVHr#XIdF1x0z+a3cHakA{r@cmaARi2 zw%J9*F=+Mb@Nmx(i4(ZKwX-&9UOGewDnQHQz#b6Z=}j+A!)7`#EX?#@dnU(DH1;Vs zoFUgZvdY`R;o%ZT1rii(1N3Jh5UCl&1%S8DWK0$Zw$3LArWn{SEa1fjKupgb=$;s@ zj-r{Y(9tl;j;57c6c79nhljsp`i~Xf1js2ux?xv)k;52dGU3%H08pI_9f1h*5A5GA zK%pOih0yH!Z+uKUq82%Iy2e)n7)?;ORzceZaC|+p0HB3WN)Ld-5N16n0}CRAF5MGe zk^l}Tq*sXndW&?4hp&NSO$-ey@81Jl#UrAIm(YZF6e%8&9|sJpeIR6EM8wc7s}CF= z9q_vV#}34(Fn*6J@KoPGK$uC4+iKJkTZw_&$Iu>a=KgW+$5!Ll3JmPAAPXUgD6;|p zUf-VUHn34>BC7F6J8~}-U= zWl4l@1>nJIntlc_xCj;)3*h2ULAMrlAJ9)AOz-Vw>oLzva05Gw=TQNBR2(B*_j{rAXV!O!nj1fzPdG5LeorFCfZwrk(l)q|1u0%kP z2>V=ufg;GK!XCIdq(~s)mi!E2XP)N_iU*(@M;cuBT_Qf5ZD8bk<$tlZ4J5j^rb8I~CPYUsQJ`!FRt|F*GtcXWAf0Q&*|?ai zOXLIQel6}TT-WmlHk90Yc@Y#LK^DWn0@>Dqv3jSF!;e*N18Go_$v=6TP02#h0B}Fy zHixo^u-}lk6h}uyWFT-q5S@cW@)Gc#xMrU~1ua6J6;wY)V_&I5#0{a=zUFUguN+#q z;;q%?zwg2bo&w+z5T?R;CcSm#kVWt5YZ?M)fmPb`IwK2<{69=AR`^IZjKHsVHj8#sn(`b%E*D2^z59WfIKtB4rWUh*ykiFf4zbW0y~3{1_9jhk`s1WJSqW1 zVbg*`NJ$H;6wseh0kRYxrwd4p{vno$p$FEV4uq*mr`CstlCo~rrbZ3;;<^DW3#`Vi zvvQYCf^th&HOEPm6)!Y&=@UJEGgqO-WUGb@<)xzt_Z!#*l7N;Ya9bx6!o_|4*QXVc zI|UwZLB6yPxvn)MR4qW2naP-_1^~z&(8fM0@ulcu%_OL!#@nG>6O>eC;~#$z)Ih4S z$1frPiq47i4lcO{?BP;V5w?D_J(*@t6yX=n1qp030|f#$Ji!0TG=(trLS~W%^{f;i zf`GWd@E*YafZ;~S6(CM4zK3+uGffWkULye^EArFi(<5qAxYVsj*g+EjT8#jcu)1L2 zb_CeRJ6f<(fx8egz?}cdr?w$sL81?<{*OzLL3Tix{D5dHLf<_iTle2xAeeaFnJoAP zO7BGXYL3nCDA$AY(OBR+q5ux@XFISvV@N|bgs})&om!zO4LE^WIrs;7Cmuj5DTAcO zA@Gc;0`W2nfP4}B2V+RntemVjGR7(5cOJioN*oR!^nPB4f;W(<>ggZ@Brtvy6~quy zP#~zJ*vY!&xI2@a4ueCe4C$k%?2n&66##30oH1W=0QrZrphRTr3MfdocR3)lqgZSNx-Ufg!Z%%0P*EriJVE*-n5kD*;?1i%07+aobFSOpZv>#+8x z0M01rrJV8NanyRS-Y|hiAK=J4%J(Ehra;Jos&c58H!-0-z%(B#$Wt_oE^#I8- zWZz(|4E{0*i)Q`D9sg-yekg{pYi7^Y-4EFuAiMe8AZ8-ti~!|4^~G1WEiD>;ZjG!` zuuSEs8}3*P+ckt!Idv*Dg(8Y066o*#H%K)W%SmXb?&V9QP*yJ!W<+10g4>~lxiT1$ zKfyJ%$h$j)X>j=}d<>yfwn!RuBDR^jiRR%KiF)Z88r6YW4!Jw?tw)MA#z^9z&{-^W z>OPK;&mD1G5e6>ZKllXlA}!OLBMejzpXAyrq&tuhv%64MBUzaO`%%Rag%6wXvfbHq zkV=vP;rDJ>7L~v#laA0TK+=PxrVzXdkV>`J9e;gi3MV)Ji4A@{uTuvDKj`xY=c=KN zSyq4G3%6KO@p7&thJp1vWpolApGul-iz$s$kf>IInE6t2JRjBCBPXw#tI{W2_~Bg7`i~ zcyo0o=GAYT>(&;Qk+!D2@x4#O?hozQl&(!QHp}{L{>bU02tBmjJ^8j}`nhmDhiv9H zg>ZeZvSj4;Ybv5nk5J;_)N=0PrYIrnD5!yKo8^M*7VWa{UkAmbdP_R34-TI`y+yA=82`hq z-CXDz1ux-Wt&5rANgqOLFVC)o7B9!nFgOL=sj~BVsclqCpLb}itryOpqeAh~nDabY z)1tN|)9SC^<);yPV^k29lUaamw53^AX;!;YY$QJ7Re4~vn{1LvBeScrFpHE-?t)Y( zx>tVns~@@3aw;?$H8HmbI{o63>I|gg5X!2+Ax<55IcJWWtb64KU6F-+ch-Pp;T&5? z^KafHXK?mb`#=Z=ae8T@NZ+&Z95RB68*%3j@8g zHnI&zh0vHsS`Bth*KW~&#D6}IM{q{SN0=;xP@3-gFo(UqRSx;j+QsyX{d7EzCV3U;CiZ$`ii}qSS53jfr!oK_!(|F8hNN?bZwUGOlav}+iICkHD3&-jF zYEYp^d7fM`oh?QQ*5rZmi$a16*TWJupDb|RR9{}cD@l+(pgyX!`GTa8t3-XTnGA|- zy0ffG8V5aZ(?`T}?Za)l)se7=%c6*%?$e3C1)Z=+ABmC?Y_~M zNyJ=;r^rvx!@o$yP097ni|{Z1`2D%htuUFFOt22b>u-M^8REU7yKY-cjnYGl<>*kI z3uka(w(On_;nXVL`e+=MWYe*EcdKn=*QL`jkIRfER!5zZ-6VVaOs2sv@{L+Oc#}4u z3X~rzvp>#nQ4)yy0D>JuNZ6*QjlmaNBMfj*agp(Vu=%+=F$R5f-eUSX?rY6HxxXe_ z<8Tknctx||hNdbx3-fC$s{+RNFTUs=>O>Ms^fxF`#1KtXXHQf+5|+Zbr+^efi31h7 zq~7@VZsGQ$*=&tmIknYYcjt{&PDfs>4V~HWzFfKJO47ep-r;ya6@EwDKFnUOl5hw= z;Mb2o=fTuWvG{R#deM;R=xpH4Gg+T*zYZ?Dd!kDedKWs!{Q0xsa3uwRw8$yO>qklI zRaS~s{G!ty8Ll47X~sX&GM2k9pUoN!Lq=xT6J&SGCAeWF#qE~*P$!%2mWR| ziyzd`CFhXb*B%?PznsjPw?TW zg?9Y(_HJ75EJe3@k1G3FWignw6dd3efhd2xf4#f_d`8_s%C-)9wmKM$J;Yk*!+s2~ zvU`w^3lQ9+WXTp~roD9k=h|7kcP;ffGe5p`>C~UJ!cVO9{Yk!5OYgzAlC!1F{F=yZ z9A*;bMS%6fw*x~$(+)hcx?&$x)1i58Dk+T41%@~Yxb!e}MqQ*+sJ543GagWPFe<3) zhM`oj3=IthSjth7fO@ThP`1H&R2srT2|X1-Fr+GwbOEVJ2bxmC4rq#1HF0U7LF2xZ zAU8^|VGNIOQp_;R^+a;Sm6JX`;&_+u%lvijV!l^#Y%k`pIUw-%hzr|t6e~q74bArv zwtH4&4BEy>yFe`VQ2o}a)%%-ftxMXpW*By2_Hc~9<^GARKawN8En|wa!HVKTMQR)B zTXL@)-1Hs0^2*@c%hPlQnD>Cl3d{(WLvB{}p>v_dkQ&F3T|jqY*KCb71xx%kckONMyZ3s?#NTf? zO0t6E@Jz!Nz+%o5l-Lw5`DX_e>1Cc&9=Tts@gV#D=OhjyLEi0NHMT{&q*=BlT4L82 zNJnHZ12+4gOr9L6X>T0vEzLna59rMczyU5HM4Ny)M3z?*$TETh6oUv5V^e~6f!J{G zFHyOf+d}SJD7FEeCF^_vxg>o<0#zgYzsb)CzPT4C0eOhP#8GS$1}p4b90_h(cb?c& zzY$xT_B2e(X>g~%a#Nn<*Ji$2gx#mOu{m{3LikQ0cG1CTr9x@Y9+C?)sQw|`pxqOX zyr6Dk1}84=J)3j3S*zYVPa7XuX5Iu;)za8=&8(L zJP*IG1}-N+hX^4=J1)En&b~NH+6Dwn>%a8;A;Wz{42K>FnJ#q1W6Luzg|~mN*we0^ zsqraY)%?L=gkYK`tfA}-KwReSBLhv4NB_w|4>3ZgoJKRI)4X-a6N?Y>mQx^e3+Q-S@&Nv8{gO3EmePe#rUFOKTmk*_V4z@U z&uO*9#=v>Ub5J}<(jeKQbJB7|?xDM1_XIqRS0T`)z_zUQxL9>ARo${u5xBY90UrUC z!^_Fw2$79vp?<>^q-LX#cCx`mcJukkdx*fZVP=kHF|pb$3!5BCF~L8nl}nW8Qg!9XcM z{pmQ+-_l2pkl;|n#re-0YG^abWTYm)NW!fk5lsJk$rL5KK(Kw%=d_3DqCMIud|c{U zS3euReN5~2Zx$ZcdYQpQ16DFNJU z9SCz7=>umKpd5^G{sYHcgZB2qt_oG5LjK&KD_6(F2QBMc z+yF3lCR1}S`5C(qb<{7pN|_n@TIK@4VnG9c|JK$E-90-%Ss{=PG?2dp2fMG^=WhJH zV%_-TCv8!Nv~I;2&F5;~EeBhNuNqq&PZwKu=e+^VQI~H!Z%JJc1jK}L`l~sly}rmi zEM(W-wsdfJb}oA3up`@UnCrlt8h~f7JHC8WvjG#nCSx9fc?Oj<@6hjI(bOB z0BN=|{MT2yqgHK_yy)&6wMq8#+~OGH@^pjpaBo{WX?yF9qBQw|$=UYQLWji%G2=I) zJ7VZCz(;~XQ%p>hvn`UfP6uT78ViiHq+KOTH!@`CZc8WY4jU;BDsPdg)=GDYc2g&F z-?2@sI&3ry(=s@yR5an~#U7st{5r1bzs83~1vus^Mygyu?f`{U@-QeUVfNQHKq>$Z z%Vx_2U(}{-T{OMS8<>!#**_D)c7u)4pv@5kL0fKR*dfd!c^WS5;A9lw!3h=!d)U`YFc(C!d~3F zb*SVC`p_OD`9UHyONQ@23lKP}Z{AqXx`|(ts@`)#{u${{Ho}`G;dSVwx~M>XPissr z$!u#;q3~II$^Y9P1xNnw&ep2bA(zdNGD$RaJakQUy>T`=G`h~cEeSRFS-GGx8>hcwlXxDTTjt5z#YkZ7F6%`}?RF>f$STnoQk1X#!_xPJ`+*4xf9c}-?1mTqx7dUe&+$1m{Kdt5yQUu;7I>`IKQ!g&_t9P?dEVI0 z!Hb)uW8CV)6xfy$Ip3nD=nNZo&sho}@f#}l-Rkzm2Bj1ngjCC6X*d&jtDro0%cL#l zA<`5G;(`g^9+lOj1XS*`P_#NU(91Hr%1d>nhr~2dU+mPA`H6*ptQyq5nj?KaZ2(Ya z41#}D%^pmy;0=-HnX>_)h0MsFEdjwqAVs0sfFQ@}8qd7PR~;OmikKIBu_)`3Ri5Cqw&-z7N{zBpP1R zx^Tc)oBCl-n(JW_vMFj)^2U1oXn1aM=xh_429EEIT1-~77U--oYPvUg>VB>DBm@G4 zjl?OMUXSi7{-SwwFKdwfFW*=W=`zuoP%eVBP740i~jbiMnj$=d49KlehyO&Zll zJ6@Ro9!i9OcdKg?P!RA~N9_S96ehZo2hTF?OE2eP6oq*hqg||lS<~>#`5#nyuja#_ z#gTI^4!n0<ltlCOCtB0uF>8)6a|}EDUw3xOf@H?3pTRKeCL3Z%Jy)DX86+r{Sg;N(Na?B-H>?Od(u>ZzqA zSqf#sHj|%kKwSM&{~1~LvKLO*aGc@NVRp^>0)EX7iR`i8LJh8N+P65hPL9v5;Vs1-5^al z6%NN~loS-7NgykOPjngPa1Zo+l6V$NYUl4RBMn2*d~S%^98!&&=j6om(fKiPzD4(n zCkRC6u{x$EMFB5rP@OKYzRor!ij5+y{~_}r5{w#UT0e+cVpgS(R5pI+cjR)ZcHZoUdPs9 z>8|P2_y<%q!-}6K7A^fshv;Uu{^Kx6{BtS9=K}p8z-DKTCnQ~G%d18Qgawa8SMkeV zAaqYvw+PE(s@jL+!=lG;AXb%`F)~Dxt42;afLe3&LF-h1{+6fn)+`VnC?0ZmuWzVq zH-rGssj|L)Nmliy9K_AJ=3;&&&`J;E@bCRe98V#3`m}IZwN)aO6j7Xzsz`zHifN(o zr*XOyQmrIo2!EOvuqq094~i*e()4myE= zuDUz1)8h`b%(RAJG^6T(W*4N#mGu*Z03p!xHfUrve1l&ceVxOveWO>4R!nWD&QWcv znTpNiO0rp2l)}WA^pJbW9m%~87D_P(m)A*J+!_upDOIY~s_I3H(1sOAC3DlcXX@%_ z-X)Jl2QgCy)jvORz%WKxB$2k76mPw=MGZMBQhko9q4G=~IT@~Re-{-T&@wQ{%jJJJ ziVP;w%{NU*zQk!ED#Ir8x_vTo&#n){8}HpzO{dM2Xm2al@v$m$eMzQw#(OJR+(t$> zf-|o8aHS;~;<9p3k*0=Rn)ZY3Fs+@Zp}|@GDI>g_Nr%f_E)!drg-ptR$6M;kQltrs zB+ zWE%!l!`($vaGYJ!y8Ri=55As~EaV5w-j zrYe8EhbKC4q_lZyO*u`oUaY^+r5fO!-$|}Bk6-up`eirJ z9701q<;86up2ab8sDfT^ae3FhP}8(AF!CT?-DAV3a-)U1zr-ZjePfQARsY*X!0Tl8 z*bY?bWq+64PAqdU$v(SOF5K701?$AXX(uNsyZ+nCtBpppwe>GTOk!wwWwxobzsr`s zUfUQP8La>5x-#K7J3MCtWH4mwe&ft9&k|*uiAXm%*7Ce1 zjF?3X;dwuU#tHhhrYeW|mbQ(pij=t}rzgF`2QMFM9K=+ORFv-@MsJb^Qc$vI9`@ze z%-?oi3e`3f$oAuQp7&aG+I=vzo*WVw>Xy;rY#tDd zJ-6POc#nOhTE^K7e`VKX#Ssh82J9H5Gz%Ie*Ftx3QL5JNmL}hDcs3xI`+?j5FE>@D z*J1Wok#J$OkU6oBuy=jFYZWNTc|QFZG~uodB?e2ID_Do^It5*%U{o40+WUX58H#+R zLAo5E#{QnqiWuPE5}_j4yMP=;pyV zKjOEL4xj)BJiVn+IOJGfBzE1(+R^-1iO>kfF&t3>zc%adQKEHiYbk4~Y9#IA4M$P* zu-ouuX-zu$c~KijPFAR!M_1QP$WvtI2Khxy)YbQ?p^Wr3Z^T`04&UgOIoHBEeG3(RtVQ;PT(t^l_Z+UiiM{6$#c__K; z8LjSLAWN}Lc7WrqO!Y!p|HahZ=j|cr1kxd%ySMq2bT(x#l5|KsD07rezR*8A%s*_^ z?-1oQi>pdc=vFa3F4pKV>?j-Zemeadp;VfyhT;Go9$u%O|Gpf$z_o67)t=>kUU#Cc zOJY(1_mu7V^9FlArD6Iw3ig?t*k0V5Ry3~E}HdH%CSA+3F zk$ecEM0QVxYP|P_YqQYb^0C{LjR#k{9lFavckdDKm$UPn2Vy#nLmtAK=uI-tgnCjB zO|rv1TZHJR{blv6ujPn5NKzZ*myVDH?#!I(B8Y6Qn$lo)k3fm?Rl+~MAsw@pOSLUe&~1MNYMPB|QdsvLg4;NqaL_$ixJXa5$1 zYT09O?CrvCct{ykMcgJRs#>{N7w4$7Fgz*MXZ8Sa#XU zZmN+RSWGmt#Ye{JUyo(@_Z)V_E({-3Q--m)xL%CbjIj~RaurK7JPWpxVtZsVUscug z`>PgW*@vw9&Ut&6@mGMJbSQ<%(u;n#ZB9cgyk?Kz(wbd>_Y1*4NE0wDRZ`<7VpL z!!aOnkdfOzXqG3KIoFBd-7m8!nTl>~rb{U}OeN#o4V0jzqgfw01VcDUG$Di-gn*kP z2>+OZeg~rV(Dy|4G^BqLjHO2zFWTBSymkkWb$g^EKeZTiw)>Kk-xPoCpIP9ZGW9uxLES+DO@61AZiwIbsf<`h zk9m1(N$c`5GbJUvqS9u&Eg#1c#Scc!e&znhbz_PxQyVF%IXRsk?1F;N&N#nVqA+>_%g%mSu6LYK%>z<~3>9?N9c=(@0dHQ^S!9)o#{Hh_B8p5=>M-p`2 z6)bf+J^L%kyQX$tod5Zwz5BS)Yq@(Y{(&;L*58`o$DZ|gAW!&Cc#b16QVBOB^|e)b z4T%FKn;C3UeieBSW9BfXliTkK-Q~j=%MXZ2nwt4{P#(c}7iqqY_X0`kEm?iwCTC?; zfEwa`Sk%bJ-U4ZS2AwWa_idg0_)&T!7(u~#4!SA~MNXiIbPTDN%eAg)#r*hTwa_1# zRiHW3?fkx0M_GI?xPQ;~@eXT=JP9A#R_%8d3z0FMO8u@lv?1UR=xP*pw8Nvn=_L?{#oR z53Gzip%d&!o^dbmS&A*XYWWMSB?E^~t$$@)Jz1q@XVUu=o0HG&n|$@^H8P6KuWUeO zo=F+)o|&u1nAJ0u)_(}Wi54dP!N$BgVu6u7g$&W0s{BM~9S$C(dLJ2ow2jPfR?TiVI<@ug}- z-w$47>4>)EM_kNl;fg$OeQNXT#&CYKDt(0}Y;UU&mTF+p!AQs93L<>*(bNvuEn>?6 z8D?7qT9E|dkc^E7c7kvo4{2pPbT%6}fW{x?~h0AiqwPxg<9VY8tvgq^|!05=aIyd&YYT>S{d_vr8a*Nqp3g7aZvy@uq-) zur$QKqK8P+vNVSR&Ws#XH_H3rk?|$@PiD(jS7}m+X=m+LbsRv>BM%$3UG1)g_ryI} z0|_-Xx>7_O(-E!B;d(o7H;e|g%(d{q&DX@m$Z^jx$ zwvC*OjM+c)sW`Q53>?jEM$y@w@~u^gbWCLGne_^V2e4r{*xjTn)SW0UTU(s6Ywiw6 z3%Y%m$VcCV9=93BdgJnv6)Yap+i}(srLL}{D=&mZD8)*trK1H^6g1+fwW646nIXQg znfEio!`eh)8`? z>)b$kom{MJy9T$BD=OJ3I$QanPVS^zl~%pYT9EtlYd_^5LE5quM&5V}AzA$~_g*=t zXm8<{YIOL%t7gQ=R(rH6)Um#mm9+DspyA8<1e|#At(;ARn@SILCh(HxB7Vy~(ulL% zvW~iobewxMG&afsn|0s4muHT=|2a~G2OkmQ1YnRGB&b}h=KTtYT1}oo(@(#XsE@*V zMfZ6gMM6JZ5XC~D?P$gvBwTcMee0igTPr5Yeoy);$jX+^7j8}A3_WkE<+diTcI~t8 zl?(=wCD=vn6l{=rtX>3~tA|oy-xSr{d3ztYweomp7wv6c=P-;xwlH&zxj}pgg&0R- zfn_R9fNz881E;~SusIKm=u)UY7|M5EP31rwGEz%G?h-^rLCP~3_1HD8#`<6H1l9&>4ucM!OKRb+)TizPxjjAOc71HoDNe?;%*WYmK1; z{Nec&e<<$N{i2Mv($-JPJnxhal`Wa9qKEA3qi{42=Zpx5FH?ndCXP{`FW@=&_*O!E zqx{B@QF^`_gY&9mK3jq%^}#}O-F4fA_}Tv0MBN+0(|Zi%-MQu$hS<&CtGQ6!D6;I9 zgr!jSJIZ7BrNbLqTE_M~ws2P4{W@eDHo^7y;(Su6M9=K7(MazNj8>|4GjY1~LO`Il zN=B=)Wmi}G0jpWZtp{u0smpd`m{N_B*&F%7(tk~#d$2h`*HoO(zxLXFYn=`6Ua=_H0XeIV<4CLJ~Idb^_{TIX(sb>6ehb0Z7!xUxw7_NZ6eB^6G_T>Hz|!xfjR_l%?>m{qp+XPgSfB4ga$%4qrc9;Yi| zVn~PNH%1SNQ-o$4bSFQ4tz4g>Zk_wCPO3D3d$l`R*@)|=!vepRsNQ4E42Wixu0yRM znVoxNj0{X~G#$rYh1pN2NLAWB&xA-!NSFr8Mwu4ZS<|VG=wd~QNTLDk*ZDNpD;Ogk zd>3~QY|G}hT2o;U=b`>P9fGLf85 zVkEu~#zj5gPRq#=#e^1X6c6(X$sF$Vq6h2q=_9r>vPuu#E7u!6);s7h?H|8hn_cjD zKwthq0lofbZR;*%cw=}uwlu&M|5(!8?cuZEc{ya|m z(i$3fH1FBIwsnAK6zyYJ7*;7UdQD_ntiYU8Xxp1boMb1%7JhF&Th_!_E{WdbI#Kn#^@c1DB%Ht*&4l6b+D+xFtWGg* zEnc(x(`HesA)Ox|F}eNbIFndh{?^cZf&z#^3zfs7t(% zaoo^WFEIXuNNxcvI8D3S-LU>4+s|+g8GvZY8yY5o?qRdvtLuNZuFA@kN{bqlQ!1yv zEcH^kA>vQk>mS~Ue??c`RGhBP$uFBT;41YhFr`^gQnM+pO-^l%si0tkqSwI+6fd&h=b)5ul2 z-Y>FklEDNNHAB%?!j;OFCI?8n%`AT^TMu(DNVF>0#f!3;Dr~$-ZrvEn%k!g!qWk5` zxZuJ)zE{X?X!~bm#6z_thyvCw9X=K>%z zn(&keM&|14b4Lvm)L!BN_FZ~dLbJ_Cqnl3S45vZyL0jSul)Wwk;gvi zmeHNmw7YsEiUfF+k@;QSX$EW8C(^|0;tZg|2-EbSseh^kz(%R>_8j@A+*=EyZ69!0 zzLDuredmje-`jzVxj#DQ#U7?J*}5yTHXhYxaa47+`Q{!_fi)eVN+rd|Ge@(j=6#ED z!PXN+u=T`X!CJk*wkm(z#LR$*i(`Ln#!TALsx(`*Q^_ySXfEC3ObVRvw%j#f2*LgM8(?_Dl`QJ?f!yGxe^ zR@W|oN~}YRnD;qJq(tg?aL5HqU5l=ITYByAAh7RK%PYk^c3X@Vem!g>Jbhj`K7bLO ziWL+05dKEh5JN$@9Og)zmGk&-!}=7$MqfD6(uVfiz>k-1E`9nr&Ts@EJQ)s!O7I2Q zAat7sC}>zA7cY|WX~3g#@SFj>nU7{(5&BsqWqc|{`W7yWeC&(oQuc#5*$DbkEdD{iiOV!=phKlTM z9c1>uI5FeAQ`-p3h*ql3M86!faT3=%chg5F#d7BI{}t z57(O;u6i{k53ln(Jl*Mq;P%Eu_6BmY^66(#p33`MT!h~_oy^|^(0`!3Q`7Yb2Gj7o zk0X+~pJ=|Wt32S&g8#>uqIPsa@zy>4yHu(9VVcZc^LN<<5wqB?g=c`nQKWS15a>A- z=_-13C~-0b2KbIYZybU)0WEnLUl1n!7azhx7UNKx7Y#pgQaf)1M zqB6$Sk5nczcGUiws0|w%hxdSxlu6c% zu;B^=jhdW9Ll9G`pG3=5^qdz(vUIQ$XUs`YeqvforJh$=a^dw)=)_M6msnn%0O!Js z7(L4Vhi)N^1CcOgf#U9WnZ!IfB+BWr5&7uc&3N)sO^fqk?C*Pq^{H&wH9`i+C#WZ7 z0aQ3Y{uD2jJhCemcsg*zM43e?5&W6t^b{g4R|f5D5LXz1!k`DdmFJp)S2@!#zgzkF zLCQzUQR9t48kEBX!o-&ahE@-??or(NDbN1?BmJkiXUMrS3${+@daKMStwt}LPH*iz z2~UZL zUKl)5D#W+E0T2RpW&<~r;*aCI7k6r_H%nKB_#S3lcvz3_F2%_dKl!B8>$ju+*nVp; zQ*AyEyHi;vZ1TGN>0{2_!g)3^C*RIOOuYeZW7DMV3b!GVQmKZ)TZ?>45$`HMv{h$(3SOex5)HOk!KCdxCLI2L`G znr3nQzOtA%x$cW8hup0b!$JGuR|Py%RK(eNtA%PPy`7RW9={eEgZY~!UCMzMb)}E9 zM$4UPZO{EnJ*d<+^X-~{cJ)C^-oE_I(B+;C}7(p&bTM_v*U`OZ=W71xQ}md3z_K(*R! zc-zz4grGSI|2pUFbGwu_7)OX#UY-Pfd9sw#F7G44!=fFB6m~|>f*Dce2I#73#EgZS zaIbgv(sDZd(2TR?YWBOvic?Eos_|BAKE=!7K;Qp8&(^D#m#{$skC>Qv7C@n}kv>U{ z3vY|^{DO$>RsuE#K|kPMzi#Sqv+EOxi%&zHT^4jg0YZX!wsYrzJIO|ymL@<$m|Eh^ zDiDv>rLmG^-i+Qj`QmE|^S8FWr4E}s1>;{6QHDg5rBV&ByuL_c&27Jdxhq8#j%Iqa zPS@YJAD{ZbUFPvlqvgJs&!fvLtUh(LA^DQAe#Ui$vsu3qTJrj8oBbx_k*|94gTk#W zAjMgD9?N3=H!QGVMCJ@ijJ=wUkx=*b1rk`W1S*mB6bq4-9MnxZmu&+CJ)(Oc=Fm`IVNKy%aO#9aX_TZ*vV- zXg>y~BNL5gfN%l5ob!lLKoYW*q%kL? zdOxx6$>?7Q?G3gthl3KRG!T9KIf2>nO`3QjK@xSabCv|JuyCt+kYcV$ydeLl*5J$Z zw1+~R8&f?Wanfl+&I?g^Kd-`Fac#Z_U1X>Y0_47)DBX*H%RiH&hQ~)YsV42m6LVWX z&$h|mOj%Y*0{vE;S~vE}r+ldX9F;-pD|TE4x!$yS))K;01#h7W`;KC(T+qMI>3gh1ngVckm{#SJYlZ zPQz3l3}5xYnj5U$9M>Hi^S(UcrK-Iwn3y{-F^Cp$)z0J%=yUEuve}3iu>tZUcERYl zkTv}$PYlrM88zmu_I3C5cDRjr2orRj+Fhhx+$(X?>dX&5TbU7+>cy@|iyu6)IcOAN zi7OT$|6sV44v6X{Ipqi?kIX}LHTEFZRdBgVU2 z2p!UmhWRvne8cm1AKw0)3{D3*a?C_z&U9dTjLKxG=8Bo6SbKg(#m{L~B|fLzvS`N})Y%#Y)GSIryV@dlUv@j_ zCf2##184hJW{{=wZojR$LJ5O}w=O&hYSiWC&P8wr-=4+d_DR!Fh%dg1mw30TAZMjP z=}oO5_ct#i1~-o^8;`KCa>e8ou0?W4TY za|a}EVj%3QATq8n1bWEw12M5?KM=%4ElaEL8a&D5qAcb077iJt6n4sjTDMYe7Hx({ zb&#`LMt$d}@hLe}gcde5diQAU~?bB9@ack4knqCdptI-Zxu4H)3awlh4 zs?hSb?+jYz`jp?uWINNb-4rxUx; zLrgucF`+D$6D%%p<1ek8g#dFxnLY!_3`B(0kBr~KA<+3v1G2H`1qde`-BIN0og%@t zgHjj@Wea>P(?I3XEyXcJQ9fh=>s$po&FnyqePOtAVE!)hOJG*7>e_$8pDDROtAhxO zLqqdD9`Q;A4Gns+^A|6&aX}AmN;U{_21P_Xb9f)~Ro@i(-Z>lq^LNGy`Pu>fJfuJF zZ2%|*0fJ2JYOq@5H;`*%J3vrugg0)a19lzBPYgv;Lyp!kC|Me<>Rf!@gd~aZya-DI z5H;aYcbVLRt#Ws%tr0eVgr9l7!G0x1DM=Le?{45?9km2>9G=C!2|33F zY!?*@wFb(^X2<+*&3-5OXFHSekY7bUUmjrtu`Hc@lH?N;lT_fC(T8F5#jdnE;bK zB=bqY0?`IfDE;KgCkkv@%K;-u36sS(dc5)b`P-%x;X5@2DwOko|9y`KcRvNN=?DNH zIK7d=J@&&Ydi1d_a2a0hT;waS4NHqv7hVMheD+kBD>C#5*1(xyAP8t2a_J&O!dyYcn&<>;=({N z!tV!3t)a-@*M}Q?v5$iKauXr0VJw>_x1a55fF?#3zOX zW{|A!F4y8U`^jbFU%MucY<&3gJuvQ+)YRc5cT)Z_0Zdah)VMNmixaR8`U;F8+}rk(~!I52+&}gw&4liM7+$K<<(do7v5)~w4B;ez)ki+YR#RG$DuG2&f%z1h#ttfs)M8 z|5rq2KPN{PIY5HPJB@ujWkCKT+MP(tar`NQ|6W`hnhc_nBtzqV{1AoN(bp_@FgSV( z$P-UuM~BlA5>)wW_k)6`Ur*-8cU=G&05Z6qGV@?cXn1jNc zP*Cuv-xY=b)<4E|yO}4;Zol`q&RfS+9=#3)Cv=p;oa0gdV0q0Ra!|DJm)|n{U|sztesm>$18+ z-(01h1+*tpwWFh@#rhdn-L1u;K)lw!j$fW1KycKs2y^x7!4;oK0D`(>SBOIGzsF9} z>`!3+0r-$Kv}g`NTJZtvK$Jl#U1%qV@V~e9K+3bg?I8yMNO)TTAVBy&{*Ui$J#xb> zI7G}KkFbJZkYW6;ACKSGA`tdu{`9+SS8?QRJ(r*~Y6^r!2=)Ok_7o(P(_o#X7ZgC< z=4kK)UL7@$+J84K1Q`x%c&n?}>s;BV zqz?l&7hz@0*Sm!Re~j=~@i;C*q2=hxZBMbOtU%=3_wPZ2tF{0H++hJ`R#fl`KYE1i zAMaxM9~&(=cKB6=22F&(q4k9C8*ySn!cj&H7u|n-H1mTn^XriDLwY{~5A+84*JW?u zK}>^ksA2s%@&7z~F(H#y2C(p?Bei-kOpvAf*8^`~J~GHs7}-={Si)8)#bv=A$v=Ny zg6!o59)Jc7X`^r9KgCT~Bnn^Wb1lhGN{9K60d5+ErYB$T=#^0yk0+}XqHqerq+DM}TP3(r$m-8Y-@XU{OyYdO%eby3JYsot9hJ z@${6D3}Y1o95%>$Rf5gqVxLd5>BkRQpgRI)DJVL|{QKHQK*3_#9_P(%H~rKB|5OgJ zO*Mdd!;bR5_;?EIF_+&Uw8k(G$FD99u?iUDkagzCJrQ}PElZOpAm9|oaRR)Q0b=k# zBg4#d=A?$PaSF5or2=gOEc&AnHNJ#hph`a4oYCr+Q(?yMUuKf9#a^{=Tai z;@t&?V8G;okSKIeSz>rKwyvgh5c$%VYgL#-7Xo~IFlCoSVagym`iTT<*J;>v zhB52Bgx>GQ5QNMRI-MY-WENP!BHe&_+2tXJiySWt&sH2DV%E{o*#*81du(PyeHSLu z$JaMJ0-S0WHGsN-4JH!mIl;xQqD}x6g`13l?y-`qD=%j0ttrq*wGWosV%Ml^3JeY{ zBV!LZPMPv0AQ;V9M;!8EwhDYr;MKR(GI+*O7F=H;1g;8s7bIA$;MR~a^DKjB;75`T zSUhUj4RO0C|6S;ol`5bONF5TUxJSveeI{KzjuJI9(^x=Bc;kkjVZL;fYQwec#G(}=^GIo%+k?kfxp&Y-rPG%~lgY?AM z)X`mP+Y#QJ<Ufya?5WDK_FhxWZOf zSMdo6snWZ#skp36LSiDUv@~Gcg=9eub_Q6>NBrGVHAV|YKtW$W0j!*Yp70&WeIv2Q z^USE^gkXAi8f<3LV87`ujRa{{UhKq<+5(ejH)QiMu+{ubLOD7yF+oF4UNcVwDGI3= z*gY_T5g@g~z?g|hSL57eYg+g=s_Xxd^%YQ6Zd6y z=>`iB5p>gy(yerF6cGXGZj|osdUO5TbKe`|F~+%^%YlFYYpuCve)F3-G%jn`g&mgQ zroNDY^TG}be47D1M90MSP&|Oa95^3y4-qB7BSs(oYQPehG5mlftSL?!1a1zk)vYiv zFfbnCJLDz2AjUS2hCWYWL=MK8#lu zxI2f$(JPh{T_6|Tv+f9`0u++JrWp6I5s4BXSHiC>e~0}6F-wMIPY4xVB9PT!suzSX z9gS8=N=kZMDMk)_4gOeU_fPhf)e7ZH1zy*Jwhjkfs|s)ota(;tf6szCK$upCJ6=AJ zwzkm1V%lnQ{uQjj->h95ARnVoBA=bS(v-)9Z4fs7HHa1)&SRqKg+XcHg?l*W_Nh!~@$ ziWll3Lkp+=sd@WCuHGbwHeu8yVf3zwuKH{1p#@eygOD1Ary1b_F#jm?&Sm#(|7x4f zM>Grug#hSW?#Xosq`)8lQyMrtWKnKWEvQo8-gY=|eG{GZi!%~bptQ@(5Dyw8njt+V z1&-_$AvrPVS5%ad@h18xUx4x2da9!l9P)Y%kw?T3rX`}MM^pdtV>rT`6QEE)7C@LG zzQf`C3TOiys$Jt|m|ph1ap}`%_S5WRa_#Fj2wQ=);B?UqUD=~FZ4!i1=RjlL$pY2% zoWuP=3pe!lvsZ09KTBFztx|sWn)z(9=Iv}L_gc&D5p~nWo^-qEno*=}?-4T-YqAi6 zTYcSsW(=m$gV%EaNEN+&e0ZS*j7wz5HS13Ynn2J1V*(K~FOLyzf>>|o7d;PJMG^5d zm^eKS&7nwE%1AULUp)AdAfq9nJ`;T+?-0L#yiy8x?s!7^2{5bwBmu7}=n%IHL;ji-$(pQ7 z{~miQ|L+l&FLvoE8nj2fC0~~gbSHT{=5IF|X8RN<#k`biC{RAgdRpqu#{^A}JDHB@ zaI$WpSp0?~oENZ&jdYw5fb&8M`*GzVMtF^af&!$5#3DLM9Pe(IAFy~-KH{KloM zGw-O)a}RR|9GM(_bt8CM=HzLu(}%s>Hziusp9z;M-L|@O*w34@zFk*P;5l-2jvd3C z^EG8KZw|{7ai>{S6hyAw0s{~70YN^Y!kptDZ;{u{XQ;H2ofBiHm-u1 zQq$B7hvF-8&k|=fD^7d8j>LaVQD8`@Iu|Le+&sqk@1^$z$!o{0?Op1Q4DS@Ae|~ZN zlI_LD-%NB4rZp28W$+%HhluadJNLUBks*XqT^@k+PGe&uJp&x!@>kGftsifaWa+gW z!L+o&GO{3Ug_)2JvYzR|_5s}P-3?lF5qBJ`CP}O&pJEEc-Y4@aQjH4dhBUQ$GxjS@rrdtRcr zH<}$aDk4ttPOgdlX6x_K4?zrU!AjQ;-3$)`d8HDt_zqUy?SZm3=e3Ik3&MVV#riC7 zgC89XuS$B|eYeV5#)2y2bI%0R#oKpo$3A*P?vc6=YH}QMtw;e9iq`(TMSQIQrvYc% zAKVB@;+3I*lh9kxrFtgVOA_+8d{L+f86@ZwmQ(OtJaOg>ge$xCeG!!s%Ke)(u2CVW z@86LhB+va!%c@R(Pb^MKEBVC@t;xOYr*oFI%`_ZMOj1^Jy9~`tQgU;@QysP|!E?wU%t-rlIa6ajqv+p_9gj5;Ud8Mf;@Ok$Z zOaiuwUh3<>iuv~^e1LCd(GF(|a*0)`DYDsbYuc(3_ zkC`2odvql52pda>ZzdT#$pf4<%R-k4zL))}?_PqVDL|anlkfqT)G1luFv!!1-lFH< zZYfTx%c)ndUS(ustF;32MZO0zP8TEr%oh5a_QS`l|Gd(J?|O@DrSV{kP5BRnvw~|R z5+%R6I;#rq?>H2a1_fW}m&cdoIDO63&3o}twv(K5^8L8y&TYwe&&|^KtEBuineYL$ zZ~UZTO|OnP7Dcg4-yTEs6VgGD`@j-s~UiS4#TC>+J zinQy@w7c5N!I8*YzWjIj>x-i-(B^MevK%nzP|0n_KS=(Hs#1LkTb)5Y=BgxOr_`92tP6{_C7i6_A7J{ z2Q46)bHT%usaZ}PZEcVF58)mtbZpZ02R=AHu2j|6Z|~8lhC3iNI-4uXxu;R%c({3? zFelw{Sm;al7=8Hm;1{rY!I(MbX0C5oYJr@2vOPl;=%L5Y9*_Bd&KHs&3oiT{C<#V> z%(#l60kYmFizg_`@cr{iadfs=HPeXBENQ5lwUh0(5*(lS+q2E^4M$#rh{mCL|0dkx z=C%1j*-EbTj~}n={qW{OE&lxB^`p%YR5H=Hzwe(75+{0uH{!4@-#~aOasFNHDuPy~ zkkx0qN2OM4bwx%w&XwuZd33bjjf~sw49i4Bx3t8Ti_A1n+)vw%)vTyEZBf7q>;T#f zl%h8S^^*!6g1Wke?iCr?`c}%+)V4j#+B>_<$ICkz(5|wY@2Yk`d4>1tNRBE(@M6OZ|L?#wzjS{2%p5b_dN4pTcV;;aQ|JPslL9 zGCb9=FvE=tXh9*l9p2}>s@1Ic4KnR7Aww;TTvAe1b@im&Twd8Q-dZbv&qnMTPor=U zckp#vn+ni^hx+XCcp`TVch-0&qU1!A^-r&joneXY#v9U*6*Pg{J`#Dm# z3hyrF|9D3g_d1~#vb{Ij^(H1Mth$maR~@>Ywff$C(xnkXo9-(-519#O8HsZjz7i<5 zWbt{L3noEBe4%iyF5Kn9j`asEJ-s0$PyxD-lb-+QaPu?o?i`~aH1t9cE`fPI%tw+2 zVjPR33~wkSh`9rBL!M;k<=M)n?c4A|()WC;h_0WvnaPJ)Sol`ErgiDgXdlB>>uNhK z$7Ou_=FHao<-$P^LTjlro5P<*8VDq8BAh08x{BlOn-y<#Q#UXD8);L_UOIM^?b@J2 zPBx{2gM(Lkkxi0|-RP`8&*Rv@NZ0$m)As}8{N$Ni;?6|H1qTPGTeAtw-iwQ)OZli9 zm0rB1Nk@O6dcCC6MkkOgj$wC|j*Vb3@0QU%Bob=gxZfbrw6Z_o!}0Nxl|s^F<7wNEN_G}C zY8+4X3d%-aRmpR8eZ7*GeV{EY+^S_+`tJSv(By$HEX`w;u9Cb-E18r;Vm3RS>saKJ zxHXvOI*~iOD;PU@t;s=lI!5w?&b6t!z$xCUBJIpDSr53>o{U6cS44BZ(BK%*{zfpb zAb#*{b4N$w%8Ct^^??DIx-U^3N$|G#{O0!G#Ee)X948CRC$KuouW7LUIW4W$`~*&n zux>=xPuk41!FKVY9D5KQp6nFUeJbE&dvq@K~fZ~d#=yg)N* zQ`=frb~d-SdsqlqS3jw0YoskK2b|~QRWgVW&>8&k*rs>)sdd`ULXYUuET2|#=7N;) z?ze7;#QoFrrznA*zGQiYkiGQDtSXaLcx%&u=kc$D5qV=r@Uc`vlS^IweX7>W>=90P zKg#X?d4rEVA^*B9l`V+2pqD+u`iB#e`kbN_;PSg2q-hneLdcupo)p%tlhNB;n->+v z$NnyFw(8B1rjsBSJM^dewV^mD+tZyIgNRk5A-%`(!f{Lp?shDoaqXIMhD^*mN#RILUy=#a=kz z{eEQaQSXMfNl{*n^j*dI+vs+Ay?fUv%cuRx-TiSbWBwiaompvo>=_*w3Cj`fk7hj< z8PsdbyUiRkn>x;G&)x*;SbDf@WHHc6mb=rXTyRYWSi651_m>phYFqbilk4u7E)}0q zXuN!VThm)pcyRw^$?EzrSeR9<^=?{w|C&Nb$T-Nn!&cQ9>lJkdCSKl=&yzekzDMMR zv}auvQfFOuRjb1U3XFsjTy%4(ceZt`+CmmZY@?#=Cg|SPib(9vr$vpo6YOv2Z4b0> z%&fY`WiGI7e0ANveL76EmCv+Pb8+sTJBH5MqqTX}mnss9&0 zzdGPYcKk4;w$Qb38(cS%Wf;o}4BVI8Rd_R{Pd&!bb>2U{c!GqP^=D%>gA1$t_+!bt zE8kPE*SB_?tlF%vtdKendvz}j#~rc$+Qeb_-BY)4I81e7t3s#2i(>Y!`ue{}ls6`L zq-pmbe(AfjLsV|!Zh`#>2mO@wIv<19D zKos9Cg5wZJ=oR~L+VM33ZmXR?N_3KtaA~3vRpWZFd1}YFO60;ig)9kDJO{D7*@GUK z;DmZCTy|a@H-@1TnXJ-)PK=L%V<1UMN>bF)ihw+)jKmv87lO{;gyzB1gnkYf@gaDC zGJR2CXxZTy#8*pi36gRVa=Ffx?7iE~l}oPmrA!&^398z5Vv{?|*$~0Q4Dhnu1SgmN z=+OzJA-9Y&2pP*1$yaB;Z&ByDj;F30n$0%QP&;bl{e$0QzVXBME9m`m<&7M!rEfaU z%8M@Ys+_q1#R9185=fkKLb`b>NV zFW5`|6gliv~%F9r6iGzGJq((vzn1b@x;QXBv!{y{zCSiXrqCbJJSK(|`W`g2TvJqFb$#zFJ zJxa_*ysPlBvSA{^Q`;UVDJU-2WDYG-ts68o{%(DLQBp!n-YgGPbWJrg9b{dFeP`9o ztDoUxK~qaOrFKu_O;%aMY+QFsvW>HD`&Ku+By(C#JlE8$WYtbaNS`##SE{XL^U#Xl zbda4L1QnBfOWL&U2uE5|)1thRVk7Wd}>F%&adYqzarCPV=s2yRZpwcNcJ6vxoPvE zg8Ie4aaN&d_39JxAD`cwf}%`FNVtO+S^Jz{IeqenuZpp;w|g9&>x^LGJDqG^%FS+=V;41 zk)+8|z24FC5ar;M9GYE49m4#>l9CCXQ0G6xU0Dg^pKIJ5qQWnJB`z8RKj6TR6H)-E^BLR$gIB_hunPGZ>UKrD=0h=y!{=Fb(BCDCl2@FAplVfO-y*GV*0ms z%I+P6`vXA+PHgGTyJM$31O4}8yeagNe|nY^xaLX715uOHLe%_+*B z^16lJt6z}UzaEr+KUb~uWR}(DYI?Jdj-AHtW~FLjuH~4+>Z}=0u5UzoiNl){EZ$4$ zuxA)Az==Os^%wZ*7|6y8x0~M9Z}d3#5k$@ZB=#0j6j2*=H{B#S<{AlsgC>9O+|%lx zcYxt1XaAMfcD_4JZc|EYnY60zkFaRr0(f!v_+01vF%+dc zdfSUSaUNQ{^gq%JcI#XGY-+j(9qscf5*tW-331D@!|efrUb1NAJPn$4ZpCWKd=lEZ4c_L(m^1VMb9x)t>44j!HT?^(d~cllgAv7zyd@t`;rNi;{`-GpFQEF6j5SN9``e zyFBZca)!&6y|mT51Xmh;rZhfsozT9#z>-4pDC(OZo%$QRW9s+?xKGE+Gsy%BH|1S7 z{J=SA^5h@e#7nb(IMu=MAbQ?u-^LGcz!!gUYY}dG%6wSb*t>7^C7DQrBtt~3m)Btg z&9@4_uBxCA4b3b-JTiL~$_(Cv{ikdj{^UxKwFetm3Fz&#)ymnC+vtm*Rtn=C*(m z1Ea9;aAFM~UtVHr@m;uJfO_%1-n;UJy}zR)wJEa}1s^{i>#s0r=;>u?va9+&b-VlE z#7BMg^P=fyyJiAS4noI9L~IP73PfML>2vK}M&9Ps^2X5Wrm|8|k*a8d!iq=#+R*SoP>QhTBtoq0$v}<%!lP6*CVEv1 zd4>=Voj6u3Za!M0bZv0PpC%<_K=jg(WP(cft5Sr80i@C4x`Dj2BcR8D|7T_!SIc zhy%YE`prw~Ha5AmNy*98#_wGwSZS`LfvJ2j2cRM7OA8G>%CLu=OLP3LapchXxH8@J zV$mZ5oT+wI!iruY)WMMu9k}iJnqY?3NdbwWR=|d}baffRI)R=(h!)dxOVR+UMc!(q z=N%V9)TMp63lGs0LC9NWW;R**yP(h+s|-K50b^NclhV`cz`T5@U@MRyk@B2r#Gk$_ zz#PD&#KgpuvQcr!^kPuzV6KPX4}!(xEcf!$ z47n>KXMUxNwkm*KJ%V93=ldh^3zXJjrcaK2(2R)<)?~_6urMHT@fG+*h5VPfWVqot zU3~ycLjv6^nL7r9aBTw!J2`~gAk^phmn|29CVQXMew=tZeE8Gdo$chrL{6$WB4{xf z=1ed`sk|IigS}(N5zmd7dNe~$^b7*e7A-F@#kOLON@gr6kOR$SKi^o^f+|r zJezv>BdD)kpnUcny}-9>7$iz7iBL4*kLIw9);5f$LLf9O<(CK>U-A7r|HgK3-NHo% z^e3E`g@iPqb3R@VCnm4*V(9!iM*fOZ{~UfZV_d~^NzGzH`$p{hgRkUPR}E6jX2XnP zhaxG170z?twD9%QET^rYd`bsTIe5}(1NrQqufSk2a260?3uOO163u8)K|#TLii%%{ z%J)3#&SibOPab?-l<ZoUu7TW-zfh2Wv! zUPTC4jy!?7YP{ajP(asUJK~%RRgIjyJnnUK943x0VP0-sBg4yyaAH$#nfKI`F%`c# zGD1U^95~WHfvH1fac^~?t`HPB5T}f%DkdzJJk$`gdd4(YJnJ-5c}L}8wDA)dabhQIdy?!Fc}s`D~~nioAlFg7e6{9h!|99!}Y;ctQL0841v1Op)kUldG~NB+DdGtLX_UmnFxqdU+BnL()2vFzrtPzO*~i@;(O7)o z%g4oui@&%TRjKmeVPXIy)AdY2j`=_25Q?~s{ndv;fP8F&@p5P$E+~f{D09-iA=8C& zbQFZb%zS*R^Yh`dFy>>a7jjyk;^XO|JtNqsi2+MJaoxk;X+A(@=4FPx3?Dmnl4&FgunooUWZswsNI zX_Yl%f+N-e5O;5cGXTVm_^owL5McmBaU&E4zklUmBMkJAt@M0?>}g{eOsjVArq0cDg-zR?U#(z2zr&{&;y7Ic!Vov?9^y+m<9F7L!gx+;;T`u@X#`(K`6 zS$RKsbJp_M4aD#xE=06N(lArDF=}Utp_%Id){xdf14?0Ga~pyP#0n^utp-q9)1ql! z)Dwp|J*W~?1^Q#kIGjtg@eaw&Aj;;?!pVJz&b1MeN)9>-@GZkS-L{CVEwtc zW4S~pDk9U4U*)q{yZWQ4N0Sc<8s8Ke@?b)XChbC zxjxB&xVf1V3tzfVp**rN@9Ub1Ix_(6U=_Xx10*g<0B+m;=($hObQFxTGndN1uw(!N zZ(`PUw`j21BP}frvakW&(@+Qo{c8wFaw$AWshsfgz4E8H3!&C5EK-$fYE$fLH?p0- zW|%CqGHj5l-|h{}YE^zP>cf3@Sp{QGsbo9Y^My`#o)U`0HALEuqy{_4r+6IR{ z3k8wNT|6q%=GFKWCcb3VsLu?netkPk+SjgrX{z)n!xex{hz${220jBr)&)X;1~4H2 ze!U)+kp-BJ2tb~LTF2o$fS*lKTRT#dz3!FJdvxNS|AHg9@$F1$G*Bemgpr_}Z~)M~ zR@QP8e!m=bCVcqt5l~8So&!%J=!$NVa`A5Qt|zbV#!7Q+7aDgb`Jq9KIDUdn!=Ur-242mbDE0E6dPJdeR$2+Q;`fEy}JtNrVZKyWH2%2!QK~ z?2=du5R|kqL^(Y~{||lLAhy$d!|SV~dE>CL_V`6SX4h3^pqd-3~0$?1nya+r^ zE?Xx!$vWLzqzauXTvTzYm{^ljkJLwHKpTENa=_8otAikY@GWg?Ys)jzDIXdRpnMN= zO@Cm%idbuFYZrp&96pTU0FFNb5Gk5Ei3SNbD>@7VP7c$E2lv6-W&+DhY-s5DW<~7T zIP$$%UV=Oq{L4#)PWjf8Dw0jF4xI$Q6+Cd%vBoqPdT8HUCrg3D|GuW8 z#sW^z5z;PN89|(%(W`u_4Kavh0x5$5z0L6Cwyv&fbk1&^NS|OD5?&9~gSLgmMezTa3H@e*Qg`f2wBZR# z2<+qxeQc=^F#>5xu+NFp*xoh*4>^J(mH;d#K8Df{;Jl1nT#cCA{)2|hIxM%UVufwk z2{F;X3LhHMl%%EK!sg0I97>v)FoaKm_U|w(p_~{SD-QPb9v}mUTt2-zVljF?QYFH)@00jJBx!=nt% z3de0#THte`5YEia-TXh1h8{ycs>_C`Rz{wN@C-1us$^@S20i`9kJ}Iq24hc$nq3+o z-L*1`7ram`iN3~2h!)5Ze9PmiBB{yAXriltCwS>g_aP)QG%^Zt;`hY%T-n$-6*ZI) zwuU+WzB%^Cx+66@JDEFR7ZOWL`~J5h#Qu_3C9oqPZeOju-$RHBwqdCa0!`XC3%@TQ zRF~&tAU*g96+vOloA-|~G&DrmI+XRrjg1s9)+xcqYTNzZ|37(=Aj-?iCF=!U2!OHt z@N=)XZ&65qWy#?JkngV(*))dhI9@Os$xSuv3F@=8uTKsW!(T9`empg+t_cQ>8T@~b zg$n;YEv>YXk;l!7H{vrh@t}Wj(em&C%4%v)1aIHNGOVG1^BL>0tZxN?r;%XwaUNb? zDLnLAV9KlPBWkBCfp(OxECW!**jD4l_Wj?zh8!V8bn!8-#3dv=07HyHhL*B?TD^RpT4DGLi0pe4h6PAFps+Y5V?0yBe!;o8DwQW^c* z9r>FGG)4H^Nc^MCq`*t%SH947Q#j(5t3rb;xm16|VrF_0aEB*P$X=tH>C^;(7mTx>^2 z$LDYt_}@fuaG2@oF3~jW!R&D&_8Z_$sY9DZ8*GD#V70+jUS4L{BTSu9RzTZ#8swU=w!#1H5wT|C!wD0h zr#rJGHdm&(sp9(4dAgNCl!%&D#?LBZEh$ao=S!JX7K=LxYxV|*x zCm)JbIefY4{U<{(Iv&yc_ZGH7wyG2QJZYa+`!ivIVgeJi3_->RkQHZ}6+dB(xumE$ z1yQa*XEuBg)|ic}dk;MuXkIp%$Xc{1A)dAbqF1j;M_TMp> zA4R8$E91Hp=fn@T4s!Mks#5YTXWk z^WRVMz;c9PaAJJS&)HQYkS6TCD2I?CfmWaxG-&HTL*hh=sZDe5LnrAIb8}U&%z2!A zS9dosMe(Bl7Tpg0nxGAN^nM(Lb0mHYM6_ryJ#0%WfDf#WXVVkgSv9WRB zT2TQgowoh(=@@~Di3u=n;9I$sqwc<&?nfJ;TJQvP?}ekNw*xW@DlRTA?Za&vW`M=h z^zDW%&jGrV=4Z$S@Vt#o6wZeWRIB7&W#xcIO6MFkR}3b29`=+^1^3O{DO z362ti$r*3LqsF4lTsOOu)6!aLcIHUXUDkaJjnK$v*Gw;`nV7OEg415OjzML`X^67z zkMi2NPHHLu;cQL_L+%=7Je1s^x`0}m&6x-Py&>?Lr_%Iv{}Uu=C#?Mp+pYig7uZK<{~SMn*e0 z)PEHhCSETtyX5;kAGIhze_;L(3g2Km;u#|CzWrRm^1uB3tEH>LJXf!dtrB)iK*hLm zTE<#@?4E9Wnh+8H>({UASm)jUmI%R(L?D^8v^3()K$jL07@U=vtPoHl&2~@&TJM^P z*Ohmy8!MR(I01CL?HFHAbkS_71{)h2wzNA?Xh6|PLGMg`PaaH9+lMvXjr}#X_>hn! zz@o#_pxIgzx|yJr@(Px7@-*p&DMiZA`vebR!Ij{$+1-z9%0X_JAwO);7h_wXiF!Lfio;QhSrI!}B+l^|`mfCN8V$*8Y(wH8 z9nKKW3!S~&OJm5`$jZvfh+O?OY=PpC0Y*p{SZ$0aOac+v*(HSJVQ4+K65NMsO~``<ff?bry*NFQ3O@Y3zD8J*?_Loo(qN zm1Gm}k0Ut6g>YI1hDq?lCz&s7IEiT44+ppt?+m7Ah<65mU|B3zfsus;>o#;q1JQ*n z6K)N0S%ro7@mG-tPF#Fjd+7=fs&Lu%JoCVW z+M-Ti^vPJmM|>>e7=82Rjr&PVW&F2%$Z7%?yALx>An@ttngGb|ubT?#9DlNMx0+#O zHp{q>ibVAdNQNG*UP(?#0eZ_qIThsdj=lwV7WO+WAT*f%;Xmt4QaFbs%C@bj_iIS`!?@ zb92)Wgd0I+8T@UkITKj-gE>v}ulv!^81CkbGP053cK@*W(mq;}PcP0DY$g9=$T+|V=>PJE{CCvVL!bsigwZ(!>Z4kvn_f0p z(O$>d62v5VnubO+x;r^Ny{+Sm9*GqNJeG6t3}Njxsy3o+4$^TcfNduKy7e{lfn(le z-3#3!hkuWeIY;#f4t0tAy7FEZOktc-VQ^Nn+(8{O7kQcmyi318KAm*Wi&a4(-Zvda!0m&)9 z4f0T?^ZL^fjTFQ$jc%qXAdlddQ8bvqv&y_r%JE;<*`83fu3^i2GXJLn179D)QC2f_ znmm8owRiu`B3Y6e_ud-YKp*XVA%Ewe%Vh{|U9S;H_ASsypD;C0pApmjNoB6GefwEN z^Xb8tufIRwYV;!O`CJ<-zfg~d+aQ0MlNwQX{k1>Y+4mqH^2ovBEZ~_T8I5wI z0|$YPS8y^lYw71@-=k}}#AH$DOu;BMsK^!Fy$;a>QNe$Pm|%O(L$rm%bzK_Ex$VR0mXZ25ZN0-2 zc-5}33dcTBV_9GQr`j`$>5RMW7f!*omqBu04|%PWzN`@M9~p?6WO!}_E9#cSe3u_Y z&v7s|HkKbkNnreeM$R4o5r>8mOm1BH_ zX84^K!}<|`NR zRCrsx&rj6o*K_yN|LIHTn9TwGJ07n$i#_orLYUl`2S-1A#8Ym#qj%wVIt~={{)LpHubBNuK zo_iNZ>)V&xbu!GH1}Q+3azj9N<2w!G`}JJuzGHVKo<-jo$q1NwOvM_ec=h`SD@W}P zDm>x(!t_y*sJ8u5sao|6kzgWmW5oK4Ib}is85635_AS_51Co^C2OFGUQLfg(49t_@ zXt?DP@LiGp+(^N+_SMI~g7>J4!UMk50BA@FrGmQqcXC0qHrU!of2Pa@iN}M??xx?Q zZ=Kh^x>2p-+mzhfV}gJDVJPLGOyfO|uio(I=BQo(-_Yk9Aow2UY$AT<;bB1iH!EJi zAUg%l6l6hOJN3e!9~1>A$6@TF2MT~EU|aZLJA6J+g`2J= z4Y3{aC!G!zJM6wd~N^)bvoW zS`iFt3e@I_zFKf3r8aO>Y`N@?a)1GL;9u>r4tMZg57)j;$QiG-jvIXR`3BE^N-4?{=#DmQBmN_-uS>!n|} zkZ7cf$Fajf~!ND6mz+_zEA~1dPw;g{`vj}OCga!pT45Av+!^^CnBwO zE7kb&@HH5$W$;s8Ta|?InY97q{*6L8v@3+h7>P+_fT-;T_CVWmHN;~F<=%I*THDd~ zuZVqMF^6_IvDuF2Z+o%UJ0WKwTKi+8um&-HA`edGo40TMPVEer*S)#LeukrH53cOX zqTMw#D(hOgWJA@k#a}z_b{R?@_eUcg)2Ut7e!ov^&Nad6h79tgor18m0m^nw%Xfk7 zTFFM~1-G%x5s6rKX4pQZKcJ;u{TL}OUHM1ab74Qdy^a5!Qo}0J*+ENK1LtS{!{_0< zPqV=KXM`ig$3Qsz@hbetp>}Yd@$%)H&}9$W>pCj>M7x^i|2|N%z0%Fh!g8c)0}{I} zJv}l=O<(X5UTV0B{A<&aWfeFTaf%}41=FLNQzLa0?{4osaC`LXcfqR3L;mE$+*FXY z#2xrgo#`WWhPmAiX<(rC@82J<7fpd(llq|2B|60B`ay#FP}K&c9%v7QR^59X zzJY?YmJ>NTx}Xc%2%KePL)^4s?@=y8wo;4_S@SWPpqjYJ^ddRY&CYr&;P6GH*4y{{ z!Qp_yT_PO62jfL}R`?i;&bk+Bc<(hYKL&5v1oTic5_`#$;Et%$byA(5`u1CBHobL) zs>q=y@I86P7xl{l+}1DdD*2Ia=F6uT<*fKwoIa!ab2t-9Aa(#(J_^w`>M-_DRv+D^ zagDH4d-c8Nw&s=NJqluqHFslQD}-rEe~}pviof%=ql35o7j1tkQ)TKMjl`CgB+aI) zzoedql!gAH6n1+d^=I$Xg7-o-0$V#`lF~}#Yvu#%`Rwe!!#8_YPd2l>S`?Wradd_3 z;)j)8tGVz>tBDSkkG+CYc$f9zU=>%qL*4ef^V&(}>!YNRJjG2Cd8A`X=|&#Q<2LG* zMW1MFMkdBxOXCv$Fia$?l*U^!CyFyO1yXk2tqQ=Wy|X(n2z%XIHiDFMemHlz$LrUx z-KE)4&o2Hfss#;0Oz{c))H&sSfK>>;c!8`h!aQD1ySu2rYu1YST0-; zQ(+OEfImx|M9CST=>j_!EVoBNL%=oAE05ybHUHRX_UY`Wi@fj7FY?LSPu+^RrhcKw zxoAgZSvkkJS%>V0tm^fz8TAp2tgKBj^2M>F5gvxU?P0CL*?tZ>{mP0nP14-^l< za&VeH9v&XCp(X2_kg0*x@W^RM1&S3+!N4yGAIjhRj~brkMZxVlVoCuv1B4!eP`WhL z5~ZN_?Aa4=4@?bCwJrOpQVAs6ygWS{01k#|g_Dg^gQhGgMSzc1Tqnpv@vehL(vCpjVOTz7= zgj;;QSFSV2g#*;|m{otr#|^?$vqa^Z$L9stepsd(eNk&kuvL9W*(h&nYN|ha{>s<^ z9^fq1wE&=9cxke;c zjddYumQ4~m=yl9EW^-yBolF#r4v^LO-?0cZJ)m6cyh92v!A?_-c?1Fm?qo-f961)G zc^3U3`Vvrs0zlJ<$5^e~1vlLV3~b?Y3F8o0X!arYZ2%}uzT@l5PhEs5gIP$&;zsQt z#{jkJSja84jzwMEYkr*W7XEUjRmH8=l+lYRt(OwA#5Y%IS_qL*9A>i)p-Tf=XPkZs z>m5jzSS^z-b#FCZumh%DKx7jUWX+m;Gm zj)b>q;?7+Dm1UVd7vWo7O4zLkqPXh(qdQb&(4>UN_EzU$=~n$J`hOtYx}7HWqC2St zW*GqXA|%y|=(yHd1Eb6*RUI8>$&EEXYxIk!&j{Uv>&~&eSfcH)u2t)x|DlcERb%CB zLUR&FX;1Vl@1tnq*v^4aGWa)AL*eDUy;?`k zu(v=RZ3!}6y;h_+)zPg+tFLtHR?~dU>^6+4@_cayk6>ht+K!1vRb}Po3*Y%U^Y*!J zv!oWEU6X3ocG$jRT9aHer6`J-fTE%>>fp0+TU&Y)lvgy5?3761{g)b5CmJVBWg{1g zwIfTQ=DcLKZR;HRY1a8}v%#+*+FmO?dFSnSTJl>afiDWTHk@Bmd@Ev^uN|H^V;>RQ zbg^PB;l$~#G{3$3x(&zXm>eE7S>j{YkEo6(=jJibaByGUY^~Us>^GQvL#S;EOcNcO zRnlqonGz1Y_S8R}z%K3@wc$nkw5E;bszr;AwI$)KGvS$0r!~u{XCTTp34EX(!M|OY&G)b1KalHXbY>Y$BKA29R!!no!~7xKL&`Nx7iN#gg=^Vw)T{PSuAlkWa7oxzwf#LQ zOgrb6s%P9@wa_4_wDu|Y83nDbefxH)*M3z8G=^-U^H?o37@vPyT^_?@_aOg=ywiP+ z+@0v_d9RInN}z-I>-FiYtF=i|8v}IKWYe+wG)^iu>1Pb&fK9bExs^#jZ@Mo_K2KaT zMTISF941i}a*QyQtZkioZ8Mp8+_ncsLTrq;wg*iR`s2qVx%TlG|CEJuPgG8M+?D-X z*hE$%ejwV$VK8mj@Jz#fd`p&u!7*yPm$XTi(S*pY%{AuDaKi&N;{-mm0q_3q;g?Qh z#8IW2KeWYb*2fAm`2IaPCZMnRDM^6~CsVlKK<5243&DtZz@jIfhH50@G-KxC`f|g! zAE<(QdU{%*lrF^%)=$jDyk2;947`d)7?OsFL7N3|nu?OoV?)=s2YQO5mZp~M?-#PF zS5%Ou?ab+$bj?MAZMejj*IXZCuClwxSnW8yK)qWPnh_8Z5Hp#6Ok{LrXFFXL6y3-# z4JOHjWL0^5OOl^XCs)M2?HtGY(oEm&?%XD~opz&{ZWgFyIBcWq{A$xQh_)neO)27< za&+ZRXfz4Ea02>=W_3Fix0{lE+0mCaNxw!^67PPLnTma?rBNP69#9EoH~uV&YN(Fo zpp*37(wFJ978dSJnIekcVEkp+I)z(3MErElyIxaOsLixSU*AXEF;IGwLsfppBB{?i zFeQ%?U8aTO^nlS&g#K@icD<~uEU0-i*xIhXr2)0+CODqct_>KBFe`w-K(X}}H8pj- zA1>cNbp6s#d<&R6DW_$#(UJ`5QJiGc%CsZzDNwOl@UvetR=;D zyQsL*tn;p*j5eWkRUmKm*pUEQliK3B&jq!Qw|iGtX@dFh<{b-(B~#s&xJlBVSR0l% zxf>bIC|TWsPy4qvY$6~iDt|yAO=VJm5XmL<``Nqv#b?J#^t>*ama5GDa=l$z`YvS{ zcEWI`A8;8sO=@J@;iCOA&C6N_Rqw9>trB1n;L<%3+)wz5-9qpv% z0Vn!3=oFB1J(o^e^M$z3mB`i z2`klHoW-o652k{n@i3h|1pTXmsYb4`A{@PS#c9=GxvyrN*lDBmDO3njqFgqTG<|`^ z^MMisC5(e3BftQ?Kt>Y1V$@$+f`%tv~C$I6dhbz(Qt z`$PHf7Cm{|t>0gEyZx0{Tr!Ma0#q>3q}w)PwZp7EVKOu_f@QgDSh%!3C$67ljoEro z00xp_y1!jVwRF@#jrHG(AKndJLuNdSaj(x?kEZFbS|59wF<1$qIbWaXDA)SB#PY2W?ix)T8oJKFNuh~t42sB8r=(PE6l0I4Ys;_r+(sz~nq0WjQmTEqocnhlEz^VBd z`MKdg(DC9F-pEB>O9B+3J4$#LAbnAh;Qs&U3*}ESF=&^b084w&Rxn@_p^z`D1+|NB zSHRhkx_0f_y?gf_3GU-TjY9~@fl{X!WSJ6|{=G{EUtx7C1e`H^YGF z`|1Sl%Z{m=<FuN=i0;eM#^aPLCCL*nX$4-#!k85>#knyex$j{_tTb7)kjvD3*CW+?)Bs zBa?@Pdvopph_$D;GyV`xO!liZx?#8g;1&X6znf54;fa8sXv)BqL3*Y696uSlg$nD% zB_-BK^&)Ko9m^Jy8IMY#E)4+JOyq|7&(F;%AS}kwmIsi42OiFL2=|sC>6;9g7Nl_Y z8YxxTi!lqtH6<}yifApqdt92WfX{ZU7pdsk^`4;+y4Sw6wS8nUzo0XFt#|b5lLz@b zE552Nx#eQZh4gAroV_ zqEE#LeW5$`lKPeOt}AK(a%jcqxG+(9QtJ^?)=@nTTvCx6bP1vdKzegy|+qw1x zPaSb04GN%XJG9DCY4%#w)H9fYetBBw4t{67M^pAKK}W|W=Q>l;ZgXP{!%|DL*@T%Z z6$2k%7;O>?A&iD_72brw@cx_f@?_418>f+Squw-nf&MA9B5nAVmjG^)1~`?BMRnU` z!YNE-zKuEU{yTXcA$}=}dOPt#rUdmOn`tHEU*^ZCoMK9~qS8lo7`M&x?Z(f8m5%M+ zp;Q@<@>9(HH%{Z`bE$9Wj_@48d}%Q{V7xE<Nvw|ZyzlNd2!PTcn2=c+Lmmr7L{uHo`X;Zg)@RqYo6dB56{fR zpR1QufrzNi(W(El0&*VoD&?Nkv_%*?2V?+==|<6@>6@`QjY|&Wwe7o#Puojd1}9q= z8>U`WF4u5W`hTI*P}S+x9Gs!LZ?k*sx3GW2@^1m(0`6qOjQ51=*EV$yVR~@q2}Q!6 zm7o!owLQI8wEE$fv5B_Yni&e)*#^sWN1OhcsaEhTy7G3T-TPgnJDp3?k2N*jYOdc5 zuHFexj=Gh(cBgIRjOZyw5~N@f)iJLH$NT{-uemv=Xf}$)@j*ceknl+aGBk+AsbQ+P zTtc%I1eQ5+Vq$Iwj-HJMM^C3|P8SNc-~lplaAX)Jf(lD_tM$k~1;}eejB4F1%l8x* zZbJpFlgDXs>1BVI3asCIZFQZJ zj9CYPr}}k#c6PbEs(Fm<>r#B=U3KSFicbZs3n+8EeU!veF#o3~(W%mxrv0?4rY=!^ za(~(b=3fd`7+=476MEjeP+E2LL-I zyEB98gvpWDI-ESEEugM2S#d@OLKtBHS<)hp>ve^+#pFFfPsX?7=cC>Ew{5?6iCY*k zM0)uoo5MINo+suz@1SxUy)l292Ginz7a}G$pn4bwb)QMpg*tvJoCL}4y$G0Bg|-)s z0b_SCc5o0xKOUfrjEqDc_W03!PvEvgee*CZIuHCvV?h$Pl+XW%u{VL{vi;hIf95hq zA%!9&L>bByijvAyL{WxPLZ(neltd}Y5GfhTP(p}wC-O>^tNCZyG9#S<)Y_xM=2gGq1^N2&z) z0V{IgS6%*>TM20p$g$=ioGNrv@H6p-<0nBtkEtnUFqKMDS3ODLr1({xd}g`=dq1F1 z9fG!kSM?`e7mQmEMuA3rhWpXzhQ;=<`Yyx|brU<3j9ZSLPoJObQ@4j1Fv+*9X~*q_ zUb#m|O+dEw-85$R&m$uC#~MUad&vukKS6#f;9L>Vrnk$iyB8S^;t7d$Qps}8G+XZK zhQWi8Eegp`g*-A?gBW$+d4|x>dG2Za?9?~b#Sb>588CU@$>M;QxT&zKw`)wL4kz?f zgx=Mo?b;*Nkz}^)w8>tcvkeLw3W~2k*L_|0%3bmGaNUXQCGMs8#mI>38Zac+B~K1N z4vTeeTN4roOjPRJKu0=nh8h=Ov*bzhN2dqM{OqM5XBzd?)YS4orYOMHorQh&W}I! zUG@IM2i-7;=pA0tQ~X+o$ogdBdkoX&@q$VGY~)zEo;{g`i#)}Bm&4Ey@Sq8z5tzX~ zDVm?iB%e$q`1onzSMIkQE}UdL@hjW>rSi~#dfUaY^w{IC-ncCrjK>^ECG-pA&MV&V z?ZuBkiF}Jyb>LJ;(c%~U8QMTl1B=L%x0w9M#xk2W84w8>kf~3{Y(ql>vb@m;tU8QO zMyr{#G%)q))2ExrRCBHRLIG7Oj+=FR=kqOLUz8&pHM3{-@Jw2a(AgmpL_LU91WqRQR>z!I9t&pJw$|EC4eou8ja z2%`b(BETNl4QZ-fE?g)K*7(jnL*4%;fA)um3iaxp#m%pVbT?{+K+Gt2)t?Bc3&CZ$rgYikWFzn4z)_oUUTph%m`zdq{SG~89n(kYts=xv1@yg{uw`t!Ii}@!S!j_12a(@ z)~+pHyaDI~!)q{nfOYPo++7Yna)s@%Fo+0`(Sd=BvgzmHPM^tG7}P>qV)c}S2rUTT zNY){mgcUD0q2`4Oi)`^+C2xC^?0q2QqGrgv;HiqL!HA1Ns*u`z>&gd%MW z)JA-rmFax_$m2Y&#h3}u??c~(*-o2WNSL?dC$szb@M;OLvB7c(?sk35Y%}z`_Iq@c zNUe|O99F=q2fh5ojmxjKYQO&TE#VF{Vdq;urU$*a9ag5@$1Ws$Gw8SC`A>C6o^O$8 zFBsr4nmLi5H@@Z7o$K_{l{K*{O^=NwJ-uYtvJiZ^czKuN@?wjI9mz~DqZeUGEG{p# z?s-fWcgSNv6ynRhh!$ZFiRn4n=4p=mW|xRbz5%FXuu~v^UrIdBR72eSL$XbacmWVm z0a2ggeQw)3a8N5P^IP*#*AcN-4EF_B*zZ?PHQjRAmYeRXxO;Pa!jrJ1`GJegFT%{6 z2kw3t8IKd<@Q>9fBWBQ`im4arzx==b@Zp&Mi8fi7j)aP5U#zmbZ0sd<>g{f_|M*ac zR1t-9zxV1S-Q_rskG};mv(Xga=)}~r$Ycx_lUqX;_`;65s@pkQkJcc?R3td+_-QXM z`y+h~ZJa8*f#mKENgbVWAAK);pV7Q6cAK-E$~N0`f8s(NQx?3l!=AA1%@w4Tc0>(d zKv4zUW1Y<+!MZvdTPp-q&)r-s7!j$%-hMA#RdXUshf9A89VI@-ZKzonJ#exzZ^g=$ zsVH(u%J*Y|rttug8?rVE3keCKNguj`kM9v#sZ2H`0i3wE4t(&qJ#(`Cpm5}h-Jit(hDW{fQoL0I0cE$k+|CR3%5*vVkWR3NM3{)E$YG|+_H`)Ex8+JtO+?(in^qQV z(hr$Y(`2V_CeOwg`!6pyhYdgeSn?Ln!Tc~xI94vm_SwDpo8508pEMpAIaB#6_mJw| z1(m9?@!6Elw>O0bGcY9{tLUXP4whf<&yeFt36|sj| zlsk5QV!T2$AdJ7y^UE}2-{1={i*|of#D4$DFv-h)`YpF;D^KNDu}aP7=jOhfOg4;+ zji2uF#*CWC)~#DFTwumeR%()o@KJ1o0%8ygjR@V|bqV6sCTx;v;Cs1*3XL!P{P~m6 zP2_D;y{ZuDQcG}2s4n&=Po^PBCZ92=zK)(OVs{LdnUIIV7+zElZ5WP9ajh2YySI$6glf-#~`bc3GDH{ONO@h;Kafv zyV5aN&O1orSC>D>AarA7ehLLtDoj;N5i6D7bUXJ4%M{kZ6fGOI5;;6%zbS%OlFCTI z0ervIZ<2>agHuFm)mIv*nq3vC7}%~=!O(H`{sk4ECwufb#+Mf+w2H3kg2 z=Klsp+%7zlt2I88GkI1jC6K=MY3#(%og0^LH-zTgcb_}tbbIXeLfYBRSqT8&V$n|po^mo24t!%OXH9V?@ID(uprjwUrLv- z!;6pWc{WYqyiQ1niyL4UCE}M%O2dY<32%J~fGGFasHiAfT3Uz`$_-XN#tek&13;`( zz>=^{=avy?jIUCR)$>8oKm?>j#tFJg2RkK*g)Si>s|b?%dI))LsPoWP<68^fueH`` zcVvcfWtpu2D$c<4fd=}XWDX0l>p^aZ*IrIe&RzL_t(J%tUT~BkO)tOBuJvxzV+%xK z;^MNI;Ffr-ynjxbDFoQ-mFy%zg(64%l97Zlq2+^K5fC5V2M-rlA}-(E8jX#U5OEOY zBU$-V`1g+)3LLvT@VtQkKRMKcK(@dNP^P9K3)o_`8#Gm#m4Dz$%t63;yb-$=cJA7R z37K8mp@Isr3@-^_v4@ibS$R2tDXr1fi})) z(2Y|&a`ECteB_UCFqU`j(f~93%wgqbf@j3${W3E%(IZMO3+5#i12a2&GYVGSlQhx; znD099+H1lM+O|97U@X$BI54Q(R;*Yda`(dtDya|+{9M`DX@O_}B*{r0%yQSBJ=bRb z45tyv0ojbw?zlA;N5w7`i#iBYYXv$USkdST>KUtl?qDMWHxdpE8A+XDjj5za=vIM+ zG3anm?!TOVhSGB-fYN1(=AI8o0TF3V z^w(?R=V~F#ag`a|{m_0U`Vl+_{%I(U7KN9L=VRW)78^}T9tBSa088xB$=X4vW?|tU zUS_>H_F8q_lS6VFkK`GVc_*OgMCl`WRG&K>kn1vqQ#){`shGo)e0FedSD*`~vYY{+ z`O`qfp&DFT*`F%FAbW5o(XqtRnecIpotwepduuE~N^23&5$g6r zCY5}^K>OUebNvv4n7|*csmRyYXR`e)5>ewO+;qI%u*Af~Z$m?A(a|e)KEfUZdDCpm z^>g3LMhwoA@m1hnf>z12J9e5Q`@VDIF?fLaB4dnEkgsl_x!8a-GJsJvnGq*YFZCv< zT4cTGnqpDsvuC5;5{bj(12`Y31B85ieRcM`xn&QwWM*OxuhfRrLbzTssLRs9He^HO z4kZLxNzS^K_GW3f0j$eGJ~iP@!j*R)fO(99{cWP@1rM=PTf4fgt<6p1u_*u~JRUIF zDuO$r2lBW68n@)WlQas=*cy|J)kXUee>PDQx&I>0zeJi*I=BE^%n9H50SL{ltC;2r z$C1k)PK0CoAmK7`bqB9wgbaBl%IC-Ma5_eF`Xfz_)?))9>uoFuj2XnnCs-@wM?^-F z^YZQv&095}nN&OgIbwiPP45TXBrw*B63XuL^CT=`A#2Y-X6oWKLW0)>gx*N{JC8P5 zV&x){#iMW{E~b!G58yA8v;0=|;gq*P9Jlu0C0t}pC>ji~NE~>ama!k5{Cz1nL%dn& z^y^qp)dk?=Q+oyqSjIGi!9(!09yP;ct_!D@fG17z^2LU*OPn;^$l^~o=E3MJre*8a zt>e?69}N2c34q}UB?J2!Dfli%ScIcC)kOz#NL)lj3(O+5{xt zhbkMtq5)<|q*m|xwv)+42>9F>jGeHsusmv>_A|BH$b@k$!^$WO#iN|GFZQFM!dHgH z3u<(eN(w$*gh$V_vWQT@^V~V~XGEdXHh3!_F5SknRN44`x6oph%SW+ZkK9^zC$wJvEvfL6I$_R#LE`Tt)Yje zj$?6gQ4#TSY0}9j%hwKO9!GrLsc}f3&ij4i}OTAo?vlHo`$lS0q@)Z6&Bw7+n2c+T;6A~5ZB2J!o zll-qgxgV+?B2d)md!h`)kDm27`SKB_?b zfDE^wuxWJ`G8@dyj|mN zq*t;-T5bBjz%nTw18~`*&v6^Y>bqJ0)j}c2;YLZ|9fIWA@-`WBOEQz7Bj&MBj^Wt7ijW5 zlBy^Hxg_2Y^LA1$|MvhIhYzo!g4!JjHljM1N*uXYaF(-vauO!Y0;Z4Gfd-$FBBQX11dU6ZlyUbIn@+DSF*xKgoK4e%HTb)hu zn;w9`fe=j%hl*{^V@<04AsQYqr=^V`X`xW`BVi*Ft?&$sZ$46sIo zaYjhn|#3U4C@*- zsD;u$VqVc59%KXWZmk1`jB*=n+<-f=K|*3rVPWC5t5qMi=vQ3Xd$IcL z2^MSo*p7wMC&<(V%1odFX220IJOEK(9&st-Cbd}ce-Ds?%>P0V3>EXSsXB#4CYXf$ zh=>&k4Y!9}KxQG|yntbDkmqa*pi#XZ>ia)v|_g4oGEY5+UTJQvEw zGDNgN!v%rBz2^yFS`Ee)p>M=;ay`3TzkU0bit~^xXP}1?2X*tNScnzUNd!YPMp9Tf z@k=Q9kLLs={l$cZu>lD%pE0q8aGit+t2k64@TZhp}+(*$#{K?JgAp z1iccC&9oK1Sd!=Y^Y*Y8@ES;pBCoMQsdxlG)GnN(189jl7W~?^#gyhG@oq$cM5J(q zKC{>?e2DDGf}{%tc|078re|hiYUr=qV&^PD38b4w3_2k(s9vUGz5}KwBsAhn04^c4 zP+PRPqIhqCkkFNo+QL8xw><3aXaWl;Y$^jML0k=RUJmv@Ba9V-3USK-qBL;@`~|Apwh>%UCJw;6MPPQv3I}KlDKiiR5m``$r(rH$Tve4iEsW)Y zfSK5hqkEE8;Wpxg+QQr!L|QXafup3RmNYC=u_T@YyHPD6w%kR3<$rsaWU?ffRAKl) z&fD=V?3$nOS?qlYkb@G@9T(3g=de3)qR|vT`i6v{I(lK+Wy z2@QOy6i6c&$?Fydz-_{%OhG02`+1EV!Vd8j1o7f18i_Kn_05T_0eBEZb--W?psn1E zeKe3L&PcE)Mo@)k zq#b?jrR@3pA@x?oIu-pr2>PtyrjVvYuQ!~xQbECuW4ohK)igfou&jNv)ZgFLGG2p^ zQjmvvoAS>(`5@zvwaMfYF0y6LI{(*!wb71D5zRvqjRhwM3DJty1l2l~#k~$6H<74( zfpJa@0U}6WqtXjq#DWK=cU0|xffczH4aqkKSdILmqIjv`^CGgo#M-qQM5q=q1~e;) z*p4dqNyHdAP)X?Qdj0u)k{BP6Adq~VG^iJUjQ3Bz(^7$w|EK`-c}i>*Jv4evw#z1uQyT~K~mK0MsBo@gPNNm(!8n= zL>_xy5OfYI3$ZPuaqQ1fi$02Q2X%0keF#?*ur3n^gvHZA1Z>WQcnu!%_594x3~V+Y z!G0om#JD6HbTVX?7?{~dBn1dtD+C2I@OI(fMg&&)9kCc_ZWq8FiBF_sY2o`f2V4Zz z61ir_#z~CnR->*%wx$9(n?)e^QVUI80-xo8M}vv)pa@yD4(!i)^ypEvy(3DyNpY`{ z{tS%#Z(*kV4 zC&7H)o;dH{SCRZCV99hxZ-)R7-G&)BqGKkcK#HgTXCzk76Glqx#?NUP|_+lhi;ldW*uh@u`*OVqL&+&eKyTOfOd1 zhN|P}0Wxhw#zj~>IM7!(R-*#V#$LQ`qnTIam^q`%M%E8vUcZ-trE5PL9w|?f5jh1fW&l9R)w`Zt^KGC3rAS!%OaA`V9fIe7 zY(~9%?~EBv4+>=6zPx*|xU)n3>V>|=ILePSH1TJ^`RzNIaQhAr9U39>IPuhaUv@E@ zm|p@EfCpvV2b{+EH}K0yOUuZsa$}U}e?Qs{d+kMK55MX;gHG?U8z_>^Mf*^BwonUb z^g58~j9rl)yJm=CA@&090aMlVtEWP@j}j$?>p~g?peh=HaX-YWwBR|HV(~AkSumn$ z2*bD#(O_s$yh(v-vH%|kg5Y*;Ztj3lqbr8WjKFPT&ZfEp7h@v7jf~uoM&B!GO!fW5 zTCy1Q1X7Sz2iGi21;TO&56d$J8XrH31Ti9HeMCnwU|Hm4%xUx6rO{i7k6%lbsP80Z zn^cv;MP@1~R)tCx&4c6%e`kz8E8v(wV*moh)TRZ8G~+{Cn;CvSg2j}+3p zVl*&0Pg-D$TCJBvWdU%SLya^j7GI{~6F;4<3!sL>-Wh~LZca|2HEZG|@~?!3hL(q} z$porD1TNdy15);`R#eG^+)h9GnuI`HMOVy4c%d%L24s7U<4qVq+$i6(U&t{aM(Nm9 zr6Fqf`2UWEwL07G9>vdI!7!3*Dm7UDAP`{B?1piU2~sg(x`AZSN0C5SLaxWNUOMXg z*B#!wRMbKRs5*-vLi&GGKD>bP0h9@KHp}Qf%$Sh&31??~Asq*K2p5!Op|rWf2)pih zT4J2*1rjXBxqC;0lEy0%u!k~>AYse!`tyTye4^TO@$X2nh=I8}_y@2aOceVBAO2+h zxQyar4e*htpsOLcc?%-jmg_5*EwfZ!ep4jJu^ne(BCN@4K1I3BVGGW>$rlIAhm^Hq&6>ELt@TAE2{4cNi&wcs!&;iok5ym2H@5M>@=y74JlmM*P_E-?k5 zUJ~G%lrRuep*C0-Tqca02`3a=cs_&0`tX0#>!Po*hkqJ~(!STVXdXyNJdO#rQ%7%S z+x%1yh~Rpnu}L@Eic0kjp7Sjmo5Q@c)?cnE79rYvrKu@`vgw)k7$a1Ur?fyvBDG0<>|8Knh zl!e`$MxiX=3d`v&cS*?zJbdtsVS9a=i45u?9de`*ev?6jE;40yPn*(A>`654jWlt? z|HssTvWW~@gj~WfLI;m5Ox3tBtBf7T_(+~KwG2^0ULnd==)|74X7E9WfuEVUKsI^k z;sIlT6pq3ti0DbkCMI;eos^e~Z$;DsKpA?`=6C?+LU`QjpTrgo(Gy$G)cgZpMq@L= znfd%9kL4CR5GTXX5BLGyypsUV)wVU{zuX$XP{x*rOdpR6!#y8Or{Fg{-rk zE`}|>{KXcX`Ny2NbFZB5()a*$do?jSCWdb3nUn}I+b!ZBZrLOjeK~(cNp9nZd*8&F zBuY8Olr*lyJG}fg+rv)JK*JZ8-!tK@`tIdyhmQr**)?51XY(d;;+}y8Q}r5O0$TZU zU?3Alr1vT+8CLRbw$=(+n&J1SPk}`*3E8=0JM`M9_AfcM=UIU^fGB`hAb9*8a2a&) zm$0)YC}fA0mX@eruO?bP!inDIMHd8WYHGZhcH?ioY~T;(|N8Yd2L}f&?F18%@JdTN zyQ<$poScT7XwN@D37Cp#@aShQl!#y~7*Jp4?{Aj@{^1i_zI^$Q_IzGoYE6`BE&xLH zw}O~|0F^{5yW17EVR;T8hoGu>fR@oRiAZJ?!Yh^C#L+o;ich7QYn;}!WXTdz8$3Rk zehs)tSVV*#VWbTBblI|He#rf$&CM@XIMEnZ4s;f&@7uTUxtfXiivETa4zwj1k|oYd z9DEWK=R3~_5J*RAl?438aGJi|Z~Bl4T**a*-eYCgxKmA^CH5=gH5k#Fs)>;IP*s7+ zVA86t-y9Sa^vt>=tJDxUxM#Q4C0@u3!(&QnIKZZN{*En3mVdV}bLD9^d6 z%|ssMjbK`5E06#Cly#B=T)`O!UVeU73kwTOZgHU1{RaE!H=X(@0`Q^!^4u?B&>jYl z_KR-My_EV5#-#D+5guaDirf=`gt9E*InCI$6RuJo>R) zPp=%wrY_gXq5$75v1b{+>r$)fn|Nlp{n-@NEt} z;I$JFbL`%`R}=pe@WU5U5gY{x012_<3wW2u&wX=M0;T1L`(TCaC=;u->mdhXQP<$$ zHD+!JO5JVSv9MdWE&|6{;pQfBhq}59w<^4R`LYYO ze5X|rFHHR}Qf(n?sLwj7uc)ld{JH4r)ur&&xrU=6tfqE!HzQt?tg7oPen8O*5PzGn zA_dEQq8fa5J0Ugk!q7(J_;C^GqXj{zj(b4p(NUuB-0AhY1K6-mR`$94v9KCcL_x@t z_^oI$cA!)fUfnx2)f3wN?HfJ#mjW1SDEiK;LM+nV*B1yK(ULv7B3JNe*f>w2fE>FF zz|p1k&_KLvXebz*9R9upUNPZ`)zQ%39K$1Cwp z_9I1?IbNsPM}#)!@)z~SUw+EclN=u!3S^?(+bi?_CT**>q!>wXgRl<3p%Q{6pnZ&) z$DSlEM3G`ZbLWwcZBj?_NF~pG^LFaPREoHJXm_JS=)jleYwI`3>6GXDf1#n22EHmf z9=qGy(Pwwd@ZOET%U9(9^LJw$rN2FYE8>4B9&jxRBsVDuD+It&s1bD|G7Mk^7Lojp9R;9a69 zdjab){$KURyd1i7O~PGIg#?`Y>#W>H_AfX1JA3Vw4dtOjsFTv#0l_h)X1^Z`PLJDm zd6oIBQa3X*b7;+8ik1grn=oKT0H`b1J!!Z0OGJ_o|Jdl!V(QVvdrA5)^+YXUX5N8@ zt=3|^xg8U8ZN2{er{1>oNN>}QukqhzzU%B`-C{lCO6m zFR*xgu!#k_<$fdtB&GnI`3Go1Bp&1JK2*PcU0cx}N*>3NrSD!9a@AzbbY&g#aqjD6 z`jkJS=<(NWMMFVBeNOmt3FF6pCj)l)Y~J)bt#oAY6WML zTWduRL`;-EXJT7*8L!a_@z=KP#YWQV^+sd;X63cqce>VOch*a<2?JtHH64;?;eIsRo=Z?C8_51&HP3;KsTnl-`(%D<&( zb;5o=ET~q`u{SQQXwd%JGqCPgm(>dEH5Cu`C%KAxNRIE_&ayw|q{YY+UD0nxP2b;3 zJ`t0C^I>cZcHLgM&ZokM8*S%al3e)6NaCKF&nh&qQq5nv(m3%NZcoh~x+aY0>sjtc`)C8$~gK@-6MrF=0ZZs?Xg zMc$;ACxX@zHnsqallP0`?~fPDRtKsoz8yVeW|l<_l*}GKzbrj-<_t2tzFUM8FwIM! z*)8lqIm*lg6p7<*5KsitZ3+_eu7QE8fZ+Ad-dUc?E?YCPTtk2%^(Wn96+c<}cT4DH zGia(-`wd!X{9R_CO*g2h5&lqe?f3n+>%S>f%A9R_d{C=rS5ELS58qa{>;v`p7iR3T z%Qosh|9PH|&Zd>ld%Rx$`pRiFP#G-ds_!2jOnU~r_LW)BCWNa_#I}XCX`6=UYJ;Op zvKfQT5&3?~Tm}_`&Ea3fR`ED)+;D2=T`$vnZWg?{jzb!&;ysyDk5SyAAfk&XX`L|V zdvc`Hn1g2G*sxcEwngVxVI3~O5CY5c&yKt)D`UV=8IM5lwSK5cMn^}Bk;S{Q4stQ) z21*Gc1GnJ1UDP9 zcmi)03M&Evu(N~%G|}Sa*Qh)$>y6b9;D*`IX}*EZzI8>2fNj&`$bQ?0xw6mz=509k zC~rZ(G&sEcxA=ns12>_+NgLPusGa0ji<3i6lUpx-LPn&DQn_QR=m%CmzW47>?_DRw zr>x6(KYc@`pO~SE9^+B9*Ej9=RC*TPi=LKS%hvjN^PMui_H3<6=9^OP_I?c4yO)ii zdhS6&iI%lt2KL*8aU5^Z?VIG}mJ8fq-k_ksO;WYLKOL$I(Z!b{Te|Qe0`DLw^)fvZ zlV+F*(RTbxDYyaR7KN(&bai)XCkTK2M&Re0eAixPS~@yX3e+1O9R=ARk947U<~u7U zj6|rvDc>d($oSokVRpc_B|`uOyFW&U_+{_xbCc)Vkaj%!Nv!yl6~jgaQc`r049o%i z?ChEQ1&s#PxM<$e@^$C!NQ}&gekdt!(;k}YP=8!+-d+^2jZQ*~< zM;zL-k7-%plaZ+7jJvnwRlLr@NYOcm)2E-ouzCE)=jC9Gw`*una5Js~`v-^Y3K%V6 zTC-MBaV0uB{x@#iSj65{Q>?tWBAkYTV1o@_d%1sVYYV1UCyY`+L&lGdI03&e-nhYr zBSTFRvf_}n?EuEW>0-h=r~|zNzLgWDJC{HJUgdR-q&<nNBj<%fatQtfF5%~&C%ao4 z6m+_Ls!UI1i)tEcy-@fr7Votrb@}L%b4vN4^3;+-DZ9Ctv@-*hTFnvaL=iP z*4ieQIz4?6|A#tEjhjC=-)Zwx-k)23JY$2o#dV86BhL^ih6G0v@?^grX+L%(a?-e; zbN%}DBv>P`MXUKJqa%44z3lpD{i0}HT?7Bx4VU|iXnavWw#brdg0K-$m$0*cSMea9 z{TA+iylZb&;xU8G$W7ETBy|}=Cz*1+j$t;p2-S&!1|~ouQ z8O8mx!y6iZZHlFMc%LUz7-={Y6_Y49ad@xaKQnmlf4NUh-_$GUe%`oVSb z@)6WRTjF_8&=Ng0d9LQ>=H0t@FB9-b@UwLI@{$vhTn+ROcWPILi|9b0SB^h|dSnS& z=i@|8JvBAeg-fhuZq5&$_bNzz!9AiWH~Hvw8RJ8mB6BlntIYCtXmj0<^lP-_3>r6i zF`F#5t?jQ;R{V-bv0XY}PwjW>{XUd8qMQBaeDb#C<|q4mpX+{V5}|p_^!exB&2@bP zDS%DdmX>QlXIw$g|4mB^uLL*C$Cq+s^XALVc`6=__0Mlv68Mlia~a6o-Z z{o9>9)G}(U1El`#OXuxwQdKv^*bKBORm)DhXimg=BpQW07rK>Db<|)FqY-E8())ZZ z*^}G%q;E2_os6{XKj|`v2g#IohwKm6b~m9y~}b zl5f!jhlE_&lk}D44E3W@Zr;4PR&gmO=dJm+>{H9ZNuJm=a$U{wiz2GVuNZn*witp< z!T-2`yo0uk0)(mkcV+^mD^uhiK=E>Yy3`(;-i@a@H7AzUJycZ*O?_W^RO>op#8!9F zB<(c#(;rc2CW^f3Qw=so< znO>1TO%4x;>Zc$9K_)E1VJ|9YgCk~+bXfZN^PxpB?2JoA!0@duYEHeRgxVV7kIm@t z*Bdgw|M-y$!kBUlMo(qk#~IjT4oMp4iWQf^ep@4%5}<)*msW)Yol)ym{i?MZ?o4&Z z=Q}Fi2-VBwRrre?F?;{vWkzgclmcf2^G+m(d4`CsFTdXuthegizgn76{psb4(cAb#X? zUS8H{>MKgfYYov@7Z`bjztnr};H-;{(AA;68C`#Pq*TqZf+R&d`uezP>wr|kU zo!{l((ht+CH~CT`b}S!I(3Op6WoWE_C*jOBu#t_DOgR+qD9wLu>| zgR`_ZbP1;U9vhSQ-MOT%HckKH#f!uqK0)2Y7i*JrxOuwA?^K@~-6T= z&dlxb^Y@RQb@uXNtf4nAkqNAgKRM~qKin#`!16lrOkZZV<5a14F2Y@z-+cQXDecNC zDWP&&zEB!ZV~vA`4kA7eF3_jSjxZ%1P;N}gDKF_@clo97dhd^f{f)!v7rM9fdTg8d zUQ@)e$!T8MyH|y?Db1KmAZ4`Cr8VqX!Irg$uIkZIZdUg~Td^Is6q}%o!0jiqas3eF z_S^32f!K1T>bXs*4A?-XE$AKvIk{U$ zr!>bt_tyZgq`^c^?yrk2!dOCg@^sw&`xozI-A=sFGe0%E4ev)|m+Fvi-Ra7fZzsSnkpDbiORfe-Sa)poYoE1PJeUy zYOl$kY?vT|ntfr#`J0SV$mg*)|{Z$&=?5S&l*=Z@_CN(_wAIty=Z+&pIJ!Yj`>$ahS zR~DJ2eHIy7J9fx!ahl?K^k|^Ju57v0*`Ga=7AA?un4+GX&M%x+?ht6CJ97TIwyUc| zRb*D#?6H}i>R0v#>2^EEMy38FCK$Z_Uq^cqHR= zksPiAVr=Cx?&tS;!|+Qe)_!G zr-STkn;1k~7=HJC{`}br6+3P$FGL5|(d{9Bn`)Mu(QnH*0Kj$`RJYf}U;uib8VQz3 ze&l@fm=5%WXvl1o#p-R4h%FE;29AnlePQ*M| zd18h9DvfZORL6w(dKyL*w1c)m;({k+%X7pshw9H>IimVrk50TaJJe}gPj~l4h_xYK zqJyr5tN_%~mQ_T9E&wl&$bNZ9`zBT6zr?GD9^t*%*u_2%^|etEhWJ^uKPn(2xP*<` zS3~wo;g~zmjGwxR}@7ORtzG=JJgW}(& zT-sPoiwR(#{vB_BT*U%o{*W+7w zzsaKewqF0pn~ydsPv-*H{F;5nGJSvRnJd~C|FpeHqS2-4oM^1I=nDee?Ji%(_D(BC=_R)5dKny2|l$CT`1UBK!vL_b>CT zDr{DjEzS|!I{8!mQs?hjbl{dSvzNB8G#?xKqiK+qGgNjpocEdSFEOdZ1xtsv{HV?Q zQh6ZiDgJ@Om$@^|r)12SzJ9%LUG_K*>i+pZ>v=YI&?oJm_&BjW{b0}A%HXM4Yv+(5 zh?%b}=xcYYoK+wXeSUHc_u!VR4`><}me$5h<5OORZn4MMnL}#f-w2{ z`9~oR1j3Zca~rq>H)0YAsYL^)jf;mzIZ8-p%toLenut@_-F+Wx%Th7A7zo}z$CVBe$~3b$r7gUK+Bnmy-!^y94W<*8lvh7nhXlIeqH|L zaMo%Tp3_=WzMLz6Zf4TF^5IP$+wA7j^GieGrdIce)szMq#(jVJbNPCiHl9oL^GxS@vyVEVvm{BY-gzHbGOws3+@7f_v4P$ zfBiu5%Wx_T$?D6nYQEQN`_+8?(DNh8xo-z^&i^`C>p?kM$nMZF!}7SrHK1j@Y^syl z_x=31Z?wWmr5!s)zP)0+e7U3Krd3uwrgvYuDaqRxnPj%_2$a6RX|tha)!UMwP<^eQ z6aG(a+GH3Cb-&tDz)XjSEhN)|#j=9dWC|8D&R7uyq1GiQ;mFYUU#)T-+fi25ekE{< zd*wfR=ku4BE_9&tbz|f?7t29Pbzpf#M~5Kfor%YQk_Whx_FpA^c<2_X^k~Yb_xF^R zW6z%k#OKu5tffQ>6H+^ZMSPN;{tHsWL=tGujmG!eTBr8J*Y>WV99sTYFShWqQ?n1$!JL#ckjVbGR5QEd|J*FU{nAN#bU%Lg zb-Z~c|27Xb`&Fja*0LROquhlH9*l=y$`|L;owt0K?_`C0>pcHv!aVESS-u;){1t}& zBs#{fqWHC#DeO|um8Oh-9AmEf_>rHb5Yjs5xwoB%Qna<+5-ix5Ik}2rIdwjxzo(TG zs9?(Sx8)OyF(q~Z(<`;#3qp%z7>|`E(*?9TJu=h|)-%YH4^7Y?3VoKLaA)Sv!1ZVM ze^UICbqB3WTV{R-9@lTW`nAP%-C4i%7BW`W6|LqM z5ZKi7fV01^nGcspb9a9%ZKs%v$ZHwyNl?F0G8Vf~|JP%**&B>!o$Yv^%Oe>gy}$tB zYRJ4x5F5aqqA=g_Us-z>!>rNK(eV(tFA@(I;ptk8I^0xEUKRywP-x2tZ!0p`o;JX+ zU;Xv#3b39g@xh8T^j05WaAgWYBrRI9@aY+dcxChC*qFTCP{q)mb zqnnr!5Z>ya4?*bZ9<8ljcFtwJgo!jqzz%kb!6W0O`)P`Qw#EByeSc>gkN$m;#D!u$ zaCH}~?uPq5DJhUyPgkeMlz(=C6Y(+19c+XGCH_?S$;|pKsU!3h+m0s}noqHTr zQ@mAuL?{L01#g^(+Lzu~)%+$bsqHzltjdKsHovUJ4VLARf zrPf?}{KDP<8dbsI&{cI0gV}HSZ_ZS>BlZ3R4TjQ{ZDN~W8lIjzDSOx=DXtG z;oMd%iliIbDkwgBnoFBbV_{7TDEblBYIPMu4is8Lz_3T|I^u z6qS?!NuEG^0IkSoh+(E?W)hLy64#Mxu2&-K^0_}h4oR6lrQn-`9TMmQO%92`wGb0# zqq>yJW3L{WhH%P&q$xX?`bk( z5J#9Pp6i!aRaMu_%s$_q!qr z#ooS}KjrM;CtAufub$2w?P6B)GiNPoZy+vU2Cxp3?ofKrW9+LK*}NW{dVT$6Vxb4p zb~EOwpP1#cGc%;o5ys`*y?^wtuC1*&*cT}R3^@5N_S+8UJDH>!YlVCSzCYggreyrYi5yb@{J)+-1NqrJ9BJXGOnnG!5K2mSWYV(k>KLZQ*J0 z8S8Yu6mW-JXSI2Dv^>d^&V1gUNlf3H7l2W#dQ0i()UO8bTFL9(Bd-z>I;R{54$=o+ zE_vlL{A9pcCj9p8kayafQ;(#1B}^WY5Mf}Q{$;9o#og?NRr&_jmZMJb9_ea9h-kRGk;d)~I@KYsjJ#+#BkB5~AXci8b2wN~pzM2gGHm$7dWsz;gAI9SkW z)nR~wnvSwhmu<*T)aw;wgYl>d`eB0GFE0A#?OS?ORi)r8r&TDNOQV$B%T`{H0n(M( zcS|VoYXfBT{3;%-P-Q%Q@q%cT{s}Wym#z9uduQV~Ho0%VUnFkP!ESLujYcAJRY%s` z(Y)cv;=6|yI$!862k+5CP1dhRO_m)ln*Y7^h)<-Cz5FVX^(lqUh3V#2jvmtW_C)z zVLHli3p+)R$-KtJ%fNZ1tZamBXU6BWj)MIUX&y%Dzi8C<@bG}d_p>5F7qF>wcflQ-RJl{pV_6JB)r7uyB-+{OG#Z{ zWE^?w>+3;@IXj=5R+$g8a&dMBF}%%EYUdNoMty3FN}_w-Z@ggz^MiA+Tre6gd355$ z2|^!xPK^o?0ur;H57hil0h-}=0fUkRJZ4mGBUo$2TEvSI!AKdUvLCvSgs_G_sho6k ziZ1v}O;1zlt%9%XKGTLVjJwbt^7f{sbp31(lxcTtWg4*>jlYj~tyr#mFE}FNUT56s zg7BsbA62ng_hjsr<^}-}7RZv_ENwCi>G{UoeE4_r)JMq?6=7M-i0l$l zQ1~0rRv$la53o1HZ|`kw%}lXG&30}^e(6ctj4rogo3~}^JAux)xU$#yz4$aX*DI)g zA%sr zC+9Cp$C{O-hpOG?pm`^84Iu3}cRYuE=;jOs&m*-B^uxy_wryKClpX!)91eMr!5eB+onz4fZ&ZMmA6|8Fz8j~}z|SX*aj3duViTtmPbxZbIeqsN;k z=;!!?yxi@r=Vs}ceeUjwW4+1ubI2USl@(ALx`WTnJ*tbu0Zmrp%vtV_>%t!Y;v544uKy%&vt~VJs+JLkvSMvvCWSCr(^j7wGHPU~k;Lt&QWxUA8wMFRWkGu0%8ZYi5!E zuigR$ir)t_j;}49^Y15R{X7o$JiT@1>G_e(Qit*cP`vC|xZw2tydVW&=2sE-JYjAr zmLu~$Q(h%rNR}lm7Lu!1?=9H+kaySl@edOhXehFGE_0_{xHRdYPAcZhf!bYNg-M={ zG7$yLYa^c(P1~^h9cR47pam}Pciw&Qx>lX@%PD@-EL+#g%JQiHRK6rfV}iEe^~~?- z0sE(aob7e(b@XU_(#}mxW@Vl{YF`{sbZNAyAcsO( zhzt2z*NvH($7{Y9AG-`HH}=X0Gv5;Y5|^o5%AAWEHyA{6yrbyfNzxfCY4!bubq=D? z0mEI>jtF)9-J^$E}YCbuSw>EFM zI&loLXCm#suja!nDVb)Se-wN_|Gdx6a?&n`(em<3{%3q|#j#>p!g^8wY3JYl z)>!l_8foFtQV(T`sm+aQlAc0hPsB^iO#=~Ifp&r7=o;EkM!PWGvjhsv-TU^*PxU=* zZ*RAc8O%*0X6SFSH)+SN91<`YU-NZd8CCv|_)jz>RLWDE^M&+OCOyL)%dW={w;1>m;3 zvnu8Ycowvl6zq+pf7?Xt;cm235MEQpGgx5q>)=S`r<`M)KZZ{qRdo6qG5zW3!2d(l zm4H*dzT1tcq|8E@g@jO@%9LRfDj`&gj18JaNs1J`Y#_^LLU z+JN$ubydBZtcC@D@_n~s9BZm^^M*RSDmsePKz$(R$gXo zC-+PH)%9Ym-sS}uY>LvPzw7vts(bgW{4zX%a2-LL2qA_Th8E316fu`7DsmAl27sXp z{0(}}_}#;r5AQ|HylG8!llKZh!WiJ+(l>EC0E_rTM54nd(7Z0yNTa`|5BuIhj8M%77Yxa5QoeDXJP3Yp+g|2|Av&ZcS|S zl#u1jD#;gbtM7NMVr31&)=d;_aPfg3T7bX>Ao?cu5n5MxkBP~AZN2x2YybAm%S6Im z5-^Zyo*Aq8=*srT+~U4@mo=L%743;{G`?E!^|sesS?+o}g9)~IHD-)}%Nr9-Pjh`M zjWJb-$j-J(dpIXA_vwzby_b7SBm^(4P7j=As42@G=cslIzdKHYVJ;)tS?VdUb;Ti9 zCxZ$6<@C7my^bwxTevW_GcCLF_0&dpyZ3VGhjqN42X{Jqri{^_#^As@HBYX(fIS>$pK`1<)B1%C^kW(n!ku}^}0Y&(z*VHFr1`@_d;ZwOmhKB@8< zzo^$tEthHLKW?gaR!hC{XgM=iyYYbE`4=jxnWote3OYI^gWM8lCK&V8Z{;44W>>RR zpL0i*K9W7rSQH_UG{N#+2(}D_^=Qu`KeC?~^&@zc#xf9}bbA&i|H65EgsRvf+nyH^ zI5P}G(??9m6sbC+ zBIh$-8bZuwrGNhU2Oq2oelbVDZAsI;04qlQ1bj!)FbA9{xe=mvmCu+j|I_k7CUEDk z(Us2%yXD{Amz|RNH0NFED}bDxJ=gX?9@{tUCB=QUx6#w?N5F|~40F%VEoRO1H)fxu z?{X_jsV5z=n=UwS?V2@ikU2era)f3?z@xWA=*0FEZ-cC+0}~>c_vr*A9g?1&4x~U? z5|o^s)xA9f3e#m!=PIf%3uvb)Bk`M1nI+6wZG*9tji@V7r)tRYZxlEwC}$85lDYE2 zz)m4`A-alJUu0am#EtsbGvDi;NO4I?;=KjifKp%{NCHNU@?ZcHO==yC9CBN6R6i)p znKK8X83hdu0f=U6pu`BnCrigmEcW|wq9-6snX4cwq)IAo=J|6L%4qN)B7Gwf#NVvtRk4Kgs$KOw1c%)CzPMHwG{-ZozY1U zG&3{f3JE@9OXXU6a!~z1n)@yMJcwDeQS>+29o_saU*YAeSJ&WNN4H6U=3lI%v$JQT zM;8(i35C%<{$y?>6bnc#c8~tv-_*~)RJTcDw%Algk|87Vq>$C3Fw^s2ADW;thLqFm z;F>j)M%Ov(J~ccg&2^&anMUBsW*b+>mWj&Cn%r3f3S9R4D>8KCpGQtpV&X>ZB59AT zq4ZyA55~fnbq%Xf6%+j@cjzY<>Flw#QlWp}48>-haH?OI{FS0jkjJQ4$agDqYKc0D z2rRgHb14R+dnCP+b#Cv1&21?B7ucp@{Ot5NE*u&QJEItcB4w-mn>VM+ghja_m45M+ z(*92iK!wKZpl>ViWReUI{4+W_vJ*Wmp%m(#F_(ktdAuSAFDzFv!?Wl|ZuP|fXGKMs zQm3B2RB$FXlltARiqB*0*LKXv{rwUsBnEYa0}l~HXGk~i~b@$3orob`F_ zT-WLAoUnXT|Eci!_WdguD(uITym#!FhD3lGU?PNCOae7WzHe{3=DG_5Q&2tfE!^?4 z0@I`M$Y|mPw z`Sw(x54?q%2#+X1@T$u#J`$$t)EmNDuRmM4anjafJ?rL_oL$)*bMBTqP6x(4ID~D(NiF^Jr>Y9JSE7i#i z`22>z?55)WeHt{X!W1uaX+!7Nug9@Zork7q;OI*dLV6^ENy*8IaAtt+OV@O+!O5)~ zFCB~!*V3bB;&AH!CnZpd7SKsGMp!i98)Gz`?U}HJKdh?#P0>7gdB)D${oy^5Uh*;B z=X?;JI(mB4^!UUp(Vb&T>nNQ0B4ZU_;$7|j{d4zUvQ*tHCOat0DR-@rvaW5?D#5v^ zS+RYv^51`_lB58G2m;#e_RB@~X6Z zG0_w18@4WEMg3|UnEq5+-O<wA6Rt2^BEFip0E<^|pNvn8b2LC0No!!X>-4RpWeLCW0%&ZTOMp z^A|5R9XxI&U>5xJ0fcBBKm~iS|Di|COCBupL6S~xdvRkb1oscr%M-k5GCq%MzoyINJbwA44>s?e&1$TEtU0}nQF3xe=T1jsU16E~@+7f- z_)ri(nfAC)QG#jKvX(t`bX!}+VHsDAJb5i}$mh(Nz5|xb{qqJXY6SlmHQEv3Ic16+ z)W?sC@ul|+q`8HUUO5NsD(;>aB=qO#E5mkj>Mx@Uk=sCE$h!7FXSJmZ5va7~x-Zj(<&CYWXRQToya`|xO!bVaSCE3ODxq0VC zH#X0-ZD~Dq-8W%D@uB#%`160}tlcujGOD(8V4eT=#gRWgHmfG}JejfS^AEF}6!_Jb z%Q>uh9$n)Ua$DN1nYm8uR3gvURaa|Yy^?|ZsoLr*GaE>%+4JX-v8H@g4GsJl{%3oNVLzf+V+0?3ocJJatAMGIyN^%u7;nQQ%xWys z*WdF?K{!#`Q~hrVqN@u{H%;JRN|_fE3(L>`GZpZ}5!i2W$wjCqG9{Cu1h6P=VKMKwqyM_P#j_6E?pWOYj-IL z^C^9YquU1D(b_?j!sFrX?Z}>3m>_}rY&}*m9xf?aOb(lRQLgdIlks7Y*(bu{mRX0R zQ*ovt0vizk3J1*#C{(kt6%`d8Z&t!o z^U2qh5SrA2h8woXWICvYkMdn%W|WT$OW3+|QMaNdL#G(^U#dZSv}H@u(E1rt(=j!9 zN|1Nn+vyJ=CkRD9Oq?#I<7+o=Sit|Za{5#-e#=*$H>d>ZgJwwpooZxk`aX10e28=! zYYUi^e|eC9)vOFQpRYdyODXs6hD2z#tKq_-1FIJrna13$_IazBYt64pw`H?b{w;cZ z>Fol)Fy@rE1_sAJ%8J+Qx#)Dy;lS8QM=mk{qFF_Grg`aKM(ajWI#w|XeA~F$R(oDe zc#>SQ+^zdZ+fU2q4K*je>uBz2F{)jW%+0^a*mZ^etAsaW_K%V2F&;;&S%|Uf$j>ic=7ZY4)*=AUo&b+MO@I$+EoqS83txO7zJBpS!A`QRHVm!+di8 zIm=^f!uZ7z#E-&3smZQE!%Ry~cCqgS#v|Yfl~(m}UJ`fEeoau_?+-N##7>+^b~Oh} z434~B zaG!P?yYcYsa{X(|olMqEYe+VDYPql^Pf`B)mSvuc`xaO?d>I}&GBZx2D9mZUzp>qh zedRvvInqvi%Ig^X!tU9HR_{s|)P5+LoEO_Rq*|v?`P-#2^|p3Ri^a%Krn3rK1+&N=Fl5O>*xq4&IJM42QG^3Cq78c5sSn9?Q=q5UGO=ic>mQwR{j|BR`1U#h_4 zv3>j0iu}e1_~_JQXXx;w3OJj3Vm&C#3Dn^qU|!d>4yF_)CBEHJL$AI>vV1+4cbgSC zLkeRj)z#C(0!H77PB#EH3)(no^EW?YY<-e<*gjiK=IR7*n_TtGbG8?=(lw7I7579b z7cusGzY?3b=dH$hZ<{iY#ZASQ0q#)>%G+l<7POvn=w9GIt9oN;vz^(iLj9%21$^?; zMb8bcd@|ulZ`-|G6|K_9fTS?yjJLPTE!}3@W!%3S{5>)}Y1Q&vqlGnvSN0ZUd+{84 zICy-$Rs?$7Lt}sTr7Q`SCH}5t&wKuZh6{JTz6*=F!!#^{is>$TExex zf4yg0jke?R8)*MFz;WkxA5q;lTH*Xy?16>+m?+3$!(Dv*Lt_8v~|YcPTpH^ z&TFd8yo}X~NgwzlThFifx6ygE-z=vj7p<-QPfv87Y;-E9w>eE zZ^PvauWxr>X%AJi4jthOE!bIo|M#fdSV`~Ce7mLlls zYA^V5uP8s?7+XtkT&J2%c#F%99a=kH-@eCrS*^J+Vne$Z6>B2h+1}0w={AcWED8#M z2?y$p)ZnpEMB4M$3JSPW-<%Yj>ry(QWc@T6q_oS5g=tGZY?+oP&(F>YSXp!c2ORWq zJ_h{J3D$>5IS<<^c2s_5*4}^o_RXBE{7CbqOC zuDp9<;Y6>08#2#XooiH`V=e8ld}ZEtb=l~sm6;y)Ng2Ni3nFAspK%O&_^DBKy7jAu z#&qBEf!Tg4pBej$?6dE8>s+*F|8gpE+2Y`8o#1$(s&|83(2&}jca}4_MV7U!4?Wpg zdGBEDr5pF+6CW?TJZJQnOU`y4ZuJ{nnscnXAB41AxgE2)a4a_bB4IJ*VSHl4-lbvc$70LtdjX%? zRil4QR^GQ&kqZnA1bd1smXkjB&QEUg8h|qkLiQA3G6C=bxdwAFP%w^{Z!(!f_u@De z0ZNWZ3=Cd}q3fbCGnymThWRE+d_D|{O6qz|if&jCe}O4ZdF8u~LqLy>jD1q>jo^$n-PH*>%DxGwiN>3@*QFf4N3^fsfX20}s=5=IEnu8G^2>4YhLj zYG$hmI;~f3j(Q>f)bV)#m{ik|jP8?$?oJV{W{%qr*f~{yj@n+&^CBh!4GyPexG2~-IAr%1wT z67FJ=m^mR1PhWoq+%bPbIj4i<$A_uNXM}R7y$=PXB6| zLJVCq9pn}bKk8eor{_D6W{gQN_&SQobVU+fvFSmI2^^1l)G{KV$y12896U6T2CpYT zxl6IzXtuAfFOB)KV%e)v*1$qT#SO_d04gx_0_u7q!cvkYw|@&kZKbg2-gQsFOFoa` zW=O^nFcvmL2LZg2A0QXa?g9kzo^03UB`ChH;>%Rw*7!p9vvoSWwmdIlmrUDP!xBE3 z<`jKC#nM3^RV8+s&cLRm8a#z-7{G&d0578tJ&z|=iFojc#GB+A;iqL8wHB*BZEJJB z`lf}0FE9eAvft;XV}k1BRKTy zZai27q8UI4=wZu61rmb}I312eDSaQ=TO;JUL6JltgPdvCK;Tbcc z5dt8jd-%T+2-1KHWyhM;l29$?9ou0xdH!auIE z^lE`gP!pcrxLHvJ*8V^{Yk@cR0?)Pfx{3p;(9>;_NVx}{H)2o6t{gE}T<>MKC<;{T2;3c;|WiONaC(MYD(APG5u z04gF>Qb*4cR_c4X=OMZIu+u3gwQk1WZhlp|fE0f_?+o*ib_eTEV&L4|)Pz5kI`8Ch zut8YrGIkcy%ff`$U*R86r0VzW?IHK?FK^O`Id$iAwatnZHE3gLY_ZAC^7!+%Hbs5? zb$&6KzG$q$JD(C9GDaRG4F$dmrmdo4({GYt4EmH#l(u3}p$f!Zyf_QS_~vy18)5vX zjZY6`eb5r>(i=NoMWG9+gg_Mo`b-GpLHpHMv2YbKL;=Q<_(?!|{-n9L`?w#RH;jf8 zQ|HqS!I)g0fQf=|G$}owt=_RLfBgS1hPeXci}vF%!;m%RfMJB$ZN^gv2>-(iqfh9u ztDZlXf(jcmlY_LkXYj^g(1+$(3}YNCbd_~$F|Cz=DPLKmbX-od4kBxg0C@x9R((W1 zdM#MRrtaTBzes1M8d_<4YOwObK;@iB2z`t>@J-)>&x9{=N%7II2Lg6_0Gt3hJ~Hykm{(ri;RGMIh|de2M!=fLfmD`~lk9{&fOi4!M!d3#63 z_B&8i$3Kl*9RwatNtv1FS|*JzZ3g!dRNx0N0Rr)cB5->8K~j=tv*k{mIz^^L4>NGb zpOx%Ug@4U4)Zv~Ox54y{IqXbdf0|2{Re$zD0_gYkwG7R0V){H1P8+xTs-`S3`VltW z)!5XOn*tM3au=G~C%(>#x_;2V#93eDyY`jE@|(h$0uqjI(!)?FnmJ5|p>M#S%Y)U| z6B!g6aJ^o_8O-{kJ<_}v8VW|>HMtSE!;-TRwgTYy8)iN{DflpD@e$4prpa+~r_E~h z;ba@JBji{><}m;RNFOaAKsQ?9Wj{nUn6{ABRZOAnpL<)sdQWYnM1^oOh)e1pJdlt%P6wXRIS#b)LP=iU7`XRQAj;KX z?_p^nEK`$8?iK*W|4tEk8Pn`)PZNw#`mpk*lNtp5y&6~(A^^j25-Ar44HxtTP%x=O z=sgTM0afBO5TUicI0WPK^u0kntOFWuo?@VqEK^hXbsA~k6ti0dD^ z-&SMF9SiL8gR-ixxR#NHnFq``9bc@@SpsfFVei-1$KdWv^}exW6_*zz{MHv?LZR54 z1rSOJv$@1LRE16Hhe2{B2IF}61S(+lVqOPQNYT)K{rVV^uwl%RfJWTjBeZN63b8}) zo_-%3yo>Q{Dp_fC8=}O(v4wKNk=~O=Vi7r8oase4PPC@4CoGkW*qNG_H!f()*$3l( z22deCygdN2#e3ez_NZB8`xb2O{&guA7L}Oe4@||6B^+tju3g4^_x>ZsAJ(I`@-09} zTmvR|0{|1LGg#Z%qsI3E+0_J$ijcVYEIOz(@GmAI5f$6NTs`;#&;j9;qpTR9 z`cs7@B*GDMIv`*+b#jsbNP-GQ52N}L6abiX)Z8)fyA&SsL@~mylm~DqRM0!iw9rp0 zsjKtTv=p#&BFPI23jIFHsrcfm}M2tTD({a=nbgtzZvmf zW8)Dt`FIQ{K}_KEVPj(hhoKvI3isf&0ArWTAMTsHy=iRj4E+8Hu11B7M#cZv*ufPD z=nz8lfZIgQ=fkHX4-y>E`yWpgx{GeiJ;!vgnHlkc?A}CDZlfI(jt8ex9BGBPI_K~Ehq`2J* zEE6b+zxImo&YuXoqb428DeGNa)*6XrA&lv{82zS_9n}s@6`70iTdS!O|u+Tk;ng69AY?vJPg$Zsh6Yk z51etU;Y8sNs&KFaO^5=tzM|!)4g1_V8D)`38@Xa?BAA03R4XAzN0XBilMkzo7-TEq z87Dz*kN5?)r=+F}uuaH>(N|QWTL68+(+tB$OJ$L=AHwm$?PeW#%KhrCZCvzZQGeSTlI zR5_W3prCi4o#gJqP1n`b)lJdZv=wgoTN0(BB;pYCCeH0RxA!8rvA|FWCqPst-2xVo zOR*QG2`Z2#yZR8!yFhcz2ML?F%*6-rH%dj>%`r9VQ6MSVG&!RfXuOby!y(ZJMt}){ zKU0t#L}emagJ=G?o>f5_h`(~e`XZU2!Wb_WEzRwLhB?Sk!jzWaf7^w&h^+(+!_E-9 z=$2x0khWisEpY2jkm=m1jIF&w8zrnH@d!vy4dI>>8`#Fnl8;r{;pdrutnlt4@Aj(6|EIieD~ zO`s9OqNAs9Y+%xSP~5(Ia4s6O9UJc%1w;RzmcL?Pl|5F|Nc#*{GA!an@V^_@BYo@5#OvwAo<& z`t`sSxlH_uf_~Oa-{1z5v2pc;K-`@~!Q=4Mz89!>DL-Fm?Du=l)dKNp?>93Y%NnD= z;dp=&rH=T#?$LoX(=?9vXhtxYQxYW-UxGVbhwDvwg!Dn^8<~d=-RYrb%;5-H1p)^C z(yIAbHH#1F4rgt4y5TkWqPC;_4uDlg6V?~eZ=@8hq1dc|bb&i!S9ZW_SR2dO&#t9B z%PQ=|`-Iyt$B2m~fL#Cz$bJaTnr_3kdHArM;JDbH25!)GknJzlWNV_BqD3-gv*ldT zv|={HW7xJ1xHk9m=g&D>y_(H*(C}_x*KyhAR8OSk4=K~(`~e1R1|lst;J3LqXIMd? zc^5e*7N1!jVk1a42_qr1RZdEs)cy52W}zr}kq!x$Hy$cNw7?&Sl=p7kx|KYm=oe4| z_BSt^+kYllF~`HlC+frr5l%GzOD|cdatd_>zGg|VkFp?KQ4K*V<*{?;)ji$S*xn~V zti7#m95QJt$u{6w)}+(>7Qzm6$Q{2@&Cvgn+1&l}hBNS=Rtw^ zuZAIbno}-}OnfL5rNvn)V@yQ#&e-SyNN{<8oGtR}5h~sLnUEdwYQ=LCkvWM`xE|yW zGD0E;1ptTIFcN|$UI98ntnw0)x%wI!jZS!^6vOroyR(i%9~%|RWa=5KC-x2I!Mz!{lHz%2Z0%$Mo};%~{{4}DqO>C>v9)jmj} zmP2#L0U`%b)F>;O!Lm~c7Trp-XHSM6vIevyJwsSLksgqgq%cnJIYU|Ta$cSQOa z(H@Ee^D>7D1-3pMMd^793UqKpWg_g;2pm}E>wZk;%V|P5&7ad6l<9Q zpo#-n>c^5D7r{GXpRA>R)-tD?$9tBe*2+pcHSC?W%`$gEdICn3xyCyhJL;WOGXjT>S`p!8%1xEIJ^YmM?G0=jura zPgab#WG<{$~B012MpseuF{L5MnR_4Hp*`1Z@Tu0ne-WjW}4OrJ;EpH~`0D^C;=T2{R!~4=4)O&^76xBpy6v zebJPx+5nY3dSvVO@yS%6Gt~f%$fu;KztCDSp6)&IXvq7IvRA2M2qr4loEf@{Atl^; z)44GsaZ?~D%16%Qh2x54*4CylJ{-5X;BgwyJ4d_CcB?l=l;#T_K(4KCXsCjU0S%4R zB5)DJO~TE4x=eRGA#sQen5bUsC&o?ICZsAOHM)cI$8|@PE65uD?Ad7eYm#&)@GeRz z#^5hzGui;?+e~B`Dc>WK2Gu5;Uo&_AdiD)cya$Gp5UH zYmjF-v7=fIP*XKZHP!F#!EnM2_+0c9r$P%~oeLNF+=Zax;ITsxous2~N5yD}d2<|` z&Y`CpP=XjT>(V0T?|3PR9J$ob&#zTXTajIN?fP||)HmH`VWyRl9ZatlvNgcI3aV78 z!l$Z{Knq}Y*llVKO(J&un%7~9xp^^86%k_OzK!&r4lym9eB3|uDZrWQS=oVwcqo+F zk$|z=-Ih`kxuJsL+B*EGsYzHjDQ4mWI^OY>wrXPZp8`@~vF7KDUu0B~9uPT9o-2pz zAqQm|2#o2;M`9w35(IyIeh~r0==`Rqty~)p4v9lCIo{K@;%9P$nnbUcj!2lHs;(;c z?(N%2HUooLJ?7@^Jqsh7@w?DW5|(juhYSXqk73M&X8k+wMxwH)B<^^_p<4gOM#f^wQHD5%Dg=qr<= z8nQ70u^5R&Z;bCBy3cklF2%dJaLhPRM!dytF!=bZ5>i&%_3JhCqU=B^RKb}rY~z}1 z9=zudd|B-Gxy^C&G+l}_h&-h|l11v8nl->7`q9Tl$9fE6;ZMF>CHHOY95wiMYuYzB z(ITH+!+IGk@{5c$V+K~Vw1@#w3^W|p=76$_>+kstJNS_j@#wm16#*kp+ zHsLVOY65u+KY7^UxS?mQ(v9n<0V-_!F|W&N#pSfMwFM3|jkKsJgHd85!5P*fMUW7U zIyp`SmS0rVI&v=pW|Sn$|Db`?NM`4YcC|CWf`?PX2rU#iFIz|9-Dux66h&}AOA+i* zVK%|NmkiKIbpyB#7L`1J2b%f^W3gWq%UJ{oDS)zMDaupAV%9J-6b#nt3UA^5OJB@K z(HaS-CNx1DV=Yb`pTsDh_lAW$$q2DosW8ur-57yZ;3)JnwCqrWM@kMJUi4l#N3sQi zn}ZOscP7>G-U=Gl1sEC`Jo@bdryh-vrK?ZI<3^)DJ;w&Fo#3oj4>7q16X<75~K`q&fj&SpGnTA>{DyT8tH$yo96 zkI!*uNHzB+c+8OeiqUR&fM29z&xfkuTL7QQr8iYC7rokIS>k-b3kECnU2-kKp}v(Bf$FA;BV_s>3eB3?`)!;gMiUbKf#R~Hl`bg1J; z@|VCT5Da=JgE0!(tKQB%dN@(7Mg=q1hYgVs!uE!wAq{1at@f`}naa2>}qN<6)``NLdVvmVlQZ zhQ$qR_HmMr0KAKi#Tbx-5(*!vVF7(lMhL2d{JkGl3_S`A8HExa$KuN+yc6Xjp+~4E zrC??s3glEKn$?TtvpP4^03FEc5BDLB*s3SCHE^{088G+A1{P0>X(W&=Bxgnl$_rrB zD}X4WMDIk?j02EXT)ZZ?QFHd}N<5~1bn@R)w>0Yk$|DQ~)>vXP-8-=<8ieX$G%JXH zg=nhrhIOEAxcz&ek=^x3GGX6ZQ&Uqq zF0j#^K?amy0d%mrj!ITku;gHeE$Gapv#{bGEhgHQqoBS#(EO2f5+d}ROLErAB2B`_ zLgA!_V(=)Hn!rS>C`n+4Qqwh7mh3L-G^;!tBd~7kw|6L2u7j`9PGJ6CSV)M5F@XK% zBdaq)@ObE1K-3JA`8z&kBlwlYSF~<{b-2E$~3p4P8cY^9q1_%jn3CGKaC^H&MB;d^| ziYbFI#4(B-Fy2i?&O5Vsj|zn~P6k=VbjYPqRa`){k6ER}fWWp=@a1$^p;O1dJ9`@R z^}-?|+;9{l6Ed)SrYP&FBZ9%0lb=EQ0u-h*vBZIBWRmt%>le@Jk>YgY^o$t0x@xCh zK03~3Bw!Le4IjfGmk59@3Fw?Da!#@_Z3F($iNO}G5GRf_i=H{U;N0(NqFc_Q z7(DWMp#fGrAy8b#*pp{vC@*z0Fl0slVt5gA!R;8jL6b5O_?x24#!Z_d&}c)sBF%wc zBGBNG;WDkLp#e1%thD6h6D}aOkcFN+DT*yDv9JsiLAk;15)n46K$(V=4orDlYd0cc z@U5??H#fh&UD8wR5RLZ>^pPSL)a0V{oMdEpT+Nz?&2)bmJ zN_72^%Oc02*jS7voxt;QrFP(O1J@Q`AYK!qxkK$iej#XtW5`&LVAaF#o5sZ0w(&@2?4iIVLG zc}ql?+bjVc^6IKGyOQmh)Az_3{& zcK6?ZS8VOB#?|itE`f*ps9}KR(}lzgjvf43lU>fImnEX$(`lZGxm3rxqoac?gE^XS z{?;R>T>~f6J}2;KoP*`PX;bD?^Ei|wYu1fp<>ENubi?Svfp1s}&Kgr3hE(?;jvz(CI<=9H1@$tAhRBtLIJ_*XYj+rF*Xq{TsRE;I0Ler;5prE51O$;@NtSA&! z@>r(VYbe$%hdYee&keqa+R$y!^0^p&O-tn*R~X#J5(_FGbyb90FnOTX}!oUpSuuhvc_I-I-iEH0=H3n6vokPW;gbPmTo^Vsvpa3>I z^iiS#(*rV55eqJlBYGD1Do;RG1HoMhID3NXEOsw2mnjeo0Cvn>HQa}T+E!1MJu^d? zG~rO}a`vnJ--Cmi6ue$akQ(cTid=17T^D}JT@-0v-H7>h{+TImL8AJ2tB9)n*9>9l=@9T%YAiU>=@8 z`k&>y^H9q}^)2oZtuA@J|Gf;QeoB0Rat{6ap!)XhTUP9Hu$4D_({Q{H-mtRLQ&UxU z2c!r@D3S>)^6+omJqv93pcVq{BsMeH`7v{r!V;H?2wJR8*F5;Zdi6xwW}v2}B@q|P z@*z3U7VC2j5s-Ud)?3Aew;&vU2a8UX0sGDU>n;R13jz!|Kq$~>-G#JxPR&Db^XVun zL46#rJ#FqV9qSTJI16qVA&8t+SRKUSQ65ijVM2;)1}9a+03s)~!<* zfouEldBW|p;pkpO@ZsRm@$-!ja~NR#RMKjKTO#2o^$el#w?{l#1S`v zreW;zGO$6r(XX91h_;M?mdqI36Ix9w;0|Z68qO~+mc%JZ|7RLMQ`{!tg$5IyUrY&Yf zM`9<*QCh}?mkLjBGbpQw$irtq>_SY5OikTqCitJpD}6DPOIH|6Px4+(-|LSqwZ^h7(Xx48j1=oDi^SW1HJav!rvvh zJP?5QyGb<9hLjbKpt*V>8xj!YL3rl}snMi0ElZfa>JnO5X<(LpC>|8Gw5DOvGHl!9 zr)8%EWgYLPc9Q~uuoRh4{<82|pqv-iUB?_A*gPYX#rp-T+hHv9DfkDYpA z0Cs;*$kf%qeKA?STmbXV5JgVJ+G!zbl<^ffOKY%YL?n{wx4fBMP@qfvxO$=~G>-#+ z;_=VKGhr&sdATKX!7zG2DguuMe2N!=ECIqMkj}0D-9&LYx#Q?Lumi(lT(r!MLKHmg z?Oi{W&~&YCX_~-c3W0Mii)eA4|n+Ww*%~`-4#aSg+>C<=N)>EzCQD)fRU1$KK=AW z6{XiDdnQuHjOVhe^X_Eo_AzL$L?;*+HPYmO*9NA8H+nk9RjnEt8h!ZD{5Bc->MQ&D zGf+qLVT9BJI~{4WQz-8g`WUqP1w{v1+6nkZ9~WzWn1W+U%Qr!4lles-*eM7{9bIHE z*=K7b&|yNw)fm;69}+*T%rL0{Wq?iQmhZrk;m2}me5|4M7V<9H3jZ~X!1!GkER0}N zeGIe>y4(chLU#O-CK6Nuw1)66v_`#oF}^>BHccBzDnmGy;P>VNTnoiHbEbf&pioHS zBhZIt91$}!!z?8wB`!W*L9bRc*Fc-*?i2}c#3KTV8U}EKx=h>!($|ZKit1n?AT6WB z^?}ZY+r!gyzv(nZrSA=Mt~&ggw%Ds)2;Bc9n~WKqot+%*QPcus|QE*-1=1MBCA@GyI!@<6Saq7>x8l_kxN-;*jKYL9$59?k89>Fer zIXL2f{8JR!Yv$&b`e>j7i8|FjyANMsQlr~8fQTekBybBogt$yZArqJ`pk&OMafED( zm>EigW&e9aKS=BA>koc?BZpGHhA@?rCyzix>sEDia`E2J(xzr+wD$vS1TCb(m!)D| zciuenrO>IcC$#VzyKrYsnWME|(8bq%qdm*rY$6xK;<)sLtb(lpu7_&gPfskDZD6!q zPRQJeC{4fyrrk+zgd2Pu1jM)Z;9Vx8?jThj`e=wRBq?`6;YzO>fz8=^<*%GT;eK2u zP_mkk$FFrXh1iTJNu+@vk2d9Ssm;+!{CHq;s@9boucveOhDtyAD6N$<;(x29yQqa% z&|7VEPJY_3!+%-;Ik8sX>$X;F3a<~q}ss$9!BNjC_Zh)^5xWxpkH0mcN-|1C)6;A+BCS0*^F>VBi&FF z5-!T>$ylY%f4H~7_Z)xlccI#PgP+<(mTf&)8}UAd047{Ii2|CRDJF%)yu_KJ9X-1OIQAS`rg_r zxQwq!6r(9K!TIOfBm>jA(7WD9LtVWJ#>8-lx%go@y+h^@*1XC>K)?|SjL$@?%1M*F ze0+vJy#=#9+kkDjZrF40#4OY~)y2EJdWZZYdsktb5=f%m5Oo7a+U)-vEd)TSktG<# zu+D8uAzR&m& zJM)qgBP+$pDQe(^`_RXT=%cMqZ~jV>{2uf*HXyinbA5L~=Fd+J9^#Ayr@MgxXZv>9 zESAsKP)t7cCR|EBySROeufbVhp`P_|3cxTi{5ZjO^mPl`m7OHy#@Qkk1;Mc&5^I_d zCsjRC1a&L*UTqJTC)=+T3o8D!uFQ6goqC?e1hdImxrzK+XAOU}*3AC?GI>c|TKufn z(o2MP9+P9;zrStU$Z#+W;&)Cut2?l^+)~DIJ3FVe@Li@s-%9*9&g?7SpLN}tSP)g^ zXRctUShu03rq|qje^K4rR{mpN+ek)*gYLU-C3H&f(de%)-gS7V7X{7u*DR=^@RlB? z(#v*Ew^hUF3v2l2Px%E49Q_2+-@-t4aL^CJ0MdOu{2fS*C1~7Zcwpakc z00@QjP~>X#65kwZ2%XK3d7FCU_|a1f}I4;*V%WWgVn#m?66Xcet@(*}7iEgy4Tg z3~cp61>(-EUVoo)hDRhi>c!Bq%TAt1jkL&(;UF$J2koqTMF`hV)LV8=PT{Lv_w&-` zJuu$xJ9fB!-ES!>CO)gO_i18xRY8PGe#^7q3XG-o_@XdHqErNTGTanW#Hvvm9l+U6m@5l8B=;y=0F;NSYXd2 zcL7jh^*D*}D^_m}c3E?xs18L@7APefMO_bccF#)oWD+_I=^}%`1i*izNgL)ubqnYp zIl5|IxkS7QjE6`|10BWPI0du9(obY1GY(#!bUM8?PeNl&2nP9pWIDXP!XuDu@4vp(Gjr5gP*~Vm zn%Cw(dsJQeiLFY4CD%~8>a@{w#r`J?yC;v%#ZaJFtI_3O%*NzPtqnQiA}j0`{3+@! z_2t&cRPSYf`m_y+H5J$wr^n3s7HPiZFF>4ke)Z15-2Ty3f>v{Bq8sa0n|f);5}Qf2 zG&bB>k5K4D5GwK~X}V4sPDUZaL}g49J>qkq+BF-0{1|9MV+)o{Tqg4YXLxP&uv9!sCt_)b3sxX)aozaEDf}AF)FilnUwX7 z%ipzTzFF$K+2I=6hKpN|+-&9T9(&Em;Xfy`$GAC_ov_(4b8;m9qS-&7Bx|?!3#l!! zcn9Sbxmjk|OB^XQbJ=d{ZdK#&-IV{UPVm6`lA8k^ZRKy6E0_MMXniA>o07j)AZt!$ z8Mok$Hz5O|{@zke0^Q!`Cw*?Ns0?L)moW?!!*c{$!I37nh$ad?ys+fzJq^k}%pn!9 zP0(IIvPV2V+Epg-sy8hQ==5VU?=HIO#gUecI1w}+iiszqZ(B7{36N&#&Z3R3a! z{PEP02h7*5O?qyWTi)o$I2!_taas#^UuB? z8L<~luk6W~?vwo8*~)SIx%#W$fA_xap2dvZZ$7&z@3*r@xN6qbN1`NeBe+E<>cfT#!&xa@CmJq(Vk&iWk4bf z39a?@*%28Fp?Hfztq%@B0>n~lgYMY33uCDepg>*G)G!e992{C7a(@?MM9P)rj;NM} z(RM(m?v6@=5Cr+e?k=!rWpm_yksBDm?ZJiU@IXu)N-bOkeKf4WXz7kzY> zm5?@|OTLmECn+h(LV>%dYVKq_oB4TaGuZ;cb7vF`D!UeaJzOea`-UfuSIy3@`I`Ce z?Ae!=pF4K7+*L4=$z4>s@U+0PzV^EdXUn?Ocm6W3&AKu6 zLwuE3tN8+hmA_W&Tnn6S=fNc*df_!mgCOf66=F#1{wV+;wvt@J(D2-`&3JH%&HFK< zV21zg?^}WdyhR+Uo`0b%f-)REv^htcqoW7n7pD6Gm!6U|8H6Gr8HbhGtoc{*Xdqjt z!A~i)H`373szp_QEui1y*xbfvXb?Ln*Fr}g@Q7hpfjxfU4XVl70`z!wWu=LqvZ6?8 z;IQq5m$&vEzX+hLc?R?qJ4FhjZwv=#|)s9y!aZV9+Sqyi-hZZRkdXv`uxjpr{Lm6MfF<|E8v zA)s;VAKE4a_&zQrWxanHqQT3u1JfDHA{{O`g!CGvHgLD_wqnWdBcV0UXWTtMDPlUw z@l~ch*W&#Q<$uJ@XUZe-Szj#ZU5v_EZT9TB1Nd~+09JBK{G)$e^-V)M-L>ZEK>rEj z{gt+%$&E+X2eS$@Z+Li^)I7Y|>+QC-$e!(8Q**m>aUn!+C>uB{x?!c@=C4IMZy1D5 zrg0sh$13yac?uhz#N27drAzGbJct@G-Y&P*;A~#}xBhpSqT(v!fY~8~1+@Qa1=Ro$(>J_Som9;@vCC=dKPapS3Zh zML4dlYw|R%g>JnAAGSD}SO1P;yLXE{ih6JGd-3{xtU=?UA&0fs4o!DBu-x9xv@kF$ zZgbF~(cw*KBfphRfN(+e*T3YBhG&@EFdi)DLP^Taz@>_ASEh8e4e1J|Y7YQ%0;Lp} zsa6{v9_C^|_uh9`Rj~wlo9Y9qWN;UgSxYnQ0O!|$9ovlp2eZ6B+ZIEh@e{LkL}nb* zJkqctNtYLR?D!~GMm0Ud#5t=wAxI`WHuE|KMJ~WPIhSUCAi+3iK$T=$nAfQSB7z!f zfak{>6by%FM?y@u2G-?{vtb4h?kFlTXIUhU?&i_4Pp|f^S@nK|uW!UlTTIx*L}AjT zP;UMwjx9I7=cgTIRcINg!Mb0;!KAP$m`D4=RhR>fIhmWpnW~;}lcN&|-&yLFS zKKXlelDvGqweO^oB~NS27wzBk;Gp)`Dd7h1ckej@xrbz?sfV2rSHkYzsvK_K2#xc) z8jHtX=lIF%JO5F*HbMCxKBsLbAB(RT7O*vJOqyP@CvBIB*853zt*bW2=8n!OoM!1; zs+7zlGSA;#G3Wc6FV_nScC}YN?GQ!HPjaQxoeRhpO8S`?n#uK2`E_7xcIQWozNIT9^=Pd5hS(N!&Pvm@LRG>LT^% zmMvR)-jtU=i8Ue35U}{!VD0;V@CVLLTMJ*I@|}8 zh*9wr-a4$*F9Dlza}dMdZ(o(|KqH=*iYDCy$xv?Yd{c|0jEsnkKiNbG!zagqp1nJW zf}92}K$fA#R6H-fB|&$xZ7p}se6cr`#{^bA_+~u3=GEj?9$c2&ayJWm?5+tH89KyVJtrQdrt4726!lFIcxS~V>U4*r^tP+IuwCJ?UFnKcox@-YFemSLZLLzfc`9P1(Z zBo^@+tu2b@^5|D6f$#>f6B(-7l6T`^aecidiStQX3)tgSv+$PF zU`BxOf}G4~U7}5P0$@bm|GH!jqw^Y+s=&u0kX<5WA_h5Qb)<&IPGH(B`V75c9aus% z_jC8g*dO@)Q->jem>?{^RA>Syqe?_C{9$u8*Dyk_ol#iefpPJ^!9ga*U22e=9M>mB z3j%H0jjb(sK|XUt=>gi6po>(%NDcsdaea=yC-vo=l_xuVckkw6K!SaJ(b5SJa(ZhS zL98^lqrJUi%q;Hp0Z2;efffD1UW#^zH=mXI=h8_74iX2&1`W($XddJT?|4oZ)U6EOe{NhR*GZ`$WeKF!bTqlxy*-S%HYapVLxYPqQIgjn7F-=&&fLfs4 z%o^YkK;Kz^z%2|I{k<3$?e4e$6zaHZ-_j0a!Vdk8IT%&Y;&b-SJVJ~9@H7(xf1}K! z0vqNTkvp#_mLWCh13lw`3P<~&C%;<*p_Gn--((utH|aMEvx)biu`-I^65h5+u=<%y z|4b!9gGF1LiFP75A0eA*{mLn~vFC zxTs~_!oz75Jw3^m;TqUbF15$EX2X{NiOmxVYd08vv^5~U;l1yGhzFGeFLX4@dpU)> zF(#U8BKT|+<16q9J32Z%mg-nSWky38kP-UeA$I;GnfJf{9=p14RU)mHC%73A4?6!N zwLi*XE<$)WL^kwLgCmFt!2I74@LAEg!!gL}@D1n#tmg^kOqSD%u`A6hnBAT@li(8| zL@iU}3&2gLL0iQ+c(9JxIy4!>bF{6Yex$3bYl_&ccdw^mNe(bJXcVUzyR=i1LP{r# z3hbdr2eAJIL?UjUp4At=d0*l#@ML%gy*|y9PP67I*ul_MHP)W4zrsk}f8R>)(9)km z+^%9=vo{PGD=L1r?Y?4?6ryhOXWrT@KFeN)$TEj_S_KsN@YOMDtBB{M%kaLFum?p9 z6m0Bc<9(>O1o#YeJa;}^00hIV>@?#JK{PJ-X{(IK#|WWu8t68Ix}V|ZdEn2YDT()* zj##%kjl|?I&6w{RB>8um8m-*po8}VFi9xZS}m~hg1Et^=;Q@h2=zi& z=9bI4uZr`&KJ%aO=k;fYcTa=9S};8;+5SI$zN}IEv`yW>CP+Q&g6BR)wv7BWiNz~# zl(uV+D1>O-R(qGdUi@ab_UZ=xn}d-GDd{(!uv3Fa&EJ-t5vh}!F{9(v9hn7tUp6S+ z6w)z&6~9PdI?g$Fim-zCg0=2coTHV>-}ByvF4AGOZ~E%K(SnXS4MS7pIQg%S{gWmU zECmp!7q<5iEU0q#tN`@b@GAD9pES+Ey za_*cA#IF$`2?!D=83`ENT>#awlo>d!I28)O%Skyw$_n~C;9bZegmxAMkBt)WFwXI( z+NwPwYwcgZXi@K(1zRO((>jFo^6;l6cLRuEYK;Df`~m1m>Ym;wm!t87Xo|r*pircq z|KV(dmeB*d4Gq`t8g9@Okku1Cc_|2@alhXqU$@`?y^YjdXs!zPiu(y2a+Mt}qB9nr;sX&ENI;7&c^AzG$4faObP)_Oy9A0X@s1e@=}* z>-qZ7{eN@Q?;JGL7#QOnUAC~w)o%JZ{UYp8vwH0*B6=b9&pOS9pigYXCihQA&7b{v z|3NqSxRxt_b@+xKP@k_ZzpTjNUx5lt4`|))8EO{v*|ErWO5hshS-2lk20;Lm9L z7`lus$J|pE-?Kqjf*GTB-|cYODXKQ}^Ybgv4WSeX+%Z0VsY!eq1b>{wM!hOS2vZ8s zOvFD@-46^K(cr+m_#NIXb|XMf<*4?>oCKCGtPE+ zXZQdh3-C2^34{$6nEWXi%6#_h8T}NvYJ?{yI=G}3#;T2I|0zi@sXOYnf_hlSp|MO7y{r!GE*Ep~9 zI?rrp7fTMvs}@H;S&G$mKE^g(U(1KP^@0-kh_?~$!;%*<+Yf8M{ zo?oW9J8W-wlWP8tNx{y1Ji0$F-ZkU8r^se2p=$l4;+D<(9IL7vTfval=!bvQT67`| zH@RCLIy5Uv#vbbVR~U?8fh$igT^kS1z96YTIvBtx>Q_;$yxr`4N+#Q@yj|(C^i-sN ztCa@xL>6MuAWAC~=n+8Kjl2Y@hLxx*^YijR7K8%*(?%9SGtCAK@D%75p!10McbLqQ zwzzN;7Y0X__jN}^o%nOXZUhP){0r9*0|(o$8S7Er1pno^WHNtt)A(sCtm4sL-( ziQ3cKD)4d$mL9>HL5gF3ZjGnu8)Ogx$aEDUQE7s?D~>}91EmMApk!BCT6&Km6{zn?)H&;v* zzPQwz@8^n?ph*kUUH-fr

TjnfiRIM#0CUa@S96T)5<5FW*A<0_EyCotaa<k@G zGnHn99}u(qjGhJz3Zh9@&7T(2pwhQD8uixBua7iARh{Qt#MrYHi5_~)7r>o>VZ##) zZ_w}pZMcs0he(0RKYzjq6(!02K?`axP>a}Q4#x|HX+*}9;j^>nWhkL4r`1U$$8MOHB9I6V>H^uHJb5zD)TvZ@ z;vZn@W#udjMvvWmjFeupi;Kt{jtf>)}I>ed}Q6lc!l0)g!r5+b>nU@Yc} zx)dD(+qu|V-PjrD5ejD{S%o|rT)AQBb$ZJB*PPb^m!#B``7eGaHaxb(w!_s_>5Pz` zb!mz1kD6rj&?2OtV|Bky(7P2V&u;kW)RM2IuF|gZa6FKwsq9ag)1>jzLc6`L)jN#j zV|W(tA5s87R&_6A61=d23r6)r<#;yq^~q*r-8tsCwC=c7>YRD%c58kZNiFda6_8Q7 zzDH8Sr=v#omwv2S2;8F@dt)z0o6X$$z2!J;(k`@YN;Xtwn91q!N2@+Kth|kx`*?@Q zjdbs%Jnzm=_l2bvAK-S;R&Y+wF#M>lpJ7+?y;kP(zR?1hO4X2HwgOxkX-DiFZ{9iCv*KBiMF@5mNM!MeU|*;x>CBhFpwS@ zzqHO2y-n_*OlYTHP9A%%l2Q@Hd7V=!%Vbq1X1ip^jc$o4buEm~I!E293ftglWp?Va zq!=tihzW8^``a{DaG5a=7yu|So5TQ`)9y7eTxDtu+uOs*x&G5Zt0XHIcxRF@8n{a( zlT8!15#t~QV$OXWLA4%> zJ!BR)EHz_BT=r7GP3zZxSUs$kYM`vB$ibjZL@L&xX>p`(WpPhciupbdi=nTdecMc@ zVY*Y5S?ta;HUHSFS92ca=w4rO%B@7d^towN;4j|~JEK-#*lW{Pv+T~-Bk3(sCQU2M zceZq$sPmP2ddB1$)1y`_K0By(WOixLJ;drbY+Y>_D3{s%cR*B1s-xj_ZCR%KfaUF> zUAp!UyAAHxFRXm9%IIrufUL*eC_pF0zcU^WdVRaZ-o&VX_F_uS*s$TrzE0S2rQO(D zxJrCc;_UTvU>1GxceB}IozD&9`qC$-$bZyqunrQ85MVP%Qs+DOnZ2^Q?w-v!+ovH< z&vW;xKj!p)d{S6`<@d|N?0G(eyI;jOg-&*zA;He3cxS>D9 zD>r1a&A8#J-=hL@|lkB&N}vGbL!}3FSn>K&1=g0-Qq5;vt5RL-Cebw zE0LQn7-3s8JiXcGI7xU)F^N>L1^J)VP0x@kDr9#INmX zQ!(s)Lclj<|M@)H z(8k93ma=)KIklgFtN*DE0O9Bv&^OJXF@J|Lh3YsYaZ<>aP+3myF?aO^J5@q;1^HR@*SJ> zdPBN+9uH0WCfmKJ<&}iB^KBGb9q;aPO?Op%5Ohl?FaK-(w?|J_H(gz}?#a%=^zKpZ zvz4#DOdYN3Jc+_^OLIs3;Os$FeAEwjzf2X|ahPEc+48fkYj}O!8%ytV!5uk&e6LC0 z$q(qm2lP5K&M`oOY_QGP?dMUMmYnC9{J7yCa=>;Drl-L+J`2-m0WJ;bmiswOci zaaIdQMrN{)4RAQRf8Yrk`6V9AY_(X`$7S*6t^BdW&L4l?cqAPtyX?-8bm89Lp|Q5F zw+yI#&|xncs53umtnlR8B=)|CwWlMDTFvh`?{If$)Dg>8U)bZL;@hR{Hn;k_PV9;- zw^+V!(21AywBkF4H7x1(=WKYWm|8{S69{<*i%15ih ziKj$Ea^QUXqu3}O_iw1|h+Tpgy`r^jmO}CRyNyP`In7HuZ2#fa@N z-yTi+`5m{!c!&&efCT}3fkTNys(QqnSTp%pGjjZ1^b9ST-~q2GOhtjlQMSGAdS01K zSD}mpFSvhX`)du==A}=X`h$D* zYVX^Q!;`A3=kuP-%DThBXnVWb;n~~guLT*-yXRM{no$DvP&Csq_VmSA<8kPG;NhtCJtFB$G_h#&>i>)<9FZgS}{dt0ytf00!V8m(B z&)1vInt4~4+*v*Ij&#UJg|*|4V^8cotzG#jW_rP}%W6l%v4?g1TWTt=a+TVqd+^4s z;T7;}&D-;~fFw*K-X0Mv_y79RDE59!``x&YNN%1WQG;`6y#pE$FKzGYXF(n=1Zz52 zyXn2Fz;a(!x{3M}Xn1eh3wmcZDiqQV|M?-Pcj5^a%8YmJ+<9aV4#Y~pyXbd~%}f#{ z0afq(@^CKLUB@A(nelZv2RvG=vdYfc{K(>1JC8;BN({fCSLgrj^0aWRJ%B{0FebeP za4e|VePHUOD_dHUTKD`pt6fUt#m>t5@4kwPiU=V^H8tY2Bm-g@nFARnSfota8p59D zBRwl%qtS(-4fpT0F+;vSjsB9odVDx(v-&YPp63 z(GyGec{rbzwHvvb?VuXl*iftlcV)(n75%TjsK=P{`m3*6C3b}`KXB6Tjt`{~&2J;5 z``+G5Z5to6=?~Z|q`QB2$elv}B>P%Ua#`eht9v-8mVZuY_g0;1IIX)R(S>p$|HyCcLw|OL-Y7e!*>m=c zQ{-(_%)EM%OV+GW?ekQVwiT5VZ~txqnuRgZEy3lAmpUD$TCmfkic9 z^8-k_^1*$YP_q=koQAeoy`S)a4#Bdz$8scu8rPr+3BmZu8LT`ad7d+?bqKf|=Cdxr zLJqBjii%00{QY}Cvbh+J1_axs9sk;BWH?RkZ0g})%)Y7KB8oKT$3&Gv8&sgYgp(m$ z>yUnL=a{|g#W>sI+OSEFyt933v(~OXRaKd!|Fib=>&_wDnj2;7ERucao|2VhAd87N z>35tiTsL~ux-76_cyZu?sf_y2<}YUX>CAIB{+PIW_I+5ob-Sq3f!40(6OpYCT}Eog zK#pK{bYCcb8qwb3ZbVgepG7psf!_nS(khd4tUmOdKi|R#26Q<$qc$OMDT?)X_fjky z^?S>gg_>#7*k(fx>bW9}tuaJ+zm=t#%k)|W{YR8Dm6){vG9`?Z%|c9; zz36x6M-%fc7rpdkTO3pOL-U*j!(PRiI3-<7No)U-t${KC8&(_cmhFHnIJ!vjrH6b{ z)7jT0_0a|p@Fc+P)Aby&>uy9S$kkwB{17+_~B%s!X}Edo@uPpYjF`86n@ zNT4-c@O$HnSij}v zgKgiaxz7L}q8cU!?J~4Xu zg5n}|!N&tq8g@4$teckzWEnD)vVIqgWu(21y%)8&_T_ZOzM)qo>;n!{Sf&18-nahP z;pgeyQmVTOz7GX{TGZcOEAwTM2KLZql?LRs#SV+~NqP5CL9V#+SWlP0WzE6SpWF0X zpT5lX-8po{D^^SPic(J@2_=v2EsfvLN5#HmC5F&;8`dlLwn0ty?B@oNYAMdEjc3_yS*jE9;9GNdO!EZOGXh z(%avNpISO>zNP#j$H6icH;;(@Q8`pNz%c01;xE|cbUXNEwY_36^JCJP4^dCuV-{6R zW?WUe)oSF`+jrq-d9!xQ(s#Faop|d_RO(=kn;Tr2x{L?_H(g z%!()B3Baszlc(#QFa)pX=w|gYl5zn`z;iU1HK&akh;6`J;cAz|J=eb_D*UT#U^<^aUV3WU; zey_ll%>h-dwQn>#Zlu?@^r+ulv+2aDYg0=kyDl{^ZMma;xv6qYBrNjqac+mb4e1K4ybR1K*WdjXuJZPROJ($oM}8WjY~#ZTH9fJHuRAs+sx!9Q zFSGaeUxFMIim4iyHnyE*iVCVx*Hzy*#d~7~i3fANVr&3v#jSFM;0}XPliAcfzG2!f ziEDd}n-zK3A<#OIr(ewb*=AY)&)Q9qlc$zL#)B>kxs`w+w53d*qYp;R^-#xwbc9QpCR6n#_@;#CgBev4 zWpx`{NA(ykH~)M^J0LdOQmT*K?woduW6Q>wGnbZRRq7!E?%UJGSiQQ>E($WyTpx>B zfFvT`{zJR>n3@OjhZ|d6KfBQr#ZrhIPs(1Wj3Ny+HA$!ddG?%k%w6ZlxxeSutF_vp z*4x-WH3X|p9qQejt{iYlElK*?l@Y0gkH4-%$jqWfq}JtuQpxLt#+KD41D97{XuYU5 zbLLdk+`@;0HonQpa}S+`f+qKm_-W}c=Zl^)OIHt^iqGIF-2FB3B_Ao_pu8-cP+3V?qYi^tLOw~qibZx3v}D61g0{V_tj^R} z@}0pboA#n0mj2|~_xC~FGt(kC4GkdHU;fTP8QTqHoC!k}xeJ{wY56Cdp-@eh%=)AK z)|oe=kHC+9#-aYUBe3#7*W|HNHmWxf~BeDfo6mMXry? z;)jXqa(x!dTICJwxb%z@9puG|E8Dv=2Mbr#)fdM&ZTWnzp(JYUs#QivWay%*91Kpq z*qE(!UdKIds!vuF?EqnwlgtW`a_*dU6%x!h3yBZ_#ubLWD9}LNRauq&sFGqDj@a+8NiChk$w^~YWZr78`Ncp6 zMPZvP1v-k0;p}iXY?hM-4<_)e#D(d-*=V05AK0;w=qH&s)>F1@md|8MjB?f#-E~Ut zyN{d?2dA~5w|MH~fR|s{R_)2)i7_1qyZcJvw1`ue+2?r=DKFNo5!LbN{8PAZaOX4t zUpFf@M3vilbS&O=uvt|4!}@dwt4Y7@ZyJHtT}JES5O0l_xe%7JSVWaH>qDV=1o^tu zgvE4RjkkFN2_TIyp;aM)S&+yAv3&8QNt2*0)ByMh45P)gc?5a5sZb39AQ>SYYN`di z=qS(vBxSROW8^LXx)#>DZZ~f|A&(6TS{KHOCyNhe#C;bv0w}dpNR9;rooe>OhlkA^ z{Kc{Lhu6U31PY4G%H-U7m$8+e!+Ay#U-Uw5&gq%ODU(Zs-^oO4Tl$T?Dlci(k15#o z=_$wQrge>;Ba{1s(!DdA{14|Hk+kzuRB2EW4P3|u96Wc*#_c-pG0sfK8{gNycR%lZ zyH5$R_M)C2a(f&*hUoFK*TPbiMFK;8F=Frp`*ZD9kSH;dJBvLckUhBJy2v7qK}T*i z&N$w14WyDWp2ODaNz!sB70Jny1@(ktcAh+SinPsKp|3GBDj%z`)StpUs!cA=g`62V z4U0esMpWWt&_}@Vx4f`R$kq_}7rMz6SW&96jOfSIp5fd>+t8Ml$2)@aH03nk)XKR@ zRr~4G<|aN2e#I4R^TWU-noY=kzqV%F%@l6WUExr>=iA*#DWT-(K$Y2W0TZoNvDKK*KC zqksajqfKYQ=iF_#DLDK%K|LgS0FEe<89Rd}+1U9h`xmAq&To2mVbgcJPqb$czMSfX#R#oBj1jCy#nfNV#q0ms5u&1~Pi+L&{yu&i%eB^$<>xS1b} zC)7t!QFci{wxFS-LzTs|Q(!7&4q9X*IFh;vIl2>0iEm8ufjA(UHw42=v6F!H0qlyd z%yhlFEGP>2nF}a$GaXYenw~qnc5}2^O7h%DUg5m^%F%d|#l(Prtp@jXe zWD*$>L9%lvPpNGR<-i$anypAlRhK&ZA!Mj4e@-6r%y-eMi{FJaa=&*fr0n3dHn6gD zIIi5snaFEkHC-e3bf$Pr*h|&%TzM`f(T*&W561Z)Ogqv(zAK^QI zC9P{lFe#N|h=Kk8^Uq&|J#)pTuHUzV^qAFrU!m^8Smg-33)<#weE%C$jYe8s&+$sa zS#qq#)5_~9m89_Q=r7n9P$6K)#BlSYeTLtCj2k5&_e|pVa0U=PI1WGBdDxkSOlte$jqkm& z2|H&)27|N|BO@d6_9L{gUP+1_*v|n>BDgCW(iNm??Ryd@jliyyC5atTYkFsOJe@3` z9jO(0hi{X)%c*CZYnv@TJaQ9}7F{_{<)(Pm{ABlyKl7Xo6=E8mFRKf=vj3@2^k*^4 z-5U<(N{Y5ZteIimKwaI~xVRVpcqs3FJlNLw z>OU?(SC=JPE8OpmKa_31K@4*8f&~j8QqX$v3!3suNTy<_8+P%esXrKJ$59KwtYNG= z0CG@I!7Wy>Az*&LnAIGXb)^VvDOlWoz~TffI! zN4G_%SB7zg8{4jISZ?HMU^ONBGu!-+{w6Q@gA*S*3QM-oRxWL2kO1qkW5@6g!Xgr5 z8jEoljZ$rB(fm@4G-9owWhybBs;Vp}syE|wY)h9^gxdS|wX7x97S>@6VC+5R>qktr zMP<)CISYCCy251-cYmT~*7^b>fs!yYG<=NB?Dp@jE0Bi1RS|>(U3Tx@+{+PWtQ9ci z!^z2+p*PP`q!Fvn5FpKT6>f))zyyD~nlnK{?vB9o%V~Ogleas&*xJSp?^U(+>phdh zxHqd~x#SbmcUxnv$L{Wk5Oa95^=?OwLTda1r>$JFH{!CZrpJ^DkHyWhe&evJ>q^v# zoRAYT!S5^`qUT;Tyw>W4R*3WsAtvJtUKm{l)$=RX+e3mAgk34nN@|@7$-M6PR^!+*$hUzmAI~1L0$hD6E@!Q| zD7WQan!JwA46-kSu0v%(z+sR}VxJ>eqTD795*6nXcnX_U^kl~{qXb`jBJ0JhSoJJ|HH`d(Un+f;AfwNu82t=df^lAH6i!UXd{gG z$~0tYz>q9l(yovB2{ICNBiX=E7NqJ|;&`r>GE~L=8izb3ewE$L+Fb06E)WsUhG%0)oYyOgm-`Tl~IYC`aV8iY5&Fp%BrbD!y1{`*z3qq^tOGYcyNJ13;**g z@B3C;Nk+f3IxQB_#-U_t5u1BoP{hWjb$LqbQRlR)l4m~aEQ{RyZrSPY-#T)XykGy# z*?Qxu`|^e2ZVe4MW286Kh#+c+EP!^?*hb;h=yq&$Ne2B zj@PWKSF#J!Fxrm?NRWBMMu&J^P;0;h|IC&$ELDJ=dK5$h#tFU|N1;Yk@v(jQTX|uyt#Vn4k9vOZe zN3pinPV()v z1t&V1udKe*v1N|1<@JkpMI{GU#+KZ=dNwB{WTAJ&-aXze!MBETH1^)SI^|wzN0(K| zp}RaSIwimSueSO%zZ8MgKR0QWe+wE9Kx7e&HM1;yeJ*msqKlgSv4l%>6drUyC}_*d ziPXLjdqg0{VVY)w)MkctBM1|oLSIH0ce+$3WHQD_e+B89t*|+$1J!+$Z6vk>aZ^pO z^+?o0dUZN&rK7NYid7wXTxPHKkLj``xeb=KGu|sgE0Y%+UFhr5eM&;{YX2v>VaVd= zduuZE#Zr>LCB9_Xq%y4DU$a%|*zm2!`HhS9N6Goa;TpN{j{#>N}Ge&m?S9MP<{iTeoUr!cy1~9M!hi@nE1MY6M@GyjdM&hohhU5A4Z1^ za?weL-kRW}GZ+Yv{#}>&91$2%W$=N&O)kJc79Z+D*g1jQP2x&8rMxpBfbTd^i~%3k zd%{$U;Qs&-YGJ(i9Im((e{+LpG!Ng7|2VjG$&z|--bsNO3r5f~nO!h8xXTo4&lgrRCOg+xJJm zKUE!C`dnq6u#$xsmsx^i(6+w?=SB0Jp3ktZci$CrIQiucFa{u{%83PusrcHg7!bZ9 zQee-XJw2b@(`n6pZ$0bU-=V)o+6a&(`#0^3B}KlgOAa1|kTk8-Lh( zJ597WjB>ULt6r$n_#o}u+-YSKrd7A(x#ds$PhT5LzWz-;RPu1ddy(JagfD5g{lE0R z`K1sMYa60>yFg2BuTxLYY0uxE_xSvLms@#pB%UKuA#Ws~-D02g^X!{E_r$XMK3wz9 z=2Gd^oz~(Z=Jnyqmh2e$PtZ(-A`>YnlSLM;u<^E=J&t!EOY;=@J`+MHj!!OAn9%x( zNKA%Gk+ifBW||J{8~qE*095}r2|T%A8He^_(y;2+QAYAb%F3pZFT(nZQ6G{vJY+d3 z(Lqp1Q18q)m=KnVIr$%fbMbZ5U5HrKVFLPt46w}0VBbl$*>u)lz5q~;$up?XA*s78 z9o&360rf%#^VsFfm;b$t)~y;5`v=!IdM#MAXa$MF-m=r6LJXi#F*;e2p??QnJ53Bg zo*)&Lf*qH&=49V@6!f!YCV$R+`vszz*T5~YMqN?@DyulQ=V&SmMQqkXX|@`ymKAB~ z?2H77o_eddk6Dvh4l#gVC?b8@Dh=^Z>CZN+8!M(_dowuwvRe@-P*t#DLOje{a~iw* z#6paYcX(#&6V7LhkWC`>Q0}}A&1zOqjp?t3rf4**9w8|kDIH?!`rS)s`>Tsb09lhL zFr_Ci>`R|8OG?w~8^p>AgF(wA6LoL9fNw7RLFO3Ze9uL=uq$_fxI zB+WYoMa7b+Bs=VK)6w(CsODdVss*6|7bM?Mcmm_?rd%NlB*SU@u+W=%gTWw)V61mR zR>SJwRCdgPFDq7A^AUvm_He>A;Y2`z0;eV<+?x{k0{4u33n!VOs z)0YP3?(8xjj&uta9LvhupQNHsVtkKfuxE{Q9TyrpiQJt~Lx9UgEg#sPC(yeSLllTr z0~(+$WlGf%kcAbMwMse%KNIw&#T6C&sN6%)q9YB5sTwzxgfc2Y1^@y;v#8HCOXX`Ve_=( zeZum_iUur8t+2Ph^t`>l7_gOR=ZCpirKERd-v?RR561k2YhSY1W?D+hke#*G`dtejbW5uh^}w@4pL z!QPM(`CH-PlS|US6>J+9dlh|@2@5bzCcCLUKd!QVMp06;P2}OMN?}fUsq|5)y7$IDs(r zGC6GLAWR;?_6}7$EU@ux%2U|jefk@%8Vmhx`nDkcE{6R!wis#QJW&we_FQ>0PIn24 z+k{iKtZU1r3;PtbmQ`uCYX7CrNSqw3ryU~;7ip7U{(Y~tO|ce&`>*x@j8j>x#5Vyr zlQ3J6C`(``Vgvz5To18X(nRVufP-KGqhh5y3UMy& zyqv?Njnd&<=ZXV(5k?w7iq#%y;M=0Ff+pqEB*kj-?P$Y!v46PxZ*_o^e-9V*3^L*2 zC3vPi6pQYSz)CjcA6n>iLGBnl*)>t=;II5GeWrqi3 z#5fAZJx6MlR&2~MUY+pOY-5u0F0Wf#W6E`Fntp5#|Ee&s{CRF^?(xMgu&s-9*zF-7 zrOuPHUaHe-^?IK0H5cOkjtT}sNoLFTf(5?=^<`wPT>2a6eAX|SX(}MzaYIa7xcfxe?W~d z3VT3>0~;|lH%61=IWp+E@SI?KDDt@?^ypCP?j6a)o->*Eq7`<_S+neWOUss*=Txw_ zAN=_7<2EUUJ2POFghiS+U7^N@QXtF>nRuasobL!F^XAVd2Zj(|7Q$0?84Vt3h?1Hz zT+qlK3;Nt7w}d572sW)Czs@zx!jjjaiBmA>;U>kLty{^P6WUE8@whL(_^O~!67jhQ z<+fV~FICWKa$w@eT)TD}@a&z@D(HPIk#acbz1THgJs$ij>f zJUgrMjmAUHpjAQ$EEp0GPWsz%Cl(`TW*;qhf}{>5^-Sj{>{Tkp_P@P`8?d(iXf)dN z4PZ-HzJoC2uyZ9|Jx--%j@PyXX?pC&{R8kUq!lZaP9y>hJ`IC`whWu$Bqa#k4~2lx zX0!esQu<0&L|p(dN?u0vd+i_Wl-CW1?}pYQe;x)Byb(}DWQF7x?(_yzu0+BQ56M$v z(Qf7cd8xU%%dz%>K{?af=PDW?6n#{Z60c!T>&vb4aTjmEyJF7{q4qRzhFyV1;O=ts z@$rrIdJ?dN`2kHT=YD7}K$s$1Hd1WD&{#z`)U*>x%rf0^ssHcyc1-KA6h2fTE^vWE z6hp)X8%_8#iNc_Wa&>d#1^z(`u-Mcg%fEH&LQ(bO!-k=EOr}$-IC@+m|HdHT_-xt!)wy7v7Eqz*6w$f+9Kl$)2 z>tud34Wu4ZrK0-_vH-NY4cWhh58m76&me=6GiR6|yu*E}P?*BCE(A+V1-~=F(_}fd zeSMS=GQZXi?!$OBFoqL>MO7+Jvpn#2>V_#s;NFWuqIw$)HA4}0r|hA6Ha|bVlA8{l z!XZC^hQxaS!h=vr7Nz*=qz>`t&mXe6+gms~OZTkmVh?>KOGpc&VPgZ68XJ7q!AxPo z#Z=4eMsX-`x3>4U#4tIy{qH49Jw_RUf3SFhI@o;T)-APAfjR{Z4f2iv|5J;?aMsmY z=*PapiYao6+tLfBA4wvMw&yW%z!9t)8bt0b0wRjKsd{<*&rRrDNcI{yX{5Ql5EX5M zNL-|Xh68THjmm3U?%!@CMqr8cEv$W6rq@$&E$}KylNtU!q!fsTnC>hjJ}~Gpa&)}f zwk9nYpH+bd`M6ksS5?4W#y?^mb!Ba$8u2C3+18`i(0Jc;3a<-Wt@OH} zdnIxA?H=@qYD7UoXt|C$kLewDJZ*E%e3~X<7A~)*w%P}A-wI&zK7d-7d&v(Z-@J(% zlsbCKnDr@4=RnI2wGk{q=mG-}NO3CECzmJ0!Kc8}3HGzJjA^q;lf(D^{0F*R323Ie zQC&lI4a?E0bcfZn^!?j_Z=v=j-tMJ>2>R(S6Uf{GGk+-3iNsI%dWa%cL3>@lE~86h zb77z~CMVDE^=T$_>Z|g0I!Gy-ZeM#Vf9!Ow%~f1t@5p#(>vQ{Q?f4(eqK5WT8Ym5*r&EJw97o)WH*3a9(lu0DMLYU&!7#ZuG|uPFj5UKxlW&d?L(AMT4A5 zP>$^U!H?$;y~73|MG}vXnI__Cu`xh-c-g-M+uLZrkXYFE@yoAVFZ`pk+o`il2VbSDH=2VT_~WCwh!dFd~8ra<5e2; zly{~3>C4%e6Ve0`1Y;nV#>uQ-m%0|~*)Fg`Zz$HLO>-1Sq#}WjyX%JxqLgkDAb^uK9~S3%urW>q0bERMDv8Fg zYUT_TSoQYj*PLTmC?Wn9$>O8;GnoxP&xF_pBe*#*lP75 z#U{ZR`<&cd1s$D@J}1mopt(qi37ri2aNh8nAt3=#(5aASkjM`;Jr2^I1X?$7#C*M_ zPVjh{&|=sV@@3y5OmGPrzywS*etDudj_Og&hF~+C_S9p=%xZ0lT=V@?;2(j}2`bxN zqaJkR6sqSU5|f!dNRu!>XYAOq1A8~q5w>wvSNQm7UDXdz)jivf6W!V^zv~sQ4M}#P z#6cT18FqRUq>op<>`pjxgpCk2f?Ih*mP^`E6JV)B<*&z5mJX8_K^}1LpyDT&Y;==52*p@*}t+%>D>Ag0&Mj(!-k9k(5>5d)L4Mg z>7@s{8TeM+Jw1Z|VwEpq6|i=sLXmjpbOK0`%*am<_Lgz$f1Z1>l@=ROct7xxjakHU zD}bB_FwqgmRt!-{Mjjf=NUiIw<1zb+71!Lt34+&DWX~#`;?;QbC@%?a&z2QxKLV^8 zcUM|9*6h~6RXsoc6DLkUt1x!`FBV%$Vbmha&6ZS^K>2x|I7g%^4(V>n2;dyv0LOrNAMg3?=WZ7O;50a;kNr9K44vx!8gwUe zF{Y&F^k3Y*PvE&q+A zzW-wMxDOtlvPnc9qNh(m)|i>KH(v0YU;pXfiZfX>r2s3xJ}i>y$Ro^_#I z$KTY=8!iTLH*O+nwCugI1tYzy#j)^Ofy*-4ew4ohD%aFQz_e*+pFQgi8DYeX{w@?b z1D}TeWMK}ECb6YkJ{Z^q8Gqqse(2B(m5`LYf$xUOy83gx@umK2<0F%(dBSsg@8uY) zY6~=rnra#J{BAndVsyHwqFENWL`quPq;*<51$W#+k`w-7JUYMu#v0|}@`8jhsbtAp=(8!7|(f4@&>o$tK! ztn>YfBx<0E^Y2%(z9=!xAoU^`ukZ@ym!3arG?9yzD^zt{xW#skk0i_*(Ky-{UN(&< zqBV|~;^M^{?zF;OZw9*dXZTW7>}6fOGXaf(7R~_ zpoIdhZ7+%wO7-@SL4Tft`U7x29U=N-6G)i?Y%w0F*uMbU%!CsN8iu-^Mx)A{IW$SEy0b|e=U^ow`?nb=;N9M(u*kT`lcQ5{zwdbH zFFE{Y4qCFotN_;ew$g(pA`Nx{E1^-sUPm$Fe|=ZiDRiL<%E~;%XNq5CZ)0J>U`XjF z&OeM@q7^5_kLU*sUB~Okp63$MchHRtGfmzVFqi?XkScTR38r`5Vnz3LLZKGL;iqh zV;A~{J_LtR5#R*yOBD6}XE3J0h$Iu(pvN+$Y8T7{F$Z}2S&|381%kZXkO{1O88Gpt zH6gc;0R#_ZC8*UxqJ+*({rB&j5Ro8!3lJ8*vcw;+LA+~Tb@_lZD2%c6NX|F3-;a-l z6_mAA8zJSmt~0%5(Y$#@fCCAF#VX#e;Y0Lft37F8isM^#f5*Ci5nbXVxQMc)v9(n!xJ z0E5AYJ3nV5I|?}L=n)kPgGuIsRU8;BFg)}Vt6!iCAdU~VO0h1cfHIB-H1Q_JiQ30+ zpCLd74KRU{VUJkR%cll?34;Ne$kElTU#PVX<~*ozAUEw3v3_m5E;)HYknm`m@T13% z6?JrSHuKq7mh=H*p`Q*A=k1^aS|&17r!ae}E@>BO!hU^}X+E+v%=8)r<6Kb$gkgsc zWw&&5eLVv+GvG+>BkGV{2O7HXUr0L+nd#^kTk$cd*g&2OL4+P zru5hS2M>&4ghJ_(QsapJ+P~AoCQkk;2X8nc69cw&b7` z+fWSn0M2z{n6}|LvJSg(P%`R%0)BC7X?O&rmF6uV^&$(&(@jQ}C;Rc#ei=u8*^Z|J zmrS)mt50w$41`2BW69E`5Ysq8tJ@UbS1(5i=Zr>;?0K9jSrA}4x?9Q`Xr%r%*bkmQ zdBTS9O;VllOc6A6AQh}cD51K%N{0~)vMLiJS#*2C@yl&yL9f3QQ~^N=iL@*|Bs%A< zTaRNL=GJAt{}AF0g>jTeOt3ca0A6xI6^+C}QTdhv97jU0lEnFJ1O;27a5lJU=;BO3 z+gcbXh7^kmde{3DOOAizB}`E?5vVCF;LSnu7aZ>=z$#33RO_MOWIXyCJ$4)3h4^ViQInUqH-@!*C&e{sI3^U|CxONq2Mep#_{&N6 zaM_RuC!_AI9;!uFrKKo@%->XC zyI{QuBQD8;!Nw_QOPa0FF96}sfWsLcTmK|zE`cN>QENW}1saHq7MGNmxcaf0e7Jf+ z*BNCY=)fQ#(q;t3sY2uDA@DEpG?}C^$g!X8i z;=gBfhUHhSo?Vx*KGlX^GRAc$_@z~KTTcNqt-^Lb)~yk}hc=`MvO&R=|5Pn2 zDjO%R#iV9ACWk;tQP5ANt=s=k&vttrY6mXhGN47%J;Df;Jijbq-hoMSBVcTDAORD+ zVr`g65rzabE~Nes$*&ZF6FS(OK-XBu=sfN;jK^RY8d`UpB4b)TjFP8dB^+n-zo^mL z&|vAIE$i|5!DLde#H%+}7+GB%^rE&l|0{p6)!$55MqOK!Yic}r{SN40hX4pK1E5v z7*kNzXkrbO{iFE#Meu^a_{#*92SGBp;+W%2VlF7p$FVA|tn9vXT5`#O3{f}J0 z?q=d(7$>K^NBs`jNCG1v@@e8zQFrFW)<*~XW_i>V%+(EPI|X}-d5}_p(W2PS>csFi zDTV=rQHaGt_JNpj;KtF~0q&^@2FwT^#;wzAd9W90ggg3QAkjl3Nlx8{hDScXQCC$Z zi4A~{?*bQ1Je9ki7{)>$n{YVX4k)JaFWCMn7?W63N>ta5jQCf@HCus<24m~7-ac+_ zZuCye0r@}JVDcF=5W-tg(iuTz1r10I9I`wN*G8bHvX~Z)1aPy^Cy}W-Lh{ko<)=}06C*t6??IHH z0NLh>#@uvxv=7q|J_C%pdazCd3IsGYML}j}zD4;h6)&!@h4g|uMJrPm9{c?vst_~# z3j`(66+&oRWn$cB8V1$@%|y_nFsyWc&ksX5G~5*BP|J zfQt^TSCiJfn;=`z78+4kX|`Q)a2q-UGV`1O0aBh$hTk5Z7~Z`+ew|}RX6BL1Ow9_I zI{mpnT}a3o16$nU)Y08^g%uP6FlzXJCvGqh8M7*@F#)l z$px%Pf4mp&@xVXY__FZu|93o1eg{QtvWu;nVH_j`ku&iAF#9t0c`1og@C3*&a2OmT zvG`-eL&KH|7}6n_NFbE*whnv|kX?F6NjEgiqL=*@9*^7iQ|y>OJ^D=>I~Zki;jQBv z%4=#00+{L^7+49o6MQN1dO$X%Dxl)srfdGalW|eU`aN+%2_~e5z`~@1`bG>paIBk9 zV+}&G)wB2eDw6A@m=Th^pg0tHgC=d@2J|4sBX;3W;!ON58jf|d7y`Bj5HiqM&J}Z# z#Vl?*pbqjB4L9CVz&E-c`4C!l>^Q(wb0}OWr$HML?EybCy}y})hX>T91W4(;z2BBp z=@1GAP%#vp31--78OUdojEsz^YnDgUbgN?l+<0sM@L$3FC*>~1h>`NJnMa98BnR4* zLVbrqLtaB;ozG3jOqgdQPZ9UlYW&OXXX@PA`15Zy)sMMGw=UqU#EeF#E zc5sdl92Rt4ceP3Jr&r$gJJ=0n$z$_sQeR7k`ngKBrs4P4o6dv?#biW0FyI9 zRf%W?NRHWuV<+I_Hkg5hN>b3J(GAsc6Gwv!bw>#-qxkU7{tKJr9tampR;c(^4pI_L zkYJBirLyezhO8!1St467fZh1Er5>4?yPh@o<3_x#{&G9AX-@2)7rHiZ$a4dwE~gHm!)} zmk;+C!L5YJWYPx$)6##iA(Vi46eM-+r(7{BKzP1+#I3d(Z6QQu3x?{@;}Yk?m}%`Q z*e`}^Ba}*Pif9-^5v2_+t}8~RfQrT9R~j1!8Mcn8=wVFx6^<+zn2JsG;Szr^!5}gQ zIN1NS=F^e!SVe17JWTprP~p*-1Q>DK6~Ag!Wc;#cDmLUD(4-Y$^DD}_NjAXAhzST; zTM}oqFAPE)rLhAF;;cYz!O>6UT{N*TLur5})b;?fY>G|l8T)MivXTK_3kIT?lS5 zO$3ja*hrvTq9=$*PgobtLy;H<2MWhe;U7g-C?c6u=A@I(?+vs$8}4m=p_lK@L8rF; zH0EXu13Wvf3#<;Jof~UW=%{+L{C2+=!%aX14u(n*;2va=1=`x$cp~PHV5NtX7=n5I z4I~Aox7lmV`pHchK&qguYaJ48 zY{HXACV7TP^1$Y90ICpzC;+L`b)bb9l>I{SCVL5ELHh?~J0?cM1XUo7b%TSt1vCvz z*$di?F)E%JFNx$+U+;_tLk4-{zq2C@8TPm}H|;c-thZO4NFts%hHi%qGXMClVZL8}I#5gixvcQ)c;u3Slf zH+^YxN(v8}TW$tvJ^_Kl*%pgQ7eO910Yd_38cTxex}jtBI42ijp-SB^79&W^2S2n3 zXbbsDfG1(=qaX;vnt1^`4UpQt|3q1$Weh1d6f_`G{X=?uR-jBH-V3C^5O2<0 zxDbkQHg+K=%GtwISfUUGHQ;zI%36}VCjumq6Dsun!WpAyAdOLj2MvOE7N}e4PmofKDQU2y1i=3G zZrB)s*+awx5Tj_v2b`JfXdlr49sa#y9}p@0532s+W#fO>EeRUi+%3CmS1Lo9VJm&M=wTdS-=)urTp1 zXw-|JN4*Q7HAFW>=eu=&938bo08W?KZQ`HfU*OB-pxUA0q<52=#&4o zkMY%*0up@|ATQI}j3g8RO*J=8ZKjzt2*XW?=QJ2HZnfYNk&xiUvL|&2OzUqO@pUt? z#7{9DyeGN0X=!0EVUtue$%Rk59W-*pCSo`lrf&8@oYic4Vbq+fAeM~=--It zza4i-LyR2h-c1!$I{aZ4TK^k?5*-y${UOYIaJR_3hiEGxNfBs=Sa0_RBP}975i$U} z1SWSD=ou9lAsT_|>VFds{p~A1t-^?94;GqP9GYbPg3$|L9Pq|%D;Y<0?fS_c3&jX z5;WTBg#W$Y{aC1mh?rOta0tvnOHo3;-)yz{UYtc7hw@KG1mE?+AcLNnKrLRpDH-Pw z)@GEg`GHr3)x>j4(_#FrFU+dhq?ykU}SzKvJrWQpI$Z= z2IY%-oI+yj4-Nc!^TbGj>9t}PX2yetChBMDG(aJvl# zf&=qyaVY7rVBC(bPGce%ziR`II9NA6HVHrAzcXEiqXeFc!RF0Z+RkNT9pV4B3(5b7 zsy6}4dF|S`Z)`lqHrtq#DH1Z36b&1pB55#$%ws4jQBl~05GkReqB&&>sT6HfC`~d~ zNRyNX4NBkdy0hQ!`#O&Ic%FAZcJBNCzpk~;b*^)rE9u?R;RxsWwiV4mmxr!X`A-Y5 zIp~@Jx?;%aD>enw1UOHd--V1Sk_)VFKlQDC7U}2FO(7^5&kCg2^M*6djo+9#40@Nw zgoRz_`3Jsy{8;tDSEjD~ts6%pg@p%m&84q=Mol!rpZb?EBS!V=Os7CllmK_@cb@+X zSYu<{aC^0epoUAQCw}_) zk@jeJo(gqGMB$tvnNcVVS1?W|roGUibjoJ_NbuwgW;zv3T!j-8DKYY@RMAJ5{sB9f zDHZB(`N}Le2{$;{E{Qm3_w`i|Wagt@mxen3PifDX{%1zr{X=PMLceoPZS(7VtFq(c zt~fU|R~##SP*HZV?{vSUrmcg%=X!d4dawTHX>(`isY1a4*}FlqdO;>ajmCYf1L4U_uHL#M*9fykUA||(L z@HC$gYx}A!O&0x{(57JiFe<^-Oy&idss{0E0XvtEu*e1_xoC-HjFim)ISI;=x=7HB zd1X=e?@tpo7R=d9X!dNg*)!gZ1Nl=p44E*&L>$7xk00A2kD!c7%&LxA8n=(hpZ^+y zvpb4eB4g#e1oQM4FaD&^aH*f)N!hz6<~FX8hE_|b-YR==@UEZd-nfO6*VO;|pnBp= zJEg6sH+zjXYS(M=*hxbpTI%9KS+JrrX=Ndp>L#II5Qn^=WIksf4et2{*b)IOM z`S~3cQ4(-2qPi%cAhKf}*q6E|Y?x+%Dk!WY@Vg1*u18{kv;+BMI6Z#;T#rd_F3fM; z_3ZWbh&YiW)mON*xI;?1r!|~H4kJW+NE6qsTNh-jiU(foyY72Wew(kcAd)m? zIi@d#%8SppZ_e;h)z$3d@_?5*9baD5dbJzFcy*9{ZwKhqfq6ZbhaHhj?P%68cF*Ou zD_j#2)*qTTxyzCPqs*e8sh`L_p4Y8^1fem}bIhp|5>FY)ep%OldsR&N$P&5Z^K_bf zp}>jh7OL&?OAZQf7E2%mI27zAV?Sbf+V<_+UqC*yZDJME#@O{VIH~>FV}3(W-xN1E z5^iYgu96@W*8Dii0P1P{%%JA^Ex0HdO&ee`^8qRL1+^!+|x2xYWXIg zhb#ziL2hMen5F3v1c4nc4MR>=1<^|tQ?RT$bQfl-r~x3aM`raGR3yXELU^=j$r7tD zuS2REu^zB+-*f0%hJ z->mA~Jz4T@U6{M&FOB(aQ%6Y7OFBzB40pZMXHa;jK7-pw{71}`{|yPZ!y-W<24Dns#wT@%V)8i5GBe( zf*dET3QHk`r63|P2!f<`L%{JvHv;L%_nWw`D{a4hztgpNI^3J3Uy2wQ>`FUNj9;i3 zW5XzZDrR+3Qjk1Y==#x2_hjv=%0Kh-1GSBtTV!%3>V6+(Y}dp1oy5$#MfMHS0U?7C z^f(M4DgRg2>dsxdP^x;+ds|H(Rya~HV2LpAKG0=I;}XZ})ITYA?HC6Tw70bqM(QV51Ym$+&xCp zwjqq2pjAOoR#H+DCA`{y5N2(NvZU9oh2~T>^)=<$aNRJCj{0*Gz-1|zft_g{nxM0rnp_2FP8Qp69*rg6x@BHv+CdfiDWtb zVAsDbEZ!_p0O}kf$Oln3h^Atn&WC58Vyopb%(Pa2|M)-(#-U~(u_%l3p5SSB_WUj8 ztY|9+k!ofCt4B;swL137H8_}QRyTiw*N^Q^^4q2VHaKYLuG03%6iF{(dn~MR zxNCxcg&=e++bDjiUGa%^rw$(qdzTSeFddbpaFT)E3~qE2`;dB+oMviFbz|lqJo(?8 zz@=)`WN&U+dq~S%i7SQ2N+_E}w`~SX3Hc2N5YSPd4%OVBdQ~u1gjAT;gyLR<>Fjqy zJR~M*@q+vH_E9vZMUZEU?mEYvE~SYn1fme2Ft9xXU|JBnY&$CrO{kJYqo>pAhiO>HGNZatpe$nMn8Sv5RhZ_g>y&i$XH+^TgmLD~5(v(5aE#JZwl% z)$AA{*q}^-P)-Igw!Yc<{ab-~T_1mGv+$BS2fIh#z6(pO`)xX65PTnv31)vsVF)^H z$p|4V4jM6{BcD3RG)%4$%;|>Ya0TfbeSZ)Cq5qsb*+UeBu+#z{fH19{-*FMe8WfOx z0ELo8^spgw!=Va=S_$!!__}Ze?MW`mwVzB)Ol-jPdya|aopg5l={@-p|Itpjq3Zd& z$##o+EHh|sKj3adr!nPG`Pp~cM_nEe2pPrTm*b~Tiak3qO=BEv&>I;GI+SVQW}D)$ z2&q}Dn9*kKS_Jk;69$bQ-SxumAN^r^RhXLK$3S==-rio=87}rWy)oNbl+6TaF;T<> z&XwbQ%Y4$O$l=3!COXZFcld%%3}}p`1J2dJuDka{A^-yC0~an_DDD*~sCBgNoj__c z=|A)Gn?oNRRnUOALe&nkGAA{G>?-8P`L#_#$Sx4oUJj(?%-*p@{c&!!5rq|9~L>BZC^c z!o6b4mgYAS6L6-G^Wp5$A1THP#U2}{QPGIqWTO{f`vWJGs4KoJ4$lxv3AS!kp)n^c z7r>)PgT&na3fl7rG(}W~xC>N%y(7$dkmf&j{>m~+M$>bY7lc{F$n)$++~Lip_DFPg zFXi*EqW%$EzM1A#Y$aO^gwBy?>&D~%@5`>-u;CCa*po&(D zG28a&q#c2Yx}`md(KSlZX$1Dz|0pcQUPNx!3A60}SJJ+>L^0rY8>Q=dj{rCt7kzxW z#6UD5SQpMV)^{6bGGD|`^D#;-VYp70=f5oFz-1P49IUf1nkbg<(O0K;gRWI5+gL;# z>v$_#5DHA#B15`ecp!Tfsdw_Os$op)kI~dC65=WdEZSXeYzt=BDa%yV!1;!>tv0g5 zsQ>Rfj0Hlg+IEK7VC3Cm={a*2{ouOuw0DrDI8}Ny-*1>f)bnF@FT8V`2V*6jRUPL# z-(S4ueO%p}N0%~{uiOZ8|MFb+UUtp%<)Lx*QwFS0U-s~Ud+wl<{Q?$WKe*xT!|p`w z+q-|tckbeTVs}Mtp#G8pRyTIsXe0UjMf<_sb}>o)jh@Sf?5vqw7weHTu34hsU^_PJ z{RD?u65W+6d;F?ywp?nEc(B81g=t^D(OK2eH8N6p_a;`kwj$%0@8UDJR zF4ZPF^OPR=dnO(1I^dAXV8GI}vFaG*(83W76>)h8alM(=k514TTjL8U-nQ2;3fkbO>R3Jr|H0H%xQZh|A;# z7`*8efWnw^4vI;r@IFW`Whdd-z)wEG_ZG5;&JU1FnEA?}dpSnJzQ{0uMOf?oh$uc{ z*g?kpfa24ys$s#qP5qK=dhgf1uvg#I=Tk#<+ocKhU8b#%`MY_h_W!zeMiWpF`KWK7 zJ}V6#cUHYsw*S(nzWLd2`jo$yv-vc$kKZz#>7TwN+LYQU%MILInG|`pUrj^Tu8qze zA{KbxfBCR9M%`v~bkKNu9@^hr#?!0kgqw*toDXCu3?v%7J+Onf35{YrWrT&HbtuKJVp zZ8_uD*o+U_T2Lyd+?bLp$AnBgWkJa_r``BW7pp<;pHP%a8WcQgGN4 zzdR)GqKos#13w);u2{F=;+*uXPDk=2{o3_3%}|6#Evng3O>cIrypZDxRSV8rtv$$^ z4p8S57`i~)-xFsgmw6m3TYfd8tVfhBPc9o9wkqR5tqj0S7@oI15%jPYO_ z?b7gZkFv0!6ErThKz)%;%VD81(VuatJ#AV&25DLobJ%?`22X~kcUY0RoRX|_pRV<(+LQDlz36$^jXL?5qT`>NQ`6F3 zE_d-y{Boz0b%#-7%F_q@csKj5+*Ge&i!Vi`cutt>CXrOdIcqs9>CZi;*C zO!sVB8;K;j1r|IKGu!^!e@G;fZz$hR&?&FQ@%;0XJsfy+c@=g`iGowQ@4WY z?_x<1kMYi@W>fcHm5YRsMnVJ@B8rNNC5Sg1OT$CGPM%z;*-ckv6zd@%dSh;Va5Thu zV3L2k$?ef}am30(*ec(5>;lxb=C{X%4&!f^=zdE*d9C`(?tmo)-}ZPcT{@aCH-FQn zb05xC?VYOiUTs7EM0Mx69^bZ@h3@cP@yl~*+Hbaxx8_0s9a@n4>f zwdaQDb>3*R;Z~%McB5g$x`gYCXp|UO+*&qt=G=wPj_PSTe7m1x#b=M5w9)tG*0;8` zS1)*kC_6SzTf2U}Ro(gNvg!p|&wUkQpt!8g9Us`TtRj7JwE73X@UeH_ZSQiS$C9UU zH7C6rV-~iR*i3BLQ*Z3~!Le)%_QmtykktI!N+hl=qRC0$F%n20V#@b(bsjZtoG~;p zoawXLL@L-IeEJfbf4oHn`?R*XYX7JdH;r98Lsw2dP1$TosFI}==-gX*jpn21=jXMS z(5Gf3+>5?t6dJM(JiOA(VD||VZFZ9Tb6JpJn`oqGoSUd!d`#c9ozhNx96qwkGYXX`=dK|yAZT- ze2e*-Y`4aBPgS&X%hcwcYr2=S`{nR0S!dKg_A-vV7GX9r^2fjwwG}UB`0m-db?$Mm zX1A|}b-g8nT(%!7n9fL^R!dX0BN};o8eT3goM=ha9B1bQ;9GT!LpX0iVzZhD?)dfU zBQIL`kw5*kcUzD-OQ|3QAr6xRAn4aam*0SZ!@fc#4-yc(-^=nbpo_GzzsGl(VW(+(tToRL#Z{{00)1W>fV*@_zZ8 zhU)&Zuad5RaH>;#F!n;o!dZ6%F2DUz+^q4m*4TTys84a9 zQ(lHTBKHS+r5oULwT+pVmcAXTb7#UIu{h|YC_eTOGG>SQA?w z^)-s;os~#r3i>BK#HzsUlYK?vU5mtZ*V~qAMGk!OGsf~0YS)DeBO|oUewD6Har@yJ z8EIaY)VRR&^Optr3RX_H;|)EP7pf3Z+#XSw4HDsh-Rlm802BdDZYl^ z2dt1(7;J9ep~E>N>1j`-XJSR={O0zyi}Fri$NR=4vE-X|$r}(=C|f4nex942juzAW z+8TW-cR<_UA+{$x@C{({YYy>hAtK_rMXzERLQtMGX#vx^$`&_@bq z61R<(e#U>~Pd?ITOazlUn@|;(<|QR{?lXFWW+$5sh~Jf$-%X%LA3zt)ayO#$EP|dl zeTZ%^#m97=_+-)@rw5&7l(s&6T&C@?c5;QA!q(k3(YkFGE*{-y?b`SCMfSv?salEF zchda7HaoP$*cz%?ztl~)bJ4T9`zk6haQLbRM+|1qzS8i9>Auppw_@71ZJQnMVC@@I@joP>Aw+{SX}a2f_3axyu^?KQjut=%FinYx+e7D^&LIhRYZixO#4N^2`sICg-Rs? zc__7AnsIMFk7ROx_vZ5>$!WcJIXRU+N||L}{OIDX8d(_`b@Ql7*F6Rr(a)Zh$=nV0 zpB(Ju-tfk*B4yT|jH-0c=v`5Z#w#T1*xra*&{y&D+YsPSUS(}xl{Lk=**a#?o5Nk+ zm(7e?5cxx)Ucc|ybsxUV-t-=8n| ze1&AQ&}=n+@wEm+Y^%LW4?O|~I#=r?>v(v1T}E4aKJYAhYpHR$VjagZDtCEVBF8y<-F1+J) zp=p%&$zgGE?`>1mh;fER>FdLu|8>mzPVV#UsQL4$*RrNm>~Vhn38v}gQHMTx-|sj) zxL?pl;yR_sCQr|VE>|tO2-c*fKD*%)FGAqt3-BBzoPNiTher^X_~{PwIvYyGj9m`T zUs6QpjEYGJLIMg1db+Mm^BkvZ6U97OXOjOu=T+3|0@Lw_R%t$n=4B``qYvR>f(F65 zM2)`<5v3>Fi2`^mg`u%Yuc2uZDUSs>$klb#v^+z=wHU|b@a1QUgTsG3SNM&ht)4Y+7azgWbHEoAC zm#$8)+cbjH*sY)HcZJ+}=cdkz-P9Pl^ZSt8slReduKWCI%zZuOP5g?#=LKJw5_-4! z(XxrIx2@{_E`MKl@s7imF)}i@B0bixTemT<&MoFw{iopN#aD;hXNS}V7o?ywHt^)1 zW#`GJ&-R=!LB(?SSC1Q}cWeev2eFA1cIvk%*Qr0GMu&OCjf^cq=JG1g`k)QEw;eg--V>oR-v@7@nq&1blPc2lpOJv|K%Nan~sQ;mxPC&pWxp?yri_0k1C5h8)&Q_R`~qSRUaef z9yxSwguX#T!@}Bf9iy=|TVovUBY%CeAPe;wb0%!WTh)xm3s;-pG#Q{4ws6^lBMrr6 z-KLmDu2W1LAHpHm+F7gSp%#Ae-}*(hC3PXG4LaeD_7SNmDRYzLe$Krt?=s`mLzz2{ z<>$suvdZ{q-dLS(xPNzg-LC1&E_BN@E%$x@<3mowf){5e7G)=x>$J~~h^j6cyP;&n z@`#p;P5M6nX#ouVRd=l_R?`{Vx39YZ-172U8ykwu{I#5n02-clC2JmzJn5sYk)_iM)vVJN^&Y(;|Bq>XlM?d&lH?nY*0{BO!FKIl0|rDgY8XyHxz&77&1M7$ zf3$vM@kNiWK9UCa2SUH+9{p?LACGFF2g9M^x4+QYk>3Hu>7~%~js|~?FnZ=)+fdh0 zGFjzUOXr6ENiHY*0wbAnx4T`W$0B6fGMKVHTF5*gsn3z5$Me$E{V z%O69@w1E~clTMF+>b{w=X;TCe6;U5iG`-7^g)5NdoFUrgpEXvDm7ItX;sLNt4l*`1 zS{_*%uG6jZ?k0}z<4!6K;s1D1)6t0^E*UM(hK-6w(WPe<-V0OQ9O%y`-Ec}D+*>I> z!l1W;*~uXXwmLQg(jMGqa6ckc28PX_j1uNcel?LuaiGW zBpt71KCt_HEB4kGpr&f@&zn%pXFBnyyWHde;Y~n#m?UZ+$z(rN(U%urp9%Bt5NkAZ z=0P~~P?{9u=Qwl`*9^7eCV1Zv(-lQj>yb>pSz)NsRsNSdtVraFd;4TH?TQD+2=yv` zJSDISvt3tK4wN_R#Fo3WN=){24l8W&xR=sm zPI7qOQAV-kUPps71EzYJUpuXSMO~7dG5Kp{AevgRK@EYyCUh6jX6j9b?iv~!Bj9|b zWuC;X`rp6i6*Fj(Nt3l=lRqv`6k&TzHgAqPmMXWLR^JWeZCU-VtVWp0wva35cYf@| zxyrOVzU=MY-SNmKBWdmJ+V%dux*b#38+kIa8r%8w3f32=Nq($)d}6QwyX2Xs zC`!BETj?efZ0K-*v}wpuWGM8nU8K~2jVxVT2E2NYm@0l(TmZ_*s=B&`)27`Y7_$wP z48v4^(;QrYf^Ey9qF1D`hfmyYhtua`tZgADJ;d~@1!WJOJhfcI2y)P*#SD0u@n0CL zy{L);!#Ao^vNp8%hWzBcM;OhnnLem5|J!s1^0K(E+05?7-_;O*za(E}k-~|k24|ve zHdOZ=z9Hw_+|(yeGM>iF$$|w5IkoxU?IkI(32VMj8rV)^^JjMmk7bQ*8vxR^Up|#z6lOZjmS@ts~Mq>ofNg*nNi>zJceT^1Js9S%fy%`d3kxfsh{X7BH{W*v8tz!`-6352mkp;Y54G&bR@D7e|w!ewfcH&n=@ee zG^%oy>x)K5EV&g;12jl_KD&!Am25HX+Ub`$D<`}%^Bo~u_H&t`ebudD$DCHXf=$Nz zuW8rk$w%e5M#Iz7LRRyx{w;8msfa6*KQ?fR0P1K&d`jf_HEy?%bdy8E2_(OdAmY+X zv@2M%S9o)IJi-|9CDF;u-`lqR_Q14le7(8C42n+f3eEOAFr%4I<%O!qtE5*vE4MX{ z^&3Bp>|~;=>-s#m0U$+Lf@0QbmV6`0MSCl{yOs20Q^U6U0>C=Ro6~*~ zQ2jTTBgB?pA@_#-Y7W|BoyxP{uMG?|1QGM)rEyg^E$jHpM}m?l#}mlw=ca7y9!1GS z5YB<@n;V*(hBwPBhBKp)=ZB%Y^i8{JWg0SPKBlr%ufA4JQ-6NFjzQ;HF;k}1T$80q z`!Tw_{h$iwS{G3e`0e@M=O97JfJxq5U+*CW#**aTr}ueUnLjyD@!-DwqS2mFp0Uq@ z|2E(DX}-j@T;qW>RM2y|OiNE$Q}c}-uiSOI;hZ^UOux-pFP={K=g*(d1#Fu-J2!1f z+{#PfZ%#nIe8O<;aq+(q7mIwaewQJynDOUo-`S?0HM(lWn9sSXyRI>WAJ|jT;B%=Z zf%l~deSm9t=R>D5B^_-FYf`90iU|umMz?CBbt!!ZWs^&XXw1wh5`VuWx?sp+L&IqA zVeUnRk0y7@h+C|(d(jbt_VS)fkDTe=Rx){9Xg_VQOS}Lp?7O5)3v_OlxRTvB(xU_Y z%!h?)ec9c`;DH6QYu1=K8RlB&-Cc$%;stF`jqoNFzV)$FGTV-kq4B1$KXUAtx4U~* zLizStLSW7m;DLh&zdYH~O;+^<7AnGf4`OCcQp+!=^Iy9RszZ-t=t*Onbbfq28k7j* zzL7EqzCVf%S_AHz3S=(mYo57Mnw={C% z^SPd0_&{4af7dJg{P~PvL2V{80aI05YtDK94caT7jJRM%)*@ro#^kPp6C^_6NEqn& zwSP)OtcAT%=K{m@NoX>LEs1OYTJ$Vdd~)gD?Q zUS3{P-wtps@2#?Q5&x12^OK16%E-o#NAo%X)-*ZH-Hdnmh$$pH|t66_o zx*#&A_2yI_={q(Whn7vqSy~*+p-&i=nndl8x~kxLQT+U?tMm|XFXD!inmck513*SX zSwJ+m1lm$f$MB_#8b0(^HhaOv8-rE2R#Rn4BkK&R6WX|zi!0N|T@Qt=x_{frNB{Zf z4+u`{QhHr{Df`BnjlZ0*c9uvQ_PSRDpZaszC_@!Jdwbn(-9M(rghq;#b$Q3G{OlB) zzLMnElXGC2!141?S#*|>$z}R>m9$Jm$Ba{({9* z70cS0>@D@I{gvc@u-NWm+wT7kiR*R8?tVee^4zu|7bOy-)R8SS#I}d`P8ErcCBZ(@ zV>kIIrY@tjw3Z>2zTH}TZxp-&wt$TYZ>)Dd5BPik=d!X$zEa`Jv!BrPdk!n%P9HQ} zVZm-4gVUqKVQ0<}Ab?%6<5&H2XGeJiE!X~AzW?~~5-nN|(n$N_7kf>!T%D2kAI*|! zGoS$)GZqMAU-5xbk0wC|d8Hd}hWvbc=KWWdvSGBjV&sK2+v1z#LWjH=`?O{EqRs{{ zI|jE^8)miZ$%9!vSa4OR$MOOmJb3Wr>C;gjWpbxtVqz$;f&i5F>^gUC#6T;S8i|(rT)K5FzuJ!I z)4O*t&|{PISPs)iPwR*wTJIh`0ud@4APrBM^46}8>svcQAV3NN=36FVUr`^eU`@`W z-;&;P*diosvb6KRNwnqAr7WKyub$#cb9(BQG;gjG)YsT1a%zqIZ z^x4GBGiL=EH+MVVR(}(Fn#A%@m?g~J?~C}Zd)Md8nJ`fMxis#&~5`Y&19xlx|aA^ zp@hLwMDLu2Z3u$dFsl13eaTi+Uis3cOKDfCW{uRni_z88SnE7X43icrbm`jF%+c`< z!ijZPx{6P-Vq%|LPe%+{;MF-h!8yos{F9H-Ed!?6y}7z?YSpd4d4~6%?ho`Hd%>nY z;Pb~(9lE!X{74ON@j_cVI5H;!)s2)oYj}g$Di-XDGKk;Vj)M|PJXO-rXgK$1)-l;& z6t36{+&4b^X;uA;xVaa!mvxkpH^Z6)P*F!GHTCV=C5+Zg^xwXWFqutS0g7pgI8R1{ z;(T|I*EDL_uo=Kdfw)TK1}&$ox`3=TjGSUwy%S_;PFvveviO&Cq>Rv@zHzfv4k%h} zd{P_uG_>41N!4$|_srN4L$+&v^l$ii=wRgMkG3VB^>b5A_FDMNQ%{(8ZKv$0KP34( zCf8Q3MBb!^QfxQERgt&^nxacHe*Aoz1{|-et+%j5m>vcjcxQ5QW3+EF(?P)Gi%tVx zsxK-!(@)#Zk}u$hF|iu6Q08IA_XL!WcZd-yy^bm9Fb`uHV!JhrpdpA_23*XTqTG^q z_q|g0$F{$Y&EO<=v7MJkF+!_UDSE0ylPFn>WdPK=Bg(L3sqzs9FL?Alnm0@UMjHF zi@^Qo_cU%yti0caB40;(KR+9i`$T)>b3wsMDQRzm-?tu#JWQcTnCFN-36x1d3ZLCDr{FAb%Crt@x&t zCE1KJ)Us;(@v3cJ>JH_Gq)s*^hNDP&ZP&RK5flrbJA{CxiC zsq^88KwN?d?b$PkGpx+%7RdIxo|QwRb}ocU~rcd(`fYN*S>a3j^boeT*8fpY~kZG_3FPCm-#1)qitbKJ@17 z(@8Qv3JZTOKK*pA`kSo6Oq;;q03z454qT0M0QhZ!*&yNWpnZ?T1U(>8<4S@EGAgp4m1d{Meb=S=g^xJDa~fIY z?zd|C4>0`a(9B&92nd)O4d*A3d{%gAI6^V?)9{J^yf#VG(?9E@z5Um(+^;P^AII%1 z_fQ-;!f?sWZzhl?=7G)|^)-BSqU-Yt^!h&8zBWI@vEUd%ik0)I4nK^3!SS z*G{y{SJhWu8*#zegi(S8Nqd@WC~QkHYMSUz`~1XM)KuhTlL(XGBfrykZzW@0S}vmS zVr))r&Er3_^t)f)`TZl)T$zX?=7bLNz|CzLX+jjdb3$Jwij^1y6V9Eg|Mo}ccYW#K z@bhOR&=;B2+wD%B4@25D|UlD8y4vU|m%%N2+@O_sz zmj)2I+`_Cs3U`#a-O|YGt9j`H+S$vUg2sE#{e%Hi;?SsFXGAm=zYVeOF*&ed~K zn55dJEknL}6JFwypgm8{lFz`jW}RlIM&^%bF~uPdGuisi?4@>C+ycJ#m(hYdHH2VLzU>tl7G+`knQTk7Hcqf z#Q#;qp*uLc3^>hR5NQse3bFN@c6P#AB6m*|#`6QG9Z+?yC(G>^Gh)OnxFl10y=suQ zSsIh(0|F2RWl!df`8jrvCLi+HXHIWuvq7{J;tcX06QSkx^iass{O;fHFYrLpQFGf~~<_0G` z7jekiSPOFs8gW7Fbl(}Z^#vEpSrnW+I#z-Q8)@a%Fj84t^0X(j*F zfYG0V;ip~wLFfx`M5Pc^7uyCDhYv4((06%4VJ>SOrx6d{ARtvaExpM$yD^~_yO9Nn zke}U8J7KS@tAu%6gP}8zzQ9zX^#J(;k;(bf#fkYHjuIQb_==JpCURIfdm|&5Xcvd+ z_OtKwMrOivK-piI8#<`(rI3(PxWHWg{lbb0YxF0WFq+edf5G~?K^*EVjksvzz-fYE zS4ChbKn^{ZTyc%px2g9fwGk&qDl4bjbzb2hU=S2(DM*-a#E^FwArQc2|9{_zcO<>k z+;czK6gTzp+_LukIjmg32;-!edZCDIPT%5Y!E&g!(#*j$W3A{$<6z~7c)+&yJCC+Z z2rd>ZI2|{6L?t}4fhT(7u0Dg*g=TP_B-hU9{MALH5g26f z?nPD1KU~OU{3LG5wNar8GiS}RZ5&*w&Qm(4<#ZEUW<_=NTTAx%)AXVBiyw`+BcJ0K zvKpx6=v6RXBI&xizH&Gd9<}#6Dr_Ju%1+r4C1vd5J-xgxp>tlu=usex6j(&fYHj?DH@y_*QMc;&6013R;TD17 zok$n?USeAPErT(SxV z>ZTrAKhBVdx4(_q^7>k^uqWcge4Zwif=F_G{QRQeRm!A!yRF34l$X>ep(fMNv9TmH z2OTaZA5sc@+&APFFDb?!Gvh*1NhZ%lEVSIEhgM<%v{Q`JTySg+la`|x{PrmGdrIk+ z&UZQs_alg2hM0%}TZnv)JPJ|NQ3(^0w}G%p9ikLCF0U2Aaoa>)10)PpXZP){oh+V} z-kYWLkHpFl(CPQ%mh6$Lixg^I3YBBhZm#6^RraA6Y5gHd?mo_Wr~8LpMFSUKemUjW zDmZ)Bp$!}a(GlRBy=rBD>>%T*P6j9bcw?oW5JDHM5va)lyEApPt#(%h&C`q^=+kL= z!G5CyN~)^ayde(GapsSrMdM81M2J9pDC4Zfu35D87EqT0 zN^03;?3>o+sJJV*VhJvPisdIBRxYiA&5NWNCHZ;ztE>CPP5CNGal3_JXCYO8pmuYO zX<~KS6e+KF)Bw9~tYSwq^(ciUuBQ4N2Kp~iz!!{X-&fud0uHpG7707I!SyH{lo|Mx zDQyeAI%4%dQ|w?fB(*mG98_RlD|zV(7| z8K%#3tM@mmyb5?n)rTY1!|r*@sc z-N$J}bV22{94lMysBa^|)#5fiHnGMN4q?6Kh~-MZ^+SL?D~7Q}?Y*bz`z&#!*i(7} zCbf6(-fK16j~haZg|5p&a_6^A1344O$!0L~H%VC}Yf1jY9baD!rfCakrmEt7jCbDY zO9+l-KwSVEfV7&(CMSx7=#13|qHX*;1YafS3(^8_z0(&iB>inr-MV(^m+!g-{nV1diyW#bXhRaL6(t7PefI7hg!C?#YQ`Lgi^rj+DbS z@+e4|VtmJLBaGQbL|)KnaZ=u5sy8_W7@qq6{rlGI-ix!81Da>9Vm93Noy)m9O0)I3 z_2!KKs^n>T9~n{m=bEKv?o6Jf(P>S zBe4h)x+=j&0n}3L`sAzjp7=Zrm&Sk1!$)*Eou zAr_tHRXuwuXlSHpWH}N5xLd9i?z?vbjE43 zNnFSRm8B6nMJ&4@AO`bI1?Vy(n`^Z1@wgp*BrhKy9|Q=rY<8`pPXW3zMt-#A&Q{J{ z4KL=c-CXg2CBIY@74@i;-u($VFy&r+iNifU0t)>Xa5P-HVN#?Yr!sP+K4h6dlE1$U z7SYB;#3YX5jz?Ck64HmGH(j?bq}x*)hTRlW+!~DOyv;l=7f#Fd?yiF2Le0dT+r;y| zwYy4rs{odKIl5vAqH2UI-iX;d`O)o5VPP;80hiRjWk<@$1X>HFZ(<`6f^EvO-@k9) zf6>`)ne;nEBcgNzYjA9(eeSVoz*EmI?3= z%A%xP_xw(z&VE+;EEYUGDRs*tw^4La(j?QhaS#|z2s+k(;zPS5?*-`%IGIY#VW?=} zHO~K&w7p#ZA#n+4f$;91O^|FRh={Kus!Ot$XzquYx-P8+?QbB>ifi>ew|m#FUX0b@ zceds3B@@*cBf0YiluT=FeuZb_@_$F=B_VnGRE;<&zj`<4_h>VO=af4cP>r_0}< z=Kra(b6*wwttSheE}Bua0J$gvtu(vX%qEPj??GKhtcc{)OaWgGFy^YT`i_6Jw+uZx)dlPr8Ltd2f`t#W*j@Y0MmQPpipGM%zMMj z_|W1gWwi#!UmoHtb!m9aivqlj4QIsoH^1cdI~4O0UM#UrT&wvgTx=MEWHH49HJg#D z*o|2;DJ|5v;C=$y&zwo}-mZs6PxO0`mlVB`hqn<>ix_IVg)6`#uYQ9&QHq;H@~Q{l zfL)@qm~qMEoC__3^x;pswWryUSSidsT9b;~4~oN5@QWEm7ed@E*Vb_v?I9y}Gc`SF zu}n)SwGh%3HUGU!RA~u`@)oV%ME_N{Xii7c_SlH|BtDj$Cp+?>;K?rIog%&sutk;S zLn7fDwUax@%|6(*e-N+;U7#D1s8KpPNlOzm#8?MbWWfyo4bS}{zKUdWsOU$)Z%P9o zREkai6t_u&l}@aExx|r8y*EUCD;m9%Vkx?FVwNwjduQ9)`A%Lbq;VWrGjMngCjY*d zmxRpeFX|=Y)y>!EZeQX%byfNN7jsm(LjJb(-DD{hbbQ$x22MC9p^SvM#~Td5LcoAY4g&F(ty;y`|W z)0!)bgz6rSs9J3kkn(?gqe%d2I$nQsC$d;=AmzMYJ>vriID1Cgq>+0g6q!_Q&>*j! z%Xv^6;p&Ksh=J3h_#%zKda^s3c6Gcvq(vGT)tHZqa5`9!IdD>JBRosmn_HyoW3=A= z(4iNEUL>r6R81Rcor}JHiRz%dc&JQvORD#9oxb?CO`w=A0NszztrJokakTjHeM{65 z0xODFfhi?EMX&#(a^~9 z#0-+~4K^b9#*{z%mRM&gq=pnyA*MEe@yWAc8!^Y8%pHTdqY-JD$)8tcf)H7DmPWm= zs7>JGAuuzT6TK`#F?C|dbyw#KaI)x_!hAiWjhxN)QI>ucHd=CT#63}8E4}!y%(id8 z#>07%8%|PWYxS3X``ULYB@_v<{zY{A(pu}b6^<)j!_+psNVXB};ruiIVHe;XWYjZn zEzuegtzb4D%#V($h=N-hqTf~F&DHE|Goe;NxWiJaasI1)w3{lYk6Cm@7sbY1Dq!s_ zjoaN>k0T(bxHU*xoU8%}cWvRd_e=>L-ja^X~*JanW3w(T-#MUV< z$*VbF5p>(ax0rLyFS;I%)(AYEnpaHM=||KPZj_A2KuwI(O2g|slDU@ z-2f3&I{2pD+kyb}1g)MMEGpmCZ%$~N1_NRQih%|UJN$_KIhZ9*eSeF5 zDn2*J_WU=_3$b?&^p}t;O_$MHBbri8-8fiLzv(rcs)vh$U0MxqeG9G)r2|X^dfbZg zZP?`=DCWAwai`L$UXu<7C>RAzQpNeNMa3W>lJ~R9z<~myDC*N)J!tq9>jY00WL!ej zC8Z_0f15@=xj_OGqh_E%bo}1E1`fO|SY1w6a*5mH3fyf296s!t1)N~T!;gx`Wcz`$8!GW6ty2k>|DsYo~|7U zaU6zQaER@ScJM3WE!;&sMAa}CxtSvlvI5zQFYSIIvddQRy#KNH z@2;`3APhw)LfYRrpr@Q%6k;u*wA*#ZnubF*=Nal=XI`EC8oree5Gb+!qq`_5C?^Gm zLA~}ABn1SW;NNb5P}{+C6Xb``lbC63Gt~}S*Akp$hom&0UO=*({&(dX}As~ zqj-;9ZaGh@){E&aX$F1gDT+XWaiqnV+coY36X?_Uq@MBdPUkD~s73^fh$GmO>coNb zPY%)B`PaMSm``mYkNXunw8MfklTxjghcAV+wkHflM@k6T=v=UD{HmZBi;IgR9scZC zIZw1?_$9r1^Z>};UW;Q9CttvX?p@&xE~HSTyWb_jQ80pNTOw=| z{KQG&3*UQ;g&81l!nLG}1)rz?+*V(?QVhlkURlsjB-QmmR#_(Bgq8}ZcrNX46|?~`s~?V&%0&AO<+>42=Gft*qvQN)++UxC7-#LA!|WA%d46 zb4a=G)~N_V3?m~0C=IYuf>09mJuyqx%4Qg{64HrRN!L(@u`ja3E6ll}ip|NKwRl^6 zDeX%#^*9u{$dTq24U!R+4gPeRHuboG9vPDl|t{zncZ< zw&A6P;*P)sfu8_f3=e2_?BJ!c%mRi%aCPE}h}xWjBL_9XI$qiUzdeVVhG8ZL$~EDm z%nc>vEf67{ruc6uY}MhP-{R+y7}cHc0$^!0#03x5gNcgA+bRc@T)ibC zVR7o`t{3mQdjS$w*>Njev40Js#5$XX2JDy_Bmog5&(7d(QDGs1)0H&#av9!^67xl( zrE&cI;bX^g$ku8oT7hS0)Ap_u3QGZi=_iyBH&3C46ls7-9Eymq(;#!rZ)})9_w0lR zcAage3(i5z0S=yi@YRF4?a}V%+}^hO!J|ilUE}BTP-M9Y1-5ViXw=upzvNI3SXuvq zl^cCUW0H2OfC+3koil=ep(zDiY=)Rua6N>4JgNT?r3tiU)=1A^I!+Gq3v55In%@3& zA2X&Vj@?k||Fhq_)%|o9KP>Kd@R^dn#hSb~qf>5=d9di(vCfL77vFU~d-Pt{iAQ%2 z__;>^v8=(2ry50dk2KVdK0H)vYm_LTn`3XQ>0dpy$oc(D|GK(vvxoH*ORN~KZu<3k zz=ZMR|ArtcK5DRq-BiM38C5+-4t|vDg9i{@OUx)bah$ziVjVc>LU`SY9cmw;EQQw{32;f0wZ9REnE$5t$L3 z&t1a|N<+LJ(;72f_wt`Ptk*3CPZhDdPgv)QHBE#yjPr$` zGdo`de*W#9F(mUZY|Kv>Tu@lgIwi3h;?}KO0b<)sBM#}EUy|*F7d7ZEnP;ISwbcoG zOu}R>Y{s><<##Gx?bv1F9OppJ?4%)5E{IEiAS0-=Sq1WLk5Y z#T<0-Px$zZ&PhfL>6iC|+7n(x=M6<9yf|pyuyrABG@|Xmt((03QTTxTg&gwlSGj z^zm7#qeOygk7Y-O#)C%WT$NZ#ZGL~p-0sK+?pPbiR-Mu7lbWi!FcW;05h{FZ@j@EO z2*N+CJs=#p(S>kN8>}_d+n|6Y?nI*%Fm&u#+nboE1z#D69b-`s?*VM}5qmX;3}NAd z{(9kfPK;-1OH{Gfs*$}qFHP9lgU|EZeQm}J$7FV)OgI}=T(>D!mZds<7m2I$pn&hj zA$Ukawqe5&BPfT`gk9@>wp)m^!cq|N<7gOca*s_vB(_KBAZ8RbUF3#bBoDA28-L+j z%yYJp&=B5dsO&*1<@W?YjbobW!J+i@_3Z+9WzW(Im`!e)$M2i=sG+)ux_kuQk)Ple z9&sv(A>IS9mxvr;9o#Knp8I`9K^)JlpZ;QnqC*{Yfs?K0AR3c&D z8%J$A3E>a1xjrM0E8?cQ;e~|k$WFYr?66?V0PE}&PZJ-QMg8q;THI|kVG4yN-}GPG z^;>fE(ASDhnIKt?o#IyQ(JsKW`~1JH)~cH8Va&zS5IScoc;lLG%C1-|uK-sGt9&lb z3vi#XeuZ1>?LX7(3+^j8xZ4Q}>Z{E9<7Z}Rm#V{(D@@BrFoy8k28MIElO9%^4MsJ% zNv*l3#wRk9W2xX7m1TEC1U$oXS}N8t(x{;vP7Iqqwde**JQ#Bj7NtcOyej) zgKU3^t|W_5g|B+XNXNq|ZiQtcUSgOFnliJSxh9j6Kmmu_?P7b!dbbdhBFxKBD~qk8 zXcxqeJgTW}-#_ZHqG~N#G_i{zS?cp+tXPLQ;vzIM`{3M*y?jiRdWrqxTpq>N>yDY2 zS5MtG0cq{C=e4mv{$ptT84owt(!Z}N7#Z!5xW3THn*V-I%YRRRM_ZaK!|MO50M^-KziK3JNL`oD9%{6k)OU*{}8mzAWXtIcjU()TT6zV zwu+lYfZ!hgc27HW=tywe>;_3yo7kS`0`J~md4K($7?qu0Y?XB{w+(o?$E$nC_|gq8 zv*o9EZ0V?UyYk3##SG`!mtK5b<+)LNSk?MHWA?8z`}jIzO0V$)`MRH74sb%sCy8 z9zXt{>$-8rQ^^F^PnqsQdSkFSeJzqWFGFSVi;kic^HZ!YVReM;S zci&h2=8=ne_0sSOs_FiXBX6%gDg3YGw6o^}6Y6P5oMaJ~FasC6V$7b%>Fkjsr$Un0<43&Ie-*IxO7`9%wKe14*Xc`cXrD z@OuaFSOJOm_{o#s8{ct<3sc>{BVvxO{QzUjcAZt)wqGAR-QGpgzQ}c-;kkQLa>nS| z%NVb1Qz}<}Gv(vKj$Ll`KmBW6ic9r97mMUL!?z|04;Jnkz3I7aU|Pmh^$4ePMFzX( zR=?}*mowF;VT5Xu%I&ZQztWpKl&TN^_<;kYaz_HwI96+587a*3^l;>n`UXb~lV{yL zwdU5=1ssmuxV{J3LKqRd8XKl zVHT0WS;W$5-mn?>*{{)?xNzI9q$d#kI|4sWT^ooTW93~3Z6f+X7aK<|7{h}+Y{Vne z)RbjE_FiEv>9sJ#Sc$9QPTeE6@JMs^yi#Y~X5;vK6|%-Qf5*pG{w$efI@dx<#aOU-isF}mfTG>W^Wlnntj}%zlWbXjCmq`IAQ2dL$?dsAI>Ydc?PKn zGVR61Suz5kie%l2$`i+9xQXfW5M|{fZ)L*Y;W{t!D)JpTTQ#$Fu@#HU*u;3SVBw5)J4C;z{@y={8yQ?Q{t6W69aYd8LbyF)?IAgmO~ z%>V;Z%(9 zaj(Gx^@XiFs(R1YX>V31DKrnrkJ>T2e00E^c4iK$zSYK+bz^(ZH&6_ESe~rsty1x|O1SNM-T?DAoypE&9WR+Y8+StgKP|vWF268v#!PppSo$UY7V{OL z`)PC$^;&Ugi8tMOv3~~G*UP`^AziF}WMcLwxf^ASqB}>-8;YiH# z5(kj!9OJimE8nGrUBNGWg@ZgW`UPoBBtpvRzx-#`Sm2Gyy2*db-ORRvq1<4MSXF3b zXK)zENJj4n2x4C@hj_+}VTUZPe>bx4qIBErS>OCJHwC4}`c6{GRzV8S?pgL}+bKA|s_RQpws$hz$Cd4c24Wqh&?^-C zsk3+BAl|)L@BVFf#Im4r25Ssc|2DlJ9^mwB-PmM?xT&=5v(3^t3rkqke$Akm!JIqB%!7- z+cxGM0urJIjy7yV8nW*rSzF+pJotL**Vnnr!(Zh!nzPmn16kVg zb!Slv(d^w%hiQdbyyUtO0t6)i}n_-QOj-D8SIj1IoT5%sXN< z)Nw7Idtw(2t88K11%8=?plkA!DHkc3*qZF??%svDsL`6Odtbx4hD*$c2PCxpd?9=D zbyLf%r5(I~Xv(Qxa;biHl~<~iwRd0jxzz?|f86>+pbu*TNTh&)BsqR=7f`Vngpqw4OuO>_}y?UsU*B>ImaIQXI7- zSpApyYrbT^PVXw$r~BUC-DS7upGZxe_~@1G^qBB-t37#payIqGGWx+L^y$TRQ63qV z{=NLgck2Bw%%5?n(Lfga{?3V+8^Qej*i6sxvDj~xp%H8}{FK-Oi5Rfy*QZe*D_556 zs?2ZG)YLQ%^o-~GGVUn-6rDfWdxCNz5Uz;JZ*a^^S&zQYHWZO!6%%C$X3YN}R@nL> zVWg%zBQy};~$|374X2{e{#`~6!grK0gfktr1oqRd30K}8u0ktjuju|b7K8Vx0L zNoGZoOc^3mq0B{vQl^9qNrwNv9?thWYyHn!-&*IK@5K8)&wXFRzV@{@c#(@q@Hvv=>kyj_XUGjA2nV$oz&Jg|B1i;2PuJ8a~gmglJnh3P;y^PwfsBkHT-ZA{p z;ra?1`%9F=Xb>{8v$I(!PIjl-iNqPF;zNjef;hVn{<$sSw!kn6POx2=T4I}a+}n0` zS*%X;#MkQtM(2gRm=M*&p)9!WdduWC#S)1C7Y+O3nA4%#q27EB1*y6$OsHg z#!w_N*0|;5a5^q32B?$C#S}yuarwyNbyk&AF>q7IgXt)xI>=0Z0%UN^|chJ>(8 zOiU7O+@|O?x&=YXUAMH*52jua8 zf>m{oAul$zw_iuvC0k5X*}&~y0&4Dt3nH#03;m2nJtoyuy@P~yO;c0~9Yf2<)V2Sq zm@+PL>@;ELD79(v?A_fsYyXw+yY)@jv+wUk#t8h{Wj2}2fgl6OfuUhzpetfTOA?;C zpn^hR;Fv#v33;gx;D*kgKY#L7H6eT((yQ>)2*>1iR&XeZ=-&ZoFe5|Ss&YBXIH&=j zG9ZjnO+|%;5y>^ASornMA-^mnp^b)y3!yzo&ZV%`Fo!Zb)1hs?1Q2rfO zI{ic=HvoMQQWJ+h!4AAObn*j0ySm6!bsVb|*S55FZWTOB~{??a!-kbrkYys z6zbMX$etaC1ItEN+}zj!t4@l(V;_#!sVjNe=uYY%#t=5@6tZJ3LMwJXITREW%H+P~ z6c^9H1KHr9cycG!j;ZvYXCeB`f_l_7N49d2o!>TQ`#Sr3hxIfL1{Us?;? z8Zz-H`=7wJ6_3LloE6fHCMXRo#_O748ZkD18^PF}jqn7V>zbwzacC(mqmeUq(1_Mq zK93wIi2uo0%QCXyv%T&bCh}-HE^wXnP0C@Q?wxcdBrugx~Un$)+1&v{>0vpMj0kbu_~gcd$Hf`9D~KJ)h6&4;S0&yF;*ScR{h zEUqEqTlW6Sj0zMA;WPk#TNJ2g;g zFzMJ=y}g<{3W`6hkT4%yQyFWNxVd)+ZY-N6; z#p+V&&GUL0hAl(8taYRJ8}~}_@c0izRh$vY>^yNaFthiBhE-kvIc}vBi>pP3dTW!r zW5CC7YmwRttZ%=6y)SpIxslHUx$iIUA0R-+cHqfGNP;M#OrZ8u5Svy^ZP@A$!3AKT z?&EOrR-mv2ga?94q#-k@*Jbp#3!=^jkc3<21>*+9Q>g^EW_V;gz`uc_0|)hqq+pN3 zFD&o2Wf|lt1R-;x>K-;1A(kBV0RIVN6VZXQm8=E?m6Z6#`kR9=MnI?v(f6%im0b~e z`q1cuWuf}#JU~aem};NjaQhzLyFU+q&*E*ln)|mV)a27i&)Yro?%qAv)jv3owKKU? zVL-Qgc8sosSehvW!MR2%c-aO|<}P4!3dv<(1)Bi(&#QxBmd(Mk;eVglVy$6Uf91-Q z(NhZX4^2%iU(`oTYx-3_>TmobS^0&H>B-|mL$yW=``i|)-0FYd%p#Y~8E#xF{6H@- z!%`re4+`?G&+kJWjG*%mb;2<39Y?U`mx+i>#t|hq^s7kS?xmt9p>K^DGfGb&jpvd3 zM0_;l&JHXDvETxzVAQ1Cy?Yl4BL`HlHCS5N4%Z3r=P*?X>oJkOgspItF=Df!_D~sX zz{NBhTe!ftVv%Vvb{N$n@Aw1F|B6lvHdjx^=R+|+?nJu|iVAc!EkAg$>RQIxOIa%r z*5`~S^Wi}I$ytivczL*XFK+4DaD74Cacdneon?O;Y)j{sbOZ#v=JHQ3XTihCudjj$&Sgv$P>gy82ajROy|0kuVa_c+)+%g?L=}XFnZzi8bj}JE zE`}$oO>-$9QME&L9Pa9hUDhsIn|JpWs(vKk>3AAvu|GtQ4X97U_=F9-EtG`48jZ8Q z;DpLu+CnCI`^v+%VwUs0UscQtX#>QlxqfTRF0|Z{1d(PfY%gd1U-cIysq=|V_rt7& z?k+tb0UO19RKm5t!i&`JZ{I@Q$5uDWgtG<;;&~LK78oX54ZZ#?=%XR%wZ+6K*eF?} zGc$f~*3B-F`VHaQjlKTc{G=@BSLcgl*=#KM`7<2TQi7N1gPJu-N*<7VK= z1o?xQ1m4Jbo5kxCr}|jm9RESWAzQ_}D~;Uv6u2^bPm3vAsr1d-`DpH<#(Du4b!LzAj`$^Vq)YVC`MEQlYtH!oHgWfPy;-~(heT_Kf$4i z7Lq(N{C9Cl9%A%3Uf|}|*YksYt$OyXB3ZBU3T0SWSsAXogx6Ils3v9r%;*X%Et2`Q zuNDU@EWl_+1;ry!Jvnr=%g&CHB;^V z3n}%QziUNiDmmR$t2o)Q#ymh7SZspm;ge-u58f=}OR(!(dbY2A3(Gb7u->VZ-#O2C zR?Nz5N)N4*8*QFH!)E%X#E5=B>AVGj(w$cxKb+{RQ-R^ZwSzl4uunhLZBzA=7=yWF zn&En0a3JfLv#iq(URFrY=1#Nvk=s-6y_nP~ovL+&G9I^%Gxm5bDJg^ zKDSZB+^qX>)--O3!T8Q;JN%#XE)d_F`@W2=46;w#{hvQtBEI2+PWbiJct=V(jkz3< ztV5SP4bD(s7RgW%XbPUU%42=|0j5N1;Q_ziPw})Q03I@H!)v387X98!pv~wrmtY>{ zkJL%cBUP&KzzBXg7u>s9aOgro8wx;yF56zcRjc=c3U>w|P{Sgu#9zl{!m zDNj2N<)!^Co}XE+5uLSWj+N_<{BfRbnB?&4N~g=}w9otE#k+S!Rv)U5<7u+vIeVpl z!zcOU$|sF(@-15b`;1OS%#*|OjQ0@1}pOL0ou zFZSk6%-?inAWFyj*`c4T$b9JmyK8T!f12K`<*F-|$7S?;-rf^^wX0-Lp5}LKe{m5v zv!O$VZF<%{*So8D-;KhdprwB18-qs$=PyR0g`1sfXTGcc%;VsYma5j9_uiC;R}byk zsXT|dSHJ=0??!D(rXiTCngLoL9hpptL zVJEzlHj-)Ryx=818V~f_e}3?GETW*;+{})k$W)fMG|31FboT4e%3(TZ&Rv(aKhD~Z zYyqFSV%)H~7*IcX`ZNbMvRb6)V)EmI`~=zNl!<-|#pT8OZs>>W8vdH28qB65l=elg zRp#eD&E4y&kH5c)+xC3vs{E_M^$+wPC&M?M#nRCGbARB;y3X`#32iCD%;Jeq&w(H$tho8MBWz8^xs(n#2$$QQVW25AbysOG1ua+q(%-dTX6E6I;vvWhd z*7~zQpWlZVZ&%LI59=OXU;L@g+_CuJym^Q2U96G_Y;6CufYr4(N9)wDbqmf5HgZeI z&lBF{_T~HI^e0KtZr6R|HVAoTKiI{F8=3!oRr& zqXw*AxdWOsgVva0`cmMe!w*qAA$a8i?fmy8kToDUi06Tczuf&-wd{2qh#lY!iqGQV zDH2q05{4qrC7ctC#c^pa0dmfTy$>o*b9pLT|QjAcn0#0y? zVvGt$GJpQ7S2pR3GN4$@fp$js@bkqJ1C;p@@*2j_uG!N?JS@iz;?VeG3&iB&x{+elg zqq6=JS*L#QO>d6t`7QX;rKf;j6ruaYT`+UId)vIT6UGP6Fb$0N>B-!6x zn-50B9p%wwTR!?y9}igz4|x)V7cQe6_zLP%?(JoYsx-RHAf7LnnO-e3m;)AU1IrhL zjr}kj8F=e5A}qf-60`jVK*jGNN7OQ}TnCHcn=o6~k29V&efo8m(F+>;z~h70kaXs7 zzfs{gJM;(h@4?hFbFgg%rW*Uv1CZ+*=C=}1VNg8PrQ)zyZx;4SpFDq#Qot!1s$wtk zF3=Os4%UuC-Rk_eL*`@pNv*LrKU+_J%DWlHt#HX*nENVBY;~kbLHL^*(^hK~nin$m zo(tQXvFBMrXXnpPZ_k>k#IO7L*HP*005{8~>s|DM^#SMyU?JmYih z=kEndBW!_J9B0o?no#Fl>)~-`sBf(*04Qaha?kswT^^?Op{Z=Q_^uUnnGGlWtr0%d zH=^<}YqYCs@%Gf6sy&t$5X3NbFDsKS|P%;m)>jSG$b?I$0*q@A}YEe(U{5Bd~ z;hLU2l2L4QT(7{ubZ|qouHYKkq3{|d=Pz$VO_R@!?!}tC;J1y22{lTmTGrLRXx3f& zdssd|y6TAH(1DspUlXm>zKw^E{mlBTIh4kKKYi$P#>%r@b~|~a$R9?>_xBB!_CeUYMl2b*j9*l@${R*_iCtXZ*5gzSKs}s$Y$48FOm`>?%$)5*= z@DwqJxMmXE(6aAllC4oU&v#=h z@zJ;3aO}Ry<0<-T$CfXY?5IxSv#MMJ{j~4mAKli>(J8q<4g4#E?8aP;Ft927BoA<4 zUU?Zg6$lsN6CV_nu7U!WTV1U`o)vcD7IDiQW|UHhubZ)K*H)L)?Vu);<#j(^wG18kV1*A9+frK-nE5{L7dV61#zr-J6TVUFLG{ zvPI>L>TK4cMQ=LXdWnT6EGEW*nHLBj|G>-<+%nKUy#9LMoR10ue;wGUujMeoxi*vk z>(WwomT|_3>CU;9ja^=A^Gpm@`w9xKpJ#18a=k-=GsNtnNz12`idP0pT~%*qPMyJ7 zaLM*!mzmpLb<>JybL*iyFJ@q;F0d?-#B2iN9sh->fk|2$P5c z{<|Rw=Bf^DU)YS;Cr`ZaPh*C@=Ap6|vr!1KO`fdLJ6g&`o*0fY5l2kzqjN^$AK1%{?FNeHZcYe2IMgX5Xg}&WWlyjg^o1(Hw2u z;%QLkxxdZFVFvFyp3%A#_+#b0tdHkkuXk2A=VADxEe>DaPDE47b#+j$U%Fis!)BHW z)I1vIe0rcCTZTPH;xd7YrH(O=+A=+E#n0|09%@1x@Dj`J3&!|izf=ONKe`R0Ki*lR zQrHZdr47Wn7`W#2fuT_@q0npBM>B=a<$pEE!Y(KaOHA2dYQW=M3^@_J>ISU(7C;UM zwZ@E*Kckj7h(zUT{PN`jSlf2#rh7-6FGWTY*~?~Vz!tPL6{Lsxh9rX690p)HKtkOy4#lbGlYpKM`8^uM8Am@G{h8v_Cx%Q)3;PaO z@L&=S#>&z$>8`&5TCUanYIvy{wBCN&lqq)Wo*rjy+m`5SGFtYKH%Q5sBi2c3SNe&Y zb{U;Dw!eR}Q4;~_VhJvGsK!w=mE_Khe-P_fc5(n#mdUFxgD0H;E*{ONl4ZR(*GfuW7#~<*L)IMRKO*5`?i9DT;;l^Nu0Jb2 zI&))i3$P!to{zfbl}68JfHoLYIr=loG;2NNmu~$ZHmS?AwSG#Ny!4FzYb#e4(^WiF z^SpJ%%u#`QXbGE`n-$`4_=|;q27}W6kXR}oT90@SHCg z(r?19D|7>=FgeEw&Xbgrz}X1Z*|Hf59SH@rffFnSiByP$7 z8vUiwQwoDwha0!>kg3AyIy}T$Py1P#z zo8K`H>nLrffi6J^*>r)|_YluN)V}vtbhIeuGT^F-;tlP@%OZFR#Tg*dtEIDnM>xV8 z{UydRe~#OPa^&FqU}PujGNOpK;cC6hC?5_wO^rr|dbChpnN#zXpKtfqOe9v;0 z;H-zBBLu1l*YxvXGyLD!ZCCiR$rk#xtK9XHd~K(C_4@R`_tBl)#OeBIv8*H@v*XuX zZtL1%xd5Aa7^G2$7=p?4GPFCpV7-gRu=VxiXV z8Z93lsGccFSQ))knuvEZ&{1GBg2*;Qxa$KDV;Cbg%VAqv<-`f;@mE#;A>)h;LMV;K zUO-0(uSy@KKW!NhQ%X~i?@MQ=2lmUxI2D)94EEA{Yy|5cnG7uSP)T4Jw0};V9$fJp zyr(Yg%e;i|G(#!cEDvbJ3^*<|Dma20K?zrfMjV5@i^_-NA3^p|#p?6;7YohWvVB6T zus|}~l7sJNICii49TvMJfGaxsyPuE3p<8AM{@Slb=LoS>K#?O37j#DUp~qovR#ecu zdprEb);@G;`!O470bH*fP*VlvH+K@D0O39tASJQ{=kDZVd~^^AA*j5g{Bg0A)jUk% zFF=YLX1f$D?2ySQLjx+2c74KLZSr*cg*dKPGHz_HQkh~vzp+kTw_v5>16 zcRWDn7ixcL+m# zDWrW`RIxfNzRS^~fSCOfOR;<{@R3ttLXr!QQHXRJM z@xJqQ9_WU*fI$i?D)K_ZXil(>Al9MyP>S<@f7FCIKQTF>j0cq2z~Pq7zY7vKcrIe+ zj+PY8bGXgo;*-Aw3YY*`8N_XXBBm|$^2<&y$p%-)%-Z@onDO9&+L8AvvAMBEF&n@) zBpRnB8Q#Rhxjs$=9b7P{HSBqh>(<;vu2UYw=HD`m5X600otNf=OkW=zL8GDZPV=-ZAAzVc_=A z_#M#1S!^5N=q^$?u@e6h%UvvRQ|WtNq;ExRUsyL2mI|&oxF76ft{z$u6-28=rKPu& zuRm@;Z+#i0SqM(5J6tQp^d7q!o1C39{|zxUJ5zk(77Lu5I3vL7%AD|jSWRzDJzC`6 zE}m;wA|aeu&8up+tVBXYg3W^u80yVjH{D0D|CnX!GAsoK#cO_gm3sSl8S--I>-``u z5$y|Wsl}sHRtw`{=3)2T4II5PQQcc0pF)hp%-sAUs82|CtHFT)9huNc?17-Z@w&Bw zSN0?5m=Kz8`0?Wg*0cAay2W?8QDh+r8Y^noyLDVEo&ei~J_tAV*5-lf0YUYf_!SIw zn1c?}>|LU3-W`d$y@zc|3G4LSjy3yds%TGEzi2Us^NyapdVH#y{mL!Yhi=V0J+~x5 zD6#sO%(_`MTL54qTa+tf^LE`7PF{B`wF#_RHP$HjOc+C^b{+7%eVdI2cSGF;Warls z#6ez)SY&Yb06BK!H!^aNJ=G-uqT7n$yII)(rh*(%QwSJ_eljr~C@ZyCSZUc3e%2^I3kzu*z)tz^Ezyo`zN)6L5b%<#pOsY+HqC zEo}xtLXlY=qpC&2%kXhN0AJa&cnl!Bea3PKjV{LsUzcGz=9rR}h99xffy3uE*kKJ& zZ_Ys{_73C6GP#XPAmSn(JxNY3fHpV1%6o0^6NHJJin=)zH5+yyzR%h}x&KE$8MwKZ zKF}uKJt{ zsF#daF9?1p1Jsr>Ee7uYM%XzaHisTxIiVWLw(s4#@2=bgPyY`#Ae;*JU5LWTTOOh*S-B%afKMjR&ZiAqB=myPLSQ`RIwRAcYb>NG!Ko zJ5g=BU%QrrC1u=XP%GTUJRzWJj(bYq9kmv?da{>xznphW**NjwOjJ4opl`VO`}2&> z)ZTcs_Spsm-~=ik#<^1RYH|36=capBO|X!5{WxvSq3910%Z^Vfd^BOtsuIT~2VGxH z&EpcXv;ShcWT5$|w|0sBa*2xdok>z}6JB_Imy3|xw!Mi7PM6>{Ys?A^E z#?|VBBfB5yRM+p{1!#G2Dk(B72ci!#%7!^O%|fA1X#w8Ag;onp5a^L+UER0{N&bvO$fNUQiZZ!vQ zIuE=-=3JC5g1*RRELE88-!C*qK8&h_d<#Dv9!xsS4jd4XkJN^+;w%UcTmvqF!!c#C zvhxfCLx=E!b>$H-@=(n_!SX5y zh*)KMjr}-R@TMObCUMLudQ&Q7+>Ms@E4n=@z-P=n{oGtgOgV3+;0ZXcsJc59qhPA8 zuJ(f-YRfz)Fevs+<>D#;&2}Fx32zpMveSH^_Wx}fG&W5vc@kQ-wr;|zXKc<=NxA17 zC+sc zgTg5Rk1stBy%>Fz}!tHqe@o;{&gADA6UFi1~9-BIW05C zw?xHaK-T&S>=+9Qj^X^b<{SV$i|{ur@?*DIqYNts7(HIaD3O?zI5$vDlcJSs&|$~R zb3N_1oPw~Zv6;Hd!}hOP9uY$E=x;!>n)ZVMTqP#{mr=S)0);TJY_sFXJ+LCcz}}&D zIgP4f3BWgiNb>+1$_Bxn2?J%;X&AdfJ!I8bzKPQ1leJ-?kII44)IR2{mp@HT-i*qM z-X6}n2C978GDafEp^SBFC#(eXK?or#_t+w`5aPgOIwHg$rS)B%7AX*f&APwjabr0f zX+gcYMG83|YgIxD3K)kl#memA9au)ds_ISZzR>25H3D-{i&!JrQVWkx)0W05v}@P9 z@K}B3P4E`4jj`hfUHX42t#2M2{W{PSP-12uF*TeQG}z_p%kMZ0oUmIM_~GE%X1N`H za(7BjYX+A5xpP<3Jxu5tulF=LH#_~pD|~V7gToR-4k3r?{-&K!`k5SP)M2;xui}Z+ zG^v{P@o!hW!6;G;LZoPD^}&YN-kkCR%-J?5W>=B^ZKS|-RAz+-6XDUlHA3fxh9*Sh z^&bP?TLp6H!vhAztxF(+6iD)#=|9unFcQ+92T00} zs(lib$=fdx{Ph=^c99ef5RC|(E`E{-*4Vzi5|xWClz%JaHUYzFL%#qS-Dw7nQyQKe zlfIO~$g~fzV{!2v^akJbt1ipM$JK)d3}cXx<}fCXj*m-9RYL054nZxKBuG>^&GA`L zH0>u@Ub3LUS`I1VHAqX4`j_iR3-rzlp;k>gebDxJ>%e&@HDehhTuE6C))d>D8#uuk zGzJc&1Me)*P0i#BqHxhjau|8k07NC|>0~RX;d5e22Vve8a96AC-zr67p~6oycLxBV z7VMN%qE~(I+@kj0$*<4Esa1s3Y@`EA7y&4jN;z~~$<|a9dX@NV>_Owhj}{4gD276G zsRi1{)##W>?9$bRMDTGJ%CSZ^=F>j#7A?tq=whPA5M8t8odf5wSx}h)a(W2I9a3@Z zKTeP(8R>#RB+tK8!U`w|$MoqH*r@Kq=50Xf1lKydqwS3d6OP|r&j;5{3#%Iy2oc*O z8;?WZ?CJ2kt55pYoFN@X+_h?eb7Qh7u5Z$98ZVHTI>_p%WQ$2Gd5vqM>X0QQvT><{ zNihuk4@M?#l$3-;u99LjtBC_8T@~y?eLOt{7?Bp4l=isvUO4z3W~7~L*ipBm#}+H` zU%MG{FYAKMi-C+I#;#E6e{X)x-JNvhPdj3E^N$vy-xB^F23362d=)3uPFDFX!c z9h&M7&Miyu@Rdja7eYgAko17^9SNYU7Dtr;l@okKDf%}v%m!xd5rUOE)F*eM6@&<& z8Oe|hUBs!_@>+2=*%sLx1RhlZ>E(KA|->kze0l<^eg`fwzzmiNRTE0iB@&TT;5|CywGPYXHKN3BD2w#Ml8l zQ)xrr%{CWQ=l~JVO>BBUm8j65=FcYWKojvOcmzM~v-J{T%ABBPg zo-(7DJn}NB#BByYzGAjN@c7pl^h2$Qq-A$BH!Q`vMLbNz$=y>b_<~E(!Nh1h5wa+I zbA0eRrG;i=r11u%ZS3+g9jhfB;B@0roOPQEa6*!gTWeJ@;D|+@H z>DcH!*|*_;rtd$2MCO9ZsZ4hU_MJHL1TIlH0qb>pWP>T{;&Pl)lA-@r5(p_B3Dp0) z&|XLZsb-Y!IawCdfo^1U=P#k}X%Mnx z;EWiHgcbw1?aeztQn433?b%nkXnR%ite^Xz7f5ohc ztcGkRQg&w6F_F@yfVv{`1Vv)p1=%;e4t`n~B!wd|BJgGSQK=rrHzrRwFITE&7W8-iT#j0ASX!aP7ex=qwohaPIsr!KcQMKt=Z$j@EFwlF}!-=>vW5WIL%dojR3*8p2Zk?Kg)X@4Y(QI7u8m zVEwr?5^UdinZv)ds0u({G?crw5hda5!rXG&R>Blj8<;F!hXtJ~Sr%@}H;e@C!1E19 z_z*@>6nnGliR~6h9%&8FU~Us|$$;A%K5I!sSl#iXVIugW$Jo^ePeWKP|hrGX&tR>*aFm~s&y3t!%gNPddGBdz+ z3!E~@W9b9(t43)Bn>#kdmwiD{{3Wj#G%Tc~Mmo>X86<^R%tG@V?rlSdXZiO5+Xo1Q zliWRiCAbWqU;twP(R0$JXWXzMS&J|_4RNlp_^3ow7fKERE4UBY-WU0Rx>L%Ec(-D&+DB zNVTenplU4wSS(qGx@o7_n5nC&(Gj9xgm;OCDh5M@H*{3rR3T^Y#@ngFch7)GafFWX zCIl?<5dY9|V(g80#^P^DJq=;vyOJG?)y0lCVniaYB)AI(`9q+{Ox+PfmljTdO!RiG zlf)R3Pw^Br@gy^d?{Lp$a;lPpzlx}H1 zdLUm&GQDJ-=m^=mq@#8E$hhRff=P$cl#5Txk~-Wl|B(*_OZ_mjA=y8&x+V#9n=0^zm~=xLVA)xB zp<9oUB`OQJ258`WxIrd?!Vm7mauE^4<|XHVo?<$EkEAZKjs|;^?^M!Y{_y}AJyz}N z99+EY#!rqld&x`+CA=P1Rbeh@h#^A_KG%-OZyJaPB%ww>0}!5HsqI#zZ3LQfQZ$8| zSdPQ3ZRAw-`tB++Bp(wvb2V-UKOf$s28cDdR*+%E&F99=@1R-$y^-~g_X&vkKJ?W> ziW^m>nH0Il!ong77lTZnakP+zMt4DY7KIi$5mbn-?nL&dGlK`yhuRrM)px*f+F-?@ zoP4up0_$T0mLyHF(_VozM9GVs4p3E@tL~A8tM6@mOjNU~^mTBT4x=l>tGNX;8gxFr zkP`4?1lnAUV_vF%5Aqkq5dJWZBz{xCr(*_Cu!r1xhP7+`5WT0(nPD79WmC(~U`agd4MU z4x_7V!%>%fyas`29^6Bbh5So5{L>1(TTE2RVFz!-8UPP{P)g)XB9O>I6@zC>-WqrZ z%c#hl#tJe)*`IXa%|EM5UhKxtBr6J>*5d4)|4f@YbthcK-aGr{l36&&yRZ&;?{Mvn z(|3PMI4sg=+JF4Dd_(*OR^Ur70=O$vdTl_q=heZhrUn61?J}GZ65MQfiX}Gjtzw4H zq8jJmuZ7IkwpUT=iG=VfU3#-jXQv2-c4=(pj>`+}_Z2<22;LcwBqhiu2m z!XzUSRo#41?N>;?O$(uudi+KA6>qam|8xjGfB!}SaA9HhQ-v(XRQK%2`gXc#f5;Y-%%^a4Zqq$6o->vn zS7O610_pKEDjGZcuaApAMxg8?m0E~)3*w!KV5tkzlQFoKfbkC@rBGfb4@a;lsMy7G z^IU<56NNWTYLoP(QS8OSngP~G`XnT*7&)JtJBl=jfgj@JZp5TT@4?2&eJy3VcsD4g zFXLE?#8xra1A1DQ$y*6B3y^h|Z1#dbp3#>Zd`&4(u!x0T^{?*k# zF@igc7(nF?llIs@G$hrS=-?oXd9$uQfD&H*R96Uk-iIJN;;wwbox{&5gGEXlhC}ov z+EJTYLGGFULo5?gM#E2otKB`pPz9T>{kiCc^N{edOnRhrzg;h)C6p_Lt2niupn_nie~hA;uRT`P@!Q2rGtV+F(lyH` zAV3UyKzMCCkrQydc3`AI4lbA>uhzb+x_)%XKJV45L-5>Mtxy>VopU_FXtHha@Q^`u zzd9V5g(5LPg)?UgZ5sO+RaQ96UCD-Z>JE(TTAUJ zI6c;QmrREAya{O`7}%ZmSi?>R(ikH+L52TYbF(E*772+4F@}8a z5GSKB`(|Fo+2gURU zf+Wc405`xQ@x%7!CM&!n7?QvvYfbR}Vzj60z>J29%nr<>DC63kMq`bm@P-22FbW&G zPUz>!g#d3u5K0nw8`UWOc0@MGW42p`za=|m#sTW(OaK=TaL8NH8jW4_Y*Fk&Fxd^Z zA2?==iN-QG2m#Tvx`P-Z1SSbqyr~|`7BNn-*`R)HoDefJ#lrw7$dp45 z`2t1p3OTtC4gsof=*9H4gR_4MFD3!mC>GDX4K%UVc|%2O-zo}YtM?ob|9`&@96UCm zSJ%cO3&gT1LNzSmUVmv9?pXx{b7LvNf}g+~uxUt>r25UsqBn>m0)`>a9|qz%lwENd z!~DHS(mGgY#nHxHb=HP;Ze{w(<4K3gP+`mlH=U|TWT0>5f&3G)y`Z$uw2+9{1bIPH zi(C(I?>h>U0mHoN&t3T(AO<8wby1>g!!;YYk``HNJuy>#Y@Av?h62e3lNTODOt0Oz zp^KC>_D*u}PGS+$N#Pan00j>E5`}%R++ngOG=fi0(NCzTQIRZ?uqDsU5Mk_>JaIVq&EXULUN7vPeB!kJz1r>iAML=L)INgzG z)ciH=x1ft$3M(q)2AFStMzsr9Wf{UMNTs@!_oEu>7N`V>kr#m|J{7BB9U40lyhRfk zi;kJOH@5+=a6Z5tv#NXkn9eX&21xZyR!~hLSFf?xl7?oU00=7tcYq+O5gNCdL(7W7Sr2m)iZCPLJV5P)ESfb)XL)JUThIu zznPo#BDPXJNtPVBQY=@6U5^c=&iyJ{MpX?N(jlyh%F6D>tCb4=zJ@w?08Er(I^0G# zKn|XILqsvWn^FQq5ba2f9Ave_jHWUxi1abn*)*v92hw$&3rLsqA#7<3pX@tN)@>vX z%zPD%ty}T7@FqFUaV3CM1wfS~XKUu_QixVh=9mY@9Hh=8PqvnefJuzfY*X8Z#K=}& zVN^HdmbbP1(zLlVYVa;%5p?mwkCL+%^&;db4@iYkKmR@p5l9ze@MAVSI^<}CN*lHM zL--59#9{$Dhf>BOgEdry!hW>BADDN{7B3;_Y#-uWfCT>$J)`U$aumi6^G;Oy5Ld-5 zV7VG!Epfvau$hO`g=)S0x_IVt#I_2#HO0_O9~l{;PsGTg%O-)i0)#*VFyEcPKpu`ITI;X0i4_Bz7<61=W~4RA!txslI7b8%E8Qur;xiFG+!*b~MPrz#`=9 zxH_}3c0qO~z9XNDK9C70A%+Y#MR&th^+{caQ_BOlb!fOgbo93;i~nC)EN6-;`=i8X zIk#LMD0IVpLlmD`Q*t6pU{P3D7y9|tju<}(1Z{hy>|-1Q zazFxIGYu9EIAC7DIS`)Ult8v578fyI5rgJ6y1)u^52XlHm+k(R_sRfO?TF-o*@5MA z{?A0)Bm)$Z3I_rWYl+eF|33f=0=3_aUY)FkT-MvV(O5f6YlOmgWt-CSFLj zQ;Hym*w0SwtC-s_e}wEeU4@C}IFFw{9uEp>NISy5LEyEoc)YKP6CqL&Izi41%{sl40u3*$B9Akz7>CD-jhCeFs== zlo1@3%E8pd`)a`wivtkd3iBWuz#x9Tq)kfbyTCRe5N~IG`X~AiiYh894!Ft08>fci z@yFtVgYg1iKuj;9;TK&UZyJxivR3LW0eEMb zfM<7zxkE3llG^ZF$6nDca7e0g3#qKC5VcVuUje$SU~~Cv+KPcrVVJQ0GF5dr0OVte z6&Nhm-|vN!3sa#YeaRK>Pbe%X*bIBxAp z{Z?Mj3kAG`I%5wO^$5sTi6e<0plAe)`(g4y)h6;t6*FF8=OjT?QkL(3^aK=v3@K!74(sf*; z=h1`P*gV0rjYL+09SI-#TsUI?f()3)zgQG7oHk$>Ffqs1d-~xB1!Ba6XrRyEZTL_O z%%szpjtLgM6LL^N@+8RLwIW^m>~6H9xgrz;)hSdUvZA+)tT8!L;=swf8$pRiX?WIn zd8hF6(beq2goUv>m)k@%E@(lK(~HUJZ}aJ@vhRdd6xiBYDEGC|g^=q5Alf#(?TCt} zd+Ft2aRq7b>2TLlasbDYwGxU|0*}e#q)q0;Xa5=t}GWEJ^r7Iq4wnA>#v&**D6jAhn7iH-frTgP*gb zS@s!-++eqC1H1+fXbtry3@gz`=-~bAXy%@cb`Ai48_ua7lt!6v1D()75Mq*m`%p#(K1;6i zn0+3SUsc!i_P!~i`GLQU_u*b@TF=c#ZXE1;8a`OwuR^lu#h`KwbYhtk;*17h_}d9Y zYs^m!FlEw*xI*Ux94iID0zn(0(tV^6nMRe`*?lt5zq0%s1hL*2Ne!gBC;t! z1IU#KSJ4M1X}DM+z=wn7?DHKApMxB`3w;J5&=sPbv`?}+LqcALJk24sO8yjM<>reQm~rN%ZYUv)FC+Zjq`Qg{few`r9d*p;BhsNm%zz0G0?Wus z7W`@&8YAKQj6V5PUp7D66JatJz%JMGCt!eQ|%X=LadB(MP0$ zgV;{o806cnsBv2{<}JfV+z}~z39n)~CcS8~YEZwJ%NMw#x}-WE-LV(Y5xPG?ei&{* ztiBIT6Iq-)q4p-24u?NL^UWN<6b57@zi1JZpfrK_k^^%ZkQ#(JxR!hfK@Nn`-#cja z{O{Wl#0~tP5H6J1)R6%h5|xqJgmOovx=~@eY%mI@{ty!pWa^mY@-C2MB)h z!}WhAvRr@UiJWh|Lw!APjh%?>)W5~Y&tPYXC!$_nEgFF6H4{0=mBP|(xqJU%G@(|2|=<(y$S1>7Gw18LEMg^KB2IQKJfqNjH1^qmz z=5M#8a9^kw$2m)E?^8<)=SMS&ocr#-PH{SOWl3FCU5A0ow;MOxWiaU!lWlR#+dkDG z^Q@?LzDd!SxZ>FpP8NALw`Db_I;Fc=bQcbRNzh=5elbYrh%w-6HbFJ92 zW5)po2YdPnH7`{%@Rw^rtddv(1P3^$=w6NuEWqeAWRVhEGzkC1;K#F zD9p~)QhWeljF6nB{XlVc0oVZN@DYZsR235m1h;iZ$2MKmfqtb$wm3n0I5WMkSHu_A z*Vj8}-b$?NK-hQ(TnlZQ(6^%8`Tj74h)1Pa3m-w0>k&9V(SYjlygasBewvMu7#W5k z`Bo#PAV|7nnV=N{vs5SEQFd{rCk9|+7c%+(51F;JsB z#+0#B!Evt)+d7wdT`YqGTDOlhi_{gxE*d#8I_mnMZ&{I(r2X6wCH1G4L#;297rwJU za+%}w!7|IVqJ7~?U)z@EnXbLB+TNJ8KKc1=|F;=RtF9YT^9UeAvjjN=awzW*^@*E9 z6|3wEw15l;WC|{?9l1|{BVocZbEY1uDY#wvrh<1w<77++7>+`b1ocxuPuJmD%@;TM zh*MGrIOy})o*i&(&<5PL4tLas*cufWn0a z=RI=u`yPBvwN>e<)i3Jtf1BF3^ZWe`gC|7I>#LOArh5bT%{Li{ZJZ`<*VJ~(DKJppvt z0Lk?@5^kejpMv>@6IFk zcpy#H86Ij9EX#%JN>rfx*`)x}5>%FCik!N)Zxuu}Z-ZpW_uDw?FCjI|3UmZI2xd}XhE~YQl^#n5D~C+3Q1SQ#E>bSVaUsb_@=a!d zL$uh)SS!$3V3liKaK8uHC@)rWBJ=SyFyC5(R@R{I8%9+|G(%>hBjAR_7YicxSYb%t zdGu;u+op{B;Wzeb=W}`Y*?jK`Q0lnySK?4h%CUjOgvh;oinLcQ?mge5kK; z9^YBIyTYl71N9~`0Gx-qH~Y$VPeu8i$ADo^bHSY>kLSLQIs@v$@v!aC)RvJiD|$na zd-SQ=!GG0<-aD(8lGrm;CKn3zQ`CI`5TcqLLPS_ zTX6!`8ha-#)w=fx3Fk1%1gflCdAau`?5>2&G%DI^1~YN3ql;`AeuK@w?$;yb1I|aZ zGP*VMe|4D-pXTm62f-B}|1+AYS$#@N!Wljw-w^>T+ECDX@X$&{pG%D_S|ojBCpLtn99njQ zAM??Ha|Rg(W{wP6Q!vG`1It6}$6@b|ushvfM~~+wn(BTJsZBC14E`}Xs`Xc-$Z2Jd zlxMg3ck2rq)X-#d=DHQ?QQ-qHtgxoWmw!2afDDMU!0gQ#;#6uOmVA1F7Fm&}JCar_ zZwfJ)+fj*D0&d(MX_1Q7mJTZ_YERH^(a)X)(F~(bO=v3bj5o=k%CRf{4jO6dFfh4@ z!GI+iuy=s6OJ?h%K;(KI7!Fez6FFo_VufZQOnm9HFx=LtuB4r76(@h z424*1z8wZ2U7Kj>!654tjLgAd`JSKbiU(M@5TgB+nDD_fSb#CR<1{X`j?Z9N6Aae( z^bX(=ker)ZTcatLAbCp%?x3%qo}P|NE<85Rcdh${s@e+08jylJm@m<|iy?>%UWZ|4 z6l!$r*$1J#v5;@RwKwzZ9xUjm!DuiJX}$Zij4liq$WtBj`Z021!>0bq;*u+^3QO9} zite55klC*PQgH7gwe6*6ABT0Oq|Lv5)SbohdzIc<=!gz;J|?|j79+5{p}vGO?_lB> zLa~SF2SlPYPJIew5{Y&-ZjoZ!=ZtiMi?Fv><)C@jU)GkS5yHXtqYfd$-tHqR31kS< zR(MMpFkk?{o6T5bfc$Sb`mk1D7cnLoX%JXCkSJH}Gx!%L3tR=p)Gt-IW_2y?jZ)5L zrgoFq%W&eya_wfbEEHwlk|(x3PuzcfBrn@?~95o*7mWn##0TXH?pY)1?hEeZZ7WQPC&j?Mx&Lj5Z$vM?XXi%i3~jy z9C&(X#Dl;mrhx!eoYavHyuEko%QO)Y5m79$;ieLc5vZHFe0v%VZNR|BaDW=C)}T6R z&^0L_G477h+9DNlHUjXbF9Y-7PC&re$lqpf{~PUmXHjzx3x)XN4U*4!zi93~H~fCJ zMP`I#|F-@W5fAYQMT1V?G8V-fz-00r+3*4jXX=9)V+mwFX#bB9Eolhn1j|i;FzWEZ z6vf9OZk^AH(qYx_AXP_!en$;2!@F!sLEtF@mKmSXAAmV9wUM3&kOs(;`RIqI>gdv( zn!Gj>AAopZhrPqVLm={BfSi3q>z%q^aIvxiz)rI}3{a2CvvWqE4nYm;jXM3vm>K2< z9`C;9;t3LGepS_R%d6?94jMjPwv9*mU}m+2l;I?nYivWYeUl*}0kBqyrM?JeZOkB) zcOpZd8HmT4MpJWhBpJ^#sCUB`5D4PN`N$DEBe${r(TZ}e8p?A%%d{3FJ-)U|f^XJl zaMGFCG{Dm5WCe`n^bnkQ_05~fLsmmWLozrVRm2L+q4C}{6Gc{oK#F_16XV*oF3dpvqnF3}!7T`v2ABt9d~h5& zf!uZL&-UEJKBpc?fAroh79q`0qK8~73I=WBx!|xN#4qYtC~Ff!WM9O>IB0&Tw!W2nazasR8%&#&A{_ z2;95yVgOz*M~|`x@B6FiB%8bvx$8-2x1^+DrhM$)WQ zU!@&S7vK3|VAo{RUVXeG;cMimjS=bs-MAm0Vzg6VAe#;(d;I<5t5e%Q>`|NW)%D}Y zl`+PD)>l2&*^5DF){vdy;lr)+j)OJIiuvhnY)(y$G2SpR^-lUy5kK1X_ww}lm7NQ2 zsx&7PiH|r4b|!(#eY_nowV#9<@b~Q=-Gd4f^GKO`yH53f>^spsylw4Z}Tk zZ6`Dy(};896(1juLjN&9OZr(&%YkN~60yc>Abex- znI96EZ7iz0024ZuV8zqgxRo+?LoWN146)X823KhdRw8#2BDd`2OFBWs3I+|EaT{k9 zW}p^v?5uj38}vceAaRq(QLWm@6MR#mwMM6+&EV+d~me4hnE2tIyTMKa4`OQ5JKbv?xx?rO zs+=GC73VbC_f{w6iSN(!--|Q&q_*vP*xd5jF1)JO-$`tzz-V6qusD;Oi>gvP%xj#U zJgt88DF%O5bj_(tZOSI?To>KEdv$Yb4TpYOwtcpKw%9qUZO8rl!Ref0wnbJuf}U-G zu5POH-{+k!l|NFq0g7WkHuzpkxh`aJM*gAh^w?wVwzqQc{V{y@v*heiz)CAo4jboS z-~(b1Q`RHAFmH>2&=h{bAD|638*7|Nw!>lr6+?vQK zTI(MHt8e?ZU=di!#lL^oC7&4?G(Xn-9)*7SrG#@B%J15n88n#O?0EY0{GAx{uM?8g zt$M+q(%Pf*clL3|j`B9~?lBDjJ5eLXS@+L4fW=j5w*c{mxgez5)8oJpm`Rx17$)?2ORNS0b7lPVy;GG zF)AP`L`Pp!<|bMs2*g;0?*o4-1*~~uc=4a@I{#*-$wXF{C7PzTkEw}dwvIt7CSF8) z*S9Xcw?qb43_yi0YUJXwuOr0zBC6H&e^$N&R)%?qCMxlz#P(pAC;}&+j+}K&H!hvI z*aU~ZrvCHiq-`s(u`X&`WQi$iP2sM!&pQ4pwJrD_iw8R7``6&nPEFM*lSRLke=B}# z6xFawIco`Q#<$?1z8FaWzxTm~d){F}>La85bxO~D4JJ5p9Tmohj83@flIr5*bfwz4 z?^EB)H%6(_iUZBQHw!&fOwp_fQJkDtl1Ko$F_uVUWqe3tb zum-n?6C*PKskk5)*Fj<`W3Vk2V|)wxZ}Ff-rKHB13(xfT;u_EEE%tYH=>siVAtQ7B zh;+K7xtxaLyh4n)N_hmBcjz~Y=ldfm<{O4e9 z2TZZkzgV6Pk#XCOy{2=b>7Pd2;yd4Z7$u&F9r^9#=dH8)uv5-o!~P=qbKTz#miQ-c zxBtGXLZQ<+rn0iQCsF43hj6)`yRBajSdS)%w|`h``mo=EtzZgE;N+KL`;UE7`!qT}6w}?M4p&4StT5xvapoH=CKiIOI-AgiQkd`1k z?LNPpSt;TAjSev6F+^I{qk#vMwI8d&X_$j_$QVzXYOI|^8=(ROaTO>s(&CU34!7*) z_W}%fhEv9W*5J5z>)nkXz3s)&5vhWPAeL|>VDf9prcZ*0;$ts#rz;XL{rygsCmla6 zW9t^@0S$fm=d}d`)fqio&W$;x4y}y!zy{8j>1WK^;xG9{GIwvf+pIs?QkQjM1Zs+t zUm_Kr92T22a2e@8Gcxe3FM7b}xN=2RoqY8p15E_}p`cBu=%T~nR$Je1b1>oH&PA6l zO~Bvr;cW5K{g05D_jY$XEM3}r4LRf6P45fH{24JOn_J3)4&7KO9gROLs9rY4F>r93 zaz&8&Q@xy?t4mHC0N6P2Sa0HKm`CihN_h;D7 zNzZKa<<+&U;p`dNR4^Ftm~&XBQBIaiCW=*dLd!43sC=$nzjMckbB)WQ1mC<}>yDr1 zA0zmiGud{;rNL=fYNGcCp4rLD){s*bk4gtV0*G|hJifnDU1+qg`SkOi8wTgI??*ex z-utm+xt{E%3*}$bTRz@zk#)*{|JG$dd>*PEp@zpEC2(V-vpYbOT9Dk+A*3Hp(x}>k zz@O4_FioTa$_Swki*;I6Q(_3cpwLiZXvk0%C_`{4iib&3?tN$&LLLSo6P`cAP5Uvm zaWRYte)TbEIjE5W0aJr43m{>-({R3d!8p%_A?`5a@n2SB&OHsUO~pKdOO6Wcxm_7N zEU73EC9&b|(Jg^}xBBWt-4e>XIZy2+bNJ^_2Xdm9pe+X0(i{sj%Fv+ zfBZIlzUyfGHydY}p6}U7@5i%c!0A03?)IP_4dh#d#)!)U+3>Vuq|k-LsECqQ+Q;yn zbB{eK6}E0E39Jf!rg-Y$8!eG2?;K^Vmg1J~9ia^?KTJ+q@%by?zck$z|4NFL_J;*VG7Z^>;tto8Xb68Rlq}Q5 zE}9iByT2--yn07-Nmy7#O1M1*L>l6}YLTQ1`0QJVeS;=s>NmWmn-oG%WQ(zD45ZYx z3k=a7dy3LPkAf%K6mvvYXG%Eyj06ojfZ6CGG_Bgv?W$V`zckYDgP^5p5z;zf%VJF2 zHi*YD&8P}UoBV-evJrn-^>YUs2?+^O$0II=y{*|ZcmUSi`p?g6PLB7u-tZy~ipdhM zJGOyfuhdF`!03mc5JZ`PelPt>zW~y8N_k+;5sJk!KDCx4vJBed9CM z;JxZhKaLuYWu|Cd{c>5{?)73WiIFTp2Zx4_Gb?lke+18Dtcr=iD9tx0Qb@Z)?3wLU z?*MSW8O?-FY-lIJA7-rCxtI$RG4?NjnFM6ggHRW|tr5Si%9@qgi$p1I{CYkCO$Zy4 zbVFmCpt3_>%pVQpIJ7n+ni<$_LK9D*Kxy*#R7K=f8VSH$&=DstH2P@l5542WA}=d= z*J|P-*kb22kkUSoYe^$_3RghN!G|$o;{V#g>oVj9jf&Srl<0K~%cL6ZWWBMnQn9FL zJqHI{Utv-sr<6<2_+gnqyU{_ekYA1JtX!G)jrP&Hc_o78llAwQ5+cVrB===GrsUX< zRe8$_S-*73sz^=6J5bhgx0eoxJQ23<{P{(2wpekPFAR-W7-IPDBLb z_Eyl{1Y4+U@wR5m-M6e`K9k5+nrQVwqC;};yT^+JiO1$~`Lz>sOM%y~UoQvYTgZk+ zVkDe|4G~QaWA77<)**oCI)wnne8cP!wN5w43^mq2chJU@(uQ&vWJeU(zQcCXUpIJp zd0}vouVptrR<0lCT&0dWuCl|RYz37^eiS5obJq3@2><+6r)OSkd8jvLQHDd`#NDB> zfU{~@yVt;Y<;H~q$5~kd%Y*bB;~HNvzgEBIK&Vt?A%i=$qK>35!9ZwkwtV|wm; zP9J`W`b~lGYs-os-BfS6P>`UXxnBA3(__gneu@t=0@$}BT)yv4cMx@&l$ z#9^AEffy7$qGC&|k0T5u&oE!n&&NiM=fMyI1 z_5mm|tFuFCl%C)UUL(Z~iPJ$R>-In-F@R*u&IKZbQ7FTCP3iIL0M=&~<66@_R0Da} z1JBzQ^L#zsWw3f)wz@=Kd-S^re=cV5XE8cx~-t{!pdCR_!X*#sFJ8;}_ zkUJsu+tU+{-*arNt@r2D?hr~lF*@ocdn7&B(biSduuJk$XX=<;e;uo%`D+bi4DC%L zEEVzf%;LhL-`f^lzv+b06MM6s?4B($)}g#+`O$G75`WB-ki3)H5%Fw)(ykTar#NDt zl%;65C$5Ore7m>dKxj?(CRVfB?n|tC{K}g~w;sY^T6FEt+SmIG1=K@xPD{0ScSj3{ zgdQ4ld)nb7A16@FdwbqW%$~bha9WVRo9y#6Iow+SQ&-cPbzZ`6*_bc4`0B<*MWFF zU8)(dkoveSXHycfM4$?*5%j7t!Vr_N9F8Dpewg8<`O$zbSquP#($HpXw#z|lOb=CK zu^lu(RO20$_%%73A*Tj&yQzPfN7jJ)N?b^PohYj#ikYQC1e<7XC< z^MLKJ7AT{hwFQQm=XNW4hg4{*vuP$BQ?IkNRL-z!zR6ouEj~28E#4ptEy3CgIXTXw zUe+zvrTd?vd$Kz|K0T1%`#MBZSgcp;n$`NV#oYSr*|bf0VPJ=10{8N-H|nNz55N8ksHBuv+gVMI=k08Hv=llan)mq{1I^Tyw}W2D22cXtg`zA-?L*p*al3)~5FMM~Hd|kNT1>V`+r( z@vj^)>BeL0z+YAis%oQXV;ClQ(DvF!$Q5dhhv#RXaRxX*bLETf%IrsG69@&O?*6v$n>wZ1UT42@fFww1eo$nX6?3U9)P$%sVnMZ`Vj69}fML!m;=pa{NCEOO1!i6Am-?eXd zQy}I9?bI5y6JoP(Ub=J%oH%+9;SlX(wLxQGk%_Fm^V5GRmV${Tu^c9<&FFYr2b22v z_pAkJSIJBTSVX2K7{BizknA#U?uoi#ym7Ju!6h|ABLM>a4&$;pk&6HCplYh>m!4uG zy!yfirbRc2wi!3%(){#=Rowc#dZ6%uPxpBFitgVs5ndOH4Q@KzExViIkx8l5>o`78 z3r6SU)P=*BjM=NKtck*4KLp;?+QxT0FdsAlG^5$5QcbJvaH7eqgxrYs-rS%GUz)fK z11$9FJ&NfEb=c7z0*Iu`A?L-0U;>?w3Yr7ddqkTcJa!?XhlzpUdQN50}Xn?X0ekZ`@|^DYvGy z-Alj4^lduBM@&Oz#)K)l$0O*DZ85Le0DLm_qf?J?_W(0E7z|S=4%zVxZ!`vdqD!Qq zhk#bsE(F@1PFyh>Sb=8rbam>JJNQRrcY|s@yl_54j!hF>E}cCR`9U)(N{A6?;QqE!(0BtC$t3YuVRgL5}3uuP_OA~U) zCVyU4wyK(6y64wlDJEasgA&=aKin-^_dVTIcx_Qpy9P>y3jwSbCr_Yj>G&=Z@y+8CsrR9t z??-X^7)qt7s)@B6J_lS9*77uQjEI9tT>sA!Xz9liqXovjz83a4>+y?eN)OnT;?HM0 zroEUU@}jP?EvBg$t477rmA#g&vsqshP}07o@U&{FU%JT$n>SxgZ8>m*=i?;3Z1gneN@ydjRAEGgY+k5QtI*Z}r65L|>70OMs}6_e z9Y!S8)X7Kx0oc}b>brPrL@F)9V^^keU{DeyF2)f%ancLJb0kOa_#oYlSJheZ;Ch4W zq;s5Mj=`qqy}L{!rn6}#WA7h~Sqq%s(&u7-egEE99c9rADtxt>%=_H;{3D$)8oas1 z_s#LjP;EfU8#6FOBtN|H{1p(hF$g;U-}rD{0^2?lG&0zix^1=D5!@lb5w01gd zU6_zF_sY^mKhCI{m8~c^QPIFD<;j9?=A|&a@E0@5>rfiw$^Wilk-`@}JJWa&mzt<2 za&N%5+K15$qC@a+qi|?7E~7yZ^x`l#Do0&nyiIG>Dd>!WK$U&_=!2Pv{#dgJ#XP+! z5@S3DtAtALW@~B4-EMP5cn#6aErvWsp>|R z1u%hEX3gh+*F<=ugmlng%=)r0e)&a<%qBjyyi*Vjaw@bz{$;=Xb9FB(g)*9Dhy4q& z#eZ`a_eYE>4B+7l2@9*4CQrRC>RzMQbU;t#7mH856m7&0*?zw z1|(GNx~bA_C(#r>zbY6vlD;C^PYz^IdWJBC--^EAC+VJGML;f2`0^)gIdd0co$EoIJ!o8DRKcOGn;I=DR8dXm^;qL)d^t1oQ(yq+r-4IE zzH5#R_B|`8c`@G2;!&pJRTe3|Ts3|EK42VfFTAzca9k$A8A8MWK;B9&{2%yPr5$gW z6OZ8s0vG63i6Xu~g48TT#`!R^QfbwI>(~zuguEyc(qcL%%l=b-zQVRM4JrHIZ0LX# zqw_;*3`Tl-M(Z%7;%tt&3$mM{SyKpCx{IRp#4P zq_@FRQR<Hjhe=u&**z!HeCfaXM=g##9(odyM<3ukj z_K=f=u|0W0k><#AiW~!yU5(gQ2@OSm>5iUu`12rD`>dl??9_I_-4U~`hs-$zXAE_d z5|Z5W9zD#btW!pONzy5e<%QnX(0L#bCJ7%FsC#HK8g@ap z<0EzyBj_ixgnS+_bO3gRW{Hr#o{&8X%~C)osFjg03{mM8P)39>AjooPdJd*8vP)NH z3|tR6r+{|Di0wzZm$}6_!c&?yfGHY5K{YXvdkZ+OlN3h)BLwoKf4o{Ui+85z>lZI} z;yhPEDD^w6H(A}b21~-*=kI4cv*>YW{jOv0Q(oTPEmIV5Bw#U5L7s|x`Z|v>voK?u z_n8WL(PrKkhl^4QUImmq%Ee!Ni01X#FnK;34)qcO5p5JrI3@$;KQOo)H>Bp4a2 zgRE3RdJQKSCm7}kL+3#?GMc0=?YFuz`aY}6jz{7;1KsY0IBqJbZ-u9W1Hnl&AIQ(J zC(|qsy}3xb(dhR3qtHiKJ#M76%J_dFCLSS%nYHNtBNO4Z5{~1kd&7;>Gh5PLPHLzI zObC8#3Hawro=lDGJon)WnM1Aol`{52=fwImGMi1xQ_92@b|ah2pp&{xSWgF8xEhiK zJCFi@U!PP30(L5V32CU1#td;-TVSIn|EIv2u8CQ#tpwj@SHt*oIwH6hl-rStUTc)1VfwNER1jkJk|cdS11 z^k&0+K4mX69{=?TUp0D9EB8Il+`)cOX;g3ffvh7U{i>sS5=%2i(+dZ#q%$$(&b6Ji zW#op==h&izpil`F7`$7g{(BNt&~R15zXN?Jh}RC%L5@WP&Kmn!BI(%w2&3QJlBW6B zmchxc5)X|o+IX|x`y{72boIy(2FNey57Ftyq>2ax&m&;W$0)fFe{a)x$%R3S+p2sd zl|pCy4iuf3UOZ{5*JOw(OaV+oVQ5$beHYIuo+0u$>3U^%D zqW0}_H*4@BsV%gGPxT$f=7(~JQMpFL`T)jJIq<4|pjb-91qdmjj{&Suf>E3{!!IRI ztf?pf)7K&n(RH<6x2M7~DVSogC&f1 zFymxiS-u(ngZt{w)jm7XECT2p0jW+tK!1-UOoOV{W9iR+bmvdKyLS-?FB9vQA42md zts%mR(vO^%@c`(d>)Ran`1u(Kja)%Ujw&cvJQY&qpkla7T4&ry!rkPA6u86w^hTXT zIsBzGC5~MxkB|{*AdaRSp*!&OS}-OAyggOGveTzVT1VEKiCDr1?+8WwAGIh<{x6S! zME?lI49MduAW+Z&bqhcNVHN2~&>$m?lN0>PMDNojpn{0bMTK+_l0khC>+W5s3bu+0xz#|+1 zO#GdVS9wgGn=Yo7-K+co5usyTk3iQrRg&X7(HtC2-lO%U%|1;Ob6$pU(wvHspgU-Y z7fcqU;;!zkNkbv5#>U3f8$rS&&xzk3@;&wh(*PB23PO7u&zaZQEHa&jeDFPps6(iD z2rB3soG-Sj%{Ng6xxlMTjrzZae+y9-ZzdQuJ(bYRFTk5>JpOt^OPZH_k5L zQj({?_U1`|)|E(_`ptLW5_2W)4eH5A*|z(TMH&dk7<{GQpH(-< zB@4e}14cKvy=x1C1T=S1MKaMBHYor*V|?s87$dn+G3_=v)JY@GkyY7L!NvG` zwu?S0JA#PugtahuM*Q4I!va9D&j_@_4Xqs#u5zeQ|0sP= zw4~%VV|QK+8c3dARAl_0x81b)E7)0N;~I3qflS2zdyXgJ;6|k&Vu8ulyL3q7Na6?V z_0g#s^~qRp{2Xw71{7FYzbT zV-S@>IL=r(1_w?(c$M4SH#lh8h7=5cU)pX(Z7ZJ^O_Vp zF`A9Y7yCdiZ=;7Nte3V5&l4!lfPAKHZEd4klL~%*Mj9U=LHM7^SE~KoZUFl#lGPas zGn%-^XO*pSLa9n!P*Nr%8Fk=E-<&g7M+flG7R3H(Q6fEZMNkN9SzC+#?-OD`3!0%j zk*IsWp;nnXK=?N$ULnGe%^uV&G>1>e5cWUiLJ7~;U@a-d6q?LN;Kx@%bZ< zxz&?vE%vHY*u=240A42XOqh=ql{$nzJL!0ZB2%72_Sa6PEQs$^#7v!^m1xIkAPOPY zZ>E}wOsDc&2YY)pl$5T390(_Z6(H;O$cMR!d?;-27qlZt{(i$gyYc23jKP2Kfmf64 z8bZ+5AvDO0cUMiFVw=`Ce!)xR7$I?GW;0N(Q{^AOT8)qwMCGvIPH3Mf(Xga@^)*s}M7_s~Ox$YVPn3Q$PLVVIuf^vJ{tG_y`4^6!B&3{O*!YFiK zBWdIs_k=PiC8+_h=48}(s^NJ$lAV2HI@CFE_tl4JTTI_G6iUJ%XJOber+VMEV`}Q3`{~FXgPexx@OiT>GD%Bb= zkKn8CV_UB!??(yhdTVMVdgJoosc0^P1dl|~8to=01hizy@eU?Gnox=z)Zc{1n=>&o zWqnT0L^OhqfJ~B#b-cVfc9yH8kx0Vn(8AB|cT%!mRqTNaX#f&r1BvX(4udWY8ghTD zXcIAT<<;mT(bVZVq3PVaF{>>z(!Q3ShPu>`SGx=PK}jPkR>G~JLi!AjbxTu|&vAPh zDL5;FE82i^1(V6YORhbH^|-m?$?@cGT*GwNfF1momEl-MDmI)Dx`D`*LW+ut)Cxvl zEwx&V;r#{f6x8?t1`7LgXypF)=yk}28{-jRY5q2jOxBWW2cpttXqjN338j4E)Ni8) z4z({7zrT12BzEke@fw;)gV1Qy_U(6c%cjkoYf|(R%WlHSEe^7~Qvi0q!-(~_nvDdj zNy!AUz*27R)0G2xFJA`u_}s(c*y~3gNaQes6GHW~%vkU4yRA$U@xW5n*4AWB`@05N z#Z2f9Aze>TZwf^8D&gzQ69Qhv%Cb1X!EcyS`x_45%Ms0f=@NSNw6k>TyP%)v4-ksG z5RsUe=*q=|Rt`plF&SvpVGw~Nt^33Yn--&yA5S5|S=-wq(u4lLNYYvmz%&5+^mM%- z!v5V8z5V^{i6>k$$Rm9Sf5gX{yp1>tcM<6i!n=i2^BZH3)%%n z@shlb$t9{xs?YPj1GyWZIuL^Q18i%CLcXEi!JgXtC~rv45BMe`u+EzF`|VgDv8RCI zxzF_f#rk!~2nTRXkTFgFP?<&#sYZY^9MIk=1V9|8t{RwEQLljLRuDsl?^00|VCD_# z&=923zJ%svt>IpjPGpyjlxxFEX7;dVLAyArsgCU0r1uP;SBWGrc1iLj7%WB<@DpSA%d) zMj^PRATSg65_-U~Cv#3T5QVjEp7*|-N7oFIYdpdD`qK4&#|_dxJv(EFzKjZ@*Iz-9 z+cIpJARZR`Y0)zCK|Bb2Ffl#^$22IYFhTy~T^|5PEg>Vi9vCAd_W#C`H4kxCZt}tw z{aq6;J#lMv&;G>C*hj9D6Oflx0wn#V`@7zd#T)vNH=tK2lO7_rJd+kmKuo$5Gc(u_ zs2$aI)zh;IsVf#&OV(Nsox|i;r5@ltsN^TO*U>T6#x+tvca!AOH0MuCN01G$XKhb` zV=mwonJRs+OKQH~hK>zXL+6ShNXLb(Mwiq0qg$ab`6*-IwEg3m9P!^2E2sO<)rbJg z@$`kLGNcs+U?aW(y#9?e=e|&d3h^<`5FuL8b0-F$U?@3_L!vyA)JnEfWDbu}E(quc zcnV+vEf12o3LFcMc~-#>^rs)AW+zcTD%dkR2s}p4cy*O9JS5h`42?l-wb&|IAsY?z zSSku=FU?rNW=sTB!(J$gxIOS+w9;b%y#|=S!0_WQ0>3|19?Wdnom))PGeC~GHx+;C ztz0#<^Y-wohgLy-E|mP<0tCJ=jWI!5LQSWQ2Xn9E4bV6mbsCy)L9VCd2TSZTzT#pa zc+KhP1GwT`992RoZL|`hQ5)x+9I2)@qrgGP$Tred9FF#0k)IDm3PSXf;)o;B-Anqv9DM9R(H! z;adK>q7O8!0&ZUm#Y+_?1&zzH?#(4t$vZe7cLV^3io*m1>-pi4&e3wk^&{BX^5 z8VLlzo&bvw6i8@;KX=0`Ko}gLHXgsY)t6U_UN+~>k>diHDo|d--;=8O`$JdZPxGYb zVb%!0ih~fl(I$L>tqak4M+fFG&Ab0aIWJKqN5SIa8~oKZV23?b@8I;1*ZpBg#gP4u zm#1UN9Cl=E#w2k6{WjQe2;w0SK(VdwzXgy3U-l@_&gv*Y5{E}{$+pq}Ean;?!=RW< zdB1l@tpi0ty*fL1pDB8QU7;Qaj_)!gI{0N4A5EMKktBU#*~ziwKR{vCf6=DS?Y%_} zR-~n1CkEZ=zX1L^6cS-rKSwJ9*tupV9s$y=K_xvv+&W1$e~lsSX#lukbMRwO7&2!Y z(3T{lDsS0|lRr{n)L7!(E|7rax5Zgep@rb9eN-0KSADS zrZa|v9Z}&egAo*3g&Y(rWykyd>1KdY#um9FmLVYEs6ax^{d#v9)chZ!TJm6dxf`s< zK`bpGKJ0EBgxwZ!e8(18m(KdkXHfWUgsL}U?eS|xCKW*Wgq}e`uFcq6cm9nB4N;bi>E~y zcwXm#u?JqSEK@pp0X6&7j({_?{D=xObUD5@88ymw4q>ViHud5TKfl@?fac=UuL_mVXC{0^Gfw4u_eC`8k8KMw5UEsY5kVaKFKD? zSeI;-`7#;Av0>;~TVDRv^fo9Qjwgq(@~hsuhh%mNpMt~-7Ek!_#zW}NBY%;}7!B!s*B{%lss8>05iSAZ|0xHJDOW>J zMdsjtVc7;F6kLvz<3nW1AqZnL0tpq=FQ8cwlz?Q}yRXL9%8INp0l^{w-apyL!`zD; zwb4R5AO>i$8wc|MhVen1oTyI4v-&>O(}Y-!bhW6RXxYdf#V3!@tRSuxo;Zc??C{^J z$dQbu*zp}DZCX787q8*Rgp)L&`!p zfU+$?ar`ClO8gdh$RMfX1F32d&2hqeN4;?J48M->`}t5aN5q`ZJ*%RBf%#04ytxD0Gc zn_=|R&c66lXSrcP0$Ph&^b*cpL{08S(h79(kr)3|G7LAEC2K7OekZp9DXCBY_Xc1S z-M%oH`qpndwr?kY{Ha-OT;#?b1~9%3aPtxeO-#T62N;-79W^l zw4^q{Fo<_5014wD&3^|b9ZBB1o~*6F#JwQ$2DkYnpyD6>QzqHJamhI8P~#sJ?&=jJ zjsfH{gBK!7dS6~T008YZ6gvaO(VM}Vlyjsp#hiCyG2}0~>>zl_4QT*8E3Jj0vE*{! zSV6cYPzDF;-=L4Rka@Msp_!mXT1b{44Aw%BQag9O?~}l9i^{I`*27NImM_`iy9X*2{DLpB-$#D z-RW&p`I&?lkcOc&$$GZ;swQ?{N8^gLqlN0vi!KZ~+X%Mg(Z7W^bO&RzqLThO_N$;(tC!FD|oKG1XnT*X#!DdOerhl+2@u~)P8i5|m1lG*hj)+LJ< zF9lx*AP|i8ZF zD3r*LQOZ!|2GKDm7Z-wn4dM(5tRRK+>yW@1qUBm(VwJ(|h9g^AzWBFr&Tr9%TPiGh z<+{7Oy*ZmZJEK9I*ZuEvS7q3lQ!DQOVAffrD8cI7x4{zHVE&2H4gytS3+ohQ4=uC@*w8>M2QEB@h3G9Xa<37T!t14$BusEfL>NR1FHs_zp~fUP zEXmU82sz}Os zdGo0JSiSmllKlqTvuED{uaWW>ZN^im#o1J@baj{YY_1!hO5NhL!443CRoWh_%LlsN zSH8ZAk6Ph@h@1%Lf=9Rt|EI%{7>*LK0}RX^u@hd%?wPhQ!^dxqMqJW;n)?lJ6s{O2 z!Q&HBfo24WpWD0?w9q4JRRT?7yTQf)%m}fgKsrFat3at#KpE(r4}z;FKoi;LR8>_K zgl@ttIEh;UFVQaGmRt(aAn8>$(~+)N<{vl=DV<| zt@-)cVE_awfM{nQ7nkMZD|n%D*ik{}gce}J`*yozCyoqW={9enk_#DtstSaT8~F5pnwluGi5>$EIqn!wLJD5qlK@-R=gvJf zQb8vB7i1&BM2IO-^ZP+oQ11IAnCKMfqYh!!T7D}hHNLR30B+R#$UY&zRbg;HtiCAy zArM7D55*e5s;{pSg^8gS22?M=H&>wW<$X0xc;laPWfy6>oW5am)nC;SBVNzKV zql{@%5JbmpgKZy!DJLx>%85>3>)UsX(bXaucZ2hge&BlT*DvQFN5s`?Q8 zZPCUmZCBE*Av8`5z^C-eV>Z~@CnPASLPkmx;cUd&(r=db+nqg1o#I_moF!E6j-oxZ4lE#p63IO zi+26k2G75G?V2Bsqs;JE|M`X&pwlJ+ATe+#^G{y3#mTujv4OiA@Q`ve8aiR`#g(pXXLU)gJf7?%(JW^L8u!&2mxzm3|BcvK3#}*?O zwubhYp`#&FBuj$x%a-8v9!axl^MVwN zg^3?9a||vTI~RW?6}HM#0x~QZru^W|DGO~Df}0v05!@onMM&>DMPd1QfQLHZ{P%;s zM((vo=|d((Q!N1KC(e|od(2<4MwzUU&{_~T%4J+HWgR^LF$Wls4v=zSxsmSa!o(`);Dx?=h%pUW>`Q#?y>Gu!iQ$xr=7iS&i5NW^e@wCm^hv(- z0dM(XqI@ zZ&z$xr~LJ>W@&J`pmpjwUACn6b^7+D`Z1rny!A76GGmVvE!q`*dw62vmdc`QkIPiE zLcKi-s_e5Hd)mZ}`Jx@(ev~paFcRJc4hGb_zPy40EnB|@iGca2l+&+;@S;@2`P___ z2h(~$LZu`71(zX1C1Pq>UQsau_dR@V$40DV$7{eMD%xqGfTWm`{Td|CD*qx8fKU7w zL0Ep+@KV1zdZ)TFyhwy=7VlEoH2GksHsAg)#~*9V*>_cBT(r+7ur-ad=!u?bS6`I# zyqhH_;xtmPIm?9T?`r)Xpk^2u(;Cx&Maw!AUiX)YsazAC&T!Y2F*WnW z2W(7oQi{BUkdz45Xe@foMO(m@lm0^d6ccLujG6~~d8dE1PH*2X?|1^N%67+o0WYo{ z?qGticttG3se6U-ugwlWO%TnQ5dsPaUpk~7UVu)xlHb251`18a)=4c|V4j)IPkPIl~Oc*CRJw-hDMzZWkuK~ebgI9CNt_P;;@ zyOcX67}o-I4axtDnKl+zi9X zUEoCI3(D`Hv+)@{^tyB#emqSPZ1}bKl(xBV1lDGpQs)-}Mhn1hI5!f{z5hPI-48fF zP$Opp_o=H%Nt^LjL{OB162*-x?4dIG!Z3Qg^VqG5ytO0E=B%-Ix1MA53y({YX#_X|bC2e0;NyfkwazCJ~iQ zyrx-Orp>#C&oR^cOpaP)1fS|HH%#mqqfiWwSV)h1(W3GlQZ8fcC|2F$;x=CQkni~n zc9vblh=Jzf4ZxLaUJ>Lu{t|K5$ItH{V8Jzlf^+dDvDS~7^%(k{I#_xi92`7@f8Clj z;jD|;*{`6h;RKeEc7?WYzkDqrVblBt3ov3;?4*y$3<-8w7b%!RE?TxMFu~mSbd1)6 zxj?hMUGK%pHK$&Mt=n9m(CMA>a?Z;&>KOr(jN%-(lt!i&2f5)*_cCTZ`ob7+mK$gH z@%!QUW8ry;7m2;g=B|I%FvzZPihDK^6`DTB+9oZ5LCLJG?WmyLAfQ%ZPig zt}-n$U|Kd89*F{T!Q(|80!Xy|oz?Rozq}L^BV;0)tGY&sDEo zk@i)m#L?{3#J2KSc-q-=#$hytjaT_4YB1;)|3T$Q`?%_$%`^RMjsF&Ij8j+6tn<`j zMQd4@HvspG>gofw!Mh4Red0uv&I6lHcjDHaJFOoN!#K@D>+vfz?2ek6&RV`a$mz&+ z+e3&HtCbgHiu4*pOE{4D;PU$!Rc`&ev>W{Vn4T+5N*%D#kMgWd%6`1PaMxY)n^mH2DGI}I?b}M=D#;tgXBwr5W$5vU* zTT!{M?trXHSe3(pzB;v0E{)K=VHLMGZ~U>sz||99SW`_$hPUD*BN*cY+U??0!!ys#p_dFXF6m5BMm0> zVqOASCxRr{rJIHzE+~kL>JGOIBM>vQXU|^9^-v=@Dd}Qn<_=Wl_YSu8%$t5(bOnT+ zUf_Un1Om@2Ju>6=ojc(e-r2x|GqT7xRGX+`^aVCX zB9JV4=1T_$2WPXgE)Vv^wQQ(Go2DFG!LN~#W2gu5Ugw}1pn!=7aI?o8bfOdLt@i4e zv9{Hc&)w zqHKn!%_qs?YoHlZeb(OI`*|;uI*lJ%8aA%HX^hdX!JwXb)?MA*nwWyrGF7c#Nzi@(-dgPY3Hp*NN9Znxt zTadLtDcDO1F^ILqL*CH{g~c!Mw8JF}e!r_VTvk86D5&1qG6w@IyFus47p$(>fhudK zg~bNYUY@A=VH44V(YAj<0AfAY60}ls5l+g%xk61o+tBI9Om1114U%i{savpIk`o#W z3L(eP&hsf578?3z3-Wrfj57xi>dYshyYA6hd(nLO;VooAxII04K-uoFJ0 zyu74*-0e3}88ZdS%=wZZ$1^%-$T@nwsR(%Gx7zpMahZp_a*k0BrR&9_)`r$f@ju{i zGLgq?>-u$f;Tq|t&dzK2O$4g`OFPRP%*@OH8syQF5Wz>G+oz_gIv<^_g=}o@;8U)9 zX|F;%jB#7l9W{p$BD9D&e113RBr;SUEXH1@r7L~#)U8{9WYEK4oI3^)9ery_j!ctNXy~b?MUd)1T6qQtxb9h1|7f z&CbaExO5r@YGE1YborE^TE3*a0p@H*0WX*+e&fcC zBz$MMc=3SdeFa_7JPXUkd8MT+c)Dp9hT?yR)BOQT>)iy^#5DH}9~#-8%KLnSRFZ{K zxHdfp&MbHxd8!$C}?YZ*NxgST4eM{`tAAprGYIOqUV*cRtXXqeQ1E zeKPhf01WbGMrSkf#AfN<>itlF}5}Da_ z(O$lKH3O7GE`|zy0|Iy@S?HG_NBH*r`eA(j{P}wzaeD^`*`^ZT-EFMsHVWZ2YNAdo zx0?G3!qak;byYEkSSgM`4q^CFkpR`Zu2=~e}mltb#z%g4ud zepa!oySsa0Qqs|3x}{fA)I(+qY+@9VRGpr3Z98Q@{g#y|q?Nb2=$422L8mS9cthkD^p8NXs9$dOC>z)Q___g0h z$%QW+(7t`9DIVk%PtR9?vDE&!bsIZTTqeiuQ!u!dI*ulV7pj`It5z{U7;I=y!|x5a zgcJQDFK;?Hcy>4+wr>x(eE+&S!F~%R6y)RBhK&OKeC_6gqPQMpfY^ zMZq~`=?>q7OM|nn*t7}n77oJJ)43-KUp(Bo@Sdn7>c>MKR>WJ{p~6`UbEB-+d@QxA`Suq^J7N+0O&uo>g%Tj|9)&b7KP z`+S1U*BaMDXN*gqSI@rFF)#Dyhhb+EHP-?jYuBX#@Z_}J{d&tQ6FIwO8U;*qcgP*w zWw8Nh!M^G1?lscQI0>*}MnMb!j0c6E{k)&Domavd1MJpz+}Wvg>&rU_0YgJzDPFXj zD&G>W$8wZfaN=)mwd6ogXEsAXJ8C|t7;h|VXg%+V>y20G4&sX&g^^I<@3#OF@*ZY_ zq55IV9&TNUW5x_R6Tg-=hh2`vkbpNmegvBK_sRTdg#P>W-k9-;69q*c^wIi1M{bd` zo2g;o@Zh|FLA~UGAEP{zxo_7loLIuPRzhNCTj}`q$70$4Smt}Ni}TG`zy9&<(T7n{ zN5>-9Ju=8-_TnC$4)0(2c@Jm(>e+uYU+1qDAm`&*i&hqoPT}o#Bb&BZXiN{9NN3sR zEtlpn<7HLV3~}@Q#Zu~57w2od$mVRFnXvP0yJX$Rzscs&!eFOss_h3HGVc{zf;zld+&Md zFvsc#SJi;}`}ZIZN1o{F>UswRhJrM&zMjikV#h1`;`kX>@ZsM|?#bU^(!TP@fjG`I$d72;`RuGs#VgA4Ey^Pmy` z2Xl|jaNl>k$YkiQsZ;myV>5&o;l@;I`pWo+GKymuRpI_$3oD+?crK;CFhgWob@aj9 zrk(X-33sLK#iPnbIFyyk7A2Xo89Z0IY-7GjZ@7nzrE8dDW5`O=?os8td}qH`vV^6q zyapG~T>KXI`P~f$J~xCI z8XZ5NVs3tNbV5L2*vhays$cm^C%@asG@~X);hX$DNYlkkNA}7)QolCMwqr4x=Ntda zm-nB7d?6r?7`B0FQA;_-3`8*UjrE8xAqKDwo`%v6BQc(6H^}eVv+KTwN#=w;)C@Y= zP7+YKxaa2Pj(Mu!?Vh2c8Y~n&TRDU`g@XIf*ms=U0Ep)a?s|3!P52Nh!0USrkbnQ+ zx7O>|*7t1x9eZW2NNS3GUwF!d&C?c(&GW54$ylE^ENrp1n6Q%7(ykOaF>xwbVszVU z@0GXW#)9r&yTlbWbEN5gpUGQ?x7Tw9#uysW0TL>Kj>Dtd@O=Bem@?e_))}5I`}X0C zWZ9@+Ny}lLrPjT*mA5#5wU~eGi?De3eKg|U(upre4=!c|n$8U$x!5j(?~(BNNcW-+ z+U|TG6cpAU?u1UW!I?3YwE$G#qcT~DuL`#PON6%!RiFuf2{;hrgc^{DRgqrN$i58v zAsnQCf_@_~)SHkU%h9V8*;Y0jVjdS8n}`M))Ga8tmO*y=rl$^neLz0tkHw4sfx(FT zB+ECZl`B`KWo8oOK-#YvxxUk;q^M{PP=EqH7uCB?!!6%{4abcUdSE>w5U8S-LcCr0 zb4}S<`wuBR{Iv=+rccRnjhJEQU+JP-BW=9^(w-$%H%Sj8?- z_7k<~_VmgR6ndudJZ%M?_Q=RKoymIP$Or2+qw zn%DObjVC5nV~*|H`rE}=fIWl`jn6ppQS?`=xzMBPQ?Fiy?)>p33b}^GMY?~bTFAsa zhDL_%`uQt9VKtOMtLt`$PIa9lM_!gx&SaeB@8%xt-r;`a+2W>8;Y>1?quq^`+21DK z)r?%ds@^*u<;?#1+coJ6-d{e2O}=!E1u&L4cC4&vNLF~~eV+)^8^tFZ<5w`ApEER3 zQgQUEzu?{UrSZ_wGbb*wd=D`?bHcwZ$G9F~XQkU4hEL#9E_Wbof0;2M6?utUB1flr zaZ3CH_TYc{ryXor?%THuP@ca=bDK&dAwS+1B_;C^vEV~;p=}=X-0NtMtKQwZ0PVnE zAUbS5Jw%UQBc^&gwhSF9qu#IW_YccJLcD;6_vcz+9Ke<)j0mxBKf4OLy{o9^uXycF zhrNy)gkr`BZ@X;J7G}XshQe?r*bu%g^UOT5vZTQTV`^04cbT0PK4X8ayvHx2Q5H^+ zIlK0@x&Qh$whZs;vqrkqo40Qp&U<1<&`AHOht-@XTqlnRnfG{lT{cc;>g_YUa@=sw z(Q?0@vtO#h*xSXqR?k}_I+WR8W@p>Eb?!jtL4|jopVM3?7d`#HJzzM~t1RQ`%TDo+ zBIbiI2eYven{V6WzGA0P;+C<|H+^Hy9ULPIZv8tl5PkG@)&07s;|rs!Y+nEeU;=@2 z;M;*qNlA-N?N69-VaH0nv|l_U>HGG4WXbEz5yMXMuoN>q^0K2^M%!Wa>gUj16USlP z61}ngUA6?HsdjhHQPX!STTbaLL1DkgTV{fNSfTewPwl5qJRfvqkL3y19q9Jl+|1Tg zlCbsY&#FzE*Nbp27oPAy>V4TFwC(fI<(0vAY744XlrXI-7@fwL*gnJ>eB{E5ckdW$ zokzcvM?8F_pTkq5jj`M~D^uvk*h**p9B@_!SJ3;*r(T95Ty4ODtoEw8EyS2k!7*Pc< z$axj26-F+=z`C*aT z+i!Wfa!foup#o=)@O?}_RUI4r-3A9>f84RK;dGS;uiLt{-{rL|sY*DsVAia;Gd%m` zv?^>cS;@n(_0dJqgKQ$3x9+-I<8`v`-mFu#*17$UWfEEpI9plM^}O^mSx=nKv=Za~ zE;By6#WL;(z~uZDZ2#uZ8z%^wHh9{@C7!Fd`WnyKFJHrWoLrsSM?$&l-zAUoYX}|? zFl^w+nH-cBo)}(2ap=s!GeyrE?`*Ge-}|hF;nVEwd*_b(#B{!h6W;3YVib=AtT$$w zOzJ+{Q8QO2+ve=&FRtm?`!dw0-J4Z4q`-`4Sp4eeYG3Y^po>uqUIasW{XZCbl2gWs z9m5nm&!688m6RaW+3=b*Y3$(E&;5S{18vIs_vNzsJ*@59i3~b!mc7_}CF;;_J zx|aFGSZ`zBd~61mtNegLO&X&BEdy7RIw?O~1vH zX~&Jt&F5X-_2TDh%3LisM&@j3Sv_t&sy40FBQ~E^c6|N=t;_X0ZhjtW%vOB=d+Dn!&x3f*zxw!P^~2kWo*VG_-#7D@ zJYV2Fk^DYuXtv8_^WuziX1CMhtRn6xIi6>)&u|I;{z-Sm%AAS5*&f9$<&Ptl)Wm*d zd7x#(6RZ1-Yqv-LG=@`-8IPY~q|wW-4{$+6_P8waO#5}=(HA3+l0yv>S#L7CSuNwv z+%;(Enz$XMrvp3eLKD%dM+S?=XQ{p%41tb;sadMwykS?p>wH(k4EI)^>XN5f#?1VY zQBj{irhc?>zT1B(U?LTbAf;{WS6JladlFDW5_kvgnF#qW?&0sB{st((KX-R~!DW0t z6vR_`ozST32GfTTrmrb!6wsvLo*q{IcI0K6dyi1{6yKI z_!pmU4_?crpps;L(_hvd@@a!%SGcprf0%vrUWjVbFtgN00CKkK-A1nluChb+Q~&K@K^h zZU9UIGeaS(Eayt?A*{9s=P81qHcL^lK#!~W>(_rFY;4YfJf|(&I-L`W_t%ZClQ+;d zb~*`ic1`gM=!s`yf{!Rm)aFaMJY;e)E}jGxq8`i^AwQP`6^4!}iAp))@QfFw4sJQk z?%U0FcKTqE>Lz^QOHPIuHy;)-_%we~KkKs4WDANl z!FQFfKlFSn@;||F^M5$u^gZMGSi|nPo4sASqQEmBj|`Q3mw?Y66Rt**b+vk3X3us> z`%}ISAz(QlxW=#DxN-8@so_+YyjkLBTdVeX_S)s&zt#Be*V=7TPPh6}WcQXVX1F!; zmmdFUkhDtzlX1D>0S=+HwU$qI4byq=UruaNDF_459}3Vq|7lvt%R5?vp1yMJ8X0Z@ zQJGOHQqj?2N1tOVyc8F!0QOt;weFkGxqTso#CZ@~+BoasPaUg zlpOA*&wWCX;1bUdcCEmAtn1)tjUlWKZ+^$zi4qut9-invUGthI*SDqusCE{f{=e6+ z&l5IyE+Dx$i}}KZ3u;r1=J4mfSy`$N&8@{2#Y2^NOWc`#zo0mus^jR8-U-*7fMKg- z@6I*r)-9VHyC7ZQtR6Zt56b~cgHjt6vmEbS^T4O+5xU<^iUkp=UV^K6KZJ;OEK_7{Z-pfI!KI5mx+|nv94+*&x zRu3!0hWYtjTi{zRvTa-5&*T0Jvz%9a`O;%t^7N8KcVkyX2E(mx?Fk(4Kk%vQ`NU|0 z6xTXf-8_^7Cv`O!nITkc%a&K5e#yL1%CTSRFA2LQ3ncwUm;rEL-kzA6DUb-_cbAdT zDg+f~h)z&P$R9q;Au~B<6CkY50fzZaWfJ;YC+iYd0}}XtGse*O6;vum(IrlITs@lt zeJQMl&JJ~xLI7|DnPNn4?&WFtOJ2jR3mT*8(0QB`RoJs99Q6s54ASw2Wy3R{MP{OI z2dz3)IQRz5Fv(|pb;W;~mHKw@Oj%zNWUmX`(gTmAf#gL-i0^WJ^7 z>Fw|6dt=#PP!Bf2)7NlD&QsUIf9xoG$HpZukHsu?6sxJ~YNy6j8_6>N$cGHKs;ZPX zmP0&JyHr#Jd6oY`@_nQmv3RR|_nxk!`-;A+eUg5~Il*(fUM)9WcJeZCs>k44tI3JA zu{Y{2o+$H6+IozcTk5>$WPHP}V_%k}*_z+jv%q{6klin@U=Kr<(3f8x__BA2&C{1O zbMe+f74oG=CKuSUx!Cm?y=*P5E$Q8j7{|@M#BAqr_3EPNgGnCg>AJ0h01trtm)x%I zO_iR2SSj4drC^ZjPT{%U>r#!fQj42w{VR^k)E znT&+`Dx>*Z&H0-v+dY(0cgy#*GC)0#h_LE02sklqa-?2Jo>mbO(!Oq?U^?N?(k3|37@ac|gtU`u@KP zQN~gklM*G7St61mnJSfWM`fNPQ=(8RLkS^cqXydMjFCcQOr~ut6=e+BGUfNWSN1;p z`}yOy{y69C!>+a7>v`_sx~}`W3pZ@Rue9-i0Rt>Q`?o=QB?zjUo12^oSU1~&vAqxe z7cn$UH>{=|sS>5)lOAwl&M)tEb!$~qJU-DR+@sZt=jC%=&VPJA!+OQgW~&Z)Jem2X z?_AZ$eT({kaWBlb>RPMYtMbgiL4ynW-m9j6eCFmQLteXuJ!q8P{KJR(`HqEMPLwxa zyL|ShTZgYtpbydP{C@4VW&V}LMt*)%3O{%aU2<*dRL2+EXU^>Zx%bnB3zhZ99-p?i z-i_Mst12pLhCDn|KRA4+9ra`N>$!gVC#Q_Gpx#_}Z_l@Ahq{f{?Kx3>Xw&-xvefQ+ zzp2ot0-XEyNj*%QvnK2rJ@r-53g?7t1rJW>O5M39two@XLH3PVgKwSvql@1W-`Wos zwOFBd+OzEL)=d*;&aAHB-)%u7cjzz0o2T=uQyFiJ^2n?IT{Hc=ecJbDU_E`_-&fD_ z^PTc&_RN`q%T8~NbG92hWZN0-W3RvTyS3AGTW{})`#^_STtAOC6;^59_Y zXMa9fEq&_NpY0}0oVbl+wPWJ;1A1$6VpoA=O=`8NJn_<=DM&nPC}uuAGkUI;sfKOe zr)50AF})YCR7kGLb`sg>`S=*+?8=SDufa6q4AJ<{Xb zmo?>Cv?~I95K3Z^KI{8*=(9Z81Xva0y-f6_tAR~3C3(cFikc)Ei}g|GmRpfgpT2I+ zkpD{Hcvkxca`uY9od9Rzf9P2FSN10GJe~12Hn4AaODf&3a7np;RCz|J)B7l9EOr zovJA~6DalB%i8tL$Dgf(NyWOxot~$!4OZM@1Pnar$9w-@SM$7~BPE;wp*~wWi>4xW zSgIQu8bV$e>Jv=hob{k0W{T*s+To&W}DjAprPM zq88i#$LYUUb>?2_xH2+fvEY?9U(3z5lY?abEth%`!q?ho^L@)K z-|sB8c*Q3f86qigm{!pl!s~rF-;;)C%|;~j6A(z$($KKs{@U{07eSXwU{qb=yMkRxUCj)B6FD}}} zlsZNwYX8(T)}Bzfyxj~+7f0Eoy)*C1mC|$s>>_{xy7!`>*|`PoVe?@4_T9U8PrZ|* zNmi7zj9Wqon%jz1#%?dSGO&V5O%>jOUm8_nQLejp?_Lx4GZs8>DeY^_vv$|*xIeM2 zK~A0Mwk>tm?>W*?Gdjv=YSP!H6Gn~v)NRFrdZKaraeqzHhA3u6WiIXql+V9nfzo(B z<9V(VR-6IMsEJ~65~yuRSl9p;7w!G~_roAJK%$eyh~NrrFJk!nV|vY@4{Xq=Q7{nR z%dexLF!ql>*8;u6sFU*&?seut=uAdj!MJ)OL5_y?F*ihZ5X=lw0aN0!aYZF8+{%WK z?}$i?PSK98rS^;&Gk%L%)@lblR_mBl)5KJz^ZYYr28ToJT`J=H9-q{@>&+#rPHjJ+ zl7BOi=GY&(fXiice%cU(18`&ew_C8BCcRj)%P4H0r57tkiM-8nfhlUS`c)=B?{a4Ww3oEPt$ub za~sZ>DTi8q9$$YK?sGWuZ39cordzgb5pHU|s8-%T(?_no3gt7TtqpDH(xrvyPM~g4 zhc5KrIeX&7>c+;#7@B50dh|X0Mkh9!!Et!Ob%d;6A2ja9mu6JdzIQ=z^Z7UcgB~Kf zD|A$WkPre~3V1Y`yLLTJ2MiF}5||(xw%id%Sr7o7?%lipR=13aBwP`Afq-i=^BJW- zqr)77P9Iu4e|Mqq()C^zx~Fw%hibG84I64Z$7t1yo~G3%?hQDj-Ll>1!;Yewcu9G0 z8YmhDX&Df@DEsSwnr_PiTrz&g2{F3?ta`e^NF7*-Z=X9DFvP9v(+G@jgXo%Tf<-oZ z@bKY_t4%pDmC2C zv{QWcQkY)1?WR7VNrb)8Xy0d!s?my~)+(dbt=(1kPidg(Au@yP}br0*MqQnhN=&f?;Woqn#jy`oE( zF0iL9QF3sKJ9f&w9$JkU_TcQYUQF(>PiG{jFd9*Qte2A|5nv|{5k7U~-De&xhd>&!#t7ctyXf+L8jRH8<2dCk4nFqV9ryrNo7PjuQs z4*~+T`bWPKAw&MabRonh29*m^DY^?go&IJqMJU?+^qc)Uj*VJM*ST?JYBEr*>JzS~XtV+IM@UvHFJF z?(eR4Hq5QLq5p_?H59ALU;go7>&<>!>V}3Sg&;9W+R(Xs_e)GV9fETOh6;VZZjdtk z*xKErpySTe5r&Wf>;{mEbCjgwx6ks{t4frazyFe%ATs26 zgGHBqiW@K!9Zh@u8 zrAan6sxGFkFTC5dY4cakDqUUOBy=umrGfk}`p1ExTCJ-;%^Z0}5f%EP{{F5z;$5!W z+LnI3+V}E_)Ok}iLd{xhrI)`datxZh(c{G)&wzDv>hMqi)twBwGlB;ZEqcHz-AvWf zvaRtB>q*h&5p5*z$zfV;G^p(3$CYDJJ8aO}{ikH8dis6Vq0T{WaM=1DwNy8n-?H;B z8P4u5B{X3?4oOWCOZjwf^NC6mYu0Zuf$68lR=!=u@6obeX#leljDI)aPcC2*VrqF~ zY)?x|rAp7+dj-lori<+cntlYajd4ycD=X+fYV_z(Wma*C=K;MO)zWXlBXIo)lFE{u z5fPefM%$I@Qi8A8EK838$+rN6^V{F)9OdNel=Hl}dt03i8&xK@HJZF*L#=}w?CrAJ zg)fR?M8KeP&gzG|N5QkZSV*c489io9W?o)Hiib=N)Ym`%ta>yqMMLP7ppG(#lV6v0 za%#cKfeBccSooAQ;CHtN!j^&rb{f-Rb+A*_vB!x@l!2L$m5wnsLG>-gl0aZlFxLWt zamTJj=2tkvQ+X)O(a1}V%XP9JD1ttOgy*S47M!Kb#6RE?5QgaS1z$kh+DI?i{zzJy zn!?D)hC1t}*IE_Vm%CFhndJM3#R}eI;iL z#5gE?oRHiAIO8;VV z*tWI1uIBjmi#2uPN3K28*?O;HgOgd;)qAII`*7&ZP-%{0$36d*$wOkM;KYd&^i7+Q zV=G^#o%zKDZ{M!R@U1z+F3Opk!h)>el4s}oiav@=D2SwkgNBSb8;be$#m1T%k!Dm#|ofHEqv#3J5H6xh`M>Uaxf5Uy$L zBN=&7YNzrN>$5!|4D>2A%*AN*=+XUR99v>KrR;}dRku2s_>G9@SXc;Qn&gslt&oZL z!$S?3n+`Z~WPaK#i9)z;2ry8l>%8!=*@y!7)+)}XUF|O1DR=gq{;m9iiy~#@u-1d$ zulAm2SR6DYPiM3Hvd1R36Bln+badD=VQTfE1-ELMHRi1sn{%wzC^%O1jav9S^aF1r z;a5GjoJHurD3l5c3g`t&kwfGc7uOiHQOfnp6YUBc9mA2K0+h}h!!?9{>Q`s{WeV3g~v_-I~Y-?PmN|2s!>4CNyMQZ5Lqerh5u3NtzeSK7_ z^|nq49bc!RGmS$ct~$q{xc=yG+C2++HI*ke8!T3Fs76#r>c8>+X?aCwr(?Y#jS=zhY-D;)Jmro zv}4{rj9ga8Tj@wDQRh2B#H?F9tXr^6ek4O#7V?seaW@e8WHELqJ29_2U z6L$>T_Q4x#8vvggPi$^4dv9ty*?zFOfoYz3o?=kK$-vI(C$@PfFVE`Pxkd2pc3aD1 zj0X8$-7zA^{iNU3XW`cx1f0J*xbfbtb?UmG?0Uz|hZB@D5OPmPladZ1|DsS<)I7h3 zXlQHA8LQFY!&ZF%9>?&cvN2&Se*(1?@`51jW+h}%EH-A6fvGKI?514@lNNw0*I^b~ z12N*AoSvzvsX{>DV^|IGtZb${HqV{k{)g;o#)94pn?*TiM-CpeCh%!e!lQ*Qy?*pP zRkSC(qzLlZCnQ4&=~vuGA-tKdB$jnfu&k{2;V~u>O`1@B4Mhi|mv)-v^l%&EEKY-=;=g`Ya!j zJnY%!h@T77)AuugvUNdE~vTxC7cB-VbHJ(!q z$V>=M1nbcx=6a)$S`9~^k67*A7%ERD#KREWFr(NAIEA|A{=<`U^sY!_zVPiB5F*{l zlP6Prh5-O{1zA}|;a0$U7)?Fn`|@MylVbUWl41s_|YnGlgb=#~F?*=LEluoi;@NG|dc*45y zBkwjAH3w-^3lg9y)hnquES3+6Gc?-pP$x!jIOhBOlaDkg;{r+csy8|-yAED z^-MaSDeg|4Q2iA8We?cW@|8# ziPty67eaz|RB2lz?$X1FC0ZBrOqTdq370!)N1U*R@ae0AhsXz=jYdY+z~D zv**`Tj$`;7#wikjO@fl<7b2Vo%q1eUlsiWTi!HH;B6tRi z)Sag)#p=BqW0~&buaGfy8GOnX$EjoUnIkJ*NpB<*3&?3H)Zh0BKujH6O|4D_l#gSw zbL(91j~95VQjW0Cm|5{93@*6d!Y1Suymgy(k2z-sJS&s`lmbf`ytW;1>I^fWJe zpw7mclZUjuMr9H=Zq%RSdY<)Y?4-GI%N8{S4Uu2=?&nNxE09Oq!X;0>wrvIBssI+s z4gke&AZB@n{RDroxpwVZ{_EFk83XZR!cSNTy{hLEQnCsWQghy~HI5deQVeodVRm|L zXU~Q-F?6R|$b;ob(HUlQgKps&oa=qq+s7v`GE#@lE>luPCk(K*t@9)enIgq;xH?BB z@6}g+fvr=r%QkR3DP4eJhy%XyUdE3A7OW%w!0NgYm9G|0a zysJU+ZE}@N#8KdT5zj?6_8X}}Lu!k+QHjNYh^xgcuC80JxrKtCPn1eXkEI3`_euksJVI+|Fvz*8A#9^b-pu&xubz*(12ury zzV;hU*c^Xpv&*utzRpat%LpIf=Rjz0%yd@CFJlr?Q*S+2Mx%jTrggwT47DDbnrjFE zQf3#$L*o^HpXVRU4V!>6AqiVIL0tP)p)x>9$Sm7wneTMncUK05H#@Y(m&51pKeF+n z3kQ=l0286AA7gc#F>fgoq|d{~%^Kq@x0{ehF1K*nXrQefh;gJa1cde$AF09Ea3PpD zm{MrirYTZY0EaPJe2bY{gw)pW9X5Z9=h@IL+dDYe(Echr5Yx_btGGOcotYjtjWqpa z!KS^L4b`tkwyPI9AXJjO4IAs=<%O|np^$frO zoz3VB;u8`|i)_7a*S~k~UI}~j2p_m+p647Uj3im0PXZu;D6{ zEgp#4X=pDIPn|%Jb8|U0CVTj)zoxvukriwDy+^>aEX#b=Rn1z)hMf%R6=V3WS5iRB zke2x?O-{579NZxxaLq~csF3YZd!1rEZQd0OIO%%!?t!Of&+gcItBm|R>Y2Xfg`%)) zy}MlddGgPblP$hoI~hKD*NXXj%$r0bvCU+}0siXu01-g5o2_kinvsJn2ZA9h2NqRB zuPHM~%E9X9sTT8!Y5`pyWTg*M&(N?>;{bfD8RV2vo%KYFmS$#kn2Zy}pV+^wY8$Pk z=~RqWck1ohPbPMTyok@1@J2r<3k|9U*o$vN^$CFw<9m@sGr_{pMVPj3*RGu+gU-CV z$UScl#TABf`tRC10kv@wib?WE?&M|i&lMrAVwrGNw|2zWx=RbJex`^age#*YM6HE1^=C^jL?$$ zc)4HUD~ez^pR(wKr&sLO&G`3WYzTQbfjkgfIQ1e~3VylP`0?Y1VCvvVSAyGZA;7nOOt((8Tty{U=T|rW1e`u_XA|W-pnB792N4t=Z4crXETT zL?w@{Oh0~y)SUd_sT2G1pWB7^^TRl9F-kh8)G^(1y_2-0Jw$g(5i5{C1D&%0!!D3v z1fS=-`1EOB4KJC!Fx^D-YNV^q8lg29FZ7Rb-2CSzhlJ^yY8B7xNyfO7#zi4NoC>vqwKqvX}mjkfoX(AGL`oCMy z`h=gVmwOT)Rxm~^0$1Q1Bh%hJNFAib6(r25`)}=?AEw|g_S_&-FB7HV41L+@sBC9XV-&q zKBgKo-NECpSs-Wa+ZQ&}bo%PL_hXC$<*F#?#Q2KONQYTdz9yz;`}=eyL#DK()oaob z96^d2)La)B1^*YG@|CH_0&;OSJ5m?FoX8E~NpOwL#-D9YBft%@n?BuCM)YAd8!Klv z&uGzF0pm=dXKUJCUo`_Fa4r=|bv3o;NQ3FM@03)^<-0F#0LWdh?dTEy>shRZ7ax+m z<^__q4HrT8@zqTu?8{iYCqymCT{cUaf|ZS^>$HD*y=kuQ?oVqcHhfW3l+W`(=709# zn5ZFcmZ6T_5*$CDnwflynO?0>+gqAinoV}+jKU+7@*36EX0^1tc!fQkgnUt6J`V*Ihprc=1Bx3YoA%}tr%Y+pv10>j=1Z(; z!0KcTOt#R8^j3CLrzVwH6yHX|GV{Sf6^8`pxJLd>nl$lXtXk?J6pj(wwj~`}#_x6w z8a6OuL-F)X;z|HsWzIT~8Xc{m zJofcSE@Rkl_z(YqrjZoGZ{NNxc=Kkzn~{sv{p1lfDKS=tamjWkvem%Zf52;I*o1vV zye;gJ1XPfVgg%owAN@ryxS|=kUY67DAA7vs`!k=y{!Qe=KO^3wg^l4Ys*Q*?^! zhYJ)O6jVd05(#rFdigTz*)x3-iVWH_>D+^+OE?AWqr1p5tK4NhEi44Tlw(he(Ft$U z_3s!MPdan>@Zk-NrOQ*v%(U@oo-&ca_5h%gRyYyACz?)}F=K6cxsT7QJL(i%S-_-r z15>ntzP(Z7e39sXwlgF%Z?65WK`t`S=&K^h&OpD_g z-t0eOw6Xq{)|;-B{WWEe2P{6F%s_Ib*i>L48WP5GRoh~b)~}!$XquUob%=}#wc6h_ za!puONVP2w1ass-2$<7!m+AnQs0$Y_79h5?@P1xhNx0{(0qYg{OBR%4`Kiri_r}f< zgHijzgYy>C*7L;*w?a3S$q*LL?N&t}ngw@hVHt;l8fjyx;p$8SLXVe$f;fl|wl?h3 zL-DYm`6#U}N^u)bSEori+PM+sEd+L3ZESA-{-mAF-A{t3Lv5dW_bkW;CJ|WdSgFKt zLYaiK8ZF2}({>nauJ0-Olk~c%V9wh zD`-R;G;6k&12J+aY;$`vr>n&8PTpmPVqdR zMT&FGu3dU_Vh7sV4xeOCwK(-wv`SbDt2GrB(i!D5COGQ&Y(37HvV)8r$qmsI<5u}L zIN_b}M_v9&9uqGg-awCz7%HNEQYDKD?hr&mlW+kXNIulo8`w@RUs93@n1A~1agJ{x z0me8{=QWbAD`yrxeW4YQbYTGthHX;Nu)k1FCtg&(qlp1zvlH9d8b=4Iip`rcw zVh*yo6xqV~e|5$R*{;9=UO~srXv)7u2OcXN9L#c_bH{0e#XU?DcSOEar)A;qc=WOc z%I)t`r1h|;hM4V8FN*)jvBTr3_gL(=c6(-z@J=KutW%@SRwWAgIJr)Vw5 zotUfg^y$+IytrXdTUu^(Kb)4fJoX@|b$jHdO`jff1ZL40uX0W{`@=ZW;jTs?d2RR* zpkHPRxyvQEk|tgkWw2g3?Bj(5af{s$EeOlR1=zX9yayQ0V-;3=N?@n+)EsN<-j7)O*|T^rv(w!iio?e`poZ3bn?Vb0uX{J_}ZZ zKzmE3@}bL{N4|8ZW9U1JG;@g<>CGx8Rw`f%MYiG9d4hOC$iLa7%VaT@P+l1VjJPfk zc5Ub-CBwqDwgRVth+dhVo?c?1bAzsD#=ZS3oRb4>4RaqZzYp9=7T?F)~@ z#m&h{6Qm`G#7YUl16T9pgfxcoAk|EmGDS{WGLS(;pV1`1@Af<_}dGZ?#8geshv*BUhOSUCL>40l)9`ILECh7%+~rU)`k%+ z@%~~zK{kCVZRa}vrx3l$iX*p+@Q?{Ig8+KF5opMh!OLdu0GAzvmGacjzB4T1@s#8=)jORSv(GD zKm1r`fWN?YfnSGCHB5S zo9c&NzC~g$1nn?4(-DUt68DI)?KWMxqY*go1Yq7zj!5uhOL&o~gmV ze!T2!vGi{<|B3|IBaNc|Gvb(z^ zxDsJZ2K8tzNb6H?=T?RY&@hIwOlYgVTUR^`KCw#glI&D z9Z3In18+A2TA*pOb$4%J#(zP;nc^vJ^B6?tWS;ufvmFMTMy5alE?nr=PAkQ|m!)Oq zg}|+?p{A_r8tbRPL=PYX!h44Tr?za>sv4`h)TK-ibTYPcMcX|gcSLRg3?*47aq#bB zagTN4P1V)aWvZ5%Sm`FQt;>{p0ugevnqH{y;mK`?IQYSeC6E&#x zN4)+X9vXUHG@&Rg#ZCgX&6u0kR0=a7Vrbj+g;wD?DDc8m!Kn+2q| zUY%{Nr7n|k6l4Y_Cbbyg3Wh~@>q6~OFy_qSPO>`ebLlx-h1m4_07r3IBM&1rpyJ9R zD9N!CypX)Ft2gLn^6bAi?$~j)+583(ZbS~NW7ZY#XVDGZE(`_$7DXUZhBaaQxvgB0-JYy;8^s8^ z%;RuQ{w3+u#B30g)(5zqChVR#z{TmGpz-Zn(;*(Dt#pyBq1HvHWk);(kjuj6hse#u z=Dlx~#On{ZHcOP^)~lfBN%)KiX5wNgR=`UPtgQa<(e69}Otv4{4i)bTTB%S@hf9y` zWcQkQj|X16HUueu?jfJ;(?8O~{+VxN8-EjTa(9be9ox054c^nw!z1Q@9oxY-J~pl= zY1zV_jTfIDC+x?Q+)}rfG`8GFg?0JzL@|xabL^8JZ;17-SyDR@ig3Ul~*VjozdPI7~(UuUq2N-+~-W^0xa|Qm~9--9nt{SH7=vP5`Yg)O2>OA#* z-G1W4iP7|C|D+SA)(i1rhN)1a`uc6zWPaxRyVKI0AcG54mLYN8xOmF|5SjJ-=Jr?l z#xhY~;YwXU*~Qc-3oZBuHX#|pOwf$3;%{wePICSFa_M1-`)^63K= z=$f$jP4UiciOsw}-wx8G<*B>g{Ohm3OmNaymY;33Ktu83P9AE!`O3s3mfH1uY_f*1 znG;-`H8OAi=q?i{Pc~%M0H2d=K2b+p408|h=XL7wGs}nYQ7D>gi8dT9waY(sR!X3l z(TFV&u~2!(ENm^`lOYJAD={9G^hQ{qQ1Rjd@va9TY_rYQjOD0KC7Dto1#PKMVpxL< zi-;q6&US2ZIB3R6=-D>XLC_9TWfGe}fD7i%pTBBchiv4$?H17E;!+$Q-sf8_aJi)M z=lUSdA(!^l3aw7NBliMLer3YUn6lA%>PHSAp39mbZA?%996B%?^z}<`|Bi_DsSl{Z?Jci)_fhbTh zQsvdUDvq9lvw|4%k^2Ko2Tn3DjLn$>8dd=gM=>Q%ngIhR9ig!nqciG|r1DLB@Rul~ zRr8`8g;DK5nrUyj@y4Np2lFwMYJcVC&1}AkJ-v2yG&ZjJe{k|6M?N*Qv%y3G@pC5F zf?!>m5eCnTvOc0DW*k-xYrR!yCkjvwNV!49-dfs|hp7#=)e zs;24{X}f%R9|VO300BUNf`>MGy7ax3v?pvPXs=X|g6uVl(cG2m+*tj zKz&jd^j*|MO1N!MBGq#FH;EM{4f>?IEM_INNo3CL1-SzGT&Kv5-shJm^>P zZA{wCP>lGp5R1^IUts^A2yB&=giErZhc{gT>BWRwly7i2Ut@j)I_{51aAj14p3ptq z*0Wsasz_0{?nUw%*nI~9bf~ffsbDzxS1%`N?GCXq^b9LsW8e2$A%>Db##+~v}zj*Ot!fR$3J-oc)+*-N}ZEJQqm3W2RUUzYzoal$yA3ZK6 zAqT{pD_oqokRC|kMs~B6#v|n@b!KcM)|AL3y7)FL%dOud8NP2wWx|1R$~%HmN{kQ( zP}Hs>^Z6YkWL}ztO}n&;{)4D7g0JupTLZ_PS*!`vtgTlQuLZFU6{J&a8mak2sS>f< zv~An-{EAL!jA=jk@w=rwM?nFTDf85Vw-f)Ql0cGPN6%85?OCg-PfJE+jvh5CA7Lb> zVUc6q-FJ_PC>x!S3BXlI?>2qLq|Q-F%yZvRW0&+a99#%c(XEX5$hT*i>AN+j5@q62 zomSC~%7IUX`(Dqwx@u2!(;L^E4&m1Urg7c_sGp80LO7DBZbor7AW3Ye}b% z2o`tlIV9jo9gT4f1uy(s%1efA4hG0Cbx~m}sE23f)i3RwnTkSEyiS58Fs9u$ktcXgR^X$gjrh9O~Q)X?bw*`ACG?~b`#H49`3K|iW2>zoy7K4Tiu|+j}>x4I? zXUJ}nL48_`?k##R4xrz~bH1BE3se{KAZgrR-&vAWi`&s%uG(d!v^7&uW%IKYHa^<1FGce}5lS~NqcGrwtm3HeU-{LTt%LbM zQuKmr!;IEJLbT}PXJV;VdWfU@QdiyefcYP%0?F{V7yRm={olGun$fx*M9UDLQG7vj z6fp)w;tR|gtmTKn6x0QGvf=bqg$ZrB6I*rBT;%6Z`1fA_4w&V(RP@vhGT1>n@6Wy1 zmFQ^Fpn3B;G~_@C9EN`>cMx)e3+?EnaksNc(GXu7$QY1 zJ>!kpslHOoE|}<|&a@gyCm=@LejhG2QX5ISfmAFYWpUUti3m!{J0cLSC!$Iri0E@G466OM(!AvWU50W`k{@v1k6Zlo`$jhbVu5dxon>yfyY6WJvcn6 zHZ!}*TKo1=<-vGCS_3_9}-5fS1eM_K%i zBA%I~K&nnO1T8JYZcy{dvpz@y*=4G)YE4Kzho@{ z{Sw3bLECFw$#YPOK^=Ew2W z85tG%NL5ymGT;NNQlnw`fE!~Ala_pcdtBt(EQx9kml?#8Am!=EVoUp4X#OS)BS3Z;P-q={f-R9F**c!^3z3Pd#86~_kqxC6 zaiDb8)YlIe5gfSizm$>BsA0qENg^Teali!Q{6x%_Xh!J)k|9e2IR2)5Kf&+Meh=$$ z%C`oCwcEN*(-Onea@OVe>@=3z?VnydA|hsfjX`8LJ-*_LLgxcjLN$~-%ZS6DfAqrQ z^L|ShL`SL~vHRq?(+^()2C4hX?I(@ArR_ z7A2L+Dh8wh6|_Q13S*1g+>bGTZ*H&MXU6}Fc*8b9KCK>;e2X`M6zZ@05-e;V#yXlr zJDQB@bLTJ&)&t-y%1y$I$kFC>5b?sA#edt_9+-(jihSLkoyzSvo>kLH{QH)OB^JnE zuGgY>EoE>B@p;OTIwadspb+JEmRK}h#L_a6+=ysV{Oksr)6{uTFU#=gF!%DO@q-%5 z$hi>mW9Os?VS%OWXe?iF0ZuG@+Z5#m9BOX6CaCa4357$Nav4owtvvcS2$gE0_$1^V z^eJ`DjX1ipIP3nVJ$u4|7|tDZSkItmgZWB-@h3M0)}n{(m!SL#e6T~E{jG$|GoNnsQev8k&J4?4!1FhRiaM5BKDMy;CdP+xz7~}- zK!zvpTUlFAK)WUzM>svu=uRi4HzD$0VD_Twk_{8zL+B)CoC1lNE)V-QqTPXhiaT*) z)RYd5Z&Wp)J9jph1{6v5NMXSoj5UP|B!ikZqL^xOq3(RCEkn8va_!TVkG?aIu9r40 z3=rr9PP(G$d35}MvWT!8+~aIR2V38^TtLJ&^~eQ+O#CBKvyXXYKhxMEuXwqu z=X^Dq`+>|@RkC5wB?x-GZrV_pQhhv}R9r};{xOiz3Eic8S!Tq%q1Ag@$JS4|& zsCgVYMIfurojaS(y7JBy)(($CLvSiEQ;UUf8Z+M1!O|@V{hp$QP9=Ty-a|iG#hg#p z67n$JSLfu(lfx&PjcqA383m{>l7o88gmqg8*p2 zDUk!Zvxs5O|EjGSx#Q%?o)j4$SUu!H$q#vURkXs$(r|iF+?ka&Nb`#hi9yySw!H{?>F|QEq?FI{6>^dun882V5z9 z+veBIP1_2brsZ~APu5Zr;3k#A;*+iXgxD8GOZ6C=+$6E z8(nkvbwpft*3^R1i!F4qL|Y*S17r{uDi6)|b~k~m==-z0A>$o_r&sQ3Y1r8sa*vEy zO&Pn_Om16SrKnoY%IpKR_0tCwjM&?7%Pxzg^&1P0nCM$=)==0@dfvN3>y+hxTrXT1 zd!bIilBk#2;SS@5`Mpj(4wtPT5*9Nb_Ep*iJZo#PjR2tN*4j^ZwkDjiKQZ%b$N%8! z)0OhCC5~-2omZAFF+2L+*9TL`xSNjfhOf8pM%>!VEc55iH@zh$tRUb zPvfQ(^{qUm__ev*=+}>@FVn+^Ege(pSp30fz@$Dch7PSBZT4wt>%EHj0Nc+87ncWA zJ`0Q^1YhR9%ZQ&+kQ+CG;eC08b-e~wEtEvZSlXA1(PQRq3@Eh!NR;Bj>%Zc$HsaW)n z7J!Sb6gx^9m{LX>aDRlZOcvj8_GK>jALc4z3o+LVFNL{2J{N$H&G7=c@%^TMrE(x= zx7DMTIj5jaFbnAq)UJuGhUKsX7O=U>urs~;?X^Ptd%oeY3R^)-y%Z;<4`{OAlI|%F6F^=!OT* zQVOlypTQ(|g+M)OFRiy=_(>m!{Sa)BKm0+SChy*o5 zXkPEG*T6zKxXewiD64&Hyc@Wv%)QEdG`y8E)$n_jvqqHKd7FNXkL+#Q)bw4ooTZa; z=9@Ly5^nQz@T7vcn)71Z?e~v)5%XwI7YyZLy1d^#?nxVt&*Uyy+au#()cIm73yTCV z>|XF) zLfG1|SFdKRTensUTOS$;5rkl~ual{dkB==&g519@cKPe-yG_ahq-0W3PB3w1<)&L} z8L+FN=*V6q#RQcI_`==qmMz*HQhuAW+lj^PvI&afM+$J|E50AcIU6aOn9=h8;8Ya< z3I0LUvZw*{l<|M+IPia*8if-hafXI@HK4SrOSAFj;jzI7a)LAB+MbeCM>v0>A6%u3 zI{dJvhcO+esI9|xW1r2P*C;OPSugqGRN6p8F~D)p?d-!b3nSaN(yf;BNHJTbwU)J~ zO5@R19gN0k3?AhMl)|qwv0Qxv?TQt2fsAzuIL>LleEs^eS5^D~A|*RJyM))*fAa&T zN`BxvvH@aPT((4Xc|~r0HNPIUhRiowC%YUDpsBA8k8Fv3BK$cXhv0(1e1(6C-a1g2E+hV}dK_um5;IfZX1fA!}T z26LqK7Udah01GHXxbnhMMW`|KEh}D{nyaOcx)PTe^SpcXnJnM*BwHXm+d$u=61gp$YD%zB#;ha1TZCPye)tN~b=R zFZY_M&aGy0L(RxJBk59H@D}qGi$M~=Jw7l9dLECTec$iJ|7HuK>@xk&{Xdee-Smz^ z5Q&=^u2KC4j#~aZ)jKUo&I$hJQ>~w>h>B?U1A~LJSR+H9s)Tc<=@F1!JmmBXOb91T z{3$B0t$Zf24lj^Giwpu7yAx{_gi1n5S{MNaSD=} zXh5R}$7XDOit;lWxV3`$xK6A(mJ*(DuVmFs9l3+-muJE}q1dXC%9Do2ybC{U`cdV=2=0Hps~}?<-5}NpUWKr+CHGQy{1bXy`u(0t znldFAcMavkqWBl#mduv{uQej0!K#FjJq#(x0ihe}WlyM!mn<-72G9EQ$4e7r4y~rX zp8zXj3

u-;`60zmCml#3>;j7kdeLxt1hLP4H?;fhScynDb#Yz-8DqsDheQZIkoPL{0$i9Im1e;Xy^q? zd3)~HPjlJ8$5T+rTXyt4IAMR0O8(ZyR)bxF3e&a09q&|%Px@=>Z)6o9cs;&98c%04AnnriWf87O$E7L|Y zD?^KiriamL8L7Lod_0%x1NvhZ+Y0CZ>G4U#(FYGY3b590mu=E^=TQqSV^YR3187{n zS_fWUAZBdYv1614upXn`gHrrPrCqMFtSave&M=3foqD?;Lf_SOnyi%J5K+Vm#*(Ux zP$%erMYV(DjV_uS@B6UXfLRR>+~j0tOP*DG!lOi~r)PRX<$*h$Ko6Leon4bJ zP^pErP&)u2A#zaZ5|7g*N_MDZfv7kk2@?!ABV0x7{kdTEFb^{-W|wJ17nw$%_)sxp zOT9s^Hh#6V$199nRlEjT8!juzfy$1`lbmnl z;w}#kh=uwTuE86wM@d`CgIg~%d8RwzXF%T$$rn2A1SZ~cu|faqV&i6wLRsu6a8FaB z_hKQ)7Qosf4}*N6y>7(%IWdnxU8?4N=353;6jga9I$7I+ZF}IpCbkLx%r%wVGN}AX zpW_9gisGq-OtxHqW4)x2$=BMBx~mfU`?e{r7G3d6;ngc6sa}AwG2)uSa1rSd1M0PE z6?c2B%~c{!CLrD2w7V$M`L-{hcR=X;`Pw{Xjp(5?4WKD*FRb&J4gWX~|kfy$TKD}2e)rCzYG6)5p;q4Lc2&PiqSDv}dBsgTjY((^k>f;3I! z7D!=L?fw4h4jrnk+0k_IoD{znTPqz7D=yB;IHB3HQ%!{^Y$VgcxJ)20Q`o)Ky(+`L zVlYH!MW5K=$x{j$1aXqq#(Yijm??gqM%< z^eJT@OWMyl`*m{ZlU0vUNh!fGe!+nfzAh1$Q|Y;$e?P8{_AeC^eYdjj&c%tX zS{(1;FEU`6fXHH7S?T;fS1#^oF*0EBJAfDJ9O8m zy>_nE_bm^%PafJVcGix84cESZd@}s#f$)7lPhESc(evb@J87fGx~^L4e|+S_MN^J< zAAWu3k7AWNA4+R*yN#Ep9y|z=?jL^Oc38~t17T%z7cI@{)w{GH%dffRJdLPlyR(0M zF+Ovr=`1HxoeGl=^ZiaOFh?jmQnC2ep}tp9N|NJ7emiCpBWan@57XZJcxOh^MpJ2s zg*}P}PvO_StYp|tUZw|#mh=E?!ushXaV+eI4@Yp-jB!2DA6;h&e z@xq0CjNPOGgvwL?gxHagV@QoPkZ2(lS4K)1(LxHFk7e$G^1hBP|J8`N`xdk>)rG-O zZX;1H`PO;9Ytd8Lye+QhbQq&04Exp~PL|wGs13I2)@e?XnW{tOz7Nk06i4U!R%1`! z`08pmFFYEt)xi9K;^oa>VWZ!tu2}YS`L+hf8q}x}lyL4GPjkdx^MRXs;5}CqKJ|WD z6U&onm-z8@U)IYqnDabzM4~^dkA{AD0?cb1nPChffjT?&c;|ejDER*NP(Z z`V+q9+??C(^`*hTzP|0XAvDxUKR>ViH1qTUV?k5e46T(>dTqG(%NI_~ADnB5?uG%j zw!5r9ocZ)kMl4Q#8s6j%7#WDC2=BY?PCvYfuaG$TdlT6N@HZ~kzu%wvus-{Din}Q> zbSK-oQKvEz*^4;F1`5#8FP181~#M!RZU2sY7)!xl% zf2JLMWn!h>`d!?OyK#NtjZLYBP^Pb!5oT4sWmRRYB_fESs z@rB*n*`88Mz;N{!@&CWTeqDutnY%UPycyr`RpY0Q z{hz&xJuq_Eos9dvrh3}OpYqW+7_?^X>ExW@!80DNn>6OQrH$8s&rUymU0sh{^6z@k z|HQ&sd-kcWShC=!@6LHI%9%J@Z!~Cy%96WD{pv1R`m2-Akx^#8DGsBLO?4aCer)f= zl;Ku?4v9K*r!44I&Tgwo7yjDon*M0drbVwm%<{!0H^ z?N?>`gM)ihtp2E6(bqiv>$h)73)kED&bjmG8=`6Lh7IGeSV;oIXOYX}w=tt>A>UV= zp=N#jLFVUQ(@2%xdwau7cP(?f@z@O@`I|h3wz4$77hePqzU*LQ{Zj|Hc;i_49VEse z$b5F(P*JqJ-idF@k#uwq0ZBPyF58Ex$XE3^81Z_^^&ZdeP)zUR&$i!C+4&IZ2h*yS z$tWh;=JBv>eO>;MuRM>c{|=eE zwUN=bVXBJ9S*Zpifue7}P}vllP}IyJyr7`{^5vu7`7XWr?)s!-V{}d~PM!U9$gMJ` zykkpm-tDOes~3pWVa!u~znAO)^Rbs0$F%0(nN^rb?vVehztIp0-I z9He|n#%+dNwXsxN{-q2n3i4#ywiK7-jqXd|cFXG-FaiOQBT7{8f_O63GoP?5=&u3P z+0INjqDnE(>v^I+D#_avP(JK~&ucsF(z9pdkwV-*AxfZ9gnZcv)7qXX1@Ft@quHjgOzW%c@yiC;e*?;ln3?e)svy9Q)j}Z$G6tR#y6( z?|0j0_GQ%fT|GZdy_vq`>KETLGu7+9(eE(m+u|Q9@$FgiYJZ!dmE)*P9v=O=w65>` zm3^YhqnIlCb#)o`c*j1SuGX}>-}V>g<5G)?di}DhoL6z8&#vP(2kJK7H);IrGw)X) z-L$jw%%P{sx9+*Jz1u!QY$DbOufe_V6Y2;drZv>mo_hBM(!CTs?b_rcrOa5ma;ENr zuO=?>s{8w)Z+S9%Yhq$zX&nnk4AiBJ{`~IASe{;&UDXuU+Y8<{R9I}jK6wQ5uHBeY zt_$jkGvwY)^6(Y@agahST8FK>PhzuC*bV0!wGoW{t3XZ%{x z>eP}h{ifX5eSfLfwdnYD-oxHE`kz{EH7q-9&%GDzpS@lc{vu`Q_a3fkL%gr=>0(o}UZv?E zQ)i2^7U3KJZc%(PZrJX-#qCDwXpOVocxT_h+E30zMGqQb`2Oq3)Uo$mf1YyHX|!lW zx^LI}>yrB){do0*@9Xu$9)5ndYJ1P`;RpI6aEX1Ip4oL-&e(6BSAtE)vm`06uJHid zl%jL`n+RD2HY!{z@6=JpidXnsg?AY3aCUF7-buCU)hS))bMB_?s4?11mpv@~AQMK= zx^x5Vh_gC=Dfq`}HF<8)jrAwj(Oqjto$DB+p>u~_zq_oK-t*B?D8ko$Fi-?vjc65& z7$<>v)wb=GB~K%D<#}%~w6q+9j?9q-W$3qtyi^QBn&7~w3XWx)7^U#C%q|e+(lX#5 ziB+8NX_htXCt<(EPm82i8JZY>a-{nbJES{~2tJO{sYuNEB~w$ToQ}HL!QRt8S=2AR zQ#y5hQ>(#y%txD_wsP8cw&?-=%F~W4%G?+{@KxKXgG&819>(?lQk1;*ZbF{E@#SMP zKS;vOD@q=$-DuIL-Fx=5UVFTE@0q4w-)GN$*1ha=y^m!Fr(M1GN)+cpj`f8W8x zr@`8bu{@Phs$e(x$Mt7RQ}1q{7ghJb(rP@R#f}S4{{ecox66il=s>iaG-(Us-fi~d z2kplvswgI!omr+D;3GRohVJR}2hk?)$W0VvHI+}-lubBXH5UlMaw=bP?#}H`W{)I1 zQFeE^;6EOXu&e<~hWn(M+*R7VcOa2Gg|WMbXO{VdlyLxnW2m*S>b=)@1D>1cO3tY<2jz=c{1Lw*L~mDeO~8vUgvdj>)p06&1~Nl z=W1ZBIqQ^H;mRly{pLh`xEjGB-=waY;(HIWJ|iMDFtWrE3=Vjvf8Iz1Xq$pnCp*{_@Ry+6tUL z)A#UNlhFnVAHk!ASoOzb*vGOy#ek`;dLOw75M@x4KdnK-{^j zE9>}TeS@!8(aW}Mr{bO-yYDj|nqOPzLph{Vx_6{ys%Lsk{Ar*n`xhtWDBn?IoQwe~ zjB2rNDG&Db{l25A0f{7-s$G-AZ8~T?zmB|t?8Ut>j<~@ndKXPX`p_=6@Mjf~5-_S%4s@O>T=K*cmQeg^gF-_MaOm~m0#>{e#wZ1e^ z-FIQ@!<3V@S_5`t-z#oTOZzNLU;o;YGG||2VOs3{MU{PP%@^qik3T+Rd#5<(7i?us zUtGm0aIYLOcw(wL)5zb-F zI9PMr=5yis&= zkN{99#+L!@>a9c*mMkN%?iJdrtUo`?fKiRdm?n^OHEo@2_s2nLcpp7g-;oMVEg+Jf|PHv~(7V6}2=8UEHw0ArP^KDS)vT1H~UU{K`Bkky>VEW}ju# z%QbT>HC|S}WIUPG@#J-u_bz2Ari({SJa4>vvdB^N!&_FycGmWdXRP#`$zzke!$*ST zv;1$)4W$T{>fX0JHOVQVk@e?%W?JT*m-CV>nR@S9`FX$B#jtGNGk$q%(IXY)yts5r!IzhLihg@9vZiA7-MR)6=Z73G4*q`ehg0JIb*3=inTxhx zvo&iCYzyY&6AE8vUfA!I=IXC`n_3_9(m1o#%X4l)Kl4b$PTwaBS1K}2$GwsA`Rlsp zN-Ze1_*m@M2PaQwlZFE0GT!paw3$tv>%F>6=;^#A;4gz=$P z#&e&)L*nYw`NbBeE~J}B_^2o;4T!sBfAdb(Y>W}*<>gGx&Fl0~C308dFM#d{B$rrZ zKVK|J)sGz3NL(H0+9nq?+I+B!w@ocjDU|rtXT+B&8K76@BTn)&v`AbWZEtgCpp;xg zQH4)VZlTi^OYTcJdjc2Xn3}PcSBj|Ov z{-bnACu158Zp}tEzc4c}i8|pqQ1tkshu}%K%6a8uwrXZ2hi4srrKKV2@Y*ErTDWw6 z1%9>l=*S1&PgkD{B$JbaOPuHl?A_)wi&^KF1%zE~j7SMbqH?pm9LVfLvDoBzZgzb5Nid0sS? z;e93N>(oa^-gaMIc)p!GUDG$2m%w0NKVP-16&8L%a$>{^4%Jf~^panM(i=~tvL(3O znT8GjuIMejQQz8XKv;uBx1Kex{!Y}!%6S(KVKqj#@p3LzGJtQOKJ*$QWy)B>%AUT% zNPZgt={9q4JOLe%j!2s7)Xva*cq)f13y17+G~a4L{jEMAq3h_FBjr4J7iIf%Z!WJW znjWz-b?aU+(w3_TF+-{jn;kiT&8atuaT|yZR zvh%;2L)@31xNBM89bH+mtN_8*#q++!sjN5+_vKrvd$`(y`1S}U{2U+0bfQ)cSvtlP zRMd|bI%j}GdH}s6)QWEi<^oXQ62`0&4vth&vrmMbMPcM2XdWrIpLfYUIZD@im@@Rl zYi5Fw6DW9{MY`7YRsxNQeyf<7nC=0Jl45sF*cCb#_Dd0r9T=S$j-}#7J2MO@+dy2L z|N7eGLeaQCh>sL#&0`uaEwikNR0c8mFRCWf!Jl@IX_29i4_}(B!%`+nauN>vZcr{O z)^4(IkNC7!^`lIPr&oJ3km_@nc^4jDUYnAx@mcdRu4ZM%H{3=d$}cvAmy4=%2*V`w z2ID$U9OUO7lh%(7vkw78f5bm(yd>6?oOgMd5W&c$yj9lY8Hev*2jF=_NKW>FDJYS} zvYHV)`{yu1M@^;1c`c>n$iEoV>5Obkuoo@c-@g_Yqwewus}kMda02fRKJsD-mlVY? zdE-2)QApBW%9=VFfXlW1_$VgPb5!ybo;1~|>j3e&LulKyZJUi0j|t>2=TKn|PX=Qa zHpaPRdje`iI_MipzLHeV-L_Wc#Ztb-8_rW+uhJ%eEu<8(yi(rbKdB44K%G~1d$8sB zZ5b7%Em>lox)lKp_wagW;gIzV^J9<*M+Hle=anGC)G7jQMNY&{z%9-hJtYw0mLrl; zrpl(*`!Ve~{!HtMaRH6j09ngiULAl+dDKrs}1Du(~xuaCJIC7rY6xG zpHh15mlaM*1`hhf&!6vrX-;R`kH3}%1Ca$USjc5J-8(>?C9g6Ivz_4y^;K5+LMP|#<;B7& zb)7fS?GOY%A5m_=&AkWJ2f``hPenlf;Y&+bkh^&|j7O0S3y~F-2Psjq8s>T6C6!TG zHoCe!$8#*NBQ*HY^&G;Ijy4k12wC_!v zQ0>40KZ3ns+(c;U{JYR4?cTYwf*e7O5y;D|zr1)%z5s%**oNx$z<+2TP(Rbf1+m|e zB=0{l$Q0AiK@`{EkPhgF!BZ|I$wn`N3v~HuT>C>t(IbiRt9n`h6{A&*@-nTg>E6RB$W2eSjD3xB|%^0Mx$CN|I>$k>@sdzM3ag>zk7(VIJ+Y)ZH`1~`^LL@Z<*`)>1`B^@oWYJTQPzF4#=Xl1gVla5c)!J%WYUIjQp1;BCM~l9{n2BZ4~}K9%2> zr(Z@szw*p;y1{rM+cH8XNST92XVuyL!iSs<@{R@=QBQ=)&r555t>v2bc~{Vn`yZky zEdU=~_*>A=?Gq+(#0k%pggJF4pbZU>bzLOXI$5quxY>Il{&<2=A+&u7MP@yCOiI@n zyPTI{R?$R|srRHF-g~XHhX330)F){u+ekU|Ttyh6;&#Jr|J=U&ka~iY9-7;3^-U?Elm5;LS26nITL}`(zIX0mE4U0XxWK-G*~xdPk~@9o&J(5?QqR@67NQ`~ zuto+SE9?0J-bbfE(D{8qW+>DEfD5`aR>I*vi5>&UHWjclPv?EPh=yu%8YOO%dW|?VNLAMfqK-*&`vQPTq?y_9V^|REYsK& z{#dC-=om+aeB=7}l7G*!SXak7UQSW0j?`f|zrdHqA;nY?@TAltdk|dfM-&1lQ86Us zp_eQn;Y+%)jeUrw1|Cp^&!ugsRTPRcxFU(`;EMR58!A2ddpRZF7t0(@g{I_TJlRse8PS%!+w5am&Y$4paw|=DU{)9e|*Y*0CxK>yoZblN$S+KoYZgd zsHdm1(Vvn+IC_{1sG-M{M0UaRh(Wt`Qg0012$RT;rp^It1X{RB%vRw)}p)dI{#2hW)!i3BS(qAX*lux z+t_v>yGL6g*NwzBC1p6^Ou{z9lh4#vzJMzV0 zSM=yNaF!?ejy(!57oVJZW%&J*kVOB~d4ly z1yv7q8lbh;!QD#3?_EnB2O1s&%@{(D{SkLP+0tFyzN(Dd4-aDQ+s7v+nc%r%$c+lT zgqTLiXV{%K(ef0_v!Lt?9eVvSEkix6>jLci^+_=WW(9ZA=1d|ObXx0RF-r_u;rBhn zCV{D;>o*G+l0v0uLeD1D5yU)xpCw>77R{IdEB2CTeEo=AQTK(dQ8QnN`M8GUrAB?j ziCy!Rd|og7J{+{Lnio#a4UFnqth-+vzxCXBuq z3G3;6>Z?!MD;+-;Wn3xqT^zbv#vQ(=*s?yx@p8{e(~!j^uEZ1hU$Ux68uQUMd|#3! zT{wV!;%V)b@h^Op_xo1In&h~}1iGviJbF)zji5iw{Ou`((WJ=j7z_lS;O;%JvJxo2`RVb;=vIv*IV|uw*_8Qyz(*MIp_3{~p$L74)VB#! zoF3xf`~d6~PKf9}T^)WT+!@Wkr99Io35}1095SGP6;KBB=_Qj3!z%Y23gkJ4?ITNF zldnMqN3uO!W5NkNVsg`6%b>^20EYPtb6T<=SV^!$&M!K>?Vh2wrczy^$NiJ$2m_}h z2aR_2C!IgSbHc3V?EBaqr{m9#zw4+B+*0lMW7Cn1SIXt(r#e1qYj{1gig;9@q;_Uu&xYJn21zpm>Sk1u*!)XqNh-9TnF6?oS>Uysf^5*fXd>K#_YNk?$Q2^_pHp}R~*+u#4=a7G%>%GCHVMkzq2m%893S zDm*xNs7RMI);?RQ^ihVdSI(y4!yAi_kxWVD(*0!zf(>eVYiH9!Bj0q*UU2z7+(tKh zN@+SR^hAN<+ns%*&q(h1)YtHl?8rI83kiP) z<32|UfBg%6d5rji{W4HGtw4~vMQ#p=?dlM>iX|X!QcBc?xqgN z;pDboAt_e|sm$UXd_X*&=4PeXYoeq}@DS}?vP#(BCG{`->{^m_G5oHq4nT2U)cCSI zTpGv3;EhVM6A!q$BKd-jF_ZB3qzH=LkK2UzjP3`bAf+$;!~LGY&tTWET>oE(;`jsF-(0c0br7bWtl>`gG*kadp<+g)`OH zLJ3bf@#oL}giB(#_MF)N7{d`!h-r3elud)l+dn3$YbAD_x#44db#x36zzA~_YXS6eCaQglYb2V8-Y2S!D>%h@JFlMxY^#eQ*wcxI#Hn4p&FQ-%zC^J6X!?>~Z z|7E5h2oQPg?fKlcO&cIfBw-mdw0AYrKLw#yc!nDT1)5hs-_p_7Ea~Dz&&nWb<;Q?F zP$a5AS~T)!TT{s-Vj&^GNEU=(mIkf-mw)UKGolCM5BbFzGPIp!h_r$ks!puy$<3OE zd9e>+eF(zOlJG)(Yhm*TkN0L)3MKg^yb}3jWQ>sy>EM7sA*5+%a<*projb{0TeD8W zyE@l0+fZ#lLJij~YRudadf;Afab_@9zy(7li*dq6bd%A&)MLpmDO zjtu0YB`6!~%y;s&7vYs}8<_r=y136R*XS~RsQ-93av12^I-P@bAY=H5lH+rD7y#Gn zK{`VY{}AZaz2Rl&hW)f(Gya~O+?TLq6&Wssw&O=cRDzsI91seJ?g+BU2URFoK>U}n zX5-F5XuHJlS5;;}wDu}!M@Hx^5Ca@1_Z%-I^i<_|pVgEqEo@RUg!(KpI?%r4A-aG3 z;0K|MT2r(}^-uWy-NpKzgK8H&7B7JCj_2FoLlK2E`|%MV$Y87l_K-B2f(U6qBqOE7 z*V8?8^$F4j@SE6=&!I7Z>gB}LlmU>oI(ArjMFqm-Hk(gR@1eq)4sDrIIGSp0^9f4z z%QW{2RBVA;9y!X0(Beot{(BNoG~aaV*UMOEZrI>=# zma@=vi9I?=YO*BBqG)6SULh8Jq^VPII+8(d38H=t?Bz$#B`Bx??NF2N!Y@v+f>q88 z3kTtN1?0@r%*y&1iagi>?81U-5^(3lwi6EDWO)Hj#h_sV@H~c4C*`|P1hW+zsqzd$ z*MTcH05&4UMZB^uG2)uLd9P`^^UAJG@K{ETjr9PiDjsD?$389a05Im*UwVW*i81o_ zQYM6I`SO+yLKrdqUrpX&2Qv4e0rDU+-CqU?SXjoa7RMOQyZ+U zA&9}U@m^=&Ar;t%nXu@+Pq*)WOG+uAVS=t-e~$)nL1a?o<6~^@F>KanuwZEB)5rqp zycPEXDdZs&CJ-eJom3^9Kys2ZLd)FYZ1wwtj%Efp@Sqzv$fn16SRo{*aC`>0xHAl= z_88~CBd7Wb$!0Sq5oD0yze7I+?NoytxrUx-VG^7ET`9;J$p=JQmg;2Bh|oNIG8_~A!$B#@% zTVk;HQS>5()vdx7SCIs%50tFa%`!ECBgiq(u|u2E&SV>kp&_j$>*UG3ML#c-W(a&f zvpUr0;KcxSO)yfa_@yWbRRZimB{2K5l(7Y}m&u`KMc~5JT(W^AGC(xDySYU-_{EVa zih`y^>B#*_wqZ#jS?4~GHUR84K#Qm(KEzY{Z6x7PQ-0o33X2&)J~`0gZCOtj*e`r^ zW*F7^e+Qz0oG|Qv8^kYy=@6f;hlD_8S&yuZeI1KXi8Dhx=>v9N`0GyEWKwmEFQWtl zkgEq$lRO;eEA0a;IEp?mL;Xy>P}x7xLz_zY$|@>EjT+Xzcc0P#lXL&B)@ zAiDik@mwcZPpkEZIQCWDgJ?Fkp-KoLhDJCc=kY)pl|VOC3kWs1$0$buJOj{)xJ7Oo zxc|)+0gUMU(nK{jEFd5t(ff~)#;X;#y5l7rXzD*vN}3sn7-S#N=f-GUI*7aL18_+u zKHx*Jg(y>KbUkx z;9)3Db&rMhp!DtVArFDf8TUgB9s;VM6bv`2Pm({WpEZ~r!DyHgCCjiAQaTWYP>M)gg98-mBs6@WV`hk?;5jNZKwKG^<4*X> z{~qJ=I2YSJ6lFm}$0B4{kgZhFK4r~Du}eYu&7bwJV~9;oXf9uzMw zyu^eSTdDH?O?!^(VqM+>#fDr6E!o&22NOs}6l?CkuE%7^*f{;FN{OP4NvhIS=# zc@q&PV*Wo$LJ0GIjR0-1ufCBNi*4aJ%S9=;qx!MRMBi=L!_RQqtof0;+?c4JiLQNRhA_Rx>}4LyJHf zRI)?beFE(TL-$d0A>x8mr=PcA1-C<)+}7P2rob?^zzl=rpuijCawKH2eV5<=WNfSK z>Y70u%FR%FOBKoZU~hB{l1dNu=4o6pY~NAe0J5<1TAhr4>0`UlQqL6{W#DhI6FAxV=HCgE8xKQh+tzx;cWy2pLPTB3b2kES;72G779fh zDFm1iked4t4@wS$iP8oiep}wxhq!d$nO0+M_b8*II3CYL_{Z-=xQ)iIzLAmhQkCYI z1DFnXfwKrjH1+Nk`nx!|pE2)th(791ooM4(KoLZx*iN_Jbp);mfq#Q}6*#-?de~}t%9F33P~YbB& z!fqM@Py+1^atp#bE)o%Bo?+CU0Z^UmoUq^% zBNg=%sDu6MRevcGT5~Wq6)^!sY`Nu$kon)p|)6GToA| zL+|cgAu$3;8?u4pWEcE9^Fx6+^N#_LNFM>3m5CI(%by^5K5{!De|hlV6)F)1K4UlL zCz5SKq8CREK0HAmgRns{pvfw_m`s8lR=YGzbReQPx%uBZkU-;FY=$@^LEhICG3^enKdi)d zz%>J;$G_2T8l&MrhXmsT$pCTk$nF9b->#k@=Y1UQ%{j;23s`Rvnd)wms)=?j#Wj@z z9-bdih$OLivj2*cQm7<_vv9u6PV|{QN1#7)^K7!O;<{V5Qv?T)j~SqU+P%`AQo>HM z4ET=4H2@7?BA^pQ2IdvywtJ}Eeh=GLBy!-`+G|k!LOqK}NOr+71*hH$**yu`q*h6z zlB@inMyi??S_gtj0oSw+(sPo*<80irBCb1p7fO;~`^<3_;SR=mkH8_N0}dA*BggyJ zl6I+?cNlGGzoy*;%m+=wAmQ+qEX7UQQb1^j)B5N?nHd2A@%}FJwl|CPcjZt$@TY-Z8*4cvTUO! zoPtbfai?cLW`#X~jRmPvqRvBd#B)8sEOzt$>r1YX;Dzf-?M%rvOR$YVHagh2;CuLA z&HwrGuR%lN-Q#gCUe34gVX*cDB%5Oi9Tt_)CgJ31^7AD+S8Slzp8&jYCa4Q60YP2) zdojfzj!1Nn)shCERHs`NaBD^`aT7F1I`$+fkVA8Ag)>en86>O#Nzv*RSLh$1xJU|A z;HfO6%Fi1LY$3S(>=jjc?i+p&E`zT~j{Qms` zyc%s?G(qws>(&P|0rz-2sZ|WHjV+lLx=9R&(0BU*ue86v|Fl#k7nYK|KxIDO`x9?P z)sP*>i=3`WM)^Kg!+{@)Z`gpgMrg`q3?zDLpwV9(cqOzC_biE5Xdu@`ITjSf8L1V5 zq@YBu9U$AgNZd?mv@Rk4w%-(%Q}7`C3T${Y;pP09>@xMAo9QW0Ee{kK=aC^8uUF$K`S3AK;2s0VOtg+k32o_x{N39v{Ny!JJk&IItDl^bQr_rIe>?H7OAwMLUN*OIE=Skc<+g2e3*Y z4$)%MmIgN{4YnZ%TX>Ip=suJ@kg(`;adDvvwjCuh;D!$fOwfKk!c|K+F#K-PVE{y2 z2htZVbGwL8@gJF~6i$x)HXq4AG#lwZGQ5YPN(=fP|6}&uc41-U*`!_6Py;88F*;p6 zM74;>RSN+tKx9!TQTpVEo#5pZ!Lqmyr9?eLk0JWSD#)^|BZt3<#9`Qp(iAg5U6=5E z;}$ZMk_>d>C_}|cRLBHdAv3>=6R+F^HjF+hKNZG!7l%I`BlTqDn|J^mG0#8Tk0`+$Uec^BjL{Tp0TMJ=zD+9SOarJ8fP3vdk#?&+zKO z9+P4lEn`^NKQwci19Qe8NzoX2z1wOi$x7AJqbpfaEW zOZHkhiOUm&&c>RmfA#uxlU$qTz$ZG_H}DWu4Q*-2?g?5{de#AXc~zPHmq zmmn@eadH&8gI1dGOrj3Rhwu~lz^b$(=2r}%Jz);;#5iKFWZWkP<1V}oYq8b?0gkrW zQ#jhALr9mywKW`8Y{wpqj9}~*BBB!VvmmM@w~@GAyAVPj;xkvfhbYSF=yZqj?(*f! z&!GMzACr*ZezkOK)*OSd1M5P|y_Q1RF1|2`Bgpj1&rUo zp$UMWKGBqtS0CKV&qA>ygNwBw6S{N=@sw^F*xE8=rHKxkEJ^K`RYE@<*Nu7A{u!Ts|oFc2=|ra z55-Ru$-`}k3~wbPpEh~raT{oNG$Sps33b{{D5Cfe6_LGaXWY!QK*2xZXK=g7E=Ag|5cKzUK!tri~xT#bHc#~-X1`%51{HLe?gt>lm_}f(QK}R6&!e^l2 zPr6e`)%L(kJOgwpQm3uFCQJO0M-D;(g0`_=Bca%GKR|!Gw!Z-D(qA9f>MYowD4PR19e5m1InS6gFL|o)Y(_jQnEkMoCCd>8s=`Ezv2xEQOx#3*WbNDa2nCku*cf0V%4>NmH z@OHRLk@r&Es9>n_Z$i4whek#;BrOhixO&}mU922$m6TMr*>sRek6$JDe){pp zkJHsX4W4^sCcSXAac+OuoPJy{CB5lRXS&JrsV&dX)KzhuF)o%rq-3M&c)BPlRFUJH z#uF#+uLIPZHeT{y8?&qwnX1Q;(>oeun&v_2v8+i+<5ad`I)?0^iXbkHGF_jUzxg|W zAKU%gAaxg#4v9|2@=@5ZkNc=GU$8vWU<7fIuEpN5s#IpiYwLqb))LznQk{3h65OsS zN@3iH2BFAfqS<*W*Dx?xfiS|*;hQ)!;b>cNp)!T(>Uu@bz`ArMB!ao4qhkmcVa4*A zgJ_CT0mluCUNPyQzU>g@z*jv11rTUQvxLk_{35T{(F{7mB~5;KoqcZo{k3Hg&L1%5 zAA20Q+y`*k+LE$^g{gW!Qs$#joUmfy+m0zX7J*CXv6rx$@eVFOgd3WWSu0b++o1tvCK;5SgyKY#*A{>%PupWnTr?wpvc?@A|Gn)Mn8x%p>)`dg}q7I}6 zOmq&mQt)KE)8?QsT8&UsgL79O61D@v(4R2z3I$Ln1+_1x@Mx(%3zwVSa&?wL%zKGG z)9!@dpuGeJ%&V_VtzpH7Jc>9~7s4fp2FPwykbB{d-G#g19%?%n))2?8N^{k*>pnhy zPl_{$mGm}%#i$1ZYv%%Xt@^&M*Dmfh6$~`P$kA&%U4o*A!xTC00W9Se8G^Y)z1wDG zT6lai@_0~{m%$dtup=>WBw~*VOv)RF0$2;_Y;JF0HQ|9nJm>_Yf)P>RWKxCdBYALR zLE3Pten(+6lRviNH`2f>)$=-gAK{BOc}URY;Zg;rYTXYrLQW8~(7}aHd_J+oItA>9 z%-^4-tlM_4BF>zcsAN@niw#O07r5kHMuMP?e4hk)Y!mXQV9jREpcrgOyu{PcWMLOG zg$bzSnkZ0Dpnq@;7(OA=SV>#sFY3I~Gbm8WA7%ukg-T{& zx)+X4=6Ei>=mm@rh+qw z6qeA|^F?q|dvT$X=^ZghHJdPU%vdn0Eeu|p7}i=@SvkxyAr5p~++Vy=KNHx#(9-^X zyg9PWNPdHcVV3YxWSTjspd!;D=MPo3ebV7Hzoox7gBZ(gLF8E?(ta9o`M0H$dk!;I z>p#-xhwVfU*a05IC>%CPWE>-QQt#hbKZim?1=v7ciAVAp{93WIERcWG-WHn`KowbP zAgZs9Tq~=Mu&iyxzQt|AA_-*CvEXDVHAE(MF7eLUNJoh5g_uEt?6G!X3!Br1EEiX` zB;*fm#~h#Goy4B>nYo5N`5ujKo38`~4&hN~=hpwPI>tR}%1(YzZ#=TDw2M@Jx%B?H zAhAWJrHZGj58*z9kYI$l5~xr0<2vmD0WAFA3uy29EF*g%9$fL#)6JpunKjnA}ScZ(5#f4H? z$|!H^!d6WMTCPQk76@KYS|v3sI$8-)JmdKD-LRKRZF6WU2O|!`YZ>m92cR{{%3lbT znOIFx3}F+Nybc{lARc@id<`*##4%A~7_gUk_DN;uB(9Hz2TC3F^*7PLkMnX?`{D49 z&xb_6d+mxj0_<;u5$D+IL{3=*b%>QBZR|i;=97f16OUsH_kP=DQYc1}&Hvl!N{T|< z;Uj&GNlA#2qVS_3PwfW1W{*0jZ}&B35sB-43gm1c4k0o`(~hzqa<=g%)xGagPe7^H z3{R~9Fd1OZLPGiQu9yl;XqUtfdoi-!I`7LlxUnLj!wT{}HWeckrh908+01FR0SvSy zc$6FL(swWwq7;7{enm1t1E;D@xNm17COP^3wWTk;i{H1Cr>2t(Ys_<2)QM&b>D)A{};fhl`r+Z(i;LSQt_hFr?nImMuUSGk5EsbzRd}i#R~Y4 zTv+eXRdr1_b01s@-#;}!OtN~5-PL?Zv+yvOWcPV^7dLl!eSxu{sn_@sOgfsu64Zt4 zh^gBVDsve_bAYADDwFvjWJ4o8k2^1Y_4S|6Ht@L(29?zXsux>))gL7MP8jH(d#Xwg zMZ~4>DCvO){tQ$Y*a2Z|DhZ6Dd!gd#l{{Xwu%ObNVC*2vXGgew-_&$#2Or zG9DWVT`Ck~KzrrGO0)}0GB${jN7N1S`8JG!z!mT>jvY04gJ*sS7kz{l-KoP&5&hK> z0YvDa<}5_td#7Xlk*4DZ4p5LaJTfk5`uDJqYsI2cFM@gq1Ty4dZ(uM2@GzN9V5KN* z0v}xTKa*MZ;5n;@C5FhIh7R;ZkfP|6k;Ilw#x0|gJ}ne6^!YhI;$lB`^J(B=+M`x= z+o%6B-wDy(vT{B=1GVw1$U$I_OQb@Q=(Qr@4}Tm5 zqH0%QMe86FS7&2bg@h2B0q0kkc78KK$RPeR8o%~x!{bOECye<{Da=-|xpul*3#q{w zY#*yi%oMx2cvWhmaHBXgQKV$ zaZbYpNqj^9JEYZNPc9-s*>~||oeuI)$b_n}PKagP+(tJ-%oM0!$UO%u zc0iU6@?@VOpHf6oj{+KZ1vu@Uyts6sTgLR3C?Ho_VBZggjw;>&%!W@RNLy8gsR>Z2 zS5fbdW-rx6q0kDn8m4L8^z)&wCDEl-rbx0$T!UEhkYmhh>j4A9vdwSVN;FstZz!Z|FE}QI1oRa{9dS zi4V2M@w2dTbqB+`sE9M$FmuGV z5tr5|97ON{|JR2krxG;sutdxu8I27NVSyWYS62OvlC&rNZtx{qWHI_L81Ee_1;Yzche&J>OUm8|zMY zZ*M7bG55v!DFk;q6cD;`A$^c_CMYM2{(jHlY60B94Upy6hrou;=*H;U>q;*^7W?`_ zzf7EQb4QjdhW)n6kEd1~y|sz?x~$w<&qHE=rdh&!xS#S?>}1|16>j%3wD9)Yi8<}P zDgz-sgB1mN?F|;$7S9WMzl~lC$dey6Eg1hfQ7Rk7IcnVH~*O^{WS zWtfH*ECwd;K-2e;4FFAv3)0`WUw?4J`%l-)V!>|G8RrIu3(i zCa2yI`O#^!QpRm^pMF*z<&gPV>94nOuvraQVF@vp2Br~_yxETP#AD30_Sw4T32XFbDZ-vqif{+fl0G!NrNIl+qj=fR@q#F8KERUPt9CBbf`JB!+uLmurxxGxoWQB&Kut|p+8+^i2O`OR z;3K@6C~%vImpOh292_2lTrQ*S%E*T5Ln7`GY===jZ;+1VoK`Hsp&m!ir3e5ZVyvZ0 zycpBXE5E4ri3;e9OUX=nV4wV3P%SamuDqn=T9`(P|Dt7ONyrt$E)iwJF6&|ix`u61 z{KvDqLT^%JssebIxUCQ5z0~(sGpcON2rGw{bVx81NWcY;v4jjv@mst82-U<$;ErdZ zoPfAUi4tXp+>GdTgJKQp#bfvOxqq3HY07D9cbmM;@FDZW$f#2{rPN`cj)0kR0jGUJ zzx9&)yoQcE%zVd-!sQ(e)4t;}I0kDbOoc!+c5DQ7r##+Mj{A2VfzeRgY}%z&GHgh@ zhudOnFJ2st1ID%lfG@SkCf3y8r0iVSkUMdUH6K#Qd4&?md(`PPkb6FsULV-bU)oO< z>=DS0(%i5O3(0@R{`1Ccvn83EOZ)#0IMKIy*I%@E%56&XzT(;F7BNnrcI9e1S?uMt zlkps#1>+4TmX8%(`&oaIUNgzhlW}*OHn7k%M0#Y@F`;s#L$G=d|7BU5HkFYXa=>hd zI6Q}iAt17Fxk3LN8ndG}Sl)noM(SDwnA+Z78+8uzEFdH3B28z~4YHzs!Boc}x3|jM zy^L*DEugf9 z{*Np1nZYvo;7qk}^%286Bu7jIHf>YZ#er3Nuz4m|DQTnJXh*G7y-}d{``QDAlM+XV zQ*>Aa6&+m zhrerOZp3*$5o14@6N28|%K&xRsAz&Qv!d;p9+aZ1@n4^wnlGcJj$s1HNOFl2t5s!{ z5XAUJkj@uZpYp@30e>KDx7S`Hq#w+11zFkIGaZx!M}Szu@C_`*pD7C)=Tp>p#c%SABjH zxcq*%wRk{ZL!gh@_^a74@4|aF`OoU|Z*IT;1M3RjHu-LdRE&e4K z^ULWD9ImEEF1dz|PLvjaxM&csvAH<{YJ&+7Lqe8SXlTuPNfvKL$;_0a_e;&PqiI)z3-YXw5(=p9K?de(Vz{bn4 zYUTb%n|PR0emaZ}vnlU|=sUfqOd>X3S8{pK5FjqJA%bqy z*dSb*&El4^t=lPc(?5nEx<@g&cOE2&)ZjY<1Xdz_maKfxGP$sEQ<{K2Qv` zLOCCm#3tluLk(e@8gJ`(7C3vY!lpJ9uw!X0T)tKE%>644&#ydKQg+0DBd7bFpYxeN zs}174$`AkKHxw!O^}y0oJyy&d36BID!{&RzfmPnuZ`?=*K_qteou9!;?-sBoE0DUb z6BieU1A_wS5#X>V=*p@^0$&aF3ZMR?XcC%`r?E;pQju5?y95A$a!Sa?TDkk54pSW@ zvX`#B6KOZqmh!;-xTsLR{-N&t&+OyWae>m3Rog;)8XxqfvUE!3tj`7^kDijoVHQV5 z$cC%bNHvfQtRnP}<0b?Vdy@L8=Fwk&!H}?H)BwPu&;bw3NP{DFym`x2A0&}8tlV%vqM=tstDIZcZnmuIKO&_B$E z*W9v>t6(pH7)YWJ!V&-IDTVhxmb(JBY^o3>;QIasZcLeQj(8}QgPKgyCwIKXzyv|m92F9PB}ciR%_cM(wToOtX+4zIAiyDyDIuk;P8+<17S|3L#|9g z5n@%T&@{#~opR)6sul#%Mv~LYD#N2o^98Rstf80ApkuiB=;DPZ7mtdSY+j>avPYqA z*+)M_jF@)lO?Dl-zZ@kzq_fI8NI|wsNJOJ(=L9V?L?Mc1W_SO$eXrRhFh2hHD0e!< z@+4S4%;4F;!Jz@-9IUAVl}-yMyN?Bw)dOrWuoSmY@dtpRs+XI})fYUKzy8W=ZE$(4 zw(~A=*O7S#YPm!APb)#T&j=N#*9e$w)J!VcnHKSzq_-sZLzRs1pxjfokU)`X*SKbX zynQKi3sub=2> zY#J{%yg4ek(QlPrmFnh+o||zQGfgMp+8_Z%6!I)NGQoMn@N*ZGG+QiFU1HCFz$&5PDTGHT`B=EnhdIAT;T1Xi zVQ6mGAT>k<4w1O?KMZ5kiJWYYGk?rM6eX8n-cvK%YFvQ)$K?(xINl&vC#Y04;e%S# z$7RMc4JU10_g2jsl^uy+qSf6kD`KocUwWi3X4&889=p?A1m7mEKkp)-yozi%pj}$# zE$|JYvKcj``G`!nxY!eqe(V6Tq^1KzJPMCp13HSMo zjajLWS>xB5RWmnpjj2ppZ_JN68hdB$jVN2&ARH^?)2&w1$Su8=p1u#YrM5p~1}?3r zIgn%?XR87VybCxO)hn?TU0!w!vkXWSDsV3Eh{~*LrDpW6+I1>}V;Sop{8(vGfJ1~6%2+Mu9Tx4A`#PYE3ivwvuOTo9? zBiyQRdwV-NOnGq%dAPWKb);`9U{)SK#`a}`PEovpM|hU|?)}nLr&$E)OS@`@mR)@u z|MuG9ZNkPHxu=x3T7!qiaqLA=`X8;sEi4>{vq6G2?4CeKv>gDMh}zm|e3_M^vJ+$| zq@W2ge;5L3G&^s7eWGj}G6qp7`jP6LQStvpo!F7aQpx4QbbT4KAbtHM@tEMgw~Z#o z<^lmRwS0n>rQBsuIpFi)Edr#?eZWhEyG<2-qZ?cZ@LRc!;$Ob>+`mW8na5S~+1QeS zwmxo&19|~g!r{_fQh%=eVquBtW%+^c2RnQyfsyA+ZIZk^uGxE_j^GOt1U1U1|A+vi z*xK7Nd721}Mw|AU#)F!m5v)0@LDedS5C$B|R=D?vfQTOrHMhsvuw zVHKSVn-Xw61;FOrjs+yctPctQ1_=VerbO_R@>FDlw7g@`I9m_p7)yGsxm6$Dj~Qp! zjo$T6l1DbRrR^dkx%`mO#>FdeC}4_9jD!RCgQGXKm)sAOSr7MiI4{wh%we3{HH=7!Npi*{br~!o&#qmh$Cun7B+V4{JVdX!e?iIZ(^g|aUjKVf zyoT_iK5e`&nPazqVDa-^?nc{^%E|yF1mVOEmaw}yeu!niP#`Cx%Zb1f@aHIs?)9{| z9+rwm|3>V@7|h%zfw@vy2h!?ib{(;VJavm&#k5CePc@}!{xr9|%Hq+PFj z_I`BWJFzMF;k3}47G6j)nbQu+A9bw#H{9&mCE{j+b^t0R)`w5yJX9#$!D( zcFjNXw(^mj%b#k~rhkN9hJrCglNbv<-uIiVb6d zwk<-G3RJbWMuC#cJtZSy;O5wUk0~^WAvdUxN79~SMdiJ|#RfBIbJHNwWR-go*oJC1 z`aWzV+$X5$d%|$Num3w+K_KCB*PvB*fR@P+6wQ_fOfQ4(UbSeUH=q+;dA_%shn$ZO zt_{1|?HI$(8{o*~+b705 zqNIWkB`&QJOMoM^PJgG07eSH7&cW*)x8QUaC_njn8Amj0q&m(j>mjzd zFjY)gOe3W`qh4pJCVLEPYsw>*`kDK6QxsY9xkW6i5QdyEM~1XharIueJPO&@8SsK6 z>JnKRT0dghY15LZs`e)5rS1}X5W*fXqVeBSz%`kWRH#o0#Uv2nshUYB{)U|h3YMtP zU=Mb7jJggYN%4??qIi8}|FbxD#Zes;RASH--X;vRwGk3_ezeyMV$vB&R>AJs)>vd~ z<=L4aI9a(wu5v`18EL2?|BwR(@;L*Bx6N<`MT>0-bWI|bYRoI;op!3aRz$qay;=LW zZb-n$4|51j_w?Of2l>k-99ChE--GmXalG6{AXGUu(juUo$bHbhZO58;bF)tobgk5F z`JW4#-06*nd<9;?S_LIe@G`1X*$N_}Fr9&zq5>QQx~;cE`}D@H)mxNCmwqYOzv`WJ z%LngjHoO#M0@yyMwp`r66!xgz%7wzjBucJ$08vrY{!D#lPCwqcBPK*vF6dO8ufJGg zNWR_NLGA|@WBDc>TSIfa7qfkBe~j8aaO?iNi9eoGlW}UU!C|^ga-rSBuQzS4R)(#E z*DDzZC#MId^@?MjNv!2U*mkDh%Km(H%ePj|?XB`ABtHoa|EuvzkgZo%Rt6VZMI5_Y z*l?KR2!2a+|Heub1Q3_t>{(S7oWU`LUO)#@9-`z0|JLtVK<0zt|AWIiUA4|^*>sHP zFqcTjOLnP<;o;cVeoikL!{_d84{CXG=t5Q-vc4nd$}cm=v?6DTZ?mWB_iH36cW_A< z2x@< zx;Dt@OS1S?Rk1AOO*iU(ZH(g;XEM;<%W{i1k5hfCyo2VcR-gMK6lGsUo1e==Wj(!H89Rz-xSXZcr`ocRnKP zp2CqMOzYR1Ic^0xIQ-1(a$p~EN?MDOA3TKj0qo5LG<)9ZcBZDdx0X8c(B<+EOI%T` z?~16VQ_7LHFEo}g5wz&t*f!V7*E!?0pIK1x*b4>o7sHZoyN-#n$e!jBc38tE?|tcd zZj?^%wR=VLZ2~jZzSFv~uRs2_WD&gI z$oZ`%W*Gr~U}jV>)(i8Da{<0^x`$8(!7=dyH-7xQc9RK8nK&XAsMA>~7VITD7xYFE zKHKPQ&P)gEep?oFQ1=m`17bR>$Tus&Tn+sX-YN2#m<#FJe;^=Ru zPCx5gTBh{E9tFRtvj1I~N>c9Q<;*b{+77AFT_pCXlK?O%?fmv5&R8ibWx<4id$(wf zO5@EOd&)x+Rt-(}Xmw6cohhs2&9P}cSu~&Iut{)%K8t=jx~wcYawH;rxM=3%KqTMS za5#Ny_h;vPSi257&1MvG*R5xcIxu1^nEXD^3c7Z?^Ur>7gjwfapJBX2LWR-B#e!eKQv zkOQNs&Oe$`LzHPs#o zATJ7K_>QZvH3+b7S#XyNyS?Y+>v(hr3Bi)`p}u;t)Aem8)G(f_r;?qzxk@Vbrefor zbT*a{Oi?xOx7%a%X~6q_qp{NSk%loJo@CWu(xbV5>2A9Hdb_pgSDN>k;PPeislUQ6 z>@v)tcVOl=T<}fGJ>R7Hh-G#~J#X5)q~%djAwx9@o}XOutnb$izJYAj@w@IvBMGHZ z6J+6JpTZ|f22h&Jc=}{pc$3P#=-m5o(CG4y4f##tHV6FV_g*~T;42?<6me*<^YM|I zDgV&;vX^6_yi!sj=X5%Gxwzo|=yAPNQ6t;={d6S56?Eh3r_|G}OK-g^?%=Ry`SR)J zTu;?b&V_YH)~;&GaqrOWJua{%F@5u)m-}x*GR!w;J>IU{xc)+<1hTSLKEB6(PN5{I|b(zW6eN5wN$>ev~}(`bbV83htNyascqb z9sQeRJ{#JdpZ&+`h}^cJdz}H)Mu#*ou$w4W)kbSS6ANe z*Xul=<9Hs=<0$o8&|dU$$@2L%aCJJ>bjvUGih<6h_3vi9#mW_(#4BCr`X0Hh-Py7e z$EFny1CkBlp({h!guX+t!WNt7unMgQLKy&y?nHEF?}mA2D!QGT5aZENC;VFNOe$}% zva&HEz=%w_{Oys~NzBq}hO0|@DZzDmN6mh)>g~NayJkG$(QO}Jx5^#Y+2$4>%_Iv3 zg*fDm+%nB}kg>RHIKfLhVd~f_XYs(?=uu&*!j+_0D*3+1FB?W~s0w{&#yss9a1?oq zTz@cjuKtJcSQCimi~elc-k-SY8*P}D3>f`Z;1JjDUu_m*qFDZf4LYFE?p`>v|y9U+=XX(zo7&-dO$ zHvtR)pi9M*Z$(uAiUe7_I7LL1iJt_3{_b$Z za2!_xtsU=}62s*lG+R9>!^5xi_3K0Wu_>pjnc$w+$zc(DEBck3wjQxqHkbD7cHx># zIM?%2==xLV0c)A)bPe|;TDg~T_U=woA84;XYOid0QD{-(H?yZI|D&I&lDPO&r+)Ld zKBb8gr!R1DCi`#{o%}397nx|_vz-7PcGxXHv~Yq`L8z)J}s{`F{%!X&r-23Ir#C@}= zx4$O-^YXk!c7w!#5_8nUuk{lm>CaBq8w!lyjmV12wELpwz2SZbf7Nu&WT+}%+WfnM z`9+rWy$gK=W)IjR zVbP6iN^gnAIb)AC;@$DOHI*TccKiQ~O3s36j(YB)b@`TbFyH7YO*e$zEze`0E1I_d zasf(Oy0145%^%$;_}FyhQ5Dp?+$}#SsxNj_o%@h`e8R4Mx%}??&(R_@)DSy((coUs z&B+<^e(23Pcl+T!g9Edvc?CN`OO^ul@)|a#-p#CwJA%S)0~Sum7!>3X0{raS#b@F{ z3>QV?=8hz@flwBAkQ8v+&;k_j|LvpSLDCu&>kY6^Pch0yj?8zFWR9qOckM~45fA5p zywnoweYQg80LSC&%N3b#e7-1<{L8CjPa*4ub8k6n~dR%Gfp>J#;N>L?5#`?u=kVG z?HM3|L1d*mRZSVDa+}m@k9>JzM-QUK0Ax#vwF3coz+$z>AqVtAFO+`R{pzmM-k}v& zA`8nbGj#U3@W@ppt@BPY?x(%5$2w-B_;q*|RdxL5^vm(JUEha{O1d~^HMuGpPL__H zY@U}F91}@?TW|j*rt#qPCx_wW1vS@iEJqLh8AY~9l>%P~SzFJ_h=_(e3Oeq#2{KimyCB4>U|BgE{xFg2Ypeu~=36;y!Tg$c zGdWkgubnfc_ix|0TB*cT&QEAlc;`Hu!{;e$mAs$A5lg?R_ND&_uN$FswKXV8YBuxT zFTC<&y}NL?0he8!vcrJ;XCBdm=`3c;^jdJu7+LnI-Qvs;Ry5Ney;yjF zsaC@@aK{Us6N~mMpItm$^@yg5p}M#3R+bR;P5m;;_S)4_x6e4s((&xx{3&(1*QJ1W zv2*mU(4k98Y&>t?y)(%BbUy6L-oCLg*K6wzCKfG~c)a?SV?NGadtE-o&#`AeLo-i{ zFY_*M2y)wij)?O0FCEn|7ufBNXhAq`*-0OM`2aDP9^8R}FAnL)Fo{JBz6EVLY$j|+ zPvwbW0)~or;MM*P2GWFr)L+}~>yY%^>6%3f--q9;Ubn096mMy~W7hk%;z+2CUxJ9C z;|IC@JQX)7^ zt;(pziF$_s#~aJDLWgs|w&keg?w)v=dc)-V7b$0Pag#ssQJd1$Q=&?*^wzk~yBwbs ze7QF%WMfT3+jM~R=X+HBhm>CzYFTaX9NghF=_Nn-TS#G8jXAjNljC;|W7)a3=T0AY zGMuwo|EptG%_(lNFoqih%>hqv5D&gQ!-sJ}77!J5q)7mVlw!dpbGX!_LlZgM*T@Gk zflGE(jp#le`b-SDsk-|n#~2(-+;CRhds>k0W<|N4(k4zPYddf6fuoc2L!12WtmaYB zZR*c*Kl$PL#d`{&%Bs$yDSI_i8(wSQ@_cY;C#*MWQ-m~*FD8ndoLDoGCQ(4yzyfxD z6rA8TwP)*J_=JVVrNzm;kek&3V)F%>2>%d34YPn%ox#kW^0y{z{|i)k5CS#oLI+S3 z(Kd^0m}cbV+sK}27`EMT&6k8-Vhc+BxBTRjCZ;tRsUD9{Ic0lvQ!l>qVajeia@=Y3 z`lfqp?J&itsRZ}@a_=tEGXfM#@T?|^f+%O*DN+N!W;?wSn!Mhgd@^;77hQo3tS zeU_q2@V>p0|GVGoeIM(x)vud;J}GZ5H$6KT$!FN|0TWfG*ANEUV}#_v_X`sSGK?X+ zBuExXYj?Wjf{jRc9l2At`6D>7ep6H^=ayEHP+i-M@E%P{xI@Tg!A=WOstlkN>H38-Il9( zx2$ix|LvNg=L4;|INh|Z$rI-*x;ZP3ncn-eZK9rY>(${i z>FR9qt0!nR>)S3ku9~i6q?}^;apAqdP-SFi&_Xw?gxk|zt_>8Qyl+{cba8Q<9_3LM zka^2jZZ#+a<9306t~t59M=`E?@QsfDdxwU}?y7xrXoI&37%k2GOc-vRpwZTzGktVd z?MMT2O$*sa2wRq>koexy@ZDZDQBf^zw2e0InctF!5n300a> z(R6*&S%C89x~@c3NQiH+nKjEi+OzMh>!8Qhxyktr&#ix6i+(ctyDKkD=Y;v_cwvKc z_MgDDDgg%+*e2!|ZhNIIumr`##NO9E==Am7LP5=+x~o!bXvOV7*Zn&JWVYv}0|y(k zgH&kTVUX>T4=ghd(&(U%oVal9@Ye!YDN=btr9%XqkD^J=r=b}3gZHrq==3ZWXZO^^ z#2#T=ezbi-vZ!eEfWelP5+g@f?Cumu^$I9W-FxuS>eNFc&t^aLe7}CGW4ZkIDVyls zT@~ryD524z6-oBl_T|ZYzc2YVNpH6vHE6PPA2AvlNo88j)UL3~PigzI%9LB4n(OgZ zpC~WeWp>JqD8BIQ()G^{mDIYkc*QwM*zqJfC(af+tp~V0Aba?wJTRkfbTNbrf=VQj z1ffe0n&+C1)#haF=C*s2pAk8CRMGKIA^+ZOo`2?NZ}kgNbv-UM>iE6X)=mf*DGi59 z1q<6TJgYi8j7~3aI%~h4hx0pDB6oXBn)Gek1vUP|2StrJUI&Mdmiwx#QIqanoO4o~;AeuL&u+ z8x*jX`9=^|?9l!Z$^jU(pkcdg#bl9S<_OsDqFnZ|h6JFuHiiZv!KDeVj*G@FDA<6R z-S}AkAMsyPJ+YS(jz1RImfG@hbj|3Z=gAGnwysu|t1>@pu-_@6Bci};Xih!D(ap}b z({^~lnL(~|txf=&^(|z?<<<*7l{Go0EL1Khe=fZ5tHya17@U4b99uVc48Q-?pYC_Q zO1h74w`f1>(f^xXILGDS{F#N=Q-8j>p7|&#X?9X)vA>$$C*HkrV}#|M0|VtL520l6 z;LwY3%(>EhCU$`oc@|f2!@*C|8k=r?>-e?JDodcGq(eZ(D;&T^`$yNJB6XP~_js%J zrWE&|pWL1B*jRY^SEKXj`QcktMw4}y_um!7n3-*#OvD)K)55Sv0^b$BjllrS6w&KoOYq#G zC}9^{5xb~&#ghZJ%zhBVAdzT+8 z8O<5*j5`D{_}==a`BF{sq6#ma$dMb_UW>Co*5$R$++`_r5*IhU^JO2`LlYU#1x-`O zi++tFmKW&tbab2~C7+z0r&eF|IiWgzR`t)8w83XQt(uNs0!o_-ZA9kWMdZfD#;RQ^ zLs&y-lGjagr`hkv&W0VTH<0*|Aj`3GO-R|2wH)BOxhqXv$aj9m^y4D*%g%LN%wsdk zj=0!)+qLV;%h8p)=SJ6jl#5ABtSBpu>U8^dC3)KT;iBgZ#{EPx9Y96Z$tmJvkz7?36*{cySeC@xaH#JQiZ)~6?2BE zwJZ7?%Li+iW~a0F3#fQT0k)V}I^cTJe0luZpUzo6VM&F8F6Ek${QG}C+&4*k8qL-H zx&JV)#Mf^u{|zAD>eC*v1BW;!hX_S@-mP*a8 z!}lz8unhR(e>sUuI-dXhI(J@wIM5g^)%#qnb<=T4 z(tP&vbUw>%TuAwL-dD7wuDh>iNleCi6s>4w`aOfB<9kgM#S>#5t=qa(WiGlmWzU!I zNP8=#kEB$2=anfkzx3IrCh<+|%Bk*DO}37?$+n;0e5@Z>Nb7vEXp)puINs}~>g>9^ z@X=0c@Db##O9ZghMMiX3(It~;Nd{(SarA$~yza-}vG6_bDu1EiUlo;F@aw|kl9o#^ z*Ke}#Xp|%H>G*iq-I9xo6$ia$__Yn|e?PL>W_9XPLW0!#()ni1m&+a>^2oeFQBn9~ zugQVv$C;UrgdE!ITK)VwDk`hqXD?Tq(S{bz2psKP5-VyQI#~2bP{*o(!}a$IYt8RZ z4?V139H9}EJrvWN?%Vi$h|jaZjy7WNjo~3=5`nEw{$9UF9&zS{wpo!bw-g3i*;gU- z_Y^wA{}3em#tQQ2V(?Qn>$Vv17w6Qm?y{xNaoyE&@%AN1_mUO%K^?7Q{dTFdp{`kE+ zleW5dw0uzH$lw+a`B6WOWSX5u?+bl(N(4J1sKiS8-`{1LbNjJfP-b;Sh@;!<&Q{*9gmlN;T99$k1L92ZCGDRCN}*4ohneToAH9 zRGeUXO#X}THS_nH;`8;M$6xqxd!JFyRvs~UaRuG)<8-T7AjGF^C-V>DwuY(l8JV6@ zU&|A@XU^~0ZCqIAMuc?o_gf z71aYBQXQfc@GeYTJMihj+-q*2 zk2fxc4&2yQ)8zivG}Cb7DYN_fAot9={$iC4xn|qy{b!|uYw_+GXbLvOb-ryW>|AL; zr@8Y*l~83J&XhyL`+Spi8cSUtuboX;*I7L*bWuu4sX#b)=cujQkJi9X>wb1lwqlT| zXK1L-vSz0DN$s&+cxB`!cjmF&(txg`r{-guDThv)+~wCMR(xX{mc0tLl^qMes(De+ zFXgv&+JnxkBgGvKRSk+Af-P5l=2|9atEfLwT28I~&b{2&;k!fc{9{L<(rM;mX+0|1 z+YGX+AKaw#j#xvzWtdm)XgTL*Q7=*1U47y=Y_4D}Hq2mZ?pvlw*Es!Td(4*wxf_c0!`>s-ewQp2s)!*+TrWF&*N-3JpjMNa2O$c8 zFA^xC6CB#`KNV1>d(1V1EU(XU4B-2&q_o-VtSKvXJXQ{r@iKP&U_H!-)fleSeG2+< zff!g6FFA(#^Jib^9Z%hDEc;=je-1<5$T6)rakIOYulBGDsW!YHIA|<=E$76!iD+x@ zX?6ZML$7VQISLJXUX``I-T!dFI17olthJRFm@Q9g=4Pdh8*LpNLQpiWprs9K09!q0 zY2ZF6K*HeQLBEs}RGj@ThNAmXE3GBlnQcX$oLjbR$#fk{UtXlga=8R_4owQDHP>JN zq{kRUO^7bI#xW@=ksuI-!E9%^Y;DSGF)pn?Y|R>lzCy?M%hFKN+VTT<*pzJgM^?~0 z!x@a9oaGZwT0!Ib@l3>=^?{kS2wqM`}Lh!Q4Yz zHKS9)_Q}2M?kvb2?|ZwJ*L+ieE$y>BzjF<}4*3Z#wA}aiYtzzyEB$jrw3K2HMBO-| zu2p$zzrmjcIaxmOO+lMg-%OXMKcIy+ts?49d;6S={yO`wD;x<2b|bQJ<79cdVdeDf zxE)loX~6<5>nQeyxQc{oSm-7qfpX&013v6d&`C*Uvvq3SUS#rDVrqKr`zWru+T*h3 zzNO10C4%a0sW!*E{b9&-yjpl6q&oBK8=F;n?~eH+pinc+{D@NY zuJhIZB|_zu=70Of03C9F7~Ftp5bXBVjOU!`noPczVJ1t+QS~V*oWPZ<0ENu;h>+Q{ z+40KC$_x}z(&Y)iuCn$t=HZ{|E@$6JSP&DH6+`nAfyiiwEw9XdIRek_f86f2{qFu3 zPvn1h*_uSzojbMosZ58WxN)=TXjg_I-M-WGscY0%Fs4_>*Ld)Z?ODBg^5XV z&>SK;O$T8A5DmGcNnOzv1QW`_|R{tIxG{>5G{M%OV#g1n4 z6Lq8gYewChlZr28zpPGSjJhx?fKPUDZ`8Y=%XVX{DE3}1)htt+H9SsG`99a~XS?|H zy0J8u>dd6Lve3N)sCJ*Yk6OX{n+>{S+E7j&6c=p~_V)IMW@NH5Z35S&wu5eE-Uknv zYcX}wo%peDCLkb$VsrdB^{C{F-P=4YuDOIjiA#l1aVx{W1+0l@#^D2utJqJzMkSXE-hjpv?Kgw`N#%FE z_UUt!?m4}2S4N<3>U8GD@I4vExXI0Yhoo@zfFf3cwW^zq{c6Vkfq`2fUgYNG?SvxQ zpg^X((&o*T;DLmL|I6?TUl=mjyz1)eiV#B2Sa**ol!Lc_6jdkAY0_XyX>&lJpi>|R zhxmz~3W6VBd4Cs8>nMr7TK7`8_c6b5A5T|v{Lih0emoq<*XyKqq(=BWDB?MYe=a=p zg=zEZ``0=ArzRTJRz)>^&IlQdH^^%Eqh8ak^Lryc2Bz(ih-^2(%ER(!4tc;aC~vka zB#3R>cEqhVWY>-$nv-U4clp~>SDWSSSpwUO925kUhfnP|nl*oqwDSYUs)RrXcKok^ za2G+azW@AWDi1cqv*_xsQG#q#b-xSLE_b*w#@of;UwHlDD|=kjSuW|l_dcDZ*V%Zw znXmFr1W&}N%cZ57Q&Us9@DOU2(bc`Z9Zbn8Xhl4MkOwb6e?)_b*JFqz^&+_ELmoUg z7@R)xKd?Sa3rmEc^EoXzu}zR2pZf8U3Di5T)JgOGHh~&Wfy^BC(hD@9zcrb(szxPy z8m}y~F`Ztpd#Sf?ag!6HOM0YI;F6F zn*^g!Oaf)YVcz%utBO{}5!s(-XvwsX8eWswaX_GEiOfcaL0HvFk=&zIKNhz>o zJ$(3Zdn?3Y=()> zDj}iuh+6;tSoP@Aus1I&Dl6{<=I=ul#Xx_DnHd+Lz7R|!!y82AiAQ24HZ?3DuNX6F zU3h^7^vrT>)RD?fgykNDR70T2_~z@^HK1o?x^~pjd>>?>*N+k2*In6iXjfd*@T4}c zo0G(w^fay6XPq0ST2(i#X=ZW>$Yd+_@@ZLPr?41V!&lWbec#yZUU%l(6Cb4o)UT~t zx${F{!C=bKx`u|}*w}L{hAxvC-+9-pISM#wY;uyQq|Wtd==KK&1O$vQ3sL(Qtr329 zSvKUoKEJ-dJ*E0I#rRi54t7~qVJ}c|^XC0S&S8VUu;OtU(`jy?gIbXHTLpdE|9XtC zyLCh}^RS4^1wBuHSW<)=Ww;nVa$LcaZq>ALOMrOq{i)NmyDkU$vY3sZS@-I8#a5r$ zbA%g-Z5F42hPC7&ni=r%@$rH)i6pxLd%evnx_X(}*&+BNN3k*@EiK(NSP*X@fp|-` zbLUR7DtT+bJR3JofPlZ)T%dDx{UtPYFNkq4Np|wJ(d<4@RF-Rq5Q=RvG0D6ds()qp*RS)Av#U6S-6?$y zL8Frz3FodJr19F!M4ko$g%fs@KnFJHuaeAUO9t~CJKSLy!DOOf%lBP)i5vWHFmu`M z{y0TS)bttJ7Oc~*Rd(#)O5NU{l9s{HcH_6U-eF}cdJ%u|8p^JydoR9a7_4hAt@bYu z89i=q9|-QLUHhx^|9K*iNb?6p7txT;+}u3VH8h+EHqFAFA{VMaS5hZ|trMIIdnTb+ zW;-!l^n(bsGxKj@##1fFR9<(0>#*LSo%GX+ESG<|0G7?v@xtqO9$rq9=d{q*MV z?#EWl8!A)J%{f2Au44T1rn-71Q1sYCQG0cTK7nW|E+K&`ixZFUEw*X&r2fs9?D4w= zG{i-{La;Jpaqyt?VaAiRNoiE~HqUcSpI6n28ycGWzU_$UE~UX_vq0|%s@w|`9I3ZB zaB51aXy}AxWEf;*Wd1&*70~x4rJWB1%}=zydV#db!Kdmbjg|UK$gU^*e6Zb?12rL# zvLD4x-u(tKm?o^pfLzN1R?@@46ppJp+xc5`+n=(7L8} zb4)FN;&N{ZIaWzwoFw!?uhKl1Q|6c6Kk)LP9$lv5|(Qm5KAW7AboC*lG zumImDdH2@FaoW=QOzFA!Gz)>@rBf5jIcN z!LV9htgcGO8??8>Q7DFz#By`yRN@}$kX0|<-Otdm(`uxNQKK>*oteR30EmTxrr-3Z zXK2oe`giZf-|y8Fk(XzNz`l-?lj7)szuHaYfSp|RSY1lgD;l@2t`7UfBcMxa193G%&2byoA*dX`V z0zgnoN{a44j@h0>u@xVic|O|IiReC@{84Bm!JEk=uz~TT3C;KI$sa_-#AvQxzm5t~ zLQ^xnJmk>p&Q761_tCdl8X@ur_Q#He;bd?-pFbZYzH1ijP2KEkX}7Jnez+tZIzU4R{@Rd1eDV^p0S4^n;PLgVu2VkvtL%8qLess1Em7z43YCymL9rQ5 zE1#>@Z&+o-8}uXR3gfZqz2b;2_&e~_g33d_-a;(i>eNL+g%V75ZBPx8*iLI`XlQf# z^x-YRY}T>N6wl3Cjhr#Ex5m^o@roe3xhWJzr&a(31jpAIBLXkOMllccJkPi3N&O3w(NL#LCm=F8Os#& zJI3_Hgz>{ZCIZX7j4qQCwnqGzG(zYPWh&JhZ?&w{*8T1Md-Ik6!9(SA%a`frGuO1;Tv%S` z3-0FK=aAF7jIOg66wMRgUalMIEG1Q?+3R=jSfFIWotohlCnD^wC3vcPU|B6%gXYfB zx|e_2f^)V!E_vjl^>kgE*4+ceP81V=NI-T$!Ed$8InjAVDE=c8lp)k1VZOyqi|&7A zf|DtR!gz#uU*(mRw4`L*7uvBaZm8^Q0oAFO{8ZUHs1%=FxGYW;C(e_4=ltzA>zUJv zs>}0}$L4V2G%GPvnV*O+ZH76~Zu+5B6b;J}Y&7)vA6tWZ-^L%`lio*;C! zS3~Tl3~h*+R~t45>_CB7$-tnECGP!RXV|$IY4N7%QG{Srp<~`)6*Y7mxa9SX9DpGB3;)u76n%LNSJt-*+!7UsSZ*kG5y5HxFZZh6j z50nEu7H2m=<2nq~C&c$mQx{iPxx>k9*7Go1U|+L_(c62c&ks#X-l%$rXXT-w0Oz=+ zy2hSA4_iE6n3$U9e=%-kX?jdw{fj9?leVV5zJfUX99O=_8PEOc)2CMC6cBo@AejaR z1!-p({}=Wod$soS$E~`$62ez&RtX41;#>71HX)^V>;|Bedp;n--TlLfjRIRnG!!?z zkYC(<(6glVkyDrPcN&G6aACQN?bpO5_(R^*`HA+;Z!oNs_f3iWe zTrCI&&Vx-NpgEH-lj#~5OEC*zP%UTWv}P6cDrfwp=<(;Lzz+FW2NKF?{5Laq)0}3$ z#3Y$XrxCpNUfFF+zs&`6F=oIF)JMB94bup!SFr ztAHwvsosh5&raAUGM0_U)p$6_B|1;pwryK|+BUMIkH0+_J5_?3e)6gj|8`+H_1$A4 z>?Z7xxa3k%Q9&{&9^}dteXsn8!as9-?8LSef)D8kMt~BTdnr>~Teg>9+lu9|L7c$x z_|$IW$DF6m3()eUr{(6(1R6e~M|X&VTNouVuE{KpjtN*8Zi7u!5RJZkk^Tpcdu{uc z#5hv#z{D#Q@=@U=l(<8RTnoTEv;%2y7tw&oN?ol{L^y_K-=SkX4bTl+Nv8Q2W!RoO z_bART{Q1RYKcC5W$_OpCJIqdL z?C0%YE|RLcxZYLyvcL-y_NCma6(3$(nC;xzdi~p_@&oV)9LFg^wHIb2^Ph^~gXx6} z7q+?$u7a**IHE!iP6Fa}P9U^{P-})`bd9!j0`MHHMlzxGpJV=T4e|p6><^)0v;rJU z$e*pij?|K;PR(;Coph_ST8~+U-B;Lik9B5uszlEI(4$&jC}9x3Pd)f?#Z)mPJ?pX6 zO)qz^hDtjPhybaDojPV|F#DpQ$9Rq2=KqBzWcNM)8S5h|x^6#ga|luZwgswrGtuDV z=DE&}jM3%+Cinm7Z}swJj=1;Yro)(vPK@}_l-7+vR~+h*I8z}xDJgp38M*-N2(D`^ z^$Aq3X2_V}`4X-wPwK6YvRXncHkYiNUfX}Du*feLnm(~|w^^{r?F636I+N*_VkKv9 zPQ2^PUcq<9CNwyAJ7stS>&Qx-JyU@+Kgy}UcfBn-fZV_qw4DmEwOOVzE;W?}C2cd` z6f26D);vcc(hH)2gfj*ScpN$V@2`ezIq9OBW%OV>;SXVHF;s-u1=U0SM$koo4sea2 z$Hx1m$B);G-wmC)B2J@a&Ja_`&H8cZBXu8ZQ1Tz~Kgt@9AFzqnE-jVV(^U^sw#_71 zC)_~#j|W>THzV3PZo=p?I^y1~xr_w>fH+(A4yYwhv> z{Y||u*yts@Hb~H4JYVHb8x%ACI-U-vPKBd2of_>FLRJ0-x3>xUl+6cq z&6r`FaT((gWEm5T`kPfo<1r-wnd(eiK0BMBx)zik30=evTs?eW^X7x%T1pB&I{gVk zbu`xwuJ5!e@~Nx*nP3oOzg{TdbCCDp$8^%%jz0Qq{?6T7st=U9-|f>Z480Z?cNx3rov$G=qHk>9h1fj?w5){FZIJE&M2#u~%Wzz?a z;5*lIbJrIs>fV*sYIqh>?RovuumfA{a5RVg+^o@?=!>#@f(Qq%_08JX#;mbIrREVa7( zN5Yp2v^sfREVP8;ZCCE*E%JMInJSO>ddvN89e#fPe@;V(brTgnc5A+~7=AgHGyU-w&3ZVp0}1 z;O>}Bq&EJ}RU$HQW#$>xF^wgS(AiU6d)sNkIj$M>*HvjR&!~F^@e4|bQG)%a-X7+A zl}@Y&T3cIR!%!C`NPJ92h6u!^!f>T+VTiUBDpYu=4OMLaUjI;ojA3<7E#2Ex`1QPM z7v$kK8iAVk;w+u6s(xIJtyvk}4(>B!rFOn^1qZ7e{leQGWLMXDU0zHXkgl%Vp>4%F z;c9(TSec2|Qw6ag-*-miQRl1Z9WRb#nDy}p9*z^P`E6ag{_0PixFPMv*DJl~BxCq_ zwI5l}-f^^~n%{A}Nm(hR#F@6b@94 zn_Rp>U|`@)%!PS39*?{syV(I{5K+bksA~dM*k+YuhiC_HQBQRTUbMP-*Po-&#NVO1 zYF}Ts3gZ};XLT^OinP`i#+V>#d!0*XxP*laZVPI%+^Suj>*BhC(zkuiYkkHF2D;hN z2;V_%Iu-Fj?aSYj$$UHKeGop zX*?9u1RU1aA3m75(Q%WxDg;naghTLdoBS_9xq7x?EG!ni@QUdH8h~+P0;aFL+ z%5udy4f!-+@R^7z7MS&u-?O5wrbZj}w=q=O2?9or0OW6Wk$+EIRPbP)S>(YdM+Hud zk?>PZ%`ctTfYMYYX)K+4bcu1cn^A#ezzWyFG6Am~>RY1icWPRf$nU>{HS~fgqLx;u zn)iDZB~9~U1B;ZZZk)K!@}HU9r%$(IXB2O;ZoyYq_09YDoWR?-zs4jdN1*w$Au$WG z2I!}ticE$yK48vcfWh8<#N>}caAMbIK>eZ`* zkw?A9duR>!?9p>DW+1P-_31Gt?8EwlSSlhXx7&?_y?7@GsxhglSJ2M@{e>$$35J-O zHbKM-DlbBig?NL;C?+PxAN$O&@k_+k9ealrOCYQ?@|O9=ZsBiXJ#`DuZn03uj4mlD z$rgv1L}ysBTt)yERaQRWw))@FBDSH6GO@A2{7etqS}lrzNi?qb(~5PCLj1rinG^GiKnpq*|545Rh=NlxMruNquyjulNBvjr}jwN$+ zI71w%IudTMhsO~l1A7^>?I%y3R8{dwjE}GE)>-=*8#jxv2E=SxR%3op>~?lG2HKf< z7`cW3=>ReNVN37#zCK|M4MDu*+-J|q@!M=qo(zMWco#4xf*2rS88q(F!tx3x(&M1o z?8M)I7q*P@0OraWAc-56ud zy_ObL1l2u^M}T;4*tE%~__q^|5&8`nJ!(RmGYl5O0F)VqWTmCGw6&>1*mmCpc1oJG zJj8*MtuSP~0*AGV%F3a|?^{IopMa+doWkDYxuH|50F0*y_i~m`cRO&;n_$=pyBJ_P=fJ{e<*i7g?JUYS;qz3okFH!@nIh;H= z5;S24!WJ(e2SOCuBPS;(Ewr#;G6j**J<`xW!46Y@GZ%$j8Ovuqp;`I9Gr;gh_E4}2Sh|L;na?eb?aQ2MwF#cn3Pgy4| zjhcbR=FAz=E1j!sXMgoZQ`aVjlPekWQrFwlx59^|o)PCVRV=Tv*6( z8?#SDGZ9t2UzoxAEzLO~SrQDIMM+t?3Zr9oKE5z$tOBiI@E$k*pG$kTij2oO)*xdc z%_Db-sRrr)ELsD_7ADS*HFb4NXyvu>6$s4lJ&2U0 zV`U|XtpPHfiieN2ClO-C@FfJ*4_fjTS$zGSI0+cxu?B4)&$C9lAdoE@Pa;R59dr*h z){@tx41I{(H_TwDDBwY|TW*&)kK7Fxt!K}gqI!D9Y`@qYI~D}&FB5(tgz5yb;&r%6 z9mb`8zPIn(DOp-}Gyz9USW=P>InT-2xePlaO=OIT>d;?Yp-J{(WAVJ%1Ag!$Av+n~t3&7I3Bj zEfCYZhjBMSrwod4vN;HLu&}@0%m_Vku$+?C`UZ~=rwX6nGI-x5}?w- zPY?OQZ2Qk+gSM_NZWPhfJ?o(BIF1gx7Zd_A^;?=Ahd6aFNxha-?~5luLtX2Q(G!~|>yypX3g6%{KmNYg?T=^h=8#$QK* zT>>^|*|JOtg{`+ZJ>lxr06+q8;3Qp0Z&mb8Y$772vXY??3N3J_J{WH?bDtz?qLvGnf|rh+QIV0%1R6zUwjJpU@Z)~J20S|!W@aI6(1UN9B{^#fRW{d)L%^2tB2H_KnoT963W@Tmdmrj6n z1XR3-BsOp6CjHDtx66i-q^`uKPRzAyfrM9x_(lQ=iYat0`!6V<9Vy1z3@H_mmAO%0 znn@nXccMb%#y*Pw!-o&a(cXfs88U@MB%q@FSJfwy|Df;bvuDJwXse0}VPqh6$lf%Q zjZI0ZM|yP!JOBfLhz9AG2g*a>Yr4vE`ws+bT&7hpguo3J!NXz<+U~a6q+p=G|99TI z5FQ0fErJKPx1;c6BDEf*mfnB?_yleu2wr9N^@cVZeDzT^HA4rC%u4Q>g*TWKT)W0) ziBAp=5W!aup(Yf72b3NVb2Q-Wn07pPAP;Ek-=8;sbM7@Vav`}K4+kahb2?NY_4gl! zz>$#%&W=NGo7j_+#t!jox9{SCy)kR}_~Pd+`oBOFH1}M)D%u4zQm7w<3guJ)W)Fh`rk8NsdO?>F z(D>jCYx_@Mx^>WBmr(ZdDZ`@>JDYr%7~n8(C;S2NOc&x|3}|$_p&>K$CJ0W4+LJlm zXMzEO#$k9KhH2_aheys6%f<*ew!%?I&n>)`TvmjqzjQ+`(H4$4aa$BqtyrE!pWF@G z`?!I@e>>q&H$Kv$8r(&@nfu~J|7!V6Wy`_~NV{2GJw2CUXWNS^C~@=Y)udC+&(D9| z*vN)-y?)%;`mD+G++5@RrwWicg$V!(sOxWAaSfPO57r(nz*DwY(y-Jv;{rjYy0Nhe zRU;x38%nw6T@o+hFN7^QMsS_{fh^$x#iIEIS?mq$>_JU3M#0$9($dx4Euxy$ii8^Z zcWx)lGT2e9hG-jvI7TWOxU;gS>Y9z%J2;4;j$>e8AiW%@HY*MsIDml{CrUyxS3=RD z>tM=&DuNBz3LNTqk>2zMay}q=lHt7utG4bkk-mYlD>XVoGD(KCl=OcUa=aShMxct# z&(9N!)FkN-fZ)kU4_rlJ(j^}mSaq=SH4R>BN^o*I1nGYvERQd36z6Q@j>r4 zzeQe($M`WBlwKJic|g9N>OWZ~Q^^*anI!8F`{S$0@u9j;o<6+{cQPzM1_E#lZIF3F z$jJB&q}hQigYG~KqXZfS9F{iq>~i?)MS_XJDirtWG={@|bNxJv05W0Ox)#NmlxkQ` z{XS_fGHU{$f9C92g2fIF4N*}*1PDe^gQ`MXA%RIjVt*)VNZiZ14@}NhAOtuxq-et+ z5{WGKIXGwOj$@OORKz+tMx0q;^9720!$ELH;oR#^cNoC5=X?B;`(vC&q+i`3lh4 zWqfB+d&pquqJ?Vd!NZ3eQ1OCC78e_P319aXo;*GliCWi@JTXi{!OMtma;c<510}W$ zIaul*{y-HY8iZM}0>(~)X>2SN%)Azno$xLL#hSRlcLTdo+$T@U zuu7)u5El+e-xg2}0HPg9Ula?^|1?LYz6E{`E`@$XQgX5#1flRybv-<`Vo@ga|Hi8| z=vTlT$uZ4h#7oWnPpp3fbOh|(^5$j}H-n_UpFbmT<}Hgn*kRvX291}l;o(S(D)3n* zi}U(F(SN*)`W)6A4a=jP?D28iGhW}+4zNKxLq^dkZX1a18JRf%Cm>#TI0may&EyTT zI7kzV`-T%+{c!6sLn9+rxCSwi4nYPFtT9awDf%z3D617SrD(EGfCqNps#p~Ul;PN8 zAvU2~oqGZixRkmPEmRNV==hivB+nBM zLC|lB&PTJ1>=Qh?6)RR0b+n>NR`^f&LaA1TN{Jco1(izJe>J7N1QfYjjcJNAlB&jC zqkbz?vxF%)@kaMZ4;J;&Mi0Z@YlBIcKipIphF@eHH z0rI4!U*k_|0O{RlKMHZd_@^$XY(Z1<#ZCVqI=(!xRh6b8lrY0zcjK@kOaBLmcJ za@In~q6F$DExbj-75Phv{kOmsZCUyEf$3xO(-@yY3TS-m&~9HrmSuV*cLN{kC`d4~BZZ?~KYz-phJ5J4Bm{8fWteXb za>)ikzIJeUtQ&tWe=b*mklVpk-+&n_@i6*3-POI#iG~K(6^sdH3_HlbK-9K??g!~c z5z3xBb_&Lc7f|1cdA|mzHZyO~$yHc6ff^0UpC^K%XXx%?vrTgl@zaj$oOD zM-Le8|5u$|AP9(Q22wi!UKStI)Y=!o#94(HZBCpB#i>f!=DiwcDF9)Ocy=Q*QjpWD z8ya>TKQ4(!rw^bHfz0>MZwb-N%(`kQ&0V4y2OKIUF0M;1=-kr6Xzcat!9a?NmJ$Ia z{4tJsI2Ka@RR}>ILUeD@#$_QeAE=7K2#(-VTx;a~7ko2G zdiyuFtpU9nEH6UML>>FaY1UXi$uJo2m85Ob8Ue8I7w zCy$7xlGPgk!(3ckHkh~y7>LN;!STnAg{ZpvqR>nsR7QgkTA`qL#JD}AzrQ~N#}$Cj z0Ns$%$j32}p+`7dT6fJdfnMVM2PU%(#p6Vf!6zxdAh93Rt-BrvmkD=|)BxDd4gl_Z z6PG_9Z~#m@p&rV}&!2o$=yPo?Hsq|B<>J7C;0g zUn{wb1I=+1)b#97+@ARIRN`D)zR3R)QS{f5(*O2$pnfF3krg#0a#R;US%?BNz|4iz7=+;r(m0ZWiJMiDjiX~UJ^?zpL#SC}8%SkA{se9VX&aF%RR92? z?q3Hg_ary-?JwO_VwguLU#!6 z-wZ}ZMw$DqfVQ@D_+Z@eK+eV2t#DK~SB)M*WN{ zqJ!2Mf<-KBY|*Ca*~rsG)!NM1@TAKm^vVCH)1V zY=D-I&i#E&gwFGKw|8A7?+gSCVC$kSUKf|!;9@jWL+H8VN3dW;DJ1wnhmA|`e# z&#wVpLK9F%IG>zukLW2nWewwSB)xTbaAY}+;*Uafr9wsvVFI0>ZX824p`sK@nCsUiRm1ef{!d6FOgT!f&zuV>Hqb*L_Y@oCwJglf_h2%Bg8IOh4Z8{n z;Ec(l9xRs!uO0mcY#DUO49M*xoYjUx;l3CBfeu`6$?zXqNPqjOf1j7ADc|1*W`Vl| z!)1DCFlvzphQfoI0y=qRaMR&!9%B^ThjJ7^PhhyAj#?Mc3%MGg!FX;kW`MEf3RH?! zAcl~HaPq}KV>&So0K!AMX_639aFk)EDG0z`52>be&Jz@WD9Tsh!LoC5-YR=DQwTtV zwCO-2j$+W1>8k$@L#A%TsK48b8KzDB-Q_5!sifOh?w-1Xj*e^!DPm6tyDdml@_2q{ z3EsVWH61-Y{qqye)Bw0i!R6(piq;1`;tJ5GU!;7)fC~eqD*Wn?E2dQLZE+FTlfv_q9k~~fy8LI#kz+OwGl+Nxh;ObRi zS~|lHfK0d!od$t4-*tc$;2jNITQM~o!16E`9&!~_m^Ee#(2kasF8yAQX1N>9%$gkU zQvAzXcvb`~CQt+t1r;g+|9@}~z%Hb^RaNszOiN=$5C&@jF>0L|Bv!!R=Y=Aq7Gl&B zxIzQmk#)tSgOoqWc{%W1C9@plIw&160P;rf{IS~H0-}6~Fk;{p{~8c=CS?coIl%8I zX-eXG`3=+qa^bLdf^THD;|jPnAj0fCdQ=o^QBGuJ{J)@Y*57QgnT*y^kY55IO~za~ z$g=<;v?Y6wFrRgu8972h6#Lbw(UD^!hKSgMVuZkNAjca&JhYiG!I20>P0yPGlO(f5 z^yPmarVJ`O+_yI<`5}t48R1oR0QeHRgx7d~NbFZc+mE9(AuJ!1Bp)qjY)RpWsQtvb zcgJ56h{$GOn}|R?DD!rMx@3A+7k>my?`mXF2<0CeM4^tSi5Yk>gaa~xBf=ZCDo$cI zD7Enx=H{#asrR;mQvlsi@=TEhLof`p1;qdW&gT*ubdhlB*ODaCI;TVR%xWXClnV_ZwvPe$mM;LL&Y-P`#AL0d;Q3$8DzzRKP$1;E! zi9U4s{bN6~kcI$?q@dE$Qv9=2h%sIQAJ8yW^+k0al4%)cqj0LA8}2AReC7OT9@c;! z94TB4a!CmA-dxs}l>b6RaFj4iX!-)z7RQdj;^N{#<`x$(FE0XzlCpx#^sq``kYx%q zDVC&v@H~N*T*i$;JGGKRhE~v$3izMOkKr^1HvMC^DrET^Nz4wf)njQ9`)M<(&OIyO zGkf_zxjED2by*oz2GDjAS%%-m=&j7UKCgkr_X1}s^qB>WjG=X}q79*^H2_qn?} z#mD>odR^D^dOn}mb#dc+-$TKol!;31+i@qE&?Vme;e6UXya*l)$eP_D84 zP;>j|EKO^JD!qoR(!O*d!G5sK@I-^`t_l+(?OUKQO zz?mYlJ2cCu_-^jBQdIx?pJfK_J=AROYsv0xoaI*tf7$U=UDvSH5-bGwp1fypb8T3D zQyJz28I2Ns^OqS4V^shN!ZM)hG~DXOL=6gcFB!;&3=4Ry&Z za`&aokZXuc3(US$sJi!h3KBlD^#?E6@Dr9DM`bE!HiaQ;7lHlv7fD2Ms`uvClipuk; z3zxf^GWcuak46%H0vJZj38Sa~^9=Dc+mHV1G2#jQ8LDgXh4;^6BV3p_6P8BU961WV(wxdjpsL&c<^UXI|=tp>Ox_l~y5o8H$)6t<*CP zEY89xiwWdf>`0-_?xCV^>F_dkIt}yTzLM&D%GLmsMt^!aYme{I&TCb|RY1943th!9 zp6+@jw|L3*2eSJx-5?$}3NL8^0E*b;(PNa;N?{ERq$#~?-kQaY_*liK%mT%F^mN>g z^mD05vZNIpB2*1ztI3%eW0(MR3thtSbw0sXEX3^FN*QlM4_GZ?QIj8AB-zXKQ1aJ( zc;c*KILz*8H^C$XvS;GXO#SII`Q zVusbRcN_6EWXJcyhhK#cUjniZSKpl$_X9>xokAB8Fplxy8vxbh|K}OD2L#f1(3TYE z*^MgT=#eF4IOf-$!HW#3;Zlazri>O#l=_A5sysyiO?QYp97Gl&-6FS4V_buQtuh@Z zyN#S*e?fgS(Ws$1iP)8l*TAMpY+>Zy5qcaeY+A3oa|MFOpPy+^-3c8VmMNY`i<_ya zz8B1OUIet=8ga@R2yl5iW`$%#NZwtKE>ShVc3Zhg)-aQwGdupi%U4Wz#^eZ!SlQZY z5fOhS;q40$GpeDv5H23$ocD8aoyN($pL?xq4SY;bU^fz<{dy6fIhri4MAc7>djK_{ z(I2!Pnoh+r4dkNS!KK9qKXzLssRu{(65@-yr)LTaXERDCtYUsUQL>4IuKT)h^MA*g zB>D(mI+`z2{wH3JDO7n%QFUEl_Ps~y1lT;>f#^tpTSJ&h5;HJ1?GUr?t)=ghVNQeL z$fNi#G`Tjj&80P&4>hGQq4knYTs#slf2!3YjRH9SuU$RX71ny>ytce`6a*L}UYU((IIjoELE235_ zcJ7LB#Lj~kR$=Y7e{xdk2S8J@r2ukmjl^UHN>npqZS$%K5N_wP();T4M-XQdpS8^li<52aP;N^2mt=IZp>;6&^|A2dApF_;n(j^g$? zNqNKgf^a?G#iUdE`Qmg|R#w!P_mR+WOe5D6jFXuzI5aoWPY>pI(@dd)Wp2G_Ts#^p!$Mlv=7qh-*AiJ zj?n%$dgG6hAd4!LOsoVR7qsepD=nDy$vhAv75 za)XlDoi~EHi-ZDU7PhPa1Avfv3}k~57D{i`dr2!L&IM*0hvYrD@dYgKCfpWuA@lO> z|BdN;Y5s(CI;7ac0Lg@|EHxtOZQ%>hWP2Ke3>&f>PzRh8R9m;20I-q+MMk%wxtAe; z`c()`ie|Eu*LL>E*EM(-bXX&as2_$Nd8Gb$9DQ^J5zFf_KF@PP%v(@)8A81hU+4|M z5#pcQJdT|E;~t$9)dsSJ7oU&haSr{Bk7)ppo?_$~8eyy0=DqG{)41bfI zhsPU4M!=&-@BW=Ku3o)rUT%Y3g`zNwR6wR9SL`XG9C-wDoz4&O#T%g9MLUm)K;)^$ zk=&hU8UKmu>zvm^jL}3uCv+Q*-K7p*_iH+cXQ=&%1Cc<$);Cu5c(P4??EgiIr}+Q8 zz5w|4?%^d7%@Gjiu@wrMM8MEDdRMd0A<|*eB_2I+P)|aLzB=2J9H{kwfof2@)WWV1 zh$&Z(kpF-b%0V=lb>tnvDn?#RjYw&FuD~yce1!0FoA~}RTWU}YuClHkC^cL2ls0aD zezwhuOjd(`;R#lm{z=|wts@=M{cbCZdvLh7p09&_p(6gFWEH}~RDpyYZWl?TosI)6 z`iM~Itf0ONpH=(p??Vx_xf^Vg5)-#$e>d`~6kb}>eXeD88496AaSJrX6biwlfi2hq z@VOU;Tv=>ghPRIf{iBt@YvT_2AZ3vOfArdvFd&geBTA8R%(%87O#0wE=tads;5Pz! z&%i*Eol=qo7&T1QFhTi^fTbb?A3Hn;WM4gw(Jj~W7?xXNSS^H4*OufRcLC2dq85+W zgLF}kkJp23O!&ADFAO6oHzSmPxGV&hIo-{bCHw4s8~+RJSD#)`qhgCp#3_Ybc^A|x z(%=0xpPrvNkky)RrEpn@nQRH4aVntG@DihBx`aw6H4ytCGM*w-^CK2tjBx=$?0KT4 z8g^jKT5Z}I6G7AnPr<39u|#ana_kN3BUji%j&$QYzlWlJ=S`;*SseWdBqYJ8&z8Qe zEbW2a$QX{gt$Kd?X{M9irRW%RM>r9mSVAG%kY;ckZ{!02ht{o)GKL^_vKR9@5M#y{ z-o#&HA%!;C3Jd1iT&^+%aSzAPb8>FZ6y7cfh##?e4_2$NfnT^%lf@hMOyHaZpr}$; z=u!eQ!{G|Wv(qSWvQ1Qps?t!E0EfB*Fb4_V;rwb9z0Sdqo;5jq8{M1*uyZ z`aY?Tgd>#yiOAwY1L7r-%Du?Ye^e}Fb^yZeslp>xoxfj}O8Lr4BUxiWO>BUM*Lj^( zE#h5uT9_~aBqBU&FJ1>42?A&&=ZTt)_;6ZRH?nn-^(!uvBMM(HZ|^FJ%-JYJEpW~K zy?+wZ`n$I=;N~+#1zh^4cDvcAvvInKy&DhYM_`;57E58|N*~uxa>s%p z3L_-1LQN<-zCS|JD?%xrl{8KB@WJC zB|QsdeLM)yWZm41yW6R?A->6CRo}Qnlx%!)ef>jVF)@*#iifCU z5ic(O&YO!@&^A_#%a{u#n$d@SPBcoT92+hv&t@&|w_ye`=JnGtRLeWR$s%)xo`ZRIj zlF}H!rGDc^j{_-s`LkCxgyiSuenN|#2%9n+9W%4{r^`>l>X9sfWI%Z$wGNXt;&IZI zxV%e1FUl(^y}ja%ZEz;=wUX1zlR!tq!_7?$&k&Dxk=f5^03AX{E?5p|V|Vb0o@=MQ zw5yRyf{dar$=eN~;wykOVp5?+alP?jGCjeQ_uHSiU!boFjDUKK4*bDZo!6*7)Ukkp zNSgRbwu2(S1UQUZniM-U+p0H(&^YaB{FAN^vC3gW!;qI2!b zsi;BZRaNbco_F)Hv-jP;S$A0|1F`^|g>tC29kGJ|`Uq)w1Xc#ECWTkB>DZOY&oJeo zVirLo4o>^pp`T6|O>wQ6E{My!`_)uel!|^*llgU2cwjj+U+T87RWnFYnSQ)1gk~>4 zgk+-Hkt!2xQ{zA3s`th}aFrU#sTA2-2NNIg^(#V9CG;)myh0=Sn1w5X-draaH!Q|?9@E+PgLamJthN}$3VZGS|_qv zEYYZy5{$$$WdS?}@SX`p7wEc)ROu#%!$MJ{0B02RXkIt{G-QLq;}P0#^ml^ID6qtkc5ZeG0-4vMit=x zPN(S?7#o2GV|r^}=Q0}`?q7dh|Z@|(ry&VucmMcsdG!sD6f1K?vu z?kWaGNBNxuL&2YkRsY~b<92|j19eHPx1=b6fez%~eHSy7iDS1D5p9qPs~V-5tijsx zGAcgd-_uV#IuHhMLJq^NjGoeW7avN<;xhtH*WPFYypC;ZJ$mCf=Hil0hFTMieZsH? z5IVb&VXlcyxyiaKfNxCT5q5@w!oXfM}29#j~MG5w!WBN7V%3f@{$76xYeB$zD zF0ybMG4nrl!tn6$)80}~{j?;6l;6m61ek6IRSGuYlX-UTqD8TO4NUdC6MY@YF2}&{ z?oIdI=T3Vx1(=8w<(LWxpH#@Zcki54x*7jbfEN)io0f-c;)Yjux2Vl&XawS~a7D1{ zW@|;Gw00Jzw<7=GBzm_}s2>2v!6Y#NiSz|l9KjRpCnR|niWbSq4Q7oS^o8MHkL zc$EB)%&p$e4mS(DxfQyPgF_ZO;;0_)0by^7xQL1&0t}t>pBDj3EF_ER{s^nQnptpQ z1!RPmLtl_K99-sOeb9H_PE{Si^t=Zc4tS>2y`%{pd=hgO_)hQ)`9k1!y8Yn~dT$96=#g7Dj?MKAJ(F`Djucht)*BE@QLTZ$|xXxHTreYo=Xh|{YlUR zSvW<~8;DC%23SQLyO7y(7MB&dphAMGwgo>EnO}UPe!>+)3eH$lv3pcIOmqpu zUhGy>MjLE1lX|8lRmq>4ur1S95(2)z7I4 zUw!vP+S6gB1t-1tE{UA+r>Zq==k_!WKW4B9v_BXaWk$PK%^&CIFSkP9syV0 zbYT5(24>}w-Vrd}PWIyZiyDqyv=;tyb4?p>Ic?SdpkY1&2ZHudejWXT1 zzKo;=jXXTx+$yYg_1n=q{VG-)e_Z|bVzuwqMMp(Fw^Y~unw>~SCoL^Ut}Na`5Z(c@ z6Ml7IF@$?2nCwnL^EY;uy@bgwLY7}2!Kmu{2fxc5qafwAV5A2TU+{-p`lPG*hO;8; zMFK~Lt%5UO=7qTy1Oc9%dv^3#-2HSNrO=Ge2Y0EbhiAMB&3Ls#Fg^5eIu3 zc17hgIoS)$uyzhgxLlj&y&a*wkz1{g^gbZY!n#ixhYvuXzZ-yUs%`z7l|)O zkxXDGn3Sk(78ozCPkf=tTlS#6IlMH~qbbmf`@ohI?f}juWhK_d?R#!!KVUf^ne^PP zWlilP>G)4^pYoqH^8IkfVf)OxLqSC2e` zcwZQsxEWtyqdUN88T!glw%ATFY~rM2lVj-XeTx|d>rc#}GLpW_x@8RKuyhxTjy{ogh$rrMesMQ zz8ZV|y^fXGRqSSigllwg2cGsDJuBe|5sW?olI#a7YMmP(L2pkI2}DBZ1Jbw_@6Mh$ zw7P%SuyCpQ3ajGSrJv?HB02VKEcu%`yB&^&uJC`PzgM$^^`&lf?XJY`9@dSRep%(+ zGMw6O+f+L&Br*FlRIK845=v?G*O4Y2qQ?N}+%8)F<%0sK2Q5K%LjTA%fBhi{HG8|d zicuEVA=~UkmIH~3DDH7T?(4xzi5HZL{J8g3>I>Bkn2f2Lvt=}lC=HA{K&N4nvE=HO75nK{Tx`3GmYwhVf(Xv5`s|Yv+#V4j zd&WA+uY5hNcFwTUSl^rPCMH=-i+>3A;TcOQH+)XS%xaRk5d9|eEbneCbAft<+V59d zqCL0w77f|$_hyDeKc`)+QYZ}!yTdKG^M;maRjp}PontL`?1j4#`Zo%qZ?1`GQtJLm z?-@kHPI z?h&RNJ&jSrZiN|n2HU!k+yzm6kr=ukjj5z=!Q53a0qSCPdJ-$Yr^)C8ROniXpPyCS zk=mZv{!o+msUh1&I-Mg~L2h3$_K!UwOSW~Mg|te8)@Ok5h`l){KR<3$ZMq6t$eDU*pR#af4_{qK#(cjphO z&fIA;4RJfFs#eok|IC=l(fUSbxORlz)b)D)$=*Q6_LDu2mwu+wRWC;Y6qot2Sg1OL z(5bBkp9E|4zEWwXMigooo=}29%c1wN9OTC_#k#!FvR}2!ErEKxZx^yd3ux4D@1i?r z^=!l-*fpPNQfg)HU<6-IE<<}4wP=)|@38bUO>WZ|i`glLh^0flx`Fwl&$?zGQ2`^_Znu8=hakbm*(Z$*-2#Ix zA!8wHk=Z;D240?~95ms09OQqWZIq{M#$tzhno*rXE#ELw=A!dpm0ltfPgO@+brKIl z^~5y~Pu3C78$LSrc`E6u7DAT{Pb;tT{j%(ksi=FdU>9p=!sN^WPfwhWUqR(5#_MLr z^l6qact3)j94Ow!do6!05A*k{8*-Q4TfDSS;!Hogdpi8>E*Z*H;NMmzII5w(J3haRYcfxNvN}Q{ zMmDMZeUgy=&A!PAS1N&`DTkov_v@6Yr={pOAc*yXN+IJKqxju6Y}~{)LONTT%r7CR zn9Jp+01=Z#Kge+SSOCJ37r=s=m-A%2;L?5nfnl?5E&opa(h6H8W9y3%6i61^0(iPUCN~*Ha6-j^`De4h$KUt(2?$E}J{`#Yk1ftGr`br)MLx zKu)=6+hw7{F7wyWJ!fsesnvjT8nP<9RGsx}=~No?Y%LUmc`L1omdb$La89o#?l@VQ zmG4M;wfZc>w@qGi2ChkK(jhr!+hN4AxkuO4BSF12$u98w7p@sW+c zK0p0MKfG#j#}!6Fon$ZL1Ou779CP-ua}#Cx#_Vqu&U{EQc6_V2$dvEjh$+Hk1PBC7 zO)+l`WLB_`p73>Y1aQ~eIu)=+sd&b5o#hQ~7wnFxH6ert?0Zy87wKpgE>|iPlC!B> zW^yS0JpNzGMC7 z9Vg&M>ifR5=Fx+&>K&&)oLD2f{opkgI$?S=)LfsNiv77~)1JBKmd8|XdVAWxEppa1 z72xSyZX=k0k>B5gaf=oPX87Fmyq2^kTJytQYX|j>stSACQdb>c`7MYM5f^7cI1=d6C~-?+N= ztB?0s3;U_G5vhkvm&IW_j7JPcYeT#CB<)B-FPww{{{B*x{-u3$ddEQ4K#Sz+lRm@U zGW)GdyeFLOiogQ*i&; zUWTdYat$4f1ij-AVIb_mKVKiE5J z&g)%!^I#~@qC#NGZTq3B`C!K#M+J`CW{6e-ta{@R0TjbupaCfZX?Oz}gn*Xjen?M5 zkwhOa@}YInLm!`>sRTs~h4Bb%6oPTQy0*QrUFL9pi@RbF* z*yLxejUo&!JdYuBQy^ZGq84(v12$t5B@N_JT;F)na>qwLT5A5ZpbNK5>LKI6Ex9n_;!N(UVc^c3ms_~ zHz#LjwLtN(V7e(>@9>kPfN2ipE*n{+((hXj0P*_)V#|tnvs*>=b@%+sa8cs^LO`l3P@>QuPAd-xcL;7&G(C7J!RUB| zq^_#MKJFtd0WIN44qRgoU0ZMYFJ`m-q%NBo<{H=<`|0u|kDix5gGG<_^0szYh2&jY zRM)>jauz6<*$%V706HeL;TDmR#Y6@{lNz!@Lwx3=G@?s91dnOhcn-laNoaNF1+Wmr zvPpU_h>n5@K1^C>XYX^|-EsJsoG5qb>W|-qyaYVYY#p?FeqPaw!}7zUO2-WA6+VS7 zS!I`GKbj*GPfl(7W*ZI11+L@SJey?jVIR;yLfpB=-k$SJ)`>S0Zu1>+z7yoTD}k1~ z`&sq!VqJ|8mZW`qD`E0CyW+37CX&)BKhGEEEzDW0W@mVj{MD_V`Q!YZ z*ZVL3KGBn`F3Wc6y5P0%Cx~%rlfc_|bgJUT=zJY&Ob%#G|L-9<#ipM1FcyX>sa^;b ziJ)nS(uI+EnkYnX?QBSUY`wsnywS8$LH?D&vro79@-3gW|GHPiby>L0_ggymfgp=? zxm;!zKLC+5OIrm^hrf!vvp?oCj2-DTOp9sJ?+TNjG-lW9{_Mq);~WxaoFIy$`ET z)n1LVjQD)vhH!9V99t2f?oxnNNLp6*UbTwETMUXO=K;LU?<+f9U0n$iiEwZUe}sQ= zM`Z1-Ag;rB&6!UF+&6BSO}-Z#v9{d*gHF;-ySjf zuJ^Jand>>=^Hkuf)IId+wssUvXi~%*0x}C0Q8oI2g3Ff`)6)jja$H$B$EA-Mbm|On znO#uc(0!t3efY@UxGyw|MIq3UWTB{$xuR(Wv&=+3h7s6h=9Apz?2Iwkss9uBSCsyQ z{k`CcdOgbrLQm=!W{q-5#|sE0FwQsQGatwt|_&2kI=V2>g`!# zMz5AZV}AG&$BiSRkq2-~=VlUY`hJOPX0wfT9^OWw($0X70JGzYVXk|2{>@8b1U-zg zBnueAPk3f9=Ne*lS0GCfw1kz(M0m7+s|-;JzFi}Ld_uW`gclV_usB^@qw`rro`+)G z%lbJ=!${*%hM}QJwT7(F_0auWud{qq+bO{M{-NAt{CB{f zS+H7r+l_jOa@h8~D~(G!I-r?(1Q@Mn-)Je{LZ@rRK76b>uwYre=FN-z-zUzu7B2hm zjiW7DO=MH(7opIF#|!3IG4s|0&XzzP_VI@QdtXxbouSjvO65@b%DzXD;s~oZF{?oa zfJxn9mABEpKK1?0Mi2eNY_`=Zn=%Fu-FvA>2^^VQWcZv`=6{_%e7@&ASD!)1;U?yu zGZ}YUw~e>qY>`Qf=v4*YYdEVEru%ToXE@#MqHtn-(~nnu^jrFD2h^>pV;QAIwd1#5 zXaDhcXTkwW;<<|oTF>vw?%U8r^&}Ak#q?c&o*@bJkDVCY?-aZm0goRS!$6U07bsRG z^4$`xHy9Mr@zah_I1m=%F#i(DmPUrLJZGY&Dz(Y--Y_cl)9*r^cU-FrPK@l18_YYj zlfo9Q#P45e!mq(f!>sNv8^{wV^8qS1vBnU~QFc82eTWJdg_zA+G7_N4rKo)_w(HO@ zEB1Dkil%?>Q@Cr`GH~-NlQomElYfm$$2wL>vQcs#K*Wy*QyB7ZEj+u2e(&oM+xF~{ zk|!^EsNY01>m^@MUN`LMyqa>pO!Cti_&*-W#oid@V+-r19mbzbR<^^e_#}y?OD04Y(vIQ>z17;du=x9J0Quf|x z8B%P$oA>doy2@1v-Pu|ORgr+w%@+!68gBH6PPth(qou)?I6L4~fpNIxY-s5x8W23W6Ocl?#`sN*>}(P0wCl!tel7IevW}1B7@uR>D5BAt;ZJwW&3LVo zy#Y_-)ssWdx9C|*wV@P}S5YCVC*B8_bn6-ZsCJoOLGZq@c<2 ztQwdP4e)OlgX0>g_AuU91%(ZYU||U9*4GpU^8CCCbbGku&t|;QpuZY@i_=|CP>ld3>=A(3_Sq#R^aaF|Si46E2tpgv;^{m`d6mh4VJ}v7c?q=L4GRzlWU}^5V z_KMC&t-qAJBHr@3UsHxAJ^(S^JAP4wYFEO_p9)ybkdn-Ro;SQ@OyW;c53l$w4a_(*y zZI;QH_c~^BJ^1~8!#YWsJG)!?mc6#19gR+St94XZWFKdDj{C{c%l7oFtaVTccfxXq z#9sre(Vw7n$X$cGh3<*UojyxDHqJ$BwlSYAfhn_IMqjwpG8(sPS`z9HW5QlRF3pb5 zVP)@-Ol{b{Q9-uOEnf1J_$ zvVRi05t?k2U<4s#miJz({rPdj11tTFuNQQ^MDN#{oJ^NLlz5gxucX5rc|7kip5>vZ z`V_Hk7mho)Ah}{nDdgOBDir#cksb9zqnl3q9pC7^*CT7M3dQnltt`Ln$luoGbH=(4 zHN^aBWwg}Qx1*opDTMO3KfjzOcG?OZNY$7CO@N{noNkcVE5VHu9g&rF2rHwLbR^B`J}68P>@p?)Khb@?NrKkv_SmXSa_R+qU@D^eHl#f^<#6 zb3h^t%=ehX84XG18QL*?__*^Ow%yP$RQl4^y_%~fY3Hkic1>g3+HMER7Z@0bQ3wgI z$*)_Ke&5-;(?e?Q{H6s7`|m8|xbEf1h|#5@9E2gM7XHSAVM;KzOkmbb%0K%Aa%lh9 zKsGT$jm5Pj0|9ZNj)D)q-&qvyQ~vrwX6Ok8&(erBWmy)HTh2>$hq*ov=|a_cx6+t2 z^*-(*2w1jcad!6%N@ktogP9rAa(&Qq&0u+gv!bMm zgMV@hC6bd4pDFHLuXu=2MXyC&x|gEyljYYhDve=$W!Q`q5zoDJ-o zc$12mw|MX5?!JE~U`bc~^9cJXi`_ZzMDvf~eA9qJejIQp?iSx_UQXk9+4!lgy(CotH}Qa0jk@7nuyqspxFTil!LCnY(VB&CWqA1=1y-o z{IayNZE0^v+*dWV)8d()nTCpoOcS05UxEvs_>MC!RX-1Y63cENF4OzcV~0B3Bf(=# z2HtVE;;ylaMv^0ZiLtX%K`JL44bYj;K*`hjbI$=uGQlW;uqwvAMsg7+b`W&OEWp_X zPw4r=u@q!Ptf`Mg#d#Q!V~xU~gIfSB2krs;1Gaidx2zaxQgM3G?iIP0*Oq~E&JHga zX^d>zy^b^^W?8muN4|%N-IFqM>0mXt+To_H`@FLv7CiWZQuB1Q^m9_6@?aaKIdVvnTMw#RMJ%xfSznA`=4vh z^Di{`43ion;9MfENPr<{?RXkGXNR@IDeGh&XX^X3aeLo6)Wd9QFYx|R_~1+*W=%Xs zeJhBb+9ZKC%1hZj{Ux82xwKN0#OUoHiI^NVUD3VA_S3u7%$;inuHv#4xUMJhSzrs5 z`=eYaM~Ma@v^C&H0Vn6(ToNT7F_cXZh@PAn%Y=o7lpCZo2l$Su!d29JorghAMg0fE zcN_`QT|!#)o4=lw-n}c=T_$0m6KW>e(1|Hl-aOUz?)Y#G@GN9sq>`g3%^vm}rB*N7 zRu{jD@s;c))suk(QSlP!z#!c;cu}wbu_&CgD{j3d{_R6i$WmmwUUmp=`m=C6LmT26 zL}7<1V^r95Q-fRG=(qnr*$8avQ*E(Zr1fVQz464L4$a=f{LU%LjiFwZm$IIByK{~% z&F%Ku&wiw5kJX&!^m+%!ytNlzpKW=?7b$ose%>&I^dCq!s$MeG0rWWj@sfDOFuz=PHoZ!; z&w!?;IJ1!EPXWcHR+^rH;o9_u^sFro^qHkqUH7@{SdX2oF0;M7Yhuu~uS#e~i`xuu zQe3y=jSC?goGk6n+1+GKJ3z4%wlrBgF#9rAHj`|`{UiH5t&sU z!sgvVYw|u=OyVF$rt6{f5zr>Tkq@)cr+We|ftxa4y zpXdCJ+q3cCelMqjzEIOo=11V=3gTS*BmUFn`#y>vj1LDqa^S14Z%jFVw@kHh9r~f7 zlq2j1atm#e{r9sEbiC1eZoDzi-eM^&I4aESd+X2Mw&1XRA|k%uZmtN{qd7Y(&c>|B zdFi>P;o-22ZLaRV5ha7|>FXr&-YgI7;h}ncO6~K>6{=&`qx9MVCLyZ42O&`dOKYQF zkM3)W3lcF)zCB-T4f7w;GQ~U^IGn1b80M*R6T0{Y&?)!hhAwaHr+t9@*yn4xI=>m z$I%$K6ZAP2hvae?Z7ZIXO5c*R_%%H@bhb=cuPkfbu7hEGXRipq5Z<*@M|N-Bhsmx7 zXLNI;sc#iuHu>Jh_B(x1Alh6%20cU@b+Wwl_a#m=Cx^Oak6`t(4wKU(+&Aix$;M=g z*IKujOYM!9T*Rm4aOe0`Cuw7cE*@F9(oB(DG2yed_$9XAlbK%TWV()*NEYKoS^tLM z1n|sGqg`dl)o3EEH zcT--xy(e>JP-j(LnSTG=tD>`ck`E3vtB*7G2%ooGsVx_D>wTjq$2y=wwj=r5+`flu2zESF^i;hziLE4vEpEn|xo{Cb`0S_~riVKW#QUCkgb2G>_>83JkvRGm-A1 zUe8FYeApz3Zw{SMv9R5s>7l`_+9nHa0vL}Y4PPrdPN>8A*6|LkI#3tBX7=pebGw%g z_}{+EF;Tao%z2=?;+tEHVR!kB$+Ry)l-n8ynXTx*Dsu>q`^KD%`sF%*quxNsO!uJ{ z-yTjLp6J9{gG7@kQ;};E$5h4jLmD2ZZ{96*8(-{uU!QzIUek^7^7?wu=Vy2(btdNi za!Y^2L!;e0loa0G*B7=ZsGY_!t+{y1tpIZ@SO*%1cC6nT{;na)lg^Ptxc(x)&gYOk z+vn2@fqO!Kx2)kg!z-7p?l{+#>)o?$VE+0~Mw1%dx>7~$$oy;U(LR+)j1mc1M)*u{nFkf<1znH|jXV>Q(GwrXwF*HR|7$X>bY;u^&VZ8EZeP zStG}^afs=VoM|(4-(7jt=1aZ@j#|m0dv1Tq7t4WclO-;_*L=H#I~SE+>$dz|@;+_C zE=0iL&A>IIi*z}*2g1)-yl$8reL}yxuI#TB#kk z(er}hga#FTA2t>x0{86a;CLPt{C^`K+z$#45g#by3)J9bTn6Sp`(n7jv#7dF?1z3Z zH$SvGQa!_Aug!T*=tarfAhAh-5&0DD6iJ&0vhk0?P3HHyja9Kk=3a}cG?=UTvHk0h zrspn#j%F{tBUdpu^Ow&q?7Md3y2~=Be{svF=;DHN>1Op5qweh#A(}MX3s$Cglkx?Z z@`Mr`wpn>IO$s})KL0fQDJkg&o6XLXwt2DXhp#Z@0-KPjG$^=DKOgIVL~kFFvT{X8 z@kP77y?kZz%sj9AChe<-7Z+(9a(fG!3JwHwD@?Bs8k`#1@2|d@?vuiXU!RA3TY2^J zk7_$+J7x1&*zfND;cF@&>ZUo;E@|MC)Euv<+Sk2YMD^k)qqnSgl6yrmq})T8O-YtM z6|KCFqIRdPABUlm2u=jJL@5NL(S+;(#i%ePh@MK@-&a=?Z%qTH6OrG8hgE4i=Ntdi zrov3}`#VNFJk8`QmC`yqDkc9B>q2qjUEZhc4V zZ9El9o%S>JozHJhFd7!|Rkj94M@lvOHcas9?Y<>w@tSUS*vN$^FwSYke$}(Z7H6f@ zuXQhS!|!fA{kN}(ZtT(9U&9@IPZa3aLt({OCB?$CSsV?3)0h*;Dl8n_R-h-o)^*L( znD@Feo?+tRx`Umm?B7<7`NVEto^g0{=1ZZKoN`afHntC??1wFWQTh9;KhrA`>l%3Z zsw?J^Wz-9OGc}LdQGJ+noiS?!IC0bXPlteQ-bb`9+S;(e!DFID9h;q<-)BceeD(92eK7x==3-$C`ZdI@UN5=3+1Hk}w6Gnp zOYlw@{93qCG%9-i&jS%Z$`{*lxo-WPt1#{?m{$S9W6Dk_(H@@N%8 zc-FrQFS4H+9(PlJ;&O0l(RR)E%;JvZvp+|7_eJh0zcl^vuH=@_?~9+)$A)shq}_YG z!91JbS<+X9hIBOj)Z(Q;5!Vzu^55dhkYj2~7_HRVgIMT6?4N)TrPqV!dNuQkx38T|5KFsD6D$jtlBac8kzomVLv z@cv7h@>yGBf`e5C-MX@ze(KxbaiKVb!u$F-e23zPiTU|e|=lgg~sPiLI? zS#-BJMYTxv_vbBM`6TNXUHHM7h56C}@tWRl3LZCGl@>PoyU%Nz)%E938PIJ=Yaf!g6Q%F?iA6_2>f?$p#R49;1OKXRwly9^U; zW==h>GJhE%{sk6)f^-q}I38Z&ham}Gil9)@lPh%|0P7 zL2?8=j!(M&{k!~n*Y+dlAIm4c>%Qr-AS1AS`<9-3pUeijdK!$^d=L?#@ui4Crnse2 zZU5j8CoAWx7uN<-@k#}h9XWP=N?b4B%}YOKY2bY9EsNJ*gK;%nPx%fyedIj(>&%fm zMYP}n@JWo(+-II-wBG4-(S_M(a}N*99Z-80)L;9*HJz)3*kHD!_!{N#n&Fuv33a;EU&y^jVN#Ec3)?rBSG&(ubYu z-D9ywFHUv^w7Ye5ct5!GB_s7~>)B7aXFAFy6SYeHZLXdfPhS*dZ&x-M^^YH2f>ob0nK9wqL5-udG3ida$Xdi zX31{h{K6Q&?7MneOht0s-%=SoctR?F%|$gZ9TRtEA3nbHIH3CIB{AVy>%Uf1LVfg; zdip;Jj_mlkORoQgR9f{-nyBp|@6u%~T0~u_H>{kM9qGHT8zYz2aNV$4@}-AKQN5Cv zYHvk*ljVZ-_HxFweIgu^ZOfc}E3xP9<{iK8_T_p^;iePnn!Ham7}s2zjbRyKUfhtE zHB;WtY(L7eAxXfr?I>I1x0w@i)&^r_8>0RFVeDe8pT=dU$v5 z9vS>Lo{BelKIG^#-DDfTi`UxwyzK1&xfj9oqR~;VaUf<{cZRKp;9ziWynDf=flInGhXWN@xM0-txSF-!Oj?+vx z+#O>a`V{N#kXmV)JgO6tM;WAcXv3fiHjJzm%QA2B z2C#b+Y~naK@n0ReBnBd-)-01pykhjNYWyXf3NTBmW$6{Xc zkrac+QtLX7+4Uc0S^vA{dF`C2_g@Trf4vJ&-Eg^WT<+%YiwyCJycd7=A5@7csvAtM z9+EVs#shLU$SaOLbi-kMI(heT=XJNPEc!KEf9FuPJj*n#J!U*Rb!E4Rt(U;fbMIyn z<~V+jh*<}7Pk*80EtzQ5BOmmr9>su|B?~fgO z_p9`U_+&aM?qHj4reqq)BRV9XN!}mO|NH&p0H);M8Bgxsdy{lvAg%pF-?kLdh{!lv z+rH3BmE$mpU~o8y>;e)7dK31=o-Ioqy4&25E*K)OteEsDL`?XLma2GIw?0=clkx?v)SVF`(?_f6vKjdM;9C}AIP;8k4#`W zeo5;+tL`STXxp(i&ic%(o+O8m1M*90E9I385uvnS1E1Z{jt*a$78M^BxH)A}(YiXm z<*1|NuH(Dv%bpy+;q>#1T)z_n&Fif(Qct`SxX$Js+w^Uu{@b1hHLXRCUr+6=*N-cc z)0;@qxn297gPFbF^vOEA>(#~sMOgAi9Mj@YGIO6u3b%ZKJzV|8(KZuBev^Zeylasc$%NR4H;lWnEX+5=P%SilX6)5Cte;du4|?>0r{@MA#+?Jp z#YQ?G&n7htoh>lg;1hB+_GUp93iN&257Q{M6OwN)4ixK3jG6V+G_)V*-%}mmlhHCb z_KZ%O>Tz02Tbtm;vdv^l0GWV-ZUl_gy3=a*k2xZA84q@LB6LJw#vBJs%p~)3vo$K` z)C0Ot%Rg}Zb(_Qb*Kga-MI)YZ*F!<9($be3M|W-AEfzDnL+rc-81X zSAEf7IXHEb5h}H3+S!}Alg-{X#R>0QZ}UB*OTw{89O_AepZMysUcA-vG^Y#G$os!o#-gVB7(~K2R{t=jDRxrhTE;C{u zXJ(p0M_;WIdcxa_UdLAt#%-i>sB6mE#}AiY5Ulw zo}25@#MpI26&RnjZEMbdw{OqNc$XleR@sES;tol(jT-%_&d=I7Pne$*y<1+FK&cIJ z%+}Ir*NYnbk|(*vJkW6d13RMRo4mPNu|qDO0}M$(F(n?sIsGPq2GA-svYeq?94KT=LZXNnyq9s;-zTy*XiB}^r2k- zd)ZFXV4K1Hfh?0+X4IuMm>R;Z^Vy}eSnBO%G^SKSC7#E8g^%Xh=1K3-6&QvcBk*v= z+L%q-wNyk36=JR%dO|OK`5LDF>3Z~EXYyFrw2M12u6kosC~{M2P+$|+y!u8p`gZSM z-5O8mleDeY#v1#q*Zk4KxN1D(WLEexpH=EF52>K4YrpHata_UCG$X4aDe&qNPeR*U zZ|Rfv<~OJKi}?%;&!nXxScuCFaG&LP^vmFqfM!F|@ceY@$v~$}w$46Aue`0Yw~$Hxk`||^SYFy3A?dl?dzUVS>!(S)r?s+|s&SvQ!Kax4ws}on z<*?bbN%itXcNLwApaRd6X`CZ(5*z|2HpE^F3Zc5X;7yrwVH|oVvR%GZ$c+X92?LgH z`EYv+2P0sRl_%K^v}I2pZlKfKkQ>yJZPhk=@aAu`tx@?~;$3q6Ya)(#$Cq!usGlAu zvgey`pX0@%-|By7CO%vhJDvajm}`GmQG$lL`p`_BY1YkYhSs+&kM6ANSTMd|dajW2 z5SQHg_Xm+YTgSU!QuPsrSPTpVwvHOS^IBPcTArUexOh_x`{G^aZL63bEWJFAVzaxx zF9IX?4aZ(Q<_%qBiJ=)S{^jeODJk&RJiGBBfuN12DD>Xz=@X?E{9i0PFA7R%H+;Iw ze{OXD6rY8K1@S~?KayDv{C`w^cOaI1`#woTX2=$@_el2MWUnMMTe5dXvUd`)S13ZV zlD$W`LloH=*;{4&&g*&K_xrxT{_A;E_kCTT&pD3sIFAG8&#ju|+%>8*ROL?!oc=AFhthS3$Kj3?fV^IW}cBdcFLLVVsKw52+P! zNawyBPJJ8Fhdb`4ujYQJcq`+G8q@snE3fhGH?KD9m3}5A3xB56>qO1G9KVnMP-3VL z74LYbVA8vj_uFxcZYt}IjReJlp+}l-nf3-`rr>o118l@3fLWwPq=>nzV4|p$?81H` zE3PKbN4moQ;8yRipP{QWuh9p-o(=Th{kyhjBSF34L?`NOIH@vZ)}Ycb7wk0UXo$mn zn=9+*`Z0WmYdd)*W-@3b3VBx5#%NBnk68~gBwzE;dD-KTe~eI^j$dA=$@Em~>l5Dp z;EL8dT#N=G)v_!6NntTnpb&@9M!|#8>GH($X%Ero3(it!!t|zEh+-0`jvR zNLMj|D0Wd(Q?DXS@ls^?h)mA^H8aR!7Xe4oI9R0S13fBOo2RSpNw}p@(=LY=r{68{ z&~FIWe&&a0aya8(jPR{czSIi$mF9Lr4*w2`*S4h#_oi@OvS|!5by#xRPHZh5_3fXG z_crgS&Ndp@JlnU{R|c13DUxmFQ>09jqa^T%Vu+ULUq z4VClf!u8`E6u)oyKYXWj zb&azcieTfMX2%cWISQ1b3@Uu*zN26MnZWuVcYi&aZ_(a+1LxKiRyAjQ7V)6h?=IB5 zq>$xYL-5gWlNnO6d0!5dikjNWcFJ{;4?*aXl9-kK}lgP@s30u=PS1I}Rv0R& z4;Qx_He``4S{T!PW4P}dk4Zv%sqBG7`h%(0`@?TkPI;FZ11Y5v00UTp&(a{O8Su&C znyW|Uu$v3G4mTTXe zPPelr+>Ye$w(2Q(0<(Jow$k%pyn)=qwJ)51KXTBlVzqWTCh)j$Y;1-oYGbo*L{%>q zuuMJl5`u>!xmNc@EnH=G<=wQ;Dqng(CRVOCiSrM>GQCax)|4Mun$=HcUEh2%$%KE^ z<#Z#3TC!s!TWILv#~|w7v9&nk0NzuA+Ef47@Y`m~&=I^bdHnK-lDJ(5Sy=yi|1sG8 zdI1~=3&*a@0nT`h6o-re0r)Ng@$kPZa$x331U=mHSk2T&)rf$1v= zhryszm9E}aw*F2LFW}^oHfMWH<)UUlZ2tK3dsgY+LPomT z{A~|{Kc?XQr9&w!Yp?jei0mk?^!m_Km8(>{`Tg$}eGb#bv=%?v3+?Rpm4lzHY+bqa z5^Y+pfjI7G=AgFcM|9OYpU+7g^+Id+yBAK0W3>R*0ZkC|@fQWg5P&~ruf{iZeJlU`@jl2K7AmmXVpluW>o)61? zBwWUNAL(ADrQ97dT)mxoW!$X&b5~ORvqqDTUKw2e3D#5F%L~1C=se{MP=tTXgk7(C z)A_%H-Iy);u7#ETjb!#3O1vBIX29UZ_N{>d7nSmwv{`)Sr`}V2v8&g1d>)^~}zZ2;nClUPWr6{!m%2h^lbQhU%o_M`Oap{jN!BeN*>xm!JHT!Xkv8Tm0JdA{nuteh#QO z(f#I#>j_j}tBu3M3~4amwm4~A*~{+uR@-=mMAqt2SW~0gyCH9>CJiOPg@+!0JD#-4 zz7u4Hva6Yv^rU_8Yw^a@-BPXSV*<{+Ul*dT7VDCM0L z$67#FEXcWk7u>I2LpGfJc5i0(`GW6Kob0>)6xGG0rPhXhLu{$kYK7p9%|}<^E_A6) z(ESye$m+Gj@%u<6aa4db9`_j8NKIYhyLopLG)l?=i==i zxLmKf|8s{B!1nIR?LVWno{S&Zn-Z2HpWiX9@J#{{C^%`bimtV(r{2jwf%#6qS{y9` zKc|1!HWUbjG-3p>B5HT)a7f+5ewMAXTo%b zwph&l_9fK_aIQPhibO*mKxV-Lkz-B#sQr@ScQWBo_E>rhr^8FQ^sw zr}9*Ii8j0*UCVB)G{$yEtskmq3MYXh)BNIMfde-%m;`_^UIN{!jy-yaB% zodDz@Ae7PEbv0HTr4Y3V;oYSDSOPi187(f@Vb zZK9~N!cPQ^+j%zU(cjMnwy2`l^M?E1W(htGyu3Wu^4szKqZWUbR{-TwK+KWn|u`|C48?=v!%myZNhPi^Oe$?nA7 z=L`UOe~?U31OjTDpJ`23Pfs#VSRQn{iU_9of zTh>$Fw7p)ZD64r`sn@PnY+&hrVz9zv0x<08>ZzB&hQN%HM?(M|A5|Bb-lrZPBG9l% z0__Ah*mEnU%bZ|661U&wuK@-NZZM4AQ4a1$btkQwJw#q}m!)EVNACSpmHcqwYUSYE zoqj6JosqS-v=z7T?O|YrJt}NZwxkePlmKNQHd}}|EJ*J;HynHZ7awKldB~hYD7!?D zY<7SP@Uv&nO0uF+;CzGVih5Dr6Et?DmcVEoO#V^vBlglw?(=z#n|*Ah0YC(2jeh#J z8Utq3$V9yMQm4R;ch>{gu5fK}C|*+5oN(RRiz^FyJn8$4od-*&<<-2}{-C>j&#i|v z$%%aQY=_OHK?PRV!H7$)Vq)L;2hNGlN4~8D{lQarjuq}%^B?gYv1uP(+@UlGT-x_9 z*YN!$@qo>=Q|v9;dSF67;~iH~!MA-Vfm8%`M5}KUMU~jxTi9mSee1Tv=+2KNF=x!$ zTe9-WbDazpGOPj7`Td5qqezP|+H!{Hm%HDOd-v?^QI-5z_s6aGXA0meu&MNY>nUHY zm-i5rF#g=sC$~#6@#RP1L$s$cq_5$wKBJN7IlPa$*Fz)jMSIbn{lU?g(eeJmkB1(| zci-J>+2_5xZjkHu`zG-=<AQifUd}n&qun8Y zYn)B+s2n*?aeWu;E)L$k?tVQ{w75WHcT_KH^d8!oT@b?>h4pS|T*|#fhvkb$?`=E< z@#$4qS6u*<10gZKS+0T<4u*RDu>5T|U0?O4L7Wvh(|2|A zK0MFzE$wj3G^$O~Z)#@VbatyfHacEU0nKW6@hAW zyuj(>ZdU@;yS&pqGfmgC9{mk%Xr8WO<5mbTx>!rtIJdY`2aUtzf@j$;iOjtR#<>&g zcwtc#!?!C{xTwW{xa@fNKQz%D&DSFGE@;sKPXk+6iwB{$yRiW_p5wtycQa z_4e1=(5hx-5w)WJ=raHPdcykbHkarJ$HDic8EfM!_qQZ@o6SCXWX(KLA`Y7MnW*-M zD*Msz+>5k`c)GtG>g+EFx(5arr;a9tJA7!U{I~btPj@%dx@NqcaEAHi-pD>SH%05G zdj;>GH0w2+s36$KrWn4h1li1HlBd{k1eccED)a zrKCHc>*(ym{k;>a0l>%*pG0%_3Cj)SHv8K|qIJjWZYpV-z22TWX4e1M zAga^)IlZ5U^v-ex#|@G)r_EiismooF3Qs{Gmywe*779wx7@i&?cX(grJwH?=XA_e; zwT_?b^;2i8gs^k=KEdAK{JYfRt|7@Q@7_D?2a=V|DEweAIw`cp1%OG|?+-EHvMYOs zV$)Ia#ac4nr?~z)jc#mPot^ve2ZblUxom8ZLYLZ|kmK1k-ZyfF`Y|2_rwsLcB)Fq zZq8g>$$0+iXv{TNC*9JHABStxsl0)bNTp}FhIMt`vUZjpE&6G>E;>%iyT>yS>v&AydK9pKT(q`0STlhQnXFt~wY;R6BaRddy2b zJAWU1pJfPjP~293g+wv+<>UR->D zHrsAWK=T%5XE%GKuX>qm{@8wi;!YsGm=~?(;_Dy^agR$EG!g@VJr(M7>D)_TqtpsN zAr1Wx7a+~glcUNUCE9&1oV+X*2TbL)d+fywG)Y&6>; zllJf5qrVhI|71Vl>FQAscoT+=QQOdBk;a)o>uiV(JYntMrvzV%mnrh&$Eh(8~#VM7E7yA zu)U4%z0IuM9H0WO9vvloK`s&tLKE+1^JRaV4~3iA986M}H25X=_L8%|;89uA>8cO- z9Zo;=9Pcvb@6mU68Ob<}d$uGZ*bK%}QL~yX;-@%woM+lvA_-)eXiet^4?dXdU%NLo z{((dR?7Cs!hHM8G|L-j|ZMthaNqbL~(NDaa`fSMfdT$n0jaFvTlm#@){lm!8(*~#O zOqXH^`G335*qPqA={O6YJt{uR>MXp8)A)V1g4);Wz>XFle}CTjVwr=D^JTdz9oYw^U@}IDm4w(mk0x=S{onRz!62OOgBOP)H zVORltQIe%9v~tYFcz&cX^7i)K!(C^EZX41Q`RRCOQD*cYGfnD^_ukZhk5Z-XHCxbO z8N@OzcnNCYdkKq7Qru1jUE4F+WAK zwOQv3w>+oM`pGw6fWSVWAum9ChaZTM1z8h1CL-_SS2=o6_vbv1b3c6W;5Kc%>)=4y z73~8G{bV_bo!``mNZ427>x$PI6I3)*nAnBTb9y|?Rq8V`%SX*s9Vmsqf)RD{bKRV^ z??U00<5TlX6uGKS^qeSoS`^>{1nYjqpyKOLygvvUs$tdD0#MBAi;>c2vjRICmaPzL z@m~{$#pI@7X#k!jprVg#h=ByB&!14e=b%jkh2Ri$V^{I;x;}qCcp!Xqz0U#WEYbqX z(a}GF1OsDjSoC8(q9vHcdfmxnzPOQgxP7oh@}aiD%;S~_b9P40(84b>>>E>fWx<0@w_PqE+bu+d{^GSEh#aIr^W4oyZc-Q-ACNoBKzb- zK0ZfSlSt|@4(Xnt<3>+|ufSd&z8N3iF0~jf94>;u=I$pvzL`K|0s7+m^Q_Fwr{&Sx zj07k$j5yaGr(HXcdMwl_QiXMk2+$cV$%@}CGQ0fXmal!80H$u7z;6o^A)L3;TC`{1 zs(mD3_X#Zas=PLh5&4puQKI$*u&0iIX15Bqvzkv9a6zgbB&h1b5Pq>K2|#kMLAG{j z(f%(30Vs?Dsn+^)$PM^^v{vP+)w}Rx;v8ULhe+2T{sQ1nk+LF{R##igeEYWkrXcNt zSrvt?*B~<&TiXIo-qtqf^5WXjWP9P?pG#@ByY(6o347vUDk4$)=JR&9YutQkHPQb)*wGIg$CdOOU`8>j7I2b=6b6Uc#gzv{4!fQ0t`+uIi^Wj4l zCqRVy9t=i;L4f-y?4nnKvrG)P_+^-;g5psGT=-EyUe5ol^CWw}FMWz-sItI|TGh** zezdanH0Vdarug!CyTn{N?y=K@ELNSj?E(@<_8ZfgbdAGCzo}vzrRSBLCyeaT%in~- zRs{Qk%|Uwym`}*c%7Ry|W;46^Wh0=50eKO0L`$=xd6^z*kK|l_g5z7n+VkT_*hf$H zgy@&r0bYCB<7Im5WE8fN|BX* zxQStnjnnu4I|y7N7dsD$LP6Wt2DCs@(>uR>5B($%$28DE2L%F(!|9i@1vL!0s<2(DE_wCA z(xYg_m{5OTV|*y4 zY(N106tpS8-CCta+^u73D&ybURY=8M-RUGlZ`#h3aBj`A$B4-q!||CfaCZ^X3}Vd- z!TC0ztF>U?iCl&lo)2WhYPbeWGF38HoGmE$qkTR!JFx7vuYuDh=v(x&@Aa8|$i=&) z5Od9|eO1tz-zMD%B$UjJ%$2Z{1fug19b8zcln0?s#Hb3kwH%87$8g6@IU4NS7zl9i z@n3@r7NTemG_7gQniIm-p{|&P+hVy@wKCd!U+*si8*B2(oFL$WIksifyZyu{! zJSRNw28cUQM0Ap54L0p-i9S(#wB%YW4(YkGYxImn)u5DjTT3ON|PSApDN_ zR{bM0MQTCz)m)#wz$!WRo9ta2JKWIP$nQ~~5d35~mg}YZKd=tgzhE70gk}tUNlP$k zfd^{B*#Hl;t(-8VW=7F*J+T-k@0TH0N52_XwIizTVEd0~*D21MES>XW)_OloVxwwC z1EC{DsWZq%_FygwVjgfPxZ;{J2;eV}b+k%g2xD20gc8`KlDz9}osy&VTcBTvYLo)6>UWVBof`Tv$H-3aMMsQpl z9&9S;h>=Z0yTt_HP){bKTNZd zsx-vKx^{BD5_~xCb?iF;zF_3a;@VmtV4EG0M2rZ1#BTI89twr}|Bh_7w2eE6Xgu(2Xahog1}o-hz+_1A?b!EFd(*MjT?SmM4}GQSpd zx{G+jBTi!wW~)0n;~6gsE*H6?Cvr!&FY%jMSi8&zy~rhxXO6jTGe{2pXUZT2u1+S$ z1>v|DLIU_Z1M!{rPFzABntGM4*!5l6Uh*1Jf=YIb=;V)U*r1Tr3tM7?UKJ(yTt?Pp z_Z<_5WfitqDHO_>q!)|4_<3T1swWM1-G>%p0(@H`=jmQp*DWb}&e#i)gFXg9oP1A}0&$He%##oMh&!2HL60C}1r!L(d$;kw;#0Vt) z{h#@_p?{*o!l%v!MG`26$MS_k^zBE;&_5_!#Pi}|lK5BRTzQ0+<}yeoG67oZAUX%O z9R=S@)6$-6J3XKzQF@qpT{9K6skNA*&B=u;n5Jv9B3EwE%t5l?d)sa#7`CGj@qK8S z(|9eO{x6LsQYn#Q8kWc-YCx9=YVMUa0vPUYHuxXE`)ND+hW&djFm^$9hF~Lf`XL`@mTi^li;^kQo=Xa7T1y}O=~<)6 z6biZoD%oWY8yDu53m`-pWg-I6u=NZY9?9DV#;Fh)p2Ite2A{wYII-0|k|6O2#C1vd z+(oeaVw3O~2ej}Ia{xr+7X(t$Zr4iT9~52Y+U=r|tMf@;=E^o)cI>60GS*HzzS>DQ z>dkt#)ws=S_>LODDIs4@_Y6>(K&Ye;G~o&B6$QV(Y1Hxp^-bkt=v77?Cp^pugCc&M zmS;t*#vfS0&(jj-8L*!~8_i{uBKV1xbbT=H&Ffp7cWojJSUS>*4i#Ppq?v)Jg!xIl zF81yz?874yNf0ofN7m55E)n!HO8$2Ztv(@unCls#Z<@hdYp@3cPx54{JI=6$CgAGn z$s{CXuqo))^?fLvfi&Z~Ua^1%?K#?)q)ki<*6{cF=2h%3944uT7xdN78!zCCmB3|z zx5;l$t!BHvBvbWklhvS!Mks!ZBFp~a!rj0^yAQdn^}nxNpU!2GZ1WtkE6)Ld&J-CT z+rU#t=3lTy3x``2Io#i1mTw1cxUdZ&t>sPsuix&--$Qb=WJdY>iGBw!&qn$WbB5$ zw{yS<3kIb*&^awPt}th(q~wjXf8?~oW&E+$S>4Au<9hkgO{1pEl>6Qv$V5g##T=Z4 zWYpDT;fyDAW0aX*DVJhRU(EbO&^)=tBYN%1+naKA26@qg`K(x2qdfc!oiVa+#}SoO z#8C@UGHmPPz~+no|3;G}8Fr{Q7!uYYk!xsZ{4?k17XT}YzUt&F8z!IN5ps1odUf^* z06Qs~aGy;9m5Vag%{5YZYPJ@oS^Ckg{Lx+7W2gkvvz)-Zu4Rt@iH?JI_5 zz?YVkCQT?d_jzKJw?q8yppbl9JJUS#voS5N*MH$B;$mr;NIFxYo zIpfI$XDAdR(T_ilt0cYg$&c+S6Wj{lax-Ylb=4PR+a-beM7nsi3Iuv;bom4@1+$My z>A%lRahu*uUwo<7T~B(8#+XYQDkik}_`OEL_DRIQ0W>who)d9D`Nv$Y_fc^63jcZU+RCqWTxL^uN&TG z+3LP09co&kD<+o2ffId2>w^yon^N0CN>#15wip{dr?G@zx>uR zdIP?a*GWj^0et;T=?#@LyyoZN+pJrnMPJ=5bOWe`Ks^VHI%O41+Td{OKBC5M4MC$; zeoe>{^%G6oo;J+hqO%Kj+#5}px@W_ zA`n~*!Ny88i9rDfCq|r@f|%DX)^w%mFh6GGYTn*R*1rF+8K1;|ghY^p_W4Ek!0F(R zA6bBfK%AtWd2;-qW>i~7kto0W`ax7~Bi=_bioXwI2XgplTgv!n7IB_h7I^6_NTzp1 zz?Z`w-2tI=P)R_F1;j?<(UcJQ;jsfJ=zsPk_CkQkvkO5CL`IxIPZ`R&hJ|0h z-l!Vl>Q=hCbQJ47_@t`G^5?rs{yS<$zCX~B%2cQsib*74MCX$?k4`waa*#aB*j5XF z_mUm)yocVvawtX3M{%=_B z!_)3VX^RckP+V)5Hk!k2iy&y#r+@rd`(E?*dnx%3I2VWy);|_d3}Rp5yn97Y}F3X@0Uk=FhF*d6t$1b`aEy9$)LTP88rqC@j=^J{rm z^QCWG{d2i+QdFwe9R}JxpS-cNW5G4>wU2DQO0jyO(2q@pbP-b zUFaL%CDPh>+LIS=Vl-W77Pd_oe)aQNzRQ8vEy3*6b z5W?=>if-N*yXs&ewBaFsK|BRUV0}+>F!hbbV?xlq^l@SEi+$e0BDB_t_7;axKN54)L0KsG1~gAr>k3<4qc?J;ywd>E2Wiq){-lO|bB z<|mNG@!U%uoGrFI`QbP%y@*rt_jfjLHr%nrt*s$2ilN|t82Nq82<>gGMm8oM=GQ-i zvYnl=XZ+ni@s8sjP~Oo3CHYJ2o?~PpscC7EO-)S!UQEv@Kx^kY)GjE{i9z}TC}j|l zv~i99Ix#MUS&0ZB-LH76rsVHu_M@+>EW2?2F{Bn1d6^?hCmCJSgbM(THg6?m-&Jj= zQ-2Zn6&~~9=8n_D^_w3k9oL3lUx_30ShFkNblJu4{PtE@0~2G!_+B^8D(I^s@{Eu~ zG(SrIe3?JDL=l{9i`HyCs$B0LHAyw!shG*c#e~vAE1n27Wu8sT%;!_jL9JK1b4NPn z-OOylsPf*`5fh-_E95YIH&TB8&PVTU4FG!K9WEj7P_VSL6w>Di7^qUy(0nEq;Npsd zqIqs@3{@g$9pI~HLX5X#jhRkQ3#!+CD2Mp^hx8{7bhaSzkg2o#^ zKDn|J23H&MQJXwzy~N@Q{;(6^B{d4)2li4%1&ui}o1zyt^r>gx$2Cy7hr-LfHQg+4 zd2m=Z@yxU$*;1ado|IHmhQM}Y9cBD&VQDQvw=G}TpS0)ukjm!4v))k;Q5sNJ?SRYz zVGi)vd&(1i6cLdY<|1+*2>uc&{s zE)l=D?LLVu?BY1o86qaAFqmYF--*fI--eeK#u#QoW2jo{qeDW0?{f21e!a@$Xbe(A zOM?=XcP7DAJt8aT=+CRES9T<*XNG%1u_AZGD%Rt2lun)m(pf2MW7w2nx{oPRe8LhS zPYG^I0e1kHA(+EUsH_}mS($={B2l#{5oFJFmAA>!zwDv)-#FFDx-T4=hF&s??uj2A z{vAhBTAf+q=h_8NVOU2vS@2lCi@DPA@V7z=Fr>!5cC8bz#1XJ;M2U#@6DAsC#o-R!BUY2P)aMmcWikLozroL+6>JGp*qND`wOC13 z!HpHv=c1}@hZ*?!iJ|hoo}~yV5b{fpeRWwMmN*X#kaiU4rgLz%TwGiTv-XW4NhBsE zp%>{~#lXNoiBJ~kvG2BAoDslsE&LD`Cnx9J!onpUo(fx@Sf2_$w3||QaMSzh5|aXO z*9e{`CMTIxX5D27k!J`o?!whGOOwAoXi&-E*MmZ-k5LB^D!qXL1neoq#8D){&!|+) zpyuG!Pz8q6aBN{ct_=N)`CEFlDAYDBmh0#N7WU56vwpei` z9yr+8!3713AS3XAGocQauulH|wE{E_LIKyyp0V36U%rI>U(R~pfmjMCY_4Y=7{}gJ zka!^@LE_Y=g`up-?aYWHcJwvbdgS;o@p>+5}App?n#Y} z`NK=q@AYw;zxEr1-23*Xa`WDmWlvGdnNPkaBY6VI5D=v>z+l z6bU?L|s<+T>8&&r81HAe5-~~?hw0=3|a0_(9wRbV(Dpf8>P#FH2eh&xB)#EhQy2Q@Q*|SsgdRhl8wH?)R{7x!sN^mI4(q)AM#7{p_jp-BXdl z+?`YX<(&PrP7?8;wYtGUb!W+2#J%0!SAb3NG$DZi`l}sSOF|CIX(0cLp;C*ou`dFhJyU~UD95?GPaB$sIIOiqM?ZcyG^i7#0FAr55S;v^YciB z-8{}$bS0dZ#}IG%=Nr-{&2k+E7Dh~wwZ7gyWkn5R{`aG_H(3NQ9ezsP|DH|P&(Uxz zQ5l!p+2>DCOh^)iIwwc#*n0+bF80^@M+9Jr7#i-!mk~c%t^`? z4*FML8>DERH@!x~Iq%3}FZd4^pm9J&Q&Hm&<5D3Dqu3eI`-{Nf>DaOS3uY$bt2dKm ziw1d6a$X8lGWz}b12%<<%)B)vXu1Qcyj3M=*Kr-w&Icx5L2QA-1+lw@flFIo-&JVy zdY1Z<=YRd`$8C?CX$QBwxnIAcp%rQy9o6;FsOtaxIjqXHZ(3gAk1Ys^lz@hZH%BZH6-83^J&EiZo*b>h7hl!R7-W(CKGaz3Yxk915~ zhE^x>{=r_!4ijlZZ_uy&ZI+IxRw)ecKX1(M{Enewz@wLGXm8VSBrgb1d zO~;-@HX~m)C;l=e1w%j}+0u^3^mvP@K$X-n*Y4SQR6Dv{8p$GufS`Q!yu^2Pr?hD2*jrs(SOg|-L_43v54 zpr7slX$OUs(_#=xMn~J4Z82L2BzJ+48n9Pk)`h36sR@vdM5Xlr88i!MSFT*43=)qT z%Qc@HdcT0%lA4+o{;8}bDdX_Y-uo|!sVU)^gFU?i>I$YBSM+{2@X%^9aD8;IGS0uE z_np?@1qr?bsp*ScgBISKY)Q&DZwrQ0rIW@Eyog9jXNvvIY4OmYcC{uX>HI<3VP|rA z1k^tyS+cCu$^m^7na1Ucre9|j%-j>UX4?{zX2>OTsU$rs6#_NL#vFd`V{uSk3pajH z*`yegp_UU+F43TT|7`4Qw^_xkjGF@`^>?ArBozwsjMPxqbhj|G#|FIo)laK@MaU^z z{O+%}xVpFmhlXN+8(Sm{>k#7y#G8`ObwNIsLg0#Zzj#m;Gf`8lad|g*mz$fL2g5Z* ziF9%E@FaM@Va`f?`7#_@U!>>ma&yOq>GLTBfyjh}h^VM@$?Ye)$dd+sD4)-cd1qJG z+GhAwwp$9J9z4nM0fqE*L5u|Uy-K2cJ9qYy!o>@35>WIi3F+}TslJfb5pFfy;qaWt zHglbQx2zIc=pr_m9G-gkN;aCGSKgPrjaaerDLtq8Wi|44;_%9+M4YN?b+vR-fw3SL zX|=c1=htw!10x>zEIptNEMH96bOl4&(sXC<((T+K%*5ldb#XLb<&UlyO@HINd^Bxi zk39nWRwSh&S==g%cYY_xpYco$Uqg$ckEd=5HjTHcVmBvx_&yIU7AM@(+~nld>W}dX zGdidfAzKYW(`ekb$geHRVg71HLc(4ZmrVX1)t{=wqz7`Z3kkKVT} z8)o&yW>Y>7blc)rY-<=iA??Zk!Y(300fS1yEE##$dOjHdkmoiwVqt=Llauorm_CtY zDg3KMlP~mET_L4}n5xd6VhMi8h(9)bZ|WGK)UD7pEvkfHqhCoO-+OBMZ-NU zHut>#;ZS}lto~03DhrL+-jVUYv!U(-pbv?(pB+MkcAlyKQ)V1}s>fxWN1vnjJhqBbn>(43buU}f_YHO$)m^RsJ;4|t>LU(--(@tdpDXlIECoC3{0!SNd!F$RY6t&3}S)bL_&!p%#f zY;PUG)?w5or%WdcXrdq|4J=RZ7%7}v9~ddTcIkLf(dfkH^dK3_N$Nz}F-U{U_=7Y& z!sVeX+@PQ!a6F~~$L`wz*UYc4#{f`rb}SRAT7}#k7%_uclyd2(w5SXM6+;Lk^gKKS z{ORiJ3DCK)gQ%Ak3`HL|$viMiPfIfgbnFCd!{)ZO;=!z%xXJU+qkFA{WW4gX)6Um> ztmUFOS(EOa{8>vCFG<8>+RIa<)eGC!WxT<@Bz@0=%?CfbDLtInVM#9TZz?f5T1v+4 zVES9UK3fb<*Ga?;Q)Dk)SGKsu7JD;<;+pwowrlhu_VZIVysUnFJbsU`ukXytT`Yt2 zZ>T&&8;q5?MHM*6xJ@Df9JuV|23>1qtfa-D|a5PNo}W+ zqw$`u911+X;j%i0ty|1&*;x`L9Jt4i@CQ~73Q3{EIRWNC(#w~xQ$tTaenv}7%QOEw z`&Lr%Y|NMIBByTr_sL4Y(W%I0U)<_GO9L$iYK_WUNkA8Uf-&afi zRr~e_LZY=isQ-|NhK-Hg3hvADE2kV_#{yl$0%X8^-Scs%NGsu;!XInx?ZpQ8K?YV1 z0Z-u&-K+}b-P>w(kM4h|gVwzfUx5lqU?&fMSv2S~={(}Ph>h0q8z$OBKS zEZP*?yh$l2qFe=5#03uia=&DIx%mB%3MeTA8rkBdhvn6v@f{+Y*9vF{Atfbbx)7+5 zI=Z?rfkYq;sjBABi9C~bK!7-O$sxenYXwrPM?B$lfbvHMUS2}@iP1lVJMfu#?Z4at z%c~4;+n_MO&Mg2YLcrxEH$>o`QB=h?y&df}ue2{0^^~<~Th8D9US%%otn&ewkk4&z zBO=@RPTyAU5Tyjb90PGiLs&*AHhJT!po_rz`g+8jZxV_&DYG78MzpZuCu%!RO(7xZ z@DG5EJYKqbIG~e^&~(D*zmcWrX9HaW6272})#ki&HSZ1+s@L~!kbFj%zDx>=)Uv9os#W67 zP_4nHQmEAV2?jLA!k)iKfU|x{Nl6KkAE_FKwhGv{#Y26O2M8*1;uTh~J3dDg;v!EH zhIp+||GiBB^RuS_0d=&sp#%Cp_RA{8119PS1OTV85{zY0BJy3%5X%wwZJ=V@g!{WZ zoRa`MX?Z~Ff%_|{k*Adl-VD%-b;B6!z%BSB3Y>S4MGj@S5|EUU-d)p!cr6`=ls(sW zI2#(s8(Ff(FP=ZY1T8*HAK<<6AV2$i?|c0ZT%slpczwV=n}>$b?#IX5z(C~`1?$6q zekt>~oFqmnYsS$@(Sk27_SLIIS$jEe^h)z}GYGCBx-4Ci8KNy zCnq~t(S_O$HI(qF6=0JQQS(EI98kVcWqQa@0sllSkQ5fdT#+#ApqrD6tIBqm_Tj^a zxn?bay?uRbwLL<7d?D)09k5JGNJ<(8>^p?z34n#PhsTF*A#vgqJz82?pVJdQ5H-gt z{cv!eoCU%82FzNBL0Ws_*X$vC3JzQlxxhe4Fe8WhCby>N%MGB5w!-9%4@UYkt--1( zaA(1!9Un+=p#asbQpbToJ2luy4A47$5mPN9296{s!t7%@kw;sqVC|JN$#P~@jfbR1>bU|=UFY~;4f`NQ;&^brEV@zE%ik?D! z2_JR@%)6nVi5@~lgR*|d&=5Y{EaEKLLOzh;Cg(LrGpI0)19^98?$j6!b^`!rAl&?O z^ugrV9E5^<2M3{2^2-MmiOSmAk{f+lA`Vaz~^0cKh%!0bpiwAV`Xa2BnJ( zjO8J|ffVJf!Wh+v>1h*0_SMDPTWR$5U4@kqN5m%`X2eLSK-fe1?lbA-Mz~*c97DG7> z0f7==7%=nBOU+0E`74BK2un8D#8L7d_(_V09zOyS0+%d4Esea1hWea`IO;OU;zdS9 zwE;N>8+I;DS^^(pqb`4qH@sQ^?Cn$jGI_|y85$Zgo_$wRfrKZ(4yQl)UguB0 z2H2tpagu>};3+wH((N1^bb@9ytEdtO@XwI72EfYnJ#dl~O_~EJkQPE!6$k7XLcn4m zT7&o2@^~2F){`|TWh}vktKgpaU zX7GDZTU(379>jJFXzQ(0Q&iAp=U4wbR!6Fm;L{Nkt%;bKnISrdps+=jwWr#3JKzLv z2t2kt0GC!lHSwKUOFYn^=HON%uLQAaJiL<6LJJ+%<7QxcuxNDpZ#S`sMw~+crJCE^ zj04JxRc9nozPsSi_&6!ZVYlBf3kZRtAZqBJ7YO7|q&rL#^X7(a*l^${%fP_^?p^+V zq~KQduw)0k9cbCx9tEN8?d_ojcSPJ8gh%26ktCKz%z&e3cwnFdU@L7fgM&|M|C3KO z2L2X{zek&h#hbXec>Q7c!57GKc{-&Cf(O6_@>0N-j~FH)q!3AnBJgQoK!|~?3&7rM zdv~{@$MYc{SVwh%C0+2PCV*}WmM$tZW_c4lWk7_OXDS9=H0!@C|T9K$bEo zC#NE1(X8GD9e^8IXb_McH4tvSn#%n^7D_pI=vYv5mWy+vT6XvMLv>0!;afq-4ubd9 z4PxpLD6YXe(mjv(uf0FrfJbft$yGS${L?BmT5w7V>8GY9*RwyKFuqv?A^<|TK`7Ivfew zuV7i22&Q6CD@4@Q)vZ!9#C>lGl7jxS66T3b(`ETOr8^KktYG`quW>v{H5J62^P#v{ zMFhSeJOS1crSV1N_3PJwIV*seBCPYwFD*TT3x&F;_Y{sPES_9~3Id*W2RtQ_0A5u?%g&Aix%+8TlLRON z5yHfhOG(f2L6aXTP(3wvg#AD6 zRI9NPZJ5-{LcV?Mbwmf}DFW6c7hy92h&o(gE-TNXef8(^a(Ha)wT{uTTPguMZ%y4TuCQuA5lRCkFZJBrjO7|^>Co324mJsu(ro) z)-0ZxnTdd+tRy%OZEa&TZuvbD5fOpJ5dth-Xl)_#7BBt$i9QEUobl#OG$eyVH-0;C zV>a+F9`a(K+?(InDBE33^@4aS5ALrp!i@uxTJ#XTpDnDF1j7}C+@eryrvOBA@Xf*p z?^;2JF=Y>Y)ct|Jz7VhRc(8G>U zd@I3_2gO!skw7P<2pJm&bWL;cgrI5(he)zY!r+Gm*97Ku$TtTrx5eYf3DBWL5B)p5 zFnqapdX<$(n+<6xb0Pttb=`STHLAtaa_$HF*|NDh>_~I5=4L_V%l@ zEiFScn}>a0JD`L^cpy86hYB#$rB5C3bhdlGY7IX2PvL`F!b6?jIi`lxsST9?5iM;z zjC>sf>~2a((11lwFcd++*)Bv`jY=WoNO;l<0L#nU*_EtP=hu-zbqS}QURW66?-OPf zkm8bYO2Y=-l3T+nNq*hS%*u0T!`n8?DkfL^q;vlRLvd|L6yVadPO08|gJtMf*E zR*p1HZEO^SnN2X1eULlx7Ix^@-XP5aoVk2~NM*Sz_|%a=^67wP9>PjD1bhXS|AUTi zA?Y%O7}A0~lsUV=Ac@xS4S}{6*cLE-DZFz&4YO1zaoS)Q0+{s4LJSX5b;F&^115-Z z36q~c#2zGHLIE5Lx}p$P48hq#7UUq1Jmr7voR*OR1+CX@hp|>*C%c}X`o>a=5IfWu zdwk(QhDz{2yOH+^mxh%DI8Yv@9*Q3w-~<~rxG{l&vxSuvqo~q~3zXf&@T8$(jV0%k zUFxa4p1(y<~!t^pPj~-s$Ge~`aXCOr4dhhM*RZeypxQANc)aUg5 zg9=2H5ttC-!Qnws$n(?(T}Va{L>;I@>y8MkB3}>+hfsB9IUAeTtDOHi*IDh5HuH5J zf_D~j^r28wDE@@h#1&1ydGFl00q;-&^1X$vZG>6iZ%nu>%BreQO}JsZyXK{1)QkqC z6(nr|3LK-6XQ;)V;^OJ400cs)5Dnk(Fd(TA{w=7-zY2r=_nRu&CxAv1|asbV9AH?251ye(+k zDLVl}cnc}8Fh^ZoJy(nM|50@v@Ladun~DkvnI&ap6hbnSvPH5gsbr6mtYlOwGD9LG zdn=U{rDz!0gearzP^pNJ@V{=)djId|?eo5$=PCVu-|u~&bDitD&N+D)Gf8eN%Dw$c zO4t79>AqTix|N-s9EgDxFwd*t>7xEylD#+!4HpqS1rLBMl*ii-K*7(wcQ2Pj?2T?G zjjU|~0v2E$VqkMZHP0vKZ(@cOhcb@nhsQLWvz8Ql7p4p_*^Jnk!B#N;X4Mk(ITQ0?2k%w62{qAlZqhu9|~BVqly| zB?XrhDR4u$;ucS0#PS{m1#v9z!c`-uSp>yC-lUSHW%@@4O@)iIVs77h)`GXayv6@O zIy`%nz@n!H3K*0m4CZv-@XynbtgP&yA zk1DoPeSNQdQe8~qP#}OOL0HcN$mJ6dAdC?R+%>ec0F2BD8X0enp1O1$KZ-a#tgWq6 zU0hlH*K7L1jt#FMJ$~y(`A_>>j=oHr*hg)6MLegtE&pWKpy_;i$5Es3DyI) z!|&Rb7d6@#ui(Xs=s~O)@V2OoywUplv1}8{+*x?u2{D1oZUch=xeJ821s#Z&$*X_& zk?j{V6wuHQ{o$=j!7rp~#B(M*aI)Vz4`V2RT#_;53J=^E4jhVPw4h$o%6>$GAQ~zp zpHAy$=)Y=gT!+JAgvpnDOo6XM59S`?2{(m)Zj@(AiC66d3zUf~Q;SwrWhGt>8=#5^ zm}?O^^)rO6N59Yp5P2IAIn+>`5-$n<7Ak;Rd>kJ#b2E^ zAStSEax0SukLyH*H02Kng`v8_a_Rz_d`$QueTc^@5LQU7-J*G}3dcJYjLiUhJ~Ye6VxU!I**fw-aE)&(BY6_iogF8I_QK&8)4du@EF= zvkRyf8BcWS&-Smz_@OgjpG>*oS>-wQE0Kc_WW$o6JavQj@=W_bUI6$LUxIdj`0!zj zgjEnK0kTVr2;=B?PQxcjbqO#z4#0~fNZ2uuN`t{WpED#F-a|h!;a+Qy0T9Dc3h~JW zx+3XsBGoj40C^3qt*y!WcM-(p1Rxy2^aysh06=g%Kj4)zYC`a-*YJ?Xde$ZWL%asj zF24*YO*`4y*-7b;Y7i8;^Ar~asc6u@LJ5EUOQb^b4oLe}53|y?4qRxWbi>|qZE5qD zWSG^+4F+vsROVSU%9&toX=y0AkL3D;syT^(_%699>*|P}r%3J_dP9Xr>)U?!QD?og8k_ z`s^n{IzaUVVl5F|@Bk?&z}>0lnv_i~_VR)mHZd`=eV@m@cj=D{Snu3%5IVD?Xj@d4yAq9!?6~)MsWd=>MycLv{}|$?r2eWaQIfu@ucxKCPKr~d<7g&dU2*~~ zpPm#H*rDnVc*euWw+ccyYnR&8Lw$XHvdfb^e&~k`3Chj2;4NT(xfvbpPs(Y~I3OJg z3ku3{Vkbbm5Q_mJX(B#q!iNmrH#{Kq?%+`@O-2e8XXzA3U>f(DoWpU*`!OqIKcRkb|zD_mg(L#OpVB9 z)`FJ{*UQY-mQ?wp)31B6OqWyEc@^TK7*Sc2r;IOSxDiPf_;^Gu`TF&%ioosDz~?Yo zR6-sU$J8gngMpzgi!_~ zzmn?YQ`h~CcXnTwWVE}36pF%ixkT^`-1&TVg-uiZE0hQBSp(9#c+p>bN;cphU5$>8 z28oa4ChC@YABSWQD36x!x!p?TspBTDL% zzj%;4FBX5(5_S-AQOan$IElDmyFf`%SBGs`&ancF6oD!$K>uQjQQwdL3KBEHsi@e5 zhmQ5WPy|d`mV<<*=y6V;eg?#)ppkmOq&M~!j`tI#?u&HOIcoCo@}_CicMd068ID6H5KZP=dSGICnO{!@U5zN5WMBxzLNd4yPZpkYzqpf z0$qMYW?!s?m5Pn75FsT<9)T|V{o;L`9UcS$!~%q%=hUAyx}Um^UHe-D z9L1)bTeoh3MG{IrlG8snMp%7wycvjtMWcKVjM1Rz_WffBs@EUi-C8{m%AHF%f&TE7 zsF8YC^78Vw9Gjvca{xm*Wmh04lOTxeKw?v&hWe9d&v?1HDMy-0f1r>BnsE#l!9I#TeX%S z@h}h*IlFlGe=)3hzIla(J`oWcposZGK_hc`U^3|5p_mJqip>^T_onSPjqt!xdshQ65hEZdU}e`^NA9+tCgLlcR-_zV ze&A4ZiNZ=kCb(j84616;obn^2EB-h+#z+`dc*`mR;q=6SC1wBq%3tW4RbtmJxGc>; zP{>^$<-k)-jmGYi*T_nFkg+hOmH~4hUcz;>?LXQz&AnD^aaM5m*_-kD%rN$! z;_;gTwGy@i9uPm^|G*}pd{h>Cnc5sJ9O)xS87=t4_=#oH;`lTe?R6E*zkSaWMqu=f z!s!Es#rDU(et5=)H%A~K0|UcWxxlG_zr^7n>h&17qatAU0WGGEqi?wHpL&tFDOe+G z0X_;sZ+`n&7K~famln2{DM95N=oWeq4%vruSjh+ohf-b=Qjko5sZcbX3Q5 zZffu$k|z>g#FOQ(WXq{|nN!-KXCE@WhtH0GPW%pX;(1VX5ON0A8Lyn?=DNCTN-6sw z4vFLXx_;~70G~$8r>($zup^7+9fxKnbL+rt|G&?C2nf=MM8TGZzO!s> zzJpIG5Ij|oPU;0fvTd9)jufXZPEg?m6UGw6JCNOe42=vFJ^9p;p~$zcpEZ3lPRTW@?^`G}|-14{9fIih=@R5*T@4x*c%Rr(K0hXYC zv(Ydx8qXxc%j<)Dbr>$rYX>sQAz1eQW>*j8d<6o8l#BQhr}IKppd%4V3&jMPszu-n z8m^+jqNX4wkltWUHU!6n2>&+AWhsYH1P(3up+WV1`b#nk=J12B4!z&wO}2d zb>fnem8q)11R2`D&!a^3IM_R!5d#h!B!r+sa#xKz_c`zsvXX|*Ny%v zQ%Rsg7#JC^;;r;yu$n478f38e|GWoZ@*Y+to6h&cSOgE}^`$@W5z2^gi~t|A`wTIt zJ5GN-j4qlNKi7ZQC}|5Jbh{H+2Eu7TPS>N6=^U6 z^^Xw8Eh?(x%CwdMOw{=nAh}WvM%P){*!=vXEjL1dI+2Gx&%!GJ>{1P`fD}Q%qA&{m zEj_dx9|Xz8NJ&BLilE!c^6cC{F=)Mjz=WNBY`}uANmYqH6qo|RYuTk&pm=z(wD?Rd zRMqeV2`xy$W;g+*FZHVtx(0Ap2z&rb4ERVx@Hf_NU&FT>j63(7F@cx3&tEM3+61wf z%+3L9T@BaYA8vy=c~v8$p<*AocvYOz`$HUcZEiwu%ZIld3i$e*TBrKeBrl98giA zK=E}Aqi0QF{6b{u+VvtD9dLNmq=f+H%PZ(yd5yX8grGpjT55|0lU*CUjl}K-6GaL@ z2x=oC%v!ku`zCIu$HW=&FIeCT#aRqxGd#h;O^lg{^?zd;h`?d6TqNU?K!WI*%u&br z3WpmIc^#hWeZY@dM{>wNKne`f;Z|Vbc@B!oYQS!f@%Y#n9IlNT)5DRRh36#12Nx2g_o|vIFpyK+;7r zjm;F18HzGeYgHx49#WElixBgev_yEcw6Y3pN;MyXM+N-&Ab0_C+<`MH-n`LurEb|p z*dtn6S}<+FI^3yDuUlK0h(irXfp}V1uU<_iIsDHXSVM@dY)Avjx;aNg(Cosz@70@r z%z*SKh7b5v!7Eij5=*(AQXyb}_Ur_T$DSA7r*>2ewDN(HBFrp_M+#oWqnw^~2sC0? zzat|rU(wij&{gLyx{zexpIBzqvF2E1WX)k@E@U0(`TYop>L*Tc66ZOQnfG2YcI7Jb z0XKq%L=H$nB!!aGj~DUh&qb3ORb%AUt1z!vAeo#i%6CLSBD^xP#C80#OS$P94ptRz z2Quvso0U0nC9#;{f~rk8eNbQ^31DOnf931fQFlTF=jP@}{y||!4e^2m9QT5dDIB_L zBEg{^1f|gM7qy#rY2J+_9~7^mT_&o(b8-C$Vf5H2S`2vQWF&YbgjJMGsZ84Z5k$-Z zgJs)(j|C1K{(lXeqeVo>4+vu4xbbflR*)D<$vGz(6MhrC9dFne*MpvFJ*|vzMo9rQ zZG4H7=OCf0F$XdPz1QpzR+>_j0Gq+PUqk){=0jvY-Fs=b7BIb> z`%?mddR?2}2kY4()fMTgKW##sKw_-IYkz}Vfri7Pbqxt$i4En*iUtiJ$D z9BwMI814H4D_YViJHntah_FYhM099^La2^g9qEh_E;1-BfM$vC2q^|w$DA}2MAYU% zqH)L*-4DkSf{Pq%7Aom$QKw>`5hv)xHHetxpb>iSUk}#ehUMcOa3Dho)=%&sD6U!_ zpF4$BNah%3hd`CX2gI zM~`ALIw8%IVFDa&&ta3MWxjPFL-qK206ol%^^lR3C5uZ5O005}8#=r)1&D%ZqcCcL zKnRvT&_N*av)A@{=K+s(uGm@)~_Ky|aGXadb#l#o^6|#&Ix9e=XU21meDaoyR`<5A2 zDc})0$N_MDi^^$c?dkM%|JEZbdF~@8j*uEAjzFtLS2ed>?%Rm^VPJ}#bWubbA$2n9 z4pU1@zHA*u1&+Osii=rKC~b>HDTFUg05a;gmB>La2@1o)G5F(t-APYErz#?9F3-AY2cfyaovvenFb{LJB6Xv`A z7B72HtAH}-`8vaNNVMw^02J&S%NPkSf)r?&Vm4Z;e+HqEcqd4a060mp53jJ};mKeC z>SXXj<}0T`C54$fI5bi2^b`Q

s_9KJ`EMVu2Mve?Q`@Bdjyg^ySc5dS@Y+ej0tY}3xZHfcci+=qNw4bc^-D;gK4FQR&azFzjexSM&ZY3ZA~C zk@4qq;@81HPjv}yM;akv48=FOWDs515)AJ{eP>a+m+e0M6Y&b(E%bora(_(8*-4 z2;ejUY-lB6n`}IbHg>*0Noe8ADOl{4S(FNAW(e&yF1KT$W78R;an-4D(n<)2Fvc<dpmndsv3P3y_} z8A`=>3-t6lC&h$S915VYlO_%FtEBF%=q{@|W+b;*1urSN1f6l2LygVN-@}8kC74vn zQU@Xx?j3nhhoboXvkN;>;uy&5JUom!e=v?U;jt2!1tBaMpdIuiG5iz_vIxSNuaR)2 z7}X%0c1D;*i&G&*nh~n2)rWoO3=9pK;UCkN_p2F%JF;y-He-s5g{2CwYk7PQkR?!= z#zHKytFniv!5Dx7lY8sdE0`t}4SspD(uRD0cyBp{M@Go2pgtwBR$49$zw32$J~S4Z1@@P$l~SD%k0$0dPA@T(a<|=uyM3 z-xxx+3g6wVx`$e5OHdC#_~(dPzF}oAbLUm#4cs>~QGbe9|~0qH+Wl zPItHjCVu_0hJW>RHKQHMnNW=O2_nBB^W|(FiJki1t5~o41s@Z)aHMuj3#-!2##%GT z_#6K8JxX`=Gtf2G2dqyTtq@KPp1GZU>NZ{njQKY7=vMS_QNup}vS3t1LgE&v6@#a) zc2K#pouB^sf>^D;m$~`tt4TAOh+5xTOQqa*g`U%=0pL`0br~pN)7zick{-o~9o1@R zAe@+*8bTHP_?TPxOr)URHRwsf@I+mQqBb}@O!&sPp|{UM*C{B?BjphuL4g_1H1c%| z>aPipz~ih2 zG;q3bVI(8k#2oK6rqQ~{;=f796nGL!0V@V^LMxh^!%!zUgHs?`1y2cIyur~6B?=hh zCU8{y?CtL#EX4byVBqAmZ(E?55X6<^6%q;rZ+duKkY`YN<4;( zWZQ9{!}#p$o$cr4Fna#7l+Nu-P&kM?6;!_kOz+`cPRp9tyv?z?CH{y&jB`Mms6tkE7JE>$9^nLr4v;J1@$uTg)RT?n zzrcZ8mAq-Rm2AyAv}F^&el>2k?b~cd+H}}iwWCHPEoNkLC|pj4@}YvJ z+WZ?x%`cZgA5mM03cwwshGo&D28w?xo|gCG+-g_}iqeAiWNU=;fT6#E335Mb1(N!{ ze9?lDtSetdY7;7JIR1vA+n-iv3^NsDProSWd>ao0HX?1@h4xS$-Tg{2=ZJsb#2r_Kye5q5fZm zJjW3w-)OxHCH%{Z3Lk*goSUNF5w-q2@_X)G1ogTWmpw%KBSjz9B-J^7&U<#;GFznN58lEODt>}Sd($w+TDx}M+fT5JhY#`o{Tm3^CgDhVdXyPN-;Ek+ejf-X-|>z8Q~@t~AQ zU|=8_UJn=!<-FPTPKVEdNWoWNLCIMFK`t9FQ%3GHni1l@83Z%{xW!_Vu0M+VXq^4K zc$Mh1DF^y%!mmWR-MbZQ?w`nR8zUq?aA}cK>Q}%!N!(Q>Xs@ym$GV&*BO~wngGtN6 z?I@k@IF3>BvB)-z8#eq@3EQT6=LW#KX#G1aYM-l+pYdT2n$^8+L!$+;`Nti)&gKyYT?-7NIf4shifEi?7YNTq777vA zfne?aOf9XpZ9~bHZP=B7%O!F8t>Ej>&Gq=dljmC`cD&0yRgIbG2p8m};%hSR!`UB3 z-;0+mQ%ux;qf5~72OE0Am48cqVPP6(lYz(HcX`XL zdd*i_LsIZ&rNeK3x|%_WSq#ajAC)p0xD2M95FS&WWnKCIW=Oq#nwZYWJ;|Y}M+^#Z zIbNLY_bs3tg0M>V$JYL!>5UaxY&!GESOhX;D!w!nZ`hXB6!8wr!g^`} zW5o%yzo4=s4y>M@9&*m`h`fiYPvJn|??)|Q>GQ~=9^kyNv={OKA~9LCjQ4JyW=Q1| zxn9++=Ii_&bXuTTHV0XFcLc-!jBwEJ^bb`$+5$~k9k0sC*|{#ffoEw9!C2r>A~C9w zMIg&@(&Zbf2h@#4X64oIa51&D<{-D_Ic@AF&gyj=CAT6?e(?CCIl{11*)0=123fCP_nCQoKZATE zMjqhj>dww%<1#!U@Q1;{&PCc+F;uY2so=vE%9UKk?=#y^lX>bwdcR!U+^kXc15UMp zj~8Z(2x>Tt3x+y+0s)v<50UvaA)%sIsoweC5D1hxFgtLz6wmn%_6UoLhJvB8Hdbjp zU4)*A05I1Q=w2z==q(kDVX+8SIKUn!)FRf8fBi~^B11Y!g}89{aW1*G11VUg2{sP~ zh-+~D^PPJBi9t3C(F^*;2-7R-lQYz+R^M zmHlRR1YN@*HxO+FYmQp(5D*XmRn`n=?kxOh6VubTdyfyT#7%sKgz*>nu>@+c(<7-SWhBj0p#^kE~)oQQ}O#IAE65Fii!fr%aIbR~i3g8`E8&vPhvN`eR@b1zR< z*D~Uqj?obBFZ4>;UXfXmV+DM8+^~8?!n|rOxv@Po(x&9;Qwf9*n9dqdgS-Y{R)%kX zw5whKC$QXmzH4rOWKRkvfhAu0%69T~KXw2{UT>Q{bYu35rB($RlL{@xR zUmuJxoX(X+;w8#rbu9noN_kxkn+P+f<* zNKh5%Su$l4S0-n(=AJZkC?x<~Tf4U~h0Ei+#7b><4nYM3e~L)1|8<6YImZh5VF|E? zib@6t;Dw_Mdi!6g60kz4&L20}ADciCS!7V{k>Rx<#7zN`aCrod&lrIG1MZB$vVz6~ z+{o(H2n;xMotEB8djzqs4fi2qaWJIjBxzNJ_Fa#U^}sEXb8uil2_M*iHh@1u=#a>d z%S^bJq#}epHg4vl*P(G4k3`I*0^$X;eFw!T6QC&)o*g(iAbfQ_W)!(uZ&zGxu^j@E z0Q?9A-n$!batRo(s;Noz!&#w-W@x^e`}V!$Wm62!!fC{BPRBt7BE&Tg4uBwY2#2xl z1M8+u^}xwneskcZ5mPEMyejmYr*`L*_J~MJOCvkJ#z@_ATp+BJ6bIx2UP0SjNU9)8 zSaejq#J^2->+uH_w|qiuz!9UOx@Vp$@Dp?)>1`ns8x$lbWC=y3s0e53#N;H8j7$uY zV0NVBObie(VW9EG$-Fy)oZf=6gVyeqX|UcvRE*3Lh5l6wJ>hC_aBzr0(6waTe8BGh zzP>AyHUy zuh&|l{hXlHpJ-aYw^@BpA3!*~NFjJc61{AOSh+g=R>>D@n{Zk6W%Ziu(Ch-z7^;vg ze%rxunYn96atDre z>61<*-vpg%o1{yxk=(M66=v40{rMQ(KQEp8X}J?syCxB!hY|2I;oVz*7Ua}Z*IrtT z_9uHyz>u1Q9+K!cw3H7~^TCxOFwL^|Rw;Z30I&idoU#RJz;g5<0v{0{t3czW3iN<{ zcpdRL0R#-5IGO=uMIjPJ5gWo4Y~#rEdQgI$P@8^*jZ<6sht9(Rd|vMY#BwJ$wP&$@lj5mfRT9I2m+p1mD93 z?KP1?2K;S5wZJ;+zu5VS6|Vq94^n5MP&(PXK)$teK&_>Dx$j!ox)e#UM&@aS#SX8M zbQagyx%h*dmVoh#EVEktzO;y_l}a&>zn}z082*U0dCYpa7|5?=hzzHKXCxrS!1wPv zUp!-!!Y=VjoTVm`lfM==qi50EPw`Z6&pGfqa2thZXA1&;(b-CF6w(biLBvX&8!FH; zMQLleRpbDjtneByV%RKc8zEzbap3O#Pth|Mnb1W^<|!xQDec8%K9HuB=w56*4B=PmOrRW~$~d~0v|c3Qr))F}A)u*biN(DKlU zIjGj4rXWbeZ{hs(EOX)7!rGW`QV*KwL!>UnD%*^#*|^SFe)S_c`7bUtLLa0M{)_B$ z+9vQ8enJndKf|zzhL$!BSDAUcp~kpixwZC{6+zP?pClhE3R*p*vvqyBP+;n;Pe+lM z7!v!lJ1m*+*tbI;bjbJ#oWCkd3B6R6wPZOI;i$&GZ>vm0WDP-o&|Ce3#vntGhRIdL z#X0LqNwd=WmRLl<+O+8f=G)zmlLK;g(9k&K?jDhtsb|%(%~ucJ@bv9WJ1aADC4sL` zKiEs{!qhoX9>`u9i2K`t><|cj0N+WWr?@Z`(dDF4tR?#{Qz0vJfh)4sLn_C`@$=m7 zhd3F841;3VhGdH9?HuF(!r`AyJk01lM2cp&_TWo9IdvJfFRfKYFdHi zKflXuhOv-LL+@(&w{{C}uGxM7nPV7;E*AY|#Ff(67=qLQNN#hu0Oqzf+#rktBBNuR zFK*NTT?EJW5UMzw#G%pWz7)i=|L$EhLh4Txn&3?Kyu?F74;73M`(cY~5B;g4{afXh zdDvfX^x8s&ik9K=Z8E^s}=19sOf{US+ip!|62sZO9C zNB2Z4I`ZLD(8BnnB##%?5tPd2!hY#8H-4|e$GP!aMca=L|A(%2f<0nTeA9Hy4NvBX zwcFaLnmV=8T2fk$(Uk3o7RfXorunnSNpkwLhvP_{;^^0eH?lGoBSveys(IeaKTB>O zPMUOaK!28`hqM=xDa=VVlTf@ygCEYSo_7d{8d ze12#&u*YXjGXZ1B12)v;vp#%1+N%@~c>Hv)xOJ-U?} zFGs!W&)LjV(33>JF4WdZP2K6MP|(VU?+uu}PUL6t(KBxwY084soq;UHPUq)uGLwGM z0jndpt12Ynq9<-nfEGfGNleSW(~yleZq6EODzVmY&R?JC(w1<6<;zmZ?V{wEPdt=K z-oIH8_nAdLm*140pZIn2-Q8i64fV3Jlnu3ZO)YL6E``4{Z1nO-p$r&=xV9eD&TC}B zv5p6EUHO$3+x64e08v|j)70PFaQzYH`|o8gd5sw$cJK32y2P>kL<`HGNN5ITXa%PI z=)H7__z+Pcybb05=U@k1R625CEw_qjF*vHdvwbT89;(o`SVek-ey8VRltUz_>H;X2 zhy{^p^Y;MfA;$wHY1jGlRC9!=VVrRoSylO|K~Fxk=4F9ZJz;Bs2ad`gh@#VU;_E5X zF>g4?WWl5Plr2y%X^qi=YqpO}kLYq0y0<*Ke4cu?)K@2ZPU(QEo)||2{`*EiWkZs_ zq~!6aFbFzd6N2@#-@C|^M5gLaOvf|kjpoWB z!L`^*hLw7jBH#k2<5m}7Z92NQZVmt9SC;ra`;1SZM>UDThg+QW63#g;SckqD%{rsR z)g8g?f}bL(T0ZMCZwP9sjQx3Zv?r6Y!sJ|-Pg%J9Qi66T1+&XjUj*f^n`tdhWwX;a ziQ;JY>1MNsUJoABePZ$uYl1KBIY1geUJt!o#XSTH6DDfSQ z-8X}glJP#%=BMqw2KNl}wI6qS_pzTjda&ZznN9WU4&0g+=}Ah>&M(ceH0;WYv`w8x!T{C>7#$UB<_A;?&0;jVVmfwlDbw!fq}LM>q0|2-gRVd z>KNbUbtzopaEoU+MaZQ)GrQzYjeJ#YS9wLO7i7R!o>>KvuRv}QDB$c+%S#R$G6?SB zrJ?T%zGv-#BDMsb7{q2gcuTav;jEd^K#L$?SPa+(va}fD$gu*;wJ5_3>j%e;CsM=6gj>_xE`K23~^X4*m3*4CPPGP?_03Y}R)~fi+`Gu*1 z9hxj*hjLnesD()#niA(2Kbpi4f`A_r$EMrB58**aG(+%2YY0z9kKl;{{fFCm<>ciH zv6&QJ0Zr5=on>Cqz+Xq?k0hdolY#?iol#T1@dH*!S1mEGG{l4rt~y|VyYasJ=BaXUm`~`J6wZHCVB$ne%#GTp^{uvVPCtryaJ}q?k*DUT6Vewm)Y_fj-iwkrf5>Ch zBQmNpTLAx+T@{y}vc|>@8q=jCKv8Cm=)bJ$%ApzEXF!wU=IC2C1@+g+CAIVY8 zYO^v{Gi1KLe(&rRr1}2g;psOE*31q!D-RE>R3ExVBzGf-}1w3LRO8lv+fYV)X^yns>YvVi_DA6NV+!G-&@?(GFfLlW}j;d9hwmL zP!D0-UT9U(Z0F!{t68fqvLt;>sI+D(5YZTbOoO=TKJrHF%SMCVo$ z%pXKP1xXp%yYmz29!-YuLOMlZs3XjLO8e<89{s}H_Lz|92Ut8=PP;REvnqDb#-Y~* z@GZl8X^{|H&~XO7e93VW2Eh4C@)>ek*7QzPnu?JwchZ9cowOS9(YE(FXlkxW7;anP zHa`i46NQ}Y)AihB?JJfD)d9}f^*qT3a-&8UbPXO26wC)*dK4M~&o%8U zw|)Cix=+97tmMY=1tpdaJJDmz(TRpf4Av*9bWNtE3i5q?riy=^`tVQik(@MLP3fSh z2YyuJKMX>y6K;Me(S}@kba?u27 z6yz~k8I6x6@WFR$S_|<&*tXnX`;)&+{r2QGiZ{0BqwKD%7hPq*+;GS!uTdn?Q{uY$ z>pw5EURi4Ji+|$RoZ;D@rYRzEdYseIS>#|!s+E(oP>4%Qfy~p$0&P_m_<3%_+L67P zH%ZLrmaWJ>KFZperTAjz)t1kb6>|noe)}cUJkk*Ce@IJnhX2F(-Qfsd|HtYpHwx4* z$$a!aHR#LCHJJqnS^z1TOdV*#*LaV)OT^evzNI&FAcQ;NxJ8*YdFL4fp#bp<)0}oBg>M-4d zm^VU0Lr+)Np{cadefaiKGBewy^x}KizlfW8%2R=!z93uO@&!6*P}>lV1k#-!IkdRm z#7Ra7Sy-t)4{MaFPffe@l(?<9G@$V2vp%ig0sajiCs%AculFqQNp?=9`blNkvJE4t z&3dV~R#(-%Q#zCNai$j~Mm}_UvMiT~;NVdX*WY>vT_y-8*vdT#QFG#>2-7z|m+5k$ z^4ybrJd;w7(*^^cZmNGEFD~4j7dAuvC`*GoOE_yq(0t@-{yld>Jej`vMzCMnz)Yno zp4QUUKV*D|XWI_FYpoS5`xoDgN82iH zuzu9)eDzCWPEIhe<5o6x>*4CJ`wZA6uiw9}Vsl1FZ-@;t10isU4gU%%J9I3>%Y`o> zfq|Py14sO=Cnez!+g_QxNDcK3#%DUkhO;G7_k6N{S-St~Tg`yln6>>}+?D2PDSY&A zGX!@#rtFz%j>TjqQ#dB?W;CvboiPQaY{Xi~sc5Z7EE)!0#VpJ>tlke!sOG+FgLM`K zU<05es&?A8-9L`NnhG4x#D;=G5JG_ainu7_kW% zT===$xh4MEXH&S@WoLUu^wbge19X8}6}j+nu+L-!8`1mV zDg)gRI}0*wEh1OMp}qMFO)S^F7}-kBZwv61exmp z%i;!DdW4P@i6ikI4xC2APyxp4!6l@Q+XUs#cf0K5hQeBn@&qySw1-TaoMKTo>M}nv z-mDW8c$!5^?}7PiRn>{Ftx?h}h2fPkoA`QzhdMHNlUw?Xp2&z=C01v+vd~0lUr~!& z@^(ejkb3Srt%?5d8>XR;S?Meu(DoY~kkXfE=w{|xH0IbJNI7hBXZ}%#ggK*@xZZL0 zxoMNde(>H<_K9(qVy3~fBT=^DwU4)p!xCdTeWK~NABV<%cSpx;kujMxm=NQ&%i{g0 z*1R|MeT7KS;Jyt(8wxCGG4Rymv!OMJpc`tu*fQMLN4A*Sg0sWxK%)iqTa>E%PL1~h zWudPFkGmQ8jMlM}Cxar(FLD6D`hd-rs>I+%H3S`P#s8e+Qup{qYGQ(gy!4n@vU4EEcD z;ZXasB4}x$--@CmoNPov)Uy3pDhulC6NcpOORN3<;^4pj3Kh3o?V3t!QkY=%AeI)` zbL(816{?Y}mZ^n&uH&Ex3F!}x(2`Kq#Ys?-^&mf!;l3a`A26%-nE6w>@T*%Y!Ou#H6OWi0Gb@aax?5BUF=0)q}vyC%hYnjE&gk)?_+^6#A=?K)~$<@E2RmoU+ zQt45??VbYz-&!_bSo%g$ss8bmy;y3|&i5}m4#oz#vnjmz-dn!Kr&mRfIq1pL)+c7l zaO@Za`$6)qYbF+V}0rkwRUNmR0r zgQ_E5QLSQLIinT0-eh0$&7zw|M*JH`ERadanlU7U35?@(`8{O^HcU;_w_0_=I6rg2(g|f_y|iti}ic?POB z=u*cpah8zpAe5J*2qv+R0a>WaifR{`s~SEm=`cF=Z{@$Ff4Wmws4rNDrEvHsgSY&R zC)rDahNXLkdyX3*oy2`&hb9SH2rb`NU_>Ent>V5Z?ratKIQX$KSj9hS8-S7R`LRs5 zOcAc29@YFPMud$g*}4Pg{GA3HxHxIpvW(`8nR9e$tIM|;>cn0m8>7GhfV({`A5=$Y z8d|8c`v!HD#%qIUnqMB8`<`0t6Tjlj_T)_2$<@Y3&v3UK<`)@eq+w7Jeik^yuW8$| zNAd$hvSaL@pJj^jg8aLrbrQ2?g1!s(CbNn<3=4+vJ`hwr8I;;Mvx__F2B^T^-XutX zlhE8I5Df2a7Fx~mGG1TmM%k&Zrm52HBS*qFNIbo=Z^cYlNu*LLt?dJYknl10xj@Jt z$O)OqgOX>vB5{hC`|Ju!j>2p|hqu3$hNc`Nz{h1)Xw8XvSB==6QRCf(j~3lfeehQOzrvDYIa#cOeDi$%n>_L2KqgT}<2Rz2zI=zl7Z@Qx z&5-4&5J^A1zf7ndbelMTolt#Mh;ej;(#9a3hMe5z_uM$c*Or+ygVT2(Nw{FI&rrtZ z6u8O8E$vXL&B-l-!H2d)>c7?wc>XHGN6S&@=bm8&lUJ`g+pRf>twTv!85+|ksE80I zDy-+5c7V+L=11isJw;dRq-QJHHE$qqRba-Ik*>qrUfny~QKhV6vZnH`hGx*w$z-D{ zx%aX|w~i^x;Jvfd4eZyG{hY5Y z1>SsyRNxr#lMZ?f#JM%KSoJmMosEx7g?II<1H^$Ei4q@#OuHvqHR| z&LjKr01u#ri?lWa1MF0dI`O)#Edu2NnFA%X<;o2XSX_#DCsN)w<}w`Ue6Kqst?hri4O<_FRTE8sJ zyRM@Xc;!ynpx1HBclxsI`apX#g;3_QVfI}nd7LhpOTyL3oHqApdBc03R2o0r;KN9z zdcePP>+mjipR4V@yZq~Y4e|s=(wWzLqnnp34Fn5;3V0oJy^3<%d9g&w3L&wRMUlC~ z@!Kbvw>37m1zAa?$}-(xd*xXE+gO~5S*U-=3Vs68WQy@4(J)y`V3%a8~tl(tf^Yo z`ee~wmk7tg4}=E&5@#!bPGz(#5~H|nXE~Zy0dOD{L|V*~^c|G?1NnLA{a%$KHxdWwbYmlN24q0 z7t1Uj`a8-x3UPZ~7Lfa6e|o=oF0jVM#U#snmB(rQ1%!iZ8!udmy#B!B%a?7FsgV{9 zt3Gwl(5}logB)5ObxZsw+q>8bD~DS*%oh$>?$jFB?xzlH=$H8NBsB5b%tlQ;X0(R9 z!YIOHaI=HfIIZqUZLL-E##QK`(2jwt`cZqLRW9EwzQInL>8MrP;ZCD%=KQTG4G4J- zgEmPwF%b~JGxN&H8IK#4*FnC(Ci6THsu1feCsS%R1A?u-x#WFno3G#-)LO`2fZBoR ziX;QWi+KOF6!S#iS~i>}qd?b(D;r}X8c{Y8jTBK3G*&T@VK{dAA+EzYe~WjXH1CiA zNl1~&+0;JR8Al+@5Dzz+y2zCx_Goe|N8eV|&|W>U&N#R>TV1^VaAQ)4lD_sTwqGJ! z7a_9!LNlNpToBb@E7&D%b+5*;JHBw0iOw55{zkwkYb9G=v(J;A8IE^2z5VkB_llf7ZxmV`6 zocFR&Y1K(u_)HfKdz@hu?~y>gCIsU#Mg|1KE7MAR8%cW~xbaaEn=Yo|k=TY8ARMuN z9kq{kD)T)#AXH-2!8FWqK_YrXcf?3ZF?ecIK?R`6fpN=DwmpphToo11Wip79beAKQ z!LvmRjLDBFTF{e=EQVvi4d_2G-i^tmw{T5R+@pcMHoux}t{16@3{HTpur6!Z?~fI% z!lf|wfOHb<-f~<#?g{G@8zb9_{d&Sn!8VzK)(w7^4_AqfIK1bG``U)pqsYGn@N2^d zXJ63Vv-MX;yJSWMd;NVr*&C`GX-qYOxWCR?E4elEe(N|~#A`JMiye9r4bUN0lxDd_ zb$#a2OGhT{6gz&2+K9tLQbJaKeD!=8Z!M1GI^4hbdF$iY>ci&ZrnkPYma?HX7ng|M z!8uS2BYAwP;Ggf_OBVRJ#JCL0+1<@!wSt-*E@NxOP8KsWwCVV4NPT(WxXO)HgR)}O z$1|_gsjix&gCQGsF+sSr;L@%K!3lJj<`Zz8Hf7Fe;}W;JmZcV;2HX^0FbXP7ky@ zOrgYsgJxY|9 zHkZ|C>B}`x2Bjt^Gq^biH_`;`ESq8?rW8B~GNn1?w9SnIS?LGYf{gI zQ>ju?Q7M~C9u2+EGxc8W#_t~4u`!Tr6mw}8v)P5KL4ClAhB^j9qLoS^LD%YZKCfQ9mjsq@xe1_)yF@Io;0r0(05~b9+P7R$xM;5UG6YRXS z@ZB3gJj@Kw5(tY|{kgv%*N1)fLo7mEpCnbe{|s51JH$V({f2h5dNg~GLEUKI2|4)7 z?u@v!lFSPmQE};=#^=JR0tY72FFtL zryUuU+f+=_(?z(ckB6R>{k~^6mC->N^(Ut^IiPsJ(r%0i_0>77dEeMNJ{t5nJVyal0@m{J%xQ1;N z4QL1cCo}8DE*mR1p%wThXp2I`FElKX;e$fQ3evms?dzbgAZ4R@-~`0ff`tjV@z4XI z3Z~S%Sh2X~1zMPt0XPWgMx#wmms6z$(3B}67n#5EK+5aXy^l{_EA@NyEh%$E1ZjM^ zdbOQ<&c=QH4xPpt>TD?}Y|xEemPy4-jLtWgLLXM!OC-lw9l7N$7i9k0UgOgX?{|zI z+!qwo!BZwZ&f?mh-=XRMIFGq_@_2|Uvysp?m7gM7f%^jw%j+dRiddtw;p_ul&2cel zy(#K0>lfL`z~j5#=aef*$k#7qgf26;YH@b z!zF=(*$5ue8)z9qHCFzLHLP|>SB1@;Uy&_WW2qX>@V4eD?;HV6EI$xnj(~8lIA^lF#S*! z4`P2NJZFgy!Zvve#0UJGuWeGjzdGzXgUimv@a`hJBmTSCDgsJ3M|^Wzz1piTYWsoP zlNmz#?}fUZhxvn29e0oJG;w#@YMgK>^!s;IzeKEs_>7&XaCEi1TuhSH6yLN~p*S#R z&6h_NoWha{wG$WnMm^}LEk2(eu4B%6+U@d{_JCr-`;5F@5AGPzScN~fn3bM&{(OmR zcTcvV=ug_+>^JyB6Q4KqsyDq!HCtz5Kakje)^4-HrR&KC(NCCIYtKCR+*a(7Q2qN^ zjtI9r5>kAf~ z)HDD7Jk9r1nD&J@jOAz95t;Iu_O_7mBMrYTY#Ui$wOH85dQ9>dKk#ESajYoRgebDk z%q)C#nwp2FE&BDD_WK7asCQFhYL!J>)D+uFA(Q)p7t-3227_46r&z4c73jJ!^gy0Z zp!ZbY@y-XF=T9H?vh}vxBLBye&ueD$!Lr=DS*zOCPy_)bW%<+%=no}2l zO(`C=@4g(+eSu5icINTu4rbA>f8Ne(VnX8k$4l&+q{au^kKSp!oAxeEQLtMuc~oRW z#v@Y!~JN5dx?l-T-9E$mXROZmPSup@PfhM_G03WccT?ak$=HW@W z^{ozyUy)^QXnFs8&mA7=ghMA!208AOf~WP6%igoY?G$$9WsrO%3MUAu2Ig-w5czAvGxJ<&FaM?O80 z;ro?-`q8?p#lrf&&1InKw9&sudJ>8<_4OhTVVPjh6>;#o~3W1|0EXXeFgd& zYq%3ziDMfsrC3=Peux^D@ZwTEbzc)TMrId$f+3|o{IA4<(!6u=36J-0EF*+x+Y%x* z@Ri!Q%z!v(`JcF75)eM(;|rY33Q`%kN)_h0n(G$kCgb;bhg>(*e2p%a_6 z@JF?mkG-9L7_B*PlC2V6uJiV;Uf>osd;Y#|MOnwGJ&Dubq7}8G9jkCFDSH<+hZ4LZ zcO*;?EC#=GC^+A{mUW>h?D*sFR-VU$5FchQwL5$qZI7yBIk4;Wq|&WhKVQ3stz1g9 z8OS};Suhi`Zss1tCa1tN>hIEquG!@gH>F9L!0}bNdwJQF?^h}3oi{5_(>WiSwC2@? zK7ospzrC0?MBvt~NV+WUGkLpv*Tu>qSJk~`A75sRE9#~duU}1{n5^hr_i(orU2TtJ+0mFeZHh%8;A5|spl&d&ANXnOWK`?gCn4?Go3!^qSVUX zt4Vq1k8ef0U*=x7Ip++aBX6nj&m0##nH_E?dJT;@41Z22oo+fRe5`ml_Br*sO>c+Z z^c&35|M6Ygw6L04QyJ?9OROUy)x{I;}21yjj?Ni&W9Je;~IyE<;;F>O)@X<-?P&n>DEpBky;@vq|Px;$oYj8UTKZqO>|ilU@9Du3;~qX zq5W9uKmMnkS&srphuha3ny#svTHaTK|7kodr~uY1g(fFhD^`k(3Srr8`ABq*Fk;1*FrUySo&myQHN- zN(pI{7U^#I_dWBz|Mz{fSTpJ%3!dk`u3hIoPN-B73=I^#NO~><`@;Z$Nd-BU@#_5Z zUtE3y2aZ+DCX6pDZt3V+x1_Be%&Ruy%&hZ~PCU;a(R=cc?yuslG&TNXI3rWv;y#|{ z%PLhLJFGZ*YE;A=eK2e!8Q)A`Dg1@|Y&0&3Z-*mE5yx7GPe!uZ^$$^*$&Q?AAP!v% zR8MB$rv;=^Lqw6RWn3BIZ+{w4=g?=|UP8m2O87-he}Pcv!P8kMtf;-QNe$}dniz(5 z|K^kj{4V#ON8J|pI~BAxXM33H#1JHYm-B{$&3PB!#t8lQ;vjs6YNBsDRXBpo6C&?5 zRZ6Odw&j`}_bh+iq3KLct4bh#xu4frbxynVO`E9A_*NY*-)A1}00?f)z^L@=TxrZM6`$PhlcGRV%w|mnL zsU#&`>ouF2vwHL`fAO(8kYfo=a>)Lf&L_5-JdO$v2gyWH{r+c6T~GETw8fs^Lxr-n z=kO!cYyQl(*&KyUc4?2tn?;3ms=Ypc{-}efuw{JQZgG`n+^Gj|KY?ZCn!Bs#Gk14# z42;<2*Zbx%@kjfwPZ|X9-Z%S4MTyq(RaywjD-H0t@6CF5o=n|6Sp8OpJNda1H} z1(Q~%mdo>6?biH&bneRrtoP@&0u>>u`NG8msi+qr4}Z=zIGsLm>;G%%QlFje9jWJn zF*b62I4w0%%W9FD+X0VRxt44Hyq^1PJ}o+D9##^JJ-^PMlkONz11lgwzz6}= zzX?16Y!*Ld)+IDpe_d6|nV|DNa}hv|zZk-jL)A5G)fH4I718)=cj0C-HY%^JcWF5# zqsdY1_x?S9n#T^F&E4$`1w5mDTb>W#BQLu`&zF#rsWL5~YO8j)S3a*gwDYkBeuIj(A^OM~5j zH}ZCT)z+#>Wm$n`%UfozUSTU%yJW$rqXy^Ia<=ou3P$ z^HgL6m7m$NUOO-*&#rGaOx`S1?STOKef6$PJeS|6&i<$7nYy)QB7x=uY76D^7XbCZ z2%6I*<+@0j&T=vv#Caif|5-az$3u&c0qmt6IG?CFUn&I$a2~IONU}YQihpJh;3~Vu z_^@samjO+2?c>LE@>^&rpYbG=96M`iT=5_q#Z8vzo;5Z`N;yr)F@QFf#T^ zTakX9n7C?TVZVMDNvW@2lzT(ZX#e%;(80M~8vbhsTf?58qI}L$J7=LsuG2SG2TF|~DiTYnHzyP*^2T_*d+sya&{VgB&&~9B`=;d&%h~g{zbkDG8 zGhGPZH58s#&RZo#76{7LUGq$C1VEW`ufetj^s%vj_1H4Mx9Tb4xpEOATE( zxrhqe$W+BH(_`%WMS|k}g247~ko#~lMS$~y^kXkP*kVK$C}5`ndIV~ySeTouvUBhvIO zuAHu^i@1YT;XRN10ioHgMTFx4aOM`E_rRPuCWlEW;KrQ?LeR5-?Y3Cn=!eo73VQnb zk0LQq$Nd*Xh3|dnv~$_pgAS@JNKXl2zXm3vSwoI}eSNT0IuEmA9xJsR#61H+`@tfXA*{CA z`BCusK=BCu+7>7<-%MD`J;xe1!&K-AC$nQ)xcc1pMtoAtONW83?u`@%!;Ok zshs-{PSSh1()r&Sc6Pfc{$Jii^$BN>dGVEzr=ks`qEfcM%n7ebgPhq9geQoE3@i(F zrPfbf+QrsIBllJdCj>joMIxQEv>4zEj5+=eb`-o8gB3SXWw^XhHvfAZ%W945O>8PL ziE6dmptI-0Y>J{XV=d@M&|uqcQ?EJ_&3_H>o9E(ZO-k_-O=z;?By>t!=s%AP`kDHs z(FnfAt^%#bcum`k$Ja!w<~3fD3|T{22`Qu2B5cbkkI0G^G}iW*{jo?TR`sS`F8j;s zl=R=PWl6$hm>H-fg)N6YU3hLn=L2Xw&HepyRS#07n)wy7-)hdZwGIN;?IUfn+Qy9R z@4E5J*5ToJ%o(rqfX?8D+gMln2xICneLk)&H1Im5Hrn`zH2>jzNzKdahnr7AJwW*I zp~AqlPj9cKYT>xb+>wffBa5NJq4{C>*SH0fM_< ze`rXPuAJ_KwsKYPwfAm!kM4hv9=)yA=rc_^uq0Ayk4d)pQ%9~(>#jNbC}#4jO%p-8 zow%3h64V%8EAm(4&Gle>FH!J zQ1k(-1`zAep9%@zyZ+ygJhpSqAN050rTdkYmnVQN8KSO-M(q-;)|@n@OB;g`pgXLl zA^?Qt5zK4Xu5sHf_{&Y=ycVNhc>n0Xuc*CS?ibWX+ZL~@5X zdME^&yu~aIBNI}TmKwzev?<~D#v!Z7v91j{VP?ggJhmO@DC(G6T&Q8_ z)hZ2oPQv8;h5N~DzL7h>7X?b}(r4!p`n-i8hWIbvd+MG% zabf;@#%?}R);2Tq`B@S;yqk2DbhB;mE?i!)`ZjTprhB$FY6p29%~104#>MHLbN=ep zZmHcDzC*+kaNoxLiqNtg<1GQl&~7Eqj%r(v^{2$Trv30VS4tAgN5;hsaI(gkGAP7U zH;^tDElh9gvc6I$ogo$cfGL>TdWO0xy)Nx|Z0q0VBkqH%${#)d?PYk}z^n~kgqHf- zqrqP{)$cv=Pq|EO4ya+^;xOT^4)rTFTQDI?Ip#&#NYT2FO(gYwf%Ns3Rk~GAg8{l6 zv%2*8#=7+0EN2BK9utQ4xNW@KELGH6*yYhpD?y_Dwxdw^mDaBm-%I~Ev;B+JwUaGg zxdGj4LPvpxy*4}ab%LqwRol9@8)1x7{7wPHmnXhi#Nsa$jvjs@moUvE^?kvfw+iE_ zAt0LA+1n!{H(30$^HZ*(k9NLAwLH{C&ym(BkV)e(Wp2+y8MsvFyWJURHF16xm@=Q$ z$Lp}lGdt9E4Zw(>J~6^oKD(%a|DE!e?D^)^M0P9KA=`I0`Ym36*c@!)>Yi2Uu%&S8 z;!5%M$=1NJ)vRk{N=-B&=llZ>J2X*WIpgifrX$lqqJwq8c3y*QR`+4AigmbIjQBYL zEf4QuTUXaT8)l~|ZQ>rj=a)I`F_`VL*YmD};0^&hA)9jl=?4P=)y_|4{Vt3+;9fDc z5usETfTW>|ikuuFuKt@p_#(oD`}c(*g7pm0>rdx~ zma^pfn>LkLE55IAoPO&JBoL5dezFO1L}fgW6LHkc zig@b@(;Lja>}B+ef^odw8gx$6KeNFhS=`TW&}*KIWM}y88dMVy5^Qa9x?X$DvKGkk z`RFDcTaK1iQiaNkvLP(`it|pF^~%wBsBXZ}pb2Jr_Tx9Z9-DpeQWlfpeBzbi4!>OcQQQ5cX_{0UQC$o}iA_fo zuJOsO#nWpET(y|3Cyr!){%}8LlsP__&v557QW6@8g!c>v; z(%0byJ?@=9KOWxH$~QTZT?x%ph3rsIKSo1vmY z!AB|a=a0=rxw9HOUS3D@yn@TEb8*0OS6K@d@Glwn64yFd`2^W_8=l+G#;r^k zJl1gw&Qhv=`sK^v!d67&h;Gl&O!4mM;8?amB<1YO(S*+zFD<7%Z=J{9{EJib{yPIV zPPmA5*1pr>lvu2jN6@0quU8t`obmI62}ypU6@rJZHQ0T>9-?@EN~1ZCb#Gtwx(rmZ zC;iB=_G4po-cLRP2aO3g-!j&n6(h{rs`ND-_fm}Sjf&$#36ysxf(4$=%yTSgF=$X@ z@O9_vs_Fmwazz5`=LXZT^@PG?_OFt-t-rfhT{O5WT)k*vNjxxPa%sB--ynb=w|SgO z-s{u5>=+p)?mteE!oar#1rrodi2y*KU0R}ck}y&-F>T!A(x~C-%l`biBbn#mCcj$+ zg@8ar#HXfAx6N&;JTj4$-B33jlSEF7Ti!wC*BGz5oBmms)6~3S({!rq8GnAiFVU6N zREX2}&fk7WT5Qjr9Vziwl}-FT5DU``(U7}I2a5TzR9+W0 zJoy)Az5_H(-5cri6Ok-QX43c>g*v7^)AphL~Nfxf5HZf zJ!|i;gJ%E*NP^m+VS(5Kzjk!|DOtx{zjYN5p)ivhf^CMB3OZ#gR8&;pgapF{h7IiR z29I`X`P;SCpmYKM6kw3m_D}YAOZiBB5v@_Y7JmK>n9p;BPmPIe`{Fb)&-JF21*sXt1o~+jS`Yu$ZE^La}Ll6 zjM7Al5h({Km6|hRpQ%>~A+YN7)t&y5FUc#A-~n*7pBt zRrx17Llqx~8n#h_gYQ6T2^MftS%>E`!vv=01}kcFZR=xh?!5MNH*U~t>ky4M8Zi;; z-a-+|8dSdQW6n9t>|S1RTiA-@dPvj}X_T~WGuIy5gvqiWj+OSx~R09SBE##=`%15(WThQKBH0NYIr!`)vu$ExOU zHMmxFeo94$gJaZP)+cj5r=v^{s3R-m-pO;)fa-uW8aJo&&*uUR41RLcQXML(2N-KQ z{t3Ca({ukmuwP}Oqg#w)Pb)jdv?bn5}@pVIRi!313y zD^2$s&3SbiQ@ykDDS(I?I|{=Po;hN^b`dKc=M4SmCO#8+@M{(UlKZH?&F{G6@B4`p)qRD+(~ zsk3rBmzdx849C9*q+h zdt^*ZjD!G=A^1Zez?T>FF?N3B(B3cthvP^P$*=fD0qq^LNY`M2&R_{K%;2}ay}#|nFtyWbUiF?2bOSOe2U@#7aZX5&%xx5{8#}6 zaZ-2%jui;3W^qyF;L5v~FY-sAMDhlqu%4M&?(PA)UHO|CW0wa6dCn%U)q;blxN&ml zEj!~jG2Q1%16xpo17D#N6i z1FrQET0}AxO%I-(*)C5;J>Xy3#%H`S(EIJmH&08iv#ebA!LJRD-K5de9_@>+c>w|%gR_9MSI1IPG;wNm)T3%?^q~O<8WvEE& z%E*RD6A|J$-UbVywRKA=OHTJ*Zf)(PpPrBcyfT=toSY%#{UC5Ipx5*Bef?lHc*Ddc z94wA0YW{e_!LhL0ZS(4t_Rd3PRX3)7jI|m23a~;ltNd3%$oIr%@@Xsf2dj zku@TD-^Tng(waWWa=Bwk=DIIXiT517G%!lr)}AU$^DTZeD>o*_BMTU$PC|{up}Fa1 zqI2uponB|}zjoW$GS8vy*H+P0>Z0S{EZV?W8vObGi<6~r;fZyd@3R=!;J3L?V~Z*! z!-|v9Ho@34_NWM#))aC+~MXr(SM zrEON`@9{AOgrVg}LVwQ|bR)>t6KK;xcBTi)W=Q)P8vvgP(QGo=X2AgRqm6I@C2j8~z@`Dd~7T^wm zSdAhJ-Oys~Ar9TT1OM#=(g6W))tb-QK+D%QteP@co=WTB$}EE1m4qxNE=J5Ok>>r$ z?S;jdQqyX_EX=n8DT(uX7VSH-H)~vXG4B55`lzhBrS<-uyYlla=7K^AaKr@XvrxEI zhJZH-ln+e^teuzIRJoL7b$=36usm zK4vPUv$5pwdCDhqy#=)(01IPg4p}3l{!U7f=9WXTEm6D(4^{oxE`FFa#uq#7l*IieRVwl8V5+ix*hEJK2wa(jt7 zds4!%Zwbtg_kTMb$pbgg7#yX*M=u%}D{7@}qTYEPDLGQRW_$aSmKUc&0alQsJ=WOs zqK!erAmWo%RHWas+znOCU6{)v1h1Ny8XL2XX*Z#lFB|11@@_4gh=B1KvSVK091Jm&#sR|Is}yC)_zmH&+{p=r9u`P}Hx zM#s!mrbl+6LBP%hh&*J|5qj=+epLUz$A0S_#-Cq#s=_%R!FTES_{0m}W)^wip95nE zO4&J}TOk^hjqp4lXhY!xMLk7D;5uUJ2rEF~xT#`dg{Cq9k2#X5B0N7J_s37o-Wo6k zzc3K7sgC&_-{@E>`;~B3KF$CEXTTxqstqO$OSzqT-Mo6hI-CM1U+r+Qs`b?2H}uoon+zF>>&JEy3>cW%6My+7gGsD%7e`fBuJIcZwcM4G-^yF_Co0BPyztm;59%-y!03 zH1PUE{&IBDDfr-IVyH=+=%T}`qA7oHBB;?bY30{r60@i?jl47ARTN%+d4SHmAK zV2Bi}r$@49)PD(S74*q=xl1ou@!;^G+9A>W*x_ZX%^yK5_YreDRua`4<*yynySL)H zBxPybM;zUIxWpqr+Sr?(Tur>=C8?G0LMPPLbM=UOr>tz-HP_&nw1+h^yhO;0-Wx0p zk>?5a!4MN<#Fa5?Fzx7@Y{n`5VXflyk`k{LA+;x)-`ZNFO5wCN@%Dk;&97ZuTM5g= zm(;15*(N)aE&EheG*nqEo7E0Rpi)gK9Wt9K$dH>DtlZ(_Ow5ZtmUjrgh!A2Ccb8Fj zfalk^H@+F#6N1Pd2dr<4#c&a$-@5e`aCFe|=^~a2F|@LhwX-Xm(!a$n1HP=V7J=RE z2M_;1F5KZTwMXP!2(BA)s;=&Cy8qKj-itj_esS+j8>CQYr3HbC`6Io_+)*GY-vIz5 zLWBo(`XWaD1VrN{M4br_^;CnK8jY1B5X+nvZRQE>M!LxF}Y_W@Xx1&oerTJNX6 z09zM?CJ75RxIg`JEA4$$sY4sGb5r9IV~@KA%Ixiqt$!F(N{VDDMkW@G(;Qf@pf|IW zvlY`sDza8gy1p@$vf{O9ygavwwc`3(8DF=?L)1}`Myi@vo^RBBo~dj-ElEbr^tQJk zxzn0~B}YxGw=Y;yN-okRd2Wng7g4(2~lpmxGa`d*P;rP2D0vMdI^ zK4+#P(V*w?2@ihMDeYo)H(uObRqPxOEwb`>K}*uO|9HUJ*H7gtYk8UUv?H@{`Mq_| zxz;2s=TZC5(3*mCM8R}1tFtrk{J9eRt+)J>I90oUj&FoV@-X5f0Cec&3nQ zRaS3G6Px`UPP#lVjVayqXr1w(IiAhNtv~K(b3JsASC5a4)gY(SoA%|uLol3Dq@x*Q zy4lBhqHk#_@&3eGT|N5j{MQ%To6bjdv`nn5Ndcr@VU&^&9`MQFxGK7t`HarMC<~l0 z`)4UkxZfv(7%^gX{@WrFbpZna=9%XmR zqr`QL-ON(lWzts$Io&s_Fa2L{bUqwpJms!ymiCuOxxYpw>U9;!ein^^K!oSHfO&scd}H>hlW&2;*0(}5&1}QdpkRXxeP=_gq?`&pV|5C5h15hNtk^IoiC-S(foujbF=6>`7zMDNur_@@{aX54sWrvuo~AqT^hErw)Oq7^ zh=Kq(w;&sE0Ns2G{T9G^F*!+$e1m|}0=jOPLVV|DU|@Iw3wLh-+JXWl5+sW^VJd~} zuENc+2=F^tVhCqY+gt4j{_jj00%vrZo%zViN`*X!RW_$iVm8z8-iTZ5%@6}6B_#CP z{O?0q$L9m4xd?Ls46}Pdjf==DA#X!^)yO(0toJbWo@f783lN!@C5 zx8;vtR)@LW?xv*7vfVPo;l=bTgL$-)U!LN9GjUBp_EUptmGH~&P-QWQQ#u?bDB>FO8FD44>f-0!=E5v8aG14K^Btn*yzaq zcO!28jSgWS+LQ|zWo>P9d@?cu53byml#ny{k=PLbkPypd5$~q_bC%Qc2=#;{fo*s6 zy4UZ0^508HNKrBH;@e=FFg@=qGnKt}h^-U=FHp4~`cvE6$ZK177$qs!m!9E=URls5 z?O}=L^Q<#AgbUX*2BwAZTHGsYpK70Ixr5G%{TNbLJE!OS@gMS_>4j!F_0V8_s$}rw zI`~!^!65=HwGR-1Vm!PX!)4NiF3id697*RdFHQ+Zi>9f$sY1SdIURPaXm1~%jqt!l zLw$ea%_m_GPCUk$wnM>-=2?o2>+Af@ncaf-No;-S(i+5ejWIjDp;!9y&-Y}wa-P~B zumD)9RaXmRYiNLBJ7>8?O^I}di_CQMcH_AS~J$R5~I$Scty07yrOVMt2 z?(PgB=L25eRV+bi=Wv-~l66SHJ$mP3oO9)Gwonw6Sc~5CDj0k2=!nt8e1b(tD7(n$ zR;NkCL)79cd+HzB*!Q=x4n}j#ka?5y`vO@)Rm zZ#3MroOX<7Uv(_EJjU}(u8WkXzU=z(TcIP2SO$t@qpIaU3PJJlb!QFh_bf)&n}^CV zuAMp=jU?(^Cq@61T8IA2v-(56nvLz@%d0TAnjcT^pT8-Q6(OX8Nhz8z|6LIEEAAkD zfvWk@H!GrJ$NRa}n-QLzZ>6;`@6{O7Wb|Cj9ff(7oJNhe5%Ej+Y!^qRrL_J?2eRz)Ko-G!%i$2nS(t>l>2&(F#bW*n{_TpJUfB+~qj7mn z>Qf-G1sWxfUKr~R%`muiBP>X;PHTnc)5@==rm08#f<6Q}r0Mc1AM#h-YwZu8;-I1K z;ulb`tzji`Y?|yu*94P{#E~{#KDc&GC1E!d`s(G&kC$P%I#mg?0TzBnhI0OP^@&aZy$Z-tYG z&Rb;2Yy)ss^9f;A!zC|s2l~9#>Ry>x^z8^%msuYF`cljFc2fD0-tWCZg$BT~>Gk=+_mfZ+vfx!`YdUvFRm zM+sPLd^X>4Qu-Nb(S6raqpWO(|#xVCa`Xao_wMgpV|^F@Wv>nG>xDH@J-< zW;!5P&}j1H2ZBcgZ>IS=pn87?F*hQf89c|~o}kNx@5vV$e5+(U8F^qJ01@b(l9Cea z-S}r^WlcT0Js?r2I=`|a3DBt{SP)>SC|=FJBwv5YX6~@4hMj+_^biXY1{yaQ9LC0` z`ecSbVW`U4ww(;DKW!H=mM3}ZqtVV(5{pu8%&fn-rjv2bR|u=Ch;|>bOn`AEvlEx5 z3par_PsxX~DWW|yTSv1<#lg}G@wrDr=C0Jn)X&2xcX8;f_*SJLkf>SDGF?vNI)7@h zYV%Z5u{{@okf6Hab&92*Ivc;_Tgu-OE-i(rzV=LYS?=iLlD%3!xvMrXWTaKA_|rZr zIoVevgSJ$DB)*d>yjOSx#iQUkJzrXVJ>SJ{+T|AbfIKxDq-+ES4w^<%{BPOm=_ue@ z0T9=(0NbX9?(#QK3H_O_7YlEULP*>?x=J{uBuK)aC)qzj9)I}~CHFbXTRg8!O(m?Y zi=fb2tN^4G7#xOyb#JzO8eV{3j2_fE>KYnPq5GUtF$xq8y-_U@vmt1BI_ z)zIrGGw8%9{hc1j3&$PEh(@rBh&!WZwJ9{L;;wID3ps_nj4=x*t0!gmmhB`8MBzEj z$*LA?%m|zZi6brFy7OP1y4-*P;v#ZtfMtUi8QJ-L%3@(_FC3SaP#hts4wL4)Uh;&M z4px)Q<~7uyDl(hsYEZ<+%vkF*HZTeeC^ddm#uwm6CaI8p+!K@Pd@Io<9o|3{=Iwhz zFX~F9WJa_LtPBh!{k|Gkn60ZBf4uHpQ$ts%$>F*2EWl*t)Hc8m<>ya4BWe=7bu~>v zYU=0k%d0%He2?=R=5C{VlTbg#QRE72YgLR-&qNPZ9ucfpHJp2-K)!v?`IVTcboE3` ztTXKu9ouOB?I$1?fOZSGw6%f&HeYS-k+(jQO{K9T4$3l$-YIQcLo;1FT!x|`S+^beJWdU{`h-!filfe%7p zBv%DflOE#O|J5g5R8|@Ndh6W`*oRZn(1>q5`M?7Hy}LieNuR<51NLTHp?cESGYc&ULOmred#*r^``BUYf} zD9(BiXpQNw58sn~v?=n+nr#~TUJe3VMJnfW9c%=O6uFr6fG5 z0l~r1yqWZcKy`sx?LUH7TJ}H~3ejtMdJ2FIC|GZQBMwB~2na-+2o(jG(cr9$m_$we z(Sd05pN~8gMBBnc9*McH>*~q_BWS&udKZMh2w28+=q+O8KSx?}B^4EhK$RGnjssX*tN=%P4_T~81tU@syNer0pzMd6<7%Yn1injBA=&mr z2Zb(YMz~=3K?C?1goNO^gmfy$U*!@>DY$xMLSwX>STSY<=*5sKxgD$_9o6>c<||o>bdfOEw4ZH3Wnp0f2uICS23(2C zZtxe8Z9y2cZUG?<5mf>6kN*G2m!m}r^l+~eKZOY1?dQ4%#|?2dg5y*UrV73o#Pm)Q z?20e;TXj8;#b`z_>l{`)0LtQUFCl#Z0kt7p$1p%Ng%K6>Q+W_vIMCt1mP{gRKbP&v zXSuIE?4Bdl#o2`7s$T68Bf3BMzc-1TMpB|a|NN7Sb3-xX{Lj0$Z?8b!(%IaM*q4JP z5v`MirmEb_VVlE;QlbVC-n4w2k{LoqrXuHGGt_xGBN;>CZoTro(Zg;0)pvq!ZKVcD zeHtgqcM8IRdBhX=s`TaIoXPYZ7!vj!Y zmiUS6Tn3{r?u42d;)4m3n-+vd2arq{pp>;MuHdMqo8OT#VIx)XXBE5mMvCRC%KH{V znl8?EGrt zfpEc&$RdXL_Xvda1mRWHl^s)w&_w&pP2_H|C-@vIC~w)5Nuovje*RLu7A9h*km0cs zn3Y8ZsRIQ&dkj#lW7gIzYeWZGO6}UpTO}S7@v#w_A3eZJ^)c>M=NayVKa+X9Smk2{$gHGu; zL}3S3IQP1fVhR8-25prbwnvX1L3(XqO8YBB65a&!k1)xw1>^w~EJ#oC0iW{|Fw^}% zV~G~Q;kJ=G?-U-v`zp35$`6mgGXT$ni^USW|3HcFAyy1AF*fc%mfBz#4xQgK`%3T% zrU5f54Ux(DwZVQzwr~MsIrqz#FNkeA+`@=6l6mDt^fzUKgcsFff`6-=QDY)dWoSRQg zy#T`)gWY35t00RQMBH}I{>>Zz6OL$~7pNmw9V;sZBcm*21h0Uoig@m=08J7ohV3&m zFE_$Jh(KX8D!DHTk|;C(x7}VTR z`P3otKsZwQ>#u4?wz7{#% z-Eeb52cisZ95l)-w9^}fTN_79t=|$@>g<;>py`Jg%h>rT+EVWNNot`numv@?yHhBm zwnyRB2deDge4}{!Gy?Kx@H^{Q}O=aAeEvIirUzQpHR&8 z+a{e~FP@2!@Hu}4CyHYj1p{202C&Sq<%v+gz%@Qsw@Cn5{enEm2s(Ta00o@dKY^MQ zi6B5zMApCI()-@`KA!_8F_SI^Glx(3MUWqu7F2b4AHs1>wW3IErz5Q z@To|80eXA*-!-lO>yEsl&`s=3ri@=zRRvnsh`2aEDJnTeZe#)^o77QZHiVq4Be3^~ zcxD&y65jfGxCjhS_Euz)xwdPtM8PDlA4Z1a!opY3BD`NPBH}bCfNx-u^g?a%&zt=2 z-BsjjhTFhLF*lkWkHN$yxYz27r#UthpgC#wS4vT^uwp~+zTV&T5iufj;u^>T*2)>s zArP)4_|!jjTvM+Rr5Da%Y5T!@ug>+#R2ar10iI_{S*1emC=90b#2*#(bc<0PNv_b| z4PL~^{Qv|SC}Y(58Avap3^Ana6_!MVui{MIbihDGHJ_WuwtZ7T<@7=1uG7knEFSat zv-dalxAt~Ey*07d)|qZUUAB{ulcNT%Gen&AQCN3^i6(p>_kj!yvI3C)q{FQUe_$5Y zC)!7{@%r6O3Ga(xjiMPGp)23fv}$Ml^PZS>c69iD{VD{s_sY|y#YNkdL69qxgJU-Z zsFooY#wI4d>kZKX{BR&KpWWOnK5we5bV#rTpzdI`jjoK04C3(#@@?Gh*ZG*;@7!f- z?B%;d{?GzOU8uLuqHU_Sr-0zHqbtX}Y4hHPY&9->i5p}iSAFhE?5J_z=ivdB3Oa*r zaFasAND!PX*TbdNPF{J{&T3^E$T*4fX`b4u^U|75A=^bwD!pm4OX2+}O122P>!Skw#9-Pkl9 zQv-upA1o+C-Vhy5Js@4p$S5GHzvM1aRDbI{W;=ZBEhd9x3rioSYHzj4EonTF>0z z-Vz5JUn?E225Fwhh`Be9*$NsK1mX?vZ!C77=peL+}ziI3|e_<1J?-%DcE=RU0ks4-h_@4kl$eI z6S1Als>&Amh%e`?-^?*5K`E|{N*{l#fd`n0XB4cz7Lg4H!NtEo6S@xPy013W5MsWV|g`5IBMvJlBD z0bKLz-Pb7@WR0wH*DMmqqB|fdKAc}y9u3;EF#)i$VIcDFbB` z5G(McS%Mc}U&+wW5JjQdTF2ep9l7h_$7M5{6BpX`RS3WS_hvd?0JeyjYy9gRN%fK| zK1Q>SA#H8Xz^?c6IsL<)e_4eDD3JQX55B#%1(S5qB*VqoSz!oBM#Ywe=!=qUk5B03 zKk94jyug;is;dztG2dxt7s`&7$O-@B&2LpICfQCo0QF`RWX*7ORb1lrT>*Le#zrVi zuE3l=9pali7#Try{^@^M5A3U{Ca<(FU%1xysW>=PPtQR!2C|*O4I4|#;PUeF10JyA zQl2{n-->j_^Lfv}zm^I#`2D#nrbSM##5`uA5N{SBSjLoeR3y=XIWE9v1{io1= zw}lCsY-CyN4Br1cP_09=VkAC^5X6?ZMh2iS3w4P9m#4MqYLt?%fGb30-9?8q#llLJ zC`r-Yg@PF`*je|2j2Yx`@26&mxd;dd5abq=ASJNf3CaUKz_}59O^WJ zY|X@a8SJ3Rcz62qZMY!mak*)Chqd;txqXzn9?g-TQfl&Obsw*NVn$y5!x?C zCMAd{uAxT0Vh)eN3d>Xoe5yk%5lOwSrsG}e!~e4=q{PwO|E=UmJm>rO?*YB!5!0yO z^C{*I#cha6jEr}k)%WSi$b__x^PETWX%w@Ch4ZLgL{b7IlJBL;{}= z`tdW?r=_&qPszzYO3_dY$bQrZ()jB)ZwgA(S-O@V+)gHY>mKppXbR_Rs(fSTnkO~( z^Lnu`IUNOBdO>bM4vttD9U(q$VGslW+$05N;v7#KOp|f@@Wn0@R zlpI~!OnnjdY+PbD{o(M@Sww&PlGF4%3Ijv_a&S)iYdP7WGc9t0`)&2~f6`tRA5yC5 zf6O3|SW4v9zDF+!aih5LgdU895%Arc^$C@Y@I6&1ne_E>dQW3+?`t1%vSbHr8lRa~a^kvoV+_?h+=4xMk(<1EUo=2r9}&p z>z}fD%(NfJ*nqHi7=98dN)iF4?k(s+W`6#B6*KA%pg4O0jE)$00xc5owSroHk=(R> zS7^wZo|utmZ86lD(mWgdu;tv2jUUX`?Hfr&+xvD|{-nIL^au6q`A`%V_Gp2|F2tp| z?tqvWm@g3aK$*u4{!Ji&djx)UfSbOW_$?ErHn8^~bIJt71a06A;4C4AEwu+;!xqZIy--dmkR5)??$9S>cD@s02>=I;n(xNYhOl- zc@ZjFM4kj;-5<&I8S%X$dA0PbXpVAwlwMW~cb#)tMn-b;ZT4hvFo3cQ;mYi-jYk3Q zY!}>7z7fa1{0kvh*L@qcrltn^m4TVKedFT<-tf2t0T{0Z+OXIUAASP{9CU=?krkms z@-4`~5Do=6RUz{Mwxgk$SvL%-oWc2U5hJSu+~YDKafAuL zdjQGJFE7I>Xi<`qmTm==77#^ueu021Vd9I|r2s(8Ehj1hphNtZOC*DwiiTz=OBx?~ z2gpJqxOLh2Q7VVSnKQ7l(am}pw`iOd`ISa)8_5hI9R=?QAI5`y zO}+KOTaqt!1-hVnh6ifyb|5PMlj5thsgrUGPNAQpU3LX-OuCuVV1GL`+S zza1VGD6=5)2Ezynep3N%=2y-=wH04V^n$?QI>Fm*v;~gZ^eX) zs!4bsPQK>30($LgaeIET*ijJD%XH{m!IbWjY*3L=F#uB_A-Au<8Yo-FoUvGhBk~adtICv`L>8O7(IY zUkcKsqjU2}c&ZjPh%*-7B&wUSPu1_U?47!6#UtlJ3vvRMP@6W}>{W3E%rJ~SB;=sN}IOAyflI?G<4=xSv%xS5kk}53)Ui793`rARYL%O75 zy1)Ptqr=!c`#pyPzPM<9vZgtw78%<-E<2PEqT5DBVql68^uA{E2S{5H-Vh*)GeZYy zfqA*JQMZX~0OfvyhZWRo00bk8>mmGpn;o9O42 z{RsFMJhdus$}W;IbnaDn$Hd@*)LOCA6bH`uAF!9Gt*zCrcaDITH}aTXMUoUCU_v|R z1~51~HN_!u9EY8Rz8l!)pu2hsRz^3F8waiz{B}{sYLfvHNN*4yq|DGA^*3+!&6Wlu zjG2h(zV(nXTu>+2a?;ZEGBTKDJR_XJkM4d0Huk<~qS7}LE4SKu8}HV-%4UYD+Pnej zE%d#%VU`UR<}CmbrgX@pp@`Bq{Xrxev?Rod5@V7+s%wg?&S>Rq*-)_3GBB71qWdnkqps^47`zV&xjP_my5^DA)7uNaDS3lf_wP4D zsFaY95YlL5j_fvsvB8@+ZxEn0+`7h)r6EHJxLgbju$NO(u2 z&R4G8_`SN?0|pM7>j6o)g&O6)(6oyK2}}}P{prP*e-sy5|E#WBNO?nFk_^0wSWBP$ zn{C;h9$3M1@&D+06S$t&ZtvebBvTU7AVkS5BtnrAkxC_Vh%$z@geZxMLZ!h}QW|9_ zb0iYkXp%XK3>h-ZRL^_a`~08#ob&we*L{wAZ`7~v_qx_vpJAAaK0{U4S7j$^Z)7^_^L{7M;Jmp@dO?=y0<<^r;N6!9! z{zOEc_UK9Di)XZq@=Kh0VrI#k{kwPV?=&)0vEkbfm^PPv|2R*Q+JIZbL|(oedO_h2 zN?>NCxq58D0(S2d6ckwJwn}&4>Ozej@W8s0pT#?RPe6E5RdtJ223c7rOSP!@Lk$0; z_h*52KkT2b`8)<$%+0*Mv&F29#!X)P{nq-vaGP-Eckkb~P#>F6cmKMt9q_?+H#Ecm zq`8mv+-&{bAsjApgQK}lap=ySN+@?%*u7FsE%vf7F0goquVV?~1pNe8s45QzS;s1@ zD7-e--(=s~-99O!ZF@|vzdImd01&g>1^SJ(MOuYMVeHzjVKI$k;Dw6*oXsXMuG&!~-L zWIYv^tmHzB&EqDoW{P#vxqap3PTeN#xe8$-^S?FMzBkTT4tif0u!#{`QQBHs-hi)n zrJ3W<3bnOsL-SHoQuG^|G;Z7&N=rrGJwzkfmKDwf<23{kor zc=qhjxA!yJm|jk@4y%(>@w2%6n8|^pBfmVGhOK{Y|LgQ&lSJFj;V)*-p0uLP;7z$P z``S;pQ#10Y?%BBI@5^tdczLW@m2zbLpz0Ua&UFU<3d!^G^|vEw2hlenPH3ld-KTN4D?@E$_dLR~u3J;np0%2H33 znvkj>r`^gG#THch|0-ajz^9l-_6%J$p;E_DuUD^a?Php*7ZzIMAPa9aC}y-r`_t1V zV0VZdzRnQea?;nQ<18$WoH+3useC@uxH7g|B{Wso1kRc%Q^O#TJ!-zchzsgkd<+y< z{_fpPnDvYwkEc#@9PKrx-uK84&*F0@Z4cXO5m#sK)s-s`_Hn*8ciy~&k7{RrSoT{| zQg2SOO8cpXg~bm~tPO~@nhao{M?ofMgIRgz>W6O1c44p$F8sd-4;}O&<>XM))se~- z&Q_tjC%8dprcE2Ys0fF`%UA2w zpEFKz>))DZ&inc{7__wXZ|?c_>lKP>2HUwmSZr>c@fecPd-!k-R2P~Fc)C|3K*G zw%r?4e@pXMoa?#4c(vQbI&*(iY-%`ZS_0`Lkovoovhu+x#Sc!x0{}3hT-;fmk-qe? zhWg(1wRN=izE-xQOb00qr;pIbL>q1LHq&+(NyJ}TC= zk5@1snOTi9Dh;TpvfEtE%X7lWAb)2(o9kJYfQsMQ{m`X-G&CEfURTd9#pBJZ&A41gcMJJ|9&^XU zuxzYun1#dx!lD5dmrTzuI}LYQHI@ncJaS@~i*4gKiJ=N4ApLR1fAu#V;u5OTZoxYn zyS$xY&Eu?%rVN?XEyR0#;||e1`;3a4U-7=|V`lZOkFlBa8%IUmFDx#Oigz9q+|#6K zaJ+S5d(sB{gM2dVw`0{4?M%mv>A&Lnc#7jIJVpm>In?3b9!-q1wVKxHP;VJlmtl1~JwQlEa zoeOol`I{8#9!SXkOQ-%yW+M41&D*v(rqW4kgVN-$ zthsB~BYD~Pr47&hsC;~)X7k%{_a1M;ulLcLerH|Q3(dEzF_3MD{}A3HPRkB5yp>5M zdP)rzulQB%CL%Me3%4{2GeV{LPS59&^JVi9>l?Nk29!KtMl-4fBwt$Tp018)s zb;u24X3QuZ)iSAVQW^s`?PsjsM42dNGS*NWB;EPo`nmCW6yV8qgck~!?DzZpdFAIX zua_A5ykF2GEI_OucxHuaoU!i9?{_N~^Fl5}V2j=SE%Vb`^l+h6Tc@0l2zym@?l;67uUmCd*2 zFLd%f>}B&=QL&#+pE0jqcKq}(u+JP<*F37%%NK`aM4vhpA^s#-fe$~cF5K}LdtkVZ zj?OHkTb{Tgbv>)q#{vBIdt}DtG}H-bX2oZj+2>%ofu`x$N%sat_cWd2INoKf78oZq zKuKA9UK?*)i-vg$MWZM8(C%UC68Gi$$}c@EKNS}g+*Ypd{$=-p*yP}#eO~w6jq0yl z`8mH}z)1TGO+6cpd8rz@c;cBKelJzqADD0TE$0H>40y6j;@3wmXEf+Mii_qS8<6ck zM|0eGTO^2U#Wvx^rk7CcVP5JUIeGGqvZ9_!^N!2w9(S{{9%MOb(qDIfN&4kw zQKLIJsrt}4hZ9vlSAMXk!+6U1H;>lr8gwuvGo~lb#XvKkI$Qfjij~fm zz`$f%^Arc`zw`16AKoc07MI4JJ$n#Jil?n2=ix8L!MJGAB8{KxV#tt8^teRy7P+3v zVa?0p%-l&nN<-qV>KadIdN0&!gURt{lPv05Smd>v_x&&X0E+=}R_!`?Ry>Gk(f@OS zv8K9W!NvAQiUqfOK7TnUe#+pZ`%!z2irHm19E|pd@Ab44|!c# zSzcKgfF22Ni+JG@uaeYk6aU-YZd$5~l*1-YIk>yciNAH|kv*T5o_v0#yZhqwssdR@ z4XgBt^;}N#=H+1Si5#@pvAOd2wiVs4TZOmQd$(TCYns>NfbgW9jUUhWdQBntto^;= zl>8fC5AN)7dezB~4{GO)NV#`1De+rQ+uj3zR<0Rt?=m9g(ukjB0Y5A5*Vev$`{3l1 zlS|YADL{<1W9(LO*k0My>x^XqcSNgvOaua4bcDPtxru?*mp(Pn`k`gVV|@P1fjE%9JRD-`VE zlCt@S00{uD*1URx{&Ui8`ocRCDh(WCxj}GpD?qS>^Wd{*&k7n$_xRwntM_yZSjRzw z2Ho~t1StcPwFfx)V*mQ{yOb1e$5|&yAC}U8U z4+a(KG;G}X)87Mb9l^U>y84BB;?o6jM3#MP-VKRF*3kODd$lSeqcNV-!Mn;Bn(%wy* za@GY>^AgRa2_UPuIFucG{gCMWXB_>D@I=E=2yc{ezZ$DE4}iFx7;qD5vB1Rz@u)3S z;x9Im`fl1(S9%f2NTXS>anQqGuwk+CUz+I&Qyd-3pFj88y?eLw{HS5)@AwWJ?Qe%4)H-FBY(lQ zish6enCz6P+UEkFt<82`Myz?oHbE#7=xY;>%3G8V%IA;RDp~s2QW$4vUYcwIAt_Ix zwuDq}4&s^z)h|O#gn7Wsj%eKJPca#@W8v1SG=(qw|E2P}=56+|3c)ul90qou&sC3S z@_meBtYq2agnh%Vk;hh}e*Xbq=gtk|HMSqTL`^mvXJ|eqPs`G9vg<;vz3&Yq2*Kvw zV<$W%XQ*M2)n?iLi9T(zU_nChB-M;>rE7xmu(VQD?a@uYcqarlJi-L1@*xALW4<$R!*r(3Uu}OM|3`5-fo9-girnmOeWJL1osJ15g+FI}on`gYyFz+{1%%xOc>l1MCWe?F@*QgZy< zgx;!2*G((?A3ehyxwn>3VfnXjueI!a}7LD^_gXy0!1XfjI1hYnZ^y?5+r?dRtg71D_*C$X`y z8~JC;D1E||W}7x4XMQa&4geGu78dHyyv0Gawz1*ct$y+ax0OY({lvKRj0{YZHRoS* z^!1mP{)!3FgX|P~e(;iqPdL0U^1}3F%nep;DgnR!`!$Ik?jI@=z5%A_GbsL*l5h$w zqw%H#i?V0rIF)Ax1_qAX_LNhT#F{6;**@`$s3E-#K33zHvMKTuLo=S^qE^Y(6SZWg>)!~gT>7A;!5 zSa2$4fN(>LjfcP+oK7*Z;`WS6H1YX5mF-oO%bol8#|?hg)#&Sm+TVTX_3LV2aB5d! z)7u})Hfw%l8~YK~)v{tz3yV*Su+UI$OqR?MZLGPrllz`Ay+(}CWPcw1lgr-q8y^gc z&0v+DhX^7xzLQ>d7~Y(7jY1evMjTG8A;xif$i4A6{OZx2ga{xSBLvSvh80?skX`a) z1^#3uRaM8twaTih7PDu^IOk2t8SBUCp8fvG#gu8MkChy6dVe-0%pLVW*Wst;9xMmu)w z7)Y}-Y7%ZvZawoZv__1OE;9KYK0p8P=FJ;dqcrNJI^DW;gV`-&XCo%-g4?%q{{CCh z!(;WN-yQ?Mth>!&*0Z!&0w_nvjtbTr-ZIp3Vvim@OnQgorm+MnL`FuU3vLe!Gqtu> zlG}1CvDw15GlM<*&(6`^^liqf<;zWG&b;6_GkFb@AGaVy$W!O}($mn(>cq?zii*#O zblMO|8b+Q^UcAVqm9s~tU74n~wl*2TXqlsvhsUY-Jqv**ykiZA@oQm~D@_vzp+4f? z2;d&tKxWY8ABn{qUM+qLL^F6QYB|FNX@#>~!evK+FXb^LA9WZ=r z$H74qRL5D6*Jw!DkFmn8)72J$YBiR!AY;j+C<^cXcs)c)Ie6++du}_KLZW@Kn}{in zq1+@nL!^4DgL%~NU&@VSsBFxK)^d{nOHcU|go`8?A)Gp7dS(zQ&q-et-hz+fp2yQk zsCQ2|a%6jn<8YOh|K$bvXC|Cos^jF;T(&+$L3}H8&h+XjNaXw|FiLuL<_g_{UI)F{J zuvk4T1Ab8O$rA@=qSRFQe{8aCBZ~69dy$Zje3w34x3W?bH)whuhY5=Tz`ry?=q-K? zPENG#+D0Q7K~*g~P=YNTS@61)N$WbI^X7uYZ_d%>J~zD{*aZM&@8-d;x|fI z|5K+=7qG0)qNuuf)3`7TQ??esZsHJ(wN6~-?k<)BI`r&%xFlWQ|Lx4Tzie!ZEG~p_ z_$Pb5TXTIsmddd6!9BbdYkWQPdN;A0@sL}#ZtdE?zx4{E9z85Ro!v6N8?1V3*-n_@ z>i#$mFK?=|A}!0%-O{Smv13P}_IboE#Ddh}X~mZ>_6wVi(8iW>>65T*dbFEYyLP^Q zD7?PL8ykVl4X{hV^;w%G$sW#G;4hMa)U#h+6*X?xF1*p2>^?DGI2n}CKD%RB=IENM zn+ZUzU)g3HpZ+KTao@VHQ-G8N-)&nx)=&N)7J%l$0 z-7`;xpOPMDfIh$_>DMV#52E#Vf>H#9ey?uI8qa0qAgfdsJvgzA!jkX5J&SV+EzZgE z+F=-A^$y0loF5!#bIt3z_p?JDuvio?vTNT9ml)mCmr|P!yBz+~ciEn9)*V%bzWaL;Ur}7J4Jdw3CKjdd;*P}&=Ui2eJjtHc~ zy+sp1zrlmCfH%T{Io{Ip=&@r^?k~I>UfHup4a-c`b^D|GtNWY=866z0vwIn%$iHRf zKK%KR!nlG2tP^IzTlLwv@zT2BYk7HRszwU)PN7SuC!sm^(4oznHZ_EeiHL|;ps+94 zv!-$C+4zS;H(5_FDK08vC4+MHp}!M)JE*pAKZ~(_iB}VPn-71dd}FAC0$8TK@vSK?gQl>Tz9XQ=P&c4f`m;;~_u(wS{5 zyFkB)*+Tf#nD})J>l2{|Z*XF)zQc&xUjvYiD+s#EMZHyzBK1&bifsLzc~21aViiRu z2_8}7Fz%J_<|*k5S_{uAHGAQ~u~ai%tsES-(3!)Etl7-);NRrUn>+Ujk_Gm*YJLuC zhuZ)wJeAY0BW%!;eX`h1Lx;o*=_`Pb;zcF^u;(h&aFtx@8q3e+>)_-b?2#9D9^kq|dG>mSoD{ z^7X&JgmY>2PfxoEq=!hVg_ZpH=~F>bQ7jiZ?8GO&@$7{Q_1qVw9xDCDU3dZ8^^tp7 z$e%a7frDZUH88I%>UwdpE%oWZlZi_wPM9#JceuUhx%20TLxBq>TewhWCGZapQ>U`> zCUEcGz0c=#?6})=deYiZxGY&OMy(#8bV9o9Ube$lck3 z$sO|c<;w+docgyQwah@>7))Y`z+o!gyC1S>)15I$GJFoIwlijyf3flmG%wc+H~l7X z_?JmXI{;X1_}Yj=`#b|+8v28>`c0m(K$)8@bu9m3QrKqNMi>0{@A+)GD4tKLf#zM^ zu0;fLm8*jYjk{`$2nj5ZYJhzY!?NfKU_W)6L|gH%{~a~38TBfy0;YtyxF8wmr(du9 z_vHVSEehb#3C`6U#9R+g0Sg zy?1;we~kosU`U$_R)dS%v?NjIi31sSq%)L*O#b{+pY`9;Y46etzjrbA>?0G2N*-A6 z8N~Vy#Kz^HUrvIkF#khP*j@w8eh2T317lIhl~bdq86+pGz{#la`R8x}!Cg+Y0njbf zBTRu8$l{P>U5(XPERfBi%@)4-esa;hY)X{V%v^vn8F*rb@tUw*yUJg_yov(_+W2s> zo9b2|CzA)7G;ONIrGfK)_~E$k(C1AB{!z75)uEKEkrO`q_dZOhy#u7p@K> zR`uSu=g*!!v{$p88GrELL;L>Y$BjF?G%6Yrn{O&7e(~aMO!8$$YRQSh7sYLwW$ZPH zc>;`);cy%_U#RTcFF(hFPnwTUTG?1xjbuj>c68--?Lv0%9!H}Ln3%NUS`xxGH)w*m!ir3UBOgA@^XJbaqM{C@ zr3H`gHY(BffRzsQ{T*eMW+J6=#4lmG2(!qc3fz8e?&o)pb|Zg&EF9OzWnIkk$6Gee zN$Q5-kC1d?>Ej?;!*M;#ft5JmtD~=g1}oA!X?ZhIY8FM8`$5Os*fjUS3NW6km%DQ6 zSE10ZbX>Z9@7~nN{GLrF=HW`Bz&k$cVm%6G&Z-ht0de7DQu_e@lC^~Ylp2l`&RytH zY<56)J9V;^BH6@poTX(>Ny#o?9{<%$e5$X*W5AT%mh_21TCc?xWh)(JG2B3l@R4U! zw zs>%QYM>C8YN7K{KEfu*`XoCl0MId8MU#F|;OV$fP_;N$a5W0r_$pMj(Q&NY8b8cY> zpgVD~X%V5|qgo;cfg`NWb^qF403=ZorzoX~0LU9RZujK9T&-AsBe!jppg=pjl64I) z2h8ms`Fukwm~H|q{`oAb8#6PrY15`HD2i{cp`ih%MGshV*rtwd%f^49wEjfbsvvTX z*+$xuM)@haq*qLi`A`kBA&uXhZsCH6q863r8A2C{?+mDo9GXEgm$gE4%B@DjIT+Ms zfj4D0I+VeR=UWZN?k7%mu_sOQg~jG3E;Q*8p_9luR~j7CL;qK;d;bYeGNGskFWpDl zRE)E}#*My7^}$xWfQV4-1#e0-cb_cv41_9$bNSh0#Jjlg83$+<5szR-#00CUr*fFXkGC5@fy}J(3aJ`I-_A;8)i3VE?542tF z=xR1;QfpGrQ=Afq@SKY@2D4zX)6`?_Kh>$Lf?wsw0)Q`34Qh!|K#98QtJkb4f{YaY z>Gi2~KL^2B%;rYJ*$!BAw=XM8EQxvx^(*LL?eBlofRSJ{`g9H*I^?`FCOo_y?y3yC?Mg{$z%0rV>90bFVjRd^ zTxzHUlcP)=++1h#$Ku>yzIx>n-^y;!XpgFuCSOLIEL`~7Vno%ZO6fDB6M%6P`+)+H ze4|2sPQx``6f9(-TMPh@nax;f7_6&I==A*hM%Uu9`{)>}_hgS?hAOY1Z<0buOlGgp z@gQ7NQhIWANV_e#7%<)2ckGCXEGG7QJ~qT306{_`IePMB?u{GGc{ew{KEnKSqp($r zCCZI+hwUT%Q=sKht+?DdtWKVCA}c%nRQY2Bg9ev~Nw%|FII-k3o?yDK%qLE~lUKNU zU5srH-X1+_%^_m!(EL>lR=#XS`7I@UdBBN6>hQ=tbhHhL}E|X*?DIU=XX9R6FNB(vYBR*WK)&`5mm+Y4k@u= z-@X}phu1QpFhbu&iJwYPI30Ks-?Zzv0jCjVW1OyPBYd`WS?!=%ZQni(+SH?bVm$Mv zaB`E^zF$t3r?XNToH<ASF`XX4Z1$i|if`27)hL>lGAcd+ZJjQgVqrz^se_JmRoMgcq=yzTwtZc0hvyyTxX z3sUx3R7dOjwmkEQg>=7$-tk6}k`WpVMH@xA{r%1HThbYGFjD&58UF$~*~!45J@Fex z@FGwp$M&vc=kV+I(15Y+KchnZ{Q6EX2dNN<>6&^7Vg`C{H_uLFqc#k4S+uC9C>7e; zrUO!K;S^@g+AzKwN>6*3h$)*Xk3nFv!SvILvQkjrI1C2;1`bRuNEa9 z@s|c8Y* zqhQI2fW8=w`+B^ebz;e*9yc9&49h3C3jrkf4&&;gFpV~}4p0jda}}`x9j@@*7OtbA z@J*GHRaaM6oZoy94cu%Wan)Ga+Fr){)Vsx!w0Y7aK|wH=)V7F$Diiimt%QgwN9-@6 zA!^W~yBlCU_YOO0Wkm9(Z=4M#f77IF3YU*~AOzyJ1asjYVZvTMKIUuvnSF)V^VmRnPrTt&~IUfY06*|Hb1 zk*TSvP@;%JmXUWKJ=)7jm@{Wi7eLbTr90lwZkWxcC&D-+>zSoSwRTpswiSsT0WIeqr*oqNx+{$E}|+clN9c=yb2>Q2vdvu1&g7J3VIBMG{puA&3? zaS!co=jfP+xm!O(aifpVspS<49QUl>56+;CLYTL*aY-IKz3W!(m!Knd(fqJQ< zrg#2z5@Vl2?c&a56b+FCX>zt`foN|N_dJZ*M`0j~iK$&y{P^r5b0Hvm+Z%bV+&eM; zaBnIbx=BV;HnW-)gyV}tQmzZUe9o<4SL^*AWmsV`nGJ9&AB_)I=X+JJ%EA?RT^Uam zwhR9Xbzkb~G$07r_0rX=O{Pzu&PUsEy@E~&D{Jd|8-jvbh(LyI4^soSy%^nY_?q%@ zN9TIpD1QlIOC$E^$}y+lw)(7QtN~n?&?$=03F1O-$+**pO5YJQ!32|Ix|!k z(swyjsMLR8@}pkAJ

4+eGCUq%pS7t9gfXIEph+fSLE%7(F9lS7gl%MBOAa-rEObM551vlO zBpj>&*#7udH8U<(`hAGft=hD)Ia{XMfpbU5k(O_16RobMLn5I&(;u@CH5lZWOKPI! ztu2FaJ`w$vy}dtBEKtz$-)`H_>^Cn@nRyTZj+NWeYB71sa9DCre+bv})#c4#FI<1E z_BGSf)rA#0SLl13dH_SO_di`OVHSQoz|_Gb1_%EC7~wRBfKsjUY0a0Z#BLuO$K(}v z@8bZI$7c8)h7&Su_c%KoUBrW|&T{el;xaX@53P;VH{Bsg*m;CiY@lXxn*B5+O9s%K zT55!PM5Dy)dGj`H+qUibkIcY~jDbP}@$VKb`gQrc-UQWmxK*%M8xPB=jJlzBtYC`yXE+0(v5hbb=B$&ryA=$RAA6<}-<6HVgg!$W0&9_vsDqUnFl z%DH{}i}!;q1_tqeiQR%*^a%>4A3KbhTH}+PoLqdgLClp$=hy8f6hi4uxd znz8>}bb5LyZdYuXnVDv$rgi64Yzx@rB%+d$5kS`e^0n6!yu8lGk4)&@!g=o81$jQ- zN)OM#Rq}3XIF1fN(a$^e$~NY0vR<3Y$(wQ9xjE%`>L{{&o`Z z03le7jN*dq=a97O|78iZN(odH({bd?zkAxR*xHehzWBtiUR)3 zTs`$lTV>^8M=ZULZY6- zxDPT4hXba1M20{?0pn39?KIJxjZ&S8GhrBo0Sr8LM|K zUZSwchbbc;7*Z<#=Rf%NCJSm0CNa$W{;@)uhzWcHne6Ki*gdxR!5}U+H2D`c(eaKd zusb~mOROtDzHsL0<(nup+h}Oq?7n|(Hjk>~-=BB+>1b({oo_myTg8NGF;{HfY!-K5 z_CMZ@FvG8H5CWYrnTTbYT+HdrWnk62-A9VK8Nv&AypQ&E+2rR8obmBM!q3eyw_Z3wH1n za1|vF&Q$VVYHBJ6@8N$L+o%BT?Zbt4KoA*RdF^0Jz3v!?cSJ@eo=zj!5pbiNR*fCo z6rw)to%pIqoKTxlznuU+Idy*xj3&kN)g;|gGC=~ipjcgG+kIfG^!*lb<*>HTLnaO{ z+qPCGZ4PTvn`*vb&YYs?^LCS^tK*-7^AJ~6A~w~^IQ8TL z>mFg8++{VtR*TWO@K3N&vqF)W)gx;K_s-cCZ?mH%48(S!?>S=7nUf( z3i6b%UcX*H?`u0gSye5iF!6%&g13W+#+fy z>V#|}jK=C(<_PvjOaXy)tnl7Ekao5$q?i?7>C~z&Yy1z%6QiMuZwu_kIYHLRp2Ne4 zYYDoV% zU>K3F9d@v2dgw^PX1Ma@2Cy~=>GJjK$ulem^!($oJnm?k zovYh=c*6Jvs3N4%(P`&ugu{)bMGU+kS{D?lf7&?p>({Q8ap1~1qWI1F$W{(2vy_w+ z52h4*u!i{Moit5I6Kk{7!T-G)1b|DAGtu+i?imlaCr%7H!Z1Xcq-6;1p%B5m}$ zmKFf0sD>`OOV;EfNd78+VrQJp1?syXzY`6)2Fsr{!El9oy(`rhxt zi2>ApAj?W=*YDmak7&R!PK}(uO0xD6J1N247|1No7~w^MIby?pzBxV&L-AT>vO(Y) zeXgOTS^K%bOcJa#1K{|y9)I_6JeCg}5ls~o3VZ%r48rBeSpmV4g|Pa5;wKb`S>l{K z3n`kVNds8cIpi9Z{a~~nDW4r}TwA%`qF0C)gj>%mVaFHB(>84EW)PC|@>l!?%nkLj zcyY(qC7=9q=HboT+9qGD!}`z0e8fhSLeC_}&M6LE(~lif(hknGa(ny}0`a&@Q8)6r zo_o(!J7ObAP|h^fOgZHh^ zshloiJhA#I;d?HB@lWHKS<(sEgZ?a^1$>D{RP&>-fFbXGDSZtTQ~ zSXHh6^r4y5r(vs_zIk!W!7$9?rlc=<LOx-vhrWAe&={!MUa*+%&JE9|bI~rO#>KhN93?EyNRC`<$YUfwoyyR3``_21ts>%JL8MeC=#(wQ- zwsX%V|3#a|n$PY2b4XdW!zkO)%_ep3KCWccRX5vXa~HRb$qaQV7(VdAh?`8wSKe7^ zWOFOm{l?@QFkIRUAn~DUF&OTs0v$@kd)*@3l$Xh!Z1aIy(Ze)aow)fJXV@LD!>5cbzVDYSO%U4!M6vNJxEX+4!fe>ZY?y7Z}m>=+UF& z&9r=56ii#hTByby#N$YOji`V7=Ie};I!VlF<1W5SAb3U{A0V$3HsIKd5 z2neu9-5JA_KJ>JE(IzJAw6mACZ8~CYb)6QQZC*H_@>)%r^!;#WElcD9}W>X)24$;yf^selMglTri51h^m8!y=50f#1C7e4O9U z`gw{^LMd@>4&;;xSOr*YWoL&wzLD+Z$pzT=DTM0NvNaOO(qZk_)S2$?1EIi~(X)XJ z5z80GYgaEYCz}Zl1xM$Y#dj%Tn^zFj&{Mh*Wa~jY-o9WZHq18X7 z5R*BWRWH_2@Zwj&<=I_q?R*?Q>A71WVPTt2oEU`Fesz)3h*}3z)41Cc$`7Zc_%isw ztM>P*goFg9Bi5J3GD8(D%WO;>9E%*TVXOA-o4}^TcNu7YV~iQDo(S~%A~(lWpdPK+ zSb;nC9XxoxVT;xy#br&dlW@FJ*`$e9syVN9(2|E+K;>C^c?ujsZ?bmL(I#5H@3nep zDtV2r7{#A!F26)g<*N0Ci522|wlavqz-+M~@tAYSl% zOmf%J)h*+6F!tK6nYQvYUSs>AfAyp~!uuFNwcJnL|NYUtJPZEZhrb?l_o? zC}9nIf`BhpEZ4$*%%}XI;78{NP7Pna%W$t>O$P0r{`&2UaKMr02yV>bFd5m$DmM31PuwB`CIqbjG;P2;|2N8#61VT%S)Lij*Wd;a zL5O(cN9_MDub1LfasB%BqJENQv&iKNbo1fY>Hl^92bfehiD6O0gg(j9P#mbPdW?{f43G3bYl-)=uUQx?M|K4oFC8Dzx2`m6 z7+NI9Cnox%`#N!Y39t3y)6q7@AgLW%ZUtZg8wN8nGP0-8l3)a{c(Z< z&YuwY%+@x;pq;s?uzIF>Pqm~^B)riY#$ zn86!m6xOrLkRg%Z-0)5l|5xXxL{9tlIMIKg=0X>jrkAVQ0TM1UIZ^H%^3)s-TB~;L z<`Y{-bTu+k2Tx_=JzGZim-k&|pByLox#$C!!`XD6H?JYD6em~EE1l62zy=62GBA1@LQ2-ewM}s{EpVk_j#(=q}Vq zV&gV!(FHHWW-MHtnVPE7bVs+rhylwC)cDaynw!52{KgGw&(telcpTzM#w?SIt=qM0 zOhB2WDG#kf4ThB6+et?to6c66QrX{C92jd+))S@1ZR)AF`@%5RazLuc=BTYEz7J znQcmlC7ty2em-i4eCDmA(CWF{>1n7|GS3SU&xda@CPzjz2H21YY{(D(jiHE(htE(%2)dV8;)heUHS$J^796&D_%%CDO+ZdqaMAgB$ zUGgz^&6moyD7OuWB7i$5n)w`%0T*w*Y*y{!HXaug7e*2aL|I3U*OO%ioY+2q+n~^}!$pEdImVE84p91%5dFf!Znvw-bv_=GlA<_b#0W&P*oJKs{E(W&ph**LF2N!( zdaUX}KtW|?B}dMefrv$J=54srniBUhf@Ec7ZFpsnTKZyWOv!i+&-YL2VmpioD(RW9 zK&P6ZBAf>+9&qYCKRe^&-_P|8!$}#M z_e%?oz+Z_+oECD@XFn#bb)#RpQ$NFP{QNX9&URCt~2P{87f0khnmw8Fa$rv*I8LNR!Q96D8 zTPc`3MsxS|igK{nxu(|`PAB9cO##6iEd8?Moh-fgx69?{mhc4#&8FhVq_~Yg&bnan zmeCbEibZk3HzyaW}r`K`e$74i%ydE)eaSaKf3CYQ$ zfI4#C?d>XrRS3hKW`plVfOiN}c_`STk z+;GO)K=1*+J+yD9Gu6Q%8sL12bKETcDfZ{zgS~!#v6tx19F?_aJvP4IkFG&c*ol_A zJeO1}avSYriX;;TlAAa=ApqNskG3f$49)l-~ zqK~v(w+^-)iBmw0EGRW;7Z;E7H$$Udy_ypuFpXbiNx0+Z*TzlWFZIv6bEh42vJVge znZ^&!V}N?{jN7+w3x*UxhgGbTwsu3lueA3d^Y_JUx$1OQAqU!h5lDOiO*q5%ojwZW(0Da$_jY=aM_FmwnPM( z0%^2-R(ge{tN#ZS*IvsPrHo+dm>;SKsOfKl4T!NGN^*>f|Q;4A}G30DzWX+xsN+ zvuSc~(ID#K%DpBIHl0(dK0el^_75Y07*nw0dT32>qWY&qh@~MxOjw`4d|90{n@%zM z9KF7Lm->)a$x%$8vK-X47i|zK$WNC5X-8Pdc>dAiVZD2|0F5?LR2+@pLYmVtkVuIS zl1kTYP}WgE4vCAUBEj5iVz!K>I&%Ct{ppi3_haqZ#_j#&Rf;QKovOtclrq)8$VJh3 z`X6kqTmV@EcT%t6_foqP-$Xn_rmT4KUil} zU3t)uU@k*0c&vL~>7+(+H3?_+5$@w-Th;yWvY-pz^;Y^bFF0~#`g0N?wt+ha?6`*s*?E~2+Y1ert? zaEaXTf#^s3sZpBPg3o^gqYYc1TcKceH(uGTa^s{wWbw27Z$@`{C;q zcZo`_k~jEn1LhFnvdDwp|I&{O7dFGCA+;q~70=dYwx{!AH&TWGrovvmd^R+FS57~8 z(o=M_$|Xmwje+@~>beBn5r{|1JZ-vsZE|!qMR)1zeor1W%z;cV9(v;gRfy0VKzZ57 z0K{>O9&}3U*$QYyBC_avtX|s6aL~T$iPFnN*ZTgYx1Oe}FyMA1k(al3Wuk<^-|Z^JjyKbGmTdaJh$B6ekV~#wQlBbTdQo7!!$@XK?X=X<&3>;=MP))A#R+GO2#t)OY_()OJ;)#MJn{zgA!C zOI-RFHV_^7k4M8%=z2(!x6f|L><6NcVa@@T0U4lRxqQ6I`3j7gG79XmN^cSn%WgIj za5|Hy(X}o^o%VxKxZlaINeZ7HPo2zzAealC!@WeOJA#W7O{K|azj}+OES#ohGi};d z9^X@*rko*e+-$@H;beI$1gEX@o-RKv1p;vsv)jKU3tY*E(p!`m^X6%9Sl`YcxJNLq zPvu8}x`7-^QjR%rz=u*mm_n}Z6-b<`T+LvczkX%=2nf%l@F^S;LC)~iGA zti#NiY(%1npu!~j+-BiA7Ge0#-v^Cx1~sT7CC{a?q|jE#IE^Fht787k3veVO!xRQf zmO^9b=r4@7c{7)7FYNuF{2S2D+|;aXGs?W9ETZrt-JqDi z5e@YZZQh@ZdmOE~3?<6h0RV{5~YiH*KSUqy=nCp&m ztvV9mfMF;K2K0@{qv2&ZftVc5uN?yLdz5ft&9+Drm`=0M@bEiBO2QR<(F3+cncTI# zyXdb}pV>Elf{ev#g(`-hzm7^^&h7;Xsi}_^t*+BaM+Y)XfuGFw`0y55b%c9CAD#`? z73Njwb!n?q4@5y}0EdKb(O8Zc6N?y3^kMQC6IBeGGZ>L|g`!Zn7D!YXv<2-!DV<+Z za)s)?I$p=*{t529BxNaWBrh;@Nw`!R+b~?{2SW?e}8 zS-E=;Z4I0MtxVNgY+hB1O)N$L6*M`Po#>>bya&HbsN(U6qaeAwJ7i`a3oe^Y8YXLA zqE`Gs=~?PGaQthgIEWm%a;x1^IzH(yG-E&$mlw!dtrmXWlz_m=&i#Xj8`O~kYS@~u zirliskoDZ(vWkkFc4_mQa)gPNzT5l6T-)rM-pStH9(zjDs>c^Lqe*ZkElo`u(ln=_ z5@_1yws|16p-)VV*5}WkG5bubS_i2Mx4IQJlOE%f%S^Chh0ozcom%_7Kb97Mx>x(E z`#0&!&BUax*0`kxxXDF}*`{)Z;FMz^1y-tgGkhW#uZzs!0b7mcHD7rBiC`RniKCn! zq`l$F1;^*E1;}As4MtL8A6q?K_M+YG+NAnp8dSbz(vV))Rm6Ej*fk>ytZZ?PQ;cx!CYu1Sq*zW za*H*bER9mMKQS?yUxg-i*f(M!(N_}rhpNi?(tN*&88 zVuGjGOla@njfszMB=8xgz{aKxQ3&|_!qVE-+S=*;l-3{9II2?e zk*6g@^Zwi4_=GdC43+E({D;d2j{)do;@cyT$Sj$aYS}O3{bKf&S{yF{bsC4w^)yhK z&hutGTA2bo=v^1z?RJNI?VYLZv$30|aDvgVMHXyG*A;mNdsP_M$7^vDmn}dx zlc`hX1Y{$`L_+bHV+`f$P}v1hDD_h}n?)HxucihBrwr9P3aTeWuK(u7@$b9(<6NO# zJ9jQWdp)pr@{}q5pcy0qHHMrE{N%fP6y^V0`UzTR7Q^?L+|H?&cuobGYgS3H#3w*1 z?H&Fg`q->>;rM4fgLTm@SFir=*rw6K0G}_@?LVC${#$BIvk z3#F;eB40W9{yGBCE5}G7B_1eUrT4TgWR%B3wM>=xoRcDuL3^Rksf5luW~( zmhZ6IiC+oGGq1cf&4ga$%f% znoaGC83DIJ_N`mNuXKEG!6*ptx@geZoI~x~5Zs!7D7(~Hk~*w|q)vKY1s%oDY0X({ zwD`-f9%W1a0|Un`et4=iw_Q|Y*|r@2R6mf|Vgg*C0COUI#X@z8x(eqCFLC?yBT_Hp zex(nYfn*)b?;bzgUHWu-YepIGOtMr+9{xZg81_1^_r;AccU`78M4G5KnAgDnu)$XO; z&Q6{@*?9EmgC*|B1;U0ip5lAA?k>}DJT`_zV4RUC?VyksyVutTy*+vM%onov7uFZ( zxTne1UA4ANLf|1MXET9Y0yPN-g1>=E;FsxX-RaR1giN69f&_sbQ9v48NdxB<8%`Wd z?GseC{508n16`O*Vv#KzM;v;xeM5l5E01l~+*e+~9O`%xNG9wtKzRAmr}P4k5y2-z z!N0bbE-uhw&%J%%;B%HA02WiTitR&bVtBd}^0Wi(#Dt*v@SzUQs4;8Qh_t_7z__%VDg}o`h z{gCKl_g#9Sy#?}o6xRd zZnY#o%A2K^`91fTa(=t!$5%z&u?{Lwga~mf^=sF-+K(TX3nfVFDwz@qCI_}M%jxJW zx* zq2cv-%U|aXB2EWz>q>u9uAetFo^7X__5@x-0j7wXDjF?RB~aM={*F`Ur%zir%;S9>24 z9=TCvf|+A%u;vJyD*pDR+KVS*U6RDTbZJZRJwJWF7f3Q5dJIn_6lP6X!`)x}gM&BY za^N*>L)sU&7DquAYl)*mNEd3H03L~c{S>F0a@nH)OHzi$eYNezkQ|z!I z+(~Je9nav*CL9sw7%Owj=qDA`6a^{EAs+Zl3uqTI6_nN%OhOzFDuzz{3zRrUnvA5p z72ibPz9T6u8ZQ5ECO*C!vTzp03MTDIkOu=3dMg*BT?m*^d@U#el?8KEZWRXFa zFF7ACd-7xhA#@H;@GjGd7C#)>z>#Nx{o)BGc>Ih^vTshYzjT+&Ql_#=$wt6h##R_q z<=G$@VY>${atIlrkvJ2Io`^3BL8&{{DF;RB?}d-<&_GC1@1?$@542|&xJBs+0wW2d z1ay+=h<}v*59i0>;z8PI$wV)rEe@zbujAWc(|3>WR&(-51UY`{R&5>w?=Wqb^4XQI zOhzni$}r}-3l}c@{N`R8_L6RZ>h6%qw zV$%}6BhNxKb(k6Hg=dVyHYoHa&sM8&dKWiC0;N-dDta?_U#nB6Iv}d?xt(#GH9(4~ zZjB>?Fx!e>W&_gdafT}Q=5@OYri)2R3SbiMY<5&ouP&ZO)y#B2Z~DBR5Ddk7QwN-; z0Iez!jw`*owrKMy>av}=-PJ+|j9(1SJVM{BcvTSD$mg5! zw;X?~^0)Kx)fL%M2g+z`#ABma2dq&R)@)&bAAXBPlh3wW^{TKTHRFqQJsGcru|b5@ z`}b8LZ(-2Wp9JeWasXtkE4IYO40eKP7dpAI z#J2HX+qYcE#A%2+Y`_Fxkw2i@@tB)G$y>%r!b-jwdk+5WO&o=OyW;-I^E3BEv#ZG; z&f4)pGiJ4Ux%(U-4n3YQrn_Z#+#J$N&)HhWJa`tyM(1d(;Xnvy3Pb2NhA43w6n;=mSxU1Mr`~R@@9^hE-|NnR@5lVv! zl}L!}QARRS*^*tdWtNbUJ_xJyOuHSW? zbDh&U<-YIt{Tk2bV?A->SMhOjZopH6rHo9jT=~I{-p3DEB`1CCRMh-qZ$B$)2`Z!Q%9fp4F$c+NmESXGNVxaUmFG>$Q5LX6~ zP6h>mI3+gLB;M3^lC zJy20mVJhk2a_Q6B+Ce~S*kEkY6ZV=N+lr!y;!nlc;;(}t;I`2DZ+liZ8kq{#3{76A z=UKI_iJyQZEx}dCh#m(57=je{J;qIe z7bE8g1aHCUYHP47VI~AjZgNNuk>EtPgNFh^DQr0F@qb8x0d(BF%uoc^5m}wTFFKu8 zICY8|&~mEq*abWw#L?YA@0|)}7jdIvsB1qwIGeV+uVV%k%xgJBM|X;H82AK zSNr$aJcS17|GM@M038EiSr5X#0ONJhB!v?86P-3%B2zR;gQ#dCNEd=zZB5Hp<4?F+ zh?fDYIbUK>EEEM^4Q%LW7a%2hiI5r6e&Z*aL!3tB`#AUNTvXfM082~*@ky?^J^{)7 zZzrKnLgVoYgg)VAGX@1YLAyYFi)e8&MjdRQ&%#|?nB*EIsscPx?9wza5~y+ng@j&0 zMr>kc21VvNFq-R7sYBXv0%AT;2o!7Z0Z1kE^UvzKg>+ezCk^^9-2keRIi7$s&URSb zgy5?d{Bv(_FPQ6>aQ~nHTd$x{dv)?X*r4cWtqTdbRn|ftK~$|Slf8SeI4h(3p)?`N z>zelwz6hGxCn2#IUWzJI0qDc~1ecdf;uwXC|D{=h zBa|6Xy_xpc1goB8AF2RC(vO+|NvI^|mn2rgsP&KV&$o0BqId?%mmZsD{W<3aJ8a34&e`)(j2P1xdp| zqK^V_LDmS&L9p@jwkY<2m`0-eb|TEs&^SpzrnWZs;a8}IfL`^kp!vs@N&{%={K3;| zYLWB0IG1o-k*YfIeVCUDHmJ|?&%;nKo50^iz*!VsiNA$#r8Os(bDv5#mqSEz7N@gCryLA0C=yLTV4q1wKNxR zPVN6cEmh4!-02t&ObgZ4j)kPDW8O>au|zQ_2in0nf-Nb-o`FXEGLjn5PDF zWVDk!b0EcnUJH(dQ|o=7jI~Ped^~i+7;hZ1QBZ)2S8PFUKNLC1dNhC9mW|6l96o^1 z{H2PfKy+%r=z<|CSZ5sk+H+xw4YW}J3WcX%8ePOFiTe+g`HN4VcHulDa6YJSJH|~- zZ{F;~(W$2PRgNMj%@Kx^4i zz2P(u0cHfOWG!&$V;2%&7FL+T7je~?6~gtJj*eJy?xheQ)`W#e>I}glG1vGQZaROD zO&*B#01qsSJ>t8%$c1^kO)d|uNIEqydq#RX+tH&*^FF{-@DPdC2lY+wC=yaBuuLn3 z)6g_Qt%3emdwdBUzTiUhDI|0t@rRI9C{7>{DF3{79P5va;l%lYW}wABN?~>7J`@DO zkZ@Wx--W56h6-QQI>c`Z@DDNW*l_~&+6KB^Ej5h7l+8MNk z-Q>SZRV|zp0I~^!hSO7c&*(L{7B`@)IgU3EN)O22mn?K^M7oZ%{5Svgr5!+7QI4CT zNqc)U?;CanJ2!V$=ex(ayvdb-`f2b;vyMli*swuI0M&e8td zZL-chIA5PXKMG#dkN87yZsOp!nHmNE)Q?UPRpv9v*cl>d2^dN1Lo5`(B1y-+VKJv5!lTpmq&)APzBDIio1riOC)m3g`+J5_mlU> z@is7-L~e}37UO4Mpd2ERO#VF_d_c{B3I^a?#!ewt5Ym2P?*QJglDz+72BQzqA3~a? zGb#>V35#78&8xpf02dBTWWkZaqAj_40_6MyW~y3mdlPD1f}Y}=L(lhh`E6GM3o0~p zX^0G{UJw@(E9qQ33tFgmeVxGb4)70S-=hEUqxiu#4gqvaIC#K=qD_NdOS2m>_PGXY z6Y_Q8|WlGS((QKJLn+5SMt zfm6yp=VHSlgNb|^-9T{(O1y86%};1g2zNmuA_3z@Nnf3%2D-O(A^NNWIbU4g%b>o8 z5~VlgeRx#VNmQ&TtsSwovGQecsX%=gfO#ai1*<*fT;M)Lc*2$tA1@TSZ9!@)G%>7Z53GE5b z7kl{dF3Oy7X;%g1Fd$K){SR+}S|UnQP&32_NhU}n4qryiS^%eK0$tZyl01O+{VOUw zfQw%HfGMMw%W-}V5WTp#7=-CMJc-x%C2d@%pBY_Osq_h4ij-F053T}BPa_27V2H1Koc<={*e_sFEn*@A~xc< zonIkIgp{xNfLAo4$NxtQ;B}?d32y{`smsWSIaldUcoz(t<{&Cfybe0hRG_wz{HF=2 zPM9=sFyHz1`bm&g>+wH2$c)Y$*fk9W)YqKnYBP9WjT48yAFK|0}*+yiwdU z{;1!PzeSJB2S))(We3huEST?4^foANKJx4fL!>K;Z!~eul-nIqVG+Rz@i+jNB5>H+ z(`&2HHzHPz66pr_j`^NXIjl3Z)0p=lCmax<*dSCYsiLw|4nsF!e2B-^+M4=RUv?bq z?IEaB2+>7^IZ*N>{1F17LY%HRn?)B3lpOFf=pTqF5&S1E+g)?mXrvB%M`ptibYR2g z-3_ulSi%oI9RJnqBZeNj@RPE#vPEk1oanMd|La!oCt_HFwc`UMI^5|PVSv^P&iFxW zMrabOAeCF=2SgA2`XH*&EL7)L5>dZl)8GKo&3(m%MT@cx2lkWnL2*)>=pX7ltRYMK zF!YfiRqRqN9`a$~ND(gyV(`;hwN7GP61^Cn2sj9lJ(-O-;7lK~;x`gMnw^q&2}8>fj_~h*FH)vsmG1SBORwhb?7z9f^O2vT&FSBnqUP zxmRwGI6$m9hwozQ&fEe5WX>niE}{ecibHbk=?HSIAk6JLP%6?r5K>c8D_0M~17Q34 z>Zh9<8o(^NKAr^C{29MSV;2lvdt%oqe_RjX(opdYsm<8GkzWGvNZfMJigQYFW*eim z0>DKa-2Z_y>2mY(LY_TyPujE{*li#wBJV~JdyWjwUO>YCp=e2Bhomv&O!NWD{!qJm*9>2T-mOX!E=cz$Aj{z!72p zEvru(AS1RX&^oW*>w^H=~k0NWYVPB<%S(aH+q zEdXwa2hxHhHcHUqgtEq^JNXpbgj5u$3QquZLHUBKj~;>LWVJ%#jVjEc@X%jAdbpzo zU|7Wtq3|;dx0L~bzMhRORnpQcWttLB3B{^Ifj3!;;7~ydCKC={a?jtrLCk~zB|CVS zV0qjHS;d-FqvL1K@IQ*TvWC15NQ$`1ee@|vy;+MU1Sk`scd8_WzN6%=wBaCa3{1X7 z7K4WY@|?gEnKZ}dN2u>6V5W2#?0;~UI3u}<0)h;Xob;rG*x%8F9fri)8f;6OX&zH; z*n6Q{Az6jJCx{h?JQsjhb-eE(I%g)RC6cC*jDtaMO^!~h#3G3u(2vF8KKFwO=LTZZ ziJqItc^8flLj*_%B7?C~ZK?#%1U>UiMgsaOB8&e=>DFi%h3$_h?X5VZU*c?hf?K^R zx!C|M8o*s5&>=Iv@a6&TPF+eB6A+k8JWvOaz;HC4MN8`gz^W^MsaybGkjj=w@o?6T zC*AGbg$t;jbcDF>IVJWkN`epoZUAjqAc{bG;(>c>wQgZvEF3By94^)(qBvb2GheHH zNpvRv4}s_3l>gga9%M{vZX78H5_$=}<=q>X-;<;d;J^jE3+R#{v%q#mPlt$R0}g+v&jLyw|^#pO&^36>boia)NM@v}*uM0L=5x zcy$AvCLk`BCqOPX9IEiWnRB?Qd`FLazRGLk*FN7sJk8Dl-~8)eQT4t`5VQOG^XH}= z;gn#<{_(fuo=0ayyy1ZA@J%(l>~0Gg9vw9Y>gEni<@uQ>Fq#Du5g}?-$l_jMrrekA z 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 -[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.15)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) +[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.14)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/metacoq/metacoq) MetaCoq is a project formalizing Coq in Coq and providing tools for @@ -54,7 +54,7 @@ The [dependency graph](https://raw.githubusercontent.com/MetaCoq/metacoq.github. might be useful to navigate the project. Statistics: ~150kLoC of Coq, ~30kLoC of OCaml. -### [Template-Coq](https://github.com/MetaCoq/metacoq/tree/coq-8.15/template-coq/theories) +### [Template-Coq](https://github.com/MetaCoq/metacoq/tree/coq-8.14/template-coq/theories) Template-Coq is a quoting library for [Coq](http://coq.inria.fr). It takes `Coq` terms and constructs a representation of their syntax tree as @@ -80,7 +80,7 @@ In addition to this representation of terms, Template Coq includes: - A formalisation of the typing rules reflecting the ones of Coq, covering all of Coq except eta-expansion and template polymorphism. -### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.15/pcuic/theories) +### [PCUIC](https://github.com/MetaCoq/metacoq/tree/coq-8.14/pcuic/theories) PCUIC, the Polymorphic Cumulative Calculus of Inductive Constructions is a cleaned up version of the term language of Coq and its associated @@ -113,10 +113,10 @@ calculus has proofs of standard metatheoretical results: - Weak call-by-value standardization: Normal forms of terms of first-order inductive type can be found via weak call-by-value evaluation. -See the PCUIC [README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/pcuic/theories/README.md) for +See the PCUIC [README](https://github.com/MetaCoq/metacoq/tree/coq-8.14/pcuic/theories/README.md) for a detailed view of the development. -### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.15/safechecker/theories) +### [Safe Checker](https://github.com/MetaCoq/metacoq/tree/coq-8.14/safechecker/theories) Implementation of a fuel-free and verified reduction machine, conversion checker and type checker for PCUIC. This relies on a postulate of @@ -136,10 +136,10 @@ type-checker, one can use: This also includes a verified, efficient re-typing procedure (useful in tactics) in `MetaCoq.SafeChecker.PCUICSafeRetyping`. -See the SafeChecker [README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/safechecker/theories/README.md) for +See the SafeChecker [README](https://github.com/MetaCoq/metacoq/tree/coq-8.14/safechecker/theories/README.md) for a detailed view of the development. -### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.15/erasure/theories) +### [Erasure](https://github.com/MetaCoq/metacoq/tree/coq-8.14/erasure/theories) An erasure procedure to untyped lambda-calculus accomplishing the same as the type and proof erasure phase of the Extraction plugin of Coq. @@ -153,7 +153,7 @@ The erasure pipeline includes verified optimizations to remove lets in construct remove cases on propositional terms, switch to an unguarded fixpoint reduction rule and transform the higher-order constructor applications to first-order blocks for easier translation to usual programming languages. See the erasure -[README](https://github.com/MetaCoq/metacoq/tree/coq-8.15/erasure/theories/README.md) for +[README](https://github.com/MetaCoq/metacoq/tree/coq-8.14/erasure/theories/README.md) for a detailed view of the development. ### [Translations](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations) @@ -162,7 +162,7 @@ Examples of translations built on top of this: - a parametricity plugin in [translations/param_original.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/translations/param_original.v) -- a plugin to negate functional extensionality in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/translations/times_bool_fun.v) +- a plugin to negate functional extensionality in [translations/times_bool_fun.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/translations/times_bool_fun.v) ### Examples @@ -171,19 +171,19 @@ Examples of translations built on top of this: add a constructor to any inductive type is in [examples/add_constructor.v](https://github.com/MetaCoq/metacoq/tree/coq-8.13/examples/add_constructor.v) - An example *extracted* Coq plugin built on the extractable Template Monad, which can be used to - derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. + derive lenses associated to a record type is in [test-suite/plugin-demo](https://github.com/MetaCoq/metacoq/tree/coq-8.14/test-suite/plugin-demo). The plugin runs in OCaml and is a template for writing extracted plugins. -- An example ``constructor`` tactic written using the Template Monad is in [examples/constructor_tac.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/examples/constructor_tac.v), - and a more elaborate verified tautology checker is in [examples/tauto.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/examples/tauto.v). +- An example ``constructor`` tactic written using the Template Monad is in [examples/constructor_tac.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/examples/constructor_tac.v), + and a more elaborate verified tautology checker is in [examples/tauto.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/examples/tauto.v). -- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/erasure_test.v) - and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/safechecker_test.v) show example +- The test-suite files [test-suite/erasure_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/test-suite/erasure_test.v) + and [test-suite/safechecker_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/test-suite/safechecker_test.v) show example uses (and current limitations of) the extracted verified checker and erasure. -- The [test-suite/self_erasure.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/self_erasure.v) file checks that erasure +- The [test-suite/self_erasure.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/test-suite/self_erasure.v) file checks that erasure works on the verified typechecking and erasure programs themselves. -- The test-suite file [test-suite/erasure_live_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.15/test-suite/erasure_live_test.v) +- The test-suite file [test-suite/erasure_live_test.v](https://github.com/MetaCoq/metacoq/tree/coq-8.14/test-suite/erasure_live_test.v) shows uses of the verified erasure running *inside* Coq. ## Papers From 58a3f1f59d36904207756a7480c115b3ea7470a9 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 11:33:58 +0200 Subject: [PATCH 16/43] Revert "Option to see constructors as block in EWcbvEval, needed for extraction in CertiCoq and to OCaml/Malfunction (#716)" This reverts commit 63906fb56f6d586a1d9e9b3f6938ccb68a472008. --- erasure/_CoqProject.in | 1 - erasure/theories/EAst.v | 2 +- erasure/theories/EAstUtils.v | 12 +- erasure/theories/ECSubst.v | 3 +- erasure/theories/EConstructorsAsBlocks.v | 878 ----------------------- erasure/theories/EDeps.v | 17 +- erasure/theories/EEtaExpanded.v | 69 +- erasure/theories/EEtaExpandedFix.v | 255 ++++--- erasure/theories/EGlobalEnv.v | 2 +- erasure/theories/EInduction.v | 19 +- erasure/theories/EInlineProjections.v | 29 +- erasure/theories/ELiftSubst.v | 11 +- erasure/theories/EOptimizePropDiscr.v | 71 +- erasure/theories/EPretty.v | 4 +- erasure/theories/EReflect.v | 9 - erasure/theories/ERemoveParams.v | 91 ++- erasure/theories/ESpineView.v | 2 +- erasure/theories/ETransform.v | 57 +- erasure/theories/EWcbvEval.v | 280 ++------ erasure/theories/EWcbvEvalEtaInd.v | 93 ++- erasure/theories/EWcbvEvalInd.v | 175 ++--- erasure/theories/EWellformed.v | 9 +- erasure/theories/Erasure.v | 14 +- erasure/theories/ErasureCorrectness.v | 6 +- erasure/theories/ErasureFunction.v | 4 +- erasure/theories/ErasureProperties.v | 18 +- erasure/theories/Extract.v | 6 +- 27 files changed, 429 insertions(+), 1708 deletions(-) delete mode 100644 erasure/theories/EConstructorsAsBlocks.v diff --git a/erasure/_CoqProject.in b/erasure/_CoqProject.in index e4d218591..617a15e08 100644 --- a/erasure/_CoqProject.in +++ b/erasure/_CoqProject.in @@ -34,5 +34,4 @@ theories/EProgram.v theories/ERemoveParams.v theories/EInlineProjections.v theories/ETransform.v -theories/EConstructorsAsBlocks.v theories/Erasure.v diff --git a/erasure/theories/EAst.v b/erasure/theories/EAst.v index 16bf3e1a7..b0c8bbd72 100644 --- a/erasure/theories/EAst.v +++ b/erasure/theories/EAst.v @@ -33,7 +33,7 @@ Inductive term : Set := | tLetIn : name -> term (* the term *) -> term -> term | tApp : term -> term -> term | tConst : kername -> term -| tConstruct : inductive -> nat -> list term -> term +| tConstruct : inductive -> nat -> term | tCase : (inductive * nat) (* # of parameters *) -> term (* discriminee *) -> list (list name * term) (* branches *) -> term | tProj : projection -> term -> term diff --git a/erasure/theories/EAstUtils.v b/erasure/theories/EAstUtils.v index 53c531708..6db80c98d 100644 --- a/erasure/theories/EAstUtils.v +++ b/erasure/theories/EAstUtils.v @@ -283,7 +283,7 @@ Definition isCoFix t := Definition isConstruct t := match t with - | tConstruct _ _ _ => true + | tConstruct _ _ => true | _ => false end. @@ -328,8 +328,6 @@ Definition string_of_def {A : Set} (f : A -> string) (def : def A) := "(" ^ string_of_name (dname def) ^ "," ^ f (dbody def) ^ "," ^ string_of_nat (rarg def) ^ ")". -Definition maybe_string_of_list {A} f (l : list A) := match l with [] => "" | _ => string_of_list f l end. - Fixpoint string_of_term (t : term) : string := match t with | tBox => "∎" @@ -340,7 +338,7 @@ Fixpoint string_of_term (t : term) : string := | tLetIn na b t => "LetIn(" ^ string_of_name na ^ "," ^ string_of_term b ^ "," ^ string_of_term t ^ ")" | tApp f l => "App(" ^ string_of_term f ^ "," ^ string_of_term l ^ ")" | tConst c => "Const(" ^ string_of_kername c ^ ")" - | tConstruct i n args => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ maybe_string_of_list string_of_term args ^ ")" + | tConstruct i n => "Construct(" ^ string_of_inductive i ^ "," ^ string_of_nat n ^ ")" | tCase (ind, i) t brs => "Case(" ^ string_of_inductive ind ^ "," ^ string_of_nat i ^ "," ^ string_of_term t ^ "," ^ string_of_list (fun b => string_of_term (snd b)) brs ^ ")" @@ -356,10 +354,8 @@ Fixpoint string_of_term (t : term) : string := Fixpoint term_global_deps (t : EAst.term) := match t with - | EAst.tConst kn => KernameSet.singleton kn - | EAst.tConstruct {| inductive_mind := kn |} _ args => - List.fold_left (fun acc x => KernameSet.union (term_global_deps x) acc) args - (KernameSet.singleton kn) + | EAst.tConst kn + | EAst.tConstruct {| inductive_mind := kn |} _ => KernameSet.singleton kn | EAst.tLambda _ x => term_global_deps x | EAst.tApp x y | EAst.tLetIn _ x y => KernameSet.union (term_global_deps x) (term_global_deps y) diff --git a/erasure/theories/ECSubst.v b/erasure/theories/ECSubst.v index 65a0695d3..7edceca5d 100644 --- a/erasure/theories/ECSubst.v +++ b/erasure/theories/ECSubst.v @@ -36,7 +36,6 @@ Fixpoint csubst t k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (csubst t k')) mfix in tCoFix mfix' idx - | tConstruct ind n args => tConstruct ind n (map (csubst t k) args) | x => x end. @@ -58,7 +57,7 @@ Proof. destruct (nth_error_spec [t] (n - k) ). simpl in l0; lia. now rewrite Nat.sub_1_r. - + now destruct (Nat.leb_spec k n); try lia. + + now destruct (Nat.leb_spec k n); try lia. Qed. Lemma substl_subst s u : forallb (closedn 0) s -> diff --git a/erasure/theories/EConstructorsAsBlocks.v b/erasure/theories/EConstructorsAsBlocks.v deleted file mode 100644 index 8bc48e29b..000000000 --- a/erasure/theories/EConstructorsAsBlocks.v +++ /dev/null @@ -1,878 +0,0 @@ -(* Distributed under the terms of the MIT license. *) -From Coq Require Import Utf8 Program. -From MetaCoq.Template Require Import config utils Kernames BasicAst EnvMap. -From MetaCoq.Erasure Require Import EAst EAstUtils EInduction EArities - ELiftSubst ESpineView EGlobalEnv EWellformed EEnvMap - EWcbvEval EEtaExpanded ECSubst EWcbvEvalEtaInd EProgram. - -Local Open Scope string_scope. -Set Asymmetric Patterns. -Import MCMonadNotation. - -From Equations Require Import Equations. -Set Equations Transparent. -Local Set Keyed Unification. -From Coq Require Import ssreflect ssrbool. - -(** We assume [Prop size x < size y) := - | e with TermSpineView.view e := { - | tRel i => EAst.tRel i - | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => transform_blocks x)) - | tLambda na M => EAst.tLambda na (transform_blocks M) - | tApp u v napp nnil with construct_viewc u := - { | view_construct ind i block_args with lookup_constructor_pars_args Σ ind i := { - | Some (npars, nargs) => - let args := map_InP v (fun x H => transform_blocks x) in - let '(args, rest) := MCList.chop nargs args in - EAst.mkApps (EAst.tConstruct ind i args) rest - | None => - let args := map_InP v (fun x H => transform_blocks x) in - EAst.tConstruct ind i args } - | view_other _ _ => mkApps (transform_blocks u) (map_InP v (fun x H => transform_blocks x)) } - - | tLetIn na b b' => EAst.tLetIn na (transform_blocks b) (transform_blocks b') - | tCase ind c brs => - let brs' := map_InP brs (fun x H => (x.1, transform_blocks x.2)) in - EAst.tCase (ind.1, 0) (transform_blocks c) brs' - | tProj p c => EAst.tProj {| proj_ind := p.(proj_ind); proj_npars := 0; proj_arg := p.(proj_arg) |} (transform_blocks c) - | tFix mfix idx => - let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in - EAst.tFix mfix' idx - | tCoFix mfix idx => - let mfix' := map_InP mfix (fun d H => {| dname := dname d; dbody := transform_blocks d.(dbody); rarg := d.(rarg) |}) in - EAst.tCoFix mfix' idx - | tBox => EAst.tBox - | tVar n => EAst.tVar n - | tConst n => EAst.tConst n - | tConstruct ind i block_args => EAst.tConstruct ind i [] }. - Proof. - all:try lia. - all:try apply (In_size); tea. - all:try lia. - - now apply (In_size id size). - - change (fun x => size (id x)) with size in H. - eapply (In_size id size) in H. unfold id in H. - change (fun x => size x) with size in H. - rewrite size_mkApps. cbn. lia. - - change (fun x => size (id x)) with size in H. - eapply (In_size id size) in H. unfold id in H. - change (fun x => size x) with size in H. - rewrite size_mkApps. cbn. lia. - - now eapply size_mkApps_f. - - change (fun x => size (id x)) with size in H. - eapply (In_size id size) in H. unfold id in H. - change (fun x => size x) with size in H. - pose proof (size_mkApps_l napp nnil). lia. - - eapply (In_size snd size) in H. cbn in *. lia. - Qed. - - End Def. - - Hint Rewrite @map_InP_spec : transform_blocks. - - Arguments eqb : simpl never. - - Opaque transform_blocks_unfold_clause_1. - Opaque transform_blocks. - Opaque isEtaExp. - Opaque isEtaExp_unfold_clause_1. - - - Lemma chop_firstn_skipn {A} n (l : list A) : chop n l = (firstn n l, skipn n l). - Proof using Type. - induction n in l |- *; destruct l; simpl; auto. - now rewrite IHn skipn_S. - Qed. - - Lemma chop_eq {A} n (l : list A) l1 l2 : chop n l = (l1, l2) -> l = l1 ++ l2. - Proof. - rewrite chop_firstn_skipn. intros [= <- <-]. - now rewrite firstn_skipn. - Qed. - - Lemma closed_transform_blocks t k : closedn k t -> closedn k (transform_blocks t). - Proof using Type. - funelim (transform_blocks t); simp transform_blocks; rewrite <-?transform_blocks_equation_1; toAll; simpl; - intros; try easy; - rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; - unfold test_def in *; - simpl closed in *; - try solve [simpl; subst; simpl closed; f_equal; auto; rtoProp; solve_all; solve_all]; try easy. - - rewrite !closedn_mkApps in H1 *. - rtoProp; intuition auto. solve_all. - - destruct (chop nargs v) eqn:E. - erewrite chop_map; eauto. - eapply chop_eq in E as ->. - rewrite !closedn_mkApps in H0 *. - rtoProp; intuition auto; cbn; solve_all; eapply All_app in H1; - repeat solve_all. - - rewrite !closedn_mkApps /= in H0 *. rtoProp. - repeat solve_all. - Qed. - - Hint Rewrite @forallb_InP_spec : isEtaExp. - Transparent isEtaExp_unfold_clause_1. - - Transparent transform_blocks_unfold_clause_1. - - Local Lemma transform_blocks_mkApps f v : - ~~ isApp f -> - transform_blocks (mkApps f v) = match construct_viewc f with - | view_construct ind i block_args => - match lookup_constructor_pars_args Σ ind i with - | Some (npars, nargs) => - let args := map transform_blocks v in - let '(args, rest) := MCList.chop nargs args in - EAst.mkApps (EAst.tConstruct ind i args) rest - | None => - let args := map transform_blocks v in - EAst.tConstruct ind i args - end - | view_other _ _ => mkApps (transform_blocks f) (map transform_blocks v) - end. - Proof using Type. - intros napp; simp transform_blocks. - destruct (construct_viewc f) eqn:vc. - - destruct lookup_constructor_pars_args as [[]|] eqn:heq. - destruct v eqn:hargs. cbn. - * destruct n1 => //. - * set (v' := TermSpineView.view _). - destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. - rewrite eq /=. rewrite heq /=. now simp transform_blocks. - * destruct v eqn:hargs => //. - set (v' := TermSpineView.view _). - destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. - rewrite eq /=. rewrite heq /=. now simp transform_blocks. - - destruct v eqn:hargs => //. - simp transform_blocks. - set (v' := TermSpineView.view _). - destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. - rewrite eq /= vc /=. now simp transform_blocks. - Qed. - - Lemma transform_blocks_decompose f : - transform_blocks f = - let (fn, args) := decompose_app f in - match construct_viewc fn with - | view_construct kn c _ => - match lookup_constructor_pars_args Σ kn c with - | Some (npars, nargs) => - let args := map (transform_blocks) args in - let '(args, rest) := MCList.chop nargs args in - mkApps (tConstruct kn c args) rest - | None => - let args := map transform_blocks args in - tConstruct kn c args - end - | view_other fn nconstr => - mkApps (transform_blocks fn) (map transform_blocks args) - end. - Proof. - destruct (decompose_app f) eqn:da. - rewrite (decompose_app_inv da). rewrite transform_blocks_mkApps. - now eapply decompose_app_notApp. - destruct construct_viewc; try reflexivity. - Qed. - - Lemma transform_blocks_mkApps_eta (P : term -> Prop) fn args : - (* wf_glob Σ -> - *)~~ EAst.isApp fn -> - isEtaExp Σ (mkApps fn args) -> - (match construct_viewc fn with - | view_construct kn c block_args => - forall pars nargs, - lookup_constructor_pars_args Σ kn c = Some (pars, nargs) -> - let cargs := map transform_blocks args in - let '(cargs, rest) := MCList.chop nargs cargs in - P (mkApps (tConstruct kn c cargs) rest) - | view_other fn nconstr => - P (mkApps (transform_blocks fn) (map transform_blocks args)) - end) -> - P (transform_blocks (mkApps fn args)). - Proof. - intros napp. - move/isEtaExp_mkApps. - rewrite decompose_app_mkApps //. - destruct construct_viewc eqn:vc. - + rewrite /isEtaExp_app. - destruct lookup_constructor_pars_args as [[]|] eqn:hl. - rewrite transform_blocks_decompose decompose_app_mkApps // /= hl. - move=> /andP[] /andP[] /Nat.leb_le hargs etaargs bargs. - destruct block_args; invs bargs. - move/(_ _ _ eq_refl). - destruct chop eqn:eqch => //. - move => /andP[] => //. - + intros ht. rewrite transform_blocks_mkApps // vc //. - Qed. - - Lemma transform_blocks_mkApps_eta_fn f args : isEtaExp Σ f -> - transform_blocks (mkApps f args) = mkApps (transform_blocks f) (map (transform_blocks) args). - Proof. - intros ef. - destruct (decompose_app f) eqn:df. - rewrite (decompose_app_inv df) in ef |- *. - rewrite -mkApps_app. - move/isEtaExp_mkApps: ef. - pose proof (decompose_app_notApp _ _ _ df). - rewrite decompose_app_mkApps /= //. - rewrite transform_blocks_decompose. - rewrite decompose_app_mkApps /= //. - destruct (construct_viewc t) eqn:vc. - + move=> /andP[] etanl etal. - destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. - cbn. - rewrite chop_firstn_skipn. - rewrite transform_blocks_decompose. - rewrite decompose_app_mkApps // /= hl. - rewrite chop_firstn_skipn. - rewrite - mkApps_app. - move: etanl. rewrite /isEtaExp_app hl. - move => /andP[] /Nat.leb_le => hl' hall. - rewrite firstn_map. - rewrite firstn_app. - assert (args' - #|l| = 0) as -> by lia. - rewrite firstn_O // app_nil_r. f_equal. f_equal. - rewrite firstn_map //. rewrite map_app skipn_map. - rewrite skipn_app. len. - assert (args' - #|l| = 0) as -> by lia. - now rewrite skipn_0 -skipn_map. - move: etanl. rewrite /isEtaExp_app hl //. - + move => /andP[] etat etal. - rewrite (transform_blocks_decompose (mkApps t l)). - rewrite decompose_app_mkApps //. - rewrite vc. rewrite -mkApps_app. f_equal. - now rewrite map_app. - Qed. - - Lemma transform_blocks_csubst a k b : - closed a -> - isEtaExp Σ a -> - isEtaExp Σ b -> - transform_blocks (ECSubst.csubst a k b) = ECSubst.csubst (transform_blocks a) k (transform_blocks b). - Proof using Type. - funelim (transform_blocks b); cbn; simp transform_blocks isEtaExp; rewrite -?isEtaExp_equation_1 -?transform_blocks_equation_1; toAll; simpl; - intros; try easy; - rewrite -> ?map_map_compose, ?compose_on_snd, ?compose_map_def, ?map_length; - unfold test_def in *; - simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - - - destruct Nat.compare => //. - - f_equal. solve_all. move/andP: b => [] _ he. solve_all. - - rewrite csubst_mkApps. - rtoProp. solve_all. - assert ( - mkApps (transform_blocks u) (map transform_blocks v) = - transform_blocks (mkApps u v) - ) as ->. { rewrite transform_blocks_mkApps. eauto. now rewrite Heq. } - eapply (transform_blocks_mkApps_eta (fun x => transform_blocks (mkApps (csubst a k u) (map (csubst a k) v)) = - csubst (transform_blocks a) k x)); eauto. - rewrite Heq. - rewrite csubst_mkApps. - rewrite isEtaExp_mkApps_napp in H3 => //. rewrite Heq in H3. - rtoProp. rename H3 into etau. rename H4 into etav. - rewrite - H //. - rewrite transform_blocks_mkApps_eta_fn. - now eapply etaExp_csubst. - f_equal. - rewrite !map_map_compose. solve_all. - - pose proof (etaExp_csubst _ _ k _ H1 H2). - rewrite !csubst_mkApps /= in H3 *. - assert (map (csubst a k) v <> []). - { destruct v; cbn; congruence. } - rewrite transform_blocks_mkApps //. - rewrite isEtaExp_Constructor // in H3. - move: H3 => /andP[] /andP[]. rewrite map_length. move=> etaapp etav bargs. - destruct block_args; invs bargs. - cbn -[lookup_constructor_pars_args]. - unfold isEtaExp_app in etaapp. - rewrite Heq in etaapp |- *. - destruct (chop nargs v) eqn:heqc. - rewrite map_map_compose. - erewrite !chop_map; eauto. - rewrite csubst_mkApps. cbn. - eapply chop_eq in heqc as ->. - cbn. - rewrite isEtaExp_Constructor in H2. - move: H2 => /andP[] /andP[] He1 He2 He3. - cbn. f_equal. f_equal. - all: rewrite !map_map_compose; solve_all; eapply All_app in He2. - all: repeat solve_all. - - pose proof (etaExp_csubst _ _ k _ H1 H2). - rewrite !csubst_mkApps /= in H3 *. - assert (map (csubst a k) v <> []). - { destruct v; cbn; congruence. } - rewrite transform_blocks_mkApps //. - rewrite isEtaExp_Constructor // in H3. - move/andP : H3 => [] /andP[]. rewrite map_length. move=> etaapp etav bargs. - cbn -[lookup_inductive_pars]. - unfold isEtaExp_app in etaapp. - destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => //. - Qed. - - Lemma transform_blocks_substl s t : - forallb (closedn 0) s -> - forallb (isEtaExp Σ) s -> - isEtaExp Σ t -> - transform_blocks (substl s t) = substl (map transform_blocks s) (transform_blocks t). - Proof using Type. - induction s in t |- *; simpl; auto. - move=> /andP[] cla cls /andP[] etaa etas etat. - rewrite IHs //. now eapply etaExp_csubst. f_equal. - now rewrite transform_blocks_csubst. - Qed. - - Lemma transform_blocks_iota_red pars args br : - forallb (closedn 0) args -> - forallb (isEtaExp Σ) args -> - isEtaExp Σ br.2 -> - transform_blocks (EGlobalEnv.iota_red pars args br) = EGlobalEnv.iota_red pars (map transform_blocks args) (on_snd transform_blocks br). - Proof using Type. - intros cl etaargs etabr. - unfold EGlobalEnv.iota_red. - rewrite transform_blocks_substl //. - rewrite forallb_rev forallb_skipn //. - rewrite forallb_rev forallb_skipn //. - now rewrite map_rev map_skipn. - Qed. - - Lemma transform_blocks_fix_subst mfix : EGlobalEnv.fix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.fix_subst mfix). - Proof using Type. - unfold EGlobalEnv.fix_subst. - rewrite map_length. - generalize #|mfix|. - induction n; simpl; auto. - f_equal; auto. now simp transform_blocks. - Qed. - - Lemma transform_blocks_cofix_subst mfix : EGlobalEnv.cofix_subst (map (map_def transform_blocks) mfix) = map transform_blocks (EGlobalEnv.cofix_subst mfix). - Proof using Type. - unfold EGlobalEnv.cofix_subst. - rewrite map_length. - generalize #|mfix|. - induction n; simpl; auto. - f_equal; auto. now simp transform_blocks. - Qed. - - Lemma transform_blocks_cunfold_fix mfix idx n f : - forallb (closedn 0) (fix_subst mfix) -> - forallb (fun d => isLambda (dbody d) && isEtaExp Σ (dbody d)) mfix -> - cunfold_fix mfix idx = Some (n, f) -> - cunfold_fix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). - Proof using Type. - intros hfix heta. - unfold cunfold_fix. - rewrite nth_error_map. - destruct nth_error eqn:heq. - intros [= <- <-] => /=. f_equal. f_equal. - rewrite transform_blocks_substl //. - now apply isEtaExp_fix_subst. - solve_all. eapply nth_error_all in heta; tea. cbn in heta. - rtoProp; intuition auto. - f_equal. f_equal. apply transform_blocks_fix_subst. - discriminate. - Qed. - - - Lemma transform_blocks_cunfold_cofix mfix idx n f : - forallb (closedn 0) (cofix_subst mfix) -> - forallb (isEtaExp Σ ∘ dbody) mfix -> - cunfold_cofix mfix idx = Some (n, f) -> - cunfold_cofix (map (map_def transform_blocks) mfix) idx = Some (n, transform_blocks f). - Proof using Type. - intros hcofix heta. - unfold cunfold_cofix. - rewrite nth_error_map. - destruct nth_error eqn:heq. - intros [= <- <-] => /=. f_equal. - rewrite transform_blocks_substl //. - now apply isEtaExp_cofix_subst. - solve_all. now eapply nth_error_all in heta; tea. - f_equal. f_equal. apply transform_blocks_cofix_subst. - discriminate. - Qed. - - Lemma transform_blocks_nth {n l d} : - transform_blocks (nth n l d) = nth n (map transform_blocks l) (transform_blocks d). - Proof using Type. - induction l in n |- *; destruct n; simpl; auto. - Qed. - - Definition switch_constructor_as_block fl : WcbvFlags := - EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) fl.(@with_guarded_fix) true. - -End transform_blocks. - -Definition transform_blocks_constant_decl Σ cb := - {| cst_body := option_map (transform_blocks Σ) cb.(cst_body) |}. - -Definition transform_blocks_decl Σ d := - match d with - | ConstantDecl cb => ConstantDecl (transform_blocks_constant_decl Σ cb) - | InductiveDecl idecl => d - end. - -Definition transform_blocks_env Σ := - map (on_snd (transform_blocks_decl Σ)) Σ. - -Definition transform_blocks_program (p : eprogram_env) := - (transform_blocks_env p.1, transform_blocks p.1 p.2). - -Definition term_flags := - {| - has_tBox := true; - has_tRel := true; - has_tVar := false; - has_tEvar := false; - has_tLambda := true; - has_tLetIn := true; - has_tApp := true; - has_tConst := true; - has_tConstruct := true; - has_tCase := true; - has_tProj := false; - has_tFix := true; - has_tCoFix := false - |}. - -Definition env_flags := - {| has_axioms := false; - has_cstr_params := false; - term_switches := term_flags |}. - -Local Existing Instance env_flags. - -Lemma Qpreserves_wellformed Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. -Proof. - intros clΣ. - split. - - red. move=> n t. - destruct t; cbn; intuition auto; try solve [constructor; auto]. - eapply on_letin; rtoProp; intuition auto. - eapply on_app; rtoProp; intuition auto. - eapply on_case; rtoProp; intuition auto. solve_all. - eapply on_fix. solve_all. move/andP: H => [] _ ha. solve_all. - - red. intros kn decl. - move/(lookup_env_wellformed clΣ). - unfold wf_global_decl. destruct cst_body => //. - - red. move=> hasapp n t args. rewrite wellformed_mkApps //. - split; intros; rtoProp; intuition auto; solve_all. - - red. cbn => //. - (* move=> hascase n ci discr brs. simpl. - destruct lookup_inductive eqn:hl => /= //. - split; intros; rtoProp; intuition auto; solve_all. *) - - red. move=> hasproj n p discr. now cbn in hasproj. - - red. move=> t args clt cll. - eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. - - red. move=> n mfix idx. cbn. unfold wf_fix. - split; intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. - - red. move=> n mfix idx. cbn. - split; intros; rtoProp; intuition auto; solve_all. -Qed. - -Definition block_wcbv_flags := - {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := true |}. - -Local Hint Resolve wellformed_closed : core. - -Lemma wellformed_lookup_inductive_pars Σ kn mdecl : - wf_glob Σ -> - lookup_minductive Σ kn = Some mdecl -> mdecl.(ind_npars) = 0. -Proof. - induction 1; cbn => //. - case: eqb_spec => [|]. - - intros ->. destruct d => //. intros [= <-]. - cbn in H0. unfold wf_minductive in H0. - rtoProp. cbn in H0. now eapply eqb_eq in H0. - - intros _. eapply IHwf_glob. -Qed. - -Lemma wellformed_lookup_constructor_pars {Σ kn c mdecl idecl cdecl} : - wf_glob Σ -> - lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> mdecl.(ind_npars) = 0. -Proof. - intros wf. cbn -[lookup_minductive]. - destruct lookup_minductive eqn:hl => //. - do 2 destruct nth_error => //. - eapply wellformed_lookup_inductive_pars in hl => //. congruence. -Qed. - -Lemma lookup_constructor_pars_args_spec {Σ ind n mdecl idecl cdecl} : - wf_glob Σ -> - lookup_constructor Σ ind n = Some (mdecl, idecl, cdecl) -> - lookup_constructor_pars_args Σ ind n = Some (mdecl.(ind_npars), cdecl.(cstr_nargs)). -Proof. - cbn -[lookup_constructor] => wfΣ. - destruct lookup_constructor as [[[mdecl' idecl'] [pars args]]|] eqn:hl => //. - intros [= -> -> <-]. cbn. f_equal. -Qed. - -Lemma wellformed_lookup_constructor_pars_args {Σ ind n block_args} : - wf_glob Σ -> - wellformed Σ 0 (EAst.tConstruct ind n block_args) -> - ∑ args, lookup_constructor_pars_args Σ ind n = Some (0, args). -Proof. - intros wfΣ wf. cbn -[lookup_constructor] in wf. - destruct lookup_constructor as [[[mdecl idecl] cdecl]|] eqn:hl => //. - exists cdecl.(cstr_nargs). - pose proof (wellformed_lookup_constructor_pars wfΣ hl). - eapply lookup_constructor_pars_args_spec in hl => //. congruence. -Qed. - -Lemma constructor_isprop_pars_decl_params {Σ ind c b pars cdecl} : - wf_glob Σ -> - constructor_isprop_pars_decl Σ ind c = Some (b, pars, cdecl) -> pars = 0. -Proof. - intros hwf. - rewrite /constructor_isprop_pars_decl /lookup_constructor /lookup_inductive. - destruct lookup_minductive as [mdecl|] eqn:hl => /= //. - do 2 destruct nth_error => //. - eapply wellformed_lookup_inductive_pars in hl => //. congruence. -Qed. - -Lemma skipn_ge m {A} (l : list A) : - m >= length l -> skipn m l = []. -Proof. - induction l in m |- *. - - destruct m; reflexivity. - - cbn. destruct m; try lia. intros H. - eapply IHl. lia. -Qed. - -Lemma chop_all {A} (l : list A) m : - m >= length l -> chop m l = (l, nil). -Proof. - intros Hl. rewrite chop_firstn_skipn. - rewrite firstn_ge; try lia. rewrite skipn_ge; try lia. - eauto. -Qed. - -Lemma transform_blocks_tApp Σ t a (P : term -> Set) k : - wf_glob Σ -> - wellformed Σ k (tApp t a) -> - (let (fn, args) := decompose_app (tApp t a) in - match construct_viewc fn with - | view_construct kn c block_args => - match lookup_constructor_pars_args Σ kn c with - | Some (0, nargs) => - let cargs := map (transform_blocks Σ) args in - let '(cargs, rest) := MCList.chop nargs cargs in - (args <> [] /\ t = mkApps (tConstruct kn c block_args) (remove_last args) /\ a = last args a) -> - P (mkApps (tConstruct kn c cargs) rest) - | _ => True - end - | view_other fn nconstr => - P (tApp (transform_blocks Σ t) (transform_blocks Σ a)) - end) -> - P (transform_blocks Σ (tApp t a)). -Proof. - intros wfΣ wf. - rewrite (transform_blocks_decompose _ (tApp t a)). - destruct decompose_app eqn:da. - pose proof (decompose_app_notApp _ _ _ da). - pose proof (EInduction.decompose_app_app _ _ _ _ da). - destruct construct_viewc eqn:vc. - + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. - cbn in wf. - move: wf => /andP[]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. - destruct (wellformed_lookup_constructor_pars_args wfΣ wfc). - rewrite e. cbn. - destruct chop eqn:eqch => //. - intros. apply H1. intuition auto. - + pose proof (decompose_app_notApp _ _ _ da). - pose proof (EInduction.decompose_app_app _ _ _ _ da). - eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. - rewrite Ha Ht. - rewrite transform_blocks_mkApps // vc. - rewrite {3} (remove_last_last l a) => //. - now rewrite map_app mkApps_app. -Qed. - -Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e block_args mdecl idecl cdecl : - with_constructor_as_block = false -> - lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> - eval Σ (mkApps (tConstruct kn c block_args) args) e -> - ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (eval Σ) args args' × block_args = [] × #|args| <= cstr_arity mdecl cdecl. -Proof. - intros hblock hlook. - revert e; induction args using rev_ind; intros e. - - intros ev. depelim ev. congruence. exists []=> //. invs i. destruct block_args; invs H0 => //. cbn. repeat split. econstructor. lia. - - intros ev. rewrite mkApps_app /= in ev. - depelim ev; try solve_discr. - destruct (IHargs _ ev1) as [? []]. solve_discr. - all:try specialize (IHargs _ ev1) as [? []]; try solve_discr; try noconf H. - * destruct p as (? & ? & ?). exists (x0 ++ [a']). split => //. - rewrite mkApps_app /= //. split => //. eapply All2_app; eauto. - split => //. eapply All2_length in a. len. rewrite e1 in hlook; invs hlook. lia. - * destruct p as (? & ? & ?). subst f'. - cbn in i. - rewrite isConstructApp_mkApps in i. cbn in i. - rewrite orb_true_r in i. cbn in i. congruence. - * now cbn in i. -Qed. - -Lemma transform_blocks_isConstructApp Σ t : - wf_glob Σ -> wellformed Σ 0 t -> - isConstructApp (transform_blocks Σ t) = isConstructApp t. -Proof. - intros Hwf Hwf'. - induction t; try now cbn; eauto. - eapply transform_blocks_tApp; eauto. - destruct decompose_app. - destruct construct_viewc. - - destruct lookup_constructor_pars_args as [ [[]] | ]; eauto. - cbn. destruct chop. intros (? & ? & ?). subst. - rewrite -[tApp _ _](mkApps_app _ _ [t2]). - rewrite !isConstructApp_mkApps. cbn. reflexivity. - - change (tApp t1 t2) with (mkApps t1 [t2]). - change (tApp (transform_blocks Σ t1) (transform_blocks Σ t2)) with - (mkApps (transform_blocks Σ t1) [transform_blocks Σ t2]). - rewrite !isConstructApp_mkApps. - eapply IHt1. cbn in Hwf'. rtoProp. intuition. -Qed. - -Lemma lookup_env_transform_blocks Σ kn : - lookup_env (transform_blocks_env Σ) kn = - option_map (transform_blocks_decl Σ) (lookup_env Σ kn). -Proof. - unfold transform_blocks_env. - induction Σ at 2 4; simpl; auto. - case: eqb_spec => //. -Qed. - -Lemma transform_blocks_declared_constant Σ c decl : - declared_constant Σ c decl -> declared_constant (transform_blocks_env Σ) c (transform_blocks_constant_decl Σ decl). -Proof. - intros H. red in H; red. - rewrite lookup_env_transform_blocks H //. -Qed. - -Lemma lookup_constructor_transform_blocks Σ ind c : -lookup_constructor (transform_blocks_env Σ) ind c = -lookup_constructor Σ ind c. -Proof. - unfold lookup_constructor, lookup_inductive, lookup_minductive in *. - rewrite lookup_env_transform_blocks. - destruct lookup_env as [ [] | ]; cbn; congruence. -Qed. - -Lemma transform_blocks_eval (fl := EWcbvEval.target_wcbv_flags) : - forall Σ, isEtaExp_env Σ -> wf_glob Σ -> - forall t t', - wellformed Σ 0 t -> - isEtaExp Σ t -> - EWcbvEval.eval Σ t t' -> - @EWcbvEval.eval block_wcbv_flags (transform_blocks_env Σ) (transform_blocks Σ t) (transform_blocks Σ t'). -Proof. - intros Σ etaΣ wfΣ. - eapply - (EWcbvEvalEtaInd.eval_preserve_mkApps_ind fl eq_refl (efl := env_flags) Σ _ - (wellformed Σ) (Qpres := Qpreserves_wellformed _ wfΣ)) => //; eauto. - { intros. eapply EWcbvEval.eval_wellformed => //; tea. } - all:intros *. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. { cbn. rtoProp; eauto. } - destruct decompose_app as [fn args] eqn:heq. - destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[[] args']|] => // /=. - destruct chop eqn:eqch. - intros [Hl [ha ht]]. rewrite ha in H. - destruct with_constructor_as_block eqn:E. - * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. - * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H0. - rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H4; try congruence. - eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. - solve_discr. - + econstructor; tea. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. cbn. rtoProp; eauto. - destruct decompose_app as [fn args] eqn:heq. - destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[] |] => // /=. - destruct n0; eauto. - destruct chop eqn:eqch. - intros [Hl [ha ht]]. rewrite ha in H. - destruct with_constructor_as_block eqn:E. - * eapply eval_mkApps_Construct_block_inv in H as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. - * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H0. - rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H5; try congruence. - eapply eval_mkApps_Construct_inv in H as (args'' & Ha1 & Ha2 & -> & ?); eauto. - solve_discr. - + econstructor. - * revert e1. set (x := transform_blocks Σ f0). - simp transform_blocks. - * eauto. - * rewrite transform_blocks_csubst in e; eauto. - 1: now simp_eta in i10. - now rewrite - transform_blocks_equation_1. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - simp transform_blocks. rewrite -!transform_blocks_equation_1. - econstructor; eauto. - rewrite -transform_blocks_csubst; eauto. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - simp transform_blocks. rewrite -!transform_blocks_equation_1. - cbn [plus]. - rewrite transform_blocks_mkApps in e0 => //. - assert (pars = 0) as -> by now (eapply constructor_isprop_pars_decl_params; eauto). - cbn [construct_viewc] in e0. - pose proof (Hcon := H2). - rewrite /constructor_isprop_pars_decl in H2. - destruct lookup_constructor as [[[]] | ] eqn:eqc; cbn in H2; invs H2. - rewrite -> lookup_constructor_pars_args_cstr_arity with (1 := eqc) in e0. - erewrite chop_all in e0. 2:len. - eapply eval_iota_block => //. - + cbn [fst]. eapply e0. - + unfold constructor_isprop_pars_decl. - rewrite lookup_constructor_transform_blocks. cbn [fst]. - rewrite eqc //= H8 //. - + now rewrite map_InP_spec nth_error_map H3; eauto. - + len. - + rewrite H9. len. - + rewrite wellformed_mkApps in i4 => //. - rewrite isEtaExp_Constructor in i6 => //. rtoProp. - rewrite -transform_blocks_iota_red. - * solve_all. - * solve_all. - * eapply forallb_nth_error in H. rewrite -> H3 in H => //. - * now rewrite H9. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. eauto; cbn; rtoProp; eauto. - destruct decompose_app as [ f args] eqn:heq. - destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[] |] => // /=. - destruct n0; eauto. - destruct chop eqn:eqch. - intros [Hl [ha ht]]. rewrite ha in H0. - destruct with_constructor_as_block eqn:E. - * eapply eval_mkApps_Construct_block_inv in H0 as (args'' & Ha1 & Ha2 & Ha3); eauto. congruence. - * rewrite ha in i7. rewrite wellformed_mkApps in i7; eauto. rtoProp. cbn [wellformed] in H1. - rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H9; try congruence. - eapply eval_mkApps_Construct_inv in H0 as (args'' & Ha1 & Ha2 & -> & ?); eauto. - solve_discr. - + eapply eval_fix'. - * eauto. - * revert e1. set (x := transform_blocks Σ f5). - simp transform_blocks. - * rewrite map_InP_spec. - cbn in i8. unfold wf_fix in i8. rtoProp. - erewrite <- transform_blocks_cunfold_fix => //. - all: eauto. - eapply closed_fix_subst. solve_all. destruct x; cbn in H5 |- *. eauto. - simp_eta in i10. - * eauto. - * revert e. - eapply transform_blocks_tApp => //. - -- cbn. rtoProp. split; eauto. eapply wellformed_cunfold_fix; eauto. - -- destruct (decompose_app (tApp fn av)) eqn:E; eauto. - destruct (construct_viewc t0) eqn:E1; eauto. - destruct (lookup_constructor_pars_args Σ ind n) as [ [[ ]] | ] eqn:E2; eauto. - cbn zeta. destruct chop eqn:E3. intros (? & ? & ?). - subst. rewrite -> H7 in *. intros He. - eapply eval_mkApps_Construct_block_inv in He as (? & ? & ? & ?); eauto. subst. - rewrite -[tApp _ _](mkApps_app _ _ [last l av]) in i1. - rewrite H7 - remove_last_last in i1 => //. - rewrite isEtaExp_Constructor in i1. rtoProp. - rewrite isEtaExp_Constructor in H3. rtoProp. - unfold isEtaExp_app in *. - rewrite E2 in H3, H5. - eapply leb_complete in H3, H5. - exfalso. - enough (n0 >= #|l|). - { destruct l; try congruence. rewrite remove_last_length in H3. cbn in H5, H3, H13. lia. } - destruct (chop n0 l) eqn:Ec. - erewrite chop_map in E3 => //. 2: eauto. - inversion E3. subst. destruct l2; invs H15. - rewrite chop_firstn_skipn in Ec. invs Ec. - eapply PCUICSR.skipn_nil_length in H15. lia. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - simp transform_blocks. rewrite -!transform_blocks_equation_1. - rewrite map_InP_spec. cbn [plus]. - eapply eval_wellformed in H2; eauto. - rewrite wellformed_mkApps in H2; eauto. - rtoProp. now cbn in H2. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - simp transform_blocks. rewrite -!transform_blocks_equation_1. - econstructor. - eapply transform_blocks_declared_constant; eauto. - destruct decl. cbn in *. now rewrite H0. - eauto. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. - destruct decompose_app as [ f args] eqn:heq. - destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[] args'|] eqn:hl => // /=. - destruct n0; eauto. - destruct chop eqn:eqch. - intros [Hl [ha ht]]. pose proof ev as Hev. rewrite ha in Hev. - destruct with_constructor_as_block eqn:E. - * eapply eval_mkApps_Construct_block_inv in Hev as (args'' & Ha1 & Ha2 & Ha3); eauto. subst. - destruct args as [ | []]; cbn in *; congruence. - * rewrite ha in i3. rewrite wellformed_mkApps in i3; eauto. rtoProp. cbn [wellformed] in H. - rtoProp. destruct lookup_constructor as [ [[]] | ] eqn:hel; cbn in H6; try congruence. - eapply eval_mkApps_Construct_inv in Hev as (args'' & Ha1 & Ha2 & -> & ?); eauto. subst. - rewrite isConstructApp_mkApps in H1. rewrite orb_true_r in H1 => //. - + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. - destruct (decompose_app (tApp f' a')). destruct (construct_viewc t0). - * destruct lookup_constructor_pars_args as [ [[]] | ] eqn:hpa; eauto. - cbn [plus]. destruct chop eqn:heqch. - intros [hl [ht ha]]. rewrite ht in H1. rewrite isConstructApp_mkApps orb_true_r in H1 => //. - * eapply eval_app_cong; eauto. - revert H1. - destruct f'; try now cbn; tauto. - intros H. cbn in H. - rewrite transform_blocks_isConstructApp; eauto. - destruct (isConstructApp (tApp f'1 f'2)). - -- cbn in H. congruence. - -- eapply transform_blocks_tApp; eauto. clear. - destruct decompose_app. - destruct construct_viewc; try now cbn; eauto. - destruct lookup_constructor_pars_args as [[[]] | ]; eauto. - cbn. destruct chop. cbn. intros. - destruct l1 using rev_case; cbn; eauto. - rewrite mkApps_app; cbn; eauto. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - simp transform_blocks. rewrite -!transform_blocks_equation_1. - rewrite !transform_blocks_mkApps => //. - cbn [construct_viewc]. - erewrite lookup_constructor_pars_args_cstr_arity; eauto. - destruct (chop (cstr_nargs cdecl) args) eqn:E1. - destruct (chop (cstr_nargs cdecl) args') eqn:E2. - erewrite !chop_map; eauto. - specialize H as Heq. - unfold lookup_constructor, lookup_inductive, lookup_minductive in Heq. - destruct lookup_env eqn:E; try now inv Heq. - eapply lookup_env_wellformed in E; eauto. - destruct g; cbn in Heq; try now inv Heq. - cbn in E. - destruct nth_error; try now inv Heq. - destruct nth_error; invs Heq. - rewrite /wf_minductive in E. rtoProp. - cbn in H4. eapply eqb_eq in H4. - unfold cstr_arity in H0. - rewrite -> H4 in *. cbn in H0. - revert E1 E2. - rewrite <- H0. - rewrite !chop_firstn_skipn !firstn_all. intros [= <- <-] [= <- <-]. - eapply All2_length in X0 as Hlen. - cbn. - rewrite !skipn_all Hlen skipn_all firstn_all. cbn. - eapply eval_mkApps_Construct_block; eauto. - now rewrite lookup_constructor_transform_blocks. - len. unfold cstr_arity. lia. - solve_all. destruct H6; eauto. - - intros. econstructor. destruct t; cbn in H |- *; try congruence. -Qed. diff --git a/erasure/theories/EDeps.v b/erasure/theories/EDeps.v index 90399e1a8..1b72d5c12 100644 --- a/erasure/theories/EDeps.v +++ b/erasure/theories/EDeps.v @@ -57,8 +57,6 @@ Proof. now constructor. - depelim er. now constructor. - - depelim er. - econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -107,8 +105,6 @@ Proof. now constructor. - depelim er. now constructor. - - depelim er. - econstructor; eauto. - depelim er. econstructor; eauto. induction X; [easy|]. @@ -164,8 +160,6 @@ Proof. now constructor. - depelim er. now constructor. - - depelim er. - cbn. econstructor; eauto. - depelim er. econstructor; [easy|easy|easy|easy|easy|]. induction X; [easy|]. @@ -259,7 +253,7 @@ Qed. Notation "Σ ⊢ s ▷ t" := (eval Σ s t) (at level 50, s, t at next level) : type_scope. -Lemma erases_deps_eval {wfl:WcbvFlags} {hcon : with_constructor_as_block = false} Σ t v Σ' : +Lemma erases_deps_eval {wfl:WcbvFlags} Σ t v Σ' : Σ' ⊢ t ▷ v -> erases_deps Σ Σ' t -> erases_deps Σ Σ' v. @@ -281,9 +275,8 @@ Proof. + intuition auto. apply erases_deps_mkApps_inv in H4. now apply Forall_rev, Forall_skipn. - + eapply nth_error_forall in e1; [|now eauto]. + + eapply nth_error_forall in e0; [|now eauto]. assumption. - - congruence. - depelim er. subst brs; cbn in *. depelim H3. @@ -333,12 +326,10 @@ Proof. intuition auto. apply erases_deps_mkApps_inv in H3 as (? & ?). apply IHev2. - now eapply nth_error_forall in e2. - - congruence. + now eapply nth_error_forall in e1. - constructor. - depelim er. now constructor. - - congruence. - depelim er. now constructor. - easy. Qed. @@ -376,7 +367,7 @@ Lemma erases_deps_forall_ind Σ Σ' declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_one_inductive_body idecl idecl' -> erases_mutual_inductive_body mdecl mdecl' -> - P (Extract.E.tConstruct ind c [])) + P (Extract.E.tConstruct ind c)) (Hcase : forall (p : inductive × nat) mdecl idecl mdecl' idecl' (discr : Extract.E.term) (brs : list (list name × Extract.E.term)), PCUICAst.declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> diff --git a/erasure/theories/EEtaExpanded.v b/erasure/theories/EEtaExpanded.v index 42b442e59..f43c00455 100644 --- a/erasure/theories/EEtaExpanded.v +++ b/erasure/theories/EEtaExpanded.v @@ -26,15 +26,15 @@ Hint Constructors eval : core. Import MCList (map_InP, map_InP_elim, map_InP_spec). Equations discr_construct (t : term) : Prop := -discr_construct (tConstruct ind n block_args) := False ; +discr_construct (tConstruct ind n) := False ; discr_construct _ := True. Inductive construct_view : term -> Type := -| view_construct : forall ind n block_args, construct_view (tConstruct ind n block_args) +| view_construct : forall ind n, construct_view (tConstruct ind n) | view_other : forall t, discr_construct t -> construct_view t. Equations construct_viewc t : construct_view t := -construct_viewc (tConstruct ind n block_args) := view_construct ind n block_args ; +construct_viewc (tConstruct ind n) := view_construct ind n ; construct_viewc t := view_other t I. Ltac toAll := @@ -55,8 +55,6 @@ Section isEtaExp. Import TermSpineView. - Definition is_nil {A} (l : list A) := match l with [] => true | _ => false end. - Equations? isEtaExp (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := | e with TermSpineView.view e := { @@ -64,7 +62,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp x) | tLambda na M => isEtaExp M | tApp u v napp nnil with construct_viewc u := - { | view_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) && is_nil block_args + { | view_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp x) | view_other _ _ => isEtaExp u && forallb_InP v (fun x H => isEtaExp x) } | tLetIn na b b' => isEtaExp b && isEtaExp b' | tCase ind c brs => isEtaExp c && forallb_InP brs (fun x H => isEtaExp x.2) @@ -74,16 +72,15 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. + | tConstruct ind i => isEtaExp_app ind i 0 }. Proof. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - rewrite size_mkApps. - eapply (In_size id size) in H. - change (fun x => size (id x)) with size in H. unfold id in *; cbn. - lia. + change (fun x => size (id x)) with size in H. cbn. + now apply (In_size id size). - now eapply size_mkApps_f. - change (fun x => size (id x)) with size in H. eapply (In_size id size) in H. unfold id in H. @@ -105,7 +102,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args + | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -117,7 +114,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_napp f v : ~~ isApp f -> isEtaExp (mkApps f v) = match construct_viewc f with - | view_construct ind i block_args => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args + | view_construct ind i => isEtaExp_app Σ ind i #|v| && forallb isEtaExp v | view_other t discr => isEtaExp f && forallb isEtaExp v end. Proof using Type. @@ -127,8 +124,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor ind i v block_args : - isEtaExp (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v && is_nil block_args. + Lemma isEtaExp_Constructor ind i v : + isEtaExp (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app Σ ind i #|v| && forallb isEtaExp v. Proof using Type. rewrite isEtaExp_mkApps_napp //. Qed. @@ -137,7 +134,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps f u : isEtaExp (mkApps f u) -> let (hd, args) := decompose_app (mkApps f u) in match construct_viewc hd with - | view_construct kn c block_args => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args + | view_construct kn c => isEtaExp_app Σ kn c #|args| && forallb isEtaExp args | view_other u discr => isEtaExp hd && forallb isEtaExp args end. Proof using Type. @@ -146,7 +143,7 @@ Section isEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l. cbn -[isEtaExp]. intros eq; rewrite eq. - destruct (construct_viewc t) => //. simp isEtaExp in eq. rtoProp. solve_all. + destruct (construct_viewc t) => //. simp isEtaExp in eq; now rewrite eq. assert (t0 :: l <> []) by congruence. revert da H0. generalize (t0 :: l). clear t0 l; intros l. intros da nnil. @@ -182,9 +179,9 @@ Section isEtaExp. Lemma isEtaExp_tApp {f u} : isEtaExp (EAst.tApp f u) -> let (hd, args) := decompose_app (EAst.tApp f u) in match construct_viewc hd with - | view_construct kn c block_args => + | view_construct kn c => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb isEtaExp args && is_nil block_args + isEtaExp_app Σ kn c #|args| && forallb isEtaExp args | view_other _ discr => [&& isEtaExp hd, forallb isEtaExp args, isEtaExp f & isEtaExp u] end. @@ -235,19 +232,17 @@ Section WeakEtaExp. pose proof (decompose_app_notApp _ _ _ da). destruct l0. simp_eta. - rewrite isEtaExp_mkApps_napp //. - destruct construct_viewc. cbn. len. - rtoProp; repeat solve_all. cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. + destruct construct_viewc. cbn. len. + rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. - eapply All_app_inv; eauto. - cbn in et. rtoProp. rename H0 into et. simp isEtaExp in et. - rewrite et forallb_app /=. + eapply All_app_inv; eauto. rewrite et forallb_app /=. rtoProp; repeat solve_all. - rewrite isEtaExp_mkApps_napp in et => //. destruct construct_viewc. rewrite -mkApps_app. rewrite isEtaExp_Constructor. - rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. - solve_all. eapply All_app_inv => //. econstructor; eauto. + cbn. cbn. rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. + depelim H1. solve_all. eapply All_app_inv => //. eapply All_app_inv => //. eauto. rewrite -mkApps_app. rewrite isEtaExp_mkApps_napp //. destruct (construct_viewc t0) => //. @@ -264,7 +259,6 @@ Section WeakEtaExp. - intros. simp isEtaExp ; cbn. destruct Nat.compare => //. simp_eta in H. - move/andP: H2 => [] etab etab'. apply/andP. split; eauto. - - rtoProp. intuition eauto. now destruct block_args. - rtoProp. intuition eauto. solve_all. - move/andP: b => [] etaexp h. @@ -275,7 +269,6 @@ Section WeakEtaExp. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. rewrite map_length. rtoProp; solve_all. solve_all. - now destruct block_args. - rewrite csubst_mkApps /=. move/andP: H2 => [] eu ev. specialize (H _ k H1 eu). @@ -466,7 +459,7 @@ Inductive expanded : term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= cstr_arity mind cdecl -> Forall expanded args -> - expanded (mkApps (tConstruct ind idx []) args) + expanded (mkApps (tConstruct ind idx) args) | expanded_tBox : expanded tBox. End expanded. @@ -504,7 +497,7 @@ forall (Σ : global_declarations) (P : term -> Prop), (idecl : one_inductive_body) cdecl (args : list term), declared_constructor Σ (ind, idx) mind idecl cdecl -> - #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx []) args)) -> + #|args| >= cstr_arity mind cdecl -> Forall (expanded Σ) args -> Forall P args -> P (mkApps (tConstruct ind idx) args)) -> (P tBox) -> forall t : term, expanded Σ t -> P t. Proof. @@ -577,8 +570,7 @@ Proof. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). - destruct block_args; inv H0. + - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. @@ -589,10 +581,9 @@ Proof. intuition auto. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - rtoProp. eapply In_All in H. - rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. + - eapply andb_true_iff in H0 as []. eapply In_All in H. + rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). - destruct block_args; inv H1. eapply expanded_tConstruct_app; eauto. solve_all. - eapply andb_true_iff in H1 as []. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. econstructor. @@ -612,8 +603,8 @@ Proof. eauto). - eapply isEtaExp_mkApps_intro; eauto. solve_all. - solve_all. now rewrite b H. - - rewrite isEtaExp_Constructor. rtoProp; repeat split. - 2: eapply forallb_Forall. + - rewrite isEtaExp_Constructor. eapply andb_true_iff. + split. 2: eapply forallb_Forall. 2: solve_all. eapply expanded_isEtaExp_app_; eauto. Qed. @@ -677,8 +668,8 @@ Proof. eapply In_All in H0; solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. solve_all. - eapply In_All in H. simp_eta; rtoProp; intuition auto. - rewrite EEtaExpanded.isEtaExp_Constructor. rtoProp; repeat split. eauto. - solve_all. destruct block_args; cbn in *; eauto. + rewrite EEtaExpanded.isEtaExp_Constructor. apply/andP; split. exact H1. + solve_all. - eapply In_All in H, H0. simp_eta. move => /andP[] /andP[] etafix etamfix etav. eapply EEtaExpanded.isEtaExp_mkApps_intro. simp_eta. diff --git a/erasure/theories/EEtaExpandedFix.v b/erasure/theories/EEtaExpandedFix.v index 3d8101415..bb087a915 100644 --- a/erasure/theories/EEtaExpandedFix.v +++ b/erasure/theories/EEtaExpandedFix.v @@ -58,7 +58,7 @@ Inductive expanded (Γ : list nat): term -> Prop := declared_constructor Σ (ind, idx) mind idecl cdecl -> #|args| >= ind_npars mind + cdecl.(cstr_nargs) -> Forall (expanded Γ) args -> - expanded Γ (mkApps (tConstruct ind idx []) args) + expanded Γ (mkApps (tConstruct ind idx) args) | expanded_tBox : expanded Γ tBox. End expanded. @@ -135,7 +135,7 @@ Lemma expanded_ind : → #|args| ≥ ind_npars mind + cdecl.(cstr_nargs) → Forall (expanded Σ Γ) args → Forall (P Γ) args - → P Γ (mkApps (tConstruct ind idx []) args)) + → P Γ (mkApps (tConstruct ind idx) args)) → (∀ Γ : list nat, P Γ tBox) → ∀ (Γ : list nat) (t : term), expanded Σ Γ t → P Γ t. Proof. @@ -225,19 +225,19 @@ Proof. Qed. Equations discr_expanded_head (t : term) : Prop := - discr_expanded_head (tConstruct ind n block_args) := False ; + discr_expanded_head (tConstruct ind n) := False ; discr_expanded_head (tFix mfix idx) := False ; discr_expanded_head (tRel n) := False ; discr_expanded_head _ := True. Inductive expanded_head_view : term -> Type := -| expanded_head_construct : forall ind n block_args, expanded_head_view (tConstruct ind n block_args) +| expanded_head_construct : forall ind n, expanded_head_view (tConstruct ind n) | expanded_head_fix : forall mfix idx, expanded_head_view (tFix mfix idx) | expanded_head_rel : forall n, expanded_head_view (tRel n) | expanded_head_other : forall t, discr_expanded_head t -> expanded_head_view t. Equations expanded_head_viewc t : expanded_head_view t := - expanded_head_viewc (tConstruct ind n block_args) := expanded_head_construct ind n block_args; + expanded_head_viewc (tConstruct ind n) := expanded_head_construct ind n ; expanded_head_viewc (tFix mfix idx) := expanded_head_fix mfix idx ; expanded_head_viewc (tRel n) := expanded_head_rel n ; expanded_head_viewc t := expanded_head_other t I. @@ -266,8 +266,6 @@ Section isEtaExp. Import TermSpineView. - Definition is_nil {A} (l : list A) := match l with nil => true | _ => false end. - Equations? isEtaExp (Γ : list nat) (e : EAst.term) : bool by wf e (fun x y : EAst.term => size x < size y) := isEtaExp Γ e with TermSpineView.view e := { @@ -275,7 +273,7 @@ Section isEtaExp. | tEvar ev args => forallb_InP args (fun x H => isEtaExp Γ x) | tLambda na M => isEtaExp (0 :: Γ) M | tApp u v napp nnil with expanded_head_viewc u := - { | expanded_head_construct ind i block_args => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) && is_nil block_args + { | expanded_head_construct ind i => isEtaExp_app ind i (List.length v) && forallb_InP v (fun x H => isEtaExp Γ x) | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx (List.length v) && forallb_InP mfix (fun x H => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) && forallb_InP v (fun x H => isEtaExp Γ x) @@ -289,15 +287,14 @@ Section isEtaExp. | tBox => true | tVar _ => true | tConst _ => true - | tConstruct ind i block_args => isEtaExp_app ind i 0 && is_nil block_args }. + | tConstruct ind i => isEtaExp_app ind i 0 }. Proof using Σ. all:try lia. all:try apply (In_size); tea. all:try lia. - now apply (In_size id size). - - rewrite size_mkApps. cbn. - apply (In_size id size) in H. - unfold id in H. change (fun x => size x) with size in H. lia. + - rewrite size_mkApps. + now apply (In_size id size). - rewrite size_mkApps. apply (In_size id (fun d => size d.(dbody))) in H. unfold id in H. change (fun x => size x) with size in H. cbn. lia. @@ -328,7 +325,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps_nonnil Γ f v : ~~ isApp f -> v <> [] -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args + | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => option_default (fun m => m <=? List.length v) (nth_error Γ n) false && forallb (fun x => isEtaExp Γ x) v @@ -348,7 +345,7 @@ Section isEtaExp. Lemma isEtaExp_mkApps Γ f v : ~~ isApp f -> isEtaExp Γ (mkApps f v) = match expanded_head_viewc f with - | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args + | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v @@ -365,8 +362,8 @@ Section isEtaExp. - rewrite isEtaExp_mkApps_nonnil //. Qed. - Lemma isEtaExp_Constructor Γ ind i block_args v : - isEtaExp Γ (mkApps (EAst.tConstruct ind i block_args) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args. + Lemma isEtaExp_Constructor Γ ind i v : + isEtaExp Γ (mkApps (EAst.tConstruct ind i) v) = isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v. Proof. now rewrite isEtaExp_mkApps. Qed. @@ -383,7 +380,7 @@ Section isEtaExp. - rewrite isEtaExp_mkApps //. destruct expanded_head_viewc. + cbn. len. - rtoProp; repeat solve_all; cbn in et; rtoProp; eauto. rename H0 into et. simp isEtaExp in et. + rtoProp; repeat solve_all. cbn in et. simp isEtaExp in et. eapply isEtaExp_app_mon; tea; lia. eapply All_app_inv; eauto. + cbn in *; congruence. @@ -396,9 +393,9 @@ Section isEtaExp. - rewrite isEtaExp_mkApps in et => //. destruct expanded_head_viewc. + rewrite -mkApps_app. rewrite isEtaExp_Constructor. - rtoProp; solve_all. - eapply isEtaExp_app_mon; tea. cbn. len. solve_all. depelim H2. - eapply All_app_inv => //. econstructor; eauto. + cbn. cbn. rtoProp; solve_all. + eapply isEtaExp_app_mon; tea. cbn. len. now depelim H1. + depelim H1. solve_all. eapply All_app_inv => //. eapply All_app_inv => //. eauto. + rewrite -mkApps_app. rewrite isEtaExp_mkApps //. simp expanded_head_viewc. rewrite /isEtaExp_fixapp in et |- *. @@ -442,10 +439,8 @@ Section isEtaExp. rewrite ?closedn_mkApps; rtoProp; (try toAll); repeat solve_all. - destruct nth_error eqn:Hn; cbn in H; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. - - destruct block_args; cbn in *; eauto. - eapply a in b. 2: f_equal. revert b. now len. - eapply a in b. 2: f_equal. revert b. now len. - - cbn. destruct block_args; cbn in *; eauto. - cbn. solve_all. rtoProp; intuition auto. eapply a in H0. 2: reflexivity. revert H0. now len. - destruct nth_error eqn:Hn; cbn in H1; try easy. eapply nth_error_Some_length in Hn. now eapply Nat.ltb_lt. @@ -471,7 +466,6 @@ Section isEtaExp. - move/andP: H2 => [] etab etab'. simp_eta. apply/andP. split; eauto. eapply H0 with (Γ := 0 :: Γ0); cbn; eauto. - - rtoProp. intuition eauto. destruct block_args; cbn in *; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a0; cbn; eauto. now len. cbn. now rewrite app_assoc. @@ -479,7 +473,7 @@ Section isEtaExp. - fold csubst. move/andP: H1 => [] etaexp h. rewrite csubst_mkApps /=. rewrite isEtaExp_Constructor. solve_all. - rewrite map_length. rtoProp; solve_all. solve_all. destruct block_args; cbn in *; eauto. + rewrite map_length. rtoProp; solve_all. solve_all. - rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -510,7 +504,7 @@ Section isEtaExp. Qed. Lemma etaExp_csubst a b n : - isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). + isEtaExp []a -> isEtaExp [n] b -> isEtaExp [] (ECSubst.csubst a 0 b). Proof. intros. eapply etaExp_csubst' with (Γ := []); eauto. @@ -541,7 +535,6 @@ Section isEtaExp. apply/andP. split; eauto. eapply H; eauto. solve_all. eapply H0 with (Γ := 0 :: Γ0); eauto. solve_all. - - rtoProp. intuition eauto. destruct block_args; eauto. - rtoProp. intuition eauto. solve_all. rewrite app_assoc. eapply a; cbn-[isEtaExp]; eauto. now len. cbn. now rewrite app_assoc. @@ -559,7 +552,7 @@ Section isEtaExp. eapply All_impl; tea; cbv beta. intros x Hx. eapply Hx; eauto. - solve_all. apply Hx. now destruct block_args. + solve_all. apply Hx. - solve_all. rewrite csubst_mkApps /=. move/andP : H2 => [] /andP [] eu ef ev. rewrite isEtaExp_mkApps //. @@ -737,7 +730,7 @@ Section isEtaExp. Lemma isEtaExp_tApp Γ f u : isEtaExp Γ (mkApps f u) -> let (hd, v) := decompose_app (mkApps f u) in match expanded_head_viewc hd with - | expanded_head_construct ind i block_args => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v && is_nil block_args + | expanded_head_construct ind i => isEtaExp_app ind i #|v| && forallb (isEtaExp Γ) v | expanded_head_fix mfix idx => isEtaExp_fixapp mfix idx #|v| && forallb (fun x => isLambda x.(dbody) && isEtaExp (rev_map (S ∘ rarg) mfix ++ Γ) x.(dbody)) mfix && forallb (isEtaExp Γ) v | expanded_head_rel n => (option_default (fun m => m <=? List.length v) (nth_error Γ n) false) && forallb (fun x => isEtaExp Γ x) v @@ -795,18 +788,16 @@ Proof. - eapply expanded_tRel_app with (args := []). destruct (nth_error); invs H. f_equal. eapply Nat.eqb_eq in H1; eauto. cbn. lia. econstructor. - rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. econstructor. solve_all. - eapply andb_true_iff in H1 as []; eauto. - - rtoProp. eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). - destruct block_args; cbn in *; eauto. + - eapply isEtaExp_app_expanded in H as (? & ? & ? & ? & ?). eapply expanded_tConstruct_app with (args := []); eauto. - eapply andb_true_iff in H1 as []. destruct ind. econstructor; eauto. rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. eapply In_All in H0. solve_all. - econstructor. rewrite forallb_InP_spec in H0. eapply forallb_Forall in H0. eapply In_All in H. solve_all. - - rtoProp. eapply In_All in H. - rewrite forallb_InP_spec in H2. eapply forallb_Forall in H2. + - eapply andb_true_iff in H0 as []. eapply In_All in H. + rewrite forallb_InP_spec in H1. eapply forallb_Forall in H1. eapply isEtaExp_app_expanded in H0 as (? & ? & ? & ? & ?). - destruct block_args; cbn in *; eauto. eapply expanded_tConstruct_app; eauto. solve_all. - rtoProp. rewrite forallb_InP_spec in H2. rewrite forallb_InP_spec in H3. eapply In_All in H. eapply In_All in H0. unfold isEtaExp_fixapp in H1. destruct nth_error eqn:E; try congruence. @@ -839,9 +830,9 @@ Proof. + unfold isEtaExp_fixapp. rewrite H4. eapply Nat.ltb_lt. lia. + solve_all; rtoProp; intuition auto. + solve_all. - - rewrite isEtaExp_Constructor. rtoProp. repeat split. - 2: eapply forallb_Forall; solve_all. - eapply expanded_isEtaExp_app_; eauto. + - rewrite isEtaExp_Constructor. eapply andb_true_iff. + split. 2: eapply forallb_Forall. + 2: solve_all. eapply expanded_isEtaExp_app_; eauto. Qed. Definition isEtaExp_constant_decl Σ cb := @@ -880,9 +871,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_tApp' {Σ} {Γ} {f u} : isEtaExp Σ Γ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c block_args => + | expanded_head_construct kn c => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args && is_nil block_args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ Γ) args | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ isEtaExp_fixapp mfix idx #|args| && forallb (fun d => isLambda d.(dbody) && isEtaExp Σ (rev_map (fun d => 1 + d.(rarg)) mfix ++ Γ) d.(dbody)) mfix && forallb (isEtaExp Σ Γ) args @@ -1017,22 +1008,22 @@ Qed. Arguments lookup_inductive_pars_constructor_pars_args {Σ ind n pars args}. -Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {wcon : with_constructor_as_block = false} {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} {Σ a a'} : isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ [] a -> isEtaExp Σ [] a'. Proof. intros etaΣ wfΣ. - induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs - | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | | | ] using eval_mkApps_rect; try now congruence. + induction 1 as [ | ? ? ? ? ? ? ? ? IHs | | | | ? ? ? ? ? ? ? ? ? ? ? IHs | ? ? ? ? ? ? ? ? ? ? ? IHs + | ? ? ? ? ? ? ? ? ? ? IHs | | | | | | | | ] using eval_mkApps_rect. all:try simp isEtaExp; rewrite -!isEtaExp_equation_1 => //. 6:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. destruct block_args; cbn in *; eauto. + * move => [hl [hf [ha /andP[] ise etal]]]. pose proof (H' := H). - rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. auto. + rewrite hf in H'. eapply eval_mkApps_Construct_inv in H' as [? []]. exfalso. solve_discr. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. pose proof (mkApps_app (EAst.tFix mfix idx) argsv [av]). cbn in H3. rewrite <- H3. clear H3. @@ -1073,8 +1064,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:vc. - * move => [hl [hf [ha /andP[] /andP[] ise etal bargs]]]. clear IHs. destruct block_args; inv bargs. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. auto. + * move => [hl [hf [ha /andP[] ise etal]]]. clear IHs. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]. exfalso. solve_discr. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. eapply IHeval3. @@ -1123,11 +1114,11 @@ Proof. 11:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. + * move=> [] hl [] hf [] ha /andP[] hl' etal. move: H H0. rewrite hf => H H0. - destruct (eval_construct_size wcon H) as [args' []]. subst f'. - rewrite isConstructApp_mkApps /= in i. - rewrite !negb_or in i. rtoProp; intuition auto. now cbn in H3. + destruct (eval_construct_size H) as [args' []]. subst f'. + rewrite isConstructApp_mkApps /= in H1. + rewrite !negb_or in H1. rtoProp; intuition auto. now cbn in H3. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. @@ -1136,7 +1127,7 @@ Proof. { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. - -- subst. rewrite isFixApp_mkApps in i => //. destruct EAst.isLambda; easy. + -- subst. rewrite isFixApp_mkApps in H1 => //. destruct EAst.isLambda; easy. -- eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. @@ -1144,7 +1135,7 @@ Proof. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. destruct nth_error; try easy. - invs H4. eapply Nat.ltb_lt. lia. + invs H5. eapply Nat.ltb_lt. lia. } { @@ -1154,7 +1145,7 @@ Proof. unshelve eapply H0. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H5. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. @@ -1162,7 +1153,7 @@ Proof. destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. } * intros (? & ? & ? & ?). rtoProp. solve_all. - rewrite nth_error_nil in H5. easy. + rewrite nth_error_nil in H6. easy. * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ f' [a']); eauto. } @@ -1170,65 +1161,64 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. + * move=> [] hl [] hf [] ha /andP[] hl' etal. rewrite -[EAst.tApp _ _](mkApps_app _ _ [a']). - rewrite isEtaExp_Constructor. cbn. rewrite andb_true_r. - revert H H0. rewrite hf. intros H H0. - destruct (eval_mkApps_Construct_size wcon H) as [args'' [evc []]]. - eapply mkApps_eq_inj in e1 as [] => //. subst args''. noconf H2. + rewrite isEtaExp_Constructor. + move: H0 H1. rewrite hf. intros H0 H1. + destruct (eval_mkApps_Construct_size H0) as [args'' [evc []]]. + eapply mkApps_eq_inj in e as [] => //. subst args''. noconf H3. apply/andP; split => //. - + len. - rewrite (remove_last_last l0 a) // in hl'. + + len. + rewrite (remove_last_last l a) // in hl'. rewrite app_length in hl'. cbn in hl'. now rewrite -(All2_length a0). + solve_all. - rewrite (remove_last_last l0 a) // in etal. + rewrite (remove_last_last l a) // in etal. eapply All_app in etal as [etal etaa]. depelim etaa. clear etaa. rewrite -ha in i. eapply All_app_inv; try constructor; eauto. - solve_all. - destruct b as [ev Hev]. eapply (H0 _ _ ev) => //. lia. + clear -H1 a0 etal. solve_all. + destruct b as [ev Hev]. eapply (H1 _ _ ev) => //. lia. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. subst. assert (isEtaExp Σ [] a). { rewrite ha. eapply Forall_last; solve_all. } destruct with_guarded_fix eqn:guarded. - { specialize eval_mkApps_tFix_inv_size with (Heval := H); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. + { specialize eval_mkApps_tFix_inv_size with (Heval := H0); intros [(args' & ? & Heq) | (? & ? & ? & ? & ?)]; eauto. -- subst. solve_discr. - -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. eapply IHeval1. rewrite isEtaExp_mkApps => //. cbn [expanded_head_viewc]. rtoProp. repeat split; solve_all. 2: eapply All_firstn; eauto. unfold isEtaExp_fixapp, cunfold_fix in *. - destruct nth_error; try easy. noconf H4. + destruct nth_error; try easy. noconf H6. eapply Nat.ltb_lt. lia. } { - specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. + specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H0); intros Hinv; destruct Hinv as [[Heq Hv] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn & Hunf & Haa' & Hev & Hev' & Hsz)]; eauto. -- cbn in *. solve_discr. -- eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. - unshelve eapply H0. 2: eauto. lia. + unshelve eapply H1. 2: eauto. lia. eapply (isEtaExp_mkApps_intro). eapply (isEtaExp_mkApps_intro _ _ fn [a_']); eauto. 2: econstructor; [ | econstructor]. - ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H4. + ++ eapply isEtaExp_cunfold_fix. 2: eauto. solve_all. now rewrite app_nil_r in H6. ++ solve_all. eapply All_firstn in isel. unfold remove_last in Heq. eapply All_Forall in isel. setoid_rewrite Heq in isel. invs isel. eauto. ++ eapply forallb_Forall in isel. eapply Forall_firstn in isel. unfold remove_last in Heq. setoid_rewrite Heq in isel. eapply Forall_All in isel. invs isel. solve_all. subst; eauto. - destruct b0. unshelve eapply H0. 2: eauto. lia. eauto. + destruct b0. unshelve eapply H1. 2: eauto. lia. eauto. } - * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H5. easy. - * move/and4P => [] etat etal etaf etaa. + * intros (? & ? & ? & ?). rtoProp. solve_all. rewrite nth_error_nil in H7. easy. + * move/and4P => [] etat etal etaf etaa. eapply (isEtaExp_mkApps_intro _ _ _ [a']); eauto. } 1:{ move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. + * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. move: H H0. rewrite hf => H H0. - eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []];solve_discr. + eapply eval_mkApps_Construct_inv in H as [? []];solve_discr. * solve_all. rtoProp. solve_all. subst. destruct with_guarded_fix eqn:guarded. @@ -1275,10 +1265,10 @@ Proof. eapply IHeval2. rewrite /iota_red. eapply isEtaExp_substl with (Γ := repeat 0 #|br.1|); eauto. { len. } - rewrite isEtaExp_Constructor // in H1. solve_all. - eapply All_skipn. move/andP: H1 => []. repeat solve_all. rtoProp. solve_all. - eapply forallb_nth_error in H3; tea. - now erewrite e2 in H3. + rewrite isEtaExp_Constructor // in H5. solve_all. + eapply All_skipn. move/andP: H5 => []. repeat solve_all. + eapply forallb_nth_error in H7; tea. + now erewrite H1 in H7. - rtoProp; intuition auto. eapply IHeval2. eapply isEtaExp_substl. shelve. now apply forallb_repeat. @@ -1288,9 +1278,9 @@ Proof. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * clear IHs. move=> [] hl [] hf [] ha /andP[] /andP[] hl' etal bargs. destruct block_args; inv bargs. + * clear IHs. move=> [] hl [] hf [] ha /andP[] hl' etal. move: H H0. rewrite hf => H H0. - clear H0; eapply (eval_mkApps_Construct_inv _ _ _ _ _ wcon) in H as [? []]; solve_discr. + clear H0; eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. * solve_all. rtoProp. solve_all. subst. specialize eval_mkApps_tFix_inv_size_unguarded with (Heval := H); intros Hinv; destruct Hinv as [[Heq Heq'] | (a_ & a_' & args' & argsv & Heq & Hall & n & fn_ & Hunf & Hav & Hsza & Hev & Hsz)]; eauto; try congruence. @@ -1337,9 +1327,9 @@ Proof. eapply IHeval2. specialize (IHeval1 hd). move: IHeval1. rewrite isEtaExp_Constructor. - destruct args => //. now rewrite nth_error_nil in e3. - intros. rtoProp. - eapply nth_error_forallb in e3; tea. + destruct args => //. now rewrite nth_error_nil in H2. + move=> /andP[] _ hargs. + eapply nth_error_forallb in H2; tea. Qed. Lemma isEtaExp_fixapp_mon {mfix idx n n'} : n <= n' -> isEtaExp_fixapp mfix idx n -> isEtaExp_fixapp mfix idx n'. @@ -1475,18 +1465,18 @@ Lemma neval_to_stuck_fix {efl : EEnvFlags} {Σ mfix idx t} : isEtaExp Σ [] t -> @eval opt_wcbv_flags Σ t (tFix mfix idx) -> False. Proof. intros etaΣ wfΣ he hev. - unshelve epose proof (eval_etaexp etaΣ wfΣ hev he). eauto. + pose proof (eval_etaexp etaΣ wfΣ hev he). now apply isEtaExp_tFix in H. Qed. -Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl} {wcon : with_constructor_as_block = false} {Σ mfix idx t args} : +Lemma neval_to_stuck_fix_app {efl : EEnvFlags} {fl Σ mfix idx t args} : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> isEtaExp Σ [] t -> @eval fl Σ t (mkApps (tFix mfix idx) args) -> False. Proof. intros wguard etaΣ wfΣ he hev. - unshelve epose proof (eval_etaexp etaΣ wfΣ hev he); eauto. + pose proof (eval_etaexp etaΣ wfΣ hev he). move: H. move/isEtaExp_tApp. rewrite decompose_app_mkApps // /= // app_nil_r //. @@ -1501,14 +1491,13 @@ Qed. Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : with_guarded_fix -> - with_constructor_as_block = false -> @eval fl Σ f v -> isEtaExp Σ [] (tApp f u) -> - (forall kn c args block_args, v <> mkApps (tConstruct kn c block_args) args) -> + (forall kn c args, v <> mkApps (tConstruct kn c) args) -> (forall mfix idx args, v <> mkApps (tFix mfix idx) args) -> let (hd, args) := decompose_app (tApp f u) in match expanded_head_viewc hd with - | expanded_head_construct kn c _ => False + | expanded_head_construct kn c => False | expanded_head_fix mfix idx => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ [&& isEtaExp_fixapp mfix idx #|remove_last args|, @@ -1519,14 +1508,14 @@ Lemma isEtaExp_tApp_eval {fl} {Σ} {f u v} : [&& isEtaExp Σ [] hd, forallb (isEtaExp Σ []) args, isEtaExp Σ [] f & isEtaExp Σ [] u] end. Proof. - intros wguard wcon ev eta; revert eta ev. + intros wguard ev eta; revert eta ev. move/isEtaExp_tApp'. cbn -[decompose_app]. destruct decompose_app eqn:da. destruct expanded_head_viewc eqn:cv => //. - * move=> [] hl [] ha [] ht /andP[] /andP[] etaap etal bargs. destruct block_args; inv bargs. + * move=> [] hl [] ha [] ht /andP[] etaap etal. rewrite ha. intros h. eapply eval_mkApps_Construct_inv in h as [? []]. subst v. - intros Hc _. specialize (Hc ind n x). now eapply Hc. auto. + intros Hc _. specialize (Hc ind n x). now apply Hc. * move=> [] hl [] ha [] ht /andP[] /andP[] etafix etab etal. rewrite ha. intros H; eapply eval_stuck_fix_eq in H as [args' [Hargs' [[]|]]]. subst v. @@ -1619,12 +1608,12 @@ Proof. eapply eval_app_cong_tApp'. now eapply eval_to_value in evf''. exact e0. exact evres. Qed. -Lemma All_eval_etaexp {fl : WcbvFlags} {wcon : with_constructor_as_block = false } {efl : EEnvFlags} Σ l l' : +Lemma All_eval_etaexp {fl : WcbvFlags} {efl : EEnvFlags} Σ l l' : isEtaExp_env Σ -> wf_glob Σ -> All2 (eval Σ) l l' -> forallb (isEtaExp Σ []) l -> forallb (isEtaExp Σ []) l'. Proof. - intros; solve_all. eapply eval_etaexp; eauto. Unshelve. eauto. + intros; solve_all. now eapply eval_etaexp. Qed. Lemma isFix_mkApps f args : ~~ isFix f -> ~~ isFix (mkApps f args). @@ -1643,7 +1632,7 @@ Proof. intros h. now apply isFix_mkApps. Qed. -Lemma eval_opt_to_target {fl: WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} Σ t v : +Lemma eval_opt_to_target {fl: WcbvFlags} {efl : EEnvFlags} Σ t v : with_guarded_fix -> isEtaExp_env Σ -> wf_glob Σ -> @@ -1654,7 +1643,7 @@ Proof. intros wguard etaΣ wfΣ. intros H. induction H using eval_mkApps_rect. - - move/(isEtaExp_tApp_eval wguard wcon H) => IH. + - move/(isEtaExp_tApp_eval wguard H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp a t)) eqn:da. @@ -1672,7 +1661,7 @@ Proof. forward IHeval2 => //. econstructor; eauto. - clear H0. - move/(isEtaExp_tApp_eval wguard wcon H) => IH. + move/(isEtaExp_tApp_eval wguard H) => IH. forward IH by (intros; intro; solve_discr). forward IH by (intros; intro; solve_discr). destruct (decompose_app (tApp f0 a)) eqn:da. @@ -1700,15 +1689,14 @@ Proof. eapply eval_etaexp in IHeval1; tea. - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. - unshelve epose proof (eval_etaexp etaΣ wfΣ IHeval1 etad). eauto. - revert H1. - rewrite isEtaExp_Constructor => /andP[] /andP[] etac etaargs bargs. + move: (eval_etaexp etaΣ wfΣ IHeval1 etad). + rewrite isEtaExp_Constructor => /andP[] etac etaargs. forward_keep IHeval2 => //. eapply isEtaExp_iota_red'; eauto. - eapply forallb_nth_error in etabrs; tea. erewrite e2 in etabrs. - cbn in etabrs. now rewrite -e4 app_nil_r skipn_length in etabrs. + eapply forallb_nth_error in etabrs; tea. erewrite H1 in etabrs. + cbn in etabrs. now rewrite -H3 app_nil_r skipn_length in etabrs. econstructor; tea. - - congruence. + - simp_eta. move=> /andP[] etad etabrs. forward IHeval1 => //. eapply eval_iota_sing => //. tea. @@ -1722,9 +1710,9 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. + * move=> [] hl [] hf [] ha heta. clear H0. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. auto. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. set (H' := H); assert (eval_depth H' = eval_depth H) by reflexivity. clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. @@ -1781,8 +1769,8 @@ Proof. move/isEtaExp_tApp'. destruct decompose_app eqn:da. destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[]/ andP[] heta heta2 bargs. destruct block_args; inv bargs. - rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; try solve_discr. eauto. + * move=> [] hl [] hf [] ha heta. + rewrite hf in H. eapply eval_mkApps_Construct_inv in H as [? []]; solve_discr. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. rewrite hf in H. elimtype False. @@ -1832,11 +1820,10 @@ Proof. forward IHeval1 by tas. forward IHeval2. { eapply eval_etaexp in H; tea. - move: H; rewrite isEtaExp_mkApps // /= => /andP[] /andP[] etaapp etaargs bargs. + move: H; rewrite isEtaExp_mkApps // /= => /andP[] etaapp etaargs. eapply forallb_nth_error in etaargs; tea. - now erewrite e3 in etaargs. } + now erewrite H2 in etaargs. } eapply eval_proj; tea. - - congruence. - simp_eta => etad. forward IHeval by tas. eapply eval_proj_prop ; tea. @@ -1844,13 +1831,13 @@ Proof. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. - set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. - clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. - eapply mkApps_eq_inj in heq as [] => //. noconf H2. noconf H3. + * move=> [] hl [] hf [] ha /andP[] heta etal. + set (H' := H0) ; assert (eval_depth H' = eval_depth H0) by reflexivity. + clearbody H'. move: H' H4. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. + eapply mkApps_eq_inj in heq as [] => //. noconf H4. noconf H5. intros hevd. - rewrite (remove_last_last l0 a hl). + rewrite (remove_last_last l a hl). rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply eval_mkApps_Construct; tea. { now constructor. } @@ -1859,22 +1846,22 @@ Proof. eapply forallb_remove_last, forallb_All in etal. eapply All2_All_mix_left in hargs; tea. eapply All2_impl; tea. cbn; intros ? ? []. - destruct s as [evxy hevxy]. unshelve eapply H0; tea. lia. + destruct s as [evxy hevxy]. unshelve eapply H1; tea. lia. constructor; [|constructor]. rewrite -ha. eapply IHeval2. rewrite ha. now eapply forallb_last. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } - rewrite (remove_last_last l0 a hl) /=. + rewrite (remove_last_last l a hl) /=. rewrite mkApps_app. eapply eval_construct; tea. - pose proof H as Hfix. + pose proof H0 as Hfix. rewrite hf in Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. { solve_discr. } - { cbn in H1. + { cbn in H2. rewrite hf in IHeval1. eapply IHeval1. rewrite isEtaExp_mkApps // /= i /= etab /=. move: isel. - now rewrite {1}(remove_last_last l0 a hl) /= forallb_app => /andP[]. } + now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } { now rewrite -ha. } * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1883,22 +1870,21 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_construct; tea. - - congruence. - move/isEtaExp_tApp'. destruct decompose_app eqn:da. rewrite (decompose_app_inv da). destruct expanded_head_viewc. - * move=> [] hl [] hf [] ha /andP[] /andP[] heta etal bargs. destruct block_args; inv bargs. + * move=> [] hl [] hf [] ha /andP[] heta etal. set (H' := H) ; assert (eval_depth H' = eval_depth H) by reflexivity. - clearbody H'. move: H' H2. rewrite {1 2}hf. intros H'. - destruct (eval_mkApps_Construct_size wcon H') as [args'' [evc [evcs hargs heq]]]. + clearbody H'. move: H' H3. rewrite {1 2}hf. intros H'. + destruct (eval_mkApps_Construct_size H') as [args'' [evc [evcs hargs heq]]]. subst f'. - rewrite isConstructApp_mkApps /isConstructApp /= in i. - now rewrite !negb_or /= !andb_false_r in i. + rewrite isConstructApp_mkApps /isConstructApp /= in H1. + now rewrite !negb_or /= !andb_false_r in H1. * move => [hl [hf [ha /andP[] /andP[] etal etab]]] isel. forward IHeval2. { rewrite ha. now eapply forallb_last. } rewrite (remove_last_last l a hl) /=. - rewrite mkApps_app. rewrite wguard in i. + rewrite mkApps_app. rewrite wguard in H1. move: H H0. rewrite hf. intros H IH. eapply eval_app_cong; tea. @@ -1906,12 +1892,12 @@ Proof. unshelve eapply IH. exact H. lia. pose proof H as Hfix. eapply eval_stuck_fix_eq in Hfix as [args' [hargs [[hstuck ?]|]]]; auto. - { subst f'. rewrite isFixApp_mkApps in i. - now rewrite !negb_or /= !andb_false_r in i. } - { rewrite isEtaExp_mkApps // /= i0 /= etab /=. + { subst f'. rewrite isFixApp_mkApps in H1. + now rewrite !negb_or /= !andb_false_r in H1. } + { rewrite isEtaExp_mkApps // /= i /= etab /=. move: isel. now rewrite {1}(remove_last_last l a hl) /= forallb_app => /andP[]. } - cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. + cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. * move=> [] hl [] ha [] ht /andP[] hnth. now rewrite nth_error_nil /= in hnth. @@ -1920,11 +1906,10 @@ Proof. forward IHeval2 by tas. rewrite -(decompose_app_inv da). eapply eval_app_cong; tea. - cbn. rewrite wguard in i. - cbn. move: i. rewrite !negb_or; rtoProp; intuition auto. + cbn. rewrite wguard in H1. + cbn. move: H1. rewrite !negb_or; rtoProp; intuition auto. now eapply nisFixApp_nisFix. - intros hexp. now eapply eval_atom. - Unshelve. all: eauto. Qed. Lemma expanded_global_env_isEtaExp_env {Σ} : expanded_global_env Σ -> isEtaExp_env Σ. diff --git a/erasure/theories/EGlobalEnv.v b/erasure/theories/EGlobalEnv.v index 60aefe00d..3448f7540 100644 --- a/erasure/theories/EGlobalEnv.v +++ b/erasure/theories/EGlobalEnv.v @@ -247,7 +247,7 @@ Definition is_constructor_app_or_box t := | a => let (f, a) := decompose_app a in match f with - | tConstruct _ _ _ => true + | tConstruct _ _ => true | _ => false end end. diff --git a/erasure/theories/EInduction.v b/erasure/theories/EInduction.v index 659d24b37..61a591530 100644 --- a/erasure/theories/EInduction.v +++ b/erasure/theories/EInduction.v @@ -25,8 +25,7 @@ Lemma term_forall_list_ind : P t -> forall t0 : term, P t0 -> P (tLetIn n t t0)) -> (forall t u : term, P t -> P u -> P (tApp t u)) -> (forall s, P (tConst s)) -> - (forall (i : inductive) (n : nat) (args : list term), - All P args -> P (tConstruct i n args)) -> + (forall (i : inductive) (n : nat), P (tConstruct i n)) -> (forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) -> @@ -51,11 +50,6 @@ Proof. destruct l; constructor; [|apply auxl']. apply auxt. - revert l. - fix auxl' 1. - destruct l; constructor; [|apply auxl']. - apply auxt. - revert m. fix auxm 1. destruct m; constructor; [|apply auxm]. @@ -99,7 +93,6 @@ Fixpoint size t : nat := | tProj p c => S (size c) | tFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) | tCoFix mfix idx => S (list_size (fun x => size (dbody x)) mfix) - | tConstruct _ _ ignore_args => S (list_size size ignore_args) | _ => 1 end. @@ -175,7 +168,7 @@ Qed. Lemma size_mkApps_l {f l} (Hf : ~~ isApp f) (Hl : l <> []) : list_size size l < size (mkApps f l). Proof. rewrite size_mkApps. - destruct f => /= //; try lia. + destruct f => /= //; lia. Qed. (** Custom induction principle on syntax, dealing with the various lists appearing in terms. *) @@ -209,7 +202,7 @@ Section MkApps_rec. (papp : forall t u, ~~ isApp t -> u <> nil -> P t -> All P u -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat) args, All P args -> P (tConstruct i n args)) + (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) (pcase : forall (p : inductive * nat) (t : term), P t -> forall l : list (list name * term), All (fun x => P x.2) l -> P (tCase p t l)) @@ -236,7 +229,7 @@ Section MkApps_rec. let pl := All_rec P id l (fun x H => rec x) in rew _ in papp t l napp nonnil pt pl } | tConst k => pconst k - | tConstruct i n args => pconstruct i n _ (All_rec P id args (fun x H => rec x)) + | tConstruct i n => pconstruct i n | tCase ina c brs => pcase ina c (rec c) brs (All_rec P (fun x => x.2) brs (fun x H => rec x)) | tProj p c => pproj p c (rec c) | tFix mfix idx => pfix mfix idx (All_rec P dbody mfix (fun x H => rec x)) @@ -267,7 +260,7 @@ Section MkApps_rec. (plet : forall (n : name) (t : term), forall t0 : term, P (tLetIn n t t0)) (papp : forall t u, ~~ isApp t -> u <> nil -> P (mkApps t u)) (pconst : forall s, P (tConst s)) - (pconstruct : forall (i : inductive) (n : nat) args, P (tConstruct i n args)) + (pconstruct : forall (i : inductive) (n : nat), P (tConstruct i n)) (pcase : forall (p : inductive * nat) (t : term) (l : list (list name * term)), P (tCase p t l)) (pproj : forall (s : projection) (t : term), P (tProj s t)) (pfix : forall (m : mfixpoint term) (n : nat), P (tFix m n)) @@ -288,7 +281,7 @@ Section MkApps_rec. let nonnil := decompose_app_app _ _ _ _ da in rew [P] (eq_sym (decompose_app_inv da)) in papp t l napp nonnil } | tConst k => pconst k - | tConstruct i n args => pconstruct i n args + | tConstruct i n => pconstruct i n | tCase ina c brs => pcase ina c brs | tProj p c => pproj p c | tFix mfix idx => pfix mfix idx diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index da5debd48..3f99c9e9c 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -90,7 +90,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct _ _ _ => t + | tConstruct _ _ => t (* | tPrim _ => t *) end. @@ -142,7 +142,6 @@ Section optimize. unfold wf_fix, test_def in *; simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct (k ?= n0)%nat; auto. - - f_equal. rtoProp. now destruct args; inv H0. - move/andP: wft => [] /andP[] hi hb hl. rewrite IHb. f_equal. unfold on_snd; solve_all. repeat toAll. f_equal. solve_all. unfold on_snd; cbn. f_equal. rewrite a0 //. now rewrite -Nat.add_assoc. @@ -407,7 +406,7 @@ Proof. now rewrite List.rev_length hskip Nat.add_0_r. Qed. -Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := false |}. +Definition disable_prop_cases fl := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. Lemma isFix_mkApps t l : isFix (mkApps t l) = isFix t && match l with [] => true | _ => false end. Proof. @@ -473,7 +472,7 @@ Proof. * intros hnth. now apply IHs. Qed. -Lemma optimize_correct (efl := all_env_flags) {fl} {wcon : with_constructor_as_block = false} { Σ : GlobalContextMap.t} t v : +Lemma optimize_correct (efl := all_env_flags) {fl} {Σ : GlobalContextMap.t} t v : wf_glob Σ -> @eval fl Σ t v -> wellformed Σ 0 t -> @@ -502,13 +501,11 @@ Proof. eapply nth_error_forallb in wfbrs; tea. rewrite Nat.add_0_r in wfbrs. forward IHev2. eapply wellformed_iota_red; tea => //. - rewrite optimize_iota_red in IHev2 => //. now rewrite e3. + rewrite optimize_iota_red in IHev2 => //. now rewrite e2. econstructor; eauto. rewrite -is_propositional_cstr_optimize //. tea. - rewrite nth_error_map e1 //. len. len. - - - congruence. - + rewrite nth_error_map e0 //. len. len. + - move/andP => [] /andP[] hl wfd wfbrs. forward IHev2. eapply wellformed_substl; tea => //. rewrite forallb_repeat //. len. @@ -590,7 +587,7 @@ Proof. move/wf_mkApps: ev1 => [] wfc wfargs. destruct lookup_projection as [[[[mdecl idecl] cdecl'] pdecl]|] eqn:hl' => //. pose proof (lookup_projection_lookup_constructor hl'). - rewrite (constructor_isprop_pars_decl_constructor H) in e0. noconf e0. + rewrite (constructor_isprop_pars_decl_constructor H) in e. noconf e. forward IHev1 by auto. forward IHev2. eapply nth_error_forallb in wfargs; tea. rewrite optimize_mkApps /= in IHev1. @@ -607,13 +604,11 @@ Proof. rewrite nth_error_rev. len. rewrite skipn_length. lia. rewrite List.rev_involutive. len. rewrite skipn_length. rewrite nth_error_skipn nth_error_map. - rewrite e1 -H1. + rewrite e0 -H1. assert((ind_npars mdecl + cstr_nargs cdecl - ind_npars mdecl) = cstr_nargs cdecl) by lia. rewrite H3. - eapply (f_equal (option_map (optimize Σ))) in e2. - cbn in e2. rewrite -e2. f_equal. f_equal. lia. - - - congruence. + eapply (f_equal (option_map (optimize Σ))) in e1. + cbn in e1. rewrite -e1. f_equal. f_equal. lia. - move=> /andP[] iss cld. rewrite GlobalContextMap.lookup_projection_spec. @@ -634,13 +629,11 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e0. + rewrite -lookup_constructor_optimize //. exact e. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. - - congruence. - - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply eval_app_cong; eauto. diff --git a/erasure/theories/ELiftSubst.v b/erasure/theories/ELiftSubst.v index f269e6574..91f9b59ad 100644 --- a/erasure/theories/ELiftSubst.v +++ b/erasure/theories/ELiftSubst.v @@ -34,7 +34,7 @@ Fixpoint lift n k t : term := | tBox => t | tVar _ => t | tConst _ => t - | tConstruct ind i args => tConstruct ind i (map (lift n k) args) + | tConstruct _ _ => t (* | tPrim _ => t *) end. @@ -69,7 +69,6 @@ Fixpoint subst s k u := let k' := List.length mfix + k in let mfix' := List.map (map_def (subst s k')) mfix in tCoFix mfix' idx - | tConstruct ind i args => tConstruct ind i (map (subst s k) args) | x => x end. @@ -96,7 +95,6 @@ Fixpoint closedn k (t : term) : bool := | tCoFix mfix idx => let k' := List.length mfix + k in List.forallb (test_def (closedn k')) mfix - | tConstruct ind i args => forallb (closedn k) args | _ => true end. @@ -108,7 +106,7 @@ Require Import PeanoNat. Import Nat. Lemma lift_rel_ge : - forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). + forall k n p, p <= n -> lift k p (tRel n) = tRel (k + n). Proof. intros; simpl in |- *. now elim (leb_spec p n). @@ -452,8 +450,8 @@ Proof. revert H. elim (Nat.ltb_spec n0 k); intros; try easy. - cbn. f_equal; auto. rtoProp; solve_all. - rtoProp; solve_all. - destruct x; f_equal; cbn in *. eauto. + rtoProp; solve_all. + destruct x; f_equal; cbn in *. now apply a0. Qed. Lemma closed_upwards {k t} k' : closedn k t -> k' >= k -> closedn k' t. @@ -606,7 +604,6 @@ Proof. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. rewrite IHt1 // IHt2 //. - - eapply All_forallb_eq_forallb; eauto. - rewrite IHt //. f_equal. eapply All_forallb_eq_forallb; tea. cbn. intros. specialize (H (#|x.1| + k')). diff --git a/erasure/theories/EOptimizePropDiscr.v b/erasure/theories/EOptimizePropDiscr.v index 2626cbd70..64a4ef6f7 100644 --- a/erasure/theories/EOptimizePropDiscr.v +++ b/erasure/theories/EOptimizePropDiscr.v @@ -61,7 +61,7 @@ Section optimize. | tBox => t | tVar _ => t | tConst _ => t - | tConstruct ind i args => tConstruct ind i (map optimize args) + | tConstruct _ _ => t (* | tPrim _ => t *) end. @@ -366,8 +366,7 @@ Proof. lookup_projection GlobalContextMap.inductive_isprop_and_pars]; intros => //. all:unfold wf_fix_gen in *; rtoProp; intuition auto. - all:try now f_equal; eauto; solve_all. - - destruct args; inv H2. reflexivity. + all:f_equal; eauto; solve_all. - rewrite !GlobalContextMap.inductive_isprop_and_pars_spec. assert (map (on_snd (optimize Σ)) l = map (on_snd (optimize Σ')) l) as -> by solve_all. rewrite (extends_inductive_isprop_and_pars H0 H1 H2). @@ -523,7 +522,7 @@ Proof. destruct nth_error => //. congruence. Qed. -Lemma optimize_correct {efl : EEnvFlags} {fl}{wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : +Lemma optimize_correct {efl : EEnvFlags} {fl} {Σ : GlobalContextMap.t} t v : wf_glob Σ -> closed_env Σ -> @Ee.eval fl Σ t v -> @@ -551,26 +550,11 @@ Proof. rewrite optimize_iota_red in IHev2. eapply eval_closed in ev1 => //. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). - eapply eval_iota; eauto. + rewrite (constructor_isprop_pars_decl_inductive e). + eapply eval_iota; eauto. tea. now rewrite -is_propositional_cstr_optimize. - rewrite nth_error_map e1 //. now len. cbn. - rewrite -e3. rewrite !skipn_length map_length //. - eapply IHev2. - eapply closed_iota_red => //; tea. - eapply nth_error_forallb in clbrs; tea. cbn in clbrs. - now rewrite Nat.add_0_r in clbrs. - - - move/andP => [] cld clbrs. - have := (eval_closed _ clΣ _ _ cld ev1). intros cl. - rewrite optimize_iota_red in IHev2. - eapply eval_closed in ev1 => //. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). - eapply eval_iota_block. eauto. eauto. - now rewrite -is_propositional_cstr_optimize. - rewrite nth_error_map e1 //. now len. cbn. - rewrite -e3. rewrite !skipn_length map_length //. + rewrite nth_error_map e0 //. now len. cbn. + rewrite -e2. rewrite !skipn_length map_length //. eapply IHev2. eapply closed_iota_red => //; tea. eapply nth_error_forallb in clbrs; tea. cbn in clbrs. @@ -673,25 +657,14 @@ Proof. eapply eval_closed in ev1; tea. move: ev1; rewrite closedn_mkApps /= => clargs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). + rewrite (constructor_isprop_pars_decl_inductive e). rewrite optimize_mkApps in IHev1. specialize (IHev1 cld). eapply Ee.eval_proj; tea. now rewrite -is_propositional_cstr_optimize. - now len. rewrite nth_error_map e2 //. - eapply IHev2. - eapply nth_error_forallb in e2; tea. - - - move=> cld. - eapply eval_closed in ev1; tea. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). - specialize (IHev1 cld). - eapply Ee.eval_proj_block; tea. - now rewrite -is_propositional_cstr_optimize. - now len. rewrite nth_error_map e2 //. + now len. rewrite nth_error_map e1 //. eapply IHev2. - eapply nth_error_forallb in e2; tea. + eapply nth_error_forallb in e1; tea. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. now rewrite e. @@ -699,13 +672,11 @@ Proof. - move/andP=> [] clf cla. rewrite optimize_mkApps. eapply eval_construct; tea. - rewrite -lookup_constructor_optimize //. exact e0. + rewrite -lookup_constructor_optimize //. exact e. rewrite optimize_mkApps in IHev1. now eapply IHev1. now len. now eapply IHev2. - - congruence. - - move/andP => [] clf cla. specialize (IHev1 clf). specialize (IHev2 cla). eapply Ee.eval_app_cong; eauto. @@ -727,10 +698,22 @@ Proof. destruct args using rev_case => // /=. rewrite map_app !mkApps_app /= //. destruct v => /= //. - destruct t => //. - all:constructor; eauto. cbn in *. destruct l; eauto. - Unshelve. all: repeat econstructor. + all:constructor; eauto. Qed. +(* +Lemma optimize_extends Σ Σ' : + wf_glob Σ' -> + extends Σ Σ' -> + forall t b, optimize Σ t = b -> optimize Σ' t = b. +Proof. + intros wf ext. + induction t using EInduction.term_forall_list_ind; cbn => //. + all:try solve [f_equal; solve_all]. + destruct inductive_isp + rewrite (extends_is_propositional wf ext). + *) + From MetaCoq.Erasure Require Import EEtaExpanded. Lemma isLambda_optimize Σ t : isLambda t -> isLambda (optimize Σ t). @@ -858,7 +841,6 @@ Proof. intros wfΣ hbox hrel. induction t in n |- * using EInduction.term_forall_list_ind => //. all:try solve [cbn; rtoProp; intuition auto; solve_all]. - - cbn. intros. rtoProp; intuition eauto. now destruct args; inv H0. - cbn -[GlobalContextMap.inductive_isprop_and_pars lookup_inductive]. move/and3P => [] hasc /andP[]hs ht hbrs. destruct GlobalContextMap.inductive_isprop_and_pars as [[[|] _]|] => /= //. destruct l as [|[br n'] [|l']] eqn:eql; simpl. @@ -897,8 +879,7 @@ Proof. destruct (cst_body c) => //. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. - destruct g eqn:hg => /= //. - all: try now (intros; rtoProp; congruence). + destruct g eqn:hg => /= //. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. subst g. diff --git a/erasure/theories/EPretty.v b/erasure/theories/EPretty.v index 96f534226..4322008aa 100644 --- a/erasure/theories/EPretty.v +++ b/erasure/theories/EPretty.v @@ -111,11 +111,11 @@ Module PrintTermTree. | tApp f l => parens (top || inapp) (print_term Γ false true f ^ " " ^ print_term Γ false false l) | tConst c => string_of_kername c - | tConstruct (mkInd i k as ind) l args => + | tConstruct (mkInd i k as ind) l => match lookup_ind_decl Σ i k with | Some oib => match nth_error oib.(ind_ctors) l with - | Some cstr => cstr.(cstr_name) ^ maybe_string_of_list string_of_term args + | Some cstr => cstr.(cstr_name) | None => "UnboundConstruct(" ^ string_of_inductive ind ^ "," ^ string_of_nat l ^ ")" end diff --git a/erasure/theories/EReflect.v b/erasure/theories/EReflect.v index 039df2bc7..99dc459ef 100644 --- a/erasure/theories/EReflect.v +++ b/erasure/theories/EReflect.v @@ -59,15 +59,6 @@ Proof. - destruct (IHx1 t1) ; nodec. destruct (IHx2 t2) ; nodec. subst. left. reflexivity. - - revert l. induction X ; intro l0. - + destruct l0. - * left. reflexivity. - * right. discriminate. - + destruct l0. - * right. discriminate. - * destruct (IHX l0) ; nodec. - destruct (p t) ; nodec. - inversion e. subst; left; reflexivity. - destruct (IHx t) ; nodec. subst. revert l0. clear IHx. induction X ; intro l0. diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index d17d52665..134be90a4 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -36,10 +36,10 @@ Section strip. | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => strip x)) | tLambda na M => EAst.tLambda na (strip M) | tApp u v napp nnil with construct_viewc u := { - | view_construct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | view_construct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { | Some npars := - mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map_InP v (fun x H => strip x))) - | None => mkApps (EAst.tConstruct kn c block_args) (map_InP v (fun x H => strip x)) } + mkApps (EAst.tConstruct kn c) (List.skipn npars (map_InP v (fun x H => strip x))) + | None => mkApps (EAst.tConstruct kn c) (map_InP v (fun x H => strip x)) } | view_other u nconstr => mkApps (strip u) (map_InP v (fun x H => strip x)) } @@ -57,15 +57,15 @@ Section strip. | tBox => EAst.tBox | tVar n => EAst.tVar n | tConst n => EAst.tConst n - | tConstruct ind i block_args => EAst.tConstruct ind i block_args }. + | tConstruct ind i => EAst.tConstruct ind i }. Proof. all:try lia. all:try apply (In_size); tea. - now eapply (In_size id size). - rewrite size_mkApps. - eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. + now eapply (In_size id size) in H. - rewrite size_mkApps. - eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. cbn. lia. + now eapply (In_size id size) in H. - now eapply size_mkApps_f. - pose proof (size_mkApps_l napp nnil). eapply (In_size id size) in H. change (fun x => size (id x)) with size in H. unfold id in H. lia. @@ -108,9 +108,9 @@ Section strip. - rewrite !closedn_mkApps in H1 *. rtoProp; intuition auto. solve_all. - - rewrite !closedn_mkApps /= in H0 *. rtoProp. - rewrite forallb_skipn; solve_all. solve_all. - - rewrite !closedn_mkApps /= in H0 *. rtoProp. repeat solve_all. + - rewrite !closedn_mkApps /= in H0 *. + rewrite forallb_skipn; solve_all. + - rewrite !closedn_mkApps /= in H0 *; solve_all. Qed. Hint Rewrite @forallb_InP_spec : isEtaExp. @@ -119,10 +119,10 @@ Section strip. Local Lemma strip_mkApps_nonnil f v : ~~ isApp f -> v <> [] -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c block_args => + | view_construct kn c => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -139,10 +139,10 @@ Section strip. Lemma strip_mkApps f v : ~~ isApp f -> strip (mkApps f v) = match construct_viewc f with - | view_construct kn c block_args => + | view_construct kn c => match lookup_inductive_pars Σ (inductive_mind kn) with - | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars (map strip v)) - | None => mkApps (EAst.tConstruct kn c block_args) (map strip v) + | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars (map strip v)) + | None => mkApps (EAst.tConstruct kn c) (map strip v) end | view_other u nconstr => mkApps (strip f) (map strip v) end. @@ -177,8 +177,7 @@ Section strip. simpl closed in *; try solve [simpl subst; simpl closed; f_equal; auto; rtoProp; solve_all]; try easy. - destruct Nat.compare => //. - - f_equal. rtoProp. solve_all. destruct block_args; inv H2. eauto. - - f_equal. solve_all. move/andP: b => [] _ he. solve_all. + - f_equal. solve_all. move/andP: b => [] _ he. solve_all. - specialize (H a k H1 H2). rewrite !csubst_mkApps in H2 *. rewrite isEtaExp_mkApps_napp // in H3. @@ -209,7 +208,7 @@ Section strip. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). rewrite -mkApps_app /= !skipn_map. f_equal. rewrite skipn_app map_app. f_equal. - assert (pars - #|l| = 0). rtoProp. rename H4 into ise. eapply Nat.leb_le in ise; lia. + assert (pars - #|l| = 0). eapply Nat.leb_le in ise; lia. rewrite H4 skipn_0. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } @@ -226,7 +225,7 @@ Section strip. rewrite /isEtaExp_app in H4. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => // /=. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). - assert (pars = 0). rtoProp. eapply Nat.leb_le in H4. lia. + assert (pars = 0). eapply Nat.leb_le in H4. lia. subst pars. rewrite skipn_0. simp strip; rewrite -strip_equation_1. { f_equal. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } } @@ -241,12 +240,11 @@ Section strip. unfold isEtaExp_app in etaapp. rewrite GlobalContextMap.lookup_inductive_pars_spec in Heq. rewrite Heq in etaapp *. - f_equal. - now destruct block_args; inv etav. - rewrite map_skipn. f_equal. + f_equal. rewrite map_skipn. f_equal. rewrite !map_map_compose. - rewrite isEtaExp_Constructor // in H2. rtoProp. - solve_all. + rewrite isEtaExp_Constructor // in H2. + move/andP: H2 => [] etaapp' ev. + clear -H0 H1 ev H. solve_all. - pose proof (etaExp_csubst _ _ k _ H1 H2). rewrite !csubst_mkApps /= in H3 *. assert (map (csubst a k) v <> []). @@ -435,9 +433,9 @@ Arguments isEtaExp : simpl never. Lemma isEtaExp_mkApps {Σ} {f u} : isEtaExp Σ (tApp f u) -> let (hd, args) := decompose_app (tApp f u) in match construct_viewc hd with - | view_construct kn c block_args => + | view_construct kn c => args <> [] /\ f = mkApps hd (remove_last args) /\ u = last args u /\ - isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args && is_nil block_args + isEtaExp_app Σ kn c #|args| && forallb (isEtaExp Σ) args | view_other _ discr => [&& isEtaExp Σ hd, forallb (isEtaExp Σ) args, isEtaExp Σ f & isEtaExp Σ u] end. @@ -498,7 +496,7 @@ Proof. rewrite isEtaExp_mkApps_napp // in etaf. simp construct_viewc in etaf. move/andP: etaf => []. rewrite /isEtaExp_app hl. - move => /andP[] /Nat.leb_le. lia. } + move/Nat.leb_le. lia. } { move/and4P=> [] iset isel _ _. rewrite (decompose_app_inv da). pose proof (decompose_app_notApp _ _ _ da). rewrite strip_mkApps //. @@ -533,9 +531,9 @@ Module Fast. | app, tCoFix mfix idx => let mfix' := strip_defs mfix in mkApps (EAst.tCoFix mfix' idx) app - | app, tConstruct kn c block_args with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { - | Some npars => mkApps (EAst.tConstruct kn c block_args) (List.skipn npars app) - | None => mkApps (EAst.tConstruct kn c block_args) app } + | app, tConstruct kn c with GlobalContextMap.lookup_inductive_pars Σ (inductive_mind kn) := { + | Some npars => mkApps (EAst.tConstruct kn c) (List.skipn npars app) + | None => mkApps (EAst.tConstruct kn c) app } | app, x => mkApps x app } where strip_args (t : list term) : list term := @@ -648,22 +646,22 @@ Proof. rewrite mkApps_app /= //. Qed. -Lemma isLambda_mkApps_Construct ind n block_args l : - ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n block_args) l). +Lemma isLambda_mkApps_Construct ind n l : + ~~ EAst.isLambda (EAst.mkApps (EAst.tConstruct ind n) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isBox_mkApps_Construct ind n block_args l : - ~~ isBox (EAst.mkApps (EAst.tConstruct ind n block_args) l). +Lemma isBox_mkApps_Construct ind n l : + ~~ isBox (EAst.mkApps (EAst.tConstruct ind n) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. Qed. -Lemma isFix_mkApps_Construct ind n block_args l : - ~~ isFix (EAst.mkApps (EAst.tConstruct ind n block_args) l). +Lemma isFix_mkApps_Construct ind n l : + ~~ isFix (EAst.mkApps (EAst.tConstruct ind n) l). Proof. induction l using rev_ind; cbn; try congruence. rewrite mkApps_app /= //. @@ -675,7 +673,7 @@ Proof. funelim (strip Σ f); cbn -[strip]; (try simp_strip) => //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //. rewrite (negbTE (isLambda_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _ _)) //. + all:rewrite !(negbTE (isLambda_mkApps_Construct _ _ _)) //. Qed. Lemma strip_isBox Σ f : @@ -685,7 +683,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isBox_mkApps' _ _ _)) //. rewrite (negbTE (isBox_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _ _)) //. + all:rewrite !(negbTE (isBox_mkApps_Construct _ _ _)) //. Qed. Lemma isApp_mkApps u v : v <> nil -> isApp (mkApps u v). @@ -710,7 +708,7 @@ Proof. all:rewrite map_InP_spec. rewrite (negbTE (isFix_mkApps' _ _ _)) //. rewrite (negbTE (isFix_mkApps' _ _ _)) //; try apply map_nil => //. - all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _ _)) //. + all:rewrite !(negbTE (isFix_mkApps_Construct _ _ _)) //. Qed. Lemma strip_isFixApp Σ f : @@ -778,16 +776,15 @@ Proof. destruct construct_viewc eqn:vc. + move=> /andP[] hl0 etal0. rewrite -mkApps_app. - rewrite (strip_mkApps Σ (tConstruct ind n block_args)) // /=. + rewrite (strip_mkApps Σ (tConstruct ind n)) // /=. rewrite strip_mkApps // /=. unfold isEtaExp_app in hl0. destruct lookup_constructor_pars_args as [[pars args']|] eqn:hl => //. - rtoProp. - eapply Nat.leb_le in H. + eapply Nat.leb_le in hl0. rewrite (lookup_inductive_pars_constructor_pars_args hl). rewrite -mkApps_app. f_equal. rewrite map_app. rewrite skipn_app. len. assert (pars - #|l| = 0) by lia. - now rewrite H1 skipn_0. + now rewrite H skipn_0. + move=> /andP[] etat0 etal0. rewrite -mkApps_app !strip_mkApps; try now eapply decompose_app_notApp. rewrite vc. rewrite -mkApps_app !map_app //. @@ -823,7 +820,7 @@ Proof. split; intros; rtoProp; intuition auto; solve_all. Qed. -Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : +Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {Σ : GlobalContextMap.t} t v : closed_env Σ -> isEtaExp_env Σ -> wf_glob Σ -> @@ -834,7 +831,7 @@ Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor Proof. intros clΣ etaΣ wfΣ ev clt etat. revert t v clt etat ev. - unshelve eapply (eval_preserve_mkApps_ind wfl wcon Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) + apply (eval_preserve_mkApps_ind wfl Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) (fun n x => closedn n x) (Qpres := Qpreserves_closedn Σ clΣ)) => //. { intros. eapply eval_closed; tea. } all:intros; simpl in *. @@ -866,7 +863,7 @@ Proof. * cbn -[strip]. have etaargs : forallb (isEtaExp Σ) args. { rewrite isEtaExp_Constructor in i6. - now move/andP: i6 => [] /andP[]. } + now move/andP: i6 => []. } rewrite strip_iota_red // in e. rewrite closedn_mkApps in i4. now move/andP: i4. cbn. now eapply nth_error_forallb in H; tea. @@ -1175,7 +1172,7 @@ Proof. rewrite strip_mkApps // /=. move: Heq. rewrite GlobalContextMap.lookup_inductive_pars_spec. - unfold wellformed in wfc. move/andP: wfc => [] /andP[] hacc hc bargs. + unfold wellformed in wfc. move/andP: wfc => [] hacc hc. unfold lookup_inductive_pars. destruct lookup_minductive eqn:heq => //. unfold lookup_constructor, lookup_inductive in hc. rewrite heq /= // in hc. Qed. diff --git a/erasure/theories/ESpineView.v b/erasure/theories/ESpineView.v index 8bbb0ca70..7bee803c6 100644 --- a/erasure/theories/ESpineView.v +++ b/erasure/theories/ESpineView.v @@ -17,7 +17,7 @@ Inductive t : term -> Set := | tLetIn n b b' : t (EAst.tLetIn n b b') | tApp (f : term) (l : list term) (napp : ~~ isApp f) (nnil : l <> nil) : t (mkApps f l) | tConst kn : t (tConst kn) -| tConstruct i n args : t (tConstruct i n args) +| tConstruct i n : t (tConstruct i n) | tCase ci p brs : t (tCase ci p brs) | tProj p c : t (tProj p c) | tFix mfix idx : t (tFix mfix idx) diff --git a/erasure/theories/ETransform.v b/erasure/theories/ETransform.v index 82f2318b3..9b34d1a0b 100644 --- a/erasure/theories/ETransform.v +++ b/erasure/theories/ETransform.v @@ -111,7 +111,7 @@ Qed. Import EWcbvEval (WcbvFlags, with_prop_case, with_guarded_fix). -Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} {efl : EEnvFlags} (wguard : with_guarded_fix) : +Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {efl : EEnvFlags} (wguard : with_guarded_fix) : Transform.t eprogram_env eprogram_env EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram_env (EWcbvEval.switch_unguarded_fix fl)) := {| name := "switching to unguarded fixpoints"; @@ -122,10 +122,10 @@ Program Definition guarded_to_unguarded_fix {fl : EWcbvEval.WcbvFlags} {wcon : E Next Obligation. cbn. eauto. Qed. Next Obligation. cbn. - move=> fl wcon efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. + move=> fl efl wguard [Σ t] v [wfp [etae etat]]. cbn in *. intros [ev]. exists v. split => //. red. sq. cbn in *. - unshelve eapply EEtaExpandedFix.eval_opt_to_target => //. auto. 2:apply wfp. + apply EEtaExpandedFix.eval_opt_to_target => //. 2:apply wfp. now eapply EEtaExpandedFix.expanded_global_env_isEtaExp_env. now eapply EEtaExpandedFix.expanded_isEtaExp. Qed. @@ -147,7 +147,7 @@ Next Obligation. cbn. intros fl efl input v [] ev p'; exists v. split => //. Qed. -Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} +Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} (efl := all_env_flags): Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters"; @@ -156,7 +156,7 @@ Program Definition remove_params_optimization {fl : EWcbvEval.WcbvFlags} {wcon : post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl wcon efl [Σ t] [wfp etap]. + move=> fl efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. split. now eapply ERemoveParams.strip_program_wf. @@ -164,17 +164,16 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. now sq. cbn in *. now eapply wellformed_closed_env. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. - Unshelve. auto. Qed. -Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) {wcon : EWcbvEval.with_constructor_as_block = false} +Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) (efl := all_env_flags) : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "stripping constructor parameters (faster?)"; @@ -183,7 +182,7 @@ Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) {w post p := wf_eprogram (switch_no_params efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; obseq g g' v v' := v' = (ERemoveParams.strip g.1 v) |}. Next Obligation. - move=> fl wcon efl [Σ t] [wfp etap]. + move=> fl efl [Σ t] [wfp etap]. simpl. cbn -[ERemoveParams.strip] in *. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. @@ -193,7 +192,7 @@ Next Obligation. Qed. Next Obligation. - red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. + red. move=> ? [Σ t] /= v [[wfe wft] etap] [ev]. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. @@ -202,12 +201,11 @@ Next Obligation. now move/andP: etap. now eapply wellformed_closed. now move/andP: etap. - Unshelve. auto. Qed. Import EOptimizePropDiscr EWcbvEval. -Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {wcon : with_constructor_as_block = false} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : +Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {efl : EEnvFlags} {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram (disable_prop_cases fl)) := {| name := "optimize_prop_discr"; transform p _ := optimize_program p ; @@ -216,23 +214,22 @@ Program Definition optimize_prop_discr_optimization {fl : WcbvFlags} {wcon : wit obseq g g' v v' := v' = EOptimizePropDiscr.optimize g.1 v |}. Next Obligation. - move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl wcon efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl efl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EOptimizePropDiscr.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. eapply wellformed_closed_env, wfe. eapply wellformed_closed, wfe. - Unshelve. eauto. Qed. From MetaCoq.Erasure Require Import EInlineProjections. -Program Definition inline_projections_optimization {fl : WcbvFlags} {wcon : EWcbvEval.with_constructor_as_block = false} (efl := all_env_flags) +Program Definition inline_projections_optimization {fl : WcbvFlags} (efl := all_env_flags) {hastrel : has_tRel} {hastbox : has_tBox} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env fl) (eval_eprogram fl) := {| name := "primitive projection inlining"; @@ -242,36 +239,14 @@ Program Definition inline_projections_optimization {fl : WcbvFlags} {wcon : EWcb obseq g g' v v' := v' = EInlineProjections.optimize g.1 v |}. Next Obligation. - move=> fl wcon efl hastrel hastbox [Σ t] [wfp etap]. + move=> fl efl hastrel hastbox [Σ t] [wfp etap]. cbn in *. split. - now eapply optimize_program_wf. - now eapply optimize_program_expanded. Qed. Next Obligation. - red. move=> fl wcon hastrel hastbox [Σ t] /= v [wfe wft] [ev]. + red. move=> fl hastrel hastbox [Σ t] /= v [wfe wft] [ev]. eapply EInlineProjections.optimize_correct in ev; eauto. eexists; split => //. red. sq; auto. cbn. apply wfe. - cbn. eapply wfe. Unshelve. auto. -Qed. - -From MetaCoq.Erasure Require Import EConstructorsAsBlocks. - -Program Definition constructors_as_blocks_transformation (efl := all_env_flags) - {hastrel : has_tRel} {hastbox : has_tBox} : - Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env target_wcbv_flags) (eval_eprogram block_wcbv_flags) := - {| name := "transforming to constuctors as blocks"; - transform p _ := EConstructorsAsBlocks.transform_blocks_program p ; - pre p := wf_eprogram_env efl p /\ EEtaExpanded.expanded_eprogram_env_cstrs p; - post p := wf_eprogram (disable_projections_env_flag efl) p /\ EEtaExpanded.expanded_eprogram_cstrs p; - obseq g g' v v' := True |}. - -Next Obligation. - move=> efl hastrel hastbox [Σ t] [wfp etap]. - cbn in *. split. - - todo "". - - todo "". -Qed. -Next Obligation. - red. move=> hastrel hastbox [Σ t] /= v [wfe wft] [ev]. - todo "". + cbn. eapply wfe. Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index fa2208429..c498a85ef 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -30,7 +30,7 @@ Local Ltac inv H := inversion H; subst. Definition atom t := match t with | tBox - | tConstruct _ _ [] + | tConstruct _ _ | tCoFix _ _ | tLambda _ _ | tFix _ _ => true @@ -54,17 +54,17 @@ Proof. Qed. (* Tells if the evaluation relation should include match-prop and proj-prop reduction rules. *) -Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool ; with_constructor_as_block : bool }. +Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool }. Definition disable_prop_cases fl : WcbvFlags := - {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := fl.(@with_constructor_as_block) |}. + {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) |}. Definition switch_unguarded_fix fl : WcbvFlags := - EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false fl.(@with_constructor_as_block). + EWcbvEval.Build_WcbvFlags fl.(@with_prop_case) false. -Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true ; with_constructor_as_block := false |}. -Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true ; with_constructor_as_block := false|}. -Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := false |}. +Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := true |}. +Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true |}. +Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false |}. Section Wcbv. Context {wfl : WcbvFlags}. @@ -93,19 +93,7 @@ Section Wcbv. (** Case *) | eval_iota ind pars cdecl discr c args brs br res : - with_constructor_as_block = false -> - eval discr (mkApps (tConstruct ind c []) args) -> - constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> - nth_error brs c = Some br -> - #|args| = pars + cdecl.(cstr_nargs) -> - #|skipn pars args| = #|br.1| -> - eval (iota_red pars args br) res -> - eval (tCase (ind, pars) discr brs) res - - (** Case *) - | eval_iota_block ind pars cdecl discr c args brs br res : - with_constructor_as_block = true -> - eval discr (tConstruct ind c args) -> + eval discr (mkApps (tConstruct ind c) args) -> constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) -> nth_error brs c = Some br -> #|args| = pars + cdecl.(cstr_nargs) -> @@ -171,18 +159,7 @@ Section Wcbv. (** Proj *) | eval_proj p cdecl discr args a res : - with_constructor_as_block = false -> - eval discr (mkApps (tConstruct p.(proj_ind) 0 []) args) -> - constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> - #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> - nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> - eval a res -> - eval (tProj p discr) res - - (** Proj *) - | eval_proj_block p cdecl discr args a res : - with_constructor_as_block = true -> - eval discr (tConstruct p.(proj_ind) 0 args) -> + eval discr (mkApps (tConstruct p.(proj_ind) 0) args) -> constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) -> #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a -> @@ -198,21 +175,12 @@ Section Wcbv. (** Constructor congruence: we do not allow over-applications *) | eval_construct ind c mdecl idecl cdecl f args a a' : - with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (mkApps (tConstruct ind c []) args) -> + eval f (mkApps (tConstruct ind c) args) -> #|args| < cstr_arity mdecl cdecl -> eval a a' -> - eval (tApp f a) (tApp (mkApps (tConstruct ind c []) args) a') + eval (tApp f a) (tApp (mkApps (tConstruct ind c) args) a') - (** Constructor congruence: we do not allow over-applications *) - | eval_construct_block ind c mdecl idecl cdecl args args' a a' : - with_constructor_as_block = true -> - lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - #|args| < cstr_arity mdecl cdecl -> - eval (tConstruct ind c args) (tConstruct ind c args') -> - eval a a' -> - eval (tConstruct ind c (args ++ [a])) (tConstruct ind c (args' ++ [a'])) (** Atoms (non redex-producing heads) applied to values are values *) | eval_app_cong f f' a a' : @@ -246,10 +214,9 @@ Section Wcbv. Variant value_head (nargs : nat) : term -> Type := | value_head_cstr ind c mdecl idecl cdecl : - with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> nargs <= cstr_arity mdecl cdecl -> - value_head nargs (tConstruct ind c []) + value_head nargs (tConstruct ind c) | value_head_cofix mfix idx : value_head nargs (tCoFix mfix idx) | value_head_fix mfix idx rarg fn : cunfold_fix mfix idx = Some (rarg, fn) -> @@ -261,11 +228,6 @@ Section Wcbv. Inductive value : term -> Type := | value_atom t : atom t -> value t - | value_constructor ind c mdecl idecl cdecl args : - with_constructor_as_block = true -> - lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - #|args| <= cstr_arity mdecl cdecl -> - All value args -> value (tConstruct ind c args) | value_app_nonnil f args : value_head #|args| f -> args <> [] -> All value args -> value (mkApps f args). Derive Signature for value. @@ -289,18 +251,13 @@ Section Wcbv. Lemma value_values_ind : forall P : term -> Type, (forall t, atom t -> P t) -> - (forall (ind : inductive) (c : nat) (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body) - (args : list term) (e : with_constructor_as_block = true) (e0 : lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl)) - (l : #|args| <= cstr_arity mdecl cdecl) (a : All value args) , All P args -> - P (tConstruct ind c args)) -> (forall f args, value_head #|args| f -> args <> [] -> All value args -> All P args -> P (mkApps f args)) -> forall t : term, value t -> P t. Proof. - intros P X X0 X1. + intros P ??. fix value_values_ind 2. destruct 1. - apply X; auto. - - eapply X0; auto; tea. clear -a value_values_ind. induction a; econstructor; auto. - - eapply X1; auto; tea. + - eapply X0; auto; tea. clear v n. revert args a. fix aux 2. destruct 1. constructor; auto. constructor. now eapply value_values_ind. now apply aux. Defined. @@ -320,19 +277,12 @@ Section Wcbv. Lemma value_mkApps_inv t l : ~~ isApp t -> value (mkApps t l) -> - ((l = []) /\ atom t) - + (l = [] × ∑ ind c mdecl idecl cdecl args, [ × with_constructor_as_block , lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl), t = tConstruct ind c args, #|args| <= cstr_arity mdecl cdecl & All value args]) - + ([× l <> [], value_head #|l| t & All value l]). + ((l = []) /\ atom t) + ([× l <> [], value_head #|l| t & All value l]). Proof. intros H H'. generalize_eq x (mkApps t l). revert x H' t H. apply: value_values_ind. - intros. subst. now eapply atom_mkApps in H. - - intros * wcon lup len H IH t ht hcon. - destruct l using rev_ind. - + cbn in hcon. invs hcon. left. right. - repeat eexists; eauto. - + rewrite mkApps_app in hcon. invs hcon. - intros * vh nargs hargs ih t isapp appeq. move: (value_head_nApp vh) => Ht. right. apply mkApps_eq_inj in appeq => //. intuition subst; auto => //. @@ -344,18 +294,8 @@ Section Wcbv. All value l. Proof. intros val not_app. - now apply value_mkApps_inv in val as [[(-> & ?) | [-> ] ] |[]]. + now apply value_mkApps_inv in val as [(-> & ?)|[]]. Qed. - - Lemma eval_Construct_inv ind c args e : - eval (tConstruct ind c args) e -> - ∑ args', e = tConstruct ind c args' × All2 eval args args'. - Proof. - intros H. depind H. - - edestruct IHeval1 as (args'' & [= ->] & H2); eauto. - repeat eexists; eauto. eapply All2_app; eauto. - - invs i. destruct args; invs H0. exists []. repeat econstructor. - Qed. Lemma eval_to_value e e' : eval e e' -> value e'. Proof. @@ -364,10 +304,7 @@ Section Wcbv. - change (tApp ?h ?a) with (mkApps h [a]). rewrite -mkApps_app. apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [[(-> & _) | [-> ] ] |[]]. - + apply value_app; auto. len. - cbn in *. econstructor; tea. - destruct with_guarded_fix => //. cbn; auto. + destruct IHev1 as [(-> & _)|[]]. + apply value_app; auto. len. cbn in *. econstructor; tea. destruct with_guarded_fix => //. cbn; auto. @@ -377,20 +314,12 @@ Section Wcbv. len; lia. apply All_app_inv; auto. - apply value_mkApps_inv in IHev1; [|easy]. - destruct IHev1 as [[(-> & _)|[-> ]] | []]. - + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + destruct IHev1 as [(-> & _)|[]]. + cbn. eapply (value_app _ [a']); cbn; auto. econstructor; tea. + rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply value_app. cbn; auto. econstructor; tea. cbn; len. eapply All_app_inv; auto. - - - invs IHev1. - + invs H. destruct args'; invs H1. econstructor 2; eauto. len; lia. now econstructor. - + rewrite e0 in H3; invs H3. - eapply eval_Construct_inv in ev1 as (? & [= <-] & Hall). - econstructor 2; eauto. len. eapply All2_length in Hall. lia. - eapply All_app_inv; eauto. - + destruct H1. destruct args0 using rev_ind. eauto. rewrite mkApps_app in H. invs H. + - destruct (mkApps_elim f' [a']). eapply value_mkApps_inv in IHev1 => //. destruct IHev1 as [?|[]]; intuition subst. @@ -403,13 +332,6 @@ Section Wcbv. now cbn in i. now cbn in i. + constructor. + econstructor; auto. - * destruct b0 as (ind & c & mdecl & idecl & cdecl & args & [H1 H2 H3 H4]). - rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). - rewrite a0 in i |- *. simpl in *. - apply (value_app f0 [a']). - destruct f0; simpl in * |- *; try congruence. - + rewrite !negb_or /= in i; rtoProp; intuition auto. - + destruct with_guarded_fix. now cbn in i. now cbn in i. * rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). eapply value_app; eauto with pcuic. 2:eapply All_app_inv; auto. len. @@ -562,7 +484,6 @@ Section Wcbv. - destruct L using rev_ind. reflexivity. rewrite mkApps_app in i. inv i. - - EAstUtils.solve_discr. - EAstUtils.solve_discr. depelim v. Qed. @@ -607,8 +528,6 @@ Section Wcbv. unfold atom in isatom. destruct argsv using rev_case => //. split; auto. simpl. simpl in isatom. rewrite H //. rewrite mkApps_app /= // in isatom. - - intros. destruct argsv using rev_case => //. - rewrite mkApps_app in Heqtfix => //. - intros * vf hargs vargs ihargs eq. solve_discr => //. depelim vf. rewrite e. intros [= <- <-]. destruct with_guarded_fix => //. split => //. unfold isStuckFix. rewrite e. now apply Nat.leb_le. @@ -627,14 +546,13 @@ Section Wcbv. Qed. Lemma eval_mkApps_Construct ind c mdecl idecl cdecl f args args' : - with_constructor_as_block = false -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (tConstruct ind c []) -> + eval f (tConstruct ind c) -> #|args| <= cstr_arity mdecl cdecl -> All2 eval args args' -> - eval (mkApps f args) (mkApps (tConstruct ind c []) args'). + eval (mkApps f args) (mkApps (tConstruct ind c) args'). Proof. - intros hblock hdecl evf hargs. revert args'. + intros hdecl evf hargs. revert args'. induction args using rev_ind; intros args' evargs. - depelim evargs. now cbn. - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. @@ -646,23 +564,6 @@ Section Wcbv. rewrite -(All2_length evl). lia. Qed. - Lemma eval_mkApps_Construct_block ind c mdecl idecl cdecl f args args' : - with_constructor_as_block -> - lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - eval f (tConstruct ind c []) -> - #|args| <= cstr_arity mdecl cdecl -> - All2 eval args args' -> - eval (tConstruct ind c args) (tConstruct ind c args'). - Proof. - intros hblock hdecl evf hargs. revert args'. - induction args using rev_ind; intros args' evargs. - - depelim evargs. econstructor. now cbn. - - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. - depelim evr. depelim evr. - eapply eval_construct_block; tea. 1: revert hargs; len. - eapply IHargs => //. 1: revert hargs; len. - Qed. - Lemma eval_mkApps_CoFix f mfix idx args args' : eval f (tCoFix mfix idx) -> All2 eval args args' -> @@ -719,13 +620,6 @@ Section Wcbv. Proof. move: e; eapply value_values_ind; simpl; intros; eauto with value. - now constructor. - - assert (All2 eval args args). - { clear -X; induction X; constructor; auto. } - induction args using rev_ind. repeat econstructor. - eapply All_app in a as [? HH]; eauto; invs HH. - eapply All_app in X as [? HH]; eauto; invs HH. - eapply All2_app_inv in X0 as [? HH]; eauto; invs HH. - econstructor; eauto. revert l. len. eapply IHargs; eauto. revert l. len. - assert (All2 eval args args). { clear -X0; induction X0; constructor; auto. } eapply eval_mkApps_cong => //. now eapply value_head_final. @@ -762,18 +656,9 @@ Section Wcbv. apply mkApps_eq_inj in apps_eq as (eq1 & eq2); try easy. noconf eq1. noconf eq2. noconf IHev1. - pose proof e0. rewrite e5 in H. noconf H. - pose proof e as e'. rewrite e4 in e'. noconf e'. - assert (br0 = br) as -> by congruence. - rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). - specialize (IHev2 _ ev'2); noconf IHev2. - reflexivity. - - depelim ev'; try go. - + specialize (IHev1 _ ev'1); noconf IHev1. - pose proof e0. rewrite e5 in H. noconf H. - pose proof e as e'. rewrite e4 in e'. noconf e'. - assert (br0 = br) as -> by congruence. - rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). + pose proof e0. rewrite e4 in H. noconf H. + pose proof e as e'. rewrite e3 in e'. noconf e'. + rewrite -> (uip e e3), (uip e0 e4), (uip e1 e5), (uip e2 e6). specialize (IHev2 _ ev'2); noconf IHev2. reflexivity. - depelim ev'; try go. @@ -875,48 +760,27 @@ Section Wcbv. specialize (IHev1 _ ev'1). pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. noconf IHev1. - assert (a0 = a) as -> by congruence. - pose proof e0 as e'. rewrite e4 in e'; noconf e'. - rewrite -> (uip e e3), (uip e0 e4). - pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite -> (uip e1 e5), (uip e2 e6). - now specialize (IHev2 _ ev'2); noconf IHev2. - - depelim ev'; try go. - specialize (IHev1 _ ev'1); noconf IHev1. - assert (a0 = a) as -> by congruence. - pose proof e0 as e'. rewrite e4 in e'; noconf e'. - rewrite -> (uip e e3), (uip e0 e4). - pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite -> (uip e1 e5), (uip e2 e6). + pose proof e as e'. rewrite e2 in e'; noconf e'. + rewrite -> (uip e e2), (uip e0 e3). + pose proof e4 as e4'. rewrite e1 in e4'; noconf e4'. + rewrite (uip e1 e4). now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. specialize (IHev _ ev'). noconf IHev. rewrite (uip e e0). now rewrite (uip i i0). - - depelim ev'; try now go. + - depelim ev'; try go. + move: (IHev1 _ ev'1). eapply DepElim.simplification_sigma1 => heq IHev1'. apply mkApps_eq_inj in heq as H'; auto. destruct H' as (H' & <-). noconf H'. noconf IHev1'. - pose proof e0 as e'. rewrite e2 in e'; noconf e'. + pose proof e as e'. rewrite e0 in e'; noconf e'. specialize (IHev2 _ ev'2). noconf IHev2. - now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + now rewrite -> (uip e e0), (PCUICWcbvEval.le_irrel _ _ l l0). + specialize (IHev1 _ ev'1). noconf IHev1. exfalso. rewrite isConstructApp_mkApps in i. cbn in i. rewrite !negb_or in i. rtoProp; intuition auto. - - depelim ev'; try go. - + eapply app_inj_tail in e3 as e4. destruct e4 as [-> ->]. - rewrite (uip e3 eq_refl) in H. cbn in H. subst. - move: (IHev1 _ ev'1). - eapply DepElim.simplification_sigma1 => heq IHev1'. - noconf heq. - noconf IHev1'. - specialize (IHev2 _ ev'2). noconf IHev2. - pose proof e2 as E. - rewrite e0 in E. noconf E. - now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). - + exfalso. invs i. destruct args; invs H0. - depelim ev'; try go. + exfalso. rewrite !negb_or in i. specialize (IHev1 _ ev'1); noconf IHev1. cbn in i. rtoProp; intuition auto. @@ -935,8 +799,7 @@ Section Wcbv. specialize (IHev2 _ ev'2); noconf IHev2. now assert (i0 = i) as -> by now apply uip. - depelim ev'; try go. - 2: now assert (i0 = i) as -> by now apply uip. - exfalso. invs i. destruct args; cbn in H0; invs H0. + now assert (i0 = i) as -> by now apply uip. Qed. Lemma eval_unique {t v} : @@ -1212,12 +1075,7 @@ Proof. move: IHev1; rewrite closedn_mkApps => /andP[] _ clargs. apply IHev2. rewrite /iota_red. eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e3. eapply nth_error_forallb in Hc'; tea. - now rewrite Nat.add_0_r in Hc'. - - specialize (IHev1 Hc). - apply IHev2. rewrite /iota_red. - eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e3. eapply nth_error_forallb in Hc'; tea. + len. rewrite e2. eapply nth_error_forallb in Hc'; tea. now rewrite Nat.add_0_r in Hc'. - subst brs. cbn in Hc'. rewrite andb_true_r in Hc'. eapply IHev2. eapply closed_substl. @@ -1253,15 +1111,9 @@ Proof. rewrite closedn_mkApps /= => clargs. eapply IHev2; eauto. eapply nth_error_forallb in clargs; tea. - - have := (IHev1 Hc). intros clargs. - eapply IHev2; eauto. - eapply nth_error_forallb in clargs; tea. - have := (IHev1 Hc). rewrite closedn_mkApps /= => clargs. rewrite clargs IHev2 //. - - rtoProp; intuition auto. forward IHev1; solve_all; - eapply All_app in Hc; solve_all. - eapply All_app_inv; solve_all. invs b. econstructor. eauto. econstructor. - rtoProp; intuition auto. Qed. @@ -1296,9 +1148,6 @@ Proof. - eapply IHev2; eauto. eapply wellformed_iota_red_brs; tea => //. rewrite wellformed_mkApps // in H2. move/andP: H2 => [] //. - - eapply IHev2; eauto. - eapply wellformed_iota_red_brs; tea => //. - now destruct args; inv H3. - subst brs. eapply IHev2. sim in H0. eapply wellformed_substl => //. eapply All_forallb, All_repeat => //. @@ -1326,10 +1175,6 @@ Proof. eapply IHev2; eauto. move/andP: clargs => [/andP[] hasc wfc wfargs]. eapply nth_error_forallb in wfargs; tea. - - eapply IHev2. - eapply nth_error_forallb in e2; eauto. - now destruct args; inv H0. - - destruct args; invs Hc''. Qed. Lemma remove_last_length {X} {l : list X} : @@ -1390,9 +1235,6 @@ Proof. - unshelve eexists; eauto. eapply eval_fix_value; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. - unshelve eexists. eapply eval_construct; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. cbn. lia. - - unshelve eexists. eapply eval_construct_block; eauto. - { clear - l He1. eapply eval_Construct_inv in He1 as (? & ? & ?). eapply All2_length in a. invs e. lia. } - eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2; lia. - unshelve eexists. eapply eval_app_cong; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. Qed. @@ -1516,13 +1358,11 @@ Proof. Qed. Lemma eval_mkApps_Construct_inv {fl : WcbvFlags} Σ kn c args e : - with_constructor_as_block = false -> - eval Σ (mkApps (tConstruct kn c []) args) e -> - ∑ args', (e = mkApps (tConstruct kn c []) args') × All2 (eval Σ) args args'. + eval Σ (mkApps (tConstruct kn c) args) e -> + ∑ args', (e = mkApps (tConstruct kn c) args') × All2 (eval Σ) args args'. Proof. - intros hblock. revert e; induction args using rev_ind; intros e. - - intros ev. depelim ev. congruence. exists []=> //. + - intros ev. depelim ev. exists []=> //. - intros ev. rewrite mkApps_app /= in ev. depelim ev; try solve_discr. destruct (IHargs _ ev1) as [? []]. solve_discr. @@ -1536,25 +1376,6 @@ Proof. * now cbn in i. Qed. -Lemma eval_mkApps_Construct_block_inv {fl : WcbvFlags} Σ kn c args oargs e : - with_constructor_as_block -> - eval Σ (mkApps (tConstruct kn c args) oargs) e -> - ∑ args', oargs = [] × (e = tConstruct kn c args') × All2 (eval Σ) args args'. -Proof. - intros hblock. - revert e; induction oargs using rev_ind; intros e. - - intros ev. depelim ev. - + eexists. split. reflexivity. split. reflexivity. - eapply eval_Construct_inv in ev1 as (? & [= <-] & ?). - eapply All2_app; eauto. - + invs i. destruct args; invs H0. exists []. repeat econstructor. - - intros ev. rewrite mkApps_app /= in ev. - depelim ev; try solve_discr. - all: try specialize (IHoargs _ ev1) as (? & ? & E & ?); try congruence; try solve_discr; try noconf E. - * subst. cbn in i. destruct with_guarded_fix; cbn in *; eauto. - * invs i. -Qed. - Lemma eval_mkApps_inv_size {wfl : WcbvFlags} {Σ f args v} : forall ev : eval Σ (mkApps f args) v, ∑ f' args' (evf : eval Σ f f'), @@ -1643,33 +1464,31 @@ Proof. Qed. Lemma eval_mkApps_Construct_size {wfl : WcbvFlags} {Σ ind c args v} : - with_constructor_as_block = false -> - forall ev : eval Σ (mkApps (tConstruct ind c []) args) v, - ∑ args' (evf : eval Σ (tConstruct ind c []) (tConstruct ind c [])), + forall ev : eval Σ (mkApps (tConstruct ind c) args) v, + ∑ args' (evf : eval Σ (tConstruct ind c) (tConstruct ind c)), [× eval_depth evf <= eval_depth ev, All2 (fun a a' => ∑ eva : eval Σ a a', eval_depth eva < eval_depth ev) args args' & - v = mkApps (tConstruct ind c []) args']. + v = mkApps (tConstruct ind c) args']. Proof. - intros hblock ev. + intros ev. destruct (eval_mkApps_inv_size ev) as [f'' [args' [? []]]]. exists args'. - exists (eval_atom _ (tConstruct ind c []) eq_refl). + exists (eval_atom _ (tConstruct ind c) eq_refl). cbn. split => //. destruct ev; cbn => //; auto with arith. clear l. - destruct (eval_mkApps_Construct_inv _ _ _ _ _ hblock ev) as [? []]. subst v. - eapply (@eval_mkApps_Construct_inv _ _ _ _ ) with (args0 := []) in x as [? []]; auto. subst f''. depelim a1. + destruct (eval_mkApps_Construct_inv _ _ _ _ _ ev) as [? []]. subst v. + eapply (eval_mkApps_Construct_inv _ _ _ []) in x as [? []]. subst f''. depelim a1. f_equal. eapply eval_deterministic_all; tea. - eapply All2_impl; tea; cbn; eauto. now intros x y []. + eapply All2_impl; tea; cbn; eauto. now intros x y []. Qed. Lemma eval_construct_size {fl : WcbvFlags} [Σ kn c args e] : - with_constructor_as_block = false -> - forall (ev : eval Σ (mkApps (tConstruct kn c []) args) e), - ∑ args', (e = mkApps (tConstruct kn c []) args') × + forall (ev : eval Σ (mkApps (tConstruct kn c) args) e), + ∑ args', (e = mkApps (tConstruct kn c) args') × All2 (fun x y => ∑ ev' : eval Σ x y, eval_depth ev' < eval_depth ev) args args'. Proof. - intros hblock ev; destruct (eval_mkApps_Construct_size hblock ev) as [args'[evf [_ hargs hv]]]. + intros ev; destruct (eval_mkApps_Construct_size ev) as [args'[evf [_ hargs hv]]]. exists args'; intuition auto. Qed. @@ -1684,4 +1503,5 @@ Proof. depelim H2. specialize (IHx e _ H' H). simpl. rewrite mkApps_app. simpl. econstructor; eauto. -Qed. \ No newline at end of file +Qed. + diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index a9f8f3403..8707820dc 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -14,14 +14,14 @@ Hint Constructors eval : core. Definition atomic_term (t : term) := match t with - | tBox | tConstruct _ _ _ | tConst _ | tRel _ | tVar _ => true + | tBox | tConstruct _ _ | tConst _ | tRel _ | tVar _ => true | _ => false end. Definition has_atom {etfl : ETermFlags} (t : term) := match t with | tBox => has_tBox - | tConstruct _ _ _ => has_tConstruct + | tConstruct _ _ => has_tConstruct | tConst _ => has_tConst | tRel _ => has_tRel | tVar _ => has_tVar @@ -141,7 +141,7 @@ Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := qpres_qcofix :> Qcofix Q }. Lemma eval_preserve_mkApps_ind : -∀ (wfl : WcbvFlags), with_constructor_as_block = false -> forall {efl : EEnvFlags} (Σ : global_declarations) +∀ (wfl : WcbvFlags) {efl : EEnvFlags} (Σ : global_declarations) (P' : term → term → Type) (Q : nat -> term -> Type) {Qpres : Qpreserves Q Σ} @@ -175,8 +175,8 @@ Lemma eval_preserve_mkApps_ind : (list name × term)) (br : list name × term) (res : term), forallb (λ x : list name × term, isEtaExp Σ x.2) brs -> - eval Σ discr (mkApps (tConstruct ind c []) args) - → P discr (mkApps (tConstruct ind c []) args) + eval Σ discr (mkApps (tConstruct ind c) args) + → P discr (mkApps (tConstruct ind c) args) → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) → nth_error brs c = Some br → #|args| = pars + cdecl.(cstr_nargs) @@ -280,8 +280,8 @@ Lemma eval_preserve_mkApps_ind : → (∀ p cdecl (discr : term) (args : list term) a (res : term), has_tProj -> eval Σ discr - (mkApps (tConstruct p.(proj_ind) 0 []) args) - → P discr (mkApps (tConstruct p.(proj_ind) 0 []) args) + (mkApps (tConstruct p.(proj_ind) 0) args) + → P discr (mkApps (tConstruct p.(proj_ind) 0) args) → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a @@ -308,15 +308,15 @@ Lemma eval_preserve_mkApps_ind : #|args| = cstr_arity mdecl cdecl -> All2 (eval Σ) args args' -> isEtaExp_app Σ ind i #|args| -> - Q 0 (mkApps (tConstruct ind i []) args) -> - Q 0 (mkApps (tConstruct ind i []) args') -> + Q 0 (mkApps (tConstruct ind i) args) -> + Q 0 (mkApps (tConstruct ind i) args') -> All2 P args args' -> - P' (mkApps (tConstruct ind i []) args) (mkApps (tConstruct ind i []) args')) → + P' (mkApps (tConstruct ind i) args) (mkApps (tConstruct ind i) args')) → (∀ t : term, atom t → Q 0 t -> isEtaExp Σ t -> P' t t) -> ∀ (t t0 : term), Q 0 t -> isEtaExp Σ t -> eval Σ t t0 → P' t t0. Proof. - intros wfl hcon. intros * Qpres P P'Q etaΣ wfΣ hasapp. + intros * Qpres P P'Q etaΣ wfΣ hasapp. assert (qfixs: Qfixs Q) by tc. assert (qcofixs: Qcofixs Q) by tc. intros. @@ -362,22 +362,22 @@ Proof. eapply H; tea; (apply and_assum; [ih|hp' P'Q]) end. destruct ev. - 1-18:eapply qpres in qt as qt'; depelim qt' => //. + 1-15:eapply qpres in qt as qt'; depelim qt' => //. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply X; tea; (apply and_assum; [ih|hp' P'Q]). iheta q. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. * move=> /and4P [] etat0 etaargs etaa etat. assert (ql : Q 0 (tLambda na b)). { eapply P'Q; tea. ih. } @@ -404,26 +404,25 @@ Proof. - simp_eta. move=> /andP[etad etabrs]. assert (isEtaExp Σ (iota_red pars args br)). { eapply isEtaExp_iota_red. - assert (isEtaExp Σ (mkApps (tConstruct ind c []) args)) by iheta q. - rewrite isEtaExp_mkApps_napp /= // in H. rewrite andb_true_r in H. + assert (isEtaExp Σ (mkApps (tConstruct ind c) args)) by iheta q. + rewrite isEtaExp_mkApps_napp /= // in H. now move/andP: H => []. - now clear IH; eapply nth_error_forallb in e1; tea. } + now clear IH; eapply nth_error_forallb in e0; tea. } assert (Q 0 (iota_red pars args br)). { unfold iota_red. eapply nth_error_all in a; tea. cbn in a. - rewrite -e3 in a. + rewrite -e2 in a. rewrite -(List.rev_length (skipn pars args)) in a. rewrite Nat.add_0_r in a. eapply (qsubst _ (List.rev (skipn pars args))) in a. 2:{ eapply All_rev, All_skipn. - assert (Q 0 (mkApps (tConstruct ind c []) args)). + assert (Q 0 (mkApps (tConstruct ind c) args)). eapply P'Q; tea; ih. eapply qapp in X13; tea. eapply X13. } exact a. } split. eapply X2; tea. 1,3:(apply and_assum; [ih|hp' P'Q]). eapply nth_error_all in a; tea; cbn. now rewrite Nat.add_0_r in a. iheta X13. - - congruence. - simp_eta; move=> /andP[etad etabrs]. assert (isEtaExp Σ (substl (repeat tBox #|n|) f)). { eapply isEtaExp_substl => //. rewrite forallb_repeat //. @@ -439,9 +438,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. * move=> /and4P [] etat0 etaargs etaa etat. pose proof (ev1' := ev1). eapply P'Q in ev1' => //. 2:{ clear ev1'; ih. } eapply qapp in ev1' as [hfix qargs] => //. @@ -473,9 +472,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. * move=> /and4P [] etat0 etaargs etaa etat. assert (isEtaExp Σ (tApp (mkApps (tFix mfix idx) argsv) av)). { rewrite -[tApp _ _](mkApps_app _ _ [av]). @@ -489,9 +488,9 @@ Proof. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. clear IH; rewrite ha in ev1. elimtype False. - eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. auto. + eapply eval_mkApps_Construct_inv in ev1 as [ex []]. solve_discr. * move=> /and4P [] etat0 etaargs etaa etat. assert (qav : Q 0 av). { eapply P'Q; tea; ih. } @@ -572,14 +571,13 @@ Proof. { eapply nth_error_all in qargs; tea. } clear ev1'; ih. } assert (isEtaExp Σ a). - { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0 []) args)) by iheta q. + { assert (isEtaExp Σ (mkApps (tConstruct p.(proj_ind) 0) args)) by iheta q. move: H; simp_eta. rewrite isEtaExp_mkApps_napp // /=. - move=> /andP[] /andP[] etaapp etaargs. - eapply nth_error_forallb in etaargs; tea. eauto. } + move=> /andP[] etaapp etaargs. + eapply nth_error_forallb in etaargs; tea. } split. eapply X10; tea; (apply and_assum; [ih|hp' P'Q]). iheta X13. - - congruence. - simp_eta => etadiscr. split. unshelve eapply X11; tea; try (intros; apply and_assum; [ih|hp' P'Q]). now idtac. @@ -587,11 +585,11 @@ Proof. rename args into cargs. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. - pose proof (eval_construct_size hcon ev1') as [ex []]. + pose proof (eval_construct_size ev1') as [ex []]. cbn in IH. intros eq. assert (All2 (λ x y : term, ∑ ev' : eval Σ x y, eval_depth ev' < S (Nat.max (eval_depth ev1) (eval_depth ev2))) (remove_last args ++ [a]) (ex ++ [a'])). @@ -615,12 +613,12 @@ Proof. eapply All2_All_mix_left in X15. 2:exact X14. eapply All2_All_right; tea; cbn. intros ? ? [? [? [? []]]]. split. eapply P'Q; tea. apply p. apply p. } - eapply mkApps_eq_inj in e1 as [] => //. subst ex. noconf H. + eapply mkApps_eq_inj in e0 as [] => //. subst ex. noconf H. split. unshelve eapply Xcappexp; tea. + rewrite ht -remove_last_last //. move: etaind; rewrite /isEtaExp_app. - rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e0). + rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ e). move/Nat.leb_le. move: l. rewrite /cstr_arity. eapply All2_length in X13. move: X13. rewrite ht /= -remove_last_last //. len. @@ -641,28 +639,26 @@ Proof. + rewrite isEtaExp_Constructor. apply/andP. split. rewrite -(All2_length X16). rewrite ht -remove_last_last //. - rtoProp. split. eauto. - eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. auto. + eapply All_forallb. eapply All_impl; tea. cbn; intuition auto. * move=> /and4P [] etat0 etaargs etaa etat. rewrite -[tApp _ a'](mkApps_app _ _ [a']). - assert (P' f (mkApps (tConstruct ind c []) cargs) × isEtaExp Σ (mkApps (tConstruct ind c []) cargs)). + assert (P' f (mkApps (tConstruct ind c) cargs) × isEtaExp Σ (mkApps (tConstruct ind c) cargs)). { unshelve eapply IH; tea. cbn. lia. } elimtype False. destruct X13 as [p'f etac]. move: etac. rewrite isEtaExp_Constructor. move/andP => []. rewrite /isEtaExp_app. - rewrite /lookup_constructor_pars_args e0 /=. - move => /andP[] /Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. - - congruence. + rewrite /lookup_constructor_pars_args e /=. + move/Nat.leb_le. clear IH. move: l; rewrite /cstr_arity. lia. - move/isEtaExp_tApp. destruct decompose_app as [hd args] eqn:da. destruct (construct_viewc hd) eqn:cv. - * move=> [] argsn [] ha [] ht /andP[] /andP[] etaind etaargs bargs. destruct block_args; inv bargs. + * move=> [] argsn [] ha [] ht /andP[] etaind etaargs. assert (eval_depth ev1 = eval_depth ev1) by reflexivity. set (ev1' := ev1). change ev1 with ev1' in H at 1. clearbody ev1'. move: H. subst f. exfalso. eapply eval_mkApps_Construct_inv in ev1' as [? [hf' hargs']]. subst f'. - clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. auto. + clear IH; move: i; rewrite !negb_or isConstructApp_mkApps /= !andb_false_r //. * move=> /and4P [] etat0 etaargs etaa etat. split. eapply (X12 _ _ _ _ ev1); tea. 1,3:(apply and_assum; [ih|hp' P'Q]). @@ -692,19 +688,18 @@ Ltac destruct_nary_times := | [ H : [× _, _, _, _ & _] |- _ ] => destruct H end. -Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : - with_constructor_as_block = false -> +Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : isEtaExp_env Σ -> wf_glob Σ -> eval Σ a a' -> isEtaExp Σ a -> isEtaExp Σ a'. Proof. - intros hcon etaΣ wfΣ ev eta. + intros etaΣ wfΣ ev eta. generalize I. intros q. revert a a' q eta ev. - eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. + eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. all:intros; repeat destruct_nary_times. all:intuition auto. - rewrite isEtaExp_Constructor => //. - rewrite -(All2_length X0) H1. cbn. rtoProp; intuition eauto. + rewrite -(All2_length X0) H1. cbn; eapply All_forallb. eapply All2_All_right; tea. cbn. intros x y []; auto. Qed. diff --git a/erasure/theories/EWcbvEvalInd.v b/erasure/theories/EWcbvEvalInd.v index 1435dc6ed..97a600227 100644 --- a/erasure/theories/EWcbvEvalInd.v +++ b/erasure/theories/EWcbvEvalInd.v @@ -37,36 +37,18 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.csubst b0' 0 b1) res → P (ECSubst.csubst b0' 0 b1) res → P (tLetIn na b0 b1) res) - → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) - (discr : term) (c : nat) (args : list term) - (brs : list (list name × term)) (br : list name × term) - (res : term) (e : with_constructor_as_block = false) - (e0 : eval Σ discr (mkApps (tConstruct ind c []) args)), - P discr (mkApps (tConstruct ind c []) args) - → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = - Some (false, pars, cdecl)) (e2 : - nth_error brs c = - Some br) - (e3 : #|args| = pars + cstr_nargs cdecl) - (e4 : #|skipn pars args| = #|br.1|) - (e5 : eval Σ (iota_red pars args br) res), - P (iota_red pars args br) res - → P (tCase (ind, pars) discr brs) res) - → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) - (discr : term) (c : nat) (args : list term) - (brs : list (list name × term)) (br : list name × term) - (res : term) (e : with_constructor_as_block = true) - (e0 : eval Σ discr (tConstruct ind c args)), - P discr (tConstruct ind c args) - → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = - Some (false, pars, cdecl)) - (e2 : nth_error brs c = Some br) - (e3 : #|args| = pars + cstr_nargs cdecl) - (e4 : #|skipn pars args| = #|br.1|) - (e5 : eval Σ (iota_red pars args br) res), - P (iota_red pars args br) res - → P (tCase (ind, pars) discr brs) res) - + → (∀ (ind : Kernames.inductive) (pars : nat) cdecl (discr : term) + (c : nat) (args : list term) (brs : list (list BasicAst.name × term)) + (br : list BasicAst.name × term) (res : term), + eval Σ discr (mkApps (tConstruct ind c) args) + → P discr (mkApps (tConstruct ind c) args) + → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) + → nth_error brs c = Some br + → #|args| = pars + cdecl.(cstr_nargs) + → #|skipn pars args| = #|br.1| + → eval Σ (iota_red pars args br) res + → P (iota_red pars args br) res + → P (tCase (ind, pars) discr brs) res) → (∀ (ind : Kernames.inductive) (pars : nat) (discr : term) (brs : list (list BasicAst.name × term)) (n : list BasicAst.name) (f3 res : term), @@ -78,7 +60,6 @@ Section eval_mkApps_rect. → eval Σ (ECSubst.substl (repeat tBox #|n|) f3) res → P (ECSubst.substl (repeat tBox #|n|) f3) res → P (tCase (ind, pars) discr brs) res) - → (∀ (f4 : term) (mfix : mfixpoint term) (idx : nat) (argsv : list term) (a av fn res : term), @@ -140,47 +121,16 @@ Section eval_mkApps_rect. cst_body decl = Some body → eval Σ body res → P body res → P (tConst c) res) - - → (∀ (p : projection) (cdecl : constructor_body) - (discr : term) (args : list term) - (a res : term) (e : with_constructor_as_block = - false) - (e0 : eval Σ discr - (mkApps - (tConstruct - (proj_ind p) 0 []) args)), - P discr - (mkApps - (tConstruct (proj_ind p) 0 []) - args) - → ∀ (e1 : constructor_isprop_pars_decl Σ - (proj_ind p) 0 = - Some (false, proj_npars p, cdecl)) - (e2 : #|args| = - proj_npars p + cstr_nargs cdecl) - (e3 : nth_error args - (proj_npars p + proj_arg p) = - Some a) (e4 : eval Σ a res), - P a res - → P (tProj p discr) res) - → (∀ (p : projection) (cdecl : constructor_body) - (discr : term) (args : list term) - (a res : term) (e : - with_constructor_as_block = - true) - (e0 : eval Σ discr - (tConstruct (proj_ind p) 0 args)), - P discr (tConstruct (proj_ind p) 0 args) - → ∀ (e1 : constructor_isprop_pars_decl Σ - (proj_ind p) 0 = - Some (false, proj_npars p, cdecl)) - (e2 : #|args| = - proj_npars p + cstr_nargs cdecl) - (e3 : nth_error args - (proj_npars p + proj_arg p) = - Some a) (e4 : eval Σ a res), - P a res - → P (tProj p discr) res) + → (∀ p (discr : term) (args : list term) + (res : term) cdecl a, + eval Σ discr (mkApps (tConstruct p.(proj_ind) 0) args) + → P discr (mkApps (tConstruct p.(proj_ind) 0) args) + → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) + → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) + -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a + -> eval Σ a res + → P a res + → P (tProj p discr) res) → (∀ p (discr : term), with_prop_case @@ -189,72 +139,30 @@ Section eval_mkApps_rect. → inductive_isprop_and_pars Σ p.(proj_ind) = Some (true, p.(proj_npars)) → P (tProj p discr) tBox) - → (∀ (ind : inductive) - (c : nat) (mdecl : mutual_inductive_body) - (idecl : one_inductive_body) - (cdecl : constructor_body) - (f14 : term) (args : list term) - (a a' : term) - (e : with_constructor_as_block = false) - (e0 : lookup_constructor Σ ind c = - Some (mdecl, idecl, cdecl)) - (e1 : eval Σ f14 - (mkApps - (tConstruct ind c []) - args)), - IH _ _ e1 -> - P f14 - (mkApps (tConstruct ind c []) - args) - → ∀ (l : #|args| < cstr_arity mdecl cdecl) - (e2 : eval Σ a a'), - P a a' - → P (tApp f14 a) - (tApp - (mkApps - (tConstruct ind c - []) args) a')) + → (∀ ind c mdecl idecl cdecl f args a a', + lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> + forall (ev : eval Σ f (mkApps (tConstruct ind c) args)), + IH _ _ ev -> - → (∀ (ind : inductive) - (c : nat) (mdecl : mutual_inductive_body) - (idecl : one_inductive_body) - (cdecl : constructor_body) - (args args' : - list term) (a a' : term) - (e : with_constructor_as_block = true) - (e0 : lookup_constructor Σ ind c = - Some (mdecl, idecl, cdecl)) - (l : #|args| < cstr_arity mdecl cdecl) - (e1 : eval Σ - (tConstruct ind c args) - (tConstruct ind c args')), - P (tConstruct ind c args) - (tConstruct ind c args') - → ∀ e2 : eval Σ a a', - P a a' - → P (tConstruct ind c (args ++ [a])) - (tConstruct ind c - (args' ++ [a']))) + P f (mkApps (tConstruct ind c) args) -> + #|args| < cstr_arity mdecl cdecl -> + eval Σ a a' -> + P a a' -> + P (tApp f a) (tApp (mkApps (tConstruct ind c) args) a')) - → (∀ (f15 f' a a' : term) (e : eval Σ f15 f'), - P f15 f' -> IH _ _ e - → ∀ (i : ~~ - (isLambda f' - || - (if with_guarded_fix - then isFixApp f' - else isFix f') || - isBox f' || - isConstructApp f')) - (e0 : eval Σ a a'), - P a a' - → P (tApp f15 a) - (tApp f' a') - ) + → (∀ (f11 f' : term) a a' , + forall (ev : eval Σ f11 f'), + P f11 f' -> + IH _ _ ev + → ~~ (isLambda f' || (if with_guarded_fix then isFixApp f' else isFix f') || isBox f' + || isConstructApp f') + → eval Σ a a' + → P a a' + → P (tApp f11 a) (tApp f' a')) → (∀ t : term, atom t → P t t) → ∀ t t0 : term, eval Σ t t0 → P t t0. Proof using Type. - intros ????????????????????? H. + intros ?????????????????? H. pose proof (p := @Fix_F { t : _ & { t0 : _ & eval Σ t t0 }}). specialize (p (MR lt (fun x => eval_depth x.π2.π2))). set(foo := existT _ t (existT _ t0 H) : { t : _ & { t0 : _ & eval Σ t t0 }}). @@ -285,3 +193,4 @@ Proof using Type. Qed. End eval_mkApps_rect. + diff --git a/erasure/theories/EWellformed.v b/erasure/theories/EWellformed.v index 67d031d0f..27828e501 100644 --- a/erasure/theories/EWellformed.v +++ b/erasure/theories/EWellformed.v @@ -76,8 +76,6 @@ Section wf. Definition wf_fix_gen (wf : nat -> term -> bool) k mfix idx := let k' := List.length mfix + k in (idx true | _ => false end. Fixpoint wellformed k (t : term) : bool := match t with @@ -98,7 +96,7 @@ Section wf. | Some d => has_axioms || isSome d.(cst_body) | _ => false end - | tConstruct ind c block_args => has_tConstruct && isSome (lookup_constructor Σ ind c) && is_nil block_args + | tConstruct ind c => has_tConstruct && isSome (lookup_constructor Σ ind c) | tVar _ => has_tVar end. @@ -160,8 +158,7 @@ Section EEnvFlags. autorewrite with map; simpl wellformed in *; intuition auto; unfold wf_fix, test_def, test_snd in *; - try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. - destruct args; firstorder. + try solve [simpl lift; simpl closed; f_equal; auto; repeat (rtoProp; simpl in *; solve_all)]; try easy. Qed. Lemma wellformed_closed_decl {t} : wf_global_decl Σ t -> closed_decl t. @@ -196,7 +193,6 @@ Section EEnvFlags. elim (Nat.ltb_spec); auto. apply Nat.ltb_lt in H1. lia. simpl; rewrite H0 /=. elim (Nat.ltb_spec); auto. intros. apply Nat.ltb_lt in H1. lia. - - solve_all. destruct args; firstorder. - solve_all. rewrite Nat.add_assoc. eauto. - len. move/andP: H1 => [] -> ha. cbn. solve_all. rewrite Nat.add_assoc; eauto. @@ -235,7 +231,6 @@ Section EEnvFlags. - specialize (IHt2 (S k')). rewrite <- Nat.add_succ_comm in IHt2. eapply IHt2; auto. - - now destruct args; inv H0. - specialize (a (#|x.1| + k')) => //. rewrite Nat.add_assoc (Nat.add_comm k) in a. rewrite !Nat.add_assoc. eapply a => //. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index fcc4c85aa..11ff060f7 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -43,17 +43,17 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf (* Simulation of the guarded fixpoint rules with a single unguarded one: the only "stuck" fixpoints remaining are unapplied. This translation is a noop on terms and environments. *) - guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ + guarded_to_unguarded_fix eq_refl ▷ (* Remove all constructor parameters *) - remove_params_optimization (wcon := eq_refl) ▷ + remove_params_optimization ▷ (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ (* Remove all cases / projections on propositional content *) - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl) ▷ (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := EWellformed.all_env_flags) ▷ (* Inline projections to cases *) - inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). + inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (hastrel := eq_refl) (hastbox := eq_refl). (* At the end of erasure we get a well-formed program (well-scoped globally and localy), without parameters in inductive declarations. The constructor applications are also expanded, and the evaluation relation does not need to consider guarded fixpoints or case analyses on propositional @@ -96,10 +96,10 @@ Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := E template_to_pcuic_transform ▷ pcuic_expand_lets_transform ▷ erase_transform ▷ - guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ - remove_params_fast_optimization (wcon := eq_refl) _ ▷ + guarded_to_unguarded_fix eq_refl ▷ + remove_params_fast_optimization _ ▷ rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (hastrel := eq_refl) (hastbox := eq_refl). Next Obligation. destruct H; split => //. now eapply ETransform.expanded_eprogram_env_expanded_eprogram_cstrs. Qed. diff --git a/erasure/theories/ErasureCorrectness.v b/erasure/theories/ErasureCorrectness.v index a3073b40c..f559b1aa2 100644 --- a/erasure/theories/ErasureCorrectness.v +++ b/erasure/theories/ErasureCorrectness.v @@ -325,7 +325,7 @@ Proof. invs H2. -- exists x2. split; eauto. - constructor. econstructor. eauto. eauto. 2:eauto. + constructor. econstructor. eauto. 2:eauto. 4:{ unfold EGlobalEnv.iota_red. rewrite ECSubst.substl_subst //. rewrite forallb_rev forallb_skipn //. @@ -1021,7 +1021,7 @@ Proof. eapply erases_deps_eval in Hed1; tea. eapply erases_deps_mkApps_inv in Hed1 as []. depelim H8. - constructor. eapply Ee.eval_construct; tea. eauto. + constructor. eapply Ee.eval_construct; tea. eapply (EGlobalEnv.declared_constructor_lookup H9). rewrite -(Forall2_length H7). rewrite /EAst.cstr_arity. @@ -1305,4 +1305,4 @@ Proof. + constructor => //. eapply erases_deps_mkApps_inv in etaΣ as []. solve_all. -Qed. +Qed. \ No newline at end of file diff --git a/erasure/theories/ErasureFunction.v b/erasure/theories/ErasureFunction.v index 0e61fb071..4b6fc0280 100644 --- a/erasure/theories/ErasureFunction.v +++ b/erasure/theories/ErasureFunction.v @@ -393,7 +393,7 @@ Section Erase. | tSort u := !%prg | tConst kn u := E.tConst kn | tInd kn u := !%prg - | tConstruct kn k u := E.tConstruct kn k [] + | tConstruct kn k u := E.tConstruct kn k | tProd _ _ _ := !%prg | tLambda na b b' := let t' := erase (vass na b :: Γ) b' _ in E.tLambda na.(binder_name) t' @@ -1942,7 +1942,7 @@ Section wffix. | tCoFix mfix idx => (idx true - | tConstruct ind c _ => true + | tConstruct ind c => true | tVar _ => true | tBox => true end. diff --git a/erasure/theories/ErasureProperties.v b/erasure/theories/ErasureProperties.v index 1b1ca62c5..8450c1c80 100644 --- a/erasure/theories/ErasureProperties.v +++ b/erasure/theories/ErasureProperties.v @@ -635,7 +635,7 @@ Proof. simpl; try solve [solve_all]. - now apply Nat.ltb_lt. - eapply trans_lookup_constant in wfa; tea. - - eapply trans_lookup_constructor in wfa; tea. now rewrite wfa. + - eapply trans_lookup_constructor in wfa; tea. - move/andP: wfa => [] /andP[] lookup wfc wfbrs. apply/andP. split. apply/andP. split; eauto. eapply trans_lookup_inductive; tea. @@ -677,8 +677,7 @@ Lemma eval_empty_brs {wfl : Ee.WcbvFlags} Σ ci p e : Σ ⊢ E.tCase ci p [] ▷ Proof. intros He. depind He. - - clear -e1. now rewrite nth_error_nil in e1. - - clear -e1. now rewrite nth_error_nil in e1. + - clear -e0. now rewrite nth_error_nil in e0. - discriminate. - eapply IHHe2. - cbn in i. discriminate. @@ -694,7 +693,6 @@ Proof. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. rewrite EAstUtils.mkApps_app in H. discriminate. - - depelim He1. - exists n, f. intuition auto. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. @@ -711,8 +709,6 @@ Proof. depind He. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. econstructor; eauto. now eapply Ee.value_final, Ee.eval_to_value. - - pose proof (Ee.eval_deterministic He1 Hc). subst c'. - eapply Ee.eval_iota_block; eauto. now eapply Ee.value_final, Ee.eval_to_value. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. eapply Ee.eval_iota_sing; tea. now constructor. - pose proof (Ee.eval_deterministic He1 Hc). subst c'. @@ -730,8 +726,6 @@ Proof. depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. - - pose proof (eval_trans' Hc He1); subst discr. - now econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. eapply Ee.eval_iota_sing; tea. - pose proof (eval_trans' Hc He1); subst discr. @@ -745,15 +739,13 @@ Lemma eval_proj_eval_inv_discr {wfl : Ee.WcbvFlags} {Σ p c c' e} : Σ ⊢ E.tProj p c' ▷ e. Proof. intros He Hc. - depind He. + depind He. - pose proof (eval_trans' Hc He1); subst discr. econstructor; eauto. - pose proof (eval_trans' Hc He1); subst discr. - now econstructor; tea. - - pose proof (eval_trans' Hc He1); subst discr. - now econstructor; tea. + eapply Ee.eval_proj; tea. - pose proof (eval_trans' Hc He); subst discr. - now econstructor; tea. + eapply Ee.eval_proj_prop; tea. - cbn in i. discriminate. Qed. diff --git a/erasure/theories/Extract.v b/erasure/theories/Extract.v index 9f0136c81..94b6fb0a9 100644 --- a/erasure/theories/Extract.v +++ b/erasure/theories/Extract.v @@ -55,7 +55,7 @@ Inductive erases (Σ : global_env_ext) (Γ : context) : term -> E.term -> Prop : Σ;;; Γ |- tConst kn u ⇝ℇ E.tConst kn | erases_tConstruct : forall (kn : inductive) (k : nat) (n : Instance.t), isPropositional Σ kn false -> - Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k [] + Σ;;; Γ |- tConstruct kn k n ⇝ℇ E.tConstruct kn k | erases_tCase1 (ci : case_info) (p : predicate term) (c : term) (brs : list (branch term)) (c' : E.term) (brs' : list (list name × E.term)) : @@ -113,7 +113,7 @@ Lemma erases_forall_list_ind P Γ (tConst kn u) (E.tConst kn)) (Hconstruct : forall Γ kn k n, isPropositional Σ kn false -> - P Γ (tConstruct kn k n) (E.tConstruct kn k [])) + P Γ (tConstruct kn k n) (E.tConstruct kn k)) (Hcase : forall Γ ci p c brs c' brs', PCUICElimination.Informative Σ ci.(ci_ind) -> Σ;;; Γ |- c ⇝ℇ c' -> @@ -266,7 +266,7 @@ Inductive erases_deps (Σ : global_env) (Σ' : E.global_declarations) : E.term - EGlobalEnv.declared_constructor Σ' (ind, c) mdecl' idecl' cdecl' -> erases_mutual_inductive_body mdecl mdecl' -> erases_one_inductive_body idecl idecl' -> - erases_deps Σ Σ' (E.tConstruct ind c []) + erases_deps Σ Σ' (E.tConstruct ind c) | erases_deps_tCase p mdecl idecl mdecl' idecl' discr brs : declared_inductive Σ (fst p) mdecl idecl -> EGlobalEnv.declared_inductive Σ' (fst p) mdecl' idecl' -> From c97d9489c2fe8ba720b910674dd6f2f862673e2b Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 13:22:07 +0200 Subject: [PATCH 17/43] Fixes after merge --- erasure/theories/EInlineProjections.v | 2 +- erasure/theories/ERemoveParams.v | 38 +++++++++++++-------------- erasure/theories/EWcbvEval.v | 2 +- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index 810ceab5f..a87f1defb 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -805,7 +805,7 @@ Definition disable_projections_env_flag (efl : EEnvFlags) := {| has_axioms := true; term_switches := disable_projections_term_flags term_switches; has_cstr_params := true ; - cstr_as_blocks := efl.(cstr_as_blocks) |}. + cstr_as_blocks := efl.(@cstr_as_blocks) |}. Lemma optimize_wellformed {efl : EEnvFlags} {Σ : GlobalContextMap.t} n t : has_tBox -> has_tRel -> diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index 2e760b906..8a61e6b7e 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -185,18 +185,18 @@ Section strip. rewrite isEtaExp_mkApps_napp // in H1. destruct construct_viewc. * cbn. rewrite strip_mkApps //. - * move/andP: H3 => [] et ev. + * move/andP: H1 => [] et ev. rewrite -H //. assert (map (csubst a k) v <> []). { destruct v; cbn; congruence. } - pose proof (etaExp_csubst Σ _ k _ H2 et). + pose proof (etaExp_csubst Σ _ k _ etaa et). destruct (isApp (csubst a k t)) eqn:eqa. { destruct (decompose_app (csubst a k t)) eqn:eqk. - rewrite (decompose_app_inv eqk) in H4 *. + rewrite (decompose_app_inv eqk) in H2 *. pose proof (decompose_app_notApp _ _ _ eqk). assert (l <> []). - { intros ->. rewrite (decompose_app_inv eqk) in eqa. now rewrite eqa in H5. } - rewrite isEtaExp_mkApps_napp // in H4. + { intros ->. rewrite (decompose_app_inv eqk) in eqa. now rewrite eqa in H3. } + rewrite isEtaExp_mkApps_napp // in H2. assert ((l ++ map (csubst a k) v)%list <> []). { destruct l; cbn; congruence. } @@ -204,7 +204,7 @@ Section strip. { rewrite -mkApps_app /=. rewrite strip_mkApps //. rewrite strip_mkApps //. cbn -[lookup_inductive_pars]. - move/andP: H4 => [] ise hl. + move/andP: H2 => [] ise hl. unfold isEtaExp_app in ise. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => //. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). @@ -212,32 +212,30 @@ Section strip. rewrite skipn_app map_app. f_equal. assert (pars - #|l| = 0). rtoProp. rename H2 into ise. eapply Nat.leb_le in ise; lia. rewrite H2 skipn_0. - rewrite !map_map_compose. - clear -H1 H2 ev H0. solve_all. } + rewrite !map_map_compose. solve_all. } { rewrite -mkApps_app. rewrite strip_mkApps //. rewrite hc. rewrite strip_mkApps // hc -mkApps_app map_app //. f_equal. f_equal. - rewrite !map_map_compose. - clear -H1 H2 ev H0. solve_all. } } + rewrite !map_map_compose. solve_all. } } { rewrite strip_mkApps ?eqa //. destruct (construct_viewc (csubst a k t)) eqn:eqc. - 2:{ f_equal. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } - simp isEtaExp in H4. - rewrite /isEtaExp_app in H4. + 2:{ f_equal. rewrite !map_map_compose. solve_all. } + simp isEtaExp in H2. + rewrite /isEtaExp_app in H2. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => // /=. rewrite (lookup_inductive_pars_constructor_pars_args eqpars). assert (pars = 0). rtoProp. eapply Nat.leb_le in H2. lia. subst pars. rewrite skipn_0. simp strip; rewrite -strip_equation_1. - { f_equal. rewrite !map_map_compose. clear -H1 H2 ev H0. solve_all. } } - - pose proof (etaExp_csubst _ _ k _ H1 H2). - rewrite !csubst_mkApps /= in H3 *. + { f_equal. rewrite !map_map_compose. solve_all. } } + - pose proof (etaExp_csubst _ _ k _ etaa H0). + rewrite !csubst_mkApps /= in H1 *. assert (map (csubst a k) v <> []). { destruct v; cbn; congruence. } rewrite strip_mkApps //. - rewrite isEtaExp_Constructor // in H3. - move/andP: H3. rewrite map_length. move=> [] etaapp etav. + rewrite isEtaExp_Constructor // in H1. + move/andP: H1. rewrite map_length. move=> [] etaapp etav. cbn -[lookup_inductive_pars]. unfold isEtaExp_app in etaapp. rewrite GlobalContextMap.lookup_inductive_pars_spec in Heq. @@ -252,9 +250,9 @@ Section strip. assert (map (csubst a k) v <> []). { destruct v; cbn; congruence. } rewrite strip_mkApps //. - rewrite isEtaExp_Constructor // in H3. + rewrite isEtaExp_Constructor // in H1. rewrite GlobalContextMap.lookup_inductive_pars_spec in Heq. - move/andP: H3. rewrite map_length. move=> [] etaapp etav. + move/andP: H1. rewrite map_length. move=> [] etaapp etav. cbn -[lookup_inductive_pars]. unfold isEtaExp_app in etaapp. destruct lookup_constructor_pars_args as [[pars args]|] eqn:eqpars => //. diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index 5e3683b85..9504e0ddb 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -1290,7 +1290,7 @@ Ltac sim := repeat (cbn ; autorewrite with simplifications). Lemma eval_wellformed {efl : EEnvFlags} {wfl : WcbvFlags} Σ : forall (has_app : has_tApp), (* necessary due to mkApps *) - efl.(cstr_as_blocks) = false -> + efl.(@cstr_as_blocks) = false -> wf_glob Σ -> forall t u, wellformed Σ 0 t -> eval Σ t u -> wellformed Σ 0 u. Proof. From c1dae3e295607bb640ee146c0a8b84af25730733 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Tue, 5 Jul 2022 13:28:16 +0200 Subject: [PATCH 18/43] Release changes 8.14 (#732) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix opam files and add make-opam-files script * Update authors * Release changes 8.15 (#731) * coqdocjs * coqdocjs * Release changes (#729) * Set version in opam files * Fix equations dependency * Fix build.yml * Fix opam files and add make-opam-files script * Update version bounds * Back to 8.16.dev versions * Opam make tests (#730) *  Make test-suite and examples also installable from the opam package * Test the "with-test" targets of the opam file * Plugin-demo building * Missing MetaCoq prefix in test-suite/plugin * The opam files actually require bash * Missing includes for local build of examples/test-suite * Fix opam build * Fix configure.h Co-authored-by: Yannick Forster * Add Kenji to the authors Co-authored-by: Yannick Forster --- .github/workflows/build.yml | 4 + .gitignore | 10 + Makefile | 5 +- README.md | 12 +- configure.sh | 15 ++ coq-metacoq-erasure.opam | 8 +- coq-metacoq-pcuic.opam | 8 +- coq-metacoq-safechecker.opam | 8 +- coq-metacoq-template.opam | 9 +- coq-metacoq-translations.opam | 14 +- coq-metacoq.opam | 8 +- examples/Makefile | 6 +- examples/_CoqProject | 16 -- examples/_CoqProject.in | 9 + html/config.js | 72 ++++++ html/coqdoc.css | 9 + html/coqdocjs.css | 224 ++++++++++++++++++ html/coqdocjs.js | 184 ++++++++++++++ html/resources/footer.html | 8 + html/resources/header.html | 27 +++ make-opam-files.sh | 23 ++ test-suite/Makefile | 6 +- test-suite/{_CoqProject => _CoqProject.in} | 7 - test-suite/plugin-demo/Makefile | 8 + .../{_CoqProject => _CoqProject.in} | 2 - .../{_PluginProject => _PluginProject.in} | 3 - test-suite/plugin-demo/theories/Extraction.v | 2 +- 27 files changed, 658 insertions(+), 49 deletions(-) delete mode 100644 examples/_CoqProject create mode 100644 examples/_CoqProject.in create mode 100644 html/config.js create mode 100644 html/coqdocjs.css create mode 100644 html/coqdocjs.js create mode 100644 html/resources/footer.html create mode 100644 html/resources/header.html create mode 100755 make-opam-files.sh rename test-suite/{_CoqProject => _CoqProject.in} (69%) rename test-suite/plugin-demo/{_CoqProject => _CoqProject.in} (56%) rename test-suite/plugin-demo/{_PluginProject => _PluginProject.in} (76%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 892463022..0bdc4760b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,10 @@ jobs: sudo chown -R coq:coq . # <-- opam exec -- ocamlfind list endGroup + before_install: | + startGroup "Print opam config" + opam config list; opam repo list; opam list + endGroup script: | startGroup "Build project" opam exec -- ./configure.sh --enable-${{matrix.target}} diff --git a/.gitignore b/.gitignore index 929b11a50..a2a268cfe 100644 --- a/.gitignore +++ b/.gitignore @@ -352,3 +352,13 @@ erasure/src/eEnvMap.ml erasure/src/eEnvMap.mli erasure/src/eGlobalEnv.mli erasure/src/eGlobalEnv.ml +Makefile.conf +test-suite/plugin-demo/src/META.coq-metacoq-demo-plugin +pcuic/src/META.coq-metacoq-pcuic +examples/_CoqProject +test-suite/_CoqProject +examples/metacoq-config +test-suite/metacoq-config +test-suite/plugin-demo/_CoqProject +test-suite/plugin-demo/_PluginProject +test-suite/plugin-demo/metacoq-config diff --git a/Makefile b/Makefile index 46150a69e..2af775929 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,8 @@ uninstall: all $(MAKE) -C translations uninstall html: all - "coqdoc" -toc -utf8 -interpolate -l -html \ + "coqdoc" --multi-index -toc -utf8 -interpolate -html \ + --with-header ./html/resources/header.html --with-footer ./html/resources/footer.html \ -R template-coq/theories MetaCoq.Template \ -R pcuic/theories MetaCoq.PCUIC \ -R safechecker/theories MetaCoq.SafeChecker \ @@ -104,7 +105,7 @@ ci-quick: ci-opam: # Use -v so that regular output is produced - opam install -v -y . + opam install --with-test -v -y . opam remove -y coq-metacoq coq-metacoq-template checktodos: diff --git a/README.md b/README.md index 827c22e03..50d79f3b4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@

[![Build status](https://github.com/MetaCoq/metacoq/actions/workflows/build.yml/badge.svg?branch=coq-8.14)](https://github.com/MetaCoq/metacoq/actions) [![MetaCoq Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://coq.zulipchat.com) -[![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/metacoq/metacoq) +[![Open in Visual Studio Code](https://img.shields.io/static/v1?logo=visualstudiocode&label=&message=Open%20in%20Visual%20Studio%20Code&labelColor=2c2c32&color=007acc&logoColor=007acc +)](https://open.vscode.dev/metacoq/metacoq) MetaCoq is a project formalizing Coq in Coq and providing tools for manipulating Coq terms and developing certified plugins @@ -250,14 +251,17 @@ alt="Yannick Forster" width="150px"/> src="https://github.com/MetaCoq/metacoq.github.io/raw/master/assets/meven-lennon-bertrand.jpeg" alt="Meven Lennon-Bertrand" width="150px"/>
+Gregory Malecha +alt="Jakob Botsch Nielsen" width="150px"/>

+alt="Matthieu Sozeau" width="150px"/> Nicolas Tabareau @@ -274,6 +278,7 @@ MetaCoq is developed by (left to right)
Cyril Cohen, Yannick Forster, Meven Lennon-Bertrand, +Kenji Maillard, Gregory Malecha, Jakob Botsch Nielsen, Matthieu Sozeau, @@ -288,6 +293,7 @@ Copyright (c) 2015-2022 Abhishek Anand, Matthieu Sozeau Copyright (c) 2017-2022 Simon Boulier, Nicolas Tabareau, Cyril Cohen Copyright (c) 2018-2022 Danil Annenkov, Yannick Forster, Théo Winterhalter Copyright (c) 2020-2022 Jakob Botsch Nielsen, Meven Lennon-Bertrand +Copyright (c) 2022 Kenji Maillard ``` This software is distributed under the terms of the MIT license. diff --git a/configure.sh b/configure.sh index b4958ed29..b3cd7648e 100755 --- a/configure.sh +++ b/configure.sh @@ -21,6 +21,10 @@ then SAFECHECKER_DEPS="-R ../pcuic/theories MetaCoq.PCUIC" ERASURE_DEPS="-R ../safechecker/theories MetaCoq.SafeChecker" TRANSLATIONS_DEPS="" + EXAMPLES_DEPS="-I ../safechecker/src -I ../erasure/src -R ../erasure/theories MetaCoq.Erasure" + TEST_SUITE_DEPS="-I ../safechecker/src -I ../erasure/src -R ../erasure/theories MetaCoq.Erasure" + PLUGIN_DEMO_DEPS="-I ../../template-coq/build -R ../../template-coq/theories MetaCoq.Template -I ../../template-coq/" + echo "METACOQ_CONFIG = local" > Makefile.conf else echo "Building MetaCoq globally (default)" # The safechecker and erasure plugins depend on the extractable template-coq plugin @@ -30,17 +34,28 @@ then SAFECHECKER_DEPS="" ERASURE_DEPS="" TRANSLATIONS_DEPS="" + EXAMPLES_DEPS="" + TEST_SUITE_DEPS="" + PLUGIN_DEMO_DEPS="-I ${COQLIB}/user-contrib/MetaCoq/Template" + echo "METACOQ_CONFIG = global" > Makefile.conf fi echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > pcuic/metacoq-config echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > safechecker/metacoq-config echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > erasure/metacoq-config echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > translations/metacoq-config + echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > examples/metacoq-config + echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > test-suite/metacoq-config + echo "# DO NOT EDIT THIS FILE: autogenerated from ./configure.sh" > test-suite/plugin-demo/metacoq-config echo ${PCUIC_DEPS} >> pcuic/metacoq-config echo ${PCUIC_DEPS} ${SAFECHECKER_DEPS} >> safechecker/metacoq-config echo ${PCUIC_DEPS} ${SAFECHECKER_DEPS} ${ERASURE_DEPS} >> erasure/metacoq-config echo ${PCUIC_DEPS} ${TRANSLATIONS_DEPS} >> translations/metacoq-config + echo ${PCUIC_DEPS} ${SAFECHECKER_DEPS} ${ERASURE_DEPS} ${TRANSLATIONS_DEPS} ${EXAMPLES_DEPS} >> examples/metacoq-config + echo ${PCUIC_DEPS} ${SAFECHECKER_DEPS} ${ERASURE_DEPS} ${TRANSLATIONS_DEPS} ${TEST_SUITE_DEPS} >> test-suite/metacoq-config + echo ${PLUGIN_DEMO_DEPS} >> test-suite/plugin-demo/metacoq-config + else echo "Error: coqc not found in path" fi diff --git a/coq-metacoq-erasure.opam b/coq-metacoq-erasure.opam index 88a9ead2e..fbcee6e11 100644 --- a/coq-metacoq-erasure.opam +++ b/coq-metacoq-erasure.opam @@ -2,21 +2,25 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.11" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" authors: ["Abhishek Anand " + "Danil Annenkov " "Simon Boulier " "Cyril Cohen " "Yannick Forster " "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " ] license: "MIT" build: [ - ["sh" "./configure.sh"] + ["bash" "./configure.sh"] [make "-j" "%{jobs}%" "-C" "erasure"] ] install: [ diff --git a/coq-metacoq-pcuic.opam b/coq-metacoq-pcuic.opam index 42bf1a8e7..79e5cc294 100644 --- a/coq-metacoq-pcuic.opam +++ b/coq-metacoq-pcuic.opam @@ -2,21 +2,25 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.11" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" authors: ["Abhishek Anand " + "Danil Annenkov " "Simon Boulier " "Cyril Cohen " "Yannick Forster " "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " ] license: "MIT" build: [ - ["sh" "./configure.sh"] + ["bash" "./configure.sh"] [make "-j" "%{jobs}%" "-C" "pcuic"] ] install: [ diff --git a/coq-metacoq-safechecker.opam b/coq-metacoq-safechecker.opam index 5105bdc62..7f14c2b92 100644 --- a/coq-metacoq-safechecker.opam +++ b/coq-metacoq-safechecker.opam @@ -2,21 +2,25 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.11" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" authors: ["Abhishek Anand " + "Danil Annenkov " "Simon Boulier " "Cyril Cohen " "Yannick Forster " "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " ] license: "MIT" build: [ - ["sh" "./configure.sh"] + ["bash" "./configure.sh"] [make "-j" "%{jobs}%" "-C" "safechecker"] ] install: [ diff --git a/coq-metacoq-template.opam b/coq-metacoq-template.opam index e62a818b2..20d2926c0 100644 --- a/coq-metacoq-template.opam +++ b/coq-metacoq-template.opam @@ -2,21 +2,25 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#master" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" authors: ["Abhishek Anand " + "Danil Annenkov " "Simon Boulier " "Cyril Cohen " "Yannick Forster " "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " ] license: "MIT" build: [ - ["sh" "./configure.sh"] + ["bash" "./configure.sh"] [make "-j" "%{jobs}%" "template-coq"] ] install: [ @@ -24,6 +28,7 @@ install: [ ] depends: [ "ocaml" {>= "4.07.1"} + "stdlib-shims" "coq" { >= "8.14" & < "8.15~" } "coq-equations" { >= "1.3" } ] diff --git a/coq-metacoq-translations.opam b/coq-metacoq-translations.opam index 3fcbaa469..d40935aea 100644 --- a/coq-metacoq-translations.opam +++ b/coq-metacoq-translations.opam @@ -2,17 +2,25 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.11" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" -authors: ["Simon Boulier " +authors: ["Abhishek Anand " + "Danil Annenkov " + "Simon Boulier " "Cyril Cohen " + "Yannick Forster " + "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " + "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " ] license: "MIT" build: [ - ["sh" "./configure.sh"] + ["bash" "./configure.sh"] [make "-j" "%{jobs}%" "-C" "translations"] ] install: [ diff --git a/coq-metacoq.opam b/coq-metacoq.opam index 8df96a6af..60cc1971d 100644 --- a/coq-metacoq.opam +++ b/coq-metacoq.opam @@ -2,14 +2,18 @@ opam-version: "2.0" version: "8.14.dev" maintainer: "matthieu.sozeau@inria.fr" homepage: "https://metacoq.github.io/metacoq" -dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.11" +dev-repo: "git+https://github.com/MetaCoq/metacoq.git#coq-8.16" bug-reports: "https://github.com/MetaCoq/metacoq/issues" authors: ["Abhishek Anand " + "Danil Annenkov " "Simon Boulier " "Cyril Cohen " "Yannick Forster " "Fabian Kunze " + "Meven Lennon-Bertrand " + "Kenji Maillard " "Gregory Malecha " + "Jakob Botsch Nielsen " "Matthieu Sozeau " "Nicolas Tabareau " "Théo Winterhalter " @@ -23,7 +27,7 @@ depends: [ "coq-metacoq-translations" {= version} ] build: [ - ["sh" "./configure.sh" ] {with-test} + ["bash" "./configure.sh" ] {with-test} [make "-C" "examples" ] {with-test} [make "-C" "test-suite" ] {with-test} ] diff --git a/examples/Makefile b/examples/Makefile index aef42de36..73691022f 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -3,9 +3,13 @@ all: examples examples: Makefile.coq $(MAKE) -f Makefile.coq TIMED=$(TIMED) -Makefile.coq: Makefile +Makefile.coq: Makefile _CoqProject coq_makefile -f _CoqProject -o Makefile.coq +_CoqProject: _CoqProject.in metacoq-config + cat metacoq-config > _CoqProject + cat _CoqProject.in >> _CoqProject + clean: Makefile.coq $(MAKE) -f Makefile.coq clean diff --git a/examples/_CoqProject b/examples/_CoqProject deleted file mode 100644 index a4603b8bf..000000000 --- a/examples/_CoqProject +++ /dev/null @@ -1,16 +0,0 @@ --I ../template-coq/build --I ../safechecker/src --I ../erasure/src --Q ../template-coq/theories MetaCoq.Template --Q ../pcuic/theories MetaCoq.PCUIC --Q ../safechecker/theories MetaCoq.SafeChecker --Q ../erasure/theories MetaCoq.Erasure --R . MetaCoq.Examples - -demo.v -constructor_tac.v -add_constructor.v -tauto.v -typing_correctness.v -metacoq_tour_prelude.v -metacoq_tour.v \ No newline at end of file diff --git a/examples/_CoqProject.in b/examples/_CoqProject.in new file mode 100644 index 000000000..c5492b0c2 --- /dev/null +++ b/examples/_CoqProject.in @@ -0,0 +1,9 @@ +-R . MetaCoq.Examples + +demo.v +constructor_tac.v +add_constructor.v +tauto.v +typing_correctness.v +metacoq_tour_prelude.v +metacoq_tour.v \ No newline at end of file diff --git a/html/config.js b/html/config.js new file mode 100644 index 000000000..211cbb228 --- /dev/null +++ b/html/config.js @@ -0,0 +1,72 @@ +var coqdocjs = coqdocjs || {}; + +coqdocjs.repl = { + "fun": "λ", + "forall": "∀", + "exists": "∃", + "~": "¬", + "/\\": "∧", + "\\/": "∨", + "->": "→", + "<-": "←", + "<->": "↔", + "=>": "⇒", + "<>": "≠", + "<=": "≤", + ">=": "≥", + "el": "∈", + "nel": "∉", + "<<=": "⊆", + "<<": "⊂", + "|-": "⊢", + "++": "⧺", + "===": "≡", + "=/=": "≢", + "=~=": "≅", + "==>": "⟹", + "lhd": "⊲", + "rhd": "⊳", + "nat": "ℕ", + "alpha": "α", + "beta": "β", + "gamma": "γ", + "delta": "δ", + "epsilon": "ε", + "eta": "η", + "iota": "ι", + "kappa": "κ", + "lambda": "λ", + "mu": "μ", + "nu": "ν", + "lia": "ω", + "phi": "ϕ", + "pi": "π", + "psi": "ψ", + "rho": "ρ", + "sigma": "σ", + "tau": "τ", + "theta": "θ", + "xi": "ξ", + "zeta": "ζ", + "Delta": "Δ", + "Gamma": "Γ", + "Pi": "Π", + "Sigma": "Σ", + "Lia": "Ω", + "Xi": "Ξ" +}; + +coqdocjs.subscr = { + "0" : "₀", + "1" : "₁", + "2" : "₂", + "3" : "₃", + "4" : "₄", + "5" : "₅", + "6" : "₆", + "7" : "₇", + "8" : "₈", + "9" : "₉", +}; + +coqdocjs.replInText = ["==>","<=>", "=>", "->", "<-", ":="]; diff --git a/html/coqdoc.css b/html/coqdoc.css index dbc930f5e..48096e555 100644 --- a/html/coqdoc.css +++ b/html/coqdoc.css @@ -230,6 +230,10 @@ tr.infrulemiddle hr { color: rgb(40%,0%,40%); } +.id[title="binder"] { + color: rgb(40%,0%,40%); +} + .id[type="definition"] { color: rgb(0%,40%,0%); } @@ -327,3 +331,8 @@ ul.doclist { margin-top: 0em; margin-bottom: 0em; } + +.code :target { + border: 2px solid #D4D4D4; + background-color: #e5eecc; +} diff --git a/html/coqdocjs.css b/html/coqdocjs.css new file mode 100644 index 000000000..575fc3dd0 --- /dev/null +++ b/html/coqdocjs.css @@ -0,0 +1,224 @@ +/* replace unicode */ + +.id[repl] .hidden { + font-size: 0; +} + +.id[repl]:before{ + content: attr(repl); +} + +/* folding proofs */ + +@keyframes show-proof { + 0% { + max-height: 1.2em; + opacity: 1; + } + 99% { + max-height: 1000em; + } + 100%{ + } +} + +@keyframes hide-proof { + from { + visibility: visible; + max-height: 10em; + opacity: 1; + } + to { + max-height: 1.2em; + } +} + +.proof { + cursor: pointer; +} +.proof * { + cursor: pointer; +} + +.proof { + overflow: hidden; + position: relative; + transition: opacity 1s; + display: inline-block; +} + +.proof[show="false"] { + max-height: 1.2em; + visibility: visible; + opacity: 0.3; +} + +.proof[show="false"][animate] { + animation-name: hide-proof; + animation-duration: 0.25s; +} + +.proof[show=true] { + animation-name: show-proof; + animation-duration: 10s; +} + +.proof[show="false"]:before { + position: absolute; + visibility: visible; + width: 100%; + height: 100%; + display: block; + opacity: 0; + content: "M"; +} +.proof[show="false"]:hover:before { + content: ""; +} + +.proof[show="false"] + br + br { + display: none; +} + +.proof[show="false"]:hover { + visibility: visible; + opacity: 0.5; +} + +#toggle-proofs[proof-status="no-proofs"] { + display: none; +} + +#toggle-proofs[proof-status="some-hidden"]:before { + content: "Show Proofs"; +} + +#toggle-proofs[proof-status="all-shown"]:before { + content: "Hide Proofs"; +} + + +/* page layout */ + +html, body { + height: 100%; + margin:0; + padding:0; +} + +body { + display: flex; + flex-direction: column +} + +#content { + flex: 1; + overflow: auto; + display: flex; + flex-direction: column; +} +#content:focus { + outline: none; /* prevent glow in OS X */ +} + +#main { + display: block; + padding: 16px; + padding-top: 1em; + padding-bottom: 2em; + margin-left: auto; + margin-right: auto; + max-width: 60em; + flex: 1 0 auto; +} + +.libtitle { + display: none; +} + +/* header */ +#header { + width:100%; + padding: 0; + margin: 0; + display: flex; + align-items: center; + background-color: rgb(21,57,105); + color: white; + font-weight: bold; + overflow: hidden; +} + + +.button { + cursor: pointer; +} + +#header * { + text-decoration: none; + vertical-align: middle; + margin-left: 15px; + margin-right: 15px; +} + +#header > .right, #header > .left { + display: flex; + flex: 1; + align-items: center; +} +#header > .left { + text-align: left; +} +#header > .right { + flex-direction: row-reverse; +} + +#header a, #header .button { + color: white; + box-sizing: border-box; +} + +#header a { + border-radius: 0; + padding: 0.2em; +} + +#header .button { + background-color: rgb(63, 103, 156); + border-radius: 1em; + padding-left: 0.5em; + padding-right: 0.5em; + margin: 0.2em; +} + +#header a:hover, #header .button:hover { + background-color: rgb(181, 213, 255); + color: black; +} + +#header h1 { padding: 0; + margin: 0;} + +/* footer */ +#footer { + text-align: center; + opacity: 0.5; + font-size: 75%; +} + +/* hyperlinks */ + +@keyframes highlight { + 50%{ + background-color: black; + } +} + +:target * { + animation-name: highlight; + animation-duration: 1s; +} + +a[name]:empty { + float: right; +} diff --git a/html/coqdocjs.js b/html/coqdocjs.js new file mode 100644 index 000000000..1a0b066d3 --- /dev/null +++ b/html/coqdocjs.js @@ -0,0 +1,184 @@ +var coqdocjs = coqdocjs || {}; +(function(){ + +function replace(s){ + var m; + if (m = s.match(/^(.+)'/)) { + return replace(m[1])+"'"; + } else if (m = s.match(/^([A-Za-z]+)_?(\d+)$/)) { + return replace(m[1])+m[2].replace(/\d/g, function(d){return coqdocjs.subscr[d]}); + } else if (coqdocjs.repl.hasOwnProperty(s)){ + return coqdocjs.repl[s] + } else { + return s; + } +} + +function toArray(nl){ + return Array.prototype.slice.call(nl); +} + +function replInTextNodes() { + coqdocjs.replInText.forEach(function(toReplace){ + toArray(document.getElementsByClassName("code")).concat(toArray(document.getElementsByClassName("inlinecode"))).forEach(function(elem){ + toArray(elem.childNodes).forEach(function(node){ + if (node.nodeType != Node.TEXT_NODE) return; + var fragments = node.textContent.split(toReplace); + node.textContent = fragments[fragments.length-1]; + for (var k = 0; k < fragments.length - 1; ++k) { + node.parentNode.insertBefore(document.createTextNode(fragments[k]),node); + var replacement = document.createElement("span"); + replacement.appendChild(document.createTextNode(toReplace)); + replacement.setAttribute("class", "id"); + replacement.setAttribute("type", "keyword"); + node.parentNode.insertBefore(replacement, node); + } + }); + }); + }); +} + +function replNodes() { + toArray(document.getElementsByClassName("id")).forEach(function(node){ + if (["var", "variable", "keyword", "notation", "definition", "inductive"].indexOf(node.getAttribute("type"))>=0){ + var text = node.textContent; + var replText = replace(text); + if(text != replText) { + node.setAttribute("repl", replText); + node.setAttribute("title", text); + var hidden = document.createElement("span"); + hidden.setAttribute("class", "hidden"); + while (node.firstChild) { + hidden.appendChild(node.firstChild); + } + node.appendChild(hidden); + } + } + }); +} + +function isVernacStart(l, t){ + t = t.trim(); + for(var s of l){ + if (t == s || t.startsWith(s+" ") || t.startsWith(s+".")){ + return true; + } + } + return false; +} + +function isProofStart(s){ + return isVernacStart(["Proof"], s); +} + +function isProofEnd(s){ + return isVernacStart(["Qed", "Admitted", "Defined", "Abort"], s); +} + +function proofStatus(){ + var proofs = toArray(document.getElementsByClassName("proof")); + if(proofs.length) { + for(var proof of proofs) { + if (proof.getAttribute("show") === "false") { + return "some-hidden"; + } + } + return "all-shown"; + } + else { + return "no-proofs"; + } +} + +function updateView(){ + document.getElementById("toggle-proofs").setAttribute("proof-status", proofStatus()); +} + +function foldProofs() { + var hasCommands = true; + var nodes = document.getElementsByClassName("command"); + if(nodes.length == 0) { + hasCommands = false; + console.log("no command tags found") + nodes = document.getElementsByClassName("id"); + } + toArray(nodes).forEach(function(node){ + if(isProofStart(node.textContent)) { + var proof = document.createElement("span"); + proof.setAttribute("class", "proof"); + + node.parentNode.insertBefore(proof, node); + if(proof.previousSibling.nodeType === Node.TEXT_NODE) + proof.appendChild(proof.previousSibling); + while(node && !isProofEnd(node.textContent)) { + proof.appendChild(node); + node = proof.nextSibling; + } + if (proof.nextSibling) proof.appendChild(proof.nextSibling); // the Qed + if (!hasCommands && proof.nextSibling) proof.appendChild(proof.nextSibling); // the dot after the Qed + + proof.addEventListener("click", function(proof){return function(e){ + if (e.target.parentNode.tagName.toLowerCase() === "a") + return; + proof.setAttribute("show", proof.getAttribute("show") === "true" ? "false" : "true"); + proof.setAttribute("animate", ""); + updateView(); + };}(proof)); + proof.setAttribute("show", "false"); + } + }); +} + +function toggleProofs(){ + var someProofsHidden = proofStatus() === "some-hidden"; + toArray(document.getElementsByClassName("proof")).forEach(function(proof){ + proof.setAttribute("show", someProofsHidden); + proof.setAttribute("animate", ""); + }); + updateView(); +} + +function repairDom(){ + // pull whitespace out of command + toArray(document.getElementsByClassName("command")).forEach(function(node){ + while(node.firstChild && node.firstChild.textContent.trim() == ""){ + console.log("try move"); + node.parentNode.insertBefore(node.firstChild, node); + } + }); + toArray(document.getElementsByClassName("id")).forEach(function(node){ + node.setAttribute("type", node.getAttribute("title")); + }); + toArray(document.getElementsByClassName("idref")).forEach(function(ref){ + toArray(ref.childNodes).forEach(function(child){ + if (["var", "variable"].indexOf(child.getAttribute("type")) > -1) + ref.removeAttribute("href"); + }); + }); + +} + +function fixTitle(){ + var url = "/" + window.location.pathname; + var modulename = "." + url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.')); + modulename = modulename.substring(modulename.lastIndexOf('.')+1); + if (modulename === "toc") {modulename = "Table of Contents";} + else if (modulename === "indexpage") {modulename = "Index";} + else {modulename = modulename + ".v";}; + document.title = modulename; +} + +function postprocess(){ + repairDom(); + replInTextNodes() + replNodes(); + foldProofs(); + document.getElementById("toggle-proofs").addEventListener("click", toggleProofs); + updateView(); +} + +fixTitle(); +document.addEventListener('DOMContentLoaded', postprocess); + +coqdocjs.toggleProofs = toggleProofs; +})(); diff --git a/html/resources/footer.html b/html/resources/footer.html new file mode 100644 index 000000000..d0f79a884 --- /dev/null +++ b/html/resources/footer.html @@ -0,0 +1,8 @@ + + + + + + diff --git a/html/resources/header.html b/html/resources/header.html new file mode 100644 index 000000000..cc81721b4 --- /dev/null +++ b/html/resources/header.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + +
+
diff --git a/make-opam-files.sh b/make-opam-files.sh new file mode 100755 index 000000000..be6bb62a5 --- /dev/null +++ b/make-opam-files.sh @@ -0,0 +1,23 @@ +#/usr/bin/env bash +echo "Target directory: " $1 +echo "Target version: " $2 +echo "Releases package: " $3 + +wget $3 +archive=`basename $3` +hash=`shasum -a 512 $archive | cut -f 1 -d " "` + +echo "Shasum = " $hash + +for f in *.opam; +do + opamf=${f/.opam/}; + target=$1/$opamf/$opamf.$2/opam; + echo $opamf; + mkdir $1/$opamf/$opamf.$2 + gsed -e "/^version:.*/d" $f > $target + echo url { >> $target + echo " src:" \"$3\" >> $target + echo " checksum:" \"sha512=$hash\" >> $target + echo } >> $target +done \ No newline at end of file diff --git a/test-suite/Makefile b/test-suite/Makefile index 93168ec11..a6cf61b73 100644 --- a/test-suite/Makefile +++ b/test-suite/Makefile @@ -5,9 +5,13 @@ all: bugs plugin-demo bugs: Makefile.coq $(MAKE) -f Makefile.coq TIMED=$(TIMED) -Makefile.coq: Makefile +Makefile.coq: Makefile _CoqProject coq_makefile -f _CoqProject -o Makefile.coq +_CoqProject: _CoqProject.in metacoq-config + cat metacoq-config > _CoqProject + cat _CoqProject.in >> _CoqProject + clean: Makefile.coq $(MAKE) -f Makefile.coq clean diff --git a/test-suite/_CoqProject b/test-suite/_CoqProject.in similarity index 69% rename from test-suite/_CoqProject rename to test-suite/_CoqProject.in index fb11b1fcd..cf3edbec7 100644 --- a/test-suite/_CoqProject +++ b/test-suite/_CoqProject.in @@ -1,10 +1,3 @@ --I ../template-coq/build --I ../safechecker/src --I ../erasure/src --Q ../template-coq/theories MetaCoq.Template --Q ../pcuic/theories MetaCoq.PCUIC --Q ../safechecker/theories MetaCoq.SafeChecker --Q ../erasure/theories MetaCoq.Erasure -R . MetaCoq.TestSuite # list obtained with `ls -1 *.v` diff --git a/test-suite/plugin-demo/Makefile b/test-suite/plugin-demo/Makefile index 42c55bbfd..3f53a81b6 100644 --- a/test-suite/plugin-demo/Makefile +++ b/test-suite/plugin-demo/Makefile @@ -10,6 +10,14 @@ Makefile.coq: _CoqProject Makefile.plugin: _PluginProject coq_makefile -f _PluginProject -o Makefile.plugin +_CoqProject: _CoqProject.in metacoq-config + cat metacoq-config > _CoqProject + cat _CoqProject.in >> _CoqProject + +_PluginProject: _PluginProject.in metacoq-config + cat metacoq-config > _PluginProject + cat _PluginProject.in >> _PluginProject + plugin: Makefile.plugin coq $(MAKE) -f Makefile.plugin diff --git a/test-suite/plugin-demo/_CoqProject b/test-suite/plugin-demo/_CoqProject.in similarity index 56% rename from test-suite/plugin-demo/_CoqProject rename to test-suite/plugin-demo/_CoqProject.in index 43ff5b807..d7dac400e 100644 --- a/test-suite/plugin-demo/_CoqProject +++ b/test-suite/plugin-demo/_CoqProject.in @@ -1,5 +1,3 @@ --R ../../template-coq/theories MetaCoq.Template --I ../../template-coq/build -R theories MetaCoq.ExtractedPluginDemo theories/Lens.v diff --git a/test-suite/plugin-demo/_PluginProject b/test-suite/plugin-demo/_PluginProject.in similarity index 76% rename from test-suite/plugin-demo/_PluginProject rename to test-suite/plugin-demo/_PluginProject.in index 29f6938f7..d72a39bd2 100644 --- a/test-suite/plugin-demo/_PluginProject +++ b/test-suite/plugin-demo/_PluginProject.in @@ -1,6 +1,3 @@ --R ../../template-coq/theories MetaCoq.Template --I ../../template-coq/build - -I src -I gen-src -R theories MetaCoq.ExtractedPluginDemo diff --git a/test-suite/plugin-demo/theories/Extraction.v b/test-suite/plugin-demo/theories/Extraction.v index 0179c5072..d173847b5 100644 --- a/test-suite/plugin-demo/theories/Extraction.v +++ b/test-suite/plugin-demo/theories/Extraction.v @@ -1,4 +1,4 @@ -Require Import Template.Extraction. +From MetaCoq Require Import Template.Extraction. Require Import Lens MyPlugin. Cd "gen-src". From c6426d9e4a161ea58b5b609f50e70f39c7d83c26 Mon Sep 17 00:00:00 2001 From: Yannick Forster Date: Wed, 6 Jul 2022 11:24:26 +0200 Subject: [PATCH 19/43] add support for nix, like #705 but as branch in this repo (#706) * add support for nix * hack around cachedMake script of coq-nix-toolbox * update coq-nix-toolbox version * testing with mac os CI Co-authored-by: Kenji Maillard --- .../workflows/nix-action-default-macos.yml | 127 ++++++++++++++++++ .../workflows/nix-action-default-ubuntu.yml | 127 ++++++++++++++++++ .nix/cachedMake.sh | 51 +++++++ .nix/config.nix | 103 ++++++++++++++ .nix/coq-nix-toolbox.nix | 1 + .nix/nixpkgs.nix | 4 + default.nix | 13 ++ 7 files changed, 426 insertions(+) create mode 100644 .github/workflows/nix-action-default-macos.yml create mode 100644 .github/workflows/nix-action-default-ubuntu.yml create mode 100755 .nix/cachedMake.sh create mode 100644 .nix/config.nix create mode 100644 .nix/coq-nix-toolbox.nix create mode 100644 .nix/nixpkgs.nix create mode 100644 default.nix diff --git a/.github/workflows/nix-action-default-macos.yml b/.github/workflows/nix-action-default-macos.yml new file mode 100644 index 000000000..f598ff280 --- /dev/null +++ b/.github/workflows/nix-action-default-macos.yml @@ -0,0 +1,127 @@ +jobs: + coq: + needs: [] + runs-on: macos-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target coq + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"coq\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "coq" + equations: + needs: [] + runs-on: macos-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target equations + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"equations\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "equations" + metacoq: + needs: + - equations + runs-on: macos-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target metacoq + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"metacoq\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: 'Building/fetching previous CI target: equations' + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "equations" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "metacoq" +name: Nix CI for bundle default +'on': + pull_request: + paths: + - .github/workflows/** + pull_request_target: + types: + - opened + - synchronize + - reopened + push: + branches: + - master diff --git a/.github/workflows/nix-action-default-ubuntu.yml b/.github/workflows/nix-action-default-ubuntu.yml new file mode 100644 index 000000000..f7ab44e8f --- /dev/null +++ b/.github/workflows/nix-action-default-ubuntu.yml @@ -0,0 +1,127 @@ +jobs: + coq: + needs: [] + runs-on: ubuntu-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target coq + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"coq\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "coq" + equations: + needs: [] + runs-on: ubuntu-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target equations + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"equations\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "equations" + metacoq: + needs: + - equations + runs-on: ubuntu-latest + steps: + - name: Determine which commit to test + run: "if [ ${{ github.event_name }} = \"push\" ]; then\n echo \"tested_commit=${{\ + \ github.sha }}\" >> $GITHUB_ENV\nelse\n merge_commit=$(git ls-remote ${{\ + \ github.event.repository.html_url }} refs/pull/${{ github.event.number }}/merge\ + \ | cut -f1)\n if [ -z \"$merge_commit\" ]; then\n echo \"tested_commit=${{\ + \ github.event.pull_request.head.sha }}\" >> $GITHUB_ENV\n else\n echo\ + \ \"tested_commit=$merge_commit\" >> $GITHUB_ENV\n fi\nfi\n" + - name: Git checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + ref: ${{ env.tested_commit }} + - name: Cachix install + uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixpkgs-unstable + - name: Cachix setup metacoq + uses: cachix/cachix-action@v10 + with: + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + extraPullNames: coq, coq-community + name: metacoq + - id: stepCheck + name: Checking presence of CI target metacoq + run: "nb_dry_run=$(NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link \\\n --argstr\ + \ bundle \"default\" --argstr job \"metacoq\" \\\n --dry-run 2>&1 > /dev/null)\n\ + echo $nb_dry_run\necho ::set-output name=status::$(echo $nb_dry_run | grep\ + \ \"built:\" | sed \"s/.*/built/\")\n" + - if: steps.stepCheck.outputs.status == 'built' + name: 'Building/fetching previous CI target: equations' + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "equations" + - if: steps.stepCheck.outputs.status == 'built' + name: Building/fetching current CI target + run: NIXPKGS_ALLOW_UNFREE=1 nix-build --no-out-link --argstr bundle "default" + --argstr job "metacoq" +name: Nix CI for bundle default +'on': + pull_request: + paths: + - .github/workflows/** + pull_request_target: + types: + - opened + - synchronize + - reopened + push: + branches: + - master diff --git a/.nix/cachedMake.sh b/.nix/cachedMake.sh new file mode 100755 index 000000000..d98316f73 --- /dev/null +++ b/.nix/cachedMake.sh @@ -0,0 +1,51 @@ +#! /usr/bin/bash + +# USAGE: To be run from the top directory of metacoq + +# This whole file is a hack around coq-nix-toolbox to manage the +# structure of metacoq directories + +export currentDir=$PWD +export configDir=$currentDir/.nix + +#There should be a way to ask nix directly +coq_version='8.14' + +my-nix-build-with-target (){ + target=$1 + shift + env -i PATH=$PATH NIX_PATH=$NIX_PATH nix-build -A $target \ + --argstr bundle "$selectedBundle" --no-out-link\ + --option narinfo-cache-negative-ttl 0 $* +} + +my-cachedMake (){ + cproj=$currentDir/$coqproject + cprojDir=$(dirname $cproj) + nb_dry_run=$(my-nix-build-with-target $1 --dry-run 2>&1 > /dev/null) + if echo $nb_dry_run | grep -q "built:"; then + echo "The compilation result is not in cache." + echo "Either it is not in cache (yet) or your must check your cachix configuration." + kill -INT $$ + else + build=$(my-nix-build-with-target $1) + realpath=$2 + namespace=$3 + logpath=${namespace/.//} + vopath="$build/lib/coq/$coq_version/user-contrib/$logpath" + dest=$cprojDir/$realpath + if [[ -d $vopath ]] + then echo "Compiling/Fetching and copying vo from $vopath to $realpath" + cp -nr --no-preserve=mode,ownership $vopath/* $dest + else echo "Error: cannot find compiled $logpath, check your .nix/config.nix" + fi + fi +} + +my-cachedMake 'template-coq' 'template-coq/theories' 'MetaCoq.Template' +my-cachedMake 'pcuic' 'pcuic/theories' 'MetaCoq.PCUIC' +my-cachedMake 'safechecker' 'safechecker/theories' 'MetaCoq.SafeChecker' +my-cachedMake 'erasure' 'erasure/theories' 'MetaCoq.Erasure' + +unset -f my-nix-build-with-target +unset -f my-cachedMake diff --git a/.nix/config.nix b/.nix/config.nix new file mode 100644 index 000000000..cf490f852 --- /dev/null +++ b/.nix/config.nix @@ -0,0 +1,103 @@ +{ + ## DO NOT CHANGE THIS + format = "1.0.0"; + ## unless you made an automated or manual update + ## to another supported format. + + ## The attribute to build from the local sources, + ## either using nixpkgs data or the overlays located in `.nix/coq-overlays` + ## Will determine the default main-job of the bundles defined below + attribute = "metacoq"; + + ## If you want to select a different attribute (to build from the local sources as well) + ## when calling `nix-shell` and `nix-build` without the `--argstr job` argument + # shell-attribute = "{{nix_name}}"; + + ## Maybe the shortname of the library is different from + ## the name of the nixpkgs attribute, if so, set it here: + # pname = "{{shortname}}"; + + ## Lists the dependencies, phrased in terms of nix attributes. + ## No need to list Coq, it is already included. + ## These dependencies will systematically be added to the currently + ## known dependencies, if any more than Coq. + ## /!\ Remove this field as soon as the package is available on nixpkgs. + ## /!\ Manual overlays in `.nix/coq-overlays` should be preferred then. + # buildInputs = [ ]; + + ## Indicate the relative location of your _CoqProject + ## If not specified, it defaults to "_CoqProject" + # coqproject = "_CoqProject"; + + ## select an entry to build in the following `bundles` set + ## defaults to "default" + default-bundle = "default"; + + ## write one `bundles.name` attribute set per + ## alternative configuration + ## When generating GitHub Action CI, one workflow file + ## will be created per bundle + bundles.default = { + + ## You can override Coq and other Coq coqPackages + ## through the following attribute + coqPackages.coq.override.version = "8.14"; + coqPackages.equations.override.version = "1.3+8.14"; + + ## In some cases, light overrides are not available/enough + ## in which case you can use either + # coqPackages..overrideAttrs = o: ; + # coqPackages.equations.overrideAttrs = o: ; + ## or a "long" overlay to put in `.nix/coq-overlays + ## you may use `nix-shell --run fetchOverlay ` + ## to automatically retrieve the one from nixpkgs + ## if it exists and is correctly named/located + + ## You can override Coq and other coqPackages + ## through the following attribute + ## If does not support light overrides, + ## you may use `overrideAttrs` or long overlays + ## located in `.nix/ocaml-overlays` + ## (there is no automation for this one) + # ocamlPackages..override.version = "x.xx"; + + ## You can also override packages from the nixpkgs toplevel + # .override.overrideAttrs = o: ; + ## Or put an overlay in `.nix/overlays` + + ## you may mark a package as a main CI job (one to take deps and + ## rev deps from) as follows + # coqPackages..main-job = true; + ## by default the current package and its shell attributes are main jobs + + ## you may mark a package as a CI job as follows + # coqPackages..job = "test"; + ## It can then built through + ## nix-build --argstr bundle "default" --arg job "test"; + ## in the absence of such a directive, the job "another-pkg" will + ## is still available, but will be automatically included in the CI + ## via the command genNixActions only if it is a dependency or a + ## reverse dependency of a job flagged as "main-job" (see above). + + }; + + ## Cachix caches to use in CI + ## Below we list some standard ones + cachix.coq = {}; + # cachix.math-comp = {}; + cachix.coq-community = {}; + + ## If you have write access to one of these caches you can + ## provide the auth token or signing key through a secret + ## variable on GitHub. Then, you should give the variable + ## name here. For instance, coq-community projects can use + ## the following line instead of the one above: + cachix.metacoq.authToken = "CACHIX_AUTH_TOKEN"; + + ## Or if you have a signing key for a given Cachix cache: + # cachix.my-cache.signingKey = "CACHIX_SIGNING_KEY" + + ## Note that here, CACHIX_AUTH_TOKEN and CACHIX_SIGNING_KEY + ## are the names of secret variables. They are set in + ## GitHub's web interface. +} diff --git a/.nix/coq-nix-toolbox.nix b/.nix/coq-nix-toolbox.nix new file mode 100644 index 000000000..3f1eb03ba --- /dev/null +++ b/.nix/coq-nix-toolbox.nix @@ -0,0 +1 @@ +"3fab39da659da297a9633cf0d53c8dcb5a8f24ad" diff --git a/.nix/nixpkgs.nix b/.nix/nixpkgs.nix new file mode 100644 index 000000000..29176d3c5 --- /dev/null +++ b/.nix/nixpkgs.nix @@ -0,0 +1,4 @@ +fetchTarball { + url = https://github.com/NixOS/nixpkgs/archive/34e4df55664c24df350f59adba8c7a042dece61e.tar.gz; + sha256 = "0z313l585blzzj17gnaqi41j3z24gb9ivjdjvqx3r8xwlh0n4b3i"; + } diff --git a/default.nix b/default.nix new file mode 100644 index 000000000..6fda2e8b2 --- /dev/null +++ b/default.nix @@ -0,0 +1,13 @@ +{ config ? {}, withEmacs ? false, print-env ? false, do-nothing ? false, + update-nixpkgs ? false, ci-matrix ? false, + override ? {}, ocaml-override ? {}, global-override ? {}, + bundle ? null, job ? null, inNixShell ? null, src ? ./., +}@args: +let auto = fetchGit { + url = "https://github.com/coq-community/coq-nix-toolbox.git"; + allRefs = true ; + # ref = "master"; + rev = import .nix/coq-nix-toolbox.nix; +}; +in +import auto ({inherit src;} // args) From 314186f200c515df21e711aa90b6c1a83a603bba Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Sat, 9 Jul 2022 01:34:56 +0200 Subject: [PATCH 20/43] Ewellformed islambda (#735) * Constructors as blocks improvement: they always have the right arity * Include "isLambda" for fixpoint bodies in the ewellformed predicate. * Derive an eliminator to reason on the evaluation relation when cstrs_as_blocks = true, preserving well-formedness --- erasure/_CoqProject.in | 1 + erasure/theories/EConstructorsAsBlocks.v | 112 ++-- erasure/theories/EDeps.v | 4 +- erasure/theories/EEtaExpandedFix.v | 8 +- erasure/theories/EInlineProjections.v | 38 +- erasure/theories/EOptimizePropDiscr.v | 18 +- erasure/theories/ERemoveParams.v | 31 +- erasure/theories/ETransform.v | 20 +- erasure/theories/EWcbvEval.v | 562 +++++++++++++++---- erasure/theories/EWcbvEvalCstrsAsBlocksInd.v | 487 ++++++++++++++++ erasure/theories/EWcbvEvalEtaInd.v | 83 ++- erasure/theories/EWcbvEvalInd.v | 22 +- erasure/theories/EWellformed.v | 19 +- erasure/theories/ErasureCorrectness.v | 2 +- erasure/theories/ErasureFunction.v | 2 +- erasure/theories/ErasureProperties.v | 8 +- 16 files changed, 1144 insertions(+), 273 deletions(-) create mode 100644 erasure/theories/EWcbvEvalCstrsAsBlocksInd.v diff --git a/erasure/_CoqProject.in b/erasure/_CoqProject.in index 9240b90d9..1eb4c6557 100644 --- a/erasure/_CoqProject.in +++ b/erasure/_CoqProject.in @@ -34,4 +34,5 @@ theories/ERemoveParams.v theories/EInlineProjections.v theories/ETransform.v theories/EConstructorsAsBlocks.v +theories/EWcbvEvalCstrsAsBlocksInd.v theories/Erasure.v diff --git a/erasure/theories/EConstructorsAsBlocks.v b/erasure/theories/EConstructorsAsBlocks.v index f85a3083b..60383dd6d 100644 --- a/erasure/theories/EConstructorsAsBlocks.v +++ b/erasure/theories/EConstructorsAsBlocks.v @@ -468,62 +468,37 @@ Definition env_flags_blocks := Local Existing Instance env_flags. -Lemma Qpreserves_wellformed Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. -Proof. - intros clΣ. - split. - - red. move=> n t. - destruct t; cbn; intuition auto; try solve [constructor; auto]. - eapply on_letin; rtoProp; intuition auto. - eapply on_app; rtoProp; intuition auto. - eapply on_case; rtoProp; intuition auto. solve_all. - eapply on_fix. solve_all. move/andP: H => [] _ ha. solve_all. - - red. intros kn decl. - move/(lookup_env_wellformed clΣ). - unfold wf_global_decl. destruct cst_body => //. - - red. move=> hasapp n t args. rewrite wellformed_mkApps //. - split; intros; rtoProp; intuition auto; solve_all. - - red. cbn => //. - (* move=> hascase n ci discr brs. simpl. - destruct lookup_inductive eqn:hl => /= //. - split; intros; rtoProp; intuition auto; solve_all. *) - - red. move=> hasproj n p discr. now cbn in hasproj. - - red. move=> t args clt cll. - eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. - - red. move=> n mfix idx. cbn. unfold wf_fix. - split; intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. - - red. move=> n mfix idx. cbn. - split; intros; rtoProp; intuition auto; solve_all. -Qed. - Definition block_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := true |}. Local Hint Resolve wellformed_closed : core. -Lemma wellformed_lookup_inductive_pars Σ kn mdecl : +Lemma wellformed_lookup_inductive_pars {efl : EEnvFlags} Σ kn mdecl : + has_cstr_params = false -> wf_glob Σ -> lookup_minductive Σ kn = Some mdecl -> mdecl.(ind_npars) = 0. Proof. + intros hasp. induction 1; cbn => //. case: eqb_spec => [|]. - intros ->. destruct d => //. intros [= <-]. cbn in H0. unfold wf_minductive in H0. - rtoProp. cbn in H0. now eapply eqb_eq in H0. + rtoProp. cbn in H0. rewrite hasp in H0; now eapply eqb_eq in H0. - intros _. eapply IHwf_glob. Qed. -Lemma wellformed_lookup_constructor_pars {Σ kn c mdecl idecl cdecl} : +Lemma wellformed_lookup_constructor_pars {efl : EEnvFlags} {Σ kn c mdecl idecl cdecl} : + has_cstr_params = false -> wf_glob Σ -> lookup_constructor Σ kn c = Some (mdecl, idecl, cdecl) -> mdecl.(ind_npars) = 0. Proof. - intros wf. cbn -[lookup_minductive]. + intros hasp wf. cbn -[lookup_minductive]. destruct lookup_minductive eqn:hl => //. do 2 destruct nth_error => //. eapply wellformed_lookup_inductive_pars in hl => //. congruence. Qed. -Lemma lookup_constructor_pars_args_spec {Σ ind n mdecl idecl cdecl} : +Lemma lookup_constructor_pars_args_spec {efl : EEnvFlags} {Σ ind n mdecl idecl cdecl} : wf_glob Σ -> lookup_constructor Σ ind n = Some (mdecl, idecl, cdecl) -> lookup_constructor_pars_args Σ ind n = Some (mdecl.(ind_npars), cdecl.(cstr_nargs)). @@ -533,23 +508,25 @@ Proof. intros [= -> -> <-]. cbn. f_equal. Qed. -Lemma wellformed_lookup_constructor_pars_args {Σ ind n block_args} : +Lemma wellformed_lookup_constructor_pars_args {efl : EEnvFlags} {Σ ind n block_args} : wf_glob Σ -> + has_cstr_params = false -> wellformed Σ 0 (EAst.tConstruct ind n block_args) -> ∑ args, lookup_constructor_pars_args Σ ind n = Some (0, args). Proof. - intros wfΣ wf. cbn -[lookup_constructor] in wf. + intros wfΣ hasp wf. cbn -[lookup_constructor] in wf. destruct lookup_constructor as [[[mdecl idecl] cdecl]|] eqn:hl => //. exists cdecl.(cstr_nargs). - pose proof (wellformed_lookup_constructor_pars wfΣ hl). + pose proof (wellformed_lookup_constructor_pars hasp wfΣ hl). eapply lookup_constructor_pars_args_spec in hl => //. congruence. + destruct has_tConstruct => //. Qed. -Lemma constructor_isprop_pars_decl_params {Σ ind c b pars cdecl} : - wf_glob Σ -> +Lemma constructor_isprop_pars_decl_params {efl : EEnvFlags} {Σ ind c b pars cdecl} : + has_cstr_params = false -> wf_glob Σ -> constructor_isprop_pars_decl Σ ind c = Some (b, pars, cdecl) -> pars = 0. Proof. - intros hwf. + intros hasp hwf. rewrite /constructor_isprop_pars_decl /lookup_constructor /lookup_inductive. destruct lookup_minductive as [mdecl|] eqn:hl => /= //. do 2 destruct nth_error => //. @@ -601,7 +578,7 @@ Proof. + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. cbn in wf. move: wf => /andP[]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. - destruct (wellformed_lookup_constructor_pars_args wfΣ wfc). + destruct (wellformed_lookup_constructor_pars_args wfΣ eq_refl wfc). rewrite e. cbn. destruct chop eqn:eqch => //. intros. apply H1. intuition auto. @@ -674,14 +651,17 @@ Proof. Qed. Lemma lookup_constructor_transform_blocks Σ ind c : -lookup_constructor (transform_blocks_env Σ) ind c = -lookup_constructor Σ ind c. + lookup_constructor (transform_blocks_env Σ) ind c = + lookup_constructor Σ ind c. Proof. unfold lookup_constructor, lookup_inductive, lookup_minductive in *. rewrite lookup_env_transform_blocks. destruct lookup_env as [ [] | ]; cbn; congruence. Qed. +Lemma isLambda_transform_blocks Σ c : isLambda c -> isLambda (transform_blocks Σ c). +Proof. destruct c => //. Qed. + Lemma transform_wellformed' Σ n t : wf_glob Σ -> @wellformed env_flags Σ n t -> @@ -692,9 +672,12 @@ Proof. all: rewrite ?map_InP_spec; toAll; eauto; try now solve_all. - destruct H1. unfold isEtaExp_app in H1. unfold lookup_constructor_pars_args in *. destruct (lookup_constructor Σ) as [[[]] | ]; try congruence; cbn - [transform_blocks]. - 2: eauto. split; auto. + 2: eauto. split; auto. cbn in H1. eapply Nat.leb_le in H1. + apply/eqb_spec. lia. - destruct H4. solve_all. - - unfold wf_fix in *. rtoProp. solve_all. len. solve_all. len. destruct x. + - unfold wf_fix in *. rtoProp. solve_all. now eapply isLambda_transform_blocks. + - unfold wf_fix in *. rtoProp. solve_all. + len. solve_all. len. destruct x. cbn -[transform_blocks isEtaExp] in *. rtoProp. eauto. - rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. intros. eapply isEtaExp_mkApps in H3. rewrite decompose_app_mkApps in H3; eauto. @@ -708,16 +691,18 @@ Proof. rewrite ?lookup_constructor_transform_blocks; eauto. * destruct lookup_constructor as [ [[]] | ] eqn:E; cbn -[transform_blocks] in *; eauto. invs Heq. rewrite chop_firstn_skipn in Ec. invs Ec. - rewrite firstn_length. len. eapply Nat.leb_le in H2. eapply Nat.leb_le. - destruct lookup_env as [ [] | ] eqn:E'; try congruence. - eapply lookup_env_wellformed in E'; eauto. - cbn in E'. red in E'. unfold wf_minductive in E'. - rewrite andb_true_iff in E'. - cbn in E'. destruct E'. - eapply Nat.eqb_eq in H6. - destruct nth_error; invs E. - destruct nth_error; invs H9. - rewrite H6. lia. + rewrite firstn_length. len. eapply Nat.leb_le in H2. + apply/eqb_spec. + assert (ind_npars m0 = 0). + { destruct lookup_env as [ [] | ] eqn:E'; try congruence. + eapply lookup_env_wellformed in E'; eauto. + cbn in E'. red in E'. unfold wf_minductive in E'. + rewrite andb_true_iff in E'. + cbn in E'. destruct E'. + eapply Nat.eqb_eq in H6. + destruct nth_error; invs E. + now destruct nth_error; invs H9. } + lia. * rewrite chop_firstn_skipn in Ec. invs Ec. solve_all. eapply All_firstn. solve_all. * rewrite chop_firstn_skipn in Ec. invs Ec. @@ -994,11 +979,18 @@ Proof. eapply All2_length in X0 as Hlen. cbn. rewrite !skipn_all Hlen skipn_all firstn_all. cbn. - eapply eval_mkApps_Construct_block; tea. eauto. + eapply eval_construct_block; tea. eauto. now rewrite lookup_constructor_transform_blocks. - constructor. cbn [atom]. now rewrite lookup_constructor_transform_blocks H. - len. unfold cstr_arity. lia. - solve_all. destruct H6; eauto. - - intros. econstructor. destruct t; try solve [cbn in H, H0 |- *; try congruence]. - cbn -[lookup_constructor] in H |- *. destruct l => //. now rewrite lookup_constructor_transform_blocks H. + unfold cstr_arity. cbn. rewrite H4; len. + solve_all. clear -X0. eapply All2_All2_Set. solve_all. + apply H. + - intros. destruct t; try solve [constructor; cbn in H, H0 |- *; try congruence]. + cbn -[lookup_constructor] in H |- *. destruct l => //. + destruct lookup_constructor eqn:hl => //. + destruct p as [[mdecl idecl] cdecl]. + eapply eval_construct_block => //. + now rewrite lookup_constructor_transform_blocks hl. + simp_eta in H1. cbn in H1. unfold isEtaExp_app in H1. + rewrite (lookup_constructor_pars_args_spec wfΣ hl) andb_true_r in H1. + apply Nat.leb_le in H1; cbn; unfold cstr_arity. lia. Qed. diff --git a/erasure/theories/EDeps.v b/erasure/theories/EDeps.v index 90399e1a8..0b7170503 100644 --- a/erasure/theories/EDeps.v +++ b/erasure/theories/EDeps.v @@ -281,7 +281,7 @@ Proof. + intuition auto. apply erases_deps_mkApps_inv in H4. now apply Forall_rev, Forall_skipn. - + eapply nth_error_forall in e1; [|now eauto]. + + eapply nth_error_forall in e2; [|now eauto]. assumption. - congruence. - depelim er. @@ -333,7 +333,7 @@ Proof. intuition auto. apply erases_deps_mkApps_inv in H3 as (? & ?). apply IHev2. - now eapply nth_error_forall in e2. + now eapply nth_error_forall in e3. - congruence. - constructor. - depelim er. diff --git a/erasure/theories/EEtaExpandedFix.v b/erasure/theories/EEtaExpandedFix.v index 0e3a1cce9..bfad702cc 100644 --- a/erasure/theories/EEtaExpandedFix.v +++ b/erasure/theories/EEtaExpandedFix.v @@ -1391,7 +1391,7 @@ Proof. destruct s. * destruct p; solve_discr. noconf H3. right. len. - move: e; unfold isEtaExp_fixapp. + move: e1; unfold isEtaExp_fixapp. unfold EGlobalEnv.cunfold_fix. destruct nth_error eqn:hnth => //. intros [=]. rewrite H3. rewrite -(All2_length a0). eapply Nat.ltb_lt; lia. * right. len. eapply isEtaExp_fixapp_mon; tea. lia. @@ -1403,7 +1403,7 @@ Proof. destruct s. * destruct p; solve_discr. noconf H2. left. split. - unfold isStuckFix'; rewrite e. len. eapply Nat.leb_le. lia. + unfold isStuckFix'; rewrite e1. len. eapply Nat.leb_le. lia. now rewrite -[tApp _ _](mkApps_app _ _ [av]). * right. len. eapply isEtaExp_fixapp_mon; tea. lia. + eapply mkApps_eq in H1 as [? []] => //; subst. @@ -1570,7 +1570,7 @@ Proof. - pose proof (eval_trans' H H0_0). subst a'. econstructor; tea. - pose proof (eval_trans' H H0_0). subst av. eapply eval_fix; tea. - pose proof (eval_trans' H H0_0). subst av. eapply eval_fix_value; tea. - - eapply value_final in X. pose proof (eval_trans' X H0_). subst f. + - eapply value_final in X. pose proof (eval_trans' X H0_). subst f7. pose proof (eval_trans' H H0_0). subst av. eapply eval_fix'; tea. - eapply eval_construct; tea. @@ -1853,7 +1853,7 @@ Proof. rewrite (remove_last_last l0 a hl). rewrite -[tApp _ _](mkApps_app _ _ [a']). eapply eval_mkApps_Construct; tea. - { constructor. cbn [atom]; rewrite e0 //. } + { constructor. cbn [atom]; rewrite e e0 //. } { len. rewrite (All2_length hargs). lia. } eapply All2_app. eapply forallb_remove_last, forallb_All in etal. diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index a87f1defb..e8b668a82 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -112,7 +112,11 @@ Section optimize. (* move to globalenv *) - + Lemma isLambda_optimize t : isLambda t -> isLambda (optimize t). + Proof. destruct t => //. Qed. + Lemma isBox_optimize t : isBox t -> isBox (optimize t). + Proof. destruct t => //. Qed. + Lemma wf_optimize t k : wf_glob Σ -> wellformed Σ k t -> wellformed Σ k (optimize t). @@ -135,6 +139,7 @@ Section optimize. rewrite IHt //=; len. apply Nat.ltb_lt. lia. - len. rtoProp; solve_all. rewrite forallb_map; solve_all. + now eapply isLambda_optimize. solve_all. - len. rtoProp; solve_all. rewrite forallb_map; solve_all. Qed. @@ -161,7 +166,7 @@ Section optimize. have arglen := wellformed_projection_args wfΣ hl. case: Nat.compare_spec. lia. lia. auto. - - f_equal. move/andP: wft => [hidx hb]. + - f_equal. move/andP: wft => [hlam /andP[] hidx hb]. solve_all. unfold map_def. f_equal. eapply a0. now rewrite -Nat.add_assoc. - f_equal. move/andP: wft => [hidx hb]. @@ -222,7 +227,7 @@ Section optimize. intros wfΣ hfix. unfold cunfold_fix. rewrite nth_error_map. - cbn in hfix. move/andP: hfix => [] hidx hfix. + cbn in hfix. move/andP: hfix => [] hlam /andP[] hidx hfix. destruct nth_error eqn:hnth => //. intros [= <- <-] => /=. f_equal. rewrite optimize_substl //. eapply wellformed_fix_subst => //. @@ -512,23 +517,23 @@ Proof. eapply nth_error_forallb in wfbrs; tea. rewrite Nat.add_0_r in wfbrs. forward IHev2. eapply wellformed_iota_red; tea => //. - rewrite optimize_iota_red in IHev2 => //. now rewrite e3. + rewrite optimize_iota_red in IHev2 => //. now rewrite e4. econstructor; eauto. rewrite -is_propositional_cstr_optimize //. tea. - rewrite nth_error_map e1 //. len. len. + rewrite nth_error_map e2 //. len. len. - congruence. - move/andP => [] /andP[] hl wfd wfbrs. forward IHev2. eapply wellformed_substl; tea => //. rewrite forallb_repeat //. len. - rewrite e0 /= Nat.add_0_r in wfbrs. now move/andP: wfbrs. + rewrite e1 /= Nat.add_0_r in wfbrs. now move/andP: wfbrs. rewrite optimize_substl in IHev2 => //. rewrite forallb_repeat //. len. - rewrite e0 /= Nat.add_0_r in wfbrs. now move/andP: wfbrs. + rewrite e1 /= Nat.add_0_r in wfbrs. now move/andP: wfbrs. eapply eval_iota_sing => //; eauto. rewrite -is_propositional_optimize //. - rewrite e0 //. simpl. + rewrite e1 //. simpl. rewrite map_repeat in IHev2 => //. - move/andP => [] clf cla. rewrite optimize_mkApps in IHev1. @@ -600,7 +605,7 @@ Proof. move/wf_mkApps: ev1 => [] wfc wfargs. destruct lookup_projection as [[[[mdecl idecl] cdecl'] pdecl]|] eqn:hl' => //. pose proof (lookup_projection_lookup_constructor hl'). - rewrite (constructor_isprop_pars_decl_constructor H) in e0. noconf e0. + rewrite (constructor_isprop_pars_decl_constructor H) in e1. noconf e1. forward IHev1 by auto. forward IHev2. eapply nth_error_forallb in wfargs; tea. rewrite optimize_mkApps /= in IHev1. @@ -617,11 +622,11 @@ Proof. rewrite nth_error_rev. len. rewrite skipn_length. lia. rewrite List.rev_involutive. len. rewrite skipn_length. rewrite nth_error_skipn nth_error_map. - rewrite e1 -H1. + rewrite e2 -H1. assert((ind_npars mdecl + cstr_nargs cdecl - ind_npars mdecl) = cstr_nargs cdecl) by lia. rewrite H3. - eapply (f_equal (option_map (optimize Σ))) in e2. - cbn in e2. rewrite -e2. f_equal. f_equal. lia. + eapply (f_equal (option_map (optimize Σ))) in e3. + cbn in e3. rewrite -e3. f_equal. f_equal. lia. - congruence. @@ -630,7 +635,7 @@ Proof. destruct lookup_projection as [[[[mdecl idecl] cdecl'] pdecl]|] eqn:hl' => //. pose proof (lookup_projection_lookup_constructor hl'). simpl in H. - move: e. rewrite /inductive_isprop_and_pars. + move: e0. rewrite /inductive_isprop_and_pars. rewrite (lookup_constructor_lookup_inductive H) /=. intros [= eq <-]. eapply eval_iota_sing => //; eauto. @@ -680,11 +685,6 @@ Qed. From MetaCoq.Erasure Require Import EEtaExpanded. -Lemma isLambda_optimize Σ t : isLambda t -> isLambda (optimize Σ t). -Proof. destruct t => //. Qed. -Lemma isBox_optimize Σ t : isBox t -> isBox (optimize Σ t). -Proof. destruct t => //. Qed. - Lemma optimize_expanded {Σ : GlobalContextMap.t} t : expanded Σ t -> expanded Σ (optimize Σ t). Proof. induction 1 using expanded_ind. @@ -829,7 +829,7 @@ Proof. rewrite hrel IHt //= andb_true_r. have hargs' := wellformed_projection_args wfΣ hl'. apply Nat.ltb_lt. len. - - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now len. + - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now eapply isLambda_optimize. now len. unfold test_def in *. len. eauto. - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now len. unfold test_def in *. len. eauto. diff --git a/erasure/theories/EOptimizePropDiscr.v b/erasure/theories/EOptimizePropDiscr.v index 4e7d019cd..16e919ba1 100644 --- a/erasure/theories/EOptimizePropDiscr.v +++ b/erasure/theories/EOptimizePropDiscr.v @@ -551,11 +551,11 @@ Proof. rewrite optimize_iota_red in IHev2. eapply eval_closed in ev1 => //. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). + rewrite (constructor_isprop_pars_decl_inductive e1). eapply eval_iota; eauto. now rewrite -is_propositional_cstr_optimize. - rewrite nth_error_map e1 //. now len. cbn. - rewrite -e3. rewrite !skipn_length map_length //. + rewrite nth_error_map e2 //. now len. cbn. + rewrite -e4. rewrite !skipn_length map_length //. eapply IHev2. eapply closed_iota_red => //; tea. eapply nth_error_forallb in clbrs; tea. cbn in clbrs. @@ -565,7 +565,7 @@ Proof. - move/andP => [] cld clbrs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite e e0 /=. + rewrite e0 e1 /=. subst brs. cbn in clbrs. rewrite Nat.add_0_r andb_true_r in clbrs. rewrite optimize_substl in IHev2. eapply All_forallb, All_repeat => //. @@ -660,19 +660,19 @@ Proof. eapply eval_closed in ev1; tea. move: ev1; rewrite closedn_mkApps /= => clargs. rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - rewrite (constructor_isprop_pars_decl_inductive e0). + rewrite (constructor_isprop_pars_decl_inductive e1). rewrite optimize_mkApps in IHev1. specialize (IHev1 cld). eapply Ee.eval_proj; tea. now rewrite -is_propositional_cstr_optimize. - now len. rewrite nth_error_map e2 //. + now len. rewrite nth_error_map e3 //. eapply IHev2. - eapply nth_error_forallb in e2; tea. + eapply nth_error_forallb in e3; tea. - congruence. - rewrite GlobalContextMap.inductive_isprop_and_pars_spec. - now rewrite e. + now rewrite e0. - move/andP=> [] clf cla. rewrite optimize_mkApps. @@ -856,7 +856,7 @@ Proof. - cbn -[GlobalContextMap.inductive_isprop_and_pars lookup_inductive]. move/andP => [] /andP[]hasc hs ht. destruct GlobalContextMap.inductive_isprop_and_pars as [[[|] _]|] => /= //. all:rewrite hasc hs /=; eauto. - - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now len. + - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now eapply isLambda_optimize. now len. unfold test_def in *. len. eauto. - cbn. unfold wf_fix; rtoProp; intuition auto; solve_all. now len. unfold test_def in *. len. eauto. diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index 8a61e6b7e..bd0d1d9ed 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -791,7 +791,7 @@ Proof. rewrite vc. rewrite -mkApps_app !map_app //. Qed. -#[export] Instance Qpreserves_closedn (efl := all_env_flags) Σ : closed_env Σ -> + #[export] Instance Qpreserves_closedn (efl := all_env_flags) Σ : closed_env Σ -> Qpreserves (fun n x => closedn n x) Σ. Proof. intros clΣ. @@ -816,22 +816,22 @@ Proof. - red. move=> t args clt cll. eapply closed_substl. solve_all. now rewrite Nat.add_0_r. - red. move=> n mfix idx. cbn. - split; intros; rtoProp; intuition auto; solve_all. + intros; rtoProp; intuition auto; solve_all. - red. move=> n mfix idx. cbn. split; intros; rtoProp; intuition auto; solve_all. Qed. Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : - closed_env Σ -> isEtaExp_env Σ -> + closed_env Σ -> wf_glob Σ -> - eval Σ t v -> - closed t -> + closedn 0 t -> isEtaExp Σ t -> + eval Σ t v -> eval (strip_env Σ) (strip Σ t) (strip Σ v). Proof. - intros clΣ etaΣ wfΣ ev clt etat. - revert t v clt etat ev. + intros etaΣ clΣ wfΣ. + revert t v. unshelve eapply (eval_preserve_mkApps_ind wfl wcon Σ (fun x y => eval (strip_env Σ) (strip Σ x) (strip Σ y)) (fun n x => closedn n x) (Qpres := Qpreserves_closedn Σ clΣ)) => //. { intros. eapply eval_closed; tea. } @@ -965,7 +965,7 @@ Proof. rewrite (lookup_constructor_lookup_inductive_pars H). eapply eval_mkApps_Construct; tea. + rewrite lookup_constructor_strip H //. - + constructor. cbn [atom]. rewrite lookup_constructor_strip H //. + + constructor. cbn [atom]. rewrite wcon lookup_constructor_strip H //. + rewrite /cstr_arity /=. move: H0; rewrite /cstr_arity /=. rewrite skipn_length map_length => ->. lia. @@ -1030,6 +1030,7 @@ Proof. destruct EAst.ind_ctors => //. destruct nth_error => //. - unfold wf_fix_gen in *. rewrite map_length. rtoProp; intuition auto. toAll; solve_all. + now rewrite -strip_isLambda. toAll; solve_all. - unfold wf_fix in *. rewrite map_length; rtoProp; intuition auto. toAll; solve_all. - move:H1; rewrite !wellformed_mkApps //. rtoProp; intuition auto. toAll; solve_all. @@ -1048,10 +1049,11 @@ Proof. Qed. Lemma strip_wellformed_irrel {efl : EEnvFlags} {Σ : GlobalContextMap.t} t : + cstr_as_blocks = false -> wf_glob Σ -> forall n, wellformed Σ n t -> wellformed (strip_env Σ) n t. Proof. - intros wfΣ. induction t using EInduction.term_forall_list_ind; cbn => //. + intros hcstrs wfΣ. induction t using EInduction.term_forall_list_ind; cbn => //. all:try solve [intros; unfold wf_fix in *; rtoProp; intuition eauto; solve_all]. - rewrite lookup_env_strip //. destruct lookup_env eqn:hl => // /=. @@ -1060,13 +1062,7 @@ Proof. - rewrite lookup_env_strip //. destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. destruct g eqn:hg => /= //; intros; rtoProp; eauto. - destruct cstr_as_blocks; repeat split; eauto. - destruct nth_error => /= //. - destruct nth_error => /= //. - destruct nth_error => /= //. - destruct nth_error => /= //. rtoProp. split. solve_all. - eapply Nat.leb_le in H0. eapply Nat.leb_le. lia. - solve_all. + destruct cstr_as_blocks => //; repeat split; eauto. destruct nth_error => /= //. destruct nth_error => /= //. - rewrite lookup_env_strip //. @@ -1085,10 +1081,11 @@ Proof. Qed. Lemma strip_wellformed_decl_irrel {efl : EEnvFlags} {Σ : GlobalContextMap.t} d : + cstr_as_blocks = false -> wf_glob Σ -> wf_global_decl Σ d -> wf_global_decl (strip_env Σ) d. Proof. - intros wf; destruct d => /= //. + intros hcstrs wf; destruct d => /= //. destruct (cst_body c) => /= //. now eapply strip_wellformed_irrel. Qed. diff --git a/erasure/theories/ETransform.v b/erasure/theories/ETransform.v index ab608037b..bd573a863 100644 --- a/erasure/theories/ETransform.v +++ b/erasure/theories/ETransform.v @@ -165,13 +165,12 @@ Qed. Next Obligation. red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. - eapply ERemoveParams.strip_eval in ev; eauto. + unshelve eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. now sq. cbn in *. - now eapply wellformed_closed_env. now move/andP: etap. + now eapply wellformed_closed_env. now eapply wellformed_closed. now move/andP: etap. - Unshelve. auto. Qed. Program Definition remove_params_fast_optimization (fl : EWcbvEval.WcbvFlags) {wcon : EWcbvEval.with_constructor_as_block = false} @@ -195,14 +194,13 @@ Qed. Next Obligation. red. move=> ? wcon [Σ t] /= v [[wfe wft] etap] [ev]. rewrite -ERemoveParams.Fast.strip_fast -ERemoveParams.Fast.strip_env_fast. - eapply ERemoveParams.strip_eval in ev; eauto. + unshelve eapply ERemoveParams.strip_eval in ev; eauto. eexists; split => /= //. now sq. cbn in *. - now eapply wellformed_closed_env. now move/andP: etap. + now eapply wellformed_closed_env. now eapply wellformed_closed. now move/andP: etap. - Unshelve. auto. Qed. Import EOptimizePropDiscr EWcbvEval. @@ -263,7 +261,7 @@ Program Definition constructors_as_blocks_transformation (efl := env_flags) transform p _ := EConstructorsAsBlocks.transform_blocks_program p ; pre p := wf_eprogram_env efl p /\ EEtaExpanded.expanded_eprogram_env_cstrs p; post p := wf_eprogram env_flags_blocks p ; - obseq g g' v v' := True |}. + obseq g g' v v' := v' = EConstructorsAsBlocks.transform_blocks g.1 v |}. Next Obligation. move=> efl hastrel hastbox [Σ t] [] [wftp wft] /andP [etap etat]. @@ -275,6 +273,8 @@ Next Obligation. red. move=> hastrel hastbox [Σ t] /= v [[wfe1 wfe2] wft] [ev]. eexists. split; [ | eauto]. unfold EEtaExpanded.expanded_eprogram_env_cstrs in *. - revert wft. move => /andP // [e1 e2]. cbn in *. - econstructor. eapply transform_blocks_eval; cbn; eauto. -Qed. \ No newline at end of file + revert wft. move => /andP // [e1 e2]. + econstructor. + cbn -[transform_blocks]. + eapply transform_blocks_eval; cbn; eauto. +Qed. diff --git a/erasure/theories/EWcbvEval.v b/erasure/theories/EWcbvEval.v index 9504e0ddb..b6708323e 100644 --- a/erasure/theories/EWcbvEval.v +++ b/erasure/theories/EWcbvEval.v @@ -27,13 +27,18 @@ Local Ltac inv H := inversion H; subst. (** ** Big step version of weak cbv beta-zeta-iota-fix-delta reduction. *) -Definition atom Σ t := + +(* Tells if the evaluation relation should include match-prop and proj-prop reduction rules. + Also, are constructors represented as blocks or higher-order. *) +Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool ; with_constructor_as_block : bool }. + +Definition atom `{wfl : WcbvFlags} Σ t := match t with | tBox | tCoFix _ _ | tLambda _ _ | tFix _ _ => true - | tConstruct ind c [] => isSome (lookup_constructor Σ ind c) + | tConstruct ind c [] => negb with_constructor_as_block && isSome (lookup_constructor Σ ind c) | _ => false end. @@ -47,15 +52,12 @@ Definition isStuckFix t (args : list term) := | _ => false end. -Lemma atom_mkApps Σ f l : atom Σ (mkApps f l) -> (l = []) /\ atom Σ f. +Lemma atom_mkApps {wfl : WcbvFlags} Σ f l : atom Σ (mkApps f l) -> (l = []) /\ atom Σ f. Proof. revert f; induction l using rev_ind. simpl. intuition auto. simpl. intros. now rewrite mkApps_app in H. Qed. -(* Tells if the evaluation relation should include match-prop and proj-prop reduction rules. *) -Class WcbvFlags := { with_prop_case : bool ; with_guarded_fix : bool ; with_constructor_as_block : bool }. - Definition disable_prop_cases fl : WcbvFlags := {| with_prop_case := false; with_guarded_fix := fl.(@with_guarded_fix) ; with_constructor_as_block := fl.(@with_constructor_as_block) |}. @@ -66,12 +68,48 @@ Definition default_wcbv_flags := {| with_prop_case := true ; with_guarded_fix := Definition opt_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := true ; with_constructor_as_block := false|}. Definition target_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := false |}. + +Inductive All2_Set {A B : Set} (R : A -> B -> Set) : list A -> list B -> Set := + All2_nil : All2_Set R [] [] +| All2_cons : forall (x : A) (y : B) (l : list A) (l' : list B), + R x y -> All2_Set R l l' -> All2_Set R (x :: l) (y :: l'). +Arguments All2_nil {_ _ _}. +Arguments All2_cons {_ _ _ _ _ _ _}. +Derive Signature for All2_Set. +Derive NoConfusionHom for All2_Set. +#[global] Hint Constructors All2_Set : core. + +Section All2_size. + Context {A B : Set} (P : A -> B -> Set) (fn : forall x1 x2, P x1 x2 -> size). + Fixpoint all2_size {l1 l2} (f : All2_Set P l1 l2) : size := + match f with + | All2_nil => 0 + | All2_cons _ _ _ _ rxy rll' => fn _ _ rxy + all2_size rll' + end. +End All2_size. + +Lemma All2_Set_All2 {A B : Set} (R : A -> B -> Set) l l' : All2_Set R l l' -> All2 R l l'. +Proof. + induction 1; constructor; auto. +Qed. +#[export] Hint Resolve All2_Set_All2 : core. + +Coercion All2_Set_All2 : All2_Set >-> All2. + +Lemma All2_All2_Set {A B : Set} (R : A -> B -> Set) l l' : All2 R l l' -> All2_Set R l l'. +Proof. + induction 1; constructor; auto. +Qed. +#[export] Hint Immediate All2_All2_Set : core. + Section Wcbv. Context {wfl : WcbvFlags}. Context (Σ : global_declarations). (* The local context is fixed: we are only doing weak reductions *) + + Local Unset Elimination Schemes. - Inductive eval : term -> term -> Type := + Inductive eval : term -> term -> Set := (** Reductions *) | eval_box a t t' : eval a tBox -> @@ -206,13 +244,12 @@ Section Wcbv. eval (tApp f a) (tApp (mkApps (tConstruct ind c []) args) a') (** Constructor congruence: we do not allow over-applications *) - | eval_construct_block ind c mdecl idecl cdecl args args' a a' : + | eval_construct_block ind c mdecl idecl cdecl args args' : with_constructor_as_block = true -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - #|args| < cstr_arity mdecl cdecl -> - eval (tConstruct ind c args) (tConstruct ind c args') -> - eval a a' -> - eval (tConstruct ind c (args ++ [a])) (tConstruct ind c (args' ++ [a'])) + #|args| = cstr_arity mdecl cdecl -> + All2_Set eval args args' -> + eval (tConstruct ind c args) (tConstruct ind c args') (** Atoms (non redex-producing heads) applied to values are values *) | eval_app_cong f f' a a' : @@ -264,13 +301,315 @@ Section Wcbv. | value_constructor ind c mdecl idecl cdecl args : with_constructor_as_block = true -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> - #|args| <= cstr_arity mdecl cdecl -> + #|args| = cstr_arity mdecl cdecl -> All value args -> value (tConstruct ind c args) | value_app_nonnil f args : value_head #|args| f -> args <> [] -> All value args -> value (mkApps f args). Derive Signature for value. End Wcbv. +Fixpoint eval_depth {wfl : WcbvFlags} {Σ : EAst.global_declarations} {t1 t2 : EAst.term} (ev : eval Σ t1 t2) { struct ev } : nat. +Proof. + rename eval_depth into aux. + destruct ev. + all:try match goal with + | [ H : eval _ _ _, H' : eval _ _ _, H'' : eval _ _ _ |- _ ] => + apply aux in H; apply aux in H'; apply aux in H''; exact (S (Nat.max H (Nat.max H' H''))) + | [ H : eval _ _ _, H' : eval _ _ _ |- _ ] => + apply aux in H; apply aux in H'; exact (S (Nat.max H H')) + | [ H : eval _ _ _ |- _ ] => apply aux in H; exact (S H) + end. + exact (S (all2_size _ (fun x y ev => aux wfl Σ x y ev) a)). + exact 1. +Defined. + +Set Equations Transparent. +Section eval_rect. + + Variables (wfl : WcbvFlags) (Σ : global_declarations) (P : forall x y, eval Σ x y → Type). + + Equations All2_over {A B : Set} {P : A → B → Set} {l : list A} {l' : list B} : + All2_Set P l l' → (∀ (x : A) (y : B), P x y → Type) → Type := + | All2_nil, _ := unit + | All2_cons rxy rll', Q => Q _ _ rxy × All2_over rll' Q. + + Lemma eval_rect : + (∀ (a t t' : term) (e : eval Σ a tBox), + P a tBox e + → ∀ e0 : eval Σ t t', + P t t' e0 → P (tApp a t) tBox (eval_box Σ a t t' e e0)) + → (∀ (f0 : term) (na : name) (b a a' res : term) + (e : eval Σ f0 (tLambda na b)), + P f0 (tLambda na b) e + → ∀ e0 : eval Σ a a', + P a a' e0 + → ∀ e1 : eval Σ (csubst a' 0 b) res, + P (csubst a' 0 b) res e1 + → P (tApp f0 a) res (eval_beta Σ f0 na b a a' res e e0 e1)) + → (∀ (na : name) (b0 b0' b1 res : term) (e : eval Σ b0 b0'), + P b0 b0' e + → ∀ e0 : eval Σ (csubst b0' 0 b1) res, + P (csubst b0' 0 b1) res e0 + → P (tLetIn na b0 b1) res (eval_zeta Σ na b0 b0' b1 res e e0)) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = false) + (e0 : eval Σ discr (mkApps (tConstruct ind c []) args)), + P discr (mkApps (tConstruct ind c []) args) e0 + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) (e2 : + nth_error brs c = + Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res e5 + → P (tCase (ind, pars) discr brs) res + (eval_iota Σ ind pars cdecl discr c args brs br res e e0 + e1 e2 e3 e4 e5)) + → (∀ (ind : inductive) (pars : nat) (cdecl : constructor_body) + (discr : term) (c : nat) (args : list term) + (brs : list (list name × term)) (br : list name × term) + (res : term) (e : with_constructor_as_block = true) + (e0 : eval Σ discr (tConstruct ind c args)), + P discr (tConstruct ind c args) e0 + → ∀ (e1 : constructor_isprop_pars_decl Σ ind c = + Some (false, pars, cdecl)) + (e2 : nth_error brs c = Some br) + (e3 : #|args| = pars + cstr_nargs cdecl) + (e4 : #|skipn pars args| = #|br.1|) + (e5 : eval Σ (iota_red pars args br) res), + P (iota_red pars args br) res e5 + → P (tCase (ind, pars) discr brs) res + (eval_iota_block Σ ind pars cdecl discr c args brs br + res e e0 e1 e2 e3 e4 e5)) + → (∀ (ind : inductive) (pars : nat) (discr : term) + (brs : list (list name × term)) (n : list name) + (f4 res : term) (i : with_prop_case) + (e : eval Σ discr tBox), + P discr tBox e + → ∀ (e0 : inductive_isprop_and_pars Σ ind = Some (true, pars)) + (e1 : brs = [(n, f4)]) (e2 : eval Σ + (substl + (repeat tBox #|n|) f4) res), + P (substl (repeat tBox #|n|) f4) res e2 + → P (tCase (ind, pars) discr brs) res + (eval_iota_sing Σ ind pars discr brs n f4 res i e e0 + e1 e2)) + → (∀ (f5 : term) (mfix : mfixpoint term) + (idx : nat) (argsv : list term) (a av fn res : term) + (guarded : with_guarded_fix) (e : + eval Σ f5 + (mkApps + (tFix mfix idx) argsv)), + P f5 (mkApps (tFix mfix idx) argsv) e + → ∀ e0 : eval Σ a av, + P a av e0 + → ∀ (e1 : cunfold_fix mfix idx = Some (#|argsv|, fn)) + (e2 : eval Σ (tApp (mkApps fn argsv) av) res), + P (tApp (mkApps fn argsv) av) res e2 + → P (tApp f5 a) res + (eval_fix Σ f5 mfix idx argsv a av fn res + guarded e e0 e1 e2)) + → (∀ (f6 : term) (mfix : mfixpoint term) + (idx : nat) (argsv : list term) + (a av : term) (narg : nat) (fn : term) + (guarded : with_guarded_fix) (e : + eval Σ f6 + (mkApps + (tFix mfix idx) argsv)), + P f6 (mkApps (tFix mfix idx) argsv) e + → ∀ e0 : eval Σ a av, + P a av e0 + → ∀ (e1 : cunfold_fix mfix idx = Some (narg, fn)) + (l : #|argsv| < narg), + P (tApp f6 a) + (tApp (mkApps (tFix mfix idx) argsv) av) + (eval_fix_value Σ f6 mfix idx argsv a av narg fn + guarded e e0 e1 l)) + → (∀ (f7 : term) (mfix : mfixpoint term) + (idx : nat) (a av fn res : term) + (narg : nat) (unguarded : with_guarded_fix = false) + (e : eval Σ f7 (tFix mfix idx)), + P f7 (tFix mfix idx) e + → ∀ (e0 : cunfold_fix mfix idx = Some (narg, fn)) + (e1 : eval Σ a av), + P a av e1 + → ∀ e2 : eval Σ (tApp fn av) res, + P (tApp fn av) res e2 + → P (tApp f7 a) res + (eval_fix' Σ f7 mfix idx a av fn res narg + unguarded e e0 e1 e2)) + → (∀ (ip : inductive × nat) (mfix : mfixpoint term) + (idx : nat) (args : list term) + (discr : term) (narg : nat) + (fn : term) (brs : list (list name × term)) + (res : term) (e : eval Σ discr + (mkApps (tCoFix mfix idx) args)), + P discr (mkApps (tCoFix mfix idx) args) e + → ∀ (e0 : cunfold_cofix mfix idx = Some (narg, fn)) + (e1 : eval Σ (tCase ip (mkApps fn args) brs) res), + P (tCase ip (mkApps fn args) brs) res e1 + → P (tCase ip discr brs) res + (eval_cofix_case Σ ip mfix idx args discr narg + fn brs res e e0 e1)) + → (∀ (p : projection) (mfix : mfixpoint term) + (idx : nat) (args : list term) + (discr : term) (narg : nat) + (fn res : term) (e : eval Σ discr + (mkApps + (tCoFix mfix idx) args)), + P discr (mkApps (tCoFix mfix idx) args) e + → ∀ (e0 : cunfold_cofix mfix idx = Some (narg, fn)) + (e1 : eval Σ (tProj p (mkApps fn args)) res), + P (tProj p (mkApps fn args)) res e1 + → P (tProj p discr) res + (eval_cofix_proj Σ p mfix idx args discr + narg fn res e e0 e1)) + → (∀ (c : kername) (decl : constant_body) + (body : term) (isdecl : + declared_constant Σ c decl) + (res : term) (e : cst_body decl = Some body) + (e0 : eval Σ body res), + P body res e0 + → P (tConst c) res + (eval_delta Σ c decl body isdecl res e e0)) + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : with_constructor_as_block = + false) + (e0 : eval Σ discr + (mkApps (tConstruct (proj_ind p) 0 []) + args)), + P discr + (mkApps (tConstruct (proj_ind p) 0 []) args) + e0 + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res e4 + → P (tProj p discr) res + (eval_proj Σ p cdecl discr args a res e + e0 e1 e2 e3 e4)) + → (∀ (p : projection) (cdecl : constructor_body) + (discr : term) (args : list term) + (a res : term) (e : + with_constructor_as_block = + true) + (e0 : eval Σ discr + (tConstruct (proj_ind p) 0 args)), + P discr (tConstruct (proj_ind p) 0 args) e0 + → ∀ (e1 : constructor_isprop_pars_decl Σ + (proj_ind p) 0 = + Some (false, proj_npars p, cdecl)) + (e2 : #|args| = + proj_npars p + cstr_nargs cdecl) + (e3 : nth_error args + (proj_npars p + proj_arg p) = + Some a) (e4 : eval Σ a res), + P a res e4 + → P (tProj p discr) res + (eval_proj_block Σ p cdecl discr args + a res e e0 e1 e2 e3 e4)) + → (∀ (p : projection) + (discr : term) (i : with_prop_case) + (e : eval Σ discr tBox), + P discr tBox e + → ∀ e0 : inductive_isprop_and_pars Σ + (proj_ind p) = + Some (true, proj_npars p), + P (tProj p discr) tBox + (eval_proj_prop Σ p discr i e e0)) + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (f14 : term) (args : list term) + (a a' : term) (e : + with_constructor_as_block = + false) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (e1 : eval Σ f14 + (mkApps (tConstruct ind c []) args)), + P f14 (mkApps (tConstruct ind c []) args) + e1 + → ∀ (l : #|args| < cstr_arity mdecl cdecl) + (e2 : eval Σ a a'), + P a a' e2 + → P (tApp f14 a) + (tApp + (mkApps + (tConstruct ind c []) args) + a') + (eval_construct Σ ind c mdecl + idecl cdecl f14 args a a' e e0 + e1 l e2)) + → (∀ (ind : inductive) + (c : nat) (mdecl : mutual_inductive_body) + (idecl : one_inductive_body) + (cdecl : constructor_body) + (args args' : + list term) (e : + with_constructor_as_block = + true) + (e0 : lookup_constructor Σ ind c = + Some (mdecl, idecl, cdecl)) + (e1 : #|args| = cstr_arity mdecl cdecl) + (a : All2_Set (eval Σ) args args') + (iha : All2_over a P), + P (tConstruct ind c args) + (tConstruct ind c args') + (eval_construct_block Σ ind c mdecl + idecl cdecl args args' e e0 e1 a)) + → (∀ (f16 f' a a' : term) + (e : eval Σ f16 f'), + P f16 f' e + → ∀ (i : ~~ + (isLambda f' + || + (if with_guarded_fix + then isFixApp f' + else isFix f') || + isBox f' + || + isConstructApp f')) + (e0 : eval Σ a a'), + P a a' e0 + → P (tApp f16 a) + (tApp f' a') + (eval_app_cong Σ f16 f' a a' e + i e0)) + → (∀ (t : term) (i : atom Σ t), + P t t (eval_atom Σ t i)) + → ∀ (t t0 : term) (e : eval Σ t t0), + P t t0 e. + Proof using Type. + intros ????????????????????? H. + revert t t0 H. + fix aux 3. + move aux at top. + intros t t0 H. + destruct H. + all:try match goal with + | [ H : _ |- _ ] => + eapply H; (unshelve eapply aux || tea); tea; cbn; try lia + end. + clear -aux a. revert args args' a. + fix aux' 3. destruct a. constructor. constructor. apply aux. apply aux'. + Qed. + + Definition eval_rec := eval_rect. + Definition eval_ind := eval_rect. + +End eval_rect. + Global Hint Constructors value : value. Section Wcbv. @@ -283,7 +622,7 @@ Section Wcbv. Lemma value_app f args : value_head #|args| f -> All value args -> value (mkApps f args). Proof. destruct args. - - intros [] hv; constructor; try easy. cbn [atom mkApps]. now rewrite e0. + - intros [] hv; constructor; try easy. cbn [atom mkApps]. now rewrite e e0. - intros vh av. eapply value_app_nonnil => //. Qed. @@ -291,7 +630,7 @@ Section Wcbv. (forall t, atom Σ t -> P t) -> (forall (ind : inductive) (c : nat) (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body) (args : list term) (e : with_constructor_as_block = true) (e0 : lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl)) - (l : #|args| <= cstr_arity mdecl cdecl) (a : All value args) , All P args -> + (l : #|args| = cstr_arity mdecl cdecl) (a : All value args) , All P args -> P (tConstruct ind c args)) -> (forall f args, value_head #|args| f -> args <> [] -> All value args -> All P args -> P (mkApps f args)) -> forall t : term, value t -> P t. @@ -321,7 +660,7 @@ Section Wcbv. ~~ isApp t -> value (mkApps t l) -> ((l = []) /\ atom Σ t) - + (l = [] × ∑ ind c mdecl idecl cdecl args, [ × with_constructor_as_block , lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl), t = tConstruct ind c args, #|args| <= cstr_arity mdecl cdecl & All value args]) + + (l = [] × ∑ ind c mdecl idecl cdecl args, [ × with_constructor_as_block , lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl), t = tConstruct ind c args, #|args| = cstr_arity mdecl cdecl & All value args]) + ([× l <> [], value_head #|l| t & All value l]). Proof. intros H H'. generalize_eq x (mkApps t l). @@ -352,8 +691,7 @@ Section Wcbv. ∑ args', e = tConstruct ind c args' × All2 eval args args'. Proof. intros H. depind H. - - edestruct IHeval1 as (args'' & [= ->] & H2); eauto. - repeat eexists; eauto. eapply All2_app; eauto. + - repeat eexists; eauto. - invs i. destruct args; invs H0. exists []. repeat econstructor. Qed. @@ -371,7 +709,7 @@ Section Wcbv. + apply value_app; auto. len. cbn in *. econstructor; tea. destruct with_guarded_fix => //. cbn; auto. - + depelim v. rewrite e0 in e. noconf e. + + depelim v. rewrite e1 in e. noconf e. eapply value_app; auto. econstructor; tea. destruct with_guarded_fix => //. len; lia. apply All_app_inv; auto. @@ -384,19 +722,17 @@ Section Wcbv. eapply value_app. cbn; auto. econstructor; tea. cbn; len. eapply All_app_inv; auto. - - invs IHev1. - + invs H. destruct args'; invs H1. econstructor 2; eauto. len; lia. now econstructor. - + rewrite e0 in H3; invs H3. - eapply eval_Construct_inv in ev1 as (? & [= <-] & Hall). - econstructor 2; eauto. len. eapply All2_length in Hall. lia. - eapply All_app_inv; eauto. - + destruct H1. destruct args0 using rev_ind. eauto. rewrite mkApps_app in H. invs H. + - econstructor 2; tea. now rewrite -(All2_length a). + clear -a iha. induction a. constructor. + destruct iha as [va' ih]. + constructor. exact va'. now apply IHa. + - destruct (mkApps_elim f' [a']). eapply value_mkApps_inv in IHev1 => //. destruct IHev1 as [?|[]]; intuition subst. * rewrite H in i |- *. simpl in *. - apply (value_app f0 [a']). - destruct f0; simpl in * |- *; try congruence. + apply (value_app f [a']). + destruct f; simpl in * |- *; try congruence. + rewrite !negb_or /= in i; rtoProp; intuition auto. + rewrite !negb_or /= in i; rtoProp; intuition auto. + destruct with_guarded_fix. @@ -406,8 +742,8 @@ Section Wcbv. * destruct b0 as (ind & c & mdecl & idecl & cdecl & args & [H1 H2 H3 H4]). rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). rewrite a0 in i |- *. simpl in *. - apply (value_app f0 [a']). - destruct f0; simpl in * |- *; try congruence. + apply (value_app f [a']). + destruct f; simpl in * |- *; try congruence. + rewrite !negb_or /= in i; rtoProp; intuition auto. + destruct with_guarded_fix. now cbn in i. now cbn in i. * rewrite -[tApp _ _](mkApps_app _ (firstn n l) [a']). @@ -431,7 +767,7 @@ Section Wcbv. value_head n t -> eval t t. Proof. destruct 1. - - constructor; try easy. now cbn [atom]; rewrite e0. + - constructor; try easy. now cbn [atom]; rewrite e e0. - now eapply eval_atom. - now eapply eval_atom. Qed. @@ -442,7 +778,7 @@ Section Wcbv. Lemma value_head_spec' n t : value_head n t -> (~~ (isLambda t || isBox t)) && atom Σ t. Proof. - induction 1; auto. cbn [atom]; rewrite e0 //. + induction 1; auto. cbn [atom]; rewrite e e0 //. Qed. @@ -650,18 +986,12 @@ Section Wcbv. with_constructor_as_block -> lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl) -> eval f (tConstruct ind c []) -> - #|args| <= cstr_arity mdecl cdecl -> + #|args| = cstr_arity mdecl cdecl -> All2 eval args args' -> eval (tConstruct ind c args) (tConstruct ind c args'). Proof. - intros hblock hdecl evf hargs. revert args'. - induction args using rev_ind; intros args' evargs. - - depelim evargs. econstructor. now cbn [atom]; rewrite hdecl. - - eapply All2_app_inv_l in evargs as [r1 [r2 [-> [evl evr]]]]. - depelim evr. depelim evr. - eapply eval_construct_block; tea. 1: revert hargs; len. - eapply IHargs => //. 1: revert hargs; len. - Qed. + intros. econstructor; tea. auto. + Qed. Lemma eval_mkApps_CoFix f mfix idx args args' : eval f (tCoFix mfix idx) -> @@ -720,13 +1050,8 @@ Section Wcbv. move: e; eapply value_values_ind; simpl; intros; eauto with value. - now constructor. - assert (All2 eval args args). - { clear -X; induction X; constructor; auto. } - induction args using rev_ind. repeat econstructor. - cbn [atom]; now rewrite e0. - eapply All_app in a as [? HH]; eauto; invs HH. - eapply All_app in X as [? HH]; eauto; invs HH. - eapply All2_app_inv in X0 as [? HH]; eauto; invs HH. - econstructor; eauto. revert l. len. eapply IHargs; eauto. revert l. len. + { clear -X; induction X; constructor; auto. } + econstructor; tea; auto. - assert (All2 eval args args). { clear -X0; induction X0; constructor; auto. } eapply eval_mkApps_cong => //. now eapply value_head_final. @@ -763,18 +1088,18 @@ Section Wcbv. apply mkApps_eq_inj in apps_eq as (eq1 & eq2); try easy. noconf eq1. noconf eq2. noconf IHev1. - pose proof e0. rewrite e5 in H. noconf H. - pose proof e as e'. rewrite e4 in e'. noconf e'. + assert (e = e0) by apply uip. subst e0. + pose proof e1. rewrite e5 in H. noconf H. + assert (e1 = e5) by apply uip. subst e5. assert (br0 = br) as -> by congruence. - rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). + rewrite -> (uip e8 e4), (uip e2 e6), (uip e3 e7), (uip e4 e8). specialize (IHev2 _ ev'2); noconf IHev2. reflexivity. - depelim ev'; try go. + specialize (IHev1 _ ev'1); noconf IHev1. - pose proof e0. rewrite e5 in H. noconf H. - pose proof e as e'. rewrite e4 in e'. noconf e'. + pose proof e1. rewrite e5 in H. noconf H. assert (br0 = br) as -> by congruence. - rewrite -> (uip e e4), (uip e0 e5), (uip e1 e6), (uip e2 e7), (uip e3 e8). + rewrite -> (uip e e0), (uip e1 e5), (uip e8 e4), (uip e2 e6), (uip e3 e7), (uip e4 e8). specialize (IHev2 _ ev'2); noconf IHev2. reflexivity. - depelim ev'; try go. @@ -782,7 +1107,7 @@ Section Wcbv. noconf e2. simpl. specialize (IHev1 _ ev'1); noconf IHev1. simpl. - pose proof (uip e e1). subst. + pose proof (uip e0 e). subst. pose proof (uip i i0). subst i0. now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. @@ -792,13 +1117,13 @@ Section Wcbv. noconf IHev1. specialize (IHev2 _ ev'2); noconf IHev2. assert (fn0 = fn) as -> by congruence. - assert (e0 = e) as -> by now apply uip. + assert (e1 = e) as -> by now apply uip. rewrite (uip guarded guarded0). now specialize (IHev3 _ ev'3); noconf IHev3. + specialize (IHev1 _ ev'1). pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. - exfalso; rewrite e0 in e. + exfalso; rewrite e1 in e. noconf e. lia. + specialize (IHev1 _ ev'1). @@ -811,7 +1136,7 @@ Section Wcbv. + specialize (IHev1 _ ev'1). pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. - exfalso; rewrite e0 in e. + exfalso; rewrite e1 in e. noconf e. lia. + specialize (IHev1 _ ev'1). @@ -821,7 +1146,7 @@ Section Wcbv. specialize (IHev2 _ ev'2); noconf IHev2. assert (narg0 = narg) as -> by congruence. assert (fn0 = fn) as -> by congruence. - assert (e0 = e) as -> by now apply uip. + assert (e1 = e) as -> by now apply uip. rewrite (uip guarded guarded0). now assert (l0 = l) as -> by now apply PCUICWcbvEval.le_irrel. + specialize (IHev1 _ ev'1). @@ -877,18 +1202,16 @@ Section Wcbv. pose proof (mkApps_eq_inj (f_equal pr1 IHev1) eq_refl eq_refl) as (? & <-). noconf H. noconf IHev1. assert (a0 = a) as -> by congruence. - pose proof e0 as e'. rewrite e4 in e'; noconf e'. - rewrite -> (uip e e3), (uip e0 e4). - pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite -> (uip e1 e5), (uip e2 e6). + pose proof e1 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e6 e3), (uip e1 e4), (uip e2 e5). + rewrite -> (uip e e0). now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. specialize (IHev1 _ ev'1); noconf IHev1. assert (a0 = a) as -> by congruence. - pose proof e0 as e'. rewrite e4 in e'; noconf e'. - rewrite -> (uip e e3), (uip e0 e4). - pose proof e5 as e4'. rewrite e1 in e4'; noconf e4'. - rewrite -> (uip e1 e5), (uip e2 e6). + pose proof e1 as e'. rewrite e4 in e'; noconf e'. + rewrite -> (uip e e0), (uip e1 e4). cbn. + rewrite -> (uip e3 e6), (uip e2 e5). now specialize (IHev2 _ ev'2); noconf IHev2. - depelim ev'; try go. specialize (IHev _ ev'). noconf IHev. @@ -907,17 +1230,18 @@ Section Wcbv. exfalso. rewrite isConstructApp_mkApps in i. cbn in i. rewrite !negb_or in i. rtoProp; intuition auto. - depelim ev'; try go. - + eapply app_inj_tail in e3 as e4. destruct e4 as [-> ->]. - rewrite (uip e3 eq_refl) in H. cbn in H. subst. - move: (IHev1 _ ev'1). - eapply DepElim.simplification_sigma1 => heq IHev1'. - noconf heq. - noconf IHev1'. - specialize (IHev2 _ ev'2). noconf IHev2. - pose proof e2 as E. - rewrite e0 in E. noconf E. - now rewrite -> (uip e e1), (uip e0 e2), (PCUICWcbvEval.le_irrel _ _ l l0). + + pose proof e0. rewrite e3 in H; noconf H. + rewrite -> (uip e0 e3); clear e0. + rewrite -> (uip e1 e4); clear e1. + rewrite -> (uip e e2); clear e. + assert ({| pr1 := args'; pr2 := a |} = {| pr1 := args'0; pr2 := a0 |}). clear -iha. + { induction a in iha, args'0, a0 |- *. cbn. depelim a0. reflexivity. + destruct iha. depelim a0. + specialize (IHa a1). specialize (IHa _ a0). noconf IHa. + specialize (e _ e0). now noconf e. } + now noconf H. + exfalso. invs i. destruct args; invs H0. + rewrite e in H1; cbn in H1. discriminate. - depelim ev'; try go. + exfalso. rewrite !negb_or in i. specialize (IHev1 _ ev'1); noconf IHev1. cbn in i. rtoProp; intuition auto. @@ -937,7 +1261,7 @@ Section Wcbv. now assert (i0 = i) as -> by now apply uip. - depelim ev'; try go. 2: now assert (i0 = i) as -> by now apply uip. - exfalso. invs i. destruct args; cbn in H0; invs H0. + exfalso. invs i. rewrite e in H0. destruct args; cbn in H0; invs H0. Qed. Lemma eval_unique {t v} : @@ -1091,29 +1415,19 @@ Section WcbvEnv. induction ev; try solve [econstructor; eauto using (extends_lookup_constructor wf ex), (extends_constructor_isprop_pars_decl wf ex), (extends_is_propositional wf ex)]. econstructor; eauto. - red in isdecl |- *. eauto using extends_lookup. constructor. + red in isdecl |- *. eauto using extends_lookup. econstructor; tea. + eauto using extends_lookup_constructor. + clear -a iha. induction a; constructor; eauto. apply iha. apply IHa, iha. + constructor. destruct t => //. cbn [atom] in i. destruct l => //. destruct lookup_constructor eqn:hl => //. eapply (extends_lookup_constructor wf ex) in hl. now cbn [atom]. + cbn in i. now rewrite andb_false_r in i. Qed. End WcbvEnv. Scheme eval_nondep := Minimality for eval Sort Prop. -Fixpoint eval_depth {wfl : WcbvFlags} {Σ : EAst.global_declarations} {t1 t2 : EAst.term} (ev : eval Σ t1 t2) { struct ev } : nat. -Proof. - rename eval_depth into aux. - destruct ev. - all:try match goal with - | [ H : eval _ _ _, H' : eval _ _ _, H'' : eval _ _ _ |- _ ] => - apply aux in H; apply aux in H'; apply aux in H''; exact (S (Nat.max H (Nat.max H' H''))) - | [ H : eval _ _ _, H' : eval _ _ _ |- _ ] => - apply aux in H; apply aux in H'; exact (S (Nat.max H H')) - | [ H : eval _ _ _ |- _ ] => apply aux in H; exact (S H) - end. - exact 1. -Defined. - Lemma isLambda_mkApps f l : ~~ isLambda f -> ~~ EAst.isLambda (mkApps f l). Proof. induction l using rev_ind; simpl; auto => //. @@ -1198,6 +1512,16 @@ Proof. now eapply IHΣ. Qed. +Lemma All2_over_impl {A : Set} (P : A -> A -> Set) l l' (a : All2_Set P l l') {Q R} + (ha : All2_over a (fun t u _ => Q t u)) (arl : All R l) : + (forall x y, Q x y -> R x -> R y) -> All R l'. +Proof. + intros qr. + induction a; constructor. + - eapply qr. eapply ha. now depelim arl. + - depelim arl. eapply IHa. apply ha. apply arl. +Qed. + (** Evaluation preserves closedness: *) Lemma eval_closed {wfl : WcbvFlags} Σ : closed_env Σ -> @@ -1215,12 +1539,12 @@ Proof. move: IHev1; rewrite closedn_mkApps => /andP[] _ clargs. apply IHev2. rewrite /iota_red. eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e3. eapply nth_error_forallb in Hc'; tea. + len. rewrite e4. eapply nth_error_forallb in Hc'; tea. now rewrite Nat.add_0_r in Hc'. - specialize (IHev1 Hc). apply IHev2. rewrite /iota_red. eapply closed_substl. now rewrite forallb_rev forallb_skipn. - len. rewrite e3. eapply nth_error_forallb in Hc'; tea. + len. rewrite e4. eapply nth_error_forallb in Hc'; tea. now rewrite Nat.add_0_r in Hc'. - subst brs. cbn in Hc'. rewrite andb_true_r in Hc'. eapply IHev2. eapply closed_substl. @@ -1262,9 +1586,8 @@ Proof. - have := (IHev1 Hc). rewrite closedn_mkApps /= => clargs. rewrite clargs IHev2 //. - - rtoProp; intuition auto. forward IHev1; solve_all; - eapply All_app in Hc; solve_all. - eapply All_app_inv; solve_all. invs b. econstructor. eauto. econstructor. + - eapply forallb_All in Hc. eapply All2_over_impl in iha; tea. solve_all. + cbn; intros; intuition auto. - rtoProp; intuition auto. Qed. @@ -1290,11 +1613,10 @@ Ltac sim := repeat (cbn ; autorewrite with simplifications). Lemma eval_wellformed {efl : EEnvFlags} {wfl : WcbvFlags} Σ : forall (has_app : has_tApp), (* necessary due to mkApps *) - efl.(@cstr_as_blocks) = false -> wf_glob Σ -> forall t u, wellformed Σ 0 t -> eval Σ t u -> wellformed Σ 0 u. Proof. - move=> has_app blcks clΣ t u Hc ev. move: Hc. + move=> has_app clΣ t u Hc ev. move: Hc. induction ev; simpl in *; auto; (move/andP=> [/andP[Hc Hc'] Hc''] || move/andP=> [Hc Hc'] || move=>Hc); auto. all:intros; intuition auto; rtoProp; intuition auto; rtoProp; eauto using wellformed_csubst. @@ -1316,7 +1638,7 @@ Proof. rewrite wellformed_mkApps // clargs andb_true_r. eapply wellformed_cunfold_fix; tea => //. - eapply IHev3 => //. rtoProp; intuition auto. - eapply wellformed_cunfold_fix => //; tea. cbn. rewrite H H1 //. + eapply wellformed_cunfold_fix => //; tea. cbn. rewrite H H1 H2 //. - eapply IHev2. rewrite wellformed_mkApps //. rewrite wellformed_mkApps // in H2. move/andP: H2 => [Hfix Hargs]. @@ -1334,12 +1656,18 @@ Proof. move/andP: clargs => [/andP[] hasc wfc wfargs]. eapply nth_error_forallb in wfargs; tea. - eapply IHev2. - eapply nth_error_forallb in e2; eauto. + eapply nth_error_forallb in e3; eauto. destruct cstr_as_blocks; eauto. destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. destruct args; cbn in H0; eauto. - destruct cstr_as_blocks; try congruence. - now destruct args; invs Hc''. + destruct lookup_constructor_pars_args as [ [] | ]; rtoProp; repeat solve_all. + now rewrite (All2_length a) in H. + eapply All2_over_impl in iha; tea. + intuition auto. + eapply All2_over_impl in iha; tea. + intuition auto. + depelim a => //. Qed. Lemma remove_last_length {X} {l : list X} : @@ -1388,6 +1716,16 @@ Proof. * now cbn in i. Qed. +Lemma eval_to_values {wfl : WcbvFlags} Σ a a' : All2 (eval Σ) a a' -> All (value Σ) a'. +Proof. + induction 1; constructor; eauto using eval_to_value. +Defined. + +Lemma values_final {wfl : WcbvFlags} Σ a: All (value Σ) a -> All2 (eval Σ) a a. +Proof. + induction 1; constructor; eauto using value_final. +Defined. + Lemma size_final {wfl : WcbvFlags} Σ t v : forall He : eval Σ t v, ∑ He' : eval Σ v v, eval_depth He' <= eval_depth He. Proof. @@ -1401,8 +1739,12 @@ Proof. - unshelve eexists. eapply eval_construct; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. cbn. lia. - unshelve eexists. eapply eval_construct_block; eauto. - { clear - l He1. eapply eval_Construct_inv in He1 as (? & ? & ?). eapply All2_length in a. invs e. lia. } - eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2; lia. + now rewrite -(All2_length a). + clear -a iha. induction a; constructor. destruct iha. apply s. apply IHa. apply iha. + cbn. + clear -a iha. + { induction a; cbn; try lia. + destruct iha. destruct s. cbn. specialize (IHa a0). lia. } - unshelve eexists. eapply eval_app_cong; eauto. eapply IHHe1. eapply IHHe2. cbn. destruct IHHe1, IHHe2. lia. Qed. @@ -1533,6 +1875,7 @@ Proof. intros hblock. revert e; induction args using rev_ind; intros e. - intros ev. depelim ev. congruence. exists []=> //. + split => //. cbn -[lookup_constructor] in i. now rewrite hblock /= in i. - intros ev. rewrite mkApps_app /= in ev. depelim ev; try solve_discr. destruct (IHargs _ ev1) as [? []]. solve_discr. @@ -1554,9 +1897,7 @@ Proof. intros hblock. revert e; induction oargs using rev_ind; intros e. - intros ev. depelim ev. - + eexists. split. reflexivity. split. reflexivity. - eapply eval_Construct_inv in ev1 as (? & [= <-] & ?). - eapply All2_app; eauto. + + eexists. split. reflexivity. split. reflexivity. auto. + invs i. destruct args; invs H0. exists []. repeat econstructor. - intros ev. rewrite mkApps_app /= in ev. depelim ev; try solve_discr. @@ -1664,7 +2005,8 @@ Proof. destruct (eval_mkApps_inv_size ev) as [f'' [args' [? []]]]. exists args'. destruct (eval_mkApps_Construct_inv _ _ _ _ _ hblock ev) as [? []]. subst v. - exists (eval_atom _ (tConstruct ind c []) i). + unshelve eexists (eval_atom _ (tConstruct ind c []) _). + cbn -[lookup_constructor]. now rewrite hblock. cbn. split => //. destruct ev; cbn => //; auto with arith. clear l. eapply (eval_mkApps_Construct_inv _ _ _ [] _ hblock) in x as [? []]; auto. subst f''. depelim a1. @@ -1692,6 +2034,6 @@ Proof. revert e H2; induction x using rev_ind; cbn; intros; eauto. eapply All2_app_inv_l in X as (l1' & l2' & -> & H' & H2). depelim H2. - specialize (IHx e _ H' H). simpl. + specialize (IHx e _ H'). simpl. rewrite mkApps_app. simpl. econstructor; eauto. Qed. \ No newline at end of file diff --git a/erasure/theories/EWcbvEvalCstrsAsBlocksInd.v b/erasure/theories/EWcbvEvalCstrsAsBlocksInd.v new file mode 100644 index 000000000..e17f8b37f --- /dev/null +++ b/erasure/theories/EWcbvEvalCstrsAsBlocksInd.v @@ -0,0 +1,487 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import Utf8 Program ssreflect ssrbool. +From MetaCoq.Template Require Import config utils Kernames BasicAst EnvMap. +From MetaCoq.Erasure Require Import EAst EAstUtils EInduction ELiftSubst EWcbvEval EGlobalEnv + EWellformed ECSubst EInduction EWcbvEvalInd EEtaExpanded. + +Set Asymmetric Patterns. +From Equations Require Import Equations. +Set Equations Transparent. +Local Set Keyed Unification. + +#[export] +Hint Constructors eval : core. + +Definition atomic_term (t : term) := + match t with + | tBox | tConst _ | tRel _ | tVar _ => true + | _ => false + end. + +Definition has_atom {etfl : ETermFlags} (t : term) := + match t with + | tBox => has_tBox + | tConst _ => has_tConst + | tRel _ => has_tRel + | tVar _ => has_tVar + | _ => false + end. + +Section OnSubterm. + Context {etfl : ETermFlags}. + Inductive on_subterms (Q : nat -> term -> Type) (n : nat) : term -> Type := + | on_atom t : has_atom t -> atomic_term t -> on_subterms Q n t + | on_evar k l : has_tEvar -> All (Q n) l -> on_subterms Q n (tEvar k l) + | on_lambda na t : has_tLambda -> Q (S n) t -> on_subterms Q n (tLambda na t) + | on_letin na t u : has_tLetIn -> Q n t -> Q (S n) u -> on_subterms Q n (tLetIn na t u) + | on_app f u : has_tApp -> Q n f -> Q n u -> on_subterms Q n (tApp f u) + | on_cstr i k args : has_tConstruct -> All (Q n) args -> on_subterms Q n (tConstruct i k args) + | on_case ci discr brs : has_tCase -> Q n discr -> + All (fun br => Q (#|br.1| + n) br.2) brs -> on_subterms Q n (tCase ci discr brs) + | on_proj p c : has_tProj -> Q n c -> on_subterms Q n (tProj p c) + | on_fix mfix idx : has_tFix -> All (fun d => Q (#|mfix| + n) d.(dbody)) mfix -> on_subterms Q n (tFix mfix idx) + | on_cofix mfix idx : has_tCoFix -> All (fun d => Q (#|mfix| + n) d.(dbody)) mfix -> on_subterms Q n (tCoFix mfix idx). + Derive Signature for on_subterms. +End OnSubterm. + +Class Qpres {etfl : ETermFlags} (Q : nat -> term -> Type) := qpres : forall n t, Q n t -> on_subterms Q n t. +#[export] Hint Mode Qpres - ! : typeclass_instances. + +Class Qapp {etfl : ETermFlags} (Q : nat -> term -> Type) := qapp : has_tApp -> forall n f args, Q n (mkApps f args) <~> Q n f × All (Q n) args. +#[export] Hint Mode Qapp - ! : typeclass_instances. + +Class Qcase {etfl : ETermFlags} (Q : nat -> term -> Type) := qcase : has_tCase -> + forall n ci discr brs, Q n (tCase ci discr brs) -> forall discr', Q n discr' -> Q n (tCase ci discr' brs). +#[export] Hint Mode Qcase - ! : typeclass_instances. + +(* Class Qcstr {etfl : ETermFlags} (Q : nat -> term -> Type) := *) + (* qcstr : has_tConstruct -> forall i n args, Q n (tConstruct i n args) Q n discr × All (fun br => Q (#|br.1| + n) br.2) brs. *) +(* #[export] Hint Mode Qcase - ! : typeclass_instances. *) + +Class Qproj {etfl : ETermFlags} (Q : nat -> term -> Type) := qproj : has_tProj -> forall n p discr, Q n (tProj p discr) -> forall discr', Q n discr' -> Q n (tProj p discr'). +#[export] Hint Mode Qproj - ! : typeclass_instances. + +Class Qfix {etfl : ETermFlags} (Q : nat -> term -> Type) := qfix : has_tFix -> forall n mfix idx, idx < #|mfix| -> Q n (tFix mfix idx) -> forall idx', idx' < #|mfix| -> Q n (tFix mfix idx'). +#[export] Hint Mode Qfix - ! : typeclass_instances. +Class Qcofix {etfl : ETermFlags} (Q : nat -> term -> Type) := qcofix : has_tCoFix -> forall n mfix idx, idx < #|mfix| -> Q n (tCoFix mfix idx) -> forall idx', idx' < #|mfix| -> Q n (tCoFix mfix idx'). +#[export] Hint Mode Qcofix - ! : typeclass_instances. +Class Qsubst (Q : nat -> term -> Type) := qsubst : forall t l, Q (#|l|) t -> All (Q 0) l -> Q 0 (substl l t). +#[export] Hint Mode Qsubst ! : typeclass_instances. +Class Qfixs (Q : nat -> term -> Type) := qfixs : forall mfix idx, Q 0 (tFix mfix idx) -> + forall args fn, cunfold_fix mfix idx = Some (args, fn) -> + Q 0 fn. +#[export] Hint Mode Qfixs ! : typeclass_instances. +Class Qcofixs (Q : nat -> term -> Type) := qcofixs : forall mfix idx, Q 0 (tCoFix mfix idx) -> + forall args fn, cunfold_cofix mfix idx = Some (args, fn) -> + Q 0 fn. +#[export] Hint Mode Qcofixs ! : typeclass_instances. + +Lemma Qfix_subst {etfl : ETermFlags} mfix Q : has_tFix -> Qfix Q -> Qpres Q -> forall idx, idx < #|mfix| -> Q 0 (tFix mfix idx) -> All (Q 0) (fix_subst mfix). +Proof. + intros hasfix qfix qpre; unfold fix_subst. + generalize (Nat.le_refl #|mfix|). + generalize #|mfix| at 1 4. + induction n. intros. constructor; auto. + intros. constructor. eapply qfix => //. 2:tea. tea. + eapply IHn. lia. 2:tea. assumption. +Qed. + +Lemma Qcofix_subst {etfl : ETermFlags} mfix Q : has_tCoFix -> Qcofix Q -> Qpres Q -> forall idx, idx < #|mfix| -> Q 0 (tCoFix mfix idx) -> All (Q 0) (cofix_subst mfix). +Proof. + intros hascofix qcofix qpre; unfold cofix_subst. + generalize (Nat.le_refl #|mfix|). + generalize #|mfix| at 1 4. + induction n. intros. constructor; auto. + intros. constructor. eapply qcofix => //. 2:tea. tea. + eapply IHn. lia. 2:tea. assumption. +Qed. + +#[export] Instance Qsubst_Qfixs {etfl : ETermFlags} Q : Qpres Q -> Qfix Q -> Qsubst Q -> Qfixs Q. +Proof. + move=> qpres qfix; rewrite /Qsubst /Qfixs. + intros Hs mfix idx hfix args fn. + assert (hasfix : has_tFix). + { eapply qpres in hfix. now depelim hfix. } + rewrite /cunfold_fix. + destruct nth_error eqn:hnth => //. + pose proof (nth_error_Some_length hnth). + epose proof (Qfix_subst _ _ hasfix qfix qpres idx H hfix). + intros [= <-]. subst fn. + eapply Hs. rewrite fix_subst_length //. + eapply qpres in hfix. depelim hfix. depelim i0. eapply nth_error_all in a; tea. now rewrite Nat.add_0_r in a. + assumption. +Qed. + +#[export] Instance Qsubst_Qcofixs {etfl : ETermFlags} Q : Qpres Q -> Qcofix Q -> Qsubst Q -> Qcofixs Q. +Proof. + move=> qpres qfix; rewrite /Qsubst /Qfixs. + intros Hs mfix idx hfix args fn. + assert (hasfix : has_tCoFix). + { eapply qpres in hfix. now depelim hfix. } + rewrite /cunfold_cofix. + destruct nth_error eqn:hnth => //. + pose proof (nth_error_Some_length hnth). + epose proof (Qcofix_subst _ _ hasfix qfix qpres idx H hfix). + intros [= <-]. subst fn. + eapply Hs. rewrite cofix_subst_length //. + eapply qpres in hfix. depelim hfix. depelim i0. eapply nth_error_all in a; tea. now rewrite Nat.add_0_r in a. + assumption. +Qed. + +Class Qconst Σ (Q : nat -> term -> Type) := qconst : + ∀ kn decl, declared_constant Σ kn decl → + match cst_body decl with + | None => unit + | Some b => Q 0 b + end. +#[export] Hint Mode Qconst - ! : typeclass_instances. + +Set Warnings "-future-coercion-class-field". +Class Qpreserves {etfl : ETermFlags} (Q : nat -> term -> Type) Σ := + { qpres_qpres :> Qpres Q; + qpres_qcons :> Qconst Σ Q; + qpres_qapp :> Qapp Q; + qpres_qcase :> Qcase Q; + qpres_qproj :> Qproj Q; + qpres_qsubst :> Qsubst Q; + qpres_qfix :> Qfix Q; + qpres_qcofix :> Qcofix Q }. +Set Warnings "+future-coercion-class-field". + +Lemma eval_preserve_mkApps_ind : +∀ (wfl : WcbvFlags), with_constructor_as_block = true -> forall {efl : EEnvFlags} (Σ : global_declarations) + (P' : term → term → Type) + (Q : nat -> term -> Type) + {Qpres : Qpreserves Q Σ} + (P := (fun x y => [× P' x y, Q 0 x & Q 0 y])%type) + (HPQ : ∀ t u, eval Σ t u -> Q 0 t -> P' t u -> Q 0 u), + wf_glob Σ -> + has_tApp -> + (∀ (a t t' : term), + eval Σ a tBox -> + P a tBox → + eval Σ t t' → P t t' → P' (tApp a t) tBox) → + (∀ (f0 : term) (na : name) (b a a' res : term), + eval Σ f0 (tLambda na b) → + P f0 (tLambda na b) + → eval Σ a a' + → P a a' + → eval Σ (ECSubst.csubst a' 0 b) res + → P (ECSubst.csubst a' 0 b) res → P' (tApp f0 a) res) + → (∀ (na : name) (b0 b0' b1 res : term), + eval Σ b0 b0' + → P b0 b0' + -> Q 1 b1 + → eval Σ (ECSubst.csubst b0' 0 b1) res + → P (ECSubst.csubst b0' 0 b1) res → + P' (tLetIn na b0 b1) res) + → (∀ (ind : inductive) (pars : nat) cdecl (discr : term) + (c : nat) (args : list term) (brs : + list + (list name × term)) + (br : list name × term) (res : term), + eval Σ discr (tConstruct ind c args) + → P discr (tConstruct ind c args) + → constructor_isprop_pars_decl Σ ind c = Some (false, pars, cdecl) + → nth_error brs c = Some br + → #|args| = pars + cdecl.(cstr_nargs) + → #|skipn pars args| = #|br.1| + -> Q #|br.1| br.2 + → eval Σ (iota_red pars args br) res + → P (iota_red pars args br) res + → P' (tCase (ind, pars) discr brs) res) + → (∀ (ind : inductive) (pars : nat) (discr : term) + (brs : list (list name × term)) + (n : list name) (f3 res : term), + with_prop_case + → eval Σ discr tBox + → P discr tBox + → inductive_isprop_and_pars Σ ind = Some (true, pars) + → brs = [(n, f3)] + -> Q #|n| f3 + → eval Σ (ECSubst.substl (repeat tBox #|n|) f3) + res + → P (ECSubst.substl (repeat tBox #|n|) f3) res + → P' (tCase (ind, pars) discr brs) res) + → (∀ (f4 : term) (mfix : mfixpoint term) + (idx : nat) (argsv : list term) + (a av fn res : term), + with_guarded_fix -> + eval Σ f4 (mkApps (tFix mfix idx) argsv) + → P f4 (mkApps (tFix mfix idx) argsv) + → eval Σ a av + → P a av + → cunfold_fix mfix idx = Some (#|argsv|, fn) + -> Q 0 fn + → eval Σ (tApp (mkApps fn argsv) av) res + → P (tApp (mkApps fn argsv) av) res + → P' (tApp f4 a) res) + → (∀ (f5 : term) (mfix : mfixpoint term) + (idx : nat) (argsv : list term) + (a av : term) (narg : nat) (fn : term), + with_guarded_fix -> + eval Σ f5 (mkApps (tFix mfix idx) argsv) + → P f5 (mkApps (tFix mfix idx) argsv) + → eval Σ a av + → P a av + → cunfold_fix mfix idx = Some (narg, fn) + → #|argsv| < narg + → P' (tApp f5 a) + (tApp + (mkApps (tFix mfix idx) argsv) av)) + → (∀ (f5 : term) (mfix : mfixpoint term) + (idx : nat) (a av : term) (narg : nat) (fn : term) res, + with_guarded_fix = false -> + eval Σ f5 (tFix mfix idx) + → P f5 (tFix mfix idx) + → cunfold_fix mfix idx = Some (narg, fn) + -> eval Σ a av -> P a av + → eval Σ (tApp fn av) res + → P (tApp fn av) res + → P' (tApp f5 a) res) → + + (∀ (ip : inductive × nat) (mfix : mfixpoint term) + (idx : nat) (args : list term) + (narg : nat) discr (fn : term) (brs : + list + (list name × term)) + (res : term), + cunfold_cofix mfix idx = Some (narg, fn) + -> eval Σ discr (mkApps (tCoFix mfix idx) args) + -> P discr (mkApps (tCoFix mfix idx) args) + → eval Σ (tCase ip (mkApps fn args) brs) res + → P (tCase ip (mkApps fn args) brs) res + → P' + (tCase ip discr brs) + res) + → (∀ (p : projection) (mfix : mfixpoint term) + (idx : nat) (args : list term) + (narg : nat) discr (fn res : term), + has_tProj -> + cunfold_cofix mfix idx = Some (narg, fn) + -> eval Σ discr (mkApps (tCoFix mfix idx) args) + -> P discr (mkApps (tCoFix mfix idx) args) + → eval Σ (tProj p (mkApps fn args)) res + → P (tProj p (mkApps fn args)) res + → P' + (tProj p discr) res) + → (∀ (c : kername) (decl : constant_body) + (body : term), + declared_constant Σ c decl + → ∀ res : term, + cst_body decl = Some body + → eval Σ body res + → P body res → P' (tConst c) res) + → (∀ p cdecl (discr : term) (args : list term) a (res : term), + has_tProj -> + eval Σ discr (tConstruct p.(proj_ind) 0 args) + → P discr (tConstruct p.(proj_ind) 0 args) + → constructor_isprop_pars_decl Σ p.(proj_ind) 0 = Some (false, p.(proj_npars), cdecl) + → #|args| = p.(proj_npars) + cdecl.(cstr_nargs) + -> nth_error args (p.(proj_npars) + p.(proj_arg)) = Some a + -> eval Σ a res + → P a res + → P' (tProj p discr) res) + → (∀ p (discr : term), + has_tProj -> + with_prop_case + → eval Σ discr tBox + → P discr tBox + → inductive_isprop_and_pars Σ p.(proj_ind) = Some (true, p.(proj_npars)) + → P' (tProj p discr) tBox) → + (∀ (f11 f' : term) a a', + forall (ev : eval Σ f11 f'), + P f11 f' -> + (forall t u (ev' : eval Σ t u), eval_depth ev' <= eval_depth ev -> Q 0 t -> P t u) → + ~~ (isLambda f' || (if with_guarded_fix then isFixApp f' else isFix f') || isBox f' || isConstructApp f') → + eval Σ a a' → P a a' → + P' (tApp f11 a) (tApp f' a')) → + (∀ ind i mdecl idecl cdecl args args', + lookup_constructor Σ ind i = Some (mdecl, idecl, cdecl) -> + #|args| = cstr_arity mdecl cdecl -> + All2 (eval Σ) args args' -> + All2 P args args' -> + P' (tConstruct ind i args) (tConstruct ind i args')) → + + (∀ t : term, atom Σ t → Q 0 t -> P' t t) -> + ∀ (t t0 : term), Q 0 t -> eval Σ t t0 → P' t t0. +Proof. + intros wfl hcon. intros * Qpres P P'Q wfΣ hasapp. + assert (qfixs: Qfixs Q) by tc. + assert (qcofixs: Qcofixs Q) by tc. + intros. + pose proof (p := @Fix_F { t : _ & { t0 : _ & { qt : Q 0 t & eval Σ t t0 }}}). + specialize (p (MR lt (fun x => eval_depth x.π2.π2.π2))). + set(foo := existT _ t (existT _ t0 (existT _ X15 H)) : { t : _ & { t0 : _ & { qt : Q 0 t & eval Σ t t0 }}}). + change t with (projT1 foo). + change t0 with (projT1 (projT2 foo)). + revert foo. + match goal with + |- let foo := _ in @?P foo => specialize (p (fun x => P x)) + end. + forward p. + 2:{ apply p. apply measure_wf, lt_wf. } + clear p. + rename X15 into qt. rename X13 into Xcappexp. + rename X14 into Qatom. + clear t t0 qt H. + intros (t & t0 & qt & ev). + intros IH. + set (IH' t t0 q H := IH (t; t0; q; H)). clearbody IH'; clear IH; rename IH' into IH. + cbn in IH. unfold MR in IH; cbn in IH. cbn. + Ltac ih := + match goal with + [ IH : forall x y, ?Q 0 x -> _ |- _ ] => unshelve eapply IH; tea; cbn; try lia + end. + Ltac hp' P'Q := intros ?; repeat split => //; try eapply P'Q; tea. + assert (and_assum : forall x y, P' x y -> + ((P' x y) -> Q 0 x × Q 0 y) -> + P x y). + { intuition auto. red. intuition auto. } + Ltac ih' P'Q := + match goal with + | [ H : _, IH : forall x y, ?Q 0 x -> _ |- _ ] => + eapply H; tea; (apply and_assum; [ih|hp' P'Q]) + end. + Ltac myt hyp anda P'Q := eapply hyp; tea; (apply and_assum; [ih|hp' P'Q]). + + destruct ev. + 1-18:eapply qpres in qt as qt'; depelim qt' => //. + all:try congruence. + - eapply X; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (ql : Q 0 (tLambda na b)). + { eapply P'Q; tea. ih. } + assert (qs: Q 0 (csubst a' 0 b)). + { eapply qpres in ql. depelim ql => //. + eapply (qsubst b [a']) in q1. now cbn in q1. + repeat constructor. + eapply P'Q; tea; ih. } + eapply X0; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (qs : Q 0 (csubst b0' 0 b1)). + { eapply (qsubst b1 [b0']) in q0. now cbn in q0. + repeat constructor. + eapply P'Q; tea; ih. } + eapply X1; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (Q 0 (iota_red pars args br)). + { unfold iota_red. + eapply nth_error_all in a; tea. cbn in a. + rewrite -e3 in a. + rewrite -(List.rev_length (skipn pars args)) in a. + rewrite Nat.add_0_r in a. + eapply (qsubst _ (List.rev (skipn pars args))) in a. + 2:{ eapply All_rev, All_skipn. + assert (Q 0 (tConstruct ind c args)). + eapply P'Q; tea; ih. eapply qpres in X13. + depelim X13 => //. } + exact a. } + eapply nth_error_all in a; tea; cbn. rewrite Nat.add_0_r in a. + eapply X2; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (Q 0 (substl (repeat tBox #|n|) f)). + { subst brs. eapply All_tip in a. cbn in a. + rewrite -(repeat_length tBox #|n|) Nat.add_0_r in a. + eapply (qsubst _ (repeat tBox #|n|)) in a => //. + eapply All_repeat. eapply P'Q; tea; ih. } + eapply X3; tea. 1,3:(apply and_assum; [ih|hp' P'Q]). + subst brs. depelim a. now rewrite Nat.add_0_r in q0. + - pose proof (ev1' := ev1). eapply P'Q in ev1' => //. 2:{ clear ev1'; ih. } + eapply qapp in ev1' as [hfix qargs] => //. + assert (hastfix : has_tFix). + { eapply qpres in hfix. now depelim hfix. } + assert (qf : Q 0 fn). + { eapply (qfixs mfix idx) in hfix; tea. } + assert (qa : Q 0 (tApp (mkApps fn argsv) av)). + { rewrite -[tApp _ _](mkApps_app _ _ [av]). + unshelve eapply (qapp _ _ _ _).2; auto. + split => //. + eapply (qfixs mfix idx) in hfix; tea. + eapply All_app_inv => //. eapply All_tip.1. + eapply P'Q; tea; ih. } + eapply X4; tea. 1-3:(apply and_assum; [ih|hp' P'Q]). + - eapply X5; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (qav : Q 0 av). + { eapply P'Q; tea; ih. } + assert (qa : Q 0 (tApp fn av)). + { pose proof (ev1' := ev1). eapply P'Q in ev1' => //. 2:clear ev1'; ih. + eapply qfixs in ev1'. cbn in IH. eapply ev1' in e. + unshelve eapply (qapp _ _ _ [av]); tea; split => //. now eapply All_tip.1. } + eapply X6; tea. 1-3:(apply and_assum; [ih|hp' P'Q]). + - assert (qa : Q 0 (tCase ip (mkApps fn args) brs)). + { eapply qcase; tea => //. + pose proof (ev1' := ev1). eapply P'Q in ev1' => //. + eapply qapp in ev1' as [hfix qargs] => //. + eapply qapp => //. split => //. + eapply (qcofixs mfix idx) in hfix; tea. + clear ev1'; ih. } + eapply X7; tea; (apply and_assum; [ih|hp' P'Q]). + - cbn in IH. + assert (qa : Q 0 (tProj p (mkApps fn args))). + { pose proof (ev1' := ev1). eapply P'Q in ev1' => //. + eapply qapp in ev1' as [hfix ?] => //. + eapply qproj; tea => //. eapply qapp => //. split => //. + eapply (qcofixs mfix idx) in hfix; tea. + clear ev1'; ih. } + eapply X8; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (Q 0 body). + { cbn in IH; eapply (qconst (Q:=Q)) in isdecl. now rewrite e in isdecl. } + eapply X9; tea; (apply and_assum; [ih|hp' P'Q]). + - assert (Q 0 a). + { pose proof (ev1' := ev1). eapply P'Q in ev1' => //. + eapply qpres in ev1'; depelim ev1' => //. + { eapply nth_error_all in a0; tea. } + clear ev1'; ih. } + eapply X10; tea; (apply and_assum; [ih|hp' P'Q]). + - unshelve eapply X11; tea; try (intros; apply and_assum; [ih|hp' P'Q]). + - rename args into cargs. + eapply Xcappexp; tea. eauto. + cbn in IH. + clear -P'Q IH a a0 and_assum. + revert a0; induction a; constructor; auto. depelim a0. + apply and_assum; [ih|hp' P'Q]. + eapply IHa. cbn. intros. eapply (IH _ _ q H). cbn. lia. + now depelim a0. + - eapply (X12 _ _ _ _ ev1); tea. + 1,3:(apply and_assum; [ih|hp' P'Q]). + intros. apply and_assum; [ih|hp' P'Q]. + - eapply Qatom; tea. +Qed. + +Lemma Qpreserves_wellformed (efl : EEnvFlags) Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. +Proof. + intros clΣ. + split. + - red. move=> n t. + destruct t; cbn -[lookup_constructor lookup_constructor_pars_args]; intuition auto; try solve [constructor; auto]. + rtoProp; intuition auto. + constructor => //. + eapply on_evar; rtoProp; intuition auto. solve_all. + eapply on_lambda;rtoProp; intuition auto. + eapply on_letin; rtoProp; intuition auto. + eapply on_app; rtoProp; intuition auto. + constructor => //; rtoProp; intuition auto. + move/andP: H => [] /andP[] has isl hf => //. + eapply on_cstr => //. destruct cstr_as_blocks. + rtoProp; intuition auto. solve_all. destruct l => //. + eapply on_case; rtoProp; intuition auto. solve_all. + eapply on_proj; rtoProp; intuition auto. + rtoProp; intuition auto. + eapply on_fix => //. move/andP: H0 => [] _ ha. solve_all. + rtoProp; intuition auto. + eapply on_cofix => //. move/andP: H0 => [] _ ha. solve_all. + - red. intros kn decl. + move/(lookup_env_wellformed clΣ). + unfold wf_global_decl. destruct cst_body => //. + - red. move=> hasapp n t args. rewrite wellformed_mkApps //. + split; intros; rtoProp; intuition auto; solve_all. + - red. + move=> hascase n ci discr brs. simpl. + destruct lookup_inductive eqn:hl => /= //. + intros; rtoProp; intuition auto; solve_all. + - red. simpl. move=> hasproj n p discr wf discr' wf'. + simpl. rtoProp; intuition auto. + - red. move=> t args clt cll. + eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. + - red. move=> n mfix idx. cbn. unfold EWellformed.wf_fix. + intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. + - red. move=> n mfix idx. cbn. unfold EWellformed.wf_fix. + intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. +Qed. diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index 927479125..e012b48f0 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -57,7 +57,7 @@ Class Qcase {etfl : ETermFlags} (Q : nat -> term -> Type) := qcase : has_tCoFix Class Qproj {etfl : ETermFlags} (Q : nat -> term -> Type) := qproj : has_tProj -> forall n p discr, Q n (tProj p discr) <~> Q n discr. #[export] Hint Mode Qproj - ! : typeclass_instances. -Class Qfix {etfl : ETermFlags} (Q : nat -> term -> Type) := qfix : has_tFix -> forall n mfix idx, idx < #|mfix| -> Q n (tFix mfix idx) <~> All (fun d => Q (#|mfix| + n) d.(dbody)) mfix. +Class Qfix {etfl : ETermFlags} (Q : nat -> term -> Type) := qfix : has_tFix -> forall n mfix idx, idx < #|mfix| -> Q n (tFix mfix idx) -> forall idx', idx' < #|mfix| -> Q n (tFix mfix idx'). #[export] Hint Mode Qfix - ! : typeclass_instances. Class Qcofix {etfl : ETermFlags} (Q : nat -> term -> Type) := qcofix : has_tCoFix -> forall n mfix idx, idx < #|mfix| -> Q n (tCoFix mfix idx) <~> All (fun d => Q (#|mfix| + n) d.(dbody)) mfix. #[export] Hint Mode Qcofix - ! : typeclass_instances. @@ -72,13 +72,14 @@ Class Qcofixs (Q : nat -> term -> Type) := qcofixs : forall mfix idx, Q 0 (tCoFi Q 0 fn. #[export] Hint Mode Qcofixs ! : typeclass_instances. -Lemma Qfix_subst {etfl : ETermFlags} mfix Q : has_tFix -> Qfix Q -> All (λ d : def term, Q (#|mfix| + 0) (dbody d)) mfix -> All (Q 0) (fix_subst mfix). +Lemma Qfix_subst {etfl : ETermFlags} mfix Q : has_tFix -> Qfix Q -> Qpres Q -> forall idx, idx < #|mfix| -> Q 0 (tFix mfix idx) -> All (Q 0) (fix_subst mfix). Proof. - intros hasfix qfix; unfold fix_subst. + intros hasfix qfix qpre; unfold fix_subst. generalize (Nat.le_refl #|mfix|). generalize #|mfix| at 1 4. induction n. intros. constructor; auto. - intros. constructor. eapply qfix => //. eapply IHn. lia. exact X. + intros. constructor. eapply qfix => //. 2:tea. tea. + eapply IHn. lia. 2:tea. assumption. Qed. Lemma Qcofix_subst {etfl : ETermFlags} mfix Q : has_tCoFix -> Qcofix Q -> All (λ d : def term, Q (#|mfix| + 0) (dbody d)) mfix -> All (Q 0) (cofix_subst mfix). @@ -97,13 +98,13 @@ Proof. assert (hasfix : has_tFix). { eapply qpres in hfix. now depelim hfix. } rewrite /cunfold_fix. - eapply qpres in hfix. depelim hfix => //. destruct nth_error eqn:hnth => //. - eapply nth_error_all in hnth; tea. cbn in hnth. - rewrite Nat.add_0_r in hnth. + pose proof (nth_error_Some_length hnth). + epose proof (Qfix_subst _ _ hasfix qfix qpres idx H hfix). intros [= <-]. subst fn. eapply Hs. rewrite fix_subst_length //. - now apply Qfix_subst. + eapply qpres in hfix. depelim hfix. depelim i0. eapply nth_error_all in a; tea. now rewrite Nat.add_0_r in a. + assumption. Qed. #[export] Instance Qsubst_Qcofixs {etfl : ETermFlags} Q : Qpres Q -> Qcofix Q -> Qsubst Q -> Qcofixs Q. @@ -678,12 +679,57 @@ Proof. - intros ise. split => //. eapply Qatom; tea. Qed. -#[export] Instance Qpreserves_True (etfl := all_term_flags) Σ : Qpreserves (fun _ _ => True) Σ. +Definition term_flags := + {| + has_tBox := true; + has_tRel := true; + has_tVar := false; + has_tEvar := false; + has_tLambda := true; + has_tLetIn := true; + has_tApp := true; + has_tConst := true; + has_tConstruct := true; + has_tCase := true; + has_tProj := false; + has_tFix := true; + has_tCoFix := false + |}. + +Definition env_flags := + {| has_axioms := false; + has_cstr_params := false; + term_switches := term_flags ; + cstr_as_blocks := false + |}. + +From MetaCoq.Erasure Require Import ELiftSubst. +Lemma Qpreserves_wellformed (efl := env_flags) Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. Proof. - split; intros; red; intros; try split; intuition auto. - { destruct t; try solve [constructor; auto; auto using All_True]. } - { destruct cst_body => //. } - all:apply All_True. + intros clΣ. + split. + - red. move=> n t. + destruct t; cbn; intuition auto; try solve [constructor; auto]. + eapply on_letin; rtoProp; intuition auto. + eapply on_app; rtoProp; intuition auto. + eapply on_case; rtoProp; intuition auto. ELiftSubst.solve_all. + eapply on_fix. eauto. move/andP: H => [] isl /andP[] _ wf. ELiftSubst.solve_all. + - red. intros kn decl. + move/(lookup_env_wellformed clΣ). + unfold wf_global_decl. destruct cst_body => //. + - red. move=> hasapp n t args. rewrite wellformed_mkApps //. + split; intros; rtoProp; intuition auto; solve_all. + - red. cbn => //. + (* move=> hascase n ci discr brs. simpl. + destruct lookup_inductive eqn:hl => /= //. + split; intros; rtoProp; intuition auto; solve_all. *) + - red. now move=> hasproj n p discr. + - red. move=> t args clt cll. + eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. + - red. move=> n mfix idx. cbn. unfold EWellformed.wf_fix. + intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. + - red. move=> n mfix idx. cbn. + split; intros; rtoProp; intuition auto; solve_all. Qed. Ltac destruct_nary_times := @@ -694,17 +740,20 @@ Ltac destruct_nary_times := | [ H : [× _, _, _, _ & _] |- _ ] => destruct H end. -Lemma eval_etaexp {fl : WcbvFlags} (efl := all_env_flags) {Σ a a'} : +Lemma eval_etaexp {fl : WcbvFlags} (efl := env_flags) {Σ a a'} : with_constructor_as_block = false -> isEtaExp_env Σ -> wf_glob Σ -> + wellformed Σ 0 a -> eval Σ a a' -> isEtaExp Σ a -> isEtaExp Σ a'. Proof. - intros hcon etaΣ wfΣ ev eta. - generalize I. intros q. revert a a' q eta ev. - eapply (eval_preserve_mkApps_ind (efl:=all_env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun _ _ => True) (Qpres := Qpreserves_True Σ)) => //. + intros hcon etaΣ wfΣ wf ev eta. + revert a a' wf eta ev. + eapply (eval_preserve_mkApps_ind (efl:=env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun n t => wellformed Σ n t) + (Qpres := Qpreserves_wellformed Σ wfΣ)) => //. all:intros; repeat destruct_nary_times. all:intuition auto. + - eapply eval_wellformed; tea => //. - rewrite isEtaExp_Constructor => //. rewrite -(All2_length X0) H1. cbn. rtoProp; intuition eauto. cbn; eapply All_forallb. eapply All2_All_right; tea. diff --git a/erasure/theories/EWcbvEvalInd.v b/erasure/theories/EWcbvEvalInd.v index 5d1e69291..51ec73e29 100644 --- a/erasure/theories/EWcbvEvalInd.v +++ b/erasure/theories/EWcbvEvalInd.v @@ -219,22 +219,14 @@ Section eval_mkApps_rect. (c : nat) (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body) - (args args' : - list term) (a a' : term) + (args args' : list term) (e : with_constructor_as_block = true) (e0 : lookup_constructor Σ ind c = Some (mdecl, idecl, cdecl)) - (l : #|args| < cstr_arity mdecl cdecl) - (e1 : eval Σ - (tConstruct ind c args) - (tConstruct ind c args')), - P (tConstruct ind c args) - (tConstruct ind c args') - → ∀ e2 : eval Σ a a', - P a a' - → P (tConstruct ind c (args ++ [a])) - (tConstruct ind c - (args' ++ [a']))) + (l : #|args| = cstr_arity mdecl cdecl) + (e1 : All2 (eval Σ) args args'), + All2 P args args' + → P (tConstruct ind c args) (tConstruct ind c args')) → (∀ (f15 f' a a' : term) (e : eval Σ f15 f'), P f15 f' -> IH _ _ e @@ -282,6 +274,10 @@ Proof using Type. | [ H : _ |- _ ] => unshelve eapply H; try match goal with |- eval _ _ _ => tea end; tea; unfold IH; intros; unshelve eapply IH'; tea; cbn; try lia end]. + eapply X15; tea; auto. + clear -a IH'. induction a; constructor. + eapply (IH' _ _ r). cbn. lia. apply IHa. + intros. eapply (IH' _ _ H). cbn. lia. Qed. End eval_mkApps_rect. diff --git a/erasure/theories/EWellformed.v b/erasure/theories/EWellformed.v index 61ea8148a..9e7eedd3f 100644 --- a/erasure/theories/EWellformed.v +++ b/erasure/theories/EWellformed.v @@ -101,7 +101,7 @@ Section wf. let brs' := List.forallb (fun br => wellformed (#|br.1| + k) br.2) brs in isSome (lookup_inductive Σ ind.1) && wellformed k c && brs' | tProj p c => has_tProj && isSome (lookup_projection Σ p) && wellformed k c - | tFix mfix idx => has_tFix && wf_fix_gen wellformed k mfix idx + | tFix mfix idx => has_tFix && List.forallb (isLambda ∘ dbody) mfix && wf_fix_gen wellformed k mfix idx | tCoFix mfix idx => has_tCoFix && wf_fix_gen wellformed k mfix idx | tBox => has_tBox | tConst kn => has_tConst && @@ -109,7 +109,11 @@ Section wf. | Some d => has_axioms || isSome d.(cst_body) | _ => false end - | tConstruct ind c block_args => has_tConstruct && isSome (lookup_constructor Σ ind c) && if cstr_as_blocks then match lookup_constructor_pars_args Σ ind c with Some (p, a) => p + a <=? #|block_args| | _ => true end && forallb (wellformed k) block_args else is_nil block_args + | tConstruct ind c block_args => has_tConstruct && isSome (lookup_constructor Σ ind c) && + if cstr_as_blocks then match lookup_constructor_pars_args Σ ind c with + | Some (p, a) => (p + a) == #|block_args| + | _ => true end + && forallb (wellformed k) block_args else is_nil block_args | tVar _ => has_tVar end. @@ -256,9 +260,10 @@ Section EEnvFlags. rewrite Nat.add_assoc (Nat.add_comm k) in a. rewrite !Nat.add_assoc. eapply a => //. now rewrite !Nat.add_assoc in b. + - destruct (dbody x) => //. - intros. now len. - specialize (a (#|m| + k')). - len. now rewrite !Nat.add_assoc !(Nat.add_comm k) in a, b |- *. + len. now rewrite !Nat.add_assoc !(Nat.add_comm k) in a, b0 |- *. - intros. now len. - specialize (a (#|m| + k')); len. now rewrite !Nat.add_assoc !(Nat.add_comm k) in a, b |- *. @@ -298,14 +303,16 @@ Section EEnvFlags. Qed. Lemma wellformed_fix_subst mfix {hast : has_tFix}: + forallb (isLambda ∘ dbody) mfix -> forallb (EAst.test_def (wellformed (#|mfix| + 0))) mfix -> forallb (wellformed 0) (fix_subst mfix). Proof using Type. - intros hm. unfold fix_subst. + intros hm hm'. unfold fix_subst. generalize (Nat.le_refl #|mfix|). move: {1 3}#|mfix| => n. induction n => //. - intros hn. cbn. rewrite hast /=. rewrite /wf_fix_gen hm /= andb_true_r. + intros hn. cbn. rewrite hast /=. rewrite /wf_fix_gen hm' /= andb_true_r. + rewrite hm. cbn. apply/andP; split. apply Nat.ltb_lt. lia. apply IHn. lia. Qed. @@ -329,7 +336,7 @@ Section EEnvFlags. move=> cl. rewrite /cunfold_fix. destruct nth_error eqn:heq => //. - cbn in cl. move/andP: cl => [hastf /andP[] hidx cl]. + cbn in cl. move/andP: cl => [/andP[] hastf isfix /andP[] hidx cl]. have := (nth_error_forallb heq cl) => cld. move=> [=] _ <-. eapply wellformed_substl => //. now eapply wellformed_fix_subst. diff --git a/erasure/theories/ErasureCorrectness.v b/erasure/theories/ErasureCorrectness.v index 29d71b7b2..fb0aca3f8 100644 --- a/erasure/theories/ErasureCorrectness.v +++ b/erasure/theories/ErasureCorrectness.v @@ -1102,7 +1102,7 @@ Proof. * eexists. split. 2: now constructor; econstructor. econstructor; eauto. + invs He. - * eexists. split. 2:{ constructor; econstructor. cbn [EWcbvEval.atom]. + * eexists. split. 2:{ constructor. eapply EWcbvEval.eval_atom. cbn [EWcbvEval.atom]. depelim Hed. eapply EGlobalEnv.declared_constructor_lookup in H0. now rewrite H0. } econstructor; eauto. * eexists. split. 2: now constructor; econstructor. diff --git a/erasure/theories/ErasureFunction.v b/erasure/theories/ErasureFunction.v index 0e61fb071..d7e2b9584 100644 --- a/erasure/theories/ErasureFunction.v +++ b/erasure/theories/ErasureFunction.v @@ -1938,7 +1938,7 @@ Section wffix. wf_fixpoints c && brs' | tProj p c => wf_fixpoints c | tFix mfix idx => - (idx (isLambda d.(dbody) || isBox d.(dbody)) && wf_fixpoints d.(dbody)) mfix + (idx isLambda d.(dbody) && wf_fixpoints d.(dbody)) mfix | tCoFix mfix idx => (idx true diff --git a/erasure/theories/ErasureProperties.v b/erasure/theories/ErasureProperties.v index 1b1ca62c5..3b9aa6f9e 100644 --- a/erasure/theories/ErasureProperties.v +++ b/erasure/theories/ErasureProperties.v @@ -660,7 +660,7 @@ Proof. unfold EAst.test_def; simpl; eauto. rewrite fix_context_length in b1. move/andP: b0 => //; eauto. move=> [] wft /andP[] isl wf; eauto. - eapply b1; tea. now rewrite app_length fix_context_length. + eapply b1; tea. eapply b. now rewrite app_length fix_context_length. - epose proof (All2_length X0). unfold EWellformed.wf_fix_gen. rewrite -H0. move/andP: wfa => [] ->. @@ -677,8 +677,8 @@ Lemma eval_empty_brs {wfl : Ee.WcbvFlags} Σ ci p e : Σ ⊢ E.tCase ci p [] ▷ Proof. intros He. depind He. - - clear -e1. now rewrite nth_error_nil in e1. - - clear -e1. now rewrite nth_error_nil in e1. + - clear -e2. now rewrite nth_error_nil in e2. + - clear -e2. now rewrite nth_error_nil in e2. - discriminate. - eapply IHHe2. - cbn in i. discriminate. @@ -695,7 +695,7 @@ Proof. destruct args using rev_case. discriminate. rewrite EAstUtils.mkApps_app in H. discriminate. - depelim He1. - - exists n, f. intuition auto. + - exists n, f4. intuition auto. - depelim He1. clear -H. symmetry in H. elimtype False. destruct args using rev_case. discriminate. rewrite EAstUtils.mkApps_app in H. discriminate. From 2320bd14bc4c43721bd96ac1c5b46a3f74904474 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Tue, 12 Jul 2022 02:46:03 +0200 Subject: [PATCH 21/43] Constructors as blocks in the erasure pipeline (#736) * Constructors as blocks improvement: they always have the right arity * Derive an eliminator to reason on the evaluation relation when cstrs_as_blocks = true, preserving well-formedness * Use efficient env in EConstructorBlocks * Integrate the transformation into blocks into the defined erasure pipeline * Fix pretty printing of constructors-as-blocks, avoiding stack overflow --- erasure/_PluginProject.in | 2 + erasure/src/metacoq_erasure_plugin.mlpack | 1 + erasure/theories/EConstructorsAsBlocks.v | 360 +++++++++++++++------- erasure/theories/EEnvMap.v | 11 + erasure/theories/EInlineProjections.v | 13 +- erasure/theories/EPretty.v | 6 +- erasure/theories/EProgram.v | 2 +- erasure/theories/ERemoveParams.v | 6 +- erasure/theories/ETransform.v | 14 +- erasure/theories/EWcbvEvalEtaInd.v | 67 ++-- erasure/theories/Erasure.v | 24 +- 11 files changed, 341 insertions(+), 165 deletions(-) diff --git a/erasure/_PluginProject.in b/erasure/_PluginProject.in index 9909b2e98..54d6a30ae 100644 --- a/erasure/_PluginProject.in +++ b/erasure/_PluginProject.in @@ -145,6 +145,8 @@ src/eProgram.ml # src/eEtaExpandedFix.ml src/eInlineProjections.mli src/eInlineProjections.ml +src/eConstructorsAsBlocks.mli +src/eConstructorsAsBlocks.ml src/eTransform.mli src/eTransform.ml src/erasure.mli diff --git a/erasure/src/metacoq_erasure_plugin.mlpack b/erasure/src/metacoq_erasure_plugin.mlpack index 66c282909..3faebea5a 100644 --- a/erasure/src/metacoq_erasure_plugin.mlpack +++ b/erasure/src/metacoq_erasure_plugin.mlpack @@ -58,6 +58,7 @@ ERemoveParams ErasureFunction EOptimizePropDiscr EInlineProjections +EConstructorsAsBlocks EProgram ETransform Erasure diff --git a/erasure/theories/EConstructorsAsBlocks.v b/erasure/theories/EConstructorsAsBlocks.v index 60383dd6d..08cade12b 100644 --- a/erasure/theories/EConstructorsAsBlocks.v +++ b/erasure/theories/EConstructorsAsBlocks.v @@ -24,7 +24,8 @@ Hint Constructors eval : core. Import MCList (map_InP, map_InP_elim, map_InP_spec). Section transform_blocks. - Context (Σ : global_context). + Context (Σ : GlobalContextMap.t). + Section Def. Import TermSpineView. @@ -35,7 +36,7 @@ Section transform_blocks. | tEvar ev args => EAst.tEvar ev (map_InP args (fun x H => transform_blocks x)) | tLambda na M => EAst.tLambda na (transform_blocks M) | tApp u v napp nnil with construct_viewc u := - { | view_construct ind i block_args with lookup_constructor_pars_args Σ ind i := { + { | view_construct ind i block_args with GlobalContextMap.lookup_constructor_pars_args Σ ind i := { | Some (npars, nargs) => let args := map_InP v (fun x H => transform_blocks x) in let '(args, rest) := MCList.chop nargs args in @@ -153,11 +154,14 @@ Section transform_blocks. * destruct n1 => //. * set (v' := TermSpineView.view _). destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. - rewrite eq /=. rewrite heq /=. now simp transform_blocks. + rewrite eq /=. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec. + rewrite heq /=. now simp transform_blocks. * destruct v eqn:hargs => //. set (v' := TermSpineView.view _). destruct (TermSpineView.view_mkApps v') as [hf [vn eq]] => //. - rewrite eq /=. rewrite heq /=. now simp transform_blocks. + rewrite eq /=. rewrite GlobalContextMap.lookup_constructor_pars_args_spec heq /=. + now simp transform_blocks. - destruct v eqn:hargs => //. simp transform_blocks. set (v' := TermSpineView.view _). @@ -300,6 +304,7 @@ Section transform_blocks. move: H1 => /andP[] /andP[]. rewrite map_length. move=> etaapp etav bargs. destruct block_args; invs bargs. cbn -[lookup_constructor_pars_args]. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq. unfold isEtaExp_app in etaapp. rewrite Heq in etaapp |- *. destruct (chop nargs v) eqn:heqc. @@ -317,6 +322,7 @@ Section transform_blocks. rewrite !csubst_mkApps /= in H1 *. assert (map (csubst a k) v <> []). { destruct v; cbn; congruence. } + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq. rewrite transform_blocks_mkApps //. rewrite isEtaExp_Constructor // in H1. move/andP : H1 => [] /andP[]. rewrite map_length. move=> etaapp etav bargs. @@ -428,45 +434,16 @@ Definition transform_blocks_decl Σ d := end. Definition transform_blocks_env Σ := - map (on_snd (transform_blocks_decl Σ)) Σ. + map (on_snd (transform_blocks_decl Σ)) Σ.(GlobalContextMap.global_decls). Definition transform_blocks_program (p : eprogram_env) := (transform_blocks_env p.1, transform_blocks p.1 p.2). -Definition term_flags := - {| - has_tBox := true; - has_tRel := true; - has_tVar := false; - has_tEvar := false; - has_tLambda := true; - has_tLetIn := true; - has_tApp := true; - has_tConst := true; - has_tConstruct := true; - has_tCase := true; - has_tProj := false; - has_tFix := true; - has_tCoFix := false - |}. - -Definition env_flags := - {| has_axioms := false; - has_cstr_params := false; - term_switches := term_flags ; - cstr_as_blocks := false - |}. - - -Definition env_flags_blocks := - {| has_axioms := false; - has_cstr_params := false; - term_switches := term_flags ; - cstr_as_blocks := true - |}. - - -Local Existing Instance env_flags. +Definition switch_cstr_as_blocks (fl : EEnvFlags) := + {| has_axioms := has_axioms; + has_cstr_params := has_cstr_params; + term_switches := term_switches; + cstr_as_blocks := true |}. Definition block_wcbv_flags := {| with_prop_case := false ; with_guarded_fix := false ; with_constructor_as_block := true |}. @@ -508,10 +485,10 @@ Proof. intros [= -> -> <-]. cbn. f_equal. Qed. -Lemma wellformed_lookup_constructor_pars_args {efl : EEnvFlags} {Σ ind n block_args} : +Lemma wellformed_lookup_constructor_pars_args {efl : EEnvFlags} {Σ ind k n block_args} : wf_glob Σ -> has_cstr_params = false -> - wellformed Σ 0 (EAst.tConstruct ind n block_args) -> + wellformed Σ k (EAst.tConstruct ind n block_args) -> ∑ args, lookup_constructor_pars_args Σ ind n = Some (0, args). Proof. intros wfΣ hasp wf. cbn -[lookup_constructor] in wf. @@ -550,13 +527,14 @@ Proof. eauto. Qed. -Lemma transform_blocks_tApp Σ t a (P : term -> Set) k : +Lemma transform_blocks_tApp (efl : EEnvFlags) {Σ : GlobalContextMap.t} t a (P : term -> Set) k : + has_cstr_params = false -> wf_glob Σ -> wellformed Σ k (tApp t a) -> (let (fn, args) := decompose_app (tApp t a) in match construct_viewc fn with | view_construct kn c block_args => - match lookup_constructor_pars_args Σ kn c with + match GlobalContextMap.lookup_constructor_pars_args Σ kn c with | Some (0, nargs) => let cargs := map (transform_blocks Σ) args in let '(cargs, rest) := MCList.chop nargs cargs in @@ -569,7 +547,7 @@ Lemma transform_blocks_tApp Σ t a (P : term -> Set) k : end) -> P (transform_blocks Σ (tApp t a)). Proof. - intros wfΣ wf. + intros haspars wfΣ wf. rewrite (transform_blocks_decompose _ (tApp t a)). destruct decompose_app eqn:da. pose proof (decompose_app_notApp _ _ _ da). @@ -577,8 +555,9 @@ Proof. destruct construct_viewc eqn:vc. + eapply EEtaExpandedFix.decompose_app_tApp_split in da as [Ha Ht]. cbn in wf. - move: wf => /andP[]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. - destruct (wellformed_lookup_constructor_pars_args wfΣ eq_refl wfc). + move: wf => /andP[]. move/andP=> [haapp]. rewrite Ha wellformed_mkApps // => /andP[] wfc wfl wft. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec. + destruct (wellformed_lookup_constructor_pars_args wfΣ haspars wfc). rewrite e. cbn. destruct chop eqn:eqch => //. intros. apply H1. intuition auto. @@ -614,16 +593,18 @@ Proof. * now cbn in i. Qed. -Lemma transform_blocks_isConstructApp Σ t : +Lemma transform_blocks_isConstructApp {efl : EEnvFlags} {Σ : GlobalContextMap.t} t : + has_cstr_params = false -> wf_glob Σ -> wellformed Σ 0 t -> isConstructApp (transform_blocks Σ t) = isConstructApp t. Proof. - intros Hwf Hwf'. + intros haspars Hwf Hwf'. induction t; try now cbn; eauto. eapply transform_blocks_tApp; eauto. destruct decompose_app. destruct construct_viewc. - - destruct lookup_constructor_pars_args as [ [[]] | ]; eauto. + - rewrite GlobalContextMap.lookup_constructor_pars_args_spec. + destruct lookup_constructor_pars_args as [ [[]] | ]; eauto. cbn. destruct chop. intros (? & ? & ?). subst. rewrite -[tApp _ _](mkApps_app _ _ [t2]). rewrite !isConstructApp_mkApps. cbn. reflexivity. @@ -634,17 +615,19 @@ Proof. eapply IHt1. cbn in Hwf'. rtoProp. intuition. Qed. -Lemma lookup_env_transform_blocks Σ kn : +Lemma lookup_env_transform_blocks {Σ : GlobalContextMap.t} kn : lookup_env (transform_blocks_env Σ) kn = option_map (transform_blocks_decl Σ) (lookup_env Σ kn). Proof. unfold transform_blocks_env. + destruct Σ as [Σ ? ? ?]; cbn. induction Σ at 2 4; simpl; auto. case: eqb_spec => //. Qed. -Lemma transform_blocks_declared_constant Σ c decl : - declared_constant Σ c decl -> declared_constant (transform_blocks_env Σ) c (transform_blocks_constant_decl Σ decl). +Lemma transform_blocks_declared_constant {Σ : GlobalContextMap.t} c decl : + declared_constant Σ c decl -> + declared_constant (transform_blocks_env Σ) c (transform_blocks_constant_decl Σ decl). Proof. intros H. red in H; red. rewrite lookup_env_transform_blocks H //. @@ -662,28 +645,37 @@ Qed. Lemma isLambda_transform_blocks Σ c : isLambda c -> isLambda (transform_blocks Σ c). Proof. destruct c => //. Qed. -Lemma transform_wellformed' Σ n t : +Lemma transform_wellformed' {efl : EEnvFlags} {Σ : GlobalContextMap.t} n t : + has_cstr_params = false -> + cstr_as_blocks = false -> + has_tApp -> wf_glob Σ -> - @wellformed env_flags Σ n t -> + @wellformed efl Σ n t -> isEtaExp Σ t -> - @wellformed env_flags_blocks Σ n (transform_blocks Σ t). + @wellformed (switch_cstr_as_blocks efl) Σ n (transform_blocks Σ t). Proof. - revert n. funelim (transform_blocks Σ t); simp_eta; cbn-[transform_blocks lookup_constructor_pars_args isEtaExp]; intros m Hwf Hw; rtoProp; try split; eauto. + intros hasp cstrbl hasa. + revert n. funelim (transform_blocks Σ t); simp_eta; cbn -[transform_blocks + lookup_inductive lookup_constructor lookup_constructor_pars_args + GlobalContextMap.lookup_constructor_pars_args isEtaExp]; intros m Hwf Hw; rtoProp; try split; eauto. all: rewrite ?map_InP_spec; toAll; eauto; try now solve_all. - - destruct H1. unfold isEtaExp_app in H1. unfold lookup_constructor_pars_args in *. + - rewrite cstrbl in H0. destruct H2. unfold isEtaExp_app in H2. unfold lookup_constructor_pars_args in *. destruct (lookup_constructor Σ) as [[[]] | ]; try congruence; cbn - [transform_blocks]. - 2: eauto. split; auto. cbn in H1. eapply Nat.leb_le in H1. + 2: eauto. split; auto. cbn in H2. eapply Nat.leb_le in H2. apply/eqb_spec. lia. - - destruct H4. solve_all. - - unfold wf_fix in *. rtoProp. solve_all. now eapply isLambda_transform_blocks. + - destruct H5. solve_all. solve_all. + - unfold wf_fix in *. rtoProp. solve_all. solve_all. now eapply isLambda_transform_blocks. - unfold wf_fix in *. rtoProp. solve_all. len. solve_all. len. destruct x. cbn -[transform_blocks isEtaExp] in *. rtoProp. eauto. + - unfold wf_fix in *. len. solve_all. rtoProp; intuition auto. + solve_all. - rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. intros. eapply isEtaExp_mkApps in H3. rewrite decompose_app_mkApps in H3; eauto. destruct construct_viewc; eauto. cbn in d. eauto. rtoProp. eauto. repeat solve_all. - - Opaque isEtaExp. destruct chop eqn:Ec. rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. + - Opaque isEtaExp. destruct chop eqn:Ec. rewrite !wellformed_mkApps in Hw |- * => //. rtoProp. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq. cbn -[lookup_constructor transform_blocks ] in *. intros. rtoProp. rewrite isEtaExp_Constructor in H2. rtoProp. unfold isEtaExp_app in *. unfold lookup_constructor_pars_args in H2. @@ -699,9 +691,9 @@ Proof. cbn in E'. red in E'. unfold wf_minductive in E'. rewrite andb_true_iff in E'. cbn in E'. destruct E'. - eapply Nat.eqb_eq in H6. + rewrite hasp in H7. eapply Nat.eqb_eq in H7. destruct nth_error; invs E. - now destruct nth_error; invs H9. } + now destruct nth_error; invs H10. } lia. * rewrite chop_firstn_skipn in Ec. invs Ec. solve_all. eapply All_firstn. solve_all. @@ -709,21 +701,38 @@ Proof. solve_all. eapply All_skipn. solve_all. - rewrite wellformed_mkApps in Hw; eauto. rtoProp. cbn in *. rtoProp. cbn in *. destruct lookup_env as [[] | ]; cbn in *; eauto; try congruence. - - rewrite isEtaExp_Constructor in H0. rtoProp. unfold lookup_constructor_pars_args in *. + - rewrite isEtaExp_Constructor in H0. rtoProp. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq; unfold lookup_constructor_pars_args in *. destruct lookup_constructor as [ [[]] | ]; cbn in Heq; try congruence. cbn. split; eauto. rewrite wellformed_mkApps in Hw; eauto. rtoProp. solve_all. Qed. +Lemma transform_wellformed_decl' {efl : EEnvFlags} {Σ : GlobalContextMap.t} d : + has_cstr_params = false -> + cstr_as_blocks = false -> + has_tApp -> + wf_glob Σ -> + @wf_global_decl efl Σ d -> + isEtaExp_decl Σ d -> + @wf_global_decl (switch_cstr_as_blocks efl) Σ (transform_blocks_decl Σ d). +Proof. + intros wf wfd etad. + destruct d => //=. cbn. + destruct c as [[]] => //=. + eapply transform_wellformed'; tea. +Qed. + From MetaCoq.Erasure Require Import EGenericMapEnv. -Lemma transform_blocks_extends : - ∀ (Σ : global_context) (t : term) (n : nat), +Lemma transform_blocks_extends {efl : EEnvFlags} : + has_tApp -> + ∀ (Σ : GlobalContextMap.t) (t : term) (n : nat), wellformed Σ n t - → ∀ Σ' : global_context, + → ∀ Σ' : GlobalContextMap.t, extends Σ Σ' → wf_glob Σ' → transform_blocks Σ t = transform_blocks Σ' t. Proof. - intros Σ t. + intros hasapp Σ t. Opaque transform_blocks. funelim (transform_blocks Σ t); cbn -[lookup_constant lookup_inductive lookup_projection]; intros => //; simp transform_blocks; rewrite -?transform_blocks_equation_1. @@ -733,10 +742,12 @@ Proof. all: rtoProp; solve_all. - f_equal. eauto. solve_all. - unfold wf_fix in *. rtoProp. f_equal. solve_all. - - rewrite wellformed_mkApps in H1 => //. rtoProp. + - unfold wf_fix in *. rtoProp. f_equal. solve_all. + - f_equal. eauto. rewrite wellformed_mkApps in H1 => //. rtoProp. rewrite transform_blocks_mkApps; eauto. destruct construct_viewc; cbn in d; eauto. f_equal. eapply H; eauto. solve_all. - destruct chop eqn:E. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq. rewrite wellformed_mkApps in H0 => //. rewrite transform_blocks_mkApps => //. rtoProp. cbn [construct_viewc]. unfold lookup_constructor_pars_args in *. destruct (lookup_constructor Σ) as [ [[]] | ] eqn:E'; invs Heq. @@ -744,60 +755,143 @@ Proof. destruct (chop (cstr_nargs c) (map (transform_blocks Σ') v) ) eqn:Ec. rewrite !chop_firstn_skipn in E, Ec. invs E. invs Ec. f_equal. f_equal. f_equal. solve_all. f_equal. solve_all. - - rewrite wellformed_mkApps in H0 => //. cbn -[lookup_constructor] in H0. rtoProp. + - rewrite wellformed_mkApps in H0 => //. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec in Heq. + cbn -[lookup_constructor] in H0. rtoProp. unfold lookup_constructor_pars_args in Heq. destruct lookup_constructor as [ [[]] | ]; cbn in *; try congruence. Qed. -Lemma transform_wellformed Σ n t : + +Lemma transform_blocks_decl_extends {efl : EEnvFlags} : + has_tApp -> + ∀ (Σ : GlobalContextMap.t) t, + wf_global_decl Σ t + → ∀ Σ' : GlobalContextMap.t, + extends Σ Σ' + → wf_glob Σ' → transform_blocks_decl Σ t = transform_blocks_decl Σ' t. +Proof. + intros. + destruct t => //=. f_equal. + destruct c as [[]] => //=. + unfold transform_blocks_constant_decl. cbn. + do 2 f_equal. + eapply transform_blocks_extends; tea. + eapply H0. +Qed. + +Lemma transform_wellformed {efl : EEnvFlags} {Σ : GlobalContextMap.t} n t : + has_cstr_params = false -> + cstr_as_blocks = false -> + has_tApp -> wf_glob Σ -> - @wellformed env_flags Σ n t -> + @wellformed efl Σ n t -> isEtaExp Σ t -> - @wellformed env_flags_blocks (transform_blocks_env Σ) n (transform_blocks Σ t). + @wellformed (switch_cstr_as_blocks efl) (transform_blocks_env Σ) n (transform_blocks Σ t). Proof. intros. eapply gen_transform_wellformed_irrel; eauto. - 2:{eapply transform_wellformed'; eauto. } - eapply transform_blocks_extends. + eapply transform_wellformed'; eauto. Qed. + +(*Lemma optimize_wellformed_decl_irrel {efl : EEnvFlags} {Σ : GlobalContextMap.t} d : + wf_glob Σ -> + wf_global_decl (efl := env_flags) Σ d -> + wf_global_decl (efl := env_flags_blocks) (transform_blocks_env Σ) d. +Proof. + intros wf; destruct d => /= //. + destruct (cst_body c) => /= //. + intros wf'. eapply transform_wellformed. +Qed. *) -Lemma transform_wf_global Σ : - EEtaExpanded.isEtaExp_env Σ -> - @wf_glob env_flags Σ -> - @wf_glob env_flags_blocks (transform_blocks_env Σ). +Lemma optimize_decl_wf {efl : EEnvFlags} {Σ : GlobalContextMap.t} : + has_cstr_params = false -> + cstr_as_blocks = false -> + has_tApp -> + wf_glob (efl := efl) Σ -> + forall d, + wf_global_decl (efl := efl) Σ d -> + isEtaExp_decl Σ d -> + wf_global_decl (efl := switch_cstr_as_blocks efl) (transform_blocks_env Σ) (transform_blocks_decl Σ d). Proof. - intros pre. - eapply gen_transform_env_wf => //. - 2:{ intros. eapply transform_wellformed'; eauto. eapply H1. } - { eapply transform_blocks_extends. } - - induction Σ as [ | ]; cbn in *; eauto. - rtoProp. destruct a. cbn in *. split; eauto. - destruct g; cbn in *; eauto. - unfold isEtaExp_constant_decl in H. - destruct (cst_body c); eauto. + intros hasp cstrbl hasapp wf d. + destruct d => /= //. + rewrite /isEtaExp_constant_decl. + destruct (cst_body c) => /= //. + intros hwf etat. eapply transform_wellformed => //. +Qed. + +Lemma fresh_global_optimize_env {Σ : GlobalContextMap.t} kn : + fresh_global kn Σ -> + fresh_global kn (transform_blocks_env Σ). +Proof. + destruct Σ as [Σ map repr wf]; cbn in *. + induction 1; cbn; constructor; auto. + now eapply Forall_map; cbn. +Qed. + +Lemma fresh_global_map_on_snd Σ f kn : + fresh_global kn Σ -> + fresh_global kn (map (on_snd f) Σ). +Proof. + induction 1; cbn; constructor; auto. +Qed. + +Lemma transform_wf_global {efl : EEnvFlags} {Σ : GlobalContextMap.t} : + has_cstr_params = false -> + cstr_as_blocks = false -> + has_tApp -> + EEtaExpanded.isEtaExp_env Σ -> + wf_glob (efl := efl) Σ -> wf_glob (efl := switch_cstr_as_blocks efl) (transform_blocks_env Σ). +Proof. + intros hasp cstrbl hasapp etag wfg. + destruct Σ as [Σ map repr wf]; cbn in *. + revert etag wfg. + assert (extends Σ Σ). now exists []. + revert H. + revert repr wf. generalize Σ at 1 2 4 6 7. + induction Σ; cbn; constructor; auto. + - eapply IHΣ; rtoProp; intuition auto. destruct H. subst Σ0. exists (x ++ [a]). now rewrite -app_assoc. + - set (Σm := {| GlobalContextMap.global_decls := _ |}). + clear IHΣ. + epose proof (EExtends.extends_wf_glob _ H wfg); tea. + depelim H0. + set (Σm' := GlobalContextMap.make Σ (wf_glob_fresh _ H0)). + pose proof (transform_blocks_decl_extends hasapp Σm' _ H1 Σm). + forward H3. cbn. destruct H. subst Σ0. exists (x ++ [(kn, d)]). now rewrite -app_assoc. + specialize (H3 wfg). rewrite -H3. + move/andP: etag => [etad etag]. + unshelve epose proof (@transform_wellformed_decl' _ Σm' d _ _ _ H0 H1 etad); tea. + cbn in H4. unfold Σm. + eapply gen_transform_wellformed_decl_irrel; trea. + - eapply fresh_global_map_on_snd. + eapply EExtends.extends_wf_glob in wfg; tea. now depelim wfg. Qed. Transparent transform_blocks. -Lemma transform_blocks_eval (fl := EWcbvEval.target_wcbv_flags) : - forall Σ, isEtaExp_env Σ -> wf_glob Σ -> +Lemma transform_blocks_eval {efl : EEnvFlags} (fl := EWcbvEval.target_wcbv_flags) : + cstr_as_blocks = false -> + has_cstr_params = false -> + has_tApp -> + forall (Σ : GlobalContextMap.t), isEtaExp_env Σ -> @wf_glob efl Σ -> forall t t', - wellformed Σ 0 t -> + @wellformed efl Σ 0 t -> isEtaExp Σ t -> EWcbvEval.eval Σ t t' -> @EWcbvEval.eval block_wcbv_flags (transform_blocks_env Σ) (transform_blocks Σ t) (transform_blocks Σ t'). Proof. - intros Σ etaΣ wfΣ. + intros cstrbl haspars hasapp Σ etaΣ wfΣ. eapply - (EWcbvEvalEtaInd.eval_preserve_mkApps_ind fl eq_refl (efl := env_flags) Σ _ - (wellformed Σ) (Qpres := Qpreserves_wellformed _ wfΣ)) => //; eauto. + (EWcbvEvalEtaInd.eval_preserve_mkApps_ind fl eq_refl (efl := efl) Σ _ + (wellformed Σ) (Qpres := Qpreserves_wellformed efl _ cstrbl wfΣ)) => //; eauto. { intros. eapply EWcbvEval.eval_wellformed => //; tea. } all:intros *. - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. { cbn. rtoProp; eauto. } + eapply transform_blocks_tApp; eauto. { cbn. rtoProp; eauto. } destruct decompose_app as [fn args] eqn:heq. destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[[] args']|] => // /=. + + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; + destruct lookup_constructor_pars_args as [[[] args']|] => // /=. destruct chop eqn:eqch. intros [Hl [ha ht]]. rewrite ha in H. destruct with_constructor_as_block eqn:E. @@ -808,10 +902,11 @@ Proof. solve_discr. + econstructor; tea. - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. cbn. rtoProp; eauto. + eapply transform_blocks_tApp; eauto. cbn. rtoProp; eauto. destruct decompose_app as [fn args] eqn:heq. destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[] |] => // /=. + + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; + destruct lookup_constructor_pars_args as [[] |] => // /=. destruct n0; eauto. destruct chop eqn:eqch. intros [Hl [ha ht]]. rewrite ha in H. @@ -859,10 +954,11 @@ Proof. * eapply forallb_nth_error in H. rewrite -> H3 in H => //. * now rewrite H9. - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. - eapply transform_blocks_tApp. eauto. eauto; cbn; rtoProp; eauto. + eapply transform_blocks_tApp; eauto. eauto; cbn; rtoProp; eauto. destruct decompose_app as [ f args] eqn:heq. destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[] |] => // /=. + + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; + destruct lookup_constructor_pars_args as [[] |] => // /=. destruct n0; eauto. destruct chop eqn:eqch. intros [Hl [ha ht]]. rewrite ha in H0. @@ -885,9 +981,10 @@ Proof. * eauto. * revert e. eapply transform_blocks_tApp => //. - -- cbn. rtoProp. split; eauto. eapply wellformed_cunfold_fix; eauto. + -- cbn. rtoProp. split; eauto. split; eauto. eapply wellformed_cunfold_fix; eauto. -- destruct (decompose_app (tApp fn av)) eqn:E; eauto. destruct (construct_viewc t0) eqn:E1; eauto. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; destruct (lookup_constructor_pars_args Σ ind n) as [ [[ ]] | ] eqn:E2; eauto. cbn zeta. destruct chop eqn:E3. intros (? & ? & ?). subst. rewrite -> H7 in *. intros He. @@ -907,23 +1004,63 @@ Proof. inversion E3. subst. destruct l2; invs H15. rewrite chop_firstn_skipn in Ec. invs Ec. eapply PCUICSR.skipn_nil_length in H15. lia. - - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + - simp transform_blocks. rewrite -!transform_blocks_equation_1. + rewrite transform_blocks_mkApps //=. simp transform_blocks. rewrite -!transform_blocks_equation_1. - rewrite map_InP_spec. cbn [plus]. - eapply eval_wellformed in H2; eauto. - rewrite wellformed_mkApps in H2; eauto. - rtoProp. now cbn in H2. + rewrite !map_InP_spec. cbn [plus]. + intros. + destruct H3 as [ev wf eta etad]. + destruct H6. + move: eta; rewrite wellformed_mkApps //. + move => /andP[] wfcof wfargs. + eapply eval_cofix_case; tea. + erewrite transform_blocks_cunfold_cofix; trea. + eapply closed_cofix_subst. now eapply wellformed_closed in wfcof. + rewrite isEtaExp_mkApps_napp //= in i. move/andP: i => [] etacof etaargs. now simp_eta in etacof. + now rewrite transform_blocks_mkApps_eta_fn in e. - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + rewrite transform_blocks_mkApps //= in e0. + simp transform_blocks in e0. rewrite -!transform_blocks_equation_1 map_InP_spec in e0. simpl in e0. simp transform_blocks. rewrite -!transform_blocks_equation_1. - econstructor. + move: i; rewrite /= wellformed_mkApps //. move/and3P => [] hasp wffn wfargs. + move: i4; rewrite /= wellformed_mkApps //. move/andP => [] wfcof _. + move: i6 => /=; simp_eta. rewrite isEtaExp_mkApps_napp //=. move=> /andP[] etacof etaargs. + econstructor; tea. + erewrite transform_blocks_cunfold_cofix; trea. + eapply closed_cofix_subst. now eapply wellformed_closed in wfcof. + now simp_eta in etacof. + simp transform_blocks in e. rewrite -!transform_blocks_equation_1 in e. + now rewrite transform_blocks_mkApps_eta_fn in e. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + econstructor. eapply transform_blocks_declared_constant; eauto. destruct decl. cbn in *. now rewrite H0. eauto. + - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. + rewrite transform_blocks_mkApps //= in e0. + simp transform_blocks in e0; rewrite -!transform_blocks_equation_1 in e0. + simp transform_blocks; rewrite -!transform_blocks_equation_1. + move: i4; rewrite wellformed_mkApps // => /andP[] /= /andP[] /andP[] hasc hl; + rewrite cstrbl => _ wfargs. + destruct lookup_constructor as [[[mdecl idecl] cdecl']|] eqn:hc => //. + rewrite (constructor_isprop_pars_decl_constructor hc) in H2. noconf H2. + rewrite (lookup_constructor_pars_args_cstr_arity _ _ _ _ _ _ hc) in e0. + assert (ind_npars mdecl = 0). + { eapply wellformed_lookup_constructor_pars; tea. } + rewrite chop_all in e0. len. + simpl in e0. + eapply eval_proj_block => //; tea. cbn. + + unfold constructor_isprop_pars_decl. + rewrite lookup_constructor_transform_blocks. cbn [fst]. + rewrite hc //= H1 H6. reflexivity. + + len. + + rewrite nth_error_map /=. rewrite H6 in H2; rewrite -H2 in H4; rewrite H4; eauto. - intros; repeat match goal with [H : MCProd.and5 _ _ _ _ _ |- _] => destruct H end. eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. destruct decompose_app as [ f args] eqn:heq. destruct construct_viewc eqn:heqv. - + destruct lookup_constructor_pars_args as [[npars args']|] eqn:hl => // /=. + + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; + destruct lookup_constructor_pars_args as [[npars args']|] eqn:hl => // /=. destruct npars; eauto. destruct chop eqn:eqch. intros [Hl [ha ht]]. pose proof ev as Hev. rewrite ha in Hev. @@ -936,7 +1073,8 @@ Proof. rewrite isConstructApp_mkApps in H1. rewrite orb_true_r in H1 => //. + eapply transform_blocks_tApp; eauto. cbn; rtoProp; eauto. destruct (decompose_app (tApp f' a')). destruct (construct_viewc t0). - * destruct lookup_constructor_pars_args as [ [[]] | ] eqn:hpa; eauto. + * rewrite GlobalContextMap.lookup_constructor_pars_args_spec; + destruct lookup_constructor_pars_args as [ [[]] | ] eqn:hpa; eauto. cbn [plus]. destruct chop eqn:heqch. intros [hl [ht ha]]. rewrite ht in H1. rewrite isConstructApp_mkApps orb_true_r in H1 => //. * eapply eval_app_cong; eauto. @@ -949,6 +1087,7 @@ Proof. -- eapply transform_blocks_tApp; eauto. clear. destruct decompose_app. destruct construct_viewc; try now cbn; eauto. + rewrite GlobalContextMap.lookup_constructor_pars_args_spec; destruct lookup_constructor_pars_args as [[[]] | ]; eauto. cbn. destruct chop. cbn. intros. destruct l1 using rev_case; cbn; eauto. @@ -970,6 +1109,7 @@ Proof. destruct nth_error; try now inv Heq. destruct nth_error; invs Heq. rewrite /wf_minductive in E. rtoProp. + rewrite haspars /= in H4. cbn in H4. eapply eqb_eq in H4. unfold cstr_arity in H0. rewrite -> H4 in *. cbn in H0. diff --git a/erasure/theories/EEnvMap.v b/erasure/theories/EEnvMap.v index 6ce87c314..0e2d1951f 100644 --- a/erasure/theories/EEnvMap.v +++ b/erasure/theories/EEnvMap.v @@ -101,6 +101,17 @@ Module GlobalContextMap. rewrite lookup_constructor_spec //. Qed. + Definition lookup_constructor_pars_args Σ (ind : inductive) (c : nat) := + '(mdecl, idecl, cdecl) <- lookup_constructor Σ ind c ;; + ret (ind_npars mdecl, cstr_nargs cdecl). + + Lemma lookup_constructor_pars_args_spec Σ kn : + lookup_constructor_pars_args Σ kn = EGlobalEnv.lookup_constructor_pars_args Σ kn. + Proof. + rewrite /lookup_constructor_pars_args /EGlobalEnv.lookup_constructor_pars_args. + rewrite lookup_constructor_spec //. + Qed. + Program Definition make (g : global_declarations) (Hg : EnvMap.fresh_globals g): t := {| global_decls := g; map := EnvMap.of_global_env g |}. diff --git a/erasure/theories/EInlineProjections.v b/erasure/theories/EInlineProjections.v index e8b668a82..d03eccce8 100644 --- a/erasure/theories/EInlineProjections.v +++ b/erasure/theories/EInlineProjections.v @@ -802,9 +802,9 @@ Definition disable_projections_term_flags (et : ETermFlags) := |}. Definition disable_projections_env_flag (efl : EEnvFlags) := - {| has_axioms := true; + {| has_axioms := efl.(@has_axioms); term_switches := disable_projections_term_flags term_switches; - has_cstr_params := true ; + has_cstr_params := efl.(@has_cstr_params) ; cstr_as_blocks := efl.(@cstr_as_blocks) |}. Lemma optimize_wellformed {efl : EEnvFlags} {Σ : GlobalContextMap.t} n t : @@ -815,8 +815,6 @@ Proof. intros hbox hrel wfΣ. induction t in n |- * using EInduction.term_forall_list_ind => //. all:try solve [cbn; rtoProp; intuition auto; solve_all]. - - simpl. destruct lookup_constant => //. - move/andP => [] hasc _ => //. now rewrite hasc. - cbn -[lookup_constructor_pars_args]. intros. rtoProp. repeat split; eauto. destruct cstr_as_blocks; rtoProp; eauto. destruct lookup_constructor_pars_args as [ [] | ]; eauto. split; len. solve_all. split; eauto. @@ -847,6 +845,9 @@ Proof. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=. destruct g eqn:hg => /= //. + repeat (rtoProp; intuition auto). + destruct has_axioms => //. cbn in *. + destruct (cst_body c) => //. - rewrite lookup_env_optimize //. destruct lookup_env eqn:hl => // /=; intros; rtoProp; eauto. destruct g eqn:hg => /= //; intros; rtoProp; eauto. @@ -879,9 +880,7 @@ Proof. move: hd. destruct d => /= //. destruct (cst_body c) => /= //. - intros hwf. eapply optimize_wellformed => //. auto. - destruct efl => //. destruct m => //. cbn. unfold wf_minductive. - cbn. move/andP => [] hp //. + intros hwf. eapply optimize_wellformed => //. Qed. Lemma fresh_global_optimize_env {Σ : GlobalContextMap.t} kn : diff --git a/erasure/theories/EPretty.v b/erasure/theories/EPretty.v index 96f534226..452fde6c5 100644 --- a/erasure/theories/EPretty.v +++ b/erasure/theories/EPretty.v @@ -115,7 +115,11 @@ Module PrintTermTree. match lookup_ind_decl Σ i k with | Some oib => match nth_error oib.(ind_ctors) l with - | Some cstr => cstr.(cstr_name) ^ maybe_string_of_list string_of_term args + | Some cstr => + match args with + | [] => cstr.(cstr_name) + | args => parens (top || inapp) (cstr.(cstr_name) ^ "[" ^ print_list (print_term Γ false false) " " args ^ "]") + end | None => "UnboundConstruct(" ^ string_of_inductive ind ^ "," ^ string_of_nat l ^ ")" end diff --git a/erasure/theories/EProgram.v b/erasure/theories/EProgram.v index 77ebef9c6..57b37ea83 100644 --- a/erasure/theories/EProgram.v +++ b/erasure/theories/EProgram.v @@ -4,7 +4,7 @@ From Equations Require Import Equations. From MetaCoq.Template Require Import Transform bytestring config utils BasicAst. From MetaCoq.PCUIC Require PCUICAst PCUICAstUtils PCUICProgram. (* From MetaCoq.SafeChecker Require Import PCUICErrors PCUICWfEnvImpl. *) -From MetaCoq.Erasure Require EAstUtils EPretty EWellformed EEnvMap EWcbvEval. +From MetaCoq.Erasure Require EAstUtils EWellformed EEnvMap EWcbvEval. Import bytestring. Local Open Scope bs. diff --git a/erasure/theories/ERemoveParams.v b/erasure/theories/ERemoveParams.v index bd0d1d9ed..031af2254 100644 --- a/erasure/theories/ERemoveParams.v +++ b/erasure/theories/ERemoveParams.v @@ -810,15 +810,15 @@ Proof. - red. move=> hasapp n t args. rewrite closedn_mkApps. split; intros; rtoProp; intuition auto; solve_all. - red. move=> hascase n ci discr brs. simpl. - split; intros; rtoProp; intuition auto; solve_all. + intros; rtoProp; intuition auto; solve_all. - red. move=> hasproj n p discr. simpl. - split; intros; rtoProp; intuition auto; solve_all. + intros; rtoProp; intuition auto; solve_all. - red. move=> t args clt cll. eapply closed_substl. solve_all. now rewrite Nat.add_0_r. - red. move=> n mfix idx. cbn. intros; rtoProp; intuition auto; solve_all. - red. move=> n mfix idx. cbn. - split; intros; rtoProp; intuition auto; solve_all. + intros; rtoProp; intuition auto; solve_all. Qed. Lemma strip_eval (efl := all_env_flags) {wfl:WcbvFlags} {wcon : with_constructor_as_block = false} {Σ : GlobalContextMap.t} t v : diff --git a/erasure/theories/ETransform.v b/erasure/theories/ETransform.v index bd573a863..a77639f30 100644 --- a/erasure/theories/ETransform.v +++ b/erasure/theories/ETransform.v @@ -7,7 +7,7 @@ Set Warnings "-notation-overridden". From MetaCoq.PCUIC Require PCUICAst PCUICAstUtils PCUICProgram PCUICTransform. Set Warnings "+notation-overridden". From MetaCoq.SafeChecker Require Import PCUICErrors PCUICWfEnvImpl. -From MetaCoq.Erasure Require EAstUtils ErasureFunction ErasureCorrectness EPretty Extract EOptimizePropDiscr ERemoveParams EProgram. +From MetaCoq.Erasure Require EAstUtils ErasureFunction ErasureCorrectness Extract EOptimizePropDiscr ERemoveParams EProgram. Import PCUICAst (term) PCUICProgram PCUICTransform (eval_pcuic_program) Extract EProgram EAst Transform ERemoveParams. @@ -254,23 +254,23 @@ Qed. From MetaCoq.Erasure Require Import EConstructorsAsBlocks. -Program Definition constructors_as_blocks_transformation (efl := env_flags) - {hastrel : has_tRel} {hastbox : has_tBox} : +Program Definition constructors_as_blocks_transformation (efl : EEnvFlags) + {has_app : has_tApp} {has_pars : has_cstr_params = false} {has_cstrblocks : cstr_as_blocks = false} : Transform.t eprogram_env eprogram EAst.term EAst.term (eval_eprogram_env target_wcbv_flags) (eval_eprogram block_wcbv_flags) := {| name := "transforming to constuctors as blocks"; transform p _ := EConstructorsAsBlocks.transform_blocks_program p ; pre p := wf_eprogram_env efl p /\ EEtaExpanded.expanded_eprogram_env_cstrs p; - post p := wf_eprogram env_flags_blocks p ; + post p := wf_eprogram (switch_cstr_as_blocks efl) p ; obseq g g' v v' := v' = EConstructorsAsBlocks.transform_blocks g.1 v |}. Next Obligation. - move=> efl hastrel hastbox [Σ t] [] [wftp wft] /andP [etap etat]. + move=> efl hasapp haspars hascstrs [Σ t] [] [wftp wft] /andP [etap etat]. cbn in *. split. - eapply transform_wf_global; eauto. - - subst efl. eapply transform_wellformed; eauto. + - eapply transform_wellformed; eauto. Qed. Next Obligation. - red. move=> hastrel hastbox [Σ t] /= v [[wfe1 wfe2] wft] [ev]. + red. move=> efl hasapp haspars hascstrs [Σ t] /= v [[wfe1 wfe2] wft] [ev]. eexists. split; [ | eauto]. unfold EEtaExpanded.expanded_eprogram_env_cstrs in *. revert wft. move => /andP // [e1 e2]. diff --git a/erasure/theories/EWcbvEvalEtaInd.v b/erasure/theories/EWcbvEvalEtaInd.v index e012b48f0..5eb42ec38 100644 --- a/erasure/theories/EWcbvEvalEtaInd.v +++ b/erasure/theories/EWcbvEvalEtaInd.v @@ -50,16 +50,16 @@ Class Qpres {etfl : ETermFlags} (Q : nat -> term -> Type) := qpres : forall n t, Class Qapp {etfl : ETermFlags} (Q : nat -> term -> Type) := qapp : has_tApp -> forall n f args, Q n (mkApps f args) <~> Q n f × All (Q n) args. #[export] Hint Mode Qapp - ! : typeclass_instances. -Class Qcase {etfl : ETermFlags} (Q : nat -> term -> Type) := qcase : has_tCoFix -> has_tCase -> forall n ci discr brs, Q n (tCase ci discr brs) <~> - Q n discr × All (fun br => Q (#|br.1| + n) br.2) brs. +Class Qcase {etfl : ETermFlags} (Q : nat -> term -> Type) := qcase : has_tCase -> + forall n ci discr brs, Q n (tCase ci discr brs) -> forall discr', Q n discr' -> Q n (tCase ci discr' brs). #[export] Hint Mode Qcase - ! : typeclass_instances. -Class Qproj {etfl : ETermFlags} (Q : nat -> term -> Type) := qproj : has_tProj -> forall n p discr, Q n (tProj p discr) <~> Q n discr. +Class Qproj {etfl : ETermFlags} (Q : nat -> term -> Type) := qproj : has_tProj -> forall n p discr, Q n (tProj p discr) -> forall discr', Q n discr' -> Q n (tProj p discr'). #[export] Hint Mode Qproj - ! : typeclass_instances. Class Qfix {etfl : ETermFlags} (Q : nat -> term -> Type) := qfix : has_tFix -> forall n mfix idx, idx < #|mfix| -> Q n (tFix mfix idx) -> forall idx', idx' < #|mfix| -> Q n (tFix mfix idx'). #[export] Hint Mode Qfix - ! : typeclass_instances. -Class Qcofix {etfl : ETermFlags} (Q : nat -> term -> Type) := qcofix : has_tCoFix -> forall n mfix idx, idx < #|mfix| -> Q n (tCoFix mfix idx) <~> All (fun d => Q (#|mfix| + n) d.(dbody)) mfix. +Class Qcofix {etfl : ETermFlags} (Q : nat -> term -> Type) := qcofix : has_tCoFix -> forall n mfix idx, idx < #|mfix| -> Q n (tCoFix mfix idx) -> forall idx', idx' < #|mfix| -> Q n (tCoFix mfix idx'). #[export] Hint Mode Qcofix - ! : typeclass_instances. Class Qsubst (Q : nat -> term -> Type) := qsubst : forall t l, Q (#|l|) t -> All (Q 0) l -> Q 0 (substl l t). #[export] Hint Mode Qsubst ! : typeclass_instances. @@ -82,13 +82,14 @@ Proof. eapply IHn. lia. 2:tea. assumption. Qed. -Lemma Qcofix_subst {etfl : ETermFlags} mfix Q : has_tCoFix -> Qcofix Q -> All (λ d : def term, Q (#|mfix| + 0) (dbody d)) mfix -> All (Q 0) (cofix_subst mfix). +Lemma Qcofix_subst {etfl : ETermFlags} mfix Q : has_tCoFix -> Qcofix Q -> Qpres Q -> forall idx, idx < #|mfix| -> Q 0 (tCoFix mfix idx) -> All (Q 0) (cofix_subst mfix). Proof. - intros hasfix qfix; unfold cofix_subst. + intros hascofix qcofix qpre; unfold cofix_subst. generalize (Nat.le_refl #|mfix|). generalize #|mfix| at 1 4. induction n. intros. constructor; auto. - intros. constructor. eapply qfix => //. eapply IHn. lia. exact X. + intros. constructor. eapply qcofix => //. 2:tea. tea. + eapply IHn. lia. 2:tea. assumption. Qed. #[export] Instance Qsubst_Qfixs {etfl : ETermFlags} Q : Qpres Q -> Qfix Q -> Qsubst Q -> Qfixs Q. @@ -109,18 +110,18 @@ Qed. #[export] Instance Qsubst_Qcofixs {etfl : ETermFlags} Q : Qpres Q -> Qcofix Q -> Qsubst Q -> Qcofixs Q. Proof. - move=> qpres qfix; rewrite /Qsubst /Qcofixs. + move=> qpres qfix; rewrite /Qsubst /Qfixs. intros Hs mfix idx hfix args fn. - assert (hastcofix : has_tCoFix). + assert (hasfix : has_tCoFix). { eapply qpres in hfix. now depelim hfix. } rewrite /cunfold_cofix. - eapply qpres in hfix. depelim hfix => //. destruct nth_error eqn:hnth => //. - eapply nth_error_all in hnth; tea. cbn in hnth. - rewrite Nat.add_0_r in hnth. + pose proof (nth_error_Some_length hnth). + epose proof (Qcofix_subst _ _ hasfix qfix qpres idx H hfix). intros [= <-]. subst fn. eapply Hs. rewrite cofix_subst_length //. - now apply Qcofix_subst. + eapply qpres in hfix. depelim hfix. depelim i0. eapply nth_error_all in a; tea. now rewrite Nat.add_0_r in a. + assumption. Qed. Class Qconst Σ (Q : nat -> term -> Type) := qconst : @@ -517,11 +518,9 @@ Proof. iheta qa. - simp_eta. move=> /andP[etad etabrs]. assert (qa : Q 0 (tCase ip (mkApps fn args) brs)). - { pose proof (ev1' := ev1). eapply P'Q in ev1' => //. + { eapply qcase; tea => //. + pose proof (ev1' := ev1). eapply P'Q in ev1' => //. eapply qapp in ev1' as [hfix qargs] => //. - unshelve eapply (qcase _ _ _ _ _ _).2 => //. - { now eapply qpres in hfix; depelim hfix. } auto. - split => //. eapply qapp => //. split => //. eapply (qcofixs mfix idx) in hfix; tea. clear ev1'; ih. } @@ -543,7 +542,7 @@ Proof. assert (qa : Q 0 (tProj p (mkApps fn args))). { pose proof (ev1' := ev1). eapply P'Q in ev1' => //. eapply qapp in ev1' as [hfix ?] => //. - eapply qproj => //. eapply qapp => //. split => //. + eapply qproj; tea => //. eapply qapp => //. split => //. eapply (qcofixs mfix idx) in hfix; tea. clear ev1'; ih. } assert (etafn : isEtaExp Σ fn && forallb (isEtaExp Σ) args). @@ -704,32 +703,40 @@ Definition env_flags := |}. From MetaCoq.Erasure Require Import ELiftSubst. -Lemma Qpreserves_wellformed (efl := env_flags) Σ : wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. +Lemma Qpreserves_wellformed (efl : EEnvFlags) Σ : + cstr_as_blocks = false -> + wf_glob Σ -> Qpreserves (fun n x => wellformed Σ n x) Σ. Proof. - intros clΣ. + intros cstbl clΣ. split. - red. move=> n t. - destruct t; cbn; intuition auto; try solve [constructor; auto]. + destruct t; cbn [wellformed]; rtoProp; intuition auto; try solve [constructor; auto]. + all:cbn; rtoProp; intuition auto. + constructor; cbn => //. + eapply on_evar; auto. solve_all. + eapply on_lambda; auto. eapply on_letin; rtoProp; intuition auto. eapply on_app; rtoProp; intuition auto. + constructor; cbn; auto. rewrite cstbl in H0. + destruct l => //. constructor => //. eapply on_case; rtoProp; intuition auto. ELiftSubst.solve_all. - eapply on_fix. eauto. move/andP: H => [] isl /andP[] _ wf. ELiftSubst.solve_all. + eapply on_proj; auto. + eapply on_fix; eauto. move/andP: H0 => [] _ wf. solve_all. + eapply on_cofix; eauto. move/andP: H0 => [] _ wf. solve_all. - red. intros kn decl. move/(lookup_env_wellformed clΣ). unfold wf_global_decl. destruct cst_body => //. - red. move=> hasapp n t args. rewrite wellformed_mkApps //. split; intros; rtoProp; intuition auto; solve_all. - - red. cbn => //. - (* move=> hascase n ci discr brs. simpl. - destruct lookup_inductive eqn:hl => /= //. - split; intros; rtoProp; intuition auto; solve_all. *) - - red. now move=> hasproj n p discr. + - red. intros. simpl in H0. simpl. rtoProp; intuition auto. + - red. move=> hasproj n p discr. simpl; rtoProp; intuition auto. + rtoProp; intuition auto. - red. move=> t args clt cll. eapply wellformed_substl. solve_all. now rewrite Nat.add_0_r. - red. move=> n mfix idx. cbn. unfold EWellformed.wf_fix. intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. - - red. move=> n mfix idx. cbn. - split; intros; rtoProp; intuition auto; solve_all. + - red. move=> n mfix idx. cbn. unfold EWellformed.wf_fix. + intros; rtoProp; intuition auto; solve_all. now apply Nat.ltb_lt. Qed. Ltac destruct_nary_times := @@ -750,7 +757,7 @@ Proof. intros hcon etaΣ wfΣ wf ev eta. revert a a' wf eta ev. eapply (eval_preserve_mkApps_ind (efl:=env_flags) fl hcon Σ (fun _ x => isEtaExp Σ x) (fun n t => wellformed Σ n t) - (Qpres := Qpreserves_wellformed Σ wfΣ)) => //. + (Qpres := Qpreserves_wellformed env_flags Σ eq_refl wfΣ)) => //. all:intros; repeat destruct_nary_times. all:intuition auto. - eapply eval_wellformed; tea => //. diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index 3349efccc..5245c80cb 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -30,7 +30,7 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf Transform.t TemplateProgram.template_program EProgram.eprogram Ast.term EAst.term TemplateProgram.eval_template_program - (EProgram.eval_eprogram {| with_prop_case := false; with_guarded_fix := false |}) := + (EProgram.eval_eprogram {| with_prop_case := false; with_guarded_fix := false; with_constructor_as_block := true |}) := (* Casts are removed, application is binary, case annotations are inferred from the global environment *) template_to_pcuic_transform ▷ (* Branches of cases are expanded to bind only variables, constructor types are expanded accordingly *) @@ -50,11 +50,18 @@ Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellf (* Rebuild the efficient lookup table *) rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ (* Inline projections to cases *) - inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). + inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + let efl := EInlineProjections.disable_projections_env_flag (ERemoveParams.switch_no_params EWellformed.all_env_flags) in + (* Rebuild the efficient lookup table *) + rebuild_wf_env_transform (efl := efl) ▷ + (* First-order constructor representation *) + constructors_as_blocks_transformation efl (has_app := eq_refl) (has_pars := eq_refl) (has_cstrblocks := eq_refl). + (* At the end of erasure we get a well-formed program (well-scoped globally and localy), without - parameters in inductive declarations. The constructor applications are also expanded, and - the evaluation relation does not need to consider guarded fixpoints or case analyses on propositional - content. All fixpoint bodies start with a lambda as well. *) + parameters in inductive declarations. The constructor applications are also transformed to a first-order + "block" application, of the right length, and the evaluation relation does not need to consider guarded + fixpoints or case analyses on propositional content. All fixpoint bodies start with a lambda as well. + Finally, projections are inlined to cases, so no `tProj` remains. *) Import EGlobalEnv EWellformed. @@ -72,7 +79,12 @@ Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := E guarded_to_unguarded_fix (wcon := eq_refl) eq_refl ▷ remove_params_fast_optimization (wcon := eq_refl) _ ▷ rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ - optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl). + optimize_prop_discr_optimization (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + rebuild_wf_env_transform (efl := ERemoveParams.switch_no_params EWellformed.all_env_flags) ▷ + inline_projections_optimization (fl := EWcbvEval.target_wcbv_flags) (wcon := eq_refl) (hastrel := eq_refl) (hastbox := eq_refl) ▷ + let efl := EInlineProjections.disable_projections_env_flag (ERemoveParams.switch_no_params EWellformed.all_env_flags) in + rebuild_wf_env_transform (efl := efl) ▷ + constructors_as_blocks_transformation efl (has_app := eq_refl) (has_pars := eq_refl) (has_cstrblocks := eq_refl). Next Obligation. destruct H; split => //. now eapply ETransform.expanded_eprogram_env_expanded_eprogram_cstrs. Qed. From 836ec66de8fc9c7d52b8dfb5e27521a43b6576bf Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Wed, 13 Jul 2022 11:28:47 +0200 Subject: [PATCH 22/43] Use efficient maps in eta-expansion phase (#738) * Use efficient maps in eta-expansion phase * Refactor transformations for easier composition of phases in template * Fix string_of_uint and string_of_positive defs The new versions are much more performant --- erasure/_PluginProject.in | 4 - erasure/src/g_metacoq_erasure.mlg | 5 +- erasure/src/metacoq_erasure_plugin.mlpack | 2 - erasure/theories/Erasure.v | 65 ++- pcuic/theories/TemplateToPCUICCorrectness.v | 2 +- safechecker/_PluginProject.in | 2 - .../src/metacoq_safechecker_plugin.mlpack | 1 - template-coq/_CoqProject | 1 + template-coq/_PluginProject | 7 +- .../gen-src/metacoq_template_plugin.mlpack | 2 + template-coq/theories/EtaExpand.v | 460 ++++++++++++------ template-coq/theories/TemplateCheckWf.v | 8 +- template-coq/theories/TemplateEnvMap.v | 85 ++++ template-coq/theories/TemplateProgram.v | 37 +- template-coq/theories/utils/MCString.v | 24 +- 15 files changed, 490 insertions(+), 215 deletions(-) create mode 100644 template-coq/theories/TemplateEnvMap.v diff --git a/erasure/_PluginProject.in b/erasure/_PluginProject.in index 54d6a30ae..61e43f45d 100644 --- a/erasure/_PluginProject.in +++ b/erasure/_PluginProject.in @@ -16,12 +16,8 @@ src/uGraph0.ml src/uGraph0.mli src/wGraph.ml src/wGraph.mli -src/envMap.mli -src/envMap.ml src/mCProd.mli src/mCProd.ml -src/transform.mli -src/transform.ml src/etaExpand.mli src/etaExpand.ml diff --git a/erasure/src/g_metacoq_erasure.mlg b/erasure/src/g_metacoq_erasure.mlg index b6b54660f..ec68dd9a6 100644 --- a/erasure/src/g_metacoq_erasure.mlg +++ b/erasure/src/g_metacoq_erasure.mlg @@ -28,10 +28,9 @@ let pr_char_list l = let check ~bypass ~fast env evm c = debug (fun () -> str"Quoting"); let term = time (str"Quoting") (Ast_quoter.quote_term_rec ~bypass env) (EConstr.to_constr evm c) in - let checker_flags = Config0.extraction_checker_flags in let erase = time (str"Erasure") - (if fast then Erasure.erase_fast_and_print_template_program checker_flags - else Erasure.erase_and_print_template_program checker_flags) + (if fast then Erasure.erase_fast_and_print_template_program + else Erasure.erase_and_print_template_program) term in Feedback.msg_info (pr_char_list erase) diff --git a/erasure/src/metacoq_erasure_plugin.mlpack b/erasure/src/metacoq_erasure_plugin.mlpack index 3faebea5a..60291b105 100644 --- a/erasure/src/metacoq_erasure_plugin.mlpack +++ b/erasure/src/metacoq_erasure_plugin.mlpack @@ -6,9 +6,7 @@ Utils WGraph UGraph0 -EnvMap MCProd -Transform EtaExpand WcbvEval diff --git a/erasure/theories/Erasure.v b/erasure/theories/Erasure.v index 5245c80cb..2def86091 100644 --- a/erasure/theories/Erasure.v +++ b/erasure/theories/Erasure.v @@ -1,6 +1,6 @@ (* Distributed under the terms of the MIT license. *) From Coq Require Import Program ssreflect ssrbool. -From MetaCoq.Template Require Import Transform bytestring config utils EtaExpand. +From MetaCoq.Template Require Import Transform bytestring config utils EtaExpand TemplateProgram. From MetaCoq.PCUIC Require PCUICAst PCUICAstUtils PCUICProgram. From MetaCoq.SafeChecker Require Import PCUICErrors PCUICWfEnvImpl. From MetaCoq.Erasure Require EAstUtils ErasureFunction ErasureCorrectness EPretty Extract. @@ -26,11 +26,40 @@ Obligation Tactic := program_simpl. Import EWcbvEval. +Axiom assume_welltyped_template_program_expansion : + forall p (wtp : ∥ wt_template_program_env p ∥), + let p' := EtaExpand.eta_expand_program p in + ∥ wt_template_program p' ∥ /\ EtaExpand.expanded_program p'. + +Axiom assume_preservation_template_program_env_expansion : + forall p (wtp : ∥ wt_template_program_env p ∥) v, + eval_template_program_env p v -> + ∥ eval_template_program (EtaExpand.eta_expand_program p) (EtaExpand.eta_expand p.1 [] v) ∥. + +Program Definition eta_expand : Transform.t template_program_env template_program Ast.term Ast.term + eval_template_program_env eval_template_program := + {| name := "eta expand cstrs and fixpoints"; + pre := fun p => ∥ wt_template_program_env p ∥ ; + transform p _ := EtaExpand.eta_expand_program p ; + post := fun p => ∥ wt_template_program p ∥ /\ EtaExpand.expanded_program p; + obseq p p' v v' := v' = EtaExpand.eta_expand p.1 [] v |}. +Next Obligation. + destruct p. now apply assume_welltyped_template_program_expansion. +Qed. +Next Obligation. + red. intros p v [wt] ev. + apply assume_preservation_template_program_env_expansion in ev as [ev']; eauto. +Qed. + Program Definition erasure_pipeline {guard : abstract_guard_impl} (efl := EWellformed.all_env_flags) : Transform.t TemplateProgram.template_program EProgram.eprogram Ast.term EAst.term TemplateProgram.eval_template_program (EProgram.eval_eprogram {| with_prop_case := false; with_guarded_fix := false; with_constructor_as_block := true |}) := + (* Build an efficient lookup map for the following eta-expansion phase *) + build_template_program_env ▷ + (* Eta-expand constructors and fixpoint *) + eta_expand ▷ (* Casts are removed, application is binary, case annotations are inferred from the global environment *) template_to_pcuic_transform ▷ (* Branches of cases are expanded to bind only variables, constructor types are expanded accordingly *) @@ -73,6 +102,8 @@ Qed. Definition run_erase_program {guard : abstract_guard_impl} := run erasure_pipeline. Program Definition erasure_pipeline_fast {guard : abstract_guard_impl} (efl := EWellformed.all_env_flags) := + build_template_program_env ▷ + eta_expand ▷ template_to_pcuic_transform ▷ pcuic_expand_lets_transform ▷ erase_transform ▷ @@ -114,38 +145,18 @@ Next Obligation. apply fake_guard_impl_properties. Qed. Axiom assume_that_we_only_erase_on_welltyped_programs : forall {cf : checker_flags}, forall (p : Ast.Env.program), squash (TemplateProgram.wt_template_program p). -Program Definition erase_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) +Program Definition erase_and_print_template_program (p : Ast.Env.program) : string := - let p' := run_erase_program (eta_expand_program p) _ in + let p' := run_erase_program p _ in time "Pretty printing" EPretty.print_program p'. Next Obligation. - assert (ht : ∥ TemplateProgram.wt_template_program p ∥) by eapply assume_that_we_only_erase_on_welltyped_programs. - split; auto. - apply assume_that_we_only_erase_on_welltyped_programs. - red. - destruct ht as [[wfext [T ht]]]. - split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. eapply wfext. - eapply EtaExpand.expanded_env_irrel. - epose proof (EtaExpand.eta_expand_expanded (Σ := Ast.Env.empty_ext p.1) [] [] p.2 T). - forward H. apply wfext. specialize (H ht). - forward H by constructor. cbn in H. - destruct p as [ [] ]; cbn in *. exact H. + now eapply assume_that_we_only_erase_on_welltyped_programs. Qed. -Program Definition erase_fast_and_print_template_program {cf : checker_flags} (p : Ast.Env.program) +Program Definition erase_fast_and_print_template_program (p : Ast.Env.program) : string := - let p' := run_erase_program_fast (eta_expand_program p) _ in + let p' := run_erase_program_fast p _ in time "pretty-printing" EPretty.print_program p'. Next Obligation. - assert (ht : ∥ TemplateProgram.wt_template_program p ∥) by eapply assume_that_we_only_erase_on_welltyped_programs. - split; auto. - apply assume_that_we_only_erase_on_welltyped_programs. - red. - destruct ht as [[wfext [T ht]]]. - split; cbn. eapply EtaExpand.eta_expand_global_env_expanded. eapply wfext. - eapply EtaExpand.expanded_env_irrel. - epose proof (EtaExpand.eta_expand_expanded (Σ := Ast.Env.empty_ext p.1) [] [] p.2 T). - forward H. apply wfext. specialize (H ht). - forward H by constructor. cbn in H. - destruct p as [ [] ]; cbn in *. exact H. + now eapply assume_that_we_only_erase_on_welltyped_programs. Qed. \ No newline at end of file diff --git a/pcuic/theories/TemplateToPCUICCorrectness.v b/pcuic/theories/TemplateToPCUICCorrectness.v index 892874926..afc0ad02e 100644 --- a/pcuic/theories/TemplateToPCUICCorrectness.v +++ b/pcuic/theories/TemplateToPCUICCorrectness.v @@ -92,7 +92,7 @@ Lemma trans_lookup_minductive {cf} {Σ : global_env_map} mind : wf Σ -> Proof. intros wf. unfold TransLookup.lookup_minductive. - rewrite (EnvMap .lookup_spec Σ.(declarations)) //. + rewrite (EnvMap.lookup_spec Σ.(declarations)) //. now eapply wf_fresh_globals. apply Σ. Qed. diff --git a/safechecker/_PluginProject.in b/safechecker/_PluginProject.in index fa2d6a61a..163ffab7f 100644 --- a/safechecker/_PluginProject.in +++ b/safechecker/_PluginProject.in @@ -14,8 +14,6 @@ src/uGraph0.ml src/uGraph0.mli src/wGraph.ml src/wGraph.mli -src/envMap.mli -src/envMap.ml src/mCProd.mli src/mCProd.ml diff --git a/safechecker/src/metacoq_safechecker_plugin.mlpack b/safechecker/src/metacoq_safechecker_plugin.mlpack index 50582b0b6..064dbca55 100644 --- a/safechecker/src/metacoq_safechecker_plugin.mlpack +++ b/safechecker/src/metacoq_safechecker_plugin.mlpack @@ -3,7 +3,6 @@ Ssrbool Ssreflect WGraph UGraph0 -EnvMap Reflect MCProd diff --git a/template-coq/_CoqProject b/template-coq/_CoqProject index ccdcaf68c..694beb1ee 100644 --- a/template-coq/_CoqProject +++ b/template-coq/_CoqProject @@ -48,6 +48,7 @@ theories/AstUtils.v theories/Reflect.v theories/ReflectAst.v theories/EnvMap.v +theories/TemplateEnvMap.v theories/Induction.v theories/EnvironmentTyping.v theories/WfAst.v diff --git a/template-coq/_PluginProject b/template-coq/_PluginProject index e0b2967b6..df3d2e6a3 100644 --- a/template-coq/_PluginProject +++ b/template-coq/_PluginProject @@ -198,9 +198,14 @@ gen-src/kernames.mli gen-src/kernames.ml gen-src/universes0.ml gen-src/universes0.mli - +gen-src/transform.mli +gen-src/transform.ml gen-src/termEquality.mli gen-src/termEquality.ml +gen-src/envMap.mli +gen-src/envMap.ml +gen-src/templateEnvMap.mli +gen-src/templateEnvMap.ml gen-src/typing0.mli gen-src/typing0.ml gen-src/templateProgram.mli diff --git a/template-coq/gen-src/metacoq_template_plugin.mlpack b/template-coq/gen-src/metacoq_template_plugin.mlpack index 95a8f5e8f..c7713b4d3 100644 --- a/template-coq/gen-src/metacoq_template_plugin.mlpack +++ b/template-coq/gen-src/metacoq_template_plugin.mlpack @@ -91,6 +91,7 @@ Pretty Common0 Extractable Logic0 +EnvMap Tm_util Reification @@ -102,6 +103,7 @@ Plugin_core Run_extractable Transform +TemplateEnvMap TermEquality Typing0 EtaExpand diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index e4267fb2c..592da4c75 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -18,7 +18,9 @@ From MetaCoq.Template Require Export LiftSubst (* Lifting and substitution for terms *) UnivSubst (* Substitution of universe instances *) Typing (* Typing judgment *) - config (* Typing configuration *). + config (* Typing configuration *) + TemplateEnvMap (* Efficient lookup table *) + TemplateProgram. Open Scope nat. @@ -28,7 +30,7 @@ Import Template.Ast. Import ListNotations. Section Eta. - Context (Σ : global_declarations). + Context (Σ : GlobalEnvMap.t). (* Fixpoint remove_top_prod (t : Ast.term) (n : nat) := @@ -59,20 +61,12 @@ Section Eta. fold_right (fun d b => Ast.tLambda d.(decl_name) d.(decl_type) b) (mkApps (lift0 needed t) (prev_args ++ eta_args)) remaining_subst. Definition eta_constructor (ind : inductive) c u args := - match lookup_global Σ ind.(inductive_mind) with - | Some (InductiveDecl mind) => - match nth_error mind.(ind_bodies) ind.(inductive_ind) with - | Some idecl => - match nth_error idecl.(ind_ctors) c with - | Some cdecl => - let ty := (type_of_constructor mind cdecl (ind, c) u) in - let n := (ind_npars mind + context_assumptions (cstr_args cdecl)) in - Some (eta_single (Ast.tConstruct ind c u) args ty n) - | _ => None - end - | _ => None - end - | _ => None + match GlobalEnvMap.lookup_constructor Σ ind c with + | Some (mdecl, idecl, cdecl) => + let ty := (type_of_constructor mdecl cdecl (ind, c) u) in + let n := (ind_npars mdecl + context_assumptions (cstr_args cdecl)) in + Some (eta_single (Ast.tConstruct ind c u) args ty n) + | _ => None end. Definition eta_fixpoint (def : mfixpoint term) (i : nat) d (args : list term) := @@ -209,21 +203,22 @@ Definition eta_minductive_decl Σ mdecl := ind_universes := mdecl.(ind_universes); ind_variance := mdecl.(ind_variance); |}. -Definition eta_global_declaration (Σ : global_declarations) decl : global_decl := +Definition eta_global_declaration (Σ : GlobalEnvMap.t) decl : global_decl := match decl with | ConstantDecl cb => ConstantDecl (eta_global_decl Σ cb) | InductiveDecl idecl => InductiveDecl (eta_minductive_decl Σ idecl) end. -Fixpoint eta_global_declarations (Σ : global_declarations) := - match Σ with - | [] => [] - | (kn, decl) :: Σ => (kn, eta_global_declaration Σ decl) :: eta_global_declarations Σ - end. +Definition eta_global_declarations (Σ : GlobalEnvMap.t) (decls : global_declarations) := + map (on_snd (eta_global_declaration Σ)) decls. -Definition eta_expand_global_env (Σ : global_env) := - {| universes := Σ.(universes); declarations := eta_global_declarations Σ.(declarations) |}. +Definition eta_expand_global_env (Σ : GlobalEnvMap.t) : global_env := + {| universes := Σ.(universes); declarations := eta_global_declarations Σ Σ.(declarations) |}. +Definition eta_expand_program (p : template_program_env) : Ast.Env.program := + let Σ' := eta_expand_global_env p.1 in + (Σ', eta_expand p.1 [] p.2). + (* Inductive tree := T : list tree -> tree. Fixpoint tmap (f : tree -> tree) (t : tree) := match t with T l => T (map (tmap f) l) end. @@ -421,10 +416,6 @@ Definition expanded_global_env (g : Ast.Env.global_env) := Definition expanded_program (p : Ast.Env.program) := expanded_global_env p.1 /\ expanded p.1 [] p.2. -Definition eta_expand_program (p : Ast.Env.program) : Ast.Env.program := - let Σ' := eta_expand_global_env p.1 in - (Σ', eta_expand p.1.(declarations) [] p.2). - Definition isFix_app t := match fst (decompose_app t) with | tFix _ _ => true @@ -923,23 +914,60 @@ Proof. rewrite IHt2. cbn; lia. - rewrite IHt3. cbn. lia. *) +Import EnvMap. + +Definition repr_decls Σg Σ := + forall kn d, lookup_global Σ.(declarations) kn = Some d -> GlobalEnvMap.lookup_env Σg kn = Some d. +Import ssreflect. + +Lemma repr_lookup_constructor {Σg Σ} : + repr_decls Σg Σ -> + forall ind idx r, lookup_constructor Σ ind idx = Some r -> GlobalEnvMap.lookup_constructor Σg ind idx = Some r. +Proof. + intros hrepr ind idx r. + rewrite /lookup_constructor /lookup_inductive /lookup_minductive /lookup_env. + destruct lookup_global eqn:hl => //. + apply hrepr in hl. + rewrite /GlobalEnvMap.lookup_constructor /GlobalEnvMap.lookup_inductive /GlobalEnvMap.lookup_minductive hl //. +Qed. + +Import bytestring.String. + +Local Open Scope bs. + +Lemma constructor_declared {cf : checker_flags} {Σ Γ ind idx u ty} : + Σ ;;; Γ |- tConstruct ind idx u : ty -> + exists r, lookup_constructor Σ ind idx = Some r. +Proof. + intros H; depind H; eauto. + eexists. eapply declared_constructor_lookup in isdecl; tea. +Qed. Lemma eta_expand_expanded {cf : config.checker_flags} {Σ : global_env_ext} Γ Γ' t T : wf Σ -> typing Σ Γ t T -> Forall2 (fun x y => match x with Some (n, t) => y.(decl_type) = t /\ context_assumptions (decompose_prod_assum [] y.(decl_type)).1 >= n | None => True end) Γ' Γ -> - expanded Σ (map (fun x => match x with Some (n, _) => n | None => 0 end ) Γ') (eta_expand Σ.1.(declarations) Γ' t). + forall Σg : GlobalEnvMap.t, repr_decls Σg Σ.1 -> + expanded Σ (map (fun x => match x with Some (n, _) => n | None => 0 end ) Γ') (eta_expand Σg Γ' t). Proof. intros wf Hty. revert Γ'. - eapply @typing_ind_env with (t := t) (Σ := Σ) (P := fun Σ Γ t T => forall Γ', Forall2 (fun (x : option (nat × term)) (y : context_decl) => match x with - | Some (_, t0) => decl_type y = t0 /\ _ - | None => True - end) Γ' Γ -> - expanded Σ (map (fun x : option (nat × term) => match x with - | Some (n, _) => n - | None => 0 - end) Γ') (eta_expand (declarations Σ) Γ' t) - ) (PΓ := fun _ _ _ => True); intros; try now (cbn; eauto). + eapply @typing_ind_env with (t := t) (Σ := Σ) + (P := fun (Σ : global_env_ext) Γ t T => forall Γ', Forall2 (fun (x : option (nat × term)) (y : context_decl) => + match x with + | Some (_, t0) => decl_type y = t0 /\ _ + | None => True + end) Γ' Γ -> + forall Σg, repr_decls Σg Σ.1 -> + expanded Σ (map (fun x : option (nat × term) => + match x with + | Some (n, _) => n + | None => 0 + end) Γ') (eta_expand Σg Γ' t)) + (PΓ := fun _ _ _ => True); + repeat match goal with + | [ |- repr_decls _ _ -> _ ] => intros hrepr + | _ => intro + end; try now (cbn; eauto). - cbn. eapply Forall2_nth_error_Some_r in H1 as (? & ? & ?); eauto. rewrite H1. destruct x as [[] | ]. @@ -947,26 +975,26 @@ Proof. eapply expanded_fold_lambda. rewrite !Nat.sub_0_r. len. rewrite firstn_length. len. destruct n0. - * cbn. econstructor. now rewrite nth_error_map, H1. - * rewrite seq_S,rev_map_spec, map_app, rev_app_distr. subst. + * cbn. econstructor. now rewrite nth_error_map H1. + * rewrite seq_S rev_map_spec map_app rev_app_distr. subst. rewrite <- context_assumptions_lift, !Nat.min_l; try lia. econstructor. - -- rewrite nth_error_app2. 2: rewrite repeat_length; lia. - rewrite repeat_length. replace (S n0 + n - S n0) with n by lia. - now rewrite nth_error_map, H1. + -- rewrite nth_error_app2 repeat_length; try lia. + replace (S n0 + n - S n0) with n by lia. + now rewrite nth_error_map H1. -- len. now rewrite seq_length. -- eapply Forall_forall. intros x [ | (? & <- & [_ ?] % in_seq) % in_rev % in_map_iff]; subst. - all: econstructor; rewrite nth_error_app1; [eapply nth_error_repeat; lia | rewrite repeat_length; lia]. - + econstructor. now rewrite nth_error_map, H1. - - cbn. econstructor. eapply (H1 (up Γ')); econstructor; eauto. - - cbn. econstructor. eauto. eapply (H2 (up Γ')); econstructor; eauto. + all: econstructor; rewrite nth_error_app1; revgoals; [eapply nth_error_repeat; lia | rewrite repeat_length; lia]. + + econstructor. now rewrite nth_error_map H1. + - cbn. econstructor. eapply (H1 (up Γ')); tea; econstructor; eauto. + - cbn. econstructor. eauto. eapply (H2 (up Γ')); tea; econstructor; eauto. - specialize (H _ H2). assert (Forall(fun t : term => expanded Σ0 (map (fun x : option (nat × term) => match x with | Some p => let (n, _) := p in n | None => 0 - end) Γ') (eta_expand Σ0.(declarations) Γ' t)) l). { + end) Γ') (eta_expand Σg Γ' t)) l). { clear H1. clear X. induction X0; econstructor; eauto. } destruct t0; cbn. all: try now eapply expanded_mkApps; [ eauto | solve_all ]. @@ -980,15 +1008,15 @@ Proof. destruct H4. rewrite <- context_assumptions_lift. subst. lia. cbn. eapply expanded_mkApps. constructor. - now rewrite nth_error_map, E; cbn. + now rewrite nth_error_map E; cbn. solve_all. + cbn in H. unfold eta_constructor in *. - destruct lookup_global as [[] | ] eqn:E1; eauto. - destruct nth_error eqn:E2; eauto. - destruct (nth_error (ind_ctors o) idx) eqn:E3; eauto. + specialize (H Σg hrepr). + rewrite GlobalEnvMap.lookup_constructor_spec in H |- *. + destruct lookup_constructor as [[[mdecl idecl] cdecl]| ] eqn:E1; eauto. unfold eta_single in H. eapply expanded_fold_lambda. rewrite Nat.sub_0_r in H. - unfold mkApps in H. destruct (ind_npars m + context_assumptions (cstr_args c)) eqn:EE. + unfold mkApps in H. destruct (ind_npars mdecl + context_assumptions (cstr_args cdecl)) eqn:EE. * cbn in H. inversion H; subst. cbn. simpl_list. destruct l. -- cbn. econstructor; eauto. @@ -996,37 +1024,41 @@ Proof. rewrite lift0_id. setoid_rewrite map_ext. 3: eapply lift0_p. rewrite map_id. eapply Forall_typing_spine_Forall in X0. rewrite <- map_cons. revert X0. generalize (t0 :: l). intros l' X0. - solve_all. eapply H4. solve_all. reflexivity. - * eapply expanded_mkApps_tConstruct. split. split. red. all: eauto. + solve_all. eapply H4; auto. solve_all. reflexivity. + * eapply constructor_declared in X as [[[mdecl' idecl'] cdecl'] hc]. + have h := (repr_lookup_constructor hrepr _ _ _ hc). rewrite GlobalEnvMap.lookup_constructor_spec in h. + rewrite E1 in h. noconf h. + eapply expanded_mkApps_tConstruct. now eapply lookup_constructor_declared. rewrite rev_map_spec. simpl_list. rewrite EE. lia. eapply Forall_typing_spine_Forall in X0. assert ((context_assumptions - (decompose_prod_assum [] (type_of_constructor m c (ind, idx) u)).1) = ind_npars m + context_assumptions (cstr_args c)) as E. { + (decompose_prod_assum [] (type_of_constructor mdecl cdecl (ind, idx) u)).1) = ind_npars mdecl + context_assumptions (cstr_args cdecl)) as E. { eapply decompose_type_of_constructor; eauto. - split. split. red. all: eauto. } + now eapply lookup_constructor_declared. } eapply app_Forall. -- Opaque minus. solve_all. eapply @expanded_lift' with (Γ' := []). 2: reflexivity. reflexivity. 2: reflexivity. len. - { rewrite !firstn_length, !List.skipn_length. len. - rewrite E, EE. lia. + { rewrite !firstn_length !List.skipn_length. len. + rewrite E EE. lia. } cbn. eauto. -- rewrite rev_map_spec. eapply Forall_rev. eapply Forall_forall. intros ? (? & <- & ?) % in_map_iff. econstructor. eapply in_seq in H4 as [_ H4]. - len. rewrite nth_error_app1. 2: len. - eapply nth_error_repeat. cbn in *. - rewrite !firstn_length, !List.skipn_length. len. rewrite E, EE. + len. rewrite nth_error_app1; len. + rewrite !firstn_length !List.skipn_length. len. rewrite E EE. rewrite map_length in H4. lia. - rewrite !firstn_length, !List.skipn_length. len. rewrite E, EE. + eapply nth_error_repeat. cbn in *. + rewrite !firstn_length !List.skipn_length. len. rewrite E EE. rewrite map_length in H4. lia. - + cbn in H. unfold eta_fixpoint in *. + + specialize (H _ hrepr). + cbn in H. unfold eta_fixpoint in *. rewrite nth_error_map in H |- *. destruct (nth_error mfix idx) eqn:Eid; eauto. cbn in *. eapply expanded_fold_lambda. eapply expanded_mkApps_tFix; fold lift. - 2:{rewrite !nth_error_map, Eid. reflexivity. } + 2:{ rewrite !nth_error_map Eid. cbn. len. reflexivity. } ++ cbn. rewrite <- context_assumptions_lift. eapply wf_fixpoint_rarg; eauto. 2: eapply nth_error_In; eauto. clear - X. depind X; eauto. @@ -1059,12 +1091,12 @@ Proof. f_equal. rewrite !mapi_map. now eapply mapi_ext. } eapply expanded_unlift with (Γ'' := repeat 0 #|l|). 2: now rewrite <- app_assoc. - rewrite simpl_lift. 2:{ len. rewrite !firstn_length, !List.skipn_length. lia. } + rewrite -> simpl_lift. 2:{ len. rewrite !firstn_length !List.skipn_length. lia. } 2:{ len. lia. } eapply apply_expanded. eauto. simpl_list. f_equal. f_equal. ** rewrite !mapi_map. now eapply mapi_ext. - ** rewrite !firstn_length, !List.skipn_length. + ** rewrite !firstn_length !List.skipn_length. rewrite app_assoc. f_equal. rewrite <- repeat_app. f_equal. len. destruct context_assumptions; @@ -1072,15 +1104,15 @@ Proof. ** f_equal. len. lia. ++ eapply Forall_typing_spine_Forall in X0. eapply app_Forall. ** solve_all. eapply @expanded_lift' with (Γ' := []). all: try now reflexivity. 2: eauto. - len. rewrite !firstn_length, !List.skipn_length. + len. rewrite !firstn_length !List.skipn_length. eapply typing_wf_fixpoint in X. eapply wf_fixpoint_rarg in X. 2: eauto. 2: eapply nth_error_In; eauto. len. lia. ** rewrite rev_map_spec. eapply Forall_rev. eapply Forall_forall. intros ? (? & <- & ?) % in_map_iff. econstructor. eapply in_seq in H4 as [_ H4]. autorewrite with len in H4 |- *. - rewrite !firstn_length, !List.skipn_length. - rewrite nth_error_app1. eapply nth_error_repeat. + rewrite !firstn_length !List.skipn_length. + rewrite -> nth_error_app1. eapply nth_error_repeat. -- len. eapply Nat.lt_le_trans. eauto. cbn. eapply typing_wf_fixpoint in X. @@ -1093,36 +1125,38 @@ Proof. lia. ++ destruct l; cbn in *; try congruence. ++ cbn. eauto. - - cbn. pose proof isdecl as isdecl'. destruct isdecl as [[]]. red in H2. - unfold lookup_env in H2. - unfold eta_constructor. unfold fst_ctx in *. cbn in *. rewrite H2, H3, H4. + - cbn. pose proof isdecl as isdecl'. + unfold eta_constructor. + eapply declared_constructor_lookup in isdecl'. + eapply (repr_lookup_constructor hrepr) in isdecl'. rewrite isdecl'. + rewrite GlobalEnvMap.lookup_constructor_spec in isdecl'. eapply expanded_fold_lambda. rewrite Nat.sub_0_r. eapply expanded_mkApps_tConstruct; eauto. - rewrite rev_map_spec. now simpl_list. rewrite rev_map_spec, <- List.map_rev. + rewrite rev_map_spec. now simpl_list. rewrite rev_map_spec -!List.map_rev. eapply Forall_forall. intros ? (? & <- & ?) % in_map_iff. econstructor. - eapply in_rev, in_seq in H5 as [_ ?]. cbn in *. len. + eapply in_rev, in_seq in H2 as [_ ?]. cbn in *. len. rewrite !firstn_length. len. assert ((context_assumptions (decompose_prod_assum [] (type_of_constructor mdecl cdecl (ind, i) u)).1) = ind_npars mdecl + context_assumptions (cstr_args cdecl)) as ->. { eapply decompose_type_of_constructor; eauto. } - rewrite nth_error_app1. now rewrite nth_error_repeat. rewrite repeat_length. lia. + rewrite nth_error_app1. 2:now rewrite nth_error_repeat. rewrite repeat_length. lia. - cbn. econstructor; eauto. * unfold map_branches. solve_all. - clear -X1 H8. + clear -hrepr X1 H8. set (Γ'' := map _ Γ'). cbn. - enough (All (expanded Σ0 Γ'') (map (eta_expand (declarations Σ0) Γ') (pparams p ++ indices))). + enough (All (expanded Σ0 Γ'') (map (eta_expand Σg Γ') (pparams p ++ indices))). now rewrite map_app in X; eapply All_app in X as []. eapply All_map. induction X1. + constructor. - + constructor; auto. eapply t0. solve_all. + + constructor; auto. eapply t1; solve_all; auto. + auto. * solve_all. specialize (b (repeat None #|bcontext y| ++ Γ'))%list. - rewrite map_app, map_repeat in b. eapply b. + rewrite map_app map_repeat in b. eapply b; eauto. eapply Forall2_app; solve_all. assert (#| (case_branch_context_gen (ci_ind ci) mdecl (pparams p) @@ -1131,17 +1165,17 @@ Proof. rewrite Nat.min_l; try lia. eapply All2_length in a0. unfold inst_case_context. unfold subst_context. unfold subst_instance, subst_instance_context, map_context. - rewrite fold_context_k_length, map_length. unfold aname. lia. + rewrite fold_context_k_length map_length. unfold aname. lia. } revert H9. generalize ((case_branch_context_gen (ci_ind ci) mdecl (pparams p) - (puinst p) (bcontext y) x)). clear. + (puinst p) (bcontext y) x)). clear -hrepr. induction #|bcontext y|; intros []; cbn; intros; try congruence; econstructor; eauto. - - cbn. rewrite nth_error_map, H0. cbn. unfold eta_fixpoint. unfold fst_ctx in *. cbn in *. + - cbn. rewrite nth_error_map H0. cbn. unfold eta_fixpoint. unfold fst_ctx in *. cbn in *. eapply expanded_fold_lambda. assert (#|(decompose_prod (dtype decl)).1.1| = #|(decompose_prod (dtype decl)).1.2|) as E1. { eapply decompose_prod12. } assert (rarg decl < context_assumptions (decompose_prod_assum [] (dtype decl)).1) as E2. { eapply wf_fixpoint_rarg; eauto. now eapply nth_error_In. } eapply expanded_mkApps_tFix. + shelve. - + fold lift. rewrite !nth_error_map, H0. cbn. len. reflexivity. + + fold lift. rewrite !nth_error_map H0. cbn. len. reflexivity. + len. rewrite seq_length. lia. + fold lift. len. assert (Forall (fun x => isLambda (dbody x)) mfix). @@ -1150,11 +1184,11 @@ Proof. { now eapply isLambda_lift, isLambda_eta_expand. } destruct a as (? & ? & ?). destruct a0 as (? & ?). - rewrite !firstn_length. rewrite !Nat.min_l; try lia. + rewrite !firstn_length. rewrite -> !Nat.min_l; try lia. eapply expanded_lift'. - 5: eapply e0. 2: reflexivity. 2: now len. + 5: eapply e0; eauto. 2: reflexivity. 2: now len. 2: now len. - { rewrite map_app. f_equal. rewrite map_rev. f_equal. now rewrite !mapi_map, map_mapi. } + { rewrite map_app. f_equal. rewrite map_rev. f_equal. now rewrite !mapi_map map_mapi. } eapply Forall2_app; solve_all. subst types. unfold Typing.fix_context. eapply All2_rev. eapply All2_mapi. eapply All_All2_refl, Forall_All, Forall_forall. @@ -1166,13 +1200,13 @@ Proof. eapply Forall_forall. intros ? (? & <- & ?) % in_map_iff. econstructor. eapply in_seq in H4 as [_ ?]. cbn in *. len. rewrite !firstn_length. - rewrite nth_error_app1. eapply nth_error_repeat. + rewrite -> nth_error_app1. eapply nth_error_repeat. len; lia. rewrite repeat_length. len; lia. + cbn - [rev_map seq]. rewrite rev_map_spec. cbn. rewrite Nat.sub_0_r. cbn. destruct List.rev; cbn; congruence. - cbn. econstructor; eauto. eapply All_Forall, All_map, All_impl. eapply (All_mix X X0). intros ? ((? & ? & ?) & ? & ?). cbn. specialize (e0 (repeat None #|mfix| ++ Γ'))%list. - rewrite map_app, map_repeat in e0. len. eapply e0. + rewrite map_app map_repeat in e0. len. eapply e0; auto. eapply Forall2_app; eauto. unfold types. assert (#|Typing.fix_context mfix| = #|mfix|). { unfold Typing.fix_context. now len. } revert H4. generalize (Typing.fix_context mfix). clear. @@ -1218,13 +1252,13 @@ Proof. case: eqb_specT => eq //. Qed. -Lemma eta_lookup_global Σ kn decl : - lookup_global Σ kn = Some decl -> - ∑ Σ', lookup_global (eta_global_declarations Σ) kn = Some (eta_global_declaration Σ' decl). +Lemma eta_lookup_global {Σ : GlobalEnvMap.t} kn decl : + lookup_env Σ kn = Some decl -> + lookup_global (eta_global_declarations Σ Σ.(declarations)) kn = Some (eta_global_declaration Σ decl). Proof. move/lookup_lookup_global_env => [] Σ' hl. - exists Σ'. move: hl. - induction Σ; cbn => //. + move: hl. + induction (declarations Σ); cbn => //. destruct a as [kn' []] => /=. case: eqb_spec. intros ->. intros [= <- <-] => //. intros neq. auto. @@ -1232,75 +1266,81 @@ Proof. intros neq. auto. Qed. +Lemma lookup_global_map_on_snd f decls kn : lookup_global (map (on_snd f) decls) kn = option_map f (lookup_global decls kn). +Proof. + induction decls; cbn => //. + case: eqb_spec. + - now intros ->. + - now intros neq. +Qed. + Lemma eta_lookup_global_error Σ ind : - lookup_global (eta_global_declarations Σ) (inductive_mind ind) = None -> - lookup_global Σ (inductive_mind ind) = None. + lookup_global (eta_global_declarations Σ Σ.(declarations)) (inductive_mind ind) = None -> + lookup_global Σ.(declarations) (inductive_mind ind) = None. Proof. - induction Σ; cbn => //. - destruct a as [kn []] => /=. - destruct (eqb_spec (inductive_mind ind) kn) => //. - destruct (eqb_spec (inductive_mind ind) kn) => //. + unfold eta_global_declarations. + rewrite lookup_global_map_on_snd. destruct lookup_global => //. Qed. -Lemma eta_declared_constructor {Σ ind mdecl idecl cdecl} : +Lemma eta_declared_constructor {Σ : GlobalEnvMap.t} {ind mdecl idecl cdecl} : declared_constructor Σ ind mdecl idecl cdecl -> - ∑ Σ', - (* extends_decls Σ' Σ × *) - declared_constructor (eta_expand_global_env Σ) ind (eta_minductive_decl Σ' mdecl) - (eta_inductive_decl Σ' mdecl idecl) (eta_constructor_decl Σ' mdecl cdecl). + declared_constructor (eta_expand_global_env Σ) ind (eta_minductive_decl Σ mdecl) + (eta_inductive_decl Σ mdecl idecl) (eta_constructor_decl Σ mdecl cdecl). Proof. rewrite /declared_constructor. intros [[] ?]. move: H. rewrite /declared_inductive /declared_minductive /lookup_env /=. destruct (lookup_global Σ.(declarations) _) eqn:heq => //. - move: (eta_lookup_global Σ.(declarations) (inductive_mind ind.1) g heq) => [Σ'] hl. - intros [= ->]. exists Σ'. rewrite hl; split => //. + move: (eta_lookup_global (inductive_mind ind.1) g heq) => hl. + intros [= ->]. rewrite hl; split => //. split => //. rewrite nth_error_map H0 //. rewrite nth_error_map H1 //. Qed. -Lemma expanded_env_irrel univs decls Γ t : - let Σ := {| universes := univs; declarations := decls |} in +Import ssreflect ssrbool. + +Definition same_cstr_info Σ Σ' := + forall ind idx mdecl idecl cdecl, + declared_constructor Σ (ind, idx) mdecl idecl cdecl -> + exists mdecl' idecl' cdecl', + [/\ declared_constructor Σ' (ind, idx) mdecl' idecl' cdecl', + mdecl.(ind_npars) = mdecl'.(ind_npars) & + context_assumptions cdecl.(cstr_args) = context_assumptions cdecl'.(cstr_args)]. + +Lemma expanded_env_irrel Σ Σ' Γ t : + same_cstr_info Σ Σ' -> expanded Σ Γ t -> - let Σ' := {| universes := univs; declarations := eta_global_declarations decls |} in expanded Σ' Γ t. Proof. - intros Σ exp Σ'. - move: exp. + intros hrepr. induction 1 using expanded_ind. all: try solve [constructor; auto]. - eapply expanded_tRel_app; tea. - - eapply eta_declared_constructor in H as [Σ'' decl']. - eapply expanded_tConstruct. tea. cbn. - unfold eta_context. - rewrite context_assumptions_fold_context_k_defs //. + - eapply hrepr in H as [mdecl' [idecl' [cdecl' [hdecl hpars hass]]]]. + eapply expanded_tConstruct; tea. lia. - eapply expanded_tFix; tea. solve_all. - - eapply eta_declared_constructor in H as [Σ'' decl']. - eapply expanded_tConstruct_app; tea. cbn. - rewrite context_assumptions_fold_context_k_defs //. + - eapply hrepr in H as [mdecl' [idecl' [cdecl' [hdecl hpars hass]]]]. + eapply expanded_tConstruct_app; tea. cbn. lia. Qed. -Lemma expanded_context_env_irrel univs decls Γ t : - let Σ := {| universes := univs; declarations := decls |} in +Lemma expanded_context_env_irrel Σ Σ' Γ t : + same_cstr_info Σ Σ' -> expanded_context Σ Γ t -> - let Σ' := {| universes := univs; declarations := eta_global_declarations decls |} in expanded_context Σ' Γ t. Proof. - intros Σ exp Σ'. - move: exp. unfold expanded_decl. + unfold expanded_decl. unfold expanded_context. - intros []; split. eapply All_fold_impl; tea; cbn => ?? []; constructor. + intros hrepr []; split. eapply All_fold_impl; tea; cbn => ?? []; constructor. eapply expanded_env_irrel; tea. Qed. -Lemma expanded_decl_env_irrel univs decls t : - let Σ := {| universes := univs; declarations := decls |} in +Lemma expanded_decl_env_irrel (Σ Σ' : global_env) t : + same_cstr_info Σ Σ' -> expanded_decl Σ t -> - let Σ' := {| universes := univs; declarations := eta_global_declarations decls |} in expanded_decl Σ' t. Proof. - intros Σ exp Σ'. - move: exp. unfold expanded_decl. + intros hrepr. + unfold expanded_decl. destruct t => //. intros []. constructor. destruct (cst_body c) => //. cbn in *. @@ -1333,29 +1373,51 @@ Qed. Existing Class Typing.wf_ext. -Lemma eta_expand_context {cf} {Σ ctx} {wfΣ : Typing.wf_ext Σ} : - on_context (lift_typing typing) Σ ctx -> - expanded_context Σ [] (eta_context Σ.(declarations) 0 ctx). +Definition global_env_ext_map := GlobalEnvMap.t × universes_decl. + +Definition global_env_ext_map_global_env_map (Σgext : global_env_ext_map) : GlobalEnvMap.t := Σgext.1. + +Definition global_env_ext_map_global_env_ext (Σgext : global_env_ext_map) : global_env_ext := + (Σgext.1.(GlobalEnvMap.env), Σgext.2). + +Coercion global_env_ext_map_global_env_map : global_env_ext_map >-> GlobalEnvMap.t. +Coercion global_env_ext_map_global_env_ext : global_env_ext_map >-> global_env_ext. + +Lemma repr_global_env_map (Σ : GlobalEnvMap.t) : repr_decls Σ Σ. +Proof. + destruct Σ as []. + unfold repr_decls. + intros kn d. + cbn. rewrite GlobalEnvMap.lookup_env_spec. now cbn. +Qed. + +Lemma eta_expand_context {cf} {Σ} {Σg : global_env_ext_map} {ctx} {wfΣ : Typing.wf_ext Σ} : + repr_decls Σg Σ -> + on_context (lift_typing typing) Σ ctx -> + expanded_context Σ [] (eta_context Σg 0 ctx). Proof. unfold on_context. - red. intros wf. sq. + red. intros hrepr wf. sq. rewrite /eta_context. eapply All_fold_fold_context_k_defs. induction wf; cbn; auto; try constructor; auto. cbn. constructor. cbn. constructor. len. rewrite app_nil_r. - red in t0, t1. - forward (eta_expand_expanded (Σ := Σ) Γ (repeat None #|Γ|) _ _ wfΣ t1). + red in t1, t2. + forward (eta_expand_expanded (Σ := Σ) Γ (repeat None #|Γ|) _ _ wfΣ t2). clear. induction Γ; cbn; constructor; auto. + intros. specialize (H _ hrepr). + move: H. now rewrite map_repeat. Qed. -Lemma eta_expand_context_sorts {cf} {Σ ctx ctx' cunivs} {wfΣ : Typing.wf_ext Σ} : +Lemma eta_expand_context_sorts {cf} {Σ} {Σg : global_env_ext_map} {ctx ctx' cunivs} {wfΣ : Typing.wf_ext Σ} : + repr_decls Σg Σ -> sorts_local_ctx (lift_typing typing) Σ ctx ctx' cunivs -> - expanded_context Σ (repeat 0 #|ctx|) (eta_context Σ.(declarations) #|ctx| ctx'). + expanded_context Σ (repeat 0 #|ctx|) (eta_context Σg #|ctx| ctx'). Proof. - intros hs. constructor. + intros hrepr hs. constructor. eapply All_fold_fold_context_k_defs. cbn. len. induction ctx' in hs, cunivs |- *; cbn; auto. constructor; eauto. @@ -1363,10 +1425,11 @@ Proof. specialize (IHctx' cunivs hs). constructor; auto. constructor. len. rewrite repeat_app. destruct p as [[s Hs] ?]. - epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None (#|ctx'| + #|ctx|)) _ _ wfΣ t). + epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None (#|ctx'| + #|ctx|)) _ _ wfΣ t0). forward H. clear. rewrite -app_context_length. induction (_ ,,, _); cbn; constructor; auto. + specialize (H _ hrepr). now rewrite map_repeat !repeat_app in H. destruct cunivs => //. destruct hs. constructor; eauto. constructor. @@ -1376,17 +1439,19 @@ Lemma eta_context_length g n ctx : #|eta_context g n ctx| = #|ctx|. Proof. now rewrite /eta_context; len. Qed. #[export] Hint Rewrite @eta_context_length : len. -Lemma eta_expand_global_decl_expanded {cf : checker_flags} g kn d : - Typing.wf_ext g -> - on_global_decl cumul_gen (lift_typing typing) g kn d -> - expanded_decl g (eta_global_declaration g.(declarations) d). +Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) kn d : + repr_decls Σg Σ -> + Typing.wf_ext Σ -> + on_global_decl cumul_gen (lift_typing typing) Σ kn d -> + expanded_decl Σ (eta_global_declaration Σg d). Proof. - intros wf ond. + intros hrepr wf ond. destruct d; cbn in *. - unfold on_constant_decl in ond. destruct c as [na body ty rel]; cbn in *. destruct body. constructor => //; cbn. - apply (eta_expand_expanded (Σ := g) [] [] t na wf ond). constructor. + apply (eta_expand_expanded (Σ := Σ) [] [] t0 na wf ond). constructor. + apply hrepr. destruct ond as [s Hs]. constructor => //. - destruct ond as [onI onP onN onV]. constructor. cbn. @@ -1399,27 +1464,110 @@ Proof. eapply All2_All_left; tea; cbn => cdecl cunivs onc. constructor. cbn. len. pose proof onc.(on_cargs). - eapply eta_expand_context_sorts in X0. now len in X0. + eapply eta_expand_context_sorts in X0. now len in X0. exact hrepr. len. len. pose proof onc.(on_ctype). destruct X0. - epose proof (eta_expand_expanded (Σ := g) _ (repeat None #|ind_bodies m|) _ _ wf t). + epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None #|ind_bodies m|) _ _ wf t0). forward H. rewrite -arities_context_length. clear. induction (arities_context _); constructor; auto. + specialize (H _ hrepr). now rewrite map_repeat in H. Qed. -Lemma eta_expand_global_env_expanded {cf : checker_flags} g : - Typing.wf g -> - expanded_global_env (eta_expand_global_env g). +Lemma eta_context_assumptions Σ n Γ : context_assumptions Γ = context_assumptions (eta_context Σ n Γ). +Proof. + now rewrite /eta_context context_assumptions_fold_context_k_defs. +Qed. + +Lemma same_cstr_info_eta (Σ : global_env) (Σg: GlobalEnvMap.t) : + same_cstr_info Σ {| universes := Σ.(universes) ; declarations := List.map (on_snd (eta_global_declaration Σg)) Σ.(declarations) |}. +Proof. + destruct Σ as [univs Σ]; cbn. + induction Σ; intros ind idx mdecl idecl cdecl. + - unfold declared_constructor, declared_inductive, declared_minductive. + cbn => [[[]]] //. + - unfold declared_constructor, declared_inductive, declared_minductive. + cbn. destruct a as [kn decl]; cbn. + case: eqb_spec. + * move=> _ [] [] [= ->] hnth hnth'. + do 3 eexists; cbn. split. split. split => //. + cbn. rewrite nth_error_map hnth; reflexivity. + cbn. rewrite nth_error_map hnth'; reflexivity. + now cbn. cbn. apply eta_context_assumptions. + * move=> _ [] [] hl hnth htnh'. + red in IHΣ. + specialize (IHΣ ind idx mdecl idecl cdecl). + forward IHΣ. repeat split => //. + destruct IHΣ as [mdecl' [idecl' [cdecl' []]]]. + exists mdecl', idecl', cdecl'; repeat split => //. +Qed. + +Lemma lookup_global_Some_fresh Σ c decl : + lookup_global Σ c = Some decl -> ~ (fresh_global c Σ). +Proof. + induction Σ; cbn. 1: congruence. + destruct (eqb_spec c a.1); subst. + - intros [= <-] H2. inv H2. + contradiction. + - intros H1 H2. apply IHΣ; tas. + now inv H2. +Qed. + +Lemma lookup_env_Some_fresh Σ c decl : + lookup_env Σ c = Some decl -> ~ (fresh_global c Σ.(declarations)). +Proof. + apply lookup_global_Some_fresh. +Qed. + +Lemma lookup_global_extends Σ Σ' kn d : + lookup_env Σ kn = Some d -> + extends_decls Σ Σ' -> + EnvMap.fresh_globals Σ'.(declarations) -> + lookup_env Σ' kn = Some d. +Proof. + destruct Σ as [univs Σ]. + destruct Σ' as [univs' Σ']. + cbn. move=> hl [] /=; intros <- [Σ'' ->]. + induction Σ''; cbn; auto. + case: eqb_spec. + - intros ->. intros fr. + depelim fr. eapply lookup_global_Some_fresh in hl. cbn in hl. + red in H. eapply Forall_app in H as [frl frr]. contradiction. + - move=> _ hf. now depelim hf. +Qed. + +Lemma eta_expand_global_env_expanded {cf : checker_flags} (Σ : global_env_ext_map) : + Typing.wf Σ -> + expanded_global_env (eta_expand_global_env Σ). Proof. - destruct g as [univs Σ]; cbn. + destruct Σ as [Σ univs]; cbn. unfold expanded_global_env. cbn. unfold Typing.wf, Typing.on_global_env. intros [onu ond]. cbn in *. + destruct Σ as []. cbn in *. + assert (extends_decls env env). red; split => //. now exists []. + revert X. + move: map repr wf. + generalize env at 1 2 4 6. + destruct env as [univs' decls]. cbn in *. induction ond; cbn; constructor; auto. - set (Σ' := {| universes := univs; declarations := Σ |}). - cbn. epose proof (eta_expand_global_decl_expanded (Σ', udecl) kn d). + apply: IHond. cbn. destruct X as [equ [Σ' ext]]. red. split. auto. + rewrite ext. cbn. unfold snoc. exists (Σ' ++ [(kn, d)])%list. now rewrite -app_assoc. + set (Σ' := {| universes := univs'; declarations := Σ |}) in *. + set (Σg := {| GlobalEnvMap.env := _ |}). Unshelve. + destruct X as [equ [Σ'' ext]]. cbn in *. destruct env as [univs0 env]. cbn in *. subst univs0. + subst env. + pose proof (eta_expand_global_decl_expanded (Σ', udecl) (Σg, univs) kn d). cbn in H. - eapply expanded_decl_env_irrel, H. - split => //. exact o0. + forward H. { + move=> kn' d' /= hl. + rewrite GlobalEnvMap.lookup_env_spec /=. + cbn. unfold snoc. + eapply (lookup_global_extends {| universes := univs'; declarations := Σ |} + {| universes := univs'; declarations := (Σ'' ++ (kn, d) :: Σ)%list |}); eauto. + split => //. cbn. now exists (Σ'' ++ [(kn, d)])%list; rewrite -app_assoc. } + forward H. split. cbn. split => //. now cbn. + specialize (H o0). + eapply expanded_decl_env_irrel in H; tea. + apply (same_cstr_info_eta Σ' Σg). Qed. diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 8bb7798b4..0d6a9f1e9 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -1,5 +1,5 @@ From Coq Require Import List. -From MetaCoq.Template Require Import config Transform TemplateProgram Pretty All Loader. +From MetaCoq.Template Require Import config Transform TemplateProgram Pretty EtaExpand All Loader. Import ListNotations. Import MCMonadNotation. Import bytestring. @@ -64,8 +64,10 @@ Definition check_wf (g : Ast.Env.program) : TemplateMonad unit := monad_map check_def g.1.(declarations) ;; tmMsg "Wellformed global environment" ;; ret tt. -Definition check_wf_eta (g : Ast.Env.program) : TemplateMonad unit := - monad_map check_def (eta_expand g).1.(declarations) ;; +Axiom assume_wt_template_program : forall p : Ast.Env.program, ∥ wt_template_program p ∥. + +Definition check_wf_eta (p : Ast.Env.program) : TemplateMonad unit := + monad_map check_def (eta_expand (make_template_program_env p (assume_wt_template_program p))).1.(declarations) ;; tmMsg "Wellformed eta-expanded global environment" ;; ret tt. (* To test that a program's eta-expansion is indeed well-typed according to Coq's kernel use: diff --git a/template-coq/theories/TemplateEnvMap.v b/template-coq/theories/TemplateEnvMap.v new file mode 100644 index 000000000..3c9bcf16c --- /dev/null +++ b/template-coq/theories/TemplateEnvMap.v @@ -0,0 +1,85 @@ +From Coq Require Import ssreflect ssrbool. +From Equations Require Import Equations. +From MetaCoq.Template Require Import config utils Kernames EnvMap Ast Typing. +Import MCMonadNotation. + +Lemma fresh_globals_cons_inv {Σ : global_declarations} {d} : EnvMap.fresh_globals (d :: Σ) -> EnvMap.fresh_globals Σ. +Proof. intros H; now depelim H. Qed. + +Lemma wf_fresh_globals {cf : checker_flags} (Σ : global_env) : wf Σ -> EnvMap.fresh_globals Σ.(declarations). +Proof. + destruct Σ as [univs Σ]; cbn. + move=> [] onu; cbn. induction 1; constructor; auto. +Qed. + +Local Coercion declarations : global_env >-> global_declarations. + +Module GlobalEnvMap. + Record t := + { env :> global_env; + map : EnvMap.t global_decl; + repr : EnvMap.repr env.(declarations) map; + wf : EnvMap.fresh_globals env.(declarations) }. + + Definition lookup_env Σ kn := EnvMap.lookup kn Σ.(map). + + Lemma lookup_env_spec (Σ : t) kn : lookup_env Σ kn = Env.lookup_env Σ kn. + Proof. + rewrite /lookup_env /Env.lookup_env. + apply (EnvMap.lookup_spec Σ.(env).(declarations)); apply Σ. + Qed. + + Definition lookup_minductive Σ kn : option mutual_inductive_body := + decl <- lookup_env Σ kn;; + match decl with + | ConstantDecl _ => None + | InductiveDecl mdecl => ret mdecl + end. + + Lemma lookup_minductive_spec Σ kn : lookup_minductive Σ kn = Ast.lookup_minductive Σ kn. + Proof. + rewrite /lookup_minductive /Ast.lookup_minductive. + rewrite lookup_env_spec //. + Qed. + + Definition lookup_inductive Σ kn : option (mutual_inductive_body * one_inductive_body) := + mdecl <- lookup_minductive Σ (inductive_mind kn) ;; + idecl <- nth_error mdecl.(ind_bodies) (inductive_ind kn) ;; + ret (mdecl, idecl). + + Lemma lookup_inductive_spec Σ kn : lookup_inductive Σ kn = Ast.lookup_inductive Σ kn. + Proof. + rewrite /lookup_inductive /Ast.lookup_inductive. + rewrite lookup_minductive_spec //. + Qed. + + Definition lookup_constructor Σ kn c : option (mutual_inductive_body * one_inductive_body * constructor_body) := + '(mdecl, idecl) <- lookup_inductive Σ kn ;; + cdecl <- nth_error idecl.(ind_ctors) c ;; + ret (mdecl, idecl, cdecl). + + Lemma lookup_constructor_spec Σ kn : lookup_constructor Σ kn = Ast.lookup_constructor Σ kn. + Proof. + rewrite /lookup_constructor /Ast.lookup_constructor. + rewrite lookup_inductive_spec //. + Qed. + + Definition lookup_projection Σ (p : projection) : + option (mutual_inductive_body * one_inductive_body * constructor_body * projection_body) := + '(mdecl, idecl, cdecl) <- lookup_constructor Σ p.(proj_ind) 0 ;; + pdecl <- nth_error idecl.(ind_projs) p.(proj_arg) ;; + ret (mdecl, idecl, cdecl, pdecl). + + Lemma lookup_projection_spec Σ kn : lookup_projection Σ kn = Ast.lookup_projection Σ kn. + Proof. + rewrite /lookup_projection /Ast.lookup_projection. + rewrite lookup_constructor_spec //. + Qed. + + Program Definition make (g : global_env) (Hg : EnvMap.fresh_globals g.(declarations)): t := + {| env := g; + map := EnvMap.of_global_env g.(declarations) |}. + +End GlobalEnvMap. + +Coercion GlobalEnvMap.env : GlobalEnvMap.t >-> global_env. diff --git a/template-coq/theories/TemplateProgram.v b/template-coq/theories/TemplateProgram.v index ec0280282..f2b7dda31 100644 --- a/template-coq/theories/TemplateProgram.v +++ b/template-coq/theories/TemplateProgram.v @@ -2,17 +2,17 @@ From MetaCoq.Template Require Import utils + Transform Ast (* The term AST *) Typing (* Typing judgment *) config (* Typing configuration *) - Transform WcbvEval - EtaExpand. - -Import Transform. + TemplateEnvMap. Definition template_program := Ast.Env.program. +Definition template_program_env := (TemplateEnvMap.GlobalEnvMap.t * Ast.term). + (** Well-typedness of template programs *) Definition wt_template_program {cf : checker_flags} (p : template_program) := @@ -24,3 +24,32 @@ Definition wt_template_program {cf : checker_flags} (p : template_program) := Definition eval_template_program (p : Ast.Env.program) (v : Ast.term) := ∥ WcbvEval.eval p.1 p.2 v ∥. +(** Well-typedness of template programs with efficient environments *) + +Definition wt_template_program_env {cf : checker_flags} (p : template_program_env) := + let Σ := Ast.Env.empty_ext p.1 in + wf_ext Σ × ∑ T, Σ ;;; [] |- p.2 : T. + +(** Evaluation relation on template programs *) + +Definition eval_template_program_env (p : template_program_env) (v : Ast.term) := + ∥ WcbvEval.eval p.1 p.2 v ∥. + +Import Transform. + +Lemma wt_template_program_fresh {cf : checker_flags} p : ∥ wt_template_program p ∥ -> EnvMap.EnvMap.fresh_globals (declarations p.1). +Proof. intros [[wfΣ _]]. eapply TemplateEnvMap.wf_fresh_globals, wfΣ. Qed. + +Definition make_template_program_env {cf : checker_flags} (p : template_program) (wtp : ∥ wt_template_program p ∥) : template_program_env := + (GlobalEnvMap.make p.1 (wt_template_program_fresh p wtp), p.2). + +Program Definition build_template_program_env {cf : checker_flags} : + Transform.t template_program template_program_env Ast.term Ast.term eval_template_program eval_template_program_env := + {| name := "rebuilding environment lookup table"; + pre p := ∥ wt_template_program p ∥ ; + transform p pre := make_template_program_env p pre; + post p := ∥ wt_template_program_env p ∥; + obseq g g' v v' := v = v' |}. +Next Obligation. + cbn. exists v. cbn; split; auto. +Qed. diff --git a/template-coq/theories/utils/MCString.v b/template-coq/theories/utils/MCString.v index c5d6ef402..141cb7e1d 100644 --- a/template-coq/theories/utils/MCString.v +++ b/template-coq/theories/utils/MCString.v @@ -26,19 +26,21 @@ Definition print_list {A} (f : A -> string) (sep : string) (l : list A) : string Definition parens (top : bool) (s : string) := if top then s else "(" ++ s ++ ")". +Local Infix "::" := String.String. + Fixpoint string_of_uint n := match n with | Nil => "" - | D0 n => "0" ++ string_of_uint n - | D1 n => "1" ++ string_of_uint n - | D2 n => "2" ++ string_of_uint n - | D3 n => "3" ++ string_of_uint n - | D4 n => "4" ++ string_of_uint n - | D5 n => "5" ++ string_of_uint n - | D6 n => "6" ++ string_of_uint n - | D7 n => "7" ++ string_of_uint n - | D8 n => "8" ++ string_of_uint n - | D9 n => "9" ++ string_of_uint n + | D0 n => "0" :: string_of_uint n + | D1 n => "1" :: string_of_uint n + | D2 n => "2" :: string_of_uint n + | D3 n => "3" :: string_of_uint n + | D4 n => "4" :: string_of_uint n + | D5 n => "5" :: string_of_uint n + | D6 n => "6" :: string_of_uint n + | D7 n => "7" :: string_of_uint n + | D8 n => "8" :: string_of_uint n + | D9 n => "9" :: string_of_uint n end. Definition string_of_nat n : string := @@ -48,7 +50,7 @@ Definition string_of_nat n : string := Hint Resolve String.string_dec : eq_dec. Definition string_of_positive p := - string_of_nat (Pos.to_nat p). + string_of_uint (Pos.to_uint p). Definition string_of_Z (z : Z) : string := match z with From a9eb6f618c630a96b11192747e9e610b95179d5e Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Tue, 14 Jun 2022 15:22:50 +0200 Subject: [PATCH 23/43] Write fixpoint attempt for on_module_decl (failed) --- template-coq/theories/Environment.v | 26 +++++- template-coq/theories/EnvironmentTyping.v | 99 +++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index ae0879d50..e5361122b 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -292,9 +292,33 @@ Module Environment (T : Term). option_map f (cst_body decl) = cst_body (map_constant_body f decl). Proof. destruct decl; reflexivity. Qed. + (** See [generic_module_body] from [declarations.ml]. We do not include the modpath + in the body since it is already included in [global_declarations]. *) + Definition structure_body structure_field := list (kername × structure_field). + Definition module_body impl modtype := impl × modtype. + Definition module_type_body structure_field := structure_body structure_field. + (** implementation -> module type -> algebraic (colon-annotated) module type (TODO) *) + Inductive structure_field := + | sfconst : constant_body -> structure_field + | sfmind : mutual_inductive_body -> structure_field + | sfmod : module_body module_implementation (module_type_body structure_field) -> structure_field + | sfmodtype : module_type_body structure_field-> structure_field + with module_implementation := + | mi_abstract : module_implementation (** Declare Module M: T. *) + | mi_algebraic : kername -> module_implementation (** Module M [:T] := N. *) + | mi_struct : structure_body structure_field -> module_implementation (** Module M:T. ... End M.*) + | mi_fullstruct : module_implementation. (** Module M. ... End M.*) + (** Is a [module_body] without implementation. TODO: algebraic type of the modtype*) + + Definition module_decl := module_body module_implementation (module_type_body structure_field). + Definition module_type_decl := module_type_body structure_field. + Inductive global_decl := | ConstantDecl : constant_body -> global_decl - | InductiveDecl : mutual_inductive_body -> global_decl. + | InductiveDecl : mutual_inductive_body -> global_decl + | ModuleDecl : module_body module_implementation (module_type_body structure_field)-> global_decl + | ModuleTypeDecl : module_type_body structure_field -> global_decl. + (* TODO: can have module declaration *) Derive NoConfusion for global_decl. Definition global_declarations := list (kername * global_decl). diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index 336cbc254..4665a7914 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -28,7 +28,13 @@ Module Lookup (T : Term) (E : EnvironmentSig T). declared_constructor Σ (proj.(proj_ind), 0) mdecl idecl cdecl /\ List.nth_error idecl.(ind_projs) proj.(proj_arg) = Some pdecl /\ mdecl.(ind_npars) = proj.(proj_npars). + + Definition declared_module Σ kn moddecl := + lookup_env Σ kn = Some (ModuleDecl moddecl). + Definition declared_modtype Σ kn mtdecl := + lookup_env Σ kn = Some (ModuleTypeDecl mtdecl). + Definition lookup_constant Σ kn := match lookup_env Σ kn with | Some (ConstantDecl d) => Some d @@ -71,6 +77,18 @@ Module Lookup (T : Term) (E : EnvironmentSig T). | _ => None end. + Definition lookup_module Σ kn := + match lookup_env Σ kn with + | Some (ModuleDecl d) => Some d + | _ => None + end. + + Definition lookup_modtype Σ kn := + match lookup_env Σ kn with + | Some (ModuleTypeDecl d) => Some d + | _ => None + end. + Lemma declared_constant_lookup {Σ kn cdecl} : declared_constant Σ kn cdecl -> lookup_constant Σ kn = Some cdecl. @@ -160,10 +178,44 @@ Module Lookup (T : Term) (E : EnvironmentSig T). apply (lookup_constructor_declared (id:=(proj_ind p, 0)) hl). Qed. + (** TODO: lookup_{module, modtype}_declared, declared_{module, modtype}_lookup *) + Lemma declared_module_lookup {Σ mp mdecl} : + declared_module Σ mp mdecl -> + lookup_module Σ mp = Some mdecl. + Proof. + unfold declared_module, lookup_module. now intros ->. + Qed. + + Lemma lookup_module_declared {Σ kn mdecl} : + lookup_module Σ kn = Some mdecl -> + declared_module Σ kn mdecl. + Proof. + unfold declared_module, lookup_module. + destruct lookup_env as [[]|] => //. congruence. + Qed. + + Lemma declared_modtype_lookup {Σ mp mtdecl} : + declared_modtype Σ mp mtdecl -> + lookup_modtype Σ mp = Some mtdecl. + Proof. + unfold declared_modtype, lookup_modtype. now intros ->. + Qed. + + Lemma lookup_modtype_declared {Σ kn mtdecl} : + lookup_modtype Σ kn = Some mtdecl -> + declared_modtype Σ kn mtdecl. + Proof. + unfold declared_modtype, lookup_modtype. + destruct lookup_env as [[]|] => //. congruence. + Qed. + Definition on_udecl_decl {A} (F : universes_decl -> A) d : A := match d with | ConstantDecl cb => F cb.(cst_universes) | InductiveDecl mb => F mb.(ind_universes) + (** FIXME: Recursively check the universes of fields? *) + | ModuleDecl _ => F Monomorphic_ctx + | ModuleTypeDecl _ => F Monomorphic_ctx end. Definition universes_decl_of_decl := on_udecl_decl (fun x => x). @@ -1133,10 +1185,55 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT | None => on_type Σ [] d.(cst_type) end. + About P. + About fold_left. + About on_inductive. + Check Type. + About All. + + Definition a := nat × nat. + Definition b : a := (1, 2). + + + Definition on_structure_body Σ (sb: structure_body structure_field) + (on_structure_field: global_env_ext -> kername × structure_field -> Type) := + All (on_structure_field Σ) sb. + + Check on_structure_body. + + Fixpoint on_module_decl (Σ: global_env_ext) (d: module_decl) on_structure_body := + let impl := d.1 in + let modtype := d.2 in + match impl return Type with + (** Interactive definitions are stored in modtype if not type-annotated. + Otherwise, the interactive definition is in impl, type annotation in modtype. *) + (** Declare Module M: T, so check T *) + | mi_abstract => on_structure_body Σ modtype on_structure_field + (** Module M := N, so check N *) + | mi_algebraic kn => match (lookup_module Σ kn) with + | Some m => on_module_decl Σ m on_structure_body + | _ => Empty_set + end + (** FIXME: Module M:T ... End M, so check impl, and whether impl: T *) + | mi_struct fields => (on_structure_body Σ fields on_structure_field) × (on_structure_body Σ modtype on_structure_field) + (** Module M ... End M, so check impl *) + | mi_fullstruct => on_structure_body Σ modtype on_structure_field + end + + with on_structure_field Σ kn_decl := match kn_decl.2 with + | sfconst d => on_constant_decl Σ d + | sfmind inds => on_inductive Σ kn_decl.1 inds + | sfmod mb => on_module_decl Σ mb on_structure_body + | sfmodtype mtd => on_structure_body Σ mtd on_structure_field + end. + + Definition on_global_decl Σ kn decl := match decl with | ConstantDecl d => on_constant_decl Σ d | InductiveDecl inds => on_inductive Σ kn inds + | ModuleDecl mb => on_module_decl Σ mb on_structure_body + | ModuleTypeDecl mtd => on_modtype_decl Σ mtd end. (** *** Typing of global environment @@ -1149,6 +1246,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT Definition fresh_global (s : kername) (g : global_declarations) : Prop := Forall (fun g => g.1 <> s) g. + Definition fresh_global := 1. Inductive on_global_decls (univs : ContextSet.t) : global_declarations -> Type := | globenv_nil : on_global_decls univs [] | globenv_decl Σ kn d : @@ -1388,3 +1486,4 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) Qed. End DeclarationTyping. + From 1e9008960b8027322ff7564b7b08298e9b9f6781 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Fri, 17 Jun 2022 14:18:21 +0200 Subject: [PATCH 24/43] Define on_module_decl --- template-coq/theories/Environment.v | 7 ++- template-coq/theories/EnvironmentTyping.v | 70 ++++++++++------------- 2 files changed, 34 insertions(+), 43 deletions(-) diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index e5361122b..04cf1d7a9 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -310,14 +310,15 @@ Module Environment (T : Term). | mi_fullstruct : module_implementation. (** Module M. ... End M.*) (** Is a [module_body] without implementation. TODO: algebraic type of the modtype*) - Definition module_decl := module_body module_implementation (module_type_body structure_field). + Definition structure_decl := structure_body structure_field. Definition module_type_decl := module_type_body structure_field. + Definition module_decl := module_body module_implementation module_type_decl. Inductive global_decl := | ConstantDecl : constant_body -> global_decl | InductiveDecl : mutual_inductive_body -> global_decl - | ModuleDecl : module_body module_implementation (module_type_body structure_field)-> global_decl - | ModuleTypeDecl : module_type_body structure_field -> global_decl. + | ModuleDecl : module_decl -> global_decl + | ModuleTypeDecl : module_type_decl -> global_decl. (* TODO: can have module declaration *) Derive NoConfusion for global_decl. diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index 4665a7914..7e1d60ee8 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -77,7 +77,7 @@ Module Lookup (T : Term) (E : EnvironmentSig T). | _ => None end. - Definition lookup_module Σ kn := + Definition lookup_module Σ kn: option module_decl := match lookup_env Σ kn with | Some (ModuleDecl d) => Some d | _ => None @@ -876,6 +876,8 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT positive_cstr_arg mdecl ctx ty -> positive_cstr mdecl i (vass na ty :: ctx) t -> positive_cstr mdecl i ctx (tProd na ty t). + + About closedn. Definition lift_level n l := match l with @@ -1185,55 +1187,44 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT | None => on_type Σ [] d.(cst_type) end. - About P. - About fold_left. - About on_inductive. - Check Type. - About All. - - Definition a := nat × nat. - Definition b : a := (1, 2). - - Definition on_structure_body Σ (sb: structure_body structure_field) (on_structure_field: global_env_ext -> kername × structure_field -> Type) := All (on_structure_field Σ) sb. - Check on_structure_body. - - Fixpoint on_module_decl (Σ: global_env_ext) (d: module_decl) on_structure_body := - let impl := d.1 in - let modtype := d.2 in - match impl return Type with (** Interactive definitions are stored in modtype if not type-annotated. Otherwise, the interactive definition is in impl, type annotation in modtype. *) - (** Declare Module M: T, so check T *) - | mi_abstract => on_structure_body Σ modtype on_structure_field - (** Module M := N, so check N *) - | mi_algebraic kn => match (lookup_module Σ kn) with - | Some m => on_module_decl Σ m on_structure_body - | _ => Empty_set - end - (** FIXME: Module M:T ... End M, so check impl, and whether impl: T *) - | mi_struct fields => (on_structure_body Σ fields on_structure_field) × (on_structure_body Σ modtype on_structure_field) - (** Module M ... End M, so check impl *) - | mi_fullstruct => on_structure_body Σ modtype on_structure_field - end - - with on_structure_field Σ kn_decl := match kn_decl.2 with - | sfconst d => on_constant_decl Σ d - | sfmind inds => on_inductive Σ kn_decl.1 inds - | sfmod mb => on_module_decl Σ mb on_structure_body - | sfmodtype mtd => on_structure_body Σ mtd on_structure_field - end. - + Inductive on_structure_field Σ: (kername × structure_field) -> Type := + | on_sfconst kn c : on_constant_decl Σ c -> on_structure_field Σ (kn, sfconst c) + | sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ (kn, sfmind inds) + | sfmod kn mb : on_module_decl Σ mb -> on_structure_field Σ (kn, sfmod mb) + | sfmodtype kn mtd : on_structure_body Σ mtd on_structure_field -> on_structure_field Σ (kn, sfmodtype mtd) + + with on_module_decl Σ : module_decl -> Type := + (** Declare Module M: T, so check T *) + | on_mi_abstract_decl modtype: + on_structure_body Σ modtype on_structure_field -> on_module_decl Σ (mi_abstract, modtype) + + (** Module M := N, so check N *) + | on_mi_algebraic_decl (kn: kername) moddecl: + declared_module Σ kn moddecl -> on_module_decl Σ ((mi_algebraic kn), moddecl.2) + + (** Module M:T ... End M, so check impl, check T, and and whether impl: T *) + | on_mi_struct_decl (body: structure_decl) (modtype: module_type_decl): + (on_structure_body Σ body on_structure_field) + -> (on_structure_body Σ modtype on_structure_field) + -> on_module_decl Σ ((mi_struct body), modtype) + + (** Module M ... End M, so check impl *) + | on_mi_fullstruct_decl body: + on_structure_body Σ body on_structure_field + -> on_module_decl Σ (mi_fullstruct, body). Definition on_global_decl Σ kn decl := match decl with | ConstantDecl d => on_constant_decl Σ d | InductiveDecl inds => on_inductive Σ kn inds - | ModuleDecl mb => on_module_decl Σ mb on_structure_body - | ModuleTypeDecl mtd => on_modtype_decl Σ mtd + | ModuleDecl mb => on_module_decl Σ mb + | ModuleTypeDecl mtd => on_structure_body Σ mtd on_structure_field end. (** *** Typing of global environment @@ -1246,7 +1237,6 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT Definition fresh_global (s : kername) (g : global_declarations) : Prop := Forall (fun g => g.1 <> s) g. - Definition fresh_global := 1. Inductive on_global_decls (univs : ContextSet.t) : global_declarations -> Type := | globenv_nil : on_global_decls univs [] | globenv_decl Σ kn d : From 2845a4c30e7d927965de8e364dfbb7dfc647620a Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 30 Jun 2022 14:20:00 +0200 Subject: [PATCH 25/43] Define on_module_decl with induction principle --- template-coq/theories/EnvironmentTyping.v | 36 ++++++++++++++--------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index 7e1d60ee8..091c0caef 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -1187,22 +1187,22 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT | None => on_type Σ [] d.(cst_type) end. - Definition on_structure_body Σ (sb: structure_body structure_field) - (on_structure_field: global_env_ext -> kername × structure_field -> Type) := - All (on_structure_field Σ) sb. - - (** Interactive definitions are stored in modtype if not type-annotated. - Otherwise, the interactive definition is in impl, type annotation in modtype. *) + (** Interactive definitions are stored in modtype if not type-annotated. + Otherwise, the interactive definition is in impl, type annotation in modtype. *) Inductive on_structure_field Σ: (kername × structure_field) -> Type := | on_sfconst kn c : on_constant_decl Σ c -> on_structure_field Σ (kn, sfconst c) - | sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ (kn, sfmind inds) - | sfmod kn mb : on_module_decl Σ mb -> on_structure_field Σ (kn, sfmod mb) - | sfmodtype kn mtd : on_structure_body Σ mtd on_structure_field -> on_structure_field Σ (kn, sfmodtype mtd) + | on_sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ (kn, sfmind inds) + | on_sfmod kn mb : on_module_decl Σ mb -> on_structure_field Σ (kn, sfmod mb) + | on_sfmodtype kn mtd : on_structure_body Σ mtd -> on_structure_field Σ (kn, sfmodtype mtd) + + with on_structure_body Σ : structure_body structure_field -> Type := + | on_sb_nil : on_structure_body Σ [] + | on_sb_cons hd tl : on_structure_field Σ hd -> on_structure_body Σ tl -> on_structure_body Σ (hd :: tl) with on_module_decl Σ : module_decl -> Type := (** Declare Module M: T, so check T *) | on_mi_abstract_decl modtype: - on_structure_body Σ modtype on_structure_field -> on_module_decl Σ (mi_abstract, modtype) + on_structure_body Σ modtype -> on_module_decl Σ (mi_abstract, modtype) (** Module M := N, so check N *) | on_mi_algebraic_decl (kn: kername) moddecl: @@ -1210,21 +1210,29 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT (** Module M:T ... End M, so check impl, check T, and and whether impl: T *) | on_mi_struct_decl (body: structure_decl) (modtype: module_type_decl): - (on_structure_body Σ body on_structure_field) - -> (on_structure_body Σ modtype on_structure_field) + (on_structure_body Σ body ) + -> (on_structure_body Σ modtype) -> on_module_decl Σ ((mi_struct body), modtype) (** Module M ... End M, so check impl *) | on_mi_fullstruct_decl body: - on_structure_body Σ body on_structure_field + on_structure_body Σ body -> on_module_decl Σ (mi_fullstruct, body). + Scheme onStructField_rect := Induction for on_structure_field Sort Type + with onModuleDecl_rect := Induction for on_module_decl Sort Type + with onStructBody_rect := Induction for on_structure_body Sort Type. + + (** Generate mutual induction principle for module declarations. *) + Combined Scheme on_moddecl_structfield_structbody_mutrect from + onModuleDecl_rect,onStructField_rect,onStructBody_rect. + Definition on_global_decl Σ kn decl := match decl with | ConstantDecl d => on_constant_decl Σ d | InductiveDecl inds => on_inductive Σ kn inds | ModuleDecl mb => on_module_decl Σ mb - | ModuleTypeDecl mtd => on_structure_body Σ mtd on_structure_field + | ModuleTypeDecl mtd => on_structure_body Σ mtd end. (** *** Typing of global environment From edd35a63b4b9d5ec4a0ef55e96ec92dc001ba2c1 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 30 Jun 2022 18:33:38 +0200 Subject: [PATCH 26/43] Proves on_global_env_impl --- template-coq/theories/EnvironmentTyping.v | 87 +++++++++++++++++------ 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index 091c0caef..e240d4302 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -1314,25 +1314,25 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT destruct u; auto. intuition eauto. Qed. - Lemma on_global_env_impl {cf : checker_flags} Pcmp P Q : - (forall Σ Γ t T, - on_global_env Pcmp P Σ.1 -> - on_global_env Pcmp Q Σ.1 -> - P Σ Γ t T -> Q Σ Γ t T) -> - forall Σ, on_global_env Pcmp P Σ -> on_global_env Pcmp Q Σ. + Lemma on_constant_decl_impl {cf : checker_flags} Pcmp P Q Σ d : + (forall Γ t T, + on_global_env Pcmp P Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + on_global_env Pcmp P Σ.1 -> + on_constant_decl P Σ d -> on_constant_decl Q Σ d. Proof. - intros X Σ [cu IH]. split; auto. - revert cu IH; generalize (universes Σ) as univs, (declarations Σ). clear Σ. - induction g; intros; auto. constructor; auto. - depelim IH. specialize (IHg cu IH). constructor; auto. - pose proof (globenv_decl _ _ _ _ _ _ IH f o). - assert (X' := fun Γ t T => X ({| universes := univs; declarations := _ |}, udecl) Γ t T - (cu, IH) (cu, IHg)); clear X. - rename X' into X. - clear IH IHg. destruct d; simpl. - - destruct c; simpl. destruct cst_body0; cbn in *; now eapply X. - - red in o. simpl in *. - destruct o0 as [onI onP onNP]. + intros X X0 X1. destruct d; destruct cst_body0; unfold on_constant_decl in *; unfold on_type; now simpl. + Qed. + + Lemma on_inductive_decl_impl {cf : checker_flags} Pcmp P Q Σ kn mdecl : + (forall Γ t T, + on_global_env Pcmp P Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + on_global_env Pcmp P Σ.1 -> + on_inductive Pcmp P Σ kn mdecl -> on_inductive Pcmp Q Σ kn mdecl. + Proof. + intros X X0. + - intros [onI onP onNP]. constructor; auto. -- eapply Alli_impl; tea. intros. refine {| ind_arity_eq := X1.(ind_arity_eq); @@ -1360,13 +1360,55 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT split. * apply ind_sorts0. * destruct indices_matter; auto. - eapply type_local_ctx_impl; eauto. - eapply ind_sorts0. - --- eapply X1.(onIndices). + eapply type_local_ctx_impl. eapply ind_sorts0. eauto. + --- apply X1.(onIndices). -- red in onP. red. - eapply All_local_env_impl; tea. + eapply All_local_env_impl; eauto. + Qed. + + Lemma on_global_decl_impl {cf : checker_flags} Pcmp P Q Σ kn d : + (forall Γ t T, + on_global_env Pcmp P Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + on_global_env Pcmp P Σ.1 -> + on_global_decl Pcmp P Σ kn d -> on_global_decl Pcmp Q Σ kn d. + Proof. + intros H HP. + cut ((forall (m : module_decl), on_module_decl Pcmp P Σ m -> on_module_decl Pcmp Q Σ m) + × (forall (p : kername × structure_field), on_structure_field Pcmp P Σ p -> on_structure_field Pcmp Q Σ p) + × (forall (s : structure_body structure_field), on_structure_body Pcmp P Σ s -> on_structure_body Pcmp Q Σ s)). + intro md_sf_sb. + destruct d; simpl. + - now apply (on_constant_decl_impl Pcmp). + - now apply (on_inductive_decl_impl Pcmp). + - apply md_sf_sb. + - apply md_sf_sb. + - eapply (on_moddecl_structfield_structbody_mutrect). + -- intros kn0 c0 HP1. apply (on_sfconst Pcmp Q Σ kn0 c0). now apply (on_constant_decl_impl Pcmp P). + -- intros mind mind_body P1. apply (on_sfmind Pcmp Q Σ mind mind_body). now apply (on_inductive_decl_impl Pcmp P). + -- intros. now apply on_sfmod. + -- intros. now apply on_sfmodtype. + -- intros. now apply on_mi_abstract_decl. + -- intros. now apply on_mi_algebraic_decl. + -- intros. now apply on_mi_struct_decl. + -- intros. now apply on_mi_fullstruct_decl. + -- apply on_sb_nil. + -- intros. now apply on_sb_cons. Qed. + Lemma on_global_env_impl {cf : checker_flags} Pcmp P Q : + (forall Σ Γ t T, + on_global_env Pcmp P Σ.1 -> + on_global_env Pcmp Q Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + forall Σ, on_global_env Pcmp P Σ -> on_global_env Pcmp Q Σ. + Proof. + intros X [univs Σ] [cu X0]; split => /= //. cbn in *. + induction X0; constructor; auto. + eapply on_global_decl_impl; tea. + - intros; apply X => //. + - split => //. + Qed. End GlobalMaps. Module Type GlobalMapsSig (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvTypingSig T E TU) (C: ConversionSig T E TU ET) (L: LookupSig T E). @@ -1481,6 +1523,7 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) --- eapply X1.(onIndices). -- red in onP. red. eapply All_local_env_impl; tea. + - Qed. End DeclarationTyping. From 82f2002229137b2318f33d701884383e51bdd557 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Mon, 4 Jul 2022 12:02:14 +0200 Subject: [PATCH 27/43] Done EnvironmentTyping, needs cleanup --- template-coq/theories/EnvironmentTyping.v | 123 +++++++++++++++++++++- 1 file changed, 120 insertions(+), 3 deletions(-) diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index e240d4302..0e5917f44 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -1379,8 +1379,8 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT × (forall (s : structure_body structure_field), on_structure_body Pcmp P Σ s -> on_structure_body Pcmp Q Σ s)). intro md_sf_sb. destruct d; simpl. - - now apply (on_constant_decl_impl Pcmp). - - now apply (on_inductive_decl_impl Pcmp). + - now eapply on_constant_decl_impl. + - now eapply on_inductive_decl_impl. - apply md_sf_sb. - apply md_sf_sb. - eapply (on_moddecl_structfield_structbody_mutrect). @@ -1488,7 +1488,9 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) (cu, wfΣ) (cu, X0) (cu, IHX0)); clear X. rename X' into X. clear IHX0. destruct d; simpl. + - destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + - red in o. simpl in *. destruct o0 as [onI onP onNP]. constructor; auto. @@ -1523,7 +1525,122 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) --- eapply X1.(onIndices). -- red in onP. red. eapply All_local_env_impl; tea. - - + + - simpl in *. + assert (udecl = Monomorphic_ctx). { auto. } + rewrite H0 in o,o0. + assert (udecl0 = Monomorphic_ctx). { auto. } + rewrite H1 in o1,o2,X. + clear H0 H1 udecl udecl0. + remember ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) as gex. + cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). + -- intro md_sf_sb. apply md_sf_sb. exact o0. + -- apply on_moddecl_structfield_structbody_mutrect. + --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + --- intros. apply on_sfmind. + { - red in o. simpl in *. + destruct o3 as [onI onP onNP]. + constructor; auto. + -- eapply Alli_impl; tea. intros. + refine {| ind_arity_eq := X1.(ind_arity_eq); + ind_cunivs := X1.(ind_cunivs) |}. + --- apply onArity in X1. unfold on_type in *; simpl in *. + now eapply X. + --- pose proof X1.(onConstructors) as X11. red in X11. + eapply All2_impl; eauto. + simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. + * apply X; eauto. + * clear -X0 X on_cargs0. revert on_cargs0. + generalize (cstr_args x0). + induction c in y |- *; destruct y; simpl; auto; + destruct a as [na [b|] ty]; simpl in *; auto; + split; intuition eauto. + * clear -X0 X on_cindices0. + revert on_cindices0. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). + induction 1; simpl; constructor; auto. + --- simpl; intros. pose (onProjections X1 H0). simpl in *; auto. + --- destruct X1. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. + * apply ind_sorts0. + * destruct indices_matter; auto. + eapply type_local_ctx_impl; eauto. + eapply ind_sorts0. + --- eapply X1.(onIndices). + -- red in onP. red. + eapply All_local_env_impl; tea. + } + --- intros. now apply on_sfmod. + --- intros. now apply on_sfmodtype. + --- intros. now apply on_mi_abstract_decl. + --- intros. now apply on_mi_algebraic_decl. + --- intros. now apply on_mi_struct_decl. + --- intros. now apply on_mi_fullstruct_decl. + --- apply on_sb_nil. + --- intros. now apply on_sb_cons. + + - simpl in *. + assert (udecl = Monomorphic_ctx). { auto. } + rewrite H0 in o,o0. + assert (udecl0 = Monomorphic_ctx). { auto. } + rewrite H1 in o1,o2,X. + clear H0 H1 udecl udecl0. + remember ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) as gex. + cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). + -- intro md_sf_sb. apply md_sf_sb. exact o0. + -- apply on_moddecl_structfield_structbody_mutrect. + --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + --- intros. apply on_sfmind. + { - red in o. simpl in *. + destruct o3 as [onI onP onNP]. + constructor; auto. + -- eapply Alli_impl; tea. intros. + refine {| ind_arity_eq := X1.(ind_arity_eq); + ind_cunivs := X1.(ind_cunivs) |}. + --- apply onArity in X1. unfold on_type in *; simpl in *. + now eapply X. + --- pose proof X1.(onConstructors) as X11. red in X11. + eapply All2_impl; eauto. + simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. + * apply X; eauto. + * clear -X0 X on_cargs0. revert on_cargs0. + generalize (cstr_args x0). + induction c in y |- *; destruct y; simpl; auto; + destruct a as [na [b|] ty]; simpl in *; auto; + split; intuition eauto. + * clear -X0 X on_cindices0. + revert on_cindices0. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). + induction 1; simpl; constructor; auto. + --- simpl; intros. pose (onProjections X1 H0). simpl in *; auto. + --- destruct X1. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. + * apply ind_sorts0. + * destruct indices_matter; auto. + eapply type_local_ctx_impl; eauto. + eapply ind_sorts0. + --- eapply X1.(onIndices). + -- red in onP. red. + eapply All_local_env_impl; tea. + } + --- intros. now apply on_sfmod. + --- intros. now apply on_sfmodtype. + --- intros. now apply on_mi_abstract_decl. + --- intros. now apply on_mi_algebraic_decl. + --- intros. now apply on_mi_struct_decl. + --- intros. now apply on_mi_fullstruct_decl. + --- apply on_sb_nil. + --- intros. now apply on_sb_cons. Qed. End DeclarationTyping. From d3bba3bdd29a2b0700bb3136d7bdf9ce108064c1 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Tue, 5 Jul 2022 16:51:40 +0200 Subject: [PATCH 28/43] Proves theorem in Typing.v --- template-coq/theories/Typing.v | 133 +++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/template-coq/theories/Typing.v b/template-coq/theories/Typing.v index 0baa1ae66..7177f377d 100644 --- a/template-coq/theories/Typing.v +++ b/template-coq/theories/Typing.v @@ -1320,6 +1320,139 @@ Proof. apply lift_typing_impl with (1 := HT); intros ? Hs. apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). constructor 1. simpl. subst Σ' Σg; cbn; lia. + + (** Module Declaration *) + + simpl in *. + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m + -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s + -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s)). + * intros md_sf_sb. apply md_sf_sb. apply Xg. + (** start of mutual induction *) + * apply on_moddecl_structfield_structbody_mutrect. + -- intros. apply on_sfconst. + destruct c; simpl in *. + destruct cst_body0; apply lift_typing_impl with (1 := o1); intros ? Hs. + all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). + all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. + all: apply IH. + + -- intros. apply on_sfmind. + destruct o1 as [onI onP onnp]; constructor; eauto. + --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). + constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. + clear IH; rename IH' into IH. + eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. + refine {| ind_arity_eq := Xg.(ind_arity_eq); + ind_cunivs := Xg.(ind_cunivs) |}. + ** apply onArity in Xg. + apply lift_typing_impl with (1 := Xg); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** pose proof Xg.(onConstructors) as Xg'. + eapply All2_impl; eauto. intros. + destruct X13 as [cass tyeq onctyp oncargs oncind]. + unshelve econstructor; eauto. + { apply lift_typing_impl with (1 := onctyp); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. + apply lift_typing_impl with (1 := HT'); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { clear -IH oncind. + revert oncind. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). induction 1; constructor; auto. + do 2 red in t0 |- *. + apply (IH (_; (_; (_; t0)))). } + ** intros Hprojs; pose proof (onProjections Xg Hprojs); auto. + ** destruct Xg. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. apply ind_sorts0. destruct indices_matter; auto. + eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** apply (onIndices Xg). + --- red in onP |- *. + apply All_local_env_impl with (1 := onP); intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). + constructor 1. simpl. subst Σ' Σg; cbn; lia. + -- intros; now apply on_sfmod. + -- intros; now apply on_sfmodtype. + -- intros; now apply on_mi_abstract_decl. + -- intros; now apply on_mi_algebraic_decl. + -- intros; now apply on_mi_struct_decl. + -- intros; now apply on_mi_fullstruct_decl. + -- constructor. + -- intros. now apply on_sb_cons. + + + simpl in *. + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m + -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s + -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s)). + * intros md_sf_sb. apply md_sf_sb. apply Xg. + (** start of mutual induction *) + * apply on_moddecl_structfield_structbody_mutrect. + -- intros. apply on_sfconst. + destruct c; simpl in *. + destruct cst_body0; apply lift_typing_impl with (1 := o1); intros ? Hs. + all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). + all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. + all: apply IH. + + -- intros. apply on_sfmind. + destruct o1 as [onI onP onnp]; constructor; eauto. + --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). + constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. + clear IH; rename IH' into IH. + eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. + refine {| ind_arity_eq := Xg.(ind_arity_eq); + ind_cunivs := Xg.(ind_cunivs) |}. + ** apply onArity in Xg. + apply lift_typing_impl with (1 := Xg); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** pose proof Xg.(onConstructors) as Xg'. + eapply All2_impl; eauto. intros. + destruct X13 as [cass tyeq onctyp oncargs oncind]. + unshelve econstructor; eauto. + { apply lift_typing_impl with (1 := onctyp); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. + apply lift_typing_impl with (1 := HT'); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { clear -IH oncind. + revert oncind. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). induction 1; constructor; auto. + do 2 red in t0 |- *. + apply (IH (_; (_; (_; t0)))). } + ** intros Hprojs; pose proof (onProjections Xg Hprojs); auto. + ** destruct Xg. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. apply ind_sorts0. destruct indices_matter; auto. + eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** apply (onIndices Xg). + --- red in onP |- *. + apply All_local_env_impl with (1 := onP); intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). + constructor 1. simpl. subst Σ' Σg; cbn; lia. + -- intros; now apply on_sfmod. + -- intros; now apply on_sfmodtype. + -- intros; now apply on_mi_abstract_decl. + -- intros; now apply on_mi_algebraic_decl. + -- intros; now apply on_mi_struct_decl. + -- intros; now apply on_mi_fullstruct_decl. + -- constructor. + -- intros. now apply on_sb_cons. - assert (forall Γ t T (Hty : Σ ;;; Γ |- t : T), typing_size Hty < typing_size H -> From 05aa36fda8ea653221a92ad68f1510d81aa9a7f4 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 7 Jul 2022 15:29:25 +0200 Subject: [PATCH 29/43] Defined check_wf_mod_body and friends --- template-coq/theories/Checker.v | 50 ++++++++++++++++++----- template-coq/theories/Environment.v | 7 ++-- template-coq/theories/EnvironmentTyping.v | 2 - 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/template-coq/theories/Checker.v b/template-coq/theories/Checker.v index 20ba48c6b..7c31be470 100644 --- a/template-coq/theories/Checker.v +++ b/template-coq/theories/Checker.v @@ -863,19 +863,49 @@ Section Checker. Definition infer_term Σ G t := wrap_error "" (infer Σ G [] t). - - Definition check_wf_decl Σ G kn (g : global_decl) : EnvCheck () := - match g with - | ConstantDecl cst => + Definition check_wf_const_body Σ G kn cst: EnvCheck ():= match cst.(cst_body) with | Some term => check_wf_judgement (string_of_kername kn) Σ G term cst.(cst_type) | None => check_wf_type (string_of_kername kn) Σ G cst.(cst_type) - end - | InductiveDecl inds => - List.fold_left (fun acc body => - acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) - inds.(ind_bodies) (ret ()) - end. + end. + + Definition check_wf_ind_body Σ G inds: EnvCheck () := + List.fold_left (fun acc body => + acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) + inds.(ind_bodies) (ret ()). + Print module_decl. + + (** The [ List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) assoc_list_sf (ret ()) ] + cannot be defined as another fixpoint, otherwise Coq "cannot guess the decreasing argument", + since it is not the term being destructed. *) + Fixpoint check_wf_mod_body Σ G impl (modtype_wf: EnvCheck ()): EnvCheck () := + match impl with + | mi_abstract => modtype_wf + (** TODO: check (get_definition a) <: modtype*) + | mi_algebraic _ => CorrectDecl () + (** TODO: check assoc_list_modtype <: modtype*) + | mi_struct assoc_list_sf => + List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) assoc_list_sf (ret ()) + | mi_fullstruct => modtype_wf + end + + with check_wf_structure_field Σ G kn sf: EnvCheck () := + match sf with + | sfconst cst => check_wf_const_body Σ G kn cst + | sfmind inds => check_wf_ind_body Σ G inds + | sfmod (impl, modtype) => check_wf_mod_body Σ G impl + (List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) modtype (ret ())) + | sfmodtype mt => + List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) mt (ret ()) + end. + + Definition check_wf_decl Σ G kn (g : global_decl) : EnvCheck () := + match g with + | ConstantDecl cst => check_wf_const_body Σ G kn cst + | InductiveDecl inds => check_wf_ind_body Σ G inds + | ModuleDecl (impl, modtype) => check_wf_mod_body Σ G impl (List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) modtype (ret ())) + | ModuleTypeDecl mt => List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) mt (ret ()) + end. Fixpoint check_fresh id (env : global_declarations) : EnvCheck () := match env with diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 04cf1d7a9..258af3386 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -295,13 +295,14 @@ Module Environment (T : Term). (** See [generic_module_body] from [declarations.ml]. We do not include the modpath in the body since it is already included in [global_declarations]. *) Definition structure_body structure_field := list (kername × structure_field). - Definition module_body impl modtype := impl × modtype. Definition module_type_body structure_field := structure_body structure_field. (** implementation -> module type -> algebraic (colon-annotated) module type (TODO) *) Inductive structure_field := | sfconst : constant_body -> structure_field | sfmind : mutual_inductive_body -> structure_field - | sfmod : module_body module_implementation (module_type_body structure_field) -> structure_field + (** TODO: Consider currying impl and modtype. *) + (* | sfmod : module_implementation -> module_type_body structure_field -> structure_field *) + | sfmod : module_implementation × (module_type_body structure_field) -> structure_field | sfmodtype : module_type_body structure_field-> structure_field with module_implementation := | mi_abstract : module_implementation (** Declare Module M: T. *) @@ -312,7 +313,7 @@ Module Environment (T : Term). Definition structure_decl := structure_body structure_field. Definition module_type_decl := module_type_body structure_field. - Definition module_decl := module_body module_implementation module_type_decl. + Definition module_decl := module_implementation × module_type_decl. Inductive global_decl := | ConstantDecl : constant_body -> global_decl diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index 0e5917f44..d96a9e443 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -877,8 +877,6 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT positive_cstr mdecl i (vass na ty :: ctx) t -> positive_cstr mdecl i ctx (tProd na ty t). - About closedn. - Definition lift_level n l := match l with | Level.lzero | Level.Level _ => l From e490ade127a21c42a866b35cd805165a913420d8 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Wed, 13 Jul 2022 14:12:41 +0200 Subject: [PATCH 30/43] Cleanup todos and prove wf and eta properties Also added remaining fixmes before the template-coq can be compiled --- template-coq/theories/Checker.v | 3 +- template-coq/theories/Environment.v | 3 +- template-coq/theories/EnvironmentTyping.v | 1 - template-coq/theories/EtaExpand.v | 108 +++++++++++++++++++--- template-coq/theories/Pretty.v | 2 + template-coq/theories/TemplateCheckWf.v | 23 +++++ template-coq/theories/TemplateEnvMap.v | 1 + template-coq/theories/TypingWf.v | 50 +--------- 8 files changed, 127 insertions(+), 64 deletions(-) diff --git a/template-coq/theories/Checker.v b/template-coq/theories/Checker.v index 7c31be470..7f4e2b18c 100644 --- a/template-coq/theories/Checker.v +++ b/template-coq/theories/Checker.v @@ -5,7 +5,7 @@ Import MCMonadNotation. (** * Coq type-checker for kernel terms - Implemets [typecheck_program] which returns an error and + Implements [typecheck_program] which returns an error and on success should guarantee that the term has the given type. Currently uses fuel to implement reduction and is unverified. @@ -873,7 +873,6 @@ Section Checker. List.fold_left (fun acc body => acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) inds.(ind_bodies) (ret ()). - Print module_decl. (** The [ List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) assoc_list_sf (ret ()) ] cannot be defined as another fixpoint, otherwise Coq "cannot guess the decreasing argument", diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 258af3386..b302a4af1 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -309,7 +309,7 @@ Module Environment (T : Term). | mi_algebraic : kername -> module_implementation (** Module M [:T] := N. *) | mi_struct : structure_body structure_field -> module_implementation (** Module M:T. ... End M.*) | mi_fullstruct : module_implementation. (** Module M. ... End M.*) - (** Is a [module_body] without implementation. TODO: algebraic type of the modtype*) + (** Is a [module_body] without implementation. *) Definition structure_decl := structure_body structure_field. Definition module_type_decl := module_type_body structure_field. @@ -320,7 +320,6 @@ Module Environment (T : Term). | InductiveDecl : mutual_inductive_body -> global_decl | ModuleDecl : module_decl -> global_decl | ModuleTypeDecl : module_type_decl -> global_decl. - (* TODO: can have module declaration *) Derive NoConfusion for global_decl. Definition global_declarations := list (kername * global_decl). diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index d96a9e443..857c5fe23 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -178,7 +178,6 @@ Module Lookup (T : Term) (E : EnvironmentSig T). apply (lookup_constructor_declared (id:=(proj_ind p, 0)) hl). Qed. - (** TODO: lookup_{module, modtype}_declared, declared_{module, modtype}_lookup *) Lemma declared_module_lookup {Σ mp mdecl} : declared_module Σ mp mdecl -> lookup_module Σ mp = Some mdecl. diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index 592da4c75..42b891bfb 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -203,10 +203,32 @@ Definition eta_minductive_decl Σ mdecl := ind_universes := mdecl.(ind_universes); ind_variance := mdecl.(ind_variance); |}. +Fixpoint eta_module_decl Σ impl eta_modtype {struct impl}:= + match impl with + | mi_struct struct_body => + let new_impl := mi_struct (map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) struct_body) in + (new_impl, eta_modtype) + | _ => (impl, eta_modtype) + end + with eta_structure_field Σ sf {struct sf}:= match sf with + | sfconst c => sfconst (eta_global_decl Σ c) + | sfmind m => sfmind (eta_minductive_decl Σ m) + | sfmod (impl, modtype) => + let new_modtype := (map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype) in + sfmod (eta_module_decl Σ impl new_modtype) + | sfmodtype modtype => sfmodtype ((map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype)) + end. + + Definition eta_module_type_decl Σ (modtype: list (kername × structure_field)) := + map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype. + Definition eta_global_declaration (Σ : GlobalEnvMap.t) decl : global_decl := match decl with | ConstantDecl cb => ConstantDecl (eta_global_decl Σ cb) | InductiveDecl idecl => InductiveDecl (eta_minductive_decl Σ idecl) + | ModuleDecl (impl, modtype) => let new_modtype := eta_module_type_decl Σ modtype in + ModuleDecl (eta_module_decl Σ impl new_modtype) + | ModuleTypeDecl modtype => ModuleTypeDecl (eta_module_type_decl Σ modtype) end. Definition eta_global_declarations (Σ : GlobalEnvMap.t) (decls : global_declarations) := @@ -398,10 +420,49 @@ Record expanded_minductive_decl Σ mdecl := { expanded_params : expanded_context Σ [] mdecl.(ind_params); expanded_ind_bodies : Forall (expanded_inductive_decl Σ mdecl) mdecl.(ind_bodies) }. +Inductive expanded_structure_field Σ: (kername × structure_field) -> Prop := + | expanded_sfconst kn c : expanded_constant_decl Σ c -> expanded_structure_field Σ (kn, sfconst c) + | expanded_sfmind kn inds : expanded_minductive_decl Σ inds -> expanded_structure_field Σ (kn, sfmind inds) + | expanded_sfmod kn mb : expanded_module_decl Σ mb -> expanded_structure_field Σ (kn, sfmod mb) + | expanded_sfmodtype kn mtd : expanded_structure_body Σ mtd -> expanded_structure_field Σ (kn, sfmodtype mtd) + +with expanded_structure_body Σ : structure_body structure_field -> Prop := + | expanded_sb_nil : expanded_structure_body Σ [] + | expanded_sb_cons hd tl : expanded_structure_field Σ hd -> expanded_structure_body Σ tl -> expanded_structure_body Σ (hd :: tl) + +with expanded_module_decl Σ : module_decl -> Prop := +(** Declare Module M: T, so expand T *) +| expanded_mi_abstract_decl modtype: + expanded_structure_body Σ modtype -> expanded_module_decl Σ (mi_abstract, modtype) + +(** Module M := N, if N is declared in Σ it must be expanded. *) +(** induction-recursion *) +| expanded_mi_algebraic_decl (kn: kername) (moddecl: module_decl): + expanded_module_decl Σ ((mi_algebraic kn), moddecl.2) + +(** Module M:T ... End M, so expand impl and T *) +| expanded_mi_struct_decl (body: structure_decl) (modtype: module_type_decl): + (expanded_structure_body Σ body ) + -> (expanded_structure_body Σ modtype) + -> expanded_module_decl Σ ((mi_struct body), modtype) + +(** Module M ... End M, so expand impl *) +| expanded_mi_fullstruct_decl body: + expanded_structure_body Σ body + -> expanded_module_decl Σ (mi_fullstruct, body). + +Scheme expanded_sf_ind := Induction for expanded_structure_field Sort Prop +with expanded_sb_ind := Induction for expanded_structure_body Sort Prop +with expanded_mod_ind := Induction for expanded_module_decl Sort Prop. + +Combined Scheme expanded_moddecl_structfield_structbody_mutind from expanded_mod_ind,expanded_sf_ind,expanded_sb_ind. + Definition expanded_decl Σ d := match d with | Ast.Env.ConstantDecl cb => expanded_constant_decl Σ cb | Ast.Env.InductiveDecl idecl => expanded_minductive_decl Σ idecl + | Ast.Env.ModuleDecl m => expanded_module_decl Σ m + | Ast.Env.ModuleTypeDecl mt => expanded_structure_body Σ mt end. Inductive expanded_global_declarations (univs : ContextSet.t) : forall (Σ : Ast.Env.global_declarations), Prop := @@ -1260,6 +1321,11 @@ Proof. move: hl. induction (declarations Σ); cbn => //. destruct a as [kn' []] => /=. + (** TODO: refactor repeated code *) + case: eqb_spec. intros ->. intros [= <- <-] => //. + intros neq. auto. + case: eqb_spec. intros ->. intros [= <- <-] => //. + intros neq. auto. case: eqb_spec. intros ->. intros [= <- <-] => //. intros neq. auto. case: eqb_spec. intros ->. intros [= <- <-] => //. @@ -1340,18 +1406,35 @@ Lemma expanded_decl_env_irrel (Σ Σ' : global_env) t : expanded_decl Σ' t. Proof. intros hrepr. + cut ((forall (m : module_decl), expanded_module_decl Σ m -> expanded_module_decl Σ' m) /\ + (forall (p : kername × structure_field), expanded_structure_field Σ p -> expanded_structure_field Σ' p) /\ + (forall (s : structure_body structure_field), expanded_structure_body Σ s -> expanded_structure_body Σ' s)). + intros [Hmd [Hsf Hsb]]. unfold expanded_decl. - destruct t => //. + destruct t => //; auto. intros []. constructor. - destruct (cst_body c) => //. cbn in *. - now eapply expanded_env_irrel. - intros []. split. - eapply expanded_context_env_irrel; tea. - solve_all. - destruct H. constructor. - solve_all. destruct H; split. - eapply expanded_context_env_irrel; tea. - eapply expanded_env_irrel; tea. + + - destruct (cst_body c) => //. cbn in *. + now eapply expanded_env_irrel. + + - intros []. split. + eapply expanded_context_env_irrel; tea. + solve_all. + destruct H. constructor. + solve_all. destruct H; split. + eapply expanded_context_env_irrel; tea. + eapply expanded_env_irrel; tea. + + - eapply expanded_moddecl_structfield_structbody_mutind; intros; try now constructor. + -- repeat constructor. destruct e. destruct (cst_body c) => //. cbn in *. now eapply expanded_env_irrel. + -- constructor. revert e. + intros []. split. + eapply expanded_context_env_irrel; tea. + solve_all. + destruct H. constructor. + solve_all. destruct H; split. + eapply expanded_context_env_irrel; tea. + eapply expanded_env_irrel; tea. Qed. Coercion wf_ext_wf : wf_ext >-> wf. @@ -1472,7 +1555,10 @@ Proof. clear. induction (arities_context _); constructor; auto. specialize (H _ hrepr). now rewrite map_repeat in H. -Qed. + (** FIXME: prove for module and module type *) + - admit. + - admit. +Admitted. Lemma eta_context_assumptions Σ n Γ : context_assumptions Γ = context_assumptions (eta_context Σ n Γ). Proof. diff --git a/template-coq/theories/Pretty.v b/template-coq/theories/Pretty.v index f5fffaf58..d97c9941f 100644 --- a/template-coq/theories/Pretty.v +++ b/template-coq/theories/Pretty.v @@ -342,6 +342,8 @@ Module PrintTermTree. else (" := " ^ nl ^ print_term Σ' with_universes nil true b ^ "." ^ nl) | None => "." end ^ acc) + (** FIXME: print module and module type declarations *) + | _ => "" end end. diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 0d6a9f1e9..641de043a 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -21,6 +21,8 @@ Definition check_def (d : kername × global_decl) : TemplateMonad unit := | None => ret tt end | InductiveDecl idecl => ret tt + (** FIXME: define unquoting for modules *) + | _ => tmMsg ("Succeeded") end. Definition is_nil {A} (l : list A) := @@ -51,10 +53,31 @@ Fixpoint wfterm (t : term) : bool := From Coq Require Import ssrbool. +Print List.fold_left. + +Fixpoint wf_module_decl_aux impl wf_modtype := + match impl with + | mi_abstract => wf_modtype + | mi_algebraic _ => wf_modtype + | mi_struct sb => List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) sb true + | mi_fullstruct => wf_modtype + end +with wf_structure_field sf := +match sf with +| sfconst cb => wfterm cb.(cst_type) && option_default wfterm cb.(cst_body) true +| sfmind _ => true +| sfmod (impl, modtype) => + wf_module_decl_aux impl (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) +| sfmodtype mt => List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) mt true +end. + Definition wf_global_decl d := match d with | ConstantDecl cb => wfterm cb.(cst_type) && option_default wfterm cb.(cst_body) true | InductiveDecl idecl => true + | ModuleDecl (impl, modtype) => + wf_module_decl_aux impl (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) + | ModuleTypeDecl modtype => (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) end. Definition wf_global_declarations : global_declarations -> bool := forallb (wf_global_decl ∘ snd). Definition wf_global_env (g : global_env) := wf_global_declarations g.(declarations). diff --git a/template-coq/theories/TemplateEnvMap.v b/template-coq/theories/TemplateEnvMap.v index 3c9bcf16c..44f58d33f 100644 --- a/template-coq/theories/TemplateEnvMap.v +++ b/template-coq/theories/TemplateEnvMap.v @@ -34,6 +34,7 @@ Module GlobalEnvMap. match decl with | ConstantDecl _ => None | InductiveDecl mdecl => ret mdecl + | ModuleDecl _ | ModuleTypeDecl _ => None end. Lemma lookup_minductive_spec Σ kn : lookup_minductive Σ kn = Ast.lookup_minductive Σ kn. diff --git a/template-coq/theories/TypingWf.v b/template-coq/theories/TypingWf.v index 039211c4e..094336191 100644 --- a/template-coq/theories/TypingWf.v +++ b/template-coq/theories/TypingWf.v @@ -41,58 +41,12 @@ Lemma on_global_decl_impl `{checker_flags} Σ P Q kn d : (forall Σ Γ t T, on_global_env cumul_gen P Σ.1 -> P Σ Γ t T -> Q Σ Γ t T) -> on_global_env cumul_gen P Σ.1 -> on_global_decl cumul_gen P Σ kn d -> on_global_decl cumul_gen Q Σ kn d. -Proof. - unfold on_global_env. - intros X X0 o. - destruct d; simpl. - - destruct c; simpl. destruct cst_body0; simpl in *. - red in o |- *. simpl in *. now eapply X. - red in o |- *. simpl in *. now eapply X. - - simpl in *. - destruct o as [onI onP onNP]. - constructor; auto. - -- eapply Alli_impl. exact onI. eauto. intros. - - refine {| ind_arity_eq := X1.(ind_arity_eq); - ind_cunivs := X1.(ind_cunivs) |}. - --- apply onArity in X1. unfold on_type in *; simpl in *. - now eapply X. - --- pose proof X1.(onConstructors) as X11. red in X11. - eapply All2_impl; eauto. - simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. - * apply X; eauto. - * clear -X0 X on_cargs. revert on_cargs. - generalize (cstr_args x0), y. - induction c; destruct y0; simpl; auto; - destruct a as [na [b|] ty]; simpl in *; auto; - split; intuition eauto. - * clear -X0 X on_cindices. - revert on_cindices. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). - induction 1; simpl; constructor; auto. - --- simpl; intros. apply (onProjections X1 H0). - --- destruct X1. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. apply ind_sorts. destruct indices_matter; auto. - eapply type_local_ctx_impl. eapply ind_sorts. auto. - --- apply (onIndices X1). - -- red in onP. red. - eapply All_local_env_impl. eauto. - intros. now apply X. -Qed. +Proof. intros; now eapply (on_global_decl_impl cumul_gen P). Qed. Lemma on_global_env_impl `{checker_flags} Σ P Q : (forall Σ Γ t T, on_global_env cumul_gen P Σ.1 -> P Σ Γ t T -> Q Σ Γ t T) -> on_global_env cumul_gen P Σ -> on_global_env cumul_gen Q Σ. -Proof. - destruct Σ as [univs Σ]; cbn. - intros X [cu X0]; split => /= //. cbn in *. - induction X0; constructor; auto. - clear IHX0. - eapply on_global_decl_impl; tea. split => //. -Qed. +Proof. intros; now eapply (on_global_env_impl cumul_gen P). Qed. Lemma All_local_env_wf_decl_inv Σ (a : context_decl) (Γ : list context_decl) (X : All_local_env (wf_decl_pred Σ) (a :: Γ)) : From 8e2c7a4c08714ec69986c457422bc881d47307e4 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Wed, 13 Jul 2022 23:49:39 +0200 Subject: [PATCH 31/43] Move to prop Qed'ed lemmas in type for cleaner extraction --- erasure/_PluginProject.in | 2 - safechecker/_PluginProject.in | 2 - .../src/metacoq_safechecker_plugin.mlpack | 1 - safechecker/theories/PCUICSafeChecker.v | 12 +++--- template-coq/theories/Universes.v | 39 +++++++------------ template-coq/theories/utils/wGraph.v | 22 +++++------ 6 files changed, 32 insertions(+), 46 deletions(-) diff --git a/erasure/_PluginProject.in b/erasure/_PluginProject.in index 61e43f45d..10faad864 100644 --- a/erasure/_PluginProject.in +++ b/erasure/_PluginProject.in @@ -10,8 +10,6 @@ # src/canonicalTries.ml src/ssrbool.ml src/ssrbool.mli -src/ssreflect.ml -src/ssreflect.mli src/uGraph0.ml src/uGraph0.mli src/wGraph.ml diff --git a/safechecker/_PluginProject.in b/safechecker/_PluginProject.in index 163ffab7f..c46d480f2 100644 --- a/safechecker/_PluginProject.in +++ b/safechecker/_PluginProject.in @@ -8,8 +8,6 @@ # From template src/ssrbool.ml src/ssrbool.mli -src/ssreflect.ml -src/ssreflect.mli src/uGraph0.ml src/uGraph0.mli src/wGraph.ml diff --git a/safechecker/src/metacoq_safechecker_plugin.mlpack b/safechecker/src/metacoq_safechecker_plugin.mlpack index 064dbca55..954305712 100644 --- a/safechecker/src/metacoq_safechecker_plugin.mlpack +++ b/safechecker/src/metacoq_safechecker_plugin.mlpack @@ -1,6 +1,5 @@ Utils Ssrbool -Ssreflect WGraph UGraph0 Reflect diff --git a/safechecker/theories/PCUICSafeChecker.v b/safechecker/theories/PCUICSafeChecker.v index bb9a556ab..87b3e106b 100644 --- a/safechecker/theories/PCUICSafeChecker.v +++ b/safechecker/theories/PCUICSafeChecker.v @@ -387,7 +387,7 @@ Section CheckEnv. + clear -Hl HΣ ct. destruct HΣ as [_ HΣ]. specialize (HΣ (l, ct, l') Hl). split; apply LevelSet.union_spec; right; apply HΣ. - Defined. + Qed. Definition check_wf_env_ext_prop X X_ext ext := (forall Σ : global_env, abstract_env_rel X Σ -> abstract_env_ext_rel X_ext (Σ, ext)) @@ -1868,10 +1868,12 @@ Section CheckEnv. (check_cstr_variance X mdecl id indices mdeclvar cs _ _)) idecl.(ind_ctors) (get_wt_indices X_ext wfar wfpars n idecl indices hnth heq Hcs)) ;; lets <- - monad_All (P := fun x => if @lets_in_constructor_types _ - then true else is_assumption_context (cstr_args x)) + monad_All (P := fun x => if @lets_in_constructor_types _ as _ return Prop then true else is_assumption_context (cstr_args x)) (fun cs => if @lets_in_constructor_types _ - then ret _ else (if is_assumption_context (cstr_args cs) then ret _ else EnvError X_env_ext_type X_ext (IllFormedDecl "No lets in constructor types allowed, you need to set the checker flag lets_in_constructor_types to [true]." + then ret _ else + (if is_assumption_context (cstr_args cs) then ret _ + else EnvError X_env_ext_type X_ext + (IllFormedDecl "No lets in constructor types allowed, you need to set the checker flag lets_in_constructor_types to [true]." (Msg "No lets in constructor types allowed, you need to set the checker flag lets_in_constructor_types to [true].") )) ) idecl.(ind_ctors) ;; ret (cs; _). @@ -1902,7 +1904,7 @@ Section CheckEnv. rewrite /cstr_concl /=. f_equal. rewrite /cstr_concl_head. lia_f_equal. - now destruct wtinds. - destruct lets_in_constructor_types; eauto. - Qed. + Qed. Definition check_projections_type (mind : kername) (mdecl : mutual_inductive_body) (i : nat) (idecl : one_inductive_body) diff --git a/template-coq/theories/Universes.v b/template-coq/theories/Universes.v index d5ccb7008..981e99c46 100644 --- a/template-coq/theories/Universes.v +++ b/template-coq/theories/Universes.v @@ -118,30 +118,6 @@ Module Level. all: intro; now constructor. Qed. - (* Bonus *) - Definition eqb (l1 l2 : Level.t) : bool - := match compare l1 l2 with Eq => true | _ => false end. - - Global Instance eqb_refl : Reflexive eqb. - Proof. - intros []; unfold eqb; cbnr. - - rewrite (ssreflect.iffRL (string_compare_eq _ _)). all: auto. reflexivity. - - rewrite Nat.compare_refl. reflexivity. - Qed. - - Lemma eqb_spec l l' : reflect (eq l l') (eqb l l'). - Proof. - destruct l, l'; cbn; try constructor; try reflexivity; try discriminate. - - apply iff_reflect. unfold eqb; cbn. - destruct (CompareSpec_string t0 t1); split; intro HH; - try reflexivity; try discriminate; try congruence. - all: inversion HH; subst; now apply irreflexivity in H. - - apply iff_reflect. unfold eqb; cbn. - destruct (Nat.compare_spec n n0); split; intro HH; - try reflexivity; try discriminate; try congruence. - all: inversion HH; subst; now apply Nat.lt_irrefl in H. - Qed. - Definition eq_level l1 l2 := match l1, l2 with | Level.lzero, Level.lzero => true @@ -149,7 +125,7 @@ Module Level. | Level.Var n1, Level.Var n2 => ReflectEq.eqb n1 n2 | _, _ => false end. - + #[global, program] Instance reflect_level : ReflectEq Level.t := { eqb := eq_level }. @@ -163,6 +139,19 @@ Module Level. - destruct (ReflectEq.eqb_spec n n0) ; nodec. constructor. subst. reflexivity. Defined. + + Global Instance eqb_refl : @Reflexive Level.t eqb. + Proof. + intros x. apply ReflectEq.eqb_refl. + Qed. + + Definition eqb := eq_level. + + Lemma eqb_spec l l' : reflect (eq l l') (eqb l l'). + Proof. + apply reflectProp_reflect. + now generalize (eqb_spec l l'). + Qed. Definition eq_leibniz (x y : t) : eq x y -> x = y := id. diff --git a/template-coq/theories/utils/wGraph.v b/template-coq/theories/utils/wGraph.v index c6074319c..a16c880d6 100644 --- a/template-coq/theories/utils/wGraph.v +++ b/template-coq/theories/utils/wGraph.v @@ -1132,7 +1132,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module | None => false end. - Lemma is_nonpos_spec n : is_nonpos n <~> ∑ z, n = Some z /\ z <= 0. + Lemma is_nonpos_spec n : is_nonpos n <-> exists z, n = Some z /\ z <= 0. Proof using Type. unfold is_nonpos. split. @@ -1388,7 +1388,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module Qed. Lemma le_Some_lsp {n x y} : (Some n <= lsp x y)%nbar -> - ∑ k, lsp x y = Some k /\ n <= k. + exists k, lsp x y = Some k /\ n <= k. Proof using Type. destruct lsp eqn:xy. simpl. intros. eexists; split; eauto. @@ -1577,9 +1577,10 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module now simpl. Qed. - Lemma is_acyclic_correct : reflect acyclic_no_loop is_acyclic. + Lemma is_acyclic_correct : reflectProp acyclic_no_loop is_acyclic. Proof using HI. - eapply reflect_logically_equiv. eapply acyclic_caract2. + eapply reflect_reflectProp, reflect_logically_equiv. + eapply acyclic_caract2. apply VSet_Forall_reflect; intro x. destruct (lsp x x). destruct z. constructor; reflexivity. all: constructor; discriminate. @@ -1720,7 +1721,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module * rewrite weight_SPath_sub; lia. Qed. - Lemma lsp_pathOf {x y} (p : PathOf G x y) : ∑ n, lsp G x y = Some n /\ weight p <= n. + Lemma lsp_pathOf {x y} (p : PathOf G x y) : exists n, lsp G x y = Some n /\ weight p <= n. Proof using HG HI. pose proof (lsp0_spec_le G (simplify2' G p)) as ineq. unfold lsp in *. @@ -1969,7 +1970,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module * rewrite weight_SPath_sub; lia. Qed. - Lemma lsp_pathOf {x y} (p : PathOf G x y) : ∑ n, lsp G x y = Some n. + Lemma lsp_pathOf {x y} (p : PathOf G x y) : exists n, lsp G x y = Some n. Proof using HI. pose proof (lsp0_spec_le G (simplify2' G p)) as ineq. unfold lsp in *. @@ -2618,8 +2619,8 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module Definition reroot_spath_aux G s x z (p : SPath G s x z) y : VSet.In y (snodes G p) -> forall s' (q : SPath G s' z x), - Disjoint s s' -> { c : SPath G (VSet.union s s') y y | - sweight c = sweight p + sweight q }. + Disjoint s s' -> exists c : SPath G (VSet.union s s') y y, + sweight c = sweight p + sweight q . Proof. elim: p=> {x z}[s0 x|s0 s1 x y' z disj01 e p ih] /=. - move=> /VSetFact.empty_iff []. @@ -2639,7 +2640,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module Lemma reroot_spath G s x (p : SPath G s x x) y : VSet.In y (snodes G p) -> - { c : SPath G s y y | sweight c = sweight p } . + exists c : SPath G s y y, sweight c = sweight p. Proof. move=> yinp. pose (rx := spath_refl G VSet.empty x). @@ -2650,8 +2651,7 @@ Module WeightedGraph (V : UsualOrderedType) (VSet : MSetInterface.S with Module + apply: (SPath_sub _ _ c). move=> ? /VSet.union_spec [//|/VSet.empty_spec[]]. + rewrite weight_SPath_sub wc /rx /=; lia. - Defined. - + Qed. Section MapSPath. Context {G1 G2} (on_edge : forall x y, EdgeOf G1 x y -> EdgeOf G2 x y). From 3a0f2263eadff872f5fa1b1799eed867de946f0e Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Tue, 19 Jul 2022 17:15:40 +0200 Subject: [PATCH 32/43] Finish proving EtaExpand.v and remove Prints --- template-coq/theories/EtaExpand.v | 90 +++++++++++++++++-------- template-coq/theories/TemplateCheckWf.v | 2 - 2 files changed, 61 insertions(+), 31 deletions(-) diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index 42b891bfb..18f194028 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -222,6 +222,8 @@ Fixpoint eta_module_decl Σ impl eta_modtype {struct impl}:= Definition eta_module_type_decl Σ (modtype: list (kername × structure_field)) := map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype. + Definition eta_structure_body Σ (sb: list (kername × structure_field)) := eta_module_type_decl Σ sb. + Definition eta_global_declaration (Σ : GlobalEnvMap.t) decl : global_decl := match decl with | ConstantDecl cb => ConstantDecl (eta_global_decl Σ cb) @@ -1522,6 +1524,48 @@ Lemma eta_context_length g n ctx : #|eta_context g n ctx| = #|ctx|. Proof. now rewrite /eta_context; len. Qed. #[export] Hint Rewrite @eta_context_length : len. +Lemma eta_expand_constant_decl_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) c : + repr_decls Σg Σ -> + Typing.wf_ext Σ -> + on_constant_decl (lift_typing typing) Σ c -> + expanded_constant_decl Σ (eta_global_decl Σg c). +Proof. + intros hrepr wf ond. + destruct c as [na body ty rel]; cbn in *. + destruct body. constructor => //; cbn. + apply (eta_expand_expanded (Σ := Σ) [] [] t0 na wf ond). constructor. + apply hrepr. + destruct ond as [s Hs]. constructor => //. +Qed. + +Lemma eta_expand_inductive_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) kn m : + repr_decls Σg Σ -> + Typing.wf_ext Σ -> + on_inductive cumul_gen (lift_typing typing) Σ kn m -> + expanded_minductive_decl Σ (eta_minductive_decl Σg m). +Proof. + intros hrepr wf ond. + destruct ond as [onI onP onN onV]. + constructor. cbn. + eapply eta_expand_context => //. + solve_all. cbn. eapply All_map, Alli_All; tea => n idecl oni. + constructor. + cbn. solve_all. + pose proof oni.(onConstructors). + red in X. + eapply All2_All_left; tea; cbn => cdecl cunivs onc. + constructor. cbn. len. + pose proof onc.(on_cargs). + eapply eta_expand_context_sorts in X0. now len in X0. exact hrepr. + len. len. + pose proof onc.(on_ctype). destruct X0. + epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None #|ind_bodies m|) _ _ wf t0). + forward H. rewrite -arities_context_length. + clear. induction (arities_context _); constructor; auto. + specialize (H _ hrepr). + now rewrite map_repeat in H. +Qed. + Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) kn d : repr_decls Σg Σ -> Typing.wf_ext Σ -> @@ -1529,36 +1573,24 @@ Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) expanded_decl Σ (eta_global_declaration Σg d). Proof. intros hrepr wf ond. + assert (H_md_sf_sd: (forall (m : module_decl) (e : on_module_decl cumul_gen (lift_typing typing) Σ m), expanded_module_decl Σ (eta_module_decl Σg m.1 (eta_module_type_decl Σg m.2))) × + (forall (p : kername × structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ p), expanded_structure_field Σ (p.1, (eta_structure_field Σg p.2))) × + (forall (s : structure_body structure_field) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). + { + unshelve eapply (on_moddecl_structfield_structbody_mutrect cumul_gen (lift_typing typing) Σ); try now constructor; simpl. + - intros. constructor. now apply eta_expand_constant_decl_expanded. + - intros. constructor. now eapply eta_expand_inductive_expanded. + - intros kn' [impl modtype]. constructor. apply H. + - intros kn' [impl modtype] H. red in H. simpl. + apply (expanded_mi_algebraic_decl Σ kn' (impl, (eta_module_type_decl Σg modtype))). + - intros hd tl Hosf Hesf Hosb Hesb. simpl. constructor; now destruct hd as [kn0 sf]. + } destruct d; cbn in *. - - unfold on_constant_decl in ond. - destruct c as [na body ty rel]; cbn in *. - destruct body. constructor => //; cbn. - apply (eta_expand_expanded (Σ := Σ) [] [] t0 na wf ond). constructor. - apply hrepr. - destruct ond as [s Hs]. constructor => //. - - destruct ond as [onI onP onN onV]. - constructor. cbn. - eapply eta_expand_context => //. - solve_all. cbn. eapply All_map, Alli_All; tea => n idecl oni. - constructor. - cbn. solve_all. - pose proof oni.(onConstructors). - red in X. - eapply All2_All_left; tea; cbn => cdecl cunivs onc. - constructor. cbn. len. - pose proof onc.(on_cargs). - eapply eta_expand_context_sorts in X0. now len in X0. exact hrepr. - len. len. - pose proof onc.(on_ctype). destruct X0. - epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None #|ind_bodies m|) _ _ wf t0). - forward H. rewrite -arities_context_length. - clear. induction (arities_context _); constructor; auto. - specialize (H _ hrepr). - now rewrite map_repeat in H. - (** FIXME: prove for module and module type *) - - admit. - - admit. -Admitted. + - now apply eta_expand_constant_decl_expanded. + - now simple eapply eta_expand_inductive_expanded. + - destruct m as [impl modtype]. simpl. apply H_md_sf_sd in ond. apply ond. + - now apply H_md_sf_sd. +Qed. Lemma eta_context_assumptions Σ n Γ : context_assumptions Γ = context_assumptions (eta_context Σ n Γ). Proof. diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 641de043a..3f7733228 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -53,8 +53,6 @@ Fixpoint wfterm (t : term) : bool := From Coq Require Import ssrbool. -Print List.fold_left. - Fixpoint wf_module_decl_aux impl wf_modtype := match impl with | mi_abstract => wf_modtype From e1101bfd283c9145c174c951c9d24bc9048c556a Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Wed, 20 Jul 2022 16:41:23 +0200 Subject: [PATCH 33/43] Extend print_env for module (type) declarations --- template-coq/theories/Pretty.v | 56 ++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/template-coq/theories/Pretty.v b/template-coq/theories/Pretty.v index d97c9941f..114bda02d 100644 --- a/template-coq/theories/Pretty.v +++ b/template-coq/theories/Pretty.v @@ -318,6 +318,41 @@ Module PrintTermTree. let names := fresh_names Σ' [] (mie_arities_context mie) in ("Inductive " ^ print_list (print_one_ind_entry Σ' with_universes short names mie) nl mie.(mind_entry_inds) ^ "." ^ nl). + + Definition print_const_decl kn cb with_universes (short: bool) Σ' := + (match cb.(cst_body) with | Some _ => "Definition " | None => "Axiom " end) ^ + string_of_kername kn ^ " : " ^ print_term Σ' with_universes nil true cb.(cst_type) ^ + match cb.(cst_body) with + | Some b => if short then ("..." ^ nl) else (" := " ^ nl ^ print_term Σ' with_universes nil true b ^ "." ^ nl) + | None => "." + end. + + Print "×". + + + Definition print_assoc_list {A B: Type} (f: A -> B -> t) (sep: t) (l : list (prod A B)) : t := + let fix aux l := match l return t with + | nil => "" + | cons (kn, a) nil => f kn a + | cons (kn, a) l => (f kn a) ^ sep ^ aux l + end in aux l. + + Fixpoint print_module_decl kn impl modtype_str with_universes (short: bool) (Σ: global_env) {struct impl}:= + let kn_string := string_of_kername kn in match impl with + | mi_abstract => "Module " ^ kn_string ^ "." + | mi_algebraic kn' => "Module " ^ kn_string ^ " := " ^ (string_of_kername kn') ^ "." + | mi_struct sb => + let sb_str := if short then string "..." else print_assoc_list (print_structure_field with_universes short Σ) nl sb in + "Module " ^ kn_string ^ ". " ^ sb_str ^ " End " ^ kn_string ^ "." + | mi_fullstruct => "Module " ^ kn_string ^ ". " ^ modtype_str ^ " End " ^ kn_string ^ "." + end ^ if short then string "" else "Module Type: " ^ nl ^ modtype_str + with print_structure_field with_universes (short: bool) (Σ: global_env) kn sf {struct sf}: t := + match sf with + | sfconst cb => let Σ' := (Σ, cb.(cst_universes)) in print_const_decl kn cb with_universes short Σ' + | sfmind mib => print_mib Σ with_universes short mib + | sfmod (impl, modtype) => print_module_decl kn impl (print_assoc_list (print_structure_field with_universes short Σ) nl modtype) with_universes short Σ + | sfmodtype mt => print_assoc_list (print_structure_field with_universes short Σ) nl mt + end. Fixpoint print_env_aux with_universes (short : bool) (prefix : nat) (Σ : global_env) (acc : t) : t := match prefix with @@ -331,19 +366,14 @@ Module PrintTermTree. print_env_aux with_universes short n Σ (print_mib Σ with_universes short mib ^ acc) | (kn, ConstantDecl cb) :: Σ => let Σ' := ({| Env.universes := univs; declarations := Σ |}, cb.(cst_universes)) in - print_env_aux with_universes short n Σ'.1 - ((match cb.(cst_body) with - | Some _ => "Definition " - | None => "Axiom " - end) ^ string_of_kername kn ^ " : " ^ print_term Σ' with_universes nil true cb.(cst_type) ^ - match cb.(cst_body) with - | Some b => - if short then ("..." ^ nl) - else (" := " ^ nl ^ print_term Σ' with_universes nil true b ^ "." ^ nl) - | None => "." - end ^ acc) - (** FIXME: print module and module type declarations *) - | _ => "" + print_env_aux with_universes short n Σ'.1 (print_const_decl kn cb with_universes short Σ' ^ acc) + | (kn, ModuleDecl (impl, modtype)) :: Σ => + let Σ := {| Env.universes := univs; declarations := Σ |} in + let modtype_str := print_assoc_list (print_structure_field with_universes short Σ) nl modtype in + print_env_aux with_universes short n Σ (print_module_decl kn impl modtype_str with_universes short Σ ^ acc) + | (kn, ModuleTypeDecl mt) :: Σ => + let Σ := {| Env.universes := univs; declarations := Σ |} in + print_assoc_list (print_structure_field with_universes short Σ) nl mt end end. From be8b6e9656bd2c37f2f66dbcc886d9941e89395b Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 1 Dec 2022 20:45:18 +0800 Subject: [PATCH 34/43] Before updating to coq-8.16 --- examples/modules.v | 90 +++++++++++++++++++++++++ template-coq/src/plugin_core.ml | 6 +- template-coq/theories/TemplateCheckWf.v | 35 +++++++--- 3 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 examples/modules.v diff --git a/examples/modules.v b/examples/modules.v new file mode 100644 index 000000000..7b4aa0761 --- /dev/null +++ b/examples/modules.v @@ -0,0 +1,90 @@ +From MetaCoq.Template Require Import All. +Import MCMonadNotation. + + Inductive roseTree := + | node (xs : list roseTree). + (* | node_nil + | node_cons (r: roseTree) (xs: roseTree). *) + +Inductive All {A} (P : A -> Prop) : list A -> Prop := + | All_nil : All P nil + | All_cons : forall (x : A) (l : list A), + P x -> All P l -> All P (cons x l). + + (* Check roseTree_ind. + Theorem roseTree_ind' : forall P : roseTree -> Prop, + (forall (xs : list roseTree) (allxs : All P xs), P (node xs)) -> forall r : roseTree, P r. + Proof. + intros P IH r. destruct r. induction xs; apply IH. + - apply All_nil. + - specialize (IH (cons r xs)). + + *) + +Module M. + MetaCoq Quote Recursively Definition a := 0. + Print a. + Module N. + MetaCoq Quote Recursively Definition b := 0. + Print b. (* should see a, b in env *) + Check a. + Module N1. + MetaCoq Quote Recursively Definition b := 0. + Print b. (* should see a, b in env *) + Check a. + End N1. + End N. + MetaCoq Quote Recursively Definition c := 0. + Print c. (* should see a in env *) +End M. + +Module N := M. + + +MetaCoq Run (tmQuoteModule "M"%bs >>= tmPrint). +MetaCoq Run (tmQuoteModule "N"%bs >>= tmPrint). + +MetaCoq Quote Recursively Definition a := 0. + +Module MM := M. +MetaCoq Run (tmQuoteModule "MM"%bs >>= tmPrint). + +Print a. + +Module M1. + Definition b1 := 0. + + MetaCoq Quote Recursively Definition a := 0. + Print a. + Module N1. + End N1. + MetaCoq Test Quote "N1"%bs. + Module M := N1. + MetaCoq Test Quote "M"%bs. + + + Definition div (n m: nat) := exists d: nat, d * n = m. + Definition div_strict (a b: nat) := (div a b) /\ (a <> b). (* Strict partial order *) + Theorem one_div_everything (n: nat): div 1 n. + Proof. + induction n. now exists 0. + now exists (S n). + Qed. + + Definition b2 := true. + + Module N2. + MetaCoq Quote Recursively Definition c := 100. + Print c. + End N2. + + Definition b3 := "b3". +End M1. + +Definition a1 := "a1". + +Module M2. + Definition b4 := "b4". +End M2. + +Definition a2 := "a2". diff --git a/template-coq/src/plugin_core.ml b/template-coq/src/plugin_core.ml index 41fdfa465..5c3113218 100644 --- a/template-coq/src/plugin_core.ml +++ b/template-coq/src/plugin_core.ml @@ -168,7 +168,7 @@ let tmQuoteUniverses : UGraph.t tm = let quote_module (qualid : qualid) : global_reference list = let mp = Nametab.locate_module qualid in let mb = Global.lookup_module mp in - let rec aux mb = + let rec aux mp mb = let open Declarations in let me = mb.mod_expr in let get_refs s = @@ -178,7 +178,7 @@ let quote_module (qualid : qualid) : global_reference list = match field with | SFBconst _ -> [GlobRef.ConstRef (Constant.make2 mp label)] | SFBmind _ -> [GlobRef.IndRef (MutInd.make2 mp label, 0)] - | SFBmodule mb -> aux mb + | SFBmodule mb -> aux (MPdot (mp,label)) mb | SFBmodtype mtb -> [] in CList.map_append get_ref body @@ -188,7 +188,7 @@ let quote_module (qualid : qualid) : global_reference list = | Algebraic _ -> [] | Struct s -> get_refs s | FullStruct -> get_refs mb.Declarations.mod_type - in aux mb + in aux mp mb let tmQuoteModule (qualid : qualid) : global_reference list tm = fun ~st env evd success _fail -> diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 3f7733228..90bf9d7ea 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -10,19 +10,34 @@ Open Scope bs_scope. Definition eta_expand p := EtaExpand.eta_expand_program p. +Definition check_const_decl_def kn const_decl : TemplateMonad unit := + match const_decl.(cst_body) with + | Some body => + tmMsg ("Unquoting eta-expanded " ++ string_of_kername kn)%bs ;; + tmUnquote body ;; + tmMsg ("Succeeded") + | None => ret tt + end. + +Fixpoint check_mod_decl_def kn impl modtype {struct impl}:= + match impl with + | mi_struct sb => let _ := map (fun '(kn, sf) => check_structure_field_def kn sf) sb in ret tt + | _ => ret tt + end +with check_structure_field_def kn sf := + match sf with + | sfconst cb => check_const_decl_def kn cb + | sfmind _ => ret tt + | sfmod (impl, modtype) => check_mod_decl_def kn impl modtype + | sfmodtype sb => let _ := map (fun '(kn, sf) => check_structure_field_def kn sf) sb in ret tt + end. + Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with - | ConstantDecl cb => - match cb.(cst_body) with - | Some body => - tmMsg ("Unquoting eta-expanded " ++ string_of_kername d.1)%bs ;; - tmUnquote body ;; - tmMsg ("Succeeded") - | None => ret tt - end + | ConstantDecl cb => check_const_decl_def d.1 cb | InductiveDecl idecl => ret tt - (** FIXME: define unquoting for modules *) - | _ => tmMsg ("Succeeded") + | ModuleDecl (impl, modtype) => check_mod_decl_def d.1 impl modtype + | ModuleTypeDecl sb => let _ := map (fun '(kn,sf) => check_structure_field_def kn sf) sb in ret tt end. Definition is_nil {A} (l : list A) := From 2ee944eb60dd3995bc24caffc7c23d62d760e4ea Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 1 Dec 2022 20:45:39 +0800 Subject: [PATCH 35/43] fixup this --- pcuic/theories/utils/PCUICPretty.v | 1 + 1 file changed, 1 insertion(+) diff --git a/pcuic/theories/utils/PCUICPretty.v b/pcuic/theories/utils/PCUICPretty.v index 796f6d879..c9fe7d8e4 100644 --- a/pcuic/theories/utils/PCUICPretty.v +++ b/pcuic/theories/utils/PCUICPretty.v @@ -311,6 +311,7 @@ Module PrintTermTree. else (" := " ^ nl ^ print_term Σ' true nil true false b ^ "." ^ nl) | None => "." end ^ acc) + | _ => "" end end. From ab8605684d76d218fc54a7b0b920a2ef4ad22dc3 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Sat, 3 Dec 2022 11:37:42 +0800 Subject: [PATCH 36/43] Fix some proofs --- template-coq/theories/EnvironmentTyping.v | 153 +++++----------------- template-coq/theories/Universes.v | 13 -- 2 files changed, 30 insertions(+), 136 deletions(-) diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index dbce7c785..e0cbe5b04 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -1379,7 +1379,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT --- apply X1.(onIndices). -- red in onP. red. eapply All_local_env_impl; eauto. - Qed. + Qed. Lemma on_global_decl_impl {cf : checker_flags} Pcmp P Q Σ kn d : (forall Γ t T, @@ -1418,8 +1418,15 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT P Σ Γ t T -> Q Σ Γ t T) -> forall Σ, on_global_env Pcmp P Σ -> on_global_env Pcmp Q Σ. Proof. - intros X [univs Σ] [cu X0]; split => /= //. cbn in *. - induction X0; constructor; auto. + intros X Σ [cu IH]. split; auto. + revert cu IH; generalize (universes Σ) as univs, (retroknowledge Σ) as retro, (declarations Σ). clear Σ. + induction g; intros; auto. constructor; auto. + depelim IH. specialize (IHg cu IH). constructor; auto. + pose proof (globenv_decl _ _ _ _ _ _ _ IH o). + destruct o. constructor; auto. + assert (X' := fun Γ t T => X ({| universes := univs; declarations := _ |}, udecl0) Γ t T + (cu, IH) (cu, IHg)); clear X. + rename X' into X. eapply on_global_decl_impl; tea. - intros; apply X => //. - split => //. @@ -1506,90 +1513,24 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) - destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - - red in o. simpl in *. - destruct o0 as [onI onP onNP]. - constructor; auto. - -- eapply Alli_impl; tea. intros. - refine {| ind_arity_eq := X1.(ind_arity_eq); - ind_cunivs := X1.(ind_cunivs) |}. - --- apply onArity in X1. unfold on_type in *; simpl in *. - now eapply X. - --- pose proof X1.(onConstructors) as X11. red in X11. - eapply All2_impl; eauto. - simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. - * apply X; eauto. - * clear -X0 X on_cargs0. revert on_cargs0. - generalize (cstr_args x0). - induction c in y |- *; destruct y; simpl; auto; - destruct a as [na [b|] ty]; simpl in *; auto; - split; intuition eauto. - * clear -X0 X on_cindices0. - revert on_cindices0. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). - induction 1; simpl; constructor; auto. - --- simpl; intros. pose (onProjections X1 H0). simpl in *; auto. - --- destruct X1. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. - * apply ind_sorts0. - * destruct indices_matter; auto. - eapply type_local_ctx_impl; eauto. - eapply ind_sorts0. - --- eapply X1.(onIndices). - -- red in onP. red. - eapply All_local_env_impl; tea. + - simpl in *. apply on_inductive_decl_impl with (P := P); auto. + unfold on_global_env; auto. - simpl in *. - assert (udecl = Monomorphic_ctx). { auto. } - rewrite H0 in o,o0. - assert (udecl0 = Monomorphic_ctx). { auto. } - rewrite H1 in o1,o2,X. - clear H0 H1 udecl udecl0. - remember ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) as gex. + assert (udecl0 = Monomorphic_ctx) by auto. + rewrite H0 in on_udecl_udecl0, on_global_decl_d0, X. + assert (udecl1 = Monomorphic_ctx) by auto. + rewrite H1 in on_udecl_udecl1, on_global_decl_d1. + clear H0 H1 udecl0 udecl1. + remember ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx) as gex; simpl in *. cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). - -- intro md_sf_sb. apply md_sf_sb. exact o0. + -- intro md_sf_sb. apply md_sf_sb. exact on_global_decl_d0. -- apply on_moddecl_structfield_structbody_mutrect. --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - --- intros. apply on_sfmind. - { - red in o. simpl in *. - destruct o3 as [onI onP onNP]. - constructor; auto. - -- eapply Alli_impl; tea. intros. - refine {| ind_arity_eq := X1.(ind_arity_eq); - ind_cunivs := X1.(ind_cunivs) |}. - --- apply onArity in X1. unfold on_type in *; simpl in *. - now eapply X. - --- pose proof X1.(onConstructors) as X11. red in X11. - eapply All2_impl; eauto. - simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. - * apply X; eauto. - * clear -X0 X on_cargs0. revert on_cargs0. - generalize (cstr_args x0). - induction c in y |- *; destruct y; simpl; auto; - destruct a as [na [b|] ty]; simpl in *; auto; - split; intuition eauto. - * clear -X0 X on_cindices0. - revert on_cindices0. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). - induction 1; simpl; constructor; auto. - --- simpl; intros. pose (onProjections X1 H0). simpl in *; auto. - --- destruct X1. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. - * apply ind_sorts0. - * destruct indices_matter; auto. - eapply type_local_ctx_impl; eauto. - eapply ind_sorts0. - --- eapply X1.(onIndices). - -- red in onP. red. - eapply All_local_env_impl; tea. - } + --- intros. apply on_sfmind. apply on_inductive_decl_impl with (P:=P); auto. + unfold on_global_env. rewrite Heqgex; auto. --- intros. now apply on_sfmod. --- intros. now apply on_sfmodtype. --- intros. now apply on_mi_abstract_decl. @@ -1600,54 +1541,20 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) --- intros. now apply on_sb_cons. - simpl in *. - assert (udecl = Monomorphic_ctx). { auto. } - rewrite H0 in o,o0. - assert (udecl0 = Monomorphic_ctx). { auto. } - rewrite H1 in o1,o2,X. - clear H0 H1 udecl udecl0. - remember ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) as gex. + assert (udecl0 = Monomorphic_ctx) by auto. + rewrite H0 in on_udecl_udecl0, on_global_decl_d0, X. + assert (udecl1 = Monomorphic_ctx) by auto. + rewrite H1 in on_udecl_udecl1, on_global_decl_d1. + clear H0 H1 udecl0 udecl1. + remember ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx) as gex; simpl in *. cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). - -- intro md_sf_sb. apply md_sf_sb. exact o0. + -- intro md_sf_sb. apply md_sf_sb. exact on_global_decl_d0. -- apply on_moddecl_structfield_structbody_mutrect. --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - --- intros. apply on_sfmind. - { - red in o. simpl in *. - destruct o3 as [onI onP onNP]. - constructor; auto. - -- eapply Alli_impl; tea. intros. - refine {| ind_arity_eq := X1.(ind_arity_eq); - ind_cunivs := X1.(ind_cunivs) |}. - --- apply onArity in X1. unfold on_type in *; simpl in *. - now eapply X. - --- pose proof X1.(onConstructors) as X11. red in X11. - eapply All2_impl; eauto. - simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. - * apply X; eauto. - * clear -X0 X on_cargs0. revert on_cargs0. - generalize (cstr_args x0). - induction c in y |- *; destruct y; simpl; auto; - destruct a as [na [b|] ty]; simpl in *; auto; - split; intuition eauto. - * clear -X0 X on_cindices0. - revert on_cindices0. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). - induction 1; simpl; constructor; auto. - --- simpl; intros. pose (onProjections X1 H0). simpl in *; auto. - --- destruct X1. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. - * apply ind_sorts0. - * destruct indices_matter; auto. - eapply type_local_ctx_impl; eauto. - eapply ind_sorts0. - --- eapply X1.(onIndices). - -- red in onP. red. - eapply All_local_env_impl; tea. - } + --- intros. apply on_sfmind. apply on_inductive_decl_impl with (P:=P); auto. + unfold on_global_env. rewrite Heqgex; auto. --- intros. now apply on_sfmod. --- intros. now apply on_sfmodtype. --- intros. now apply on_mi_abstract_decl. diff --git a/template-coq/theories/Universes.v b/template-coq/theories/Universes.v index 0e7861a67..9375bc449 100644 --- a/template-coq/theories/Universes.v +++ b/template-coq/theories/Universes.v @@ -153,19 +153,6 @@ Module Level. now generalize (eqb_spec l l'). Qed. - Global Instance eqb_refl : @Reflexive Level.t eqb. - Proof. - intros x. apply ReflectEq.eqb_refl. - Qed. - - Definition eqb := eq_level. - - Lemma eqb_spec l l' : reflect (eq l l') (eqb l l'). - Proof. - apply reflectProp_reflect. - now generalize (eqb_spec l l'). - Qed. - Definition eq_leibniz (x y : t) : eq x y -> x = y := id. Definition eq_dec : forall (l1 l2 : t), {l1 = l2}+{l1 <> l2} := Classes.eq_dec. From 53afd12bfa883b8f310c49adfbaf965fa77454d5 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Sat, 3 Dec 2022 16:34:58 +0800 Subject: [PATCH 37/43] More fixes --- template-coq/theories/EtaExpand.v | 63 ++++----- template-coq/theories/Pretty.v | 7 +- template-coq/theories/Typing.v | 227 +++++++++++++++--------------- 3 files changed, 138 insertions(+), 159 deletions(-) diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index 39380328d..e304bd42f 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -1416,19 +1416,14 @@ Lemma expanded_decl_env_irrel (Σ Σ' : global_env) t : Proof. intros hrepr. unfold expanded_decl. - destruct t => //. - intros hrepr. cut ((forall (m : module_decl), expanded_module_decl Σ m -> expanded_module_decl Σ' m) /\ (forall (p : kername × structure_field), expanded_structure_field Σ p -> expanded_structure_field Σ' p) /\ (forall (s : structure_body structure_field), expanded_structure_body Σ s -> expanded_structure_body Σ' s)). intros [Hmd [Hsf Hsb]]. - unfold expanded_decl. destruct t => //; auto. - intros []. constructor. - - - destruct (cst_body c) => //. cbn in *. + - intros []. constructor. + destruct (cst_body c) => //. cbn in *. now eapply expanded_env_irrel. - - intros []. split. eapply expanded_context_env_irrel; tea. solve_all. @@ -1436,17 +1431,14 @@ Proof. solve_all. destruct H; split. eapply expanded_context_env_irrel; tea. eapply expanded_env_irrel; tea. - - - eapply expanded_moddecl_structfield_structbody_mutind; intros; try now constructor. + - apply expanded_moddecl_structfield_structbody_mutind; try now constructor. -- repeat constructor. destruct e. destruct (cst_body c) => //. cbn in *. now eapply expanded_env_irrel. - -- constructor. revert e. - intros []. split. - eapply expanded_context_env_irrel; tea. - solve_all. - destruct H. constructor. - solve_all. destruct H; split. - eapply expanded_context_env_irrel; tea. - eapply expanded_env_irrel; tea. + -- constructor. split; destruct e; solve_all. + + eapply expanded_context_env_irrel; tea. + + destruct H. constructor. + solve_all. destruct H; split. + eapply expanded_context_env_irrel; tea. + eapply expanded_env_irrel; tea. Qed. Coercion wf_ext_wf : wf_ext >-> wf. @@ -1608,7 +1600,10 @@ Proof. Qed. Lemma same_cstr_info_eta (Σ : global_env) (Σg: GlobalEnvMap.t) : - same_cstr_info Σ {| universes := Σ.(universes) ; declarations := List.map (on_snd (eta_global_declaration Σg)) Σ.(declarations) |}. + same_cstr_info Σ + {| universes := Σ.(universes) ; + declarations := List.map (on_snd (eta_global_declaration Σg)) Σ.(declarations); + retroknowledge := Σ.(retroknowledge) |}. Proof. destruct Σ as [univs Σ]; cbn. induction Σ; intros ind idx mdecl idecl cdecl. @@ -1616,7 +1611,7 @@ Proof. cbn => [[[]]] //. - unfold declared_constructor, declared_inductive, declared_minductive. cbn. destruct a as [kn decl]; cbn. - case: eqb_spec. + case: eqb_spec. * move=> _ [] [] [= ->] hnth hnth'. do 3 eexists; cbn. split. split. split => //. cbn. rewrite nth_error_map hnth; reflexivity. @@ -1647,15 +1642,15 @@ Proof. apply lookup_global_Some_fresh. Qed. -Lemma lookup_global_extends Σ Σ' kn d : +Lemma lookup_global_extends Σ Σ' kn d : lookup_env Σ kn = Some d -> extends_decls Σ Σ' -> EnvMap.fresh_globals Σ'.(declarations) -> lookup_env Σ' kn = Some d. Proof. - destruct Σ as [univs Σ]. - destruct Σ' as [univs' Σ']. - cbn. move=> hl [] /=; intros <- [Σ'' ->]. + destruct Σ as [univs Σ retro]. + destruct Σ' as [univs' Σ' retro']. + cbn. move=> hl [] /=; intros <- [Σ'' ->] extretro. induction Σ''; cbn; auto. case: eqb_spec. - intros ->. intros fr. @@ -1676,30 +1671,24 @@ Proof. assert (extends_decls env env). red; split => //. now exists []. revert X. move: map repr wf. - generalize env at 1 2 4 6. - destruct env as [univs' decls]. cbn in *. + generalize env at 1 2 4 6 7. + destruct env as [univs' decls retro']. cbn in *. induction ond; cbn; constructor; auto. - apply: IHond. cbn. deapply: IHond. - { cbn. destruct X as [truct X as [equ [Σ' exqu [Σ' ext]]. red. split. auto. - rewrite ext. cbn. unfold snoc. exists (Σ' ++ [(kn, d)])%list. now rewrite -app_assoc. - set]]. red. split. auto. + apply: IHond. + { cbn. destruct X as [equ [Σ' ext]]. red. split. auto. rewrite ext. cbn. unfold snoc. exists (Σ' ++ [(kn, d)])%list. now rewrite -app_assoc. apply e. } - set (Σ' := {| universes := univs''; declarations := Σ; retroknowledge := retro' |}) in * in *. + set (Σ' := {| universes := univs'; declarations := Σ; retroknowledge := retro' |}) in *. set (Σg := {| GlobalEnvMap.env := _ |}). Unshelve. - destruct X as [equ [Σ'' ext]]. set (Σg := {| GlobalEnvMap.env := _ |}). Unshelve. - destruct X as [equ [Σ'' ext]]. cbn in * in *. ddestruct env as [univs0 env]. cbn in *. subst univs0. - subst env. - struct env as [univs0 env]. cbn in *. subst univs0. + destruct X as [equ [Σ'' ext]]. cbn in *. destruct env as [univs0 env]. cbn in *. subst univs0. subst env. destruct o as [? udecl ? o0]. - pose proof (eta_expand_global_decl_expanded (Σ', udecl) (Σg, univs) (Σg, univs) kn d). + pose proof (eta_expand_global_decl_expanded (Σ', udecl) (Σg, univs) kn d). cbn in H. forward H. { move=> kn' d' /= hl. rewrite GlobalEnvMap.lookup_env_spec /=. cbn. unfold snoc. - eapply (lookup_global_extends {| universes := univs'; declarations := Σ |} - {| universes := univs'; declarations := (Σ'' ++ (kn, d) :: Σ)%list |}); eauto. + eapply (lookup_global_extends Σ' (set_declarations Σ' (Σ'' ++ (kn, d) :: Σ)%list)); eauto. split => //. cbn. now exists (Σ'' ++ [(kn, d)])%list; rewrite -app_assoc. } forward H. split. cbn. split => //. now cbn. specialize (H o0). diff --git a/template-coq/theories/Pretty.v b/template-coq/theories/Pretty.v index 6bbddc708..a03eb64a5 100644 --- a/template-coq/theories/Pretty.v +++ b/template-coq/theories/Pretty.v @@ -334,9 +334,6 @@ Module PrintTermTree. | None => "." end. - Print "×". - - Definition print_assoc_list {A B: Type} (f: A -> B -> t) (sep: t) (l : list (prod A B)) : t := let fix aux l := match l return t with | nil => "" @@ -386,11 +383,11 @@ Module PrintTermTree. | None => "." end ^ acc) | (kn, ModuleDecl (impl, modtype)) :: Σ => - let Σ := {| Env.universes := univs; declarations := Σ |} in + let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in let modtype_str := print_assoc_list (print_structure_field with_universes short Σ) nl modtype in print_env_aux with_universes short n Σ (print_module_decl kn impl modtype_str with_universes short Σ ^ acc) | (kn, ModuleTypeDecl mt) :: Σ => - let Σ := {| Env.universes := univs; declarations := Σ |} in + let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in print_assoc_list (print_structure_field with_universes short Σ) nl mt end end. diff --git a/template-coq/theories/Typing.v b/template-coq/theories/Typing.v index 09c2e0dd6..4217498da 100644 --- a/template-coq/theories/Typing.v +++ b/template-coq/theories/Typing.v @@ -1352,139 +1352,132 @@ Proof. apply lift_typing_impl with (1 := HT); intros ? Hs. apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). constructor 1. simpl. subst Σ' Σg; cbn; lia. - - (** Module Declaration *) - + simpl in *. - cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m - -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s - -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s)). + + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m + -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s + -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). * intros md_sf_sb. apply md_sf_sb. apply Xg. (** start of mutual induction *) * apply on_moddecl_structfield_structbody_mutrect. -- intros. apply on_sfconst. destruct c; simpl in *. - destruct cst_body0; apply lift_typing_impl with (1 := o1); intros ? Hs. + destruct cst_body0; apply lift_typing_impl with (1 := o0); intros ? Hs. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - - -- intros. apply on_sfmind. - destruct o1 as [onI onP onnp]; constructor; eauto. - --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). - constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. - clear IH; rename IH' into IH. - eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. - refine {| ind_arity_eq := Xg.(ind_arity_eq); - ind_cunivs := Xg.(ind_cunivs) |}. - ** apply onArity in Xg. - apply lift_typing_impl with (1 := Xg); intros ? Hs. - apply (IH (_; _; _; Hs)). - ** pose proof Xg.(onConstructors) as Xg'. - eapply All2_impl; eauto. intros. - destruct X13 as [cass tyeq onctyp oncargs oncind]. - unshelve econstructor; eauto. - { apply lift_typing_impl with (1 := onctyp); intros ? Hs. - apply (IH (_; _; _; Hs)). } - { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. - apply lift_typing_impl with (1 := HT'); intros ? Hs. - apply (IH (_; _; _; Hs)). } - { clear -IH oncind. - revert oncind. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). induction 1; constructor; auto. - do 2 red in t0 |- *. - apply (IH (_; (_; (_; t0)))). } - ** intros Hprojs; pose proof (onProjections Xg Hprojs); auto. - ** destruct Xg. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. apply ind_sorts0. destruct indices_matter; auto. - eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. - apply lift_typing_impl with (1 := HT); intros ? Hs. - apply (IH (_; _; _; Hs)). - ** apply (onIndices Xg). - --- red in onP |- *. - apply All_local_env_impl with (1 := onP); intros ??? HT. - apply lift_typing_impl with (1 := HT); intros ? Hs. - apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). - constructor 1. simpl. subst Σ' Σg; cbn; lia. - -- intros; now apply on_sfmod. - -- intros; now apply on_sfmodtype. - -- intros; now apply on_mi_abstract_decl. - -- intros; now apply on_mi_algebraic_decl. - -- intros; now apply on_mi_struct_decl. - -- intros; now apply on_mi_fullstruct_decl. - -- constructor. - -- intros. now apply on_sb_cons. - - + simpl in *. - cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m - -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s - -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ |}, Monomorphic_ctx) s)). + -- intros. apply on_sfmind. + destruct o0 as [onI onP onnp]; constructor; eauto. + --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). + constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. + clear IH; rename IH' into IH. + eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. + refine {| ind_arity_eq := Xg.(ind_arity_eq); + ind_cunivs := Xg.(ind_cunivs) |}. + ** apply onArity in Xg. + apply lift_typing_impl with (1 := Xg); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** pose proof Xg.(onConstructors) as Xg'. + eapply All2_impl; eauto. intros. + destruct X13 as [cass tyeq onctyp oncargs oncind]. + unshelve econstructor; eauto. + { apply lift_typing_impl with (1 := onctyp); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. + apply lift_typing_impl with (1 := HT'); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { clear -IH oncind. + revert oncind. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). induction 1; constructor; auto. + do 2 red in t0 |- *. + apply (IH (_; (_; (_; t0)))). } + ** pose proof (onProjections Xg); auto. + ** destruct Xg. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. apply ind_sorts0. destruct indices_matter; auto. + eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** apply (onIndices Xg). + --- red in onP |- *. + apply All_local_env_impl with (1 := onP); intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). + constructor 1. simpl. subst Σ' Σg; cbn; lia. + -- intros; now apply on_sfmod. + -- intros; now apply on_sfmodtype. + -- intros; now apply on_mi_abstract_decl. + -- intros; now apply on_mi_algebraic_decl. + -- intros; now apply on_mi_struct_decl. + -- intros; now apply on_mi_fullstruct_decl. + -- constructor. + -- intros. now apply on_sb_cons. + + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m + -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) + × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) + × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s + -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). * intros md_sf_sb. apply md_sf_sb. apply Xg. (** start of mutual induction *) * apply on_moddecl_structfield_structbody_mutrect. -- intros. apply on_sfconst. destruct c; simpl in *. - destruct cst_body0; apply lift_typing_impl with (1 := o1); intros ? Hs. + destruct cst_body0; apply lift_typing_impl with (1 := o0); intros ? Hs. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - - -- intros. apply on_sfmind. - destruct o1 as [onI onP onnp]; constructor; eauto. - --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). - constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. - clear IH; rename IH' into IH. - eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. - refine {| ind_arity_eq := Xg.(ind_arity_eq); - ind_cunivs := Xg.(ind_cunivs) |}. - ** apply onArity in Xg. - apply lift_typing_impl with (1 := Xg); intros ? Hs. - apply (IH (_; _; _; Hs)). - ** pose proof Xg.(onConstructors) as Xg'. - eapply All2_impl; eauto. intros. - destruct X13 as [cass tyeq onctyp oncargs oncind]. - unshelve econstructor; eauto. - { apply lift_typing_impl with (1 := onctyp); intros ? Hs. - apply (IH (_; _; _; Hs)). } - { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. - apply lift_typing_impl with (1 := HT'); intros ? Hs. - apply (IH (_; _; _; Hs)). } - { clear -IH oncind. - revert oncind. - generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). - generalize (cstr_indices x0). induction 1; constructor; auto. - do 2 red in t0 |- *. - apply (IH (_; (_; (_; t0)))). } - ** intros Hprojs; pose proof (onProjections Xg Hprojs); auto. - ** destruct Xg. simpl. unfold check_ind_sorts in *. - destruct Universe.is_prop; auto. - destruct Universe.is_sprop; auto. - split. apply ind_sorts0. destruct indices_matter; auto. - eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. - apply lift_typing_impl with (1 := HT); intros ? Hs. - apply (IH (_; _; _; Hs)). - ** apply (onIndices Xg). - --- red in onP |- *. - apply All_local_env_impl with (1 := onP); intros ??? HT. - apply lift_typing_impl with (1 := HT); intros ? Hs. - apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). - constructor 1. simpl. subst Σ' Σg; cbn; lia. - -- intros; now apply on_sfmod. - -- intros; now apply on_sfmodtype. - -- intros; now apply on_mi_abstract_decl. - -- intros; now apply on_mi_algebraic_decl. - -- intros; now apply on_mi_struct_decl. - -- intros; now apply on_mi_fullstruct_decl. - -- constructor. - -- intros. now apply on_sb_cons. + -- intros. apply on_sfmind. + destruct o0 as [onI onP onnp]; constructor; eauto. + --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). + constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. + clear IH; rename IH' into IH. + eapply Alli_impl; eauto. cbn in IH. clear onI onP onnp Xg. intros n x Xg. + refine {| ind_arity_eq := Xg.(ind_arity_eq); + ind_cunivs := Xg.(ind_cunivs) |}. + ** apply onArity in Xg. + apply lift_typing_impl with (1 := Xg); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** pose proof Xg.(onConstructors) as Xg'. + eapply All2_impl; eauto. intros. + destruct X13 as [cass tyeq onctyp oncargs oncind]. + unshelve econstructor; eauto. + { apply lift_typing_impl with (1 := onctyp); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { apply sorts_local_ctx_impl with (1 := oncargs); intros Γ' t' T' HT'. + apply lift_typing_impl with (1 := HT'); intros ? Hs. + apply (IH (_; _; _; Hs)). } + { clear -IH oncind. + revert oncind. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). induction 1; constructor; auto. + do 2 red in t0 |- *. + apply (IH (_; (_; (_; t0)))). } + ** pose proof (onProjections Xg); auto. + ** destruct Xg. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. apply ind_sorts0. destruct indices_matter; auto. + eapply type_local_ctx_impl. eapply ind_sorts0. intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH (_; _; _; Hs)). + ** apply (onIndices Xg). + --- red in onP |- *. + apply All_local_env_impl with (1 := onP); intros ??? HT. + apply lift_typing_impl with (1 := HT); intros ? Hs. + apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). + constructor 1. simpl. subst Σ' Σg; cbn; lia. + -- intros; now apply on_sfmod. + -- intros; now apply on_sfmodtype. + -- intros; now apply on_mi_abstract_decl. + -- intros; now apply on_mi_algebraic_decl. + -- intros; now apply on_mi_struct_decl. + -- intros; now apply on_mi_fullstruct_decl. + -- constructor. + -- intros. now apply on_sb_cons. - assert (forall Γ t T (Hty : Σ ;;; Γ |- t : T), typing_size Hty < typing_size H -> From e11975f7856f61a89b0c338c54dbb5b916029297 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Sat, 3 Dec 2022 16:35:31 +0800 Subject: [PATCH 38/43] Don't know how to derive reflection?? --- template-coq/theories/ReflectAst.v | 64 ++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/template-coq/theories/ReflectAst.v b/template-coq/theories/ReflectAst.v index 01cb872e8..f09da4930 100644 --- a/template-coq/theories/ReflectAst.v +++ b/template-coq/theories/ReflectAst.v @@ -230,10 +230,74 @@ Proof. unfold eqb_mutual_inductive_body; finish_reflect. Defined. +Scheme Equality for list. + +Fixpoint eqb_structure_field (sf sf': structure_field) {struct sf}:= + match sf, sf' with + | sfconst c, sfconst c' => c ==? c' + | sfmind m, sfmind m' => m ==? m' + | sfmod (mi, mt), sfmod (mi', mt') => eqb_module_impl mi mi' && + (list_beq (kername × structure_field) + (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) mt mt') + | sfmodtype mt, sfmodtype mt' => list_beq (kername × structure_field) + (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) + mt mt' + | _, _ => false + end +with eqb_module_impl (mi mi': module_implementation) {struct mi}:= + match mi, mi' with + | mi_abstract, mi_abstract | mi_fullstruct, mi_fullstruct => true + | mi_algebraic kn, mi_algebraic kn' => kn ==? kn' + | mi_struct mt, mi_struct mt' => list_beq (kername × structure_field) + (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) + mt mt' + | _, _ => false + end. + +#[global] Instance reflect_structure_field : ReflectEq structure_field. +Proof. + (* refine {| eqb := eqb_structure_field |}. + intros [] []; unfold eqb_structure_field; try finish_reflect. + - destruct p. apply reflectF; discriminate. + - destruct p. apply reflectF; discriminate. + - destruct p, p0. simpl. destruct (eqb_module_impl m m1) eqn:E; simpl. + -- simpl. destruct m0, m2; simpl. + --- apply reflectP. apply f_equal. + - destruct p. apply reflectF; discriminate. + - apply reflectF; discriminate. + - apply reflectF; discriminate. *) +Admitted. + +#[global] Instance reflect_module_impl : ReflectEq module_implementation. +Proof. Admitted. + +Definition eqb_module_type_decl (mt mt': module_type_decl) := + list_beq (kername × structure_field) + (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) + mt mt'. + +#[global] Instance reflect_module_type_decl : ReflectEq module_type_decl. +Proof. + refine {| eqb := eqb_module_type_decl |}. + intros [] []. + unfold eqb_module_type_decl; finish_reflect. + - apply reflectF. discriminate. + - apply reflectF. discriminate. + - simpl. destruct p, p0. +Admitted. + +Definition eqb_module_decl (m m': module_decl) := + (eqb_module_impl m.1 m'.1) && (eqb_module_type_decl m.2 m'.2). + +#[global] Instance reflect_module_decl : ReflectEq module_decl. +Proof. Admitted. + Definition eqb_global_decl x y := match x, y with | ConstantDecl cst, ConstantDecl cst' => eqb cst cst' | InductiveDecl mib, InductiveDecl mib' => eqb mib mib' + | ModuleDecl m, ModuleDecl m' => eqb m m' + | ModuleTypeDecl mt, ModuleTypeDecl mt' => eqb mt mt' | _, _ => false end. From 8bbde7eec358fb39ad466585a859d72eb1ba5234 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Wed, 7 Dec 2022 15:40:24 +0800 Subject: [PATCH 39/43] Refactor structure_field and prove ReflectAst.v --- .../gen-src/cRelationClasses.mli.orig | 22 +-- template-coq/theories/Checker.v | 48 +++--- template-coq/theories/Environment.v | 25 +-- template-coq/theories/EnvironmentTyping.v | 153 +++++++----------- template-coq/theories/EtaExpand.v | 147 +++++++++-------- template-coq/theories/Pretty.v | 18 ++- template-coq/theories/ReflectAst.v | 89 +++++----- template-coq/theories/TemplateCheckWf.v | 59 ++++--- template-coq/theories/Typing.v | 55 +++---- 9 files changed, 304 insertions(+), 312 deletions(-) diff --git a/template-coq/gen-src/cRelationClasses.mli.orig b/template-coq/gen-src/cRelationClasses.mli.orig index c49080220..49a8d3f48 100644 --- a/template-coq/gen-src/cRelationClasses.mli.orig +++ b/template-coq/gen-src/cRelationClasses.mli.orig @@ -14,6 +14,10 @@ type ('a, 'r) coq_Reflexive = 'a -> 'r val reflexivity : ('a1, 'a2) coq_Reflexive -> 'a1 -> 'a2 +type ('a, 'r) complement = __ + +type ('a, 'r) coq_Irreflexive = ('a, ('a, 'r) complement) coq_Reflexive + type ('a, 'r) coq_Symmetric = 'a -> 'a -> 'r -> 'r val symmetry : ('a1, 'a2) coq_Symmetric -> 'a1 -> 'a1 -> 'a2 -> 'a2 @@ -33,9 +37,10 @@ val coq_PreOrder_Reflexive : val coq_PreOrder_Transitive : ('a1, 'a2) coq_PreOrder -> ('a1, 'a2) coq_Transitive -type ('a, 'r) coq_StrictOrder = - ('a, 'r) coq_Transitive - (* singleton inductive, whose constructor was Build_StrictOrder *) +type ('a, 'r) coq_StrictOrder = { coq_StrictOrder_Irreflexive : ('a, 'r) + coq_Irreflexive; + coq_StrictOrder_Transitive : ('a, 'r) + coq_Transitive } val coq_StrictOrder_Transitive : ('a1, 'a2) coq_StrictOrder -> ('a1, 'a2) coq_Transitive @@ -104,19 +109,18 @@ val iff_equivalence : (__, __) coq_Equivalence val arrow_Reflexive_obligation_1 : ('a1, 'a1) arrow -val arrow_Reflexive : ('a1, 'a1) arrow +val arrow_Reflexive : (__, __) arrow val arrow_Transitive_obligation_1 : ('a1, 'a2) arrow -> ('a2, 'a3) arrow -> ('a1, 'a3) arrow -val arrow_Transitive : - ('a1, 'a2) arrow -> ('a2, 'a3) arrow -> ('a1, 'a3) arrow +val arrow_Transitive : (__, __) arrow -> (__, __) arrow -> (__, __) arrow -val iffT_Reflexive : ('a1, 'a1) iffT +val iffT_Reflexive : (__, __) iffT -val iffT_Symmetric : ('a1, 'a2) iffT -> ('a2, 'a1) iffT +val iffT_Symmetric : (__, __) iffT -> (__, __) iffT -val iffT_Transitive : ('a1, 'a2) iffT -> ('a2, 'a3) iffT -> ('a1, 'a3) iffT +val iffT_Transitive : (__, __) iffT -> (__, __) iffT -> (__, __) iffT type ('a, 'x0, 'x) relation_equivalence = 'a -> 'a -> ('x0, 'x) iffT diff --git a/template-coq/theories/Checker.v b/template-coq/theories/Checker.v index 606c68f79..96b23418b 100644 --- a/template-coq/theories/Checker.v +++ b/template-coq/theories/Checker.v @@ -874,36 +874,36 @@ Section Checker. acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) inds.(ind_bodies) (ret ()). - (** The [ List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) assoc_list_sf (ret ()) ] - cannot be defined as another fixpoint, otherwise Coq "cannot guess the decreasing argument", - since it is not the term being destructed. *) - Fixpoint check_wf_mod_body Σ G impl (modtype_wf: EnvCheck ()): EnvCheck () := - match impl with - | mi_abstract => modtype_wf - (** TODO: check (get_definition a) <: modtype*) - | mi_algebraic _ => CorrectDecl () - (** TODO: check assoc_list_modtype <: modtype*) - | mi_struct assoc_list_sf => - List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) assoc_list_sf (ret ()) - | mi_fullstruct => modtype_wf - end - + (* FIXME: modify this to follow closely https://coq.inria.fr/refman/language/core/modules.html#typing-modules *) + Fixpoint check_wf_mod_impl Σ G impl: EnvCheck () := + match impl with + | mi_abstract | mi_fullstruct | mi_algebraic _ => CorrectDecl () + | mi_struct sb => check_wf_structure_body Σ G sb + end with check_wf_structure_field Σ G kn sf: EnvCheck () := - match sf with - | sfconst cst => check_wf_const_body Σ G kn cst - | sfmind inds => check_wf_ind_body Σ G inds - | sfmod (impl, modtype) => check_wf_mod_body Σ G impl - (List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) modtype (ret ())) - | sfmodtype mt => - List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) mt (ret ()) - end. + match sf with + | sfconst cst => check_wf_const_body Σ G kn cst + | sfmind inds => check_wf_ind_body Σ G inds + | sfmod impl modtype => check_wf_mod_impl Σ G impl ;; check_wf_structure_body Σ G modtype + | sfmodtype mt => check_wf_structure_body Σ G mt + end + with check_wf_structure_body Σ G sb : EnvCheck() := + match sb with + | sb_nil => CorrectDecl () + | sb_cons kn sf sb' => check_wf_structure_field Σ G kn sf ;; check_wf_structure_body Σ G sb' + end. + + Definition check_wf_modtype_decl := check_wf_structure_body. + + Definition check_wf_mod_decl Σ G m := + check_wf_mod_impl Σ G m.1 ;; check_wf_modtype_decl Σ G m.2. Definition check_wf_decl Σ G kn (g : global_decl) : EnvCheck () := match g with | ConstantDecl cst => check_wf_const_body Σ G kn cst | InductiveDecl inds => check_wf_ind_body Σ G inds - | ModuleDecl (impl, modtype) => check_wf_mod_body Σ G impl (List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) modtype (ret ())) - | ModuleTypeDecl mt => List.fold_left (fun acc '(kn, sf) => acc ;; check_wf_structure_field Σ G kn sf) mt (ret ()) + | ModuleDecl m => check_wf_mod_decl Σ G m + | ModuleTypeDecl mt => check_wf_modtype_decl Σ G mt end. Fixpoint check_fresh id (env : global_declarations) : EnvCheck () := diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 852231ea9..2efbe290d 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -320,25 +320,28 @@ Module Environment (T : Term). (** See [generic_module_body] from [declarations.ml]. We do not include the modpath in the body since it is already included in [global_declarations]. *) - Definition structure_body structure_field := list (kername × structure_field). - Definition module_type_body structure_field := structure_body structure_field. (** implementation -> module type -> algebraic (colon-annotated) module type (TODO) *) Inductive structure_field := | sfconst : constant_body -> structure_field | sfmind : mutual_inductive_body -> structure_field - (** TODO: Consider currying impl and modtype. *) - (* | sfmod : module_implementation -> module_type_body structure_field -> structure_field *) - | sfmod : module_implementation × (module_type_body structure_field) -> structure_field - | sfmodtype : module_type_body structure_field-> structure_field + | sfmod : module_implementation -> structure_body -> structure_field + | sfmodtype : structure_body -> structure_field with module_implementation := | mi_abstract : module_implementation (** Declare Module M: T. *) | mi_algebraic : kername -> module_implementation (** Module M [:T] := N. *) - | mi_struct : structure_body structure_field -> module_implementation (** Module M:T. ... End M.*) - | mi_fullstruct : module_implementation. (** Module M. ... End M.*) - (** Is a [module_body] without implementation. *) + | mi_struct : structure_body -> module_implementation (** Module M:T. ... End M.*) + | mi_fullstruct : module_implementation (** Module M. ... End M.*) + with structure_body := + | sb_nil + | sb_cons : kername -> structure_field -> structure_body -> structure_body. - Definition structure_decl := structure_body structure_field. - Definition module_type_decl := module_type_body structure_field. + Scheme structureField_rect := Induction for structure_field Sort Type + with moduleImpl_rect := Induction for module_implementation Sort Type + with structureBody_rect := Induction for structure_body Sort Type. + + Combined Scheme sf_mi_sb_mutind from structureField_rect, moduleImpl_rect, structureBody_rect. + + Definition module_type_decl := structure_body. Definition module_decl := module_implementation × module_type_decl. Inductive global_decl := diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index e0cbe5b04..3ffc80fc9 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -1198,43 +1198,38 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT (** Interactive definitions are stored in modtype if not type-annotated. Otherwise, the interactive definition is in impl, type annotation in modtype. *) - Inductive on_structure_field Σ: (kername × structure_field) -> Type := - | on_sfconst kn c : on_constant_decl Σ c -> on_structure_field Σ (kn, sfconst c) - | on_sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ (kn, sfmind inds) - | on_sfmod kn mb : on_module_decl Σ mb -> on_structure_field Σ (kn, sfmod mb) - | on_sfmodtype kn mtd : on_structure_body Σ mtd -> on_structure_field Σ (kn, sfmodtype mtd) - - with on_structure_body Σ : structure_body structure_field -> Type := - | on_sb_nil : on_structure_body Σ [] - | on_sb_cons hd tl : on_structure_field Σ hd -> on_structure_body Σ tl -> on_structure_body Σ (hd :: tl) - - with on_module_decl Σ : module_decl -> Type := - (** Declare Module M: T, so check T *) - | on_mi_abstract_decl modtype: - on_structure_body Σ modtype -> on_module_decl Σ (mi_abstract, modtype) - - (** Module M := N, so check N *) - | on_mi_algebraic_decl (kn: kername) moddecl: - declared_module Σ kn moddecl -> on_module_decl Σ ((mi_algebraic kn), moddecl.2) - - (** Module M:T ... End M, so check impl, check T, and and whether impl: T *) - | on_mi_struct_decl (body: structure_decl) (modtype: module_type_decl): - (on_structure_body Σ body ) - -> (on_structure_body Σ modtype) - -> on_module_decl Σ ((mi_struct body), modtype) - - (** Module M ... End M, so check impl *) - | on_mi_fullstruct_decl body: - on_structure_body Σ body - -> on_module_decl Σ (mi_fullstruct, body). + Inductive on_structure_field Σ : kername -> structure_field -> Type := + | on_sfconst kn c : on_constant_decl Σ c -> on_structure_field Σ kn (sfconst c) + | on_sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ kn (sfmind inds) + | on_sfmod kn mi sb : on_module_impl Σ mi -> on_structure_body Σ sb -> on_structure_field Σ kn (sfmod mi sb) + | on_sfmodtype kn mtd : on_structure_body Σ mtd -> on_structure_field Σ kn (sfmodtype mtd) + + with on_structure_body Σ : structure_body -> Type := + | on_sb_nil : on_structure_body Σ sb_nil + | on_sb_cons kn sf sb : on_structure_field Σ kn sf + -> on_structure_body Σ sb + -> on_structure_body Σ (sb_cons kn sf sb) + with on_module_impl Σ : module_implementation -> Type := + | on_mi_abstract : on_module_impl Σ mi_abstract + | on_mi_algebraic kn : on_module_impl Σ (mi_algebraic kn) + | on_mi_struct sb : on_structure_body Σ sb -> on_module_impl Σ (mi_struct sb) + | on_mi_fullstruct : on_module_impl Σ mi_fullstruct. + (* with on_module_decl Σ : (module_implementation × module_type_decl) -> Type := + | on_mi_abstract_decl mt : on_structure_body Σ mt -> on_module_decl Σ (mi_abstract, mt) + | on_mi_algebraic_decl kn mt: on_structure_body Σ mt -> on_module_decl Σ ((mi_algebraic kn), mt) + | on_mi_struct_decl sb mt: on_structure_body Σ mt -> on_structure_body Σ sb -> on_module_decl Σ ((mi_struct sb), mt) + | on_mi_fullstruct_decl mt: on_structure_body Σ mt -> on_module_decl Σ (mi_fullstruct, mt). *) + + Definition on_module_type_decl := on_structure_body. + Definition on_module_decl Σ m := on_module_impl Σ m.1 × on_module_type_decl Σ m.2. Scheme onStructField_rect := Induction for on_structure_field Sort Type - with onModuleDecl_rect := Induction for on_module_decl Sort Type + with onModuleImpl_rect := Induction for on_module_impl Sort Type with onStructBody_rect := Induction for on_structure_body Sort Type. (** Generate mutual induction principle for module declarations. *) - Combined Scheme on_moddecl_structfield_structbody_mutrect from - onModuleDecl_rect,onStructField_rect,onStructBody_rect. + Combined Scheme on_mi_sf_sb_mutrect from + onModuleImpl_rect,onStructField_rect,onStructBody_rect. Definition on_global_decl Σ kn decl := match decl with @@ -1389,26 +1384,19 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT on_global_decl Pcmp P Σ kn d -> on_global_decl Pcmp Q Σ kn d. Proof. intros H HP. - cut ((forall (m : module_decl), on_module_decl Pcmp P Σ m -> on_module_decl Pcmp Q Σ m) - × (forall (p : kername × structure_field), on_structure_field Pcmp P Σ p -> on_structure_field Pcmp Q Σ p) - × (forall (s : structure_body structure_field), on_structure_body Pcmp P Σ s -> on_structure_body Pcmp Q Σ s)). + cut ((forall (m : module_implementation), on_module_impl Pcmp P Σ m -> on_module_impl Pcmp Q Σ m) + × (forall (kn: kername) (p : structure_field), on_structure_field Pcmp P Σ kn p -> on_structure_field Pcmp Q Σ kn p) + × (forall (s : structure_body), on_structure_body Pcmp P Σ s -> on_structure_body Pcmp Q Σ s)). intro md_sf_sb. destruct d; simpl. - now eapply on_constant_decl_impl. - now eapply on_inductive_decl_impl. + - unfold on_module_decl. destruct m as [mi mt]; simpl. + intros [onmip onmtp]. split; now apply md_sf_sb. - apply md_sf_sb. - - apply md_sf_sb. - - eapply (on_moddecl_structfield_structbody_mutrect). - -- intros kn0 c0 HP1. apply (on_sfconst Pcmp Q Σ kn0 c0). now apply (on_constant_decl_impl Pcmp P). - -- intros mind mind_body P1. apply (on_sfmind Pcmp Q Σ mind mind_body). now apply (on_inductive_decl_impl Pcmp P). - -- intros. now apply on_sfmod. - -- intros. now apply on_sfmodtype. - -- intros. now apply on_mi_abstract_decl. - -- intros. now apply on_mi_algebraic_decl. - -- intros. now apply on_mi_struct_decl. - -- intros. now apply on_mi_fullstruct_decl. - -- apply on_sb_nil. - -- intros. now apply on_sb_cons. + - apply (on_mi_sf_sb_mutrect); try now constructor. + -- intros kn' c oncp. constructor. now apply on_constant_decl_impl with (Pcmp := Pcmp) (P := P). + -- intros kn' mind onip. constructor. now apply on_inductive_decl_impl with (Pcmp := Pcmp) (P := P). Qed. Lemma on_global_env_impl {cf : checker_flags} Pcmp P Q : @@ -1509,60 +1497,35 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) assert (X' := fun Γ t T => X ({| universes := univs; declarations := Σ |}, udecl0) Γ t T (cu, wfΣ) (cu, X0) (cu, IHX0)); clear X. rename X' into X. - clear IHX0. destruct d; simpl. + clear IHX0. + destruct d; simpl. - destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - simpl in *. apply on_inductive_decl_impl with (P := P); auto. unfold on_global_env; auto. - - simpl in *. - assert (udecl0 = Monomorphic_ctx) by auto. - rewrite H0 in on_udecl_udecl0, on_global_decl_d0, X. - assert (udecl1 = Monomorphic_ctx) by auto. - rewrite H1 in on_udecl_udecl1, on_global_decl_d1. - clear H0 H1 udecl0 udecl1. - remember ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx) as gex; simpl in *. - cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). - -- intro md_sf_sb. apply md_sf_sb. exact on_global_decl_d0. - -- apply on_moddecl_structfield_structbody_mutrect. - --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - --- intros. apply on_sfmind. apply on_inductive_decl_impl with (P:=P); auto. - unfold on_global_env. rewrite Heqgex; auto. - --- intros. now apply on_sfmod. - --- intros. now apply on_sfmodtype. - --- intros. now apply on_mi_abstract_decl. - --- intros. now apply on_mi_algebraic_decl. - --- intros. now apply on_mi_struct_decl. - --- intros. now apply on_mi_fullstruct_decl. - --- apply on_sb_nil. - --- intros. now apply on_sb_cons. - - - simpl in *. - assert (udecl0 = Monomorphic_ctx) by auto. - rewrite H0 in on_udecl_udecl0, on_global_decl_d0, X. - assert (udecl1 = Monomorphic_ctx) by auto. - rewrite H1 in on_udecl_udecl1, on_global_decl_d1. - clear H0 H1 udecl0 udecl1. - remember ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx) as gex; simpl in *. - cut ((forall (m : module_decl), on_module_decl cumul_gen P gex m -> on_module_decl cumul_gen Q gex m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). - -- intro md_sf_sb. apply md_sf_sb. exact on_global_decl_d0. - -- apply on_moddecl_structfield_structbody_mutrect. - --- intros. apply on_sfconst. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - --- intros. apply on_sfmind. apply on_inductive_decl_impl with (P:=P); auto. - unfold on_global_env. rewrite Heqgex; auto. - --- intros. now apply on_sfmod. - --- intros. now apply on_sfmodtype. - --- intros. now apply on_mi_abstract_decl. - --- intros. now apply on_mi_algebraic_decl. - --- intros. now apply on_mi_struct_decl. - --- intros. now apply on_mi_fullstruct_decl. - --- apply on_sb_nil. - --- intros. now apply on_sb_cons. + - set (gex := ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx)). + cut ((forall (m : module_implementation), on_module_impl cumul_gen P gex m -> on_module_impl cumul_gen Q gex m) + × (forall (kn: kername) (p: structure_field), on_structure_field cumul_gen P gex kn p -> on_structure_field cumul_gen Q gex kn p) + × (forall (s : structure_body), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). + intros [Hmi [Hsf Hsb]]. + -- constructor; destruct on_global_decl_d0 as [omip omtp]. + + now apply Hmi. + + now apply Hsb. + -- apply on_mi_sf_sb_mutrect; try now constructor. + + constructor. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + + constructor. apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. + + - set (gex := ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx)). + cut ((forall (m : module_implementation), on_module_impl cumul_gen P gex m -> on_module_impl cumul_gen Q gex m) + × (forall (kn: kername) (p: structure_field), on_structure_field cumul_gen P gex kn p -> on_structure_field cumul_gen Q gex kn p) + × (forall (s : structure_body), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). + intros [Hmi [Hsf Hsb]]. + -- destruct on_global_decl_d0; now constructor. + -- apply on_mi_sf_sb_mutrect; try now constructor. + + constructor. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + + constructor. apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. Qed. End DeclarationTyping. diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index e304bd42f..535dd0948 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -204,33 +204,34 @@ Definition eta_minductive_decl Σ mdecl := ind_universes := mdecl.(ind_universes); ind_variance := mdecl.(ind_variance); |}. -Fixpoint eta_module_decl Σ impl eta_modtype {struct impl}:= - match impl with - | mi_struct struct_body => - let new_impl := mi_struct (map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) struct_body) in - (new_impl, eta_modtype) - | _ => (impl, eta_modtype) - end - with eta_structure_field Σ sf {struct sf}:= match sf with - | sfconst c => sfconst (eta_global_decl Σ c) - | sfmind m => sfmind (eta_minductive_decl Σ m) - | sfmod (impl, modtype) => - let new_modtype := (map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype) in - sfmod (eta_module_decl Σ impl new_modtype) - | sfmodtype modtype => sfmodtype ((map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype)) - end. - - Definition eta_module_type_decl Σ (modtype: list (kername × structure_field)) := - map (fun '(kn, sf) => (kn, eta_structure_field Σ sf)) modtype. - - Definition eta_structure_body Σ (sb: list (kername × structure_field)) := eta_module_type_decl Σ sb. +Fixpoint eta_structure_field Σ sf := + match sf with + | sfconst c => sfconst (eta_global_decl Σ c) + | sfmind m => sfmind (eta_minductive_decl Σ m) + | sfmod impl modtype => sfmod (eta_module_impl Σ impl) (eta_structure_body Σ modtype) + | sfmodtype modtype => sfmodtype (eta_structure_body Σ modtype) + end +with eta_module_impl Σ mi := + match mi with + | mi_struct sb => mi_struct (eta_structure_body Σ sb) + | _ => mi + end +with eta_structure_body Σ mt := + match mt with + | sb_nil => sb_nil + | sb_cons kn sf sb => sb_cons kn (eta_structure_field Σ sf) (eta_structure_body Σ sb) +end. + +Definition eta_module_type_decl := eta_structure_body. + +Definition eta_module_decl Σ m := + (eta_module_impl Σ m.1, eta_module_type_decl Σ m.2). Definition eta_global_declaration (Σ : GlobalEnvMap.t) decl : global_decl := match decl with | ConstantDecl cb => ConstantDecl (eta_global_decl Σ cb) | InductiveDecl idecl => InductiveDecl (eta_minductive_decl Σ idecl) - | ModuleDecl (impl, modtype) => let new_modtype := eta_module_type_decl Σ modtype in - ModuleDecl (eta_module_decl Σ impl new_modtype) + | ModuleDecl mdecl => ModuleDecl (eta_module_decl Σ mdecl) | ModuleTypeDecl modtype => ModuleTypeDecl (eta_module_type_decl Σ modtype) end. @@ -429,42 +430,37 @@ Record expanded_minductive_decl Σ mdecl := { expanded_params : expanded_context Σ [] mdecl.(ind_params); expanded_ind_bodies : Forall (expanded_inductive_decl Σ mdecl) mdecl.(ind_bodies) }. -Inductive expanded_structure_field Σ: (kername × structure_field) -> Prop := - | expanded_sfconst kn c : expanded_constant_decl Σ c -> expanded_structure_field Σ (kn, sfconst c) - | expanded_sfmind kn inds : expanded_minductive_decl Σ inds -> expanded_structure_field Σ (kn, sfmind inds) - | expanded_sfmod kn mb : expanded_module_decl Σ mb -> expanded_structure_field Σ (kn, sfmod mb) - | expanded_sfmodtype kn mtd : expanded_structure_body Σ mtd -> expanded_structure_field Σ (kn, sfmodtype mtd) - -with expanded_structure_body Σ : structure_body structure_field -> Prop := - | expanded_sb_nil : expanded_structure_body Σ [] - | expanded_sb_cons hd tl : expanded_structure_field Σ hd -> expanded_structure_body Σ tl -> expanded_structure_body Σ (hd :: tl) - -with expanded_module_decl Σ : module_decl -> Prop := -(** Declare Module M: T, so expand T *) -| expanded_mi_abstract_decl modtype: - expanded_structure_body Σ modtype -> expanded_module_decl Σ (mi_abstract, modtype) - -(** Module M := N, if N is declared in Σ it must be expanded. *) -(** induction-recursion *) -| expanded_mi_algebraic_decl (kn: kername) (moddecl: module_decl): - expanded_module_decl Σ ((mi_algebraic kn), moddecl.2) - -(** Module M:T ... End M, so expand impl and T *) -| expanded_mi_struct_decl (body: structure_decl) (modtype: module_type_decl): - (expanded_structure_body Σ body ) - -> (expanded_structure_body Σ modtype) - -> expanded_module_decl Σ ((mi_struct body), modtype) - -(** Module M ... End M, so expand impl *) -| expanded_mi_fullstruct_decl body: - expanded_structure_body Σ body - -> expanded_module_decl Σ (mi_fullstruct, body). +Inductive expanded_structure_field Σ: kername -> structure_field -> Prop := + | expanded_sfconst kn c : expanded_constant_decl Σ c -> expanded_structure_field Σ kn (sfconst c) + | expanded_sfmind kn inds : expanded_minductive_decl Σ inds -> expanded_structure_field Σ kn (sfmind inds) + | expanded_sfmod kn mi mt: + expanded_module_impl Σ mi -> + expanded_structure_body Σ mt -> + expanded_structure_field Σ kn (sfmod mi mt) + | expanded_sfmodtype kn mtd : expanded_structure_body Σ mtd -> expanded_structure_field Σ kn (sfmodtype mtd) + +with expanded_structure_body Σ : structure_body -> Prop := + | expanded_sb_nil : expanded_structure_body Σ sb_nil + | expanded_sb_cons kn sf tl : + expanded_structure_field Σ kn sf -> + expanded_structure_body Σ tl -> + expanded_structure_body Σ (sb_cons kn sf tl) + +with expanded_module_impl Σ : module_implementation -> Prop := + | expanded_mi_abstract : expanded_module_impl Σ mi_abstract + | expanded_mi_algebraic kn : expanded_module_impl Σ (mi_algebraic kn) + | expanded_mi_struct sb : expanded_structure_body Σ sb -> expanded_module_impl Σ (mi_struct sb) + | expanded_mi_fullstruct : expanded_module_impl Σ mi_fullstruct. + +Definition expanded_modtype_decl := expanded_structure_body. +Definition expanded_module_decl Σ m := + expanded_module_impl Σ m.1 × expanded_modtype_decl Σ m.2. Scheme expanded_sf_ind := Induction for expanded_structure_field Sort Prop with expanded_sb_ind := Induction for expanded_structure_body Sort Prop -with expanded_mod_ind := Induction for expanded_module_decl Sort Prop. +with expanded_mi_ind := Induction for expanded_module_impl Sort Prop. -Combined Scheme expanded_moddecl_structfield_structbody_mutind from expanded_mod_ind,expanded_sf_ind,expanded_sb_ind. +Combined Scheme expanded_md_sf_sb_mutind from expanded_mi_ind, expanded_sf_ind, expanded_sb_ind. Definition expanded_decl Σ d := match d with @@ -1416,9 +1412,9 @@ Lemma expanded_decl_env_irrel (Σ Σ' : global_env) t : Proof. intros hrepr. unfold expanded_decl. - cut ((forall (m : module_decl), expanded_module_decl Σ m -> expanded_module_decl Σ' m) /\ - (forall (p : kername × structure_field), expanded_structure_field Σ p -> expanded_structure_field Σ' p) /\ - (forall (s : structure_body structure_field), expanded_structure_body Σ s -> expanded_structure_body Σ' s)). + cut ((forall (m : module_implementation), expanded_module_impl Σ m -> expanded_module_impl Σ' m) /\ + (forall (k: kername) (p : structure_field), expanded_structure_field Σ k p -> expanded_structure_field Σ' k p) /\ + (forall (s : structure_body), expanded_structure_body Σ s -> expanded_structure_body Σ' s)). intros [Hmd [Hsf Hsb]]. destruct t => //; auto. - intros []. constructor. @@ -1431,7 +1427,8 @@ Proof. solve_all. destruct H; split. eapply expanded_context_env_irrel; tea. eapply expanded_env_irrel; tea. - - apply expanded_moddecl_structfield_structbody_mutind; try now constructor. + - constructor; destruct H; auto. now apply Hsb. + - apply expanded_md_sf_sb_mutind; try now constructor. -- repeat constructor. destruct e. destruct (cst_body c) => //. cbn in *. now eapply expanded_env_irrel. -- constructor. split; destruct e; solve_all. + eapply expanded_context_env_irrel; tea. @@ -1568,6 +1565,24 @@ Proof. now rewrite map_repeat in H. Qed. +Lemma eta_expand_modtype_decl_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) mt : + repr_decls Σg Σ -> + Typing.wf_ext Σ -> + on_structure_body cumul_gen (lift_typing typing) Σ mt -> + expanded_modtype_decl Σ (eta_module_type_decl Σg mt). +Proof. + intros hrepr wf onm. + assert (H_md_sf_sd: (forall (m : module_implementation) (e : on_module_impl cumul_gen (lift_typing typing) Σ m), expanded_module_impl Σ (eta_module_impl Σg m)) × + (forall (k: kername) (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ k p), expanded_structure_field Σ k (eta_structure_field Σg p)) × + (forall (s : structure_body) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). + { + apply on_mi_sf_sb_mutrect; try now constructor; simpl. + - intros kn c onc. constructor. now apply eta_expand_constant_decl_expanded. + - intros kn i oni. constructor. now apply eta_expand_inductive_expanded with (kn := kn). + } + destruct onm; now repeat constructor. +Qed. + Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) (Σg : global_env_ext_map) kn d : repr_decls Σg Σ -> Typing.wf_ext Σ -> @@ -1575,22 +1590,18 @@ Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) expanded_decl Σ (eta_global_declaration Σg d). Proof. intros hrepr wf ond. - assert (H_md_sf_sd: (forall (m : module_decl) (e : on_module_decl cumul_gen (lift_typing typing) Σ m), expanded_module_decl Σ (eta_module_decl Σg m.1 (eta_module_type_decl Σg m.2))) × - (forall (p : kername × structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ p), expanded_structure_field Σ (p.1, (eta_structure_field Σg p.2))) × - (forall (s : structure_body structure_field) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). + assert (H_md_sf_sd: (forall (m : module_implementation) (e : on_module_impl cumul_gen (lift_typing typing) Σ m), expanded_module_impl Σ (eta_module_impl Σg m)) × + (forall (k: kername) (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ k p), expanded_structure_field Σ k (eta_structure_field Σg p)) × + (forall (s : structure_body) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). { - unshelve eapply (on_moddecl_structfield_structbody_mutrect cumul_gen (lift_typing typing) Σ); try now constructor; simpl. + unshelve eapply (on_mi_sf_sb_mutrect cumul_gen (lift_typing typing) Σ); try now constructor; simpl. - intros. constructor. now apply eta_expand_constant_decl_expanded. - intros. constructor. now eapply eta_expand_inductive_expanded. - - intros kn' [impl modtype]. constructor. apply H. - - intros kn' [impl modtype] H. red in H. simpl. - apply (expanded_mi_algebraic_decl Σ kn' (impl, (eta_module_type_decl Σg modtype))). - - intros hd tl Hosf Hesf Hosb Hesb. simpl. constructor; now destruct hd as [kn0 sf]. } destruct d; cbn in *. - now apply eta_expand_constant_decl_expanded. - - now simple eapply eta_expand_inductive_expanded. - - destruct m as [impl modtype]. simpl. apply H_md_sf_sd in ond. apply ond. + - now apply eta_expand_inductive_expanded with (kn := kn). + - destruct ond. constructor; now apply H_md_sf_sd. - now apply H_md_sf_sd. Qed. diff --git a/template-coq/theories/Pretty.v b/template-coq/theories/Pretty.v index a03eb64a5..345f7215e 100644 --- a/template-coq/theories/Pretty.v +++ b/template-coq/theories/Pretty.v @@ -340,13 +340,21 @@ Module PrintTermTree. | cons (kn, a) nil => f kn a | cons (kn, a) l => (f kn a) ^ sep ^ aux l end in aux l. + + Definition print_structure_body (f: kername -> structure_field -> t) (sep: t) (s: structure_body) : t := + let fix aux sb := match sb return t with + | sb_nil => "" + | sb_cons kn sf sb_nil => f kn sf + | sb_cons kn sf sb => f kn sf ^ sep ^ aux sb + end in aux s. + Fixpoint print_module_decl kn impl modtype_str with_universes (short: bool) (Σ: global_env) {struct impl}:= let kn_string := string_of_kername kn in match impl with | mi_abstract => "Module " ^ kn_string ^ "." | mi_algebraic kn' => "Module " ^ kn_string ^ " := " ^ (string_of_kername kn') ^ "." | mi_struct sb => - let sb_str := if short then string "..." else print_assoc_list (print_structure_field with_universes short Σ) nl sb in + let sb_str := if short then string "..." else print_structure_body (print_structure_field with_universes short Σ) nl sb in "Module " ^ kn_string ^ ". " ^ sb_str ^ " End " ^ kn_string ^ "." | mi_fullstruct => "Module " ^ kn_string ^ ". " ^ modtype_str ^ " End " ^ kn_string ^ "." end ^ if short then string "" else "Module Type: " ^ nl ^ modtype_str @@ -354,8 +362,8 @@ Module PrintTermTree. match sf with | sfconst cb => let Σ' := (Σ, cb.(cst_universes)) in print_const_decl kn cb with_universes short Σ' | sfmind mib => print_mib Σ with_universes short mib - | sfmod (impl, modtype) => print_module_decl kn impl (print_assoc_list (print_structure_field with_universes short Σ) nl modtype) with_universes short Σ - | sfmodtype mt => print_assoc_list (print_structure_field with_universes short Σ) nl mt + | sfmod impl modtype => print_module_decl kn impl (print_structure_body (print_structure_field with_universes short Σ) nl modtype) with_universes short Σ + | sfmodtype mt => print_structure_body (print_structure_field with_universes short Σ) nl mt end. Fixpoint print_env_aux with_universes (short : bool) (prefix : nat) (Σ : global_env) (acc : t) : t := @@ -384,11 +392,11 @@ Module PrintTermTree. end ^ acc) | (kn, ModuleDecl (impl, modtype)) :: Σ => let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in - let modtype_str := print_assoc_list (print_structure_field with_universes short Σ) nl modtype in + let modtype_str := print_structure_body (print_structure_field with_universes short Σ) nl modtype in print_env_aux with_universes short n Σ (print_module_decl kn impl modtype_str with_universes short Σ ^ acc) | (kn, ModuleTypeDecl mt) :: Σ => let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in - print_assoc_list (print_structure_field with_universes short Σ) nl mt + print_structure_body (print_structure_field with_universes short Σ) nl mt end end. diff --git a/template-coq/theories/ReflectAst.v b/template-coq/theories/ReflectAst.v index f09da4930..ca86428a5 100644 --- a/template-coq/theories/ReflectAst.v +++ b/template-coq/theories/ReflectAst.v @@ -230,67 +230,72 @@ Proof. unfold eqb_mutual_inductive_body; finish_reflect. Defined. -Scheme Equality for list. - Fixpoint eqb_structure_field (sf sf': structure_field) {struct sf}:= match sf, sf' with | sfconst c, sfconst c' => c ==? c' | sfmind m, sfmind m' => m ==? m' - | sfmod (mi, mt), sfmod (mi', mt') => eqb_module_impl mi mi' && - (list_beq (kername × structure_field) - (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) mt mt') - | sfmodtype mt, sfmodtype mt' => list_beq (kername × structure_field) - (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) - mt mt' + | sfmod mi mt, sfmod mi' mt' => eqb_module_impl mi mi' && eqb_module_type_decl mt mt' + | sfmodtype mt, sfmodtype mt' => eqb_module_type_decl mt mt' | _, _ => false end with eqb_module_impl (mi mi': module_implementation) {struct mi}:= match mi, mi' with | mi_abstract, mi_abstract | mi_fullstruct, mi_fullstruct => true | mi_algebraic kn, mi_algebraic kn' => kn ==? kn' - | mi_struct mt, mi_struct mt' => list_beq (kername × structure_field) - (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) - mt mt' + | mi_struct mt, mi_struct mt' => eqb_module_type_decl mt mt' + | _, _ => false + end +with eqb_module_type_decl (mt mt': module_type_decl) {struct mt} := + match mt, mt' with + | sb_nil, sb_nil => true + | sb_cons k sf sb, sb_cons k' sf' sb' => + k ==? k' && eqb_structure_field sf sf' && eqb_module_type_decl sb sb' | _, _ => false end. - -#[global] Instance reflect_structure_field : ReflectEq structure_field. + +Lemma reflect_sf_mi_sb: +(forall f f': structure_field, reflectProp (f = f') (eqb_structure_field f f')) × +(forall m m': module_implementation, reflectProp (m = m') (eqb_module_impl m m')) × +(forall s s': structure_body, reflectProp (s = s') (eqb_module_type_decl s s')). Proof. - (* refine {| eqb := eqb_structure_field |}. - intros [] []; unfold eqb_structure_field; try finish_reflect. - - destruct p. apply reflectF; discriminate. - - destruct p. apply reflectF; discriminate. - - destruct p, p0. simpl. destruct (eqb_module_impl m m1) eqn:E; simpl. - -- simpl. destruct m0, m2; simpl. - --- apply reflectP. apply f_equal. - - destruct p. apply reflectF; discriminate. - - apply reflectF; discriminate. - - apply reflectF; discriminate. *) -Admitted. + apply sf_mi_sb_mutind; intros. + - destruct f'; simpl; try now constructor. destruct (eqb_spec c c0); now constructor. + - destruct f'; simpl; try now constructor. destruct (eqb_spec m m0); now constructor. + - destruct f'; simpl; try now constructor. + destruct (H m0), (H0 s0); simpl; now constructor. + - destruct f'; simpl; try now constructor. + destruct (H s0); simpl; now constructor. + - destruct m'; simpl; now constructor. + - destruct m'; simpl; try now constructor. + destruct (eqb_spec k k0); now constructor. + - destruct m'; simpl; try now constructor. + destruct (H s0); simpl; now constructor. + - destruct m'; simpl; now constructor. + - destruct s'; simpl; now constructor. + - destruct s'; simpl; try now constructor. + destruct (eqb_spec k k0), (H s1), (H0 s'); simpl; now constructor. +Qed. -#[global] Instance reflect_module_impl : ReflectEq module_implementation. -Proof. Admitted. +#[global] Instance reflect_structure_field : ReflectEq structure_field := +{ eqb := eqb_structure_field ; eqb_spec := reflect_sf_mi_sb.1 }. -Definition eqb_module_type_decl (mt mt': module_type_decl) := - list_beq (kername × structure_field) - (fun '(kn, sf) '(kn', sf') => (kn == kn') && (eqb_structure_field sf sf')) - mt mt'. +#[global] Instance reflect_module_impl : ReflectEq module_implementation := +{ eqb := eqb_module_impl ; eqb_spec := reflect_sf_mi_sb.2.1 }. -#[global] Instance reflect_module_type_decl : ReflectEq module_type_decl. -Proof. - refine {| eqb := eqb_module_type_decl |}. - intros [] []. - unfold eqb_module_type_decl; finish_reflect. - - apply reflectF. discriminate. - - apply reflectF. discriminate. - - simpl. destruct p, p0. -Admitted. +#[global] Instance reflect_structure_body : ReflectEq structure_body := +{ eqb := eqb_module_type_decl ; eqb_spec := reflect_sf_mi_sb.2.2 }. + +#[global] Instance reflect_module_type : ReflectEq module_type_decl := +{ eqb := eqb_module_type_decl ; eqb_spec := reflect_sf_mi_sb.2.2 }. -Definition eqb_module_decl (m m': module_decl) := - (eqb_module_impl m.1 m'.1) && (eqb_module_type_decl m.2 m'.2). +Definition eqb_module_decl (m m': module_decl) := (m.1 ==? m'.1) && (m.2 ==? m'.2). #[global] Instance reflect_module_decl : ReflectEq module_decl. -Proof. Admitted. +Proof. + refine {| eqb := eqb_module_decl |}. + intros [] []. + unfold eqb_module_decl; cbn -[eqb]; finish_reflect. +Qed. Definition eqb_global_decl x y := match x, y with diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index c33e7830a..894fed667 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -19,19 +19,27 @@ Definition check_const_decl_def kn const_decl : TemplateMonad unit := | None => ret tt end. -Fixpoint check_mod_decl_def kn impl modtype {struct impl}:= +Fixpoint check_mod_impl_def impl {struct impl}:= match impl with - | mi_struct sb => let _ := map (fun '(kn, sf) => check_structure_field_def kn sf) sb in ret tt + | mi_struct sb => check_structure_body_def sb ;; ret tt | _ => ret tt end with check_structure_field_def kn sf := match sf with | sfconst cb => check_const_decl_def kn cb | sfmind _ => ret tt - | sfmod (impl, modtype) => check_mod_decl_def kn impl modtype - | sfmodtype sb => let _ := map (fun '(kn, sf) => check_structure_field_def kn sf) sb in ret tt + | sfmod impl modtype => check_mod_impl_def impl ;; check_structure_body_def modtype + | sfmodtype sb => check_structure_body_def sb + end +with check_structure_body_def sb := + match sb with + | sb_nil => ret tt + | sb_cons kn sf sb' => check_structure_field_def kn sf ;; check_structure_body_def sb' end. +Definition check_modtype_def := check_structure_body_def. +Definition check_mod_decl_def m := check_mod_impl_def m.1 ;; check_modtype_def m.2. + Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with | ConstantDecl cb => @@ -43,8 +51,8 @@ Definition check_def (d : kername × global_decl) : TemplateMonad unit := | None => ret tt end | InductiveDecl idecl => ret tt - | ModuleDecl (impl, modtype) => check_mod_decl_def d.1 impl modtype - | ModuleTypeDecl sb => let _ := map (fun '(kn,sf) => check_structure_field_def kn sf) sb in ret tt + | ModuleDecl m => check_mod_decl_def m + | ModuleTypeDecl sb => check_modtype_def sb end. Definition is_nil {A} (l : list A) := @@ -75,30 +83,37 @@ Fixpoint wfterm (t : term) : bool := From Coq Require Import ssrbool. -Fixpoint wf_module_decl_aux impl wf_modtype := +Definition wf_constant_body cb := wfterm cb.(cst_type) && option_default wfterm cb.(cst_body) true. + +Fixpoint wf_module_impl impl := match impl with - | mi_abstract => wf_modtype - | mi_algebraic _ => wf_modtype - | mi_struct sb => List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) sb true - | mi_fullstruct => wf_modtype + | mi_struct sb => wf_structure_body sb + | _ => true end with wf_structure_field sf := -match sf with -| sfconst cb => wfterm cb.(cst_type) && option_default wfterm cb.(cst_body) true -| sfmind _ => true -| sfmod (impl, modtype) => - wf_module_decl_aux impl (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) -| sfmodtype mt => List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) mt true -end. + match sf with + | sfconst cb => wf_constant_body cb + | sfmind _ => true + | sfmod impl modtype => wf_module_impl impl && wf_structure_body modtype + | sfmodtype mt => wf_structure_body mt + end +with wf_structure_body sb := + match sb with + | sb_nil => true + | sb_cons kn sf sb' => wf_structure_field sf && wf_structure_body sb' + end. + +Definition wf_module_type := wf_structure_body. +Definition wf_module_decl m := wf_module_impl m.1 && wf_structure_body m.2. Definition wf_global_decl d := match d with - | ConstantDecl cb => wfterm cb.(cst_type) && option_default wfterm cb.(cst_body) true + | ConstantDecl cb => wf_constant_body cb | InductiveDecl idecl => true - | ModuleDecl (impl, modtype) => - wf_module_decl_aux impl (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) - | ModuleTypeDecl modtype => (List.fold_left (fun acc kn_sf => acc && wf_structure_field kn_sf.2) modtype true) + | ModuleDecl m => wf_module_decl m + | ModuleTypeDecl modtype => wf_module_type modtype end. + Definition wf_global_declarations : global_declarations -> bool := forallb (wf_global_decl ∘ snd). Definition wf_global_env (g : global_env) := wf_global_declarations g.(declarations). Definition wf_program p := wf_global_env p.1 && wfterm p.2. diff --git a/template-coq/theories/Typing.v b/template-coq/theories/Typing.v index 4217498da..adbf1c5fd 100644 --- a/template-coq/theories/Typing.v +++ b/template-coq/theories/Typing.v @@ -1352,23 +1352,22 @@ Proof. apply lift_typing_impl with (1 := HT); intros ? Hs. apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). constructor 1. simpl. subst Σ' Σg; cbn; lia. - + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m - -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s + + + cut ((forall (m : module_implementation), on_module_impl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m + -> on_module_impl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) + × (forall (k: kername) (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p) + × (forall (s : structure_body), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). - * intros md_sf_sb. apply md_sf_sb. apply Xg. + * intros md_sf_sb. constructor; apply md_sf_sb; apply Xg. (** start of mutual induction *) - * apply on_moddecl_structfield_structbody_mutrect. - -- intros. apply on_sfconst. - destruct c; simpl in *. + * apply on_mi_sf_sb_mutrect; try now constructor. + -- constructor. destruct c; simpl in *. destruct cst_body0; apply lift_typing_impl with (1 := o0); intros ? Hs. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - -- intros. apply on_sfmind. - destruct o0 as [onI onP onnp]; constructor; eauto. + -- constructor. destruct o0 as [onI onP onnp]; constructor; eauto. --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. clear IH; rename IH' into IH. @@ -1407,31 +1406,23 @@ Proof. apply lift_typing_impl with (1 := HT); intros ? Hs. apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). constructor 1. simpl. subst Σ' Σg; cbn; lia. - -- intros; now apply on_sfmod. - -- intros; now apply on_sfmodtype. - -- intros; now apply on_mi_abstract_decl. - -- intros; now apply on_mi_algebraic_decl. - -- intros; now apply on_mi_struct_decl. - -- intros; now apply on_mi_fullstruct_decl. - -- constructor. - -- intros. now apply on_sb_cons. - + cut ((forall (m : module_decl), on_module_decl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m - -> on_module_decl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) - × (forall (p : kername × structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) - × (forall (s : structure_body structure_field), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s + + + cut ((forall (m : module_implementation), on_module_impl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m + -> on_module_impl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) + × (forall (k: kername) (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p) + × (forall (s : structure_body), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). - * intros md_sf_sb. apply md_sf_sb. apply Xg. + * intros md_sf_sb. apply md_sf_sb; apply Xg. (** start of mutual induction *) - * apply on_moddecl_structfield_structbody_mutrect. + * apply on_mi_sf_sb_mutrect; try now constructor. -- intros. apply on_sfconst. destruct c; simpl in *. destruct cst_body0; apply lift_typing_impl with (1 := o0); intros ? Hs. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - -- intros. apply on_sfmind. - destruct o0 as [onI onP onnp]; constructor; eauto. + -- constructor. destruct o0 as [onI onP onnp]; constructor; eauto. --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. clear IH; rename IH' into IH. @@ -1470,14 +1461,6 @@ Proof. apply lift_typing_impl with (1 := HT); intros ? Hs. apply (IH ((Σ', udecl); (wfΣ; _; _; _; Hs))). constructor 1. simpl. subst Σ' Σg; cbn; lia. - -- intros; now apply on_sfmod. - -- intros; now apply on_sfmodtype. - -- intros; now apply on_mi_abstract_decl. - -- intros; now apply on_mi_algebraic_decl. - -- intros; now apply on_mi_struct_decl. - -- intros; now apply on_mi_fullstruct_decl. - -- constructor. - -- intros. now apply on_sb_cons. - assert (forall Γ t T (Hty : Σ ;;; Γ |- t : T), typing_size Hty < typing_size H -> From e6974c558633104771c0e3e3ad34cc18ed9184d8 Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Fri, 23 Dec 2022 19:33:43 +0800 Subject: [PATCH 40/43] Create no-module environment for pcuic --- pcuic/_CoqProject.in | 2 + pcuic/theories/Environment.v | 779 +++++++++++++ pcuic/theories/EnvironmentTyping.v | 1457 +++++++++++++++++++++++++ pcuic/theories/PCUICAst.v | 6 +- pcuic/theories/PCUICTypedAst.v | 2 +- pcuic/theories/utils/PCUICPretty.v | 1 - pcuic/theories/utils/PCUICPrimitive.v | 4 +- translations/translation_utils.v | 3 + 8 files changed, 2247 insertions(+), 7 deletions(-) create mode 100644 pcuic/theories/Environment.v create mode 100644 pcuic/theories/EnvironmentTyping.v diff --git a/pcuic/_CoqProject.in b/pcuic/_CoqProject.in index ad625dff4..b8e037a7e 100644 --- a/pcuic/_CoqProject.in +++ b/pcuic/_CoqProject.in @@ -1,5 +1,7 @@ -R theories MetaCoq.PCUIC +theories/Environment.v +theories/EnvironmentTyping.v theories/PCUICAst.v theories/utils/PCUICOnOne.v diff --git a/pcuic/theories/Environment.v b/pcuic/theories/Environment.v new file mode 100644 index 000000000..f7eddb88b --- /dev/null +++ b/pcuic/theories/Environment.v @@ -0,0 +1,779 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import ssreflect ssrbool ssrfun Morphisms Setoid. +From MetaCoq.Template Require Import utils BasicAst Primitive. +From MetaCoq.Template Require Import Universes. +From MetaCoq.Template Require Environment. + +Module Type Term := Environment.Term. + +Module Retroknowledge := Environment.Retroknowledge. + +Module Environment (T : Term). + + Import T. + #[global] Existing Instance subst_instance_constr. + + Definition typ_or_sort := typ_or_sort_ term. + + (** ** Declarations *) + Notation context_decl := (context_decl term). + + (** Local (de Bruijn) variable binding *) + + Definition vass x A : context_decl := + {| decl_name := x ; decl_body := None ; decl_type := A |}. + + (** Local (de Bruijn) let-binding *) + + Definition vdef x t A : context_decl := + {| decl_name := x ; decl_body := Some t ; decl_type := A |}. + + (** Local (de Bruijn) context *) + + Definition context := list context_decl. + + (** Last declaration first *) + + Definition lift_decl n k d := (map_decl (lift n k) d). + + Definition lift_context n k (Γ : context) : context := + fold_context_k (fun k' => lift n (k' + k)) Γ. + + Lemma lift_context_alt n k Γ : + lift_context n k Γ = + mapi (fun k' d => lift_decl n (Nat.pred #|Γ| - k' + k) d) Γ. + Proof. + unfold lift_context. apply: fold_context_k_alt. + Qed. + + Lemma lift_context_length n k Γ : #|lift_context n k Γ| = #|Γ|. + Proof. now rewrite /lift_context; len. Qed. + #[global] Hint Rewrite lift_context_length : len. + + Definition subst_context s k (Γ : context) : context := + fold_context_k (fun k' => subst s (k' + k)) Γ. + + Definition subst_decl s k (d : context_decl) := map_decl (subst s k) d. + + Lemma subst_context_length s n Γ : #|subst_context s n Γ| = #|Γ|. + Proof. now rewrite /subst_context; len. Qed. + #[global] Hint Rewrite subst_context_length : len. + + Lemma subst_context_nil s n : subst_context s n [] = []. + Proof. reflexivity. Qed. + + Lemma subst_context_alt s k Γ : + subst_context s k Γ = + mapi (fun k' d => subst_decl s (Nat.pred #|Γ| - k' + k) d) Γ. + Proof. + unfold subst_context, fold_context_k. rewrite rev_mapi. rewrite List.rev_involutive. + apply mapi_ext. intros. f_equal. now rewrite List.rev_length. + Qed. + + Lemma subst_context_snoc s k Γ d : subst_context s k (d :: Γ) = subst_context s k Γ ,, subst_decl s (#|Γ| + k) d. + Proof. + now rewrite /subst_context fold_context_k_snoc0. + Qed. + + Definition subst_telescope s k (Γ : context) : context := + mapi (fun k' decl => map_decl (subst s (k' + k)) decl) Γ. + + Global Instance subst_instance_decl : UnivSubst context_decl + := map_decl ∘ subst_instance. + + Global Instance subst_instance_context : UnivSubst context + := map_context ∘ subst_instance. + + Lemma subst_instance_length u (ctx : context) + : #|subst_instance u ctx| = #|ctx|. + Proof. unfold subst_instance, subst_instance_context, map_context. now rewrite map_length. Qed. + #[global] Hint Rewrite subst_instance_length : len. + + Definition set_binder_name (na : aname) (x : context_decl) : context_decl := + {| decl_name := na; + decl_body := decl_body x; + decl_type := decl_type x |}. + + Fixpoint context_assumptions (Γ : context) := + match Γ with + | [] => 0 + | d :: Γ => + match d.(decl_body) with + | Some _ => context_assumptions Γ + | None => S (context_assumptions Γ) + end + end. + + Fixpoint is_assumption_context (Γ : context) := + match Γ with + | [] => true + | d :: Γ => + match d.(decl_body) with + | Some _ => false + | None => is_assumption_context Γ + end + end. + + (** Smashing a context produces an assumption context. *) + + Fixpoint smash_context (Γ Γ' : context) : context := + match Γ' with + | {| decl_body := Some b |} :: Γ' => smash_context (subst_context [b] 0 Γ) Γ' + | {| decl_body := None |} as d :: Γ' => smash_context (Γ ++ [d]) Γ' + | [] => Γ + end. + + Lemma smash_context_length Γ Γ' : #|smash_context Γ Γ'| = #|Γ| + context_assumptions Γ'. + Proof. + induction Γ' as [|[na [body|] ty] tl] in Γ |- *; cbn; eauto. + - now rewrite IHtl subst_context_length. + - rewrite IHtl app_length. simpl. lia. + Qed. + #[global] Hint Rewrite smash_context_length : len. + + (* Smashing a context Γ with Δ depending on it is the same as smashing Γ + and substituting all references to Γ in Δ by the expansions of let bindings. *) + + Lemma smash_context_app Δ Γ Γ' : + smash_context Δ (Γ ++ Γ') = smash_context (smash_context Δ Γ) Γ'. + Proof. + revert Δ; induction Γ as [|[na [b|] ty]]; intros Δ; simpl; auto. + Qed. + + Fixpoint extended_subst (Γ : context) (n : nat) + (* Δ, smash_context Γ, n |- extended_subst Γ n : Γ *) := + match Γ with + | nil => nil + | cons d vs => + match decl_body d with + | Some b => + (* Δ , vs |- b *) + let s := extended_subst vs n in + (* Δ , smash_context vs , n |- s : vs *) + let b' := lift (context_assumptions vs + n) #|s| b in + (* Δ, smash_context vs, n , vs |- b' *) + let b' := subst s 0 b' in + (* Δ, smash_context vs , n |- b' *) + b' :: s + | None => tRel n :: extended_subst vs (S n) + end + end. + + Lemma extended_subst_length Γ n : #|extended_subst Γ n| = #|Γ|. + Proof. + induction Γ in n |- *; simpl; auto. + now destruct a as [? [?|] ?] => /=; simpl; rewrite IHΓ. + Qed. + #[global] Hint Rewrite extended_subst_length : len. + + Definition expand_lets_k Γ k t := + (subst (extended_subst Γ 0) k (lift (context_assumptions Γ) (k + #|Γ|) t)). + + Definition expand_lets Γ t := expand_lets_k Γ 0 t. + + Definition expand_lets_k_ctx Γ k Δ := + (subst_context (extended_subst Γ 0) k (lift_context (context_assumptions Γ) (k + #|Γ|) Δ)). + + Definition expand_lets_ctx Γ Δ := expand_lets_k_ctx Γ 0 Δ. + + Lemma expand_lets_k_ctx_length Γ k Δ : #|expand_lets_k_ctx Γ k Δ| = #|Δ|. + Proof. now rewrite /expand_lets_k_ctx; len. Qed. + #[global] Hint Rewrite expand_lets_k_ctx_length : len. + + Lemma expand_lets_ctx_length Γ Δ : #|expand_lets_ctx Γ Δ| = #|Δ|. + Proof. now rewrite /expand_lets_ctx; len. Qed. + #[global] Hint Rewrite expand_lets_ctx_length : len. + + Definition fix_context (m : mfixpoint term) : context := + List.rev (mapi (fun i d => vass d.(dname) (lift i 0 d.(dtype))) m). + + (** *** Environments *) + + Record constructor_body := { + cstr_name : ident; + (* The arguments and indices are typeable under the context of + arities of the mutual inductive + parameters *) + cstr_args : context; + cstr_indices : list term; + cstr_type : term; + (* Closed type: on well-formed constructors: forall params, cstr_args, I params cstr_indices *) + cstr_arity : nat; (* arity, w/o lets, w/o parameters *) + }. + + Record projection_body := { + proj_name : ident; + (* The arguments and indices are typeable under the context of + arities of the mutual inductive + parameters *) + proj_relevance : relevance; + proj_type : term; (* Type under context of params and inductive object *) + }. + + Definition map_constructor_body npars arities f c := + {| cstr_name := c.(cstr_name); + cstr_args := fold_context_k (fun x => f (x + npars + arities)) c.(cstr_args); + cstr_indices := map (f (npars + arities + #|c.(cstr_args)|)) c.(cstr_indices); + (* Note only after positivity checking we can ensure that the indices do not mention the + inductive type.. beware of lets! *) + cstr_type := f arities c.(cstr_type); + cstr_arity := c.(cstr_arity) |}. + + (* Here npars should be the [context_assumptions] of the parameters context. *) + Definition map_projection_body npars f c := + {| proj_name := c.(proj_name); + proj_relevance := c.(proj_relevance); + proj_type := f (S npars) c.(proj_type) + |}. + + (** See [one_inductive_body] from [declarations.ml]. *) + Record one_inductive_body := { + ind_name : ident; + ind_indices : context; (* Indices of the inductive types, under params *) + ind_sort : Universe.t; (* Sort of the inductive. *) + ind_type : term; (* Closed arity = forall mind_params, ind_indices, tSort ind_sort *) + ind_kelim : allowed_eliminations; (* Allowed eliminations *) + ind_ctors : list constructor_body; + ind_projs : list projection_body; (* names and types of projections, if any. *) + ind_relevance : relevance (* relevance of the inductive definition *) }. + + Definition map_one_inductive_body npars arities f m := + match m with + | Build_one_inductive_body ind_name ind_indices ind_sort + ind_type ind_kelim ind_ctors ind_projs ind_relevance => + Build_one_inductive_body + ind_name (fold_context_k (fun x => f (npars + x)) ind_indices) ind_sort + (f 0 ind_type) ind_kelim (map (map_constructor_body npars arities f) ind_ctors) + (map (map_projection_body npars f) ind_projs) ind_relevance + end. + + (** See [mutual_inductive_body] from [declarations.ml]. *) + Record mutual_inductive_body := { + ind_finite : recursivity_kind; + ind_npars : nat; + ind_params : context; + ind_bodies : list one_inductive_body ; + ind_universes : universes_decl; + ind_variance : option (list Universes.Variance.t) }. + + (** See [constant_body] from [declarations.ml] *) + Record constant_body := { + cst_type : term; + cst_body : option term; + cst_universes : universes_decl; + cst_relevance : relevance }. + + Definition map_constant_body f decl := + {| cst_type := f decl.(cst_type); + cst_body := option_map f decl.(cst_body); + cst_universes := decl.(cst_universes); + cst_relevance := decl.(cst_relevance) |}. + + Lemma map_cst_type f decl : + f (cst_type decl) = cst_type (map_constant_body f decl). + Proof. destruct decl; reflexivity. Qed. + + Lemma map_cst_body f decl : + option_map f (cst_body decl) = cst_body (map_constant_body f decl). + Proof. destruct decl; reflexivity. Qed. + + Inductive global_decl := + | ConstantDecl : constant_body -> global_decl + | InductiveDecl : mutual_inductive_body -> global_decl. + Derive NoConfusion for global_decl. + + Definition global_declarations := list (kername * global_decl). + + Record global_env := mk_global_env + { universes : ContextSet.t; + declarations : global_declarations; + retroknowledge : Retroknowledge.t }. + + Coercion universes : global_env >-> ContextSet.t. + + Definition empty_global_env := + {| universes := ContextSet.empty; + declarations := []; + retroknowledge := Retroknowledge.empty |}. + + Definition add_global_decl Σ decl := + {| universes := Σ.(universes); + declarations := decl :: Σ.(declarations); + retroknowledge := Σ.(retroknowledge) |}. + + Lemma eta_global_env Σ : Σ = {| universes := Σ.(universes); declarations := Σ.(declarations); + retroknowledge := Σ.(retroknowledge) |}. + Proof. now destruct Σ. Qed. + + Definition set_declarations Σ decls := + {| universes := Σ.(universes); + declarations := decls; + retroknowledge := Σ.(retroknowledge) |}. + + Fixpoint lookup_global (Σ : global_declarations) (kn : kername) : option global_decl := + match Σ with + | nil => None + | d :: tl => + if kn == d.1 then Some d.2 + else lookup_global tl kn + end. + + Definition lookup_env (Σ : global_env) (kn : kername) := lookup_global Σ.(declarations) kn. + + Definition extends (Σ Σ' : global_env) := + [× Σ.(universes) ⊂_cs Σ'.(universes), + ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations) & + Retroknowledge.extends Σ.(retroknowledge) Σ'.(retroknowledge)]. + + Definition extends_decls (Σ Σ' : global_env) := + [× Σ.(universes) = Σ'.(universes), + ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations) & + Σ.(retroknowledge) = Σ'.(retroknowledge)]. + + Existing Class extends. + Existing Class extends_decls. + + Lemma lookup_global_None Σ kn : ~In kn (List.map fst Σ) <-> lookup_global Σ kn = None. + Proof. + move: Σ; elim => //=; try tauto. + move => ??; case: eqb_spec; intuition congruence. + Qed. + + Lemma lookup_global_Some_iff_In_NoDup Σ kn decl (H : NoDup (List.map fst Σ)) + : In (kn, decl) Σ <-> lookup_global Σ kn = Some decl. + Proof. + move: Σ H; elim => //=; try tauto. + move => [??]?; case: eqb_spec => ? IH; inversion 1; subst; try rewrite <- IH by assumption. + all: intuition try congruence; subst. + all: cbn in *. + all: repeat match goal with H : (_, _) = (_, _) |- _ => inversion H; clear H end. + all: repeat match goal with H : Some _ = Some _ |- _ => inversion H; clear H end. + all: subst => //=; auto. + all: try now epose proof (@in_map _ _ fst _ (_, _)); cbn in *; exfalso; eauto. + Qed. + + #[global] Instance extends_decls_extends Σ Σ' : extends_decls Σ Σ' -> extends Σ Σ'. + Proof. + destruct Σ, Σ'; intros []. cbn in *; subst. split => //=. + split; [lsets|csets]. apply Retroknowledge.extends_refl. + Qed. + + #[global] Instance extends_decls_refl : CRelationClasses.Reflexive extends_decls. + Proof. red. intros x. split => //; try exists [] => //. Qed. + + Lemma extends_refl : CRelationClasses.Reflexive extends. + Proof. red. intros x. split; [apply incl_cs_refl | now exists [] | apply Retroknowledge.extends_refl]. Qed. + + (* easy prefers this to the local hypotheses, which is annoying + #[global] Instance extends_refl : CRelationClasses.Reflexive extends. + Proof. apply extends_refl. Qed. + *) + + Local Ltac extends_trans_t := + intros [?] [?] [?] [?] [?]; red; cbn in *; split; + try solve [ etransitivity; eassumption | eapply incl_cs_trans; eassumption ]; + repeat first [ progress subst + | match goal with + | [ H : ∑ x : _, _ |- _ ] => destruct H + | [ H : forall c : kername, _, kn : kername |- _ ] => specialize (H kn) + | [ H : ?x = _ |- context[?x] ] => rewrite H + end + | split + | intro + | now eexists; rewrite app_assoc ]. + #[global] Instance extends_decls_trans : CRelationClasses.Transitive extends_decls. + Proof. extends_trans_t. Qed. + #[global] Instance extends_trans : CRelationClasses.Transitive extends. + Proof. extends_trans_t. Qed. + + Definition primitive_constant (Σ : global_env) (p : prim_tag) : option kername := + match p with + | primInt => Σ.(retroknowledge).(Retroknowledge.retro_int63) + | primFloat => Σ.(retroknowledge).(Retroknowledge.retro_float64) + end. + + Definition primitive_invariants (cdecl : constant_body) := + ∑ s, [/\ cdecl.(cst_type) = tSort s, cdecl.(cst_body) = None & + cdecl.(cst_universes) = Monomorphic_ctx]. + + + (** A context of global declarations + global universe constraints, + i.e. a global environment *) + + Definition global_env_ext : Type := global_env * universes_decl. + + (** Use a coercion for this common projection of the global context. *) + Definition fst_ctx : global_env_ext -> global_env := fst. + Coercion fst_ctx : global_env_ext >-> global_env. + + Definition empty_ext (Σ : global_env) : global_env_ext + := (Σ, Monomorphic_ctx). + + (** *** Programs + + A set of declarations and a term, as produced by [MetaCoq Quote Recursively]. *) + + Definition program : Type := global_env * term. + + (* TODO MOVE AstUtils factorisation *) + + Definition app_context (Γ Γ' : context) : context := Γ' ++ Γ. + Notation "Γ ,,, Γ'" := + (app_context Γ Γ') (at level 25, Γ' at next level, left associativity). + + (** Make a lambda/let-in string of abstractions from a context [Γ], ending with term [t]. *) + + Definition mkLambda_or_LetIn d t := + match d.(decl_body) with + | None => tLambda d.(decl_name) d.(decl_type) t + | Some b => tLetIn d.(decl_name) b d.(decl_type) t + end. + + Definition it_mkLambda_or_LetIn (l : context) (t : term) := + List.fold_left (fun acc d => mkLambda_or_LetIn d acc) l t. + + (** Make a prod/let-in string of abstractions from a context [Γ], ending with term [t]. *) + + Definition mkProd_or_LetIn d t := + match d.(decl_body) with + | None => tProd d.(decl_name) d.(decl_type) t + | Some b => tLetIn d.(decl_name) b d.(decl_type) t + end. + + Definition it_mkProd_or_LetIn (l : context) (t : term) := + List.fold_left (fun acc d => mkProd_or_LetIn d acc) l t. + + Lemma it_mkProd_or_LetIn_app l l' t : + it_mkProd_or_LetIn (l ++ l') t = it_mkProd_or_LetIn l' (it_mkProd_or_LetIn l t). + Proof. induction l in l', t |- *; simpl; auto. Qed. + + Fixpoint reln (l : list term) (p : nat) (Γ0 : list context_decl) {struct Γ0} : list term := + match Γ0 with + | [] => l + | {| decl_body := Some _ |} :: hyps => reln l (p + 1) hyps + | {| decl_body := None |} :: hyps => reln (tRel p :: l) (p + 1) hyps + end. + + Definition to_extended_list_k Γ k := reln [] k Γ. + Definition to_extended_list Γ := to_extended_list_k Γ 0. + + Lemma reln_fold f ctx n acc : + reln acc n (fold_context_k f ctx) = + reln acc n ctx. + Proof. + induction ctx as [|[na [b|] ty] ctx] in n, acc |- *; simpl; auto; + rewrite fold_context_k_snoc0 /=; apply IHctx. + Qed. + + Lemma reln_list_lift_above l p Γ : + Forall (fun x => exists n, x = tRel n /\ p <= n /\ n < p + length Γ) l -> + Forall (fun x => exists n, x = tRel n /\ p <= n /\ n < p + length Γ) (reln l p Γ). + Proof. + generalize (Nat.le_refl p). + generalize p at 1 3 5. + induction Γ in p, l |- *. simpl. auto. + intros. destruct a. destruct decl_body. simpl. + assert(p0 <= S p) by lia. + specialize (IHΓ l (S p) p0 H1). rewrite <- Nat.add_succ_comm, Nat.add_1_r. + simpl in *. rewrite <- Nat.add_succ_comm in H0. eauto. + simpl in *. + specialize (IHΓ (tRel p :: l) (S p) p0 ltac:(lia)). + rewrite <- Nat.add_succ_comm, Nat.add_1_r. + eapply IHΓ. simpl in *. rewrite <- Nat.add_succ_comm in H0. auto. + simpl in *. + constructor. exists p. intuition lia. auto. + Qed. + + Lemma to_extended_list_k_spec Γ k : + Forall (fun x => exists n, x = tRel n /\ k <= n /\ n < k + length Γ) + (to_extended_list_k Γ k). + Proof. + pose (reln_list_lift_above [] k Γ). + unfold to_extended_list_k. + forward f. constructor. apply f. + Qed. + + Lemma to_extended_list_lift_above Γ : + Forall (fun x => exists n, x = tRel n /\ n < length Γ) (to_extended_list Γ). + Proof. + pose (reln_list_lift_above [] 0 Γ). + unfold to_extended_list. + forward f. constructor. eapply Forall_impl; eauto. intros. + destruct H; eexists; intuition eauto. + Qed. + + Fixpoint reln_alt p (Γ : context) := + match Γ with + | [] => [] + | {| decl_body := Some _ |} :: Γ => reln_alt (p + 1) Γ + | {| decl_body := None |} :: Γ => tRel p :: reln_alt (p + 1) Γ + end. + + Lemma reln_alt_eq l Γ k : reln l k Γ = List.rev (reln_alt k Γ) ++ l. + Proof. + induction Γ in l, k |- *; simpl; auto. + destruct a as [na [body|] ty]; simpl. + now rewrite IHΓ. + now rewrite IHΓ -app_assoc. + Qed. + + Lemma to_extended_list_k_cons d Γ k : + to_extended_list_k (d :: Γ) k = + match d.(decl_body) with + | None => to_extended_list_k Γ (S k) ++ [tRel k] + | Some b => to_extended_list_k Γ (S k) + end. + Proof. + unfold to_extended_list_k. + rewrite reln_alt_eq. simpl. + destruct d as [na [body|] ty]. simpl. + now rewrite reln_alt_eq Nat.add_1_r. + simpl. rewrite reln_alt_eq. + now rewrite <- app_assoc, !app_nil_r, Nat.add_1_r. + Qed. + + + Definition arities_context (l : list one_inductive_body) := + rev_map (fun ind => vass (mkBindAnn (nNamed ind.(ind_name)) + (ind.(ind_relevance))) ind.(ind_type)) l. + + Lemma arities_context_length l : #|arities_context l| = #|l|. + Proof. unfold arities_context. now rewrite rev_map_length. Qed. + #[global] Hint Rewrite arities_context_length : len. + + Lemma app_context_nil_l Γ : [] ,,, Γ = Γ. + Proof. + unfold app_context. rewrite app_nil_r. reflexivity. + Qed. + + Lemma app_context_assoc Γ Γ' Γ'' : Γ ,,, (Γ' ,,, Γ'') = Γ ,,, Γ' ,,, Γ''. + Proof. unfold app_context; now rewrite app_assoc. Qed. + + Lemma app_context_cons Γ Γ' A : Γ ,,, (Γ' ,, A) = (Γ ,,, Γ') ,, A. + Proof. exact (app_context_assoc _ _ [A]). Qed. + + Lemma app_context_length Γ Γ' : #|Γ ,,, Γ'| = #|Γ'| + #|Γ|. + Proof. unfold app_context. now rewrite app_length. Qed. + #[global] Hint Rewrite app_context_length : len. + + Lemma nth_error_app_context_ge v Γ Γ' : + #|Γ'| <= v -> nth_error (Γ ,,, Γ') v = nth_error Γ (v - #|Γ'|). + Proof. apply nth_error_app_ge. Qed. + + Lemma nth_error_app_context_lt v Γ Γ' : + v < #|Γ'| -> nth_error (Γ ,,, Γ') v = nth_error Γ' v. + Proof. apply nth_error_app_lt. Qed. + + + Definition map_mutual_inductive_body f m := + match m with + | Build_mutual_inductive_body finite ind_npars ind_pars ind_bodies ind_universes ind_variance => + let arities := arities_context ind_bodies in + let pars := fold_context_k f ind_pars in + Build_mutual_inductive_body finite ind_npars pars + (map (map_one_inductive_body (context_assumptions pars) (length arities) f) ind_bodies) + ind_universes ind_variance + end. + + Lemma ind_type_map f npars_ass arities oib : + ind_type (map_one_inductive_body npars_ass arities f oib) = f 0 (ind_type oib). + Proof. destruct oib. reflexivity. Qed. + + Lemma ind_ctors_map f npars_ass arities oib : + ind_ctors (map_one_inductive_body npars_ass arities f oib) = + map (map_constructor_body npars_ass arities f) (ind_ctors oib). + Proof. destruct oib; simpl; reflexivity. Qed. + + Lemma ind_pars_map f m : + ind_params (map_mutual_inductive_body f m) = + fold_context_k f (ind_params m). + Proof. destruct m; simpl; reflexivity. Qed. + + Lemma ind_projs_map f npars_ass arities oib : + ind_projs (map_one_inductive_body npars_ass arities f oib) = + map (map_projection_body npars_ass f) (ind_projs oib). + Proof. destruct oib; simpl. reflexivity. Qed. + + Fixpoint projs ind npars k := + match k with + | 0 => [] + | S k' => (tProj (mkProjection ind npars k') (tRel 0)) :: projs ind npars k' + end. + + Lemma projs_length ind npars k : #|projs ind npars k| = k. + Proof. induction k; simpl; auto. Qed. + + Lemma context_assumptions_fold Γ f : context_assumptions (fold_context_k f Γ) = context_assumptions Γ. + Proof. + rewrite fold_context_k_alt. + unfold mapi. generalize 0 (Nat.pred #|Γ|). + induction Γ as [|[na [body|] ty] tl]; cbn; intros; eauto. + Qed. + #[global] Hint Rewrite context_assumptions_fold : len. + + Lemma nth_error_fold_context_k (f : nat -> term -> term): + forall (Γ' Γ'' : context) (v : nat), + v < length Γ' -> forall nth, + nth_error Γ' v = Some nth -> + nth_error (fold_context_k f Γ') v = Some (map_decl (f (length Γ' - S v)) nth). + Proof. + induction Γ'; intros. + - easy. + - simpl. destruct v; rewrite fold_context_k_snoc0. + + simpl. repeat f_equal; try lia. simpl in *. congruence. + + simpl. apply IHΓ'; simpl in *; (lia || congruence). + Qed. + + Lemma nth_error_fold_context_k_eq: + forall (Γ' : context) (v : nat) (f : nat -> term -> term), + nth_error (fold_context_k f Γ') v = + option_map (map_decl (f (length Γ' - S v))) (nth_error Γ' v). + Proof. + induction Γ'; intros. + - simpl. unfold fold_context_k; simpl. now rewrite nth_error_nil. + - simpl. destruct v; rewrite fold_context_k_snoc0. + + simpl. repeat f_equal; try lia. + + simpl. apply IHΓ'; simpl in *; (lia || congruence). + Qed. + + Lemma nth_error_ge {Γ Γ' v Γ''} (f : nat -> term -> term) : + length Γ' <= v -> + nth_error (Γ' ++ Γ) v = + nth_error (fold_context_k f Γ' ++ Γ'' ++ Γ) (length Γ'' + v). + Proof. + intros Hv. + rewrite -> !nth_error_app_ge, ?fold_context_k_length. f_equal. lia. + rewrite fold_context_k_length. lia. + rewrite fold_context_k_length. lia. auto. + Qed. + + Lemma nth_error_lt {Γ Γ' Γ'' v} (f : nat -> term -> term) : + v < length Γ' -> + nth_error (fold_context_k f Γ' ++ Γ'' ++ Γ) v = + option_map (map_decl (f (length Γ' - S v))) (nth_error (Γ' ++ Γ) v). + Proof. + simpl. intros Hv. + rewrite -> !nth_error_app_lt. + rewrite nth_error_fold_context_k_eq. + do 2 f_equal. lia. now rewrite fold_context_k_length. + Qed. + + Lemma context_assumptions_length_bound Γ : context_assumptions Γ <= #|Γ|. + Proof. + induction Γ; simpl; auto. destruct a as [? [?|] ?]; simpl; auto. + lia. + Qed. + + Lemma context_assumptions_map f Γ : context_assumptions (map_context f Γ) = context_assumptions Γ. + Proof. + induction Γ as [|[? [?|] ?] ?]; simpl; auto. + Qed. + + Lemma context_assumptions_app Γ Δ : context_assumptions (Γ ++ Δ) = + context_assumptions Γ + context_assumptions Δ. + Proof. + induction Γ as [|[? [] ?] ?]; simpl; auto. + Qed. + + Lemma context_assumptions_rev Γ : context_assumptions (List.rev Γ) = context_assumptions Γ. + Proof using Type. + induction Γ; simpl; auto. rewrite context_assumptions_app IHΓ /=. + destruct (decl_body a); simpl; lia. + Qed. + + + Lemma context_assumptions_mapi f Γ : context_assumptions (mapi (fun i => map_decl (f i)) Γ) = + context_assumptions Γ. + Proof. + rewrite /mapi; generalize 0. + induction Γ; simpl; intros; eauto. + destruct a as [? [b|] ?]; simpl; auto. + Qed. + + #[global] Hint Rewrite context_assumptions_map context_assumptions_mapi context_assumptions_app : len. + + Lemma context_assumptions_subst_instance u Γ : + context_assumptions (subst_instance u Γ) = + context_assumptions Γ. + Proof. apply context_assumptions_map. Qed. + + Lemma context_assumptions_subst_context s k Γ : + context_assumptions (subst_context s k Γ) = + context_assumptions Γ. + Proof. apply context_assumptions_fold. Qed. + + Lemma context_assumptions_lift_context n k Γ : + context_assumptions (lift_context n k Γ) = + context_assumptions Γ. + Proof. apply context_assumptions_fold. Qed. + + #[global] Hint Rewrite context_assumptions_subst_instance + context_assumptions_subst_context context_assumptions_lift_context : len. + + (** Lifting a relation to declarations, without alpha renaming. *) + Inductive All_decls (P : term -> term -> Type) : context_decl -> context_decl -> Type := + | on_vass na t t' : + P t t' -> + All_decls P (vass na t) (vass na t') + + | on_vdef na b t b' t' : + P b b' -> + P t t' -> + All_decls P (vdef na b t) (vdef na b' t'). + Derive Signature NoConfusion for All_decls. + + (** Allow alpha-renaming of binders *) + Inductive All_decls_alpha (P : term -> term -> Type) : context_decl -> context_decl -> Type := + | on_vass_alpha na na' t t' : + eq_binder_annot na na' -> + P t t' -> + All_decls_alpha P (vass na t) (vass na' t') + + | on_vdef_alpha na na' b t b' t' : + eq_binder_annot na na' -> + P b b' -> + P t t' -> + All_decls_alpha P (vdef na b t) (vdef na' b' t'). + Derive Signature NoConfusion for All_decls_alpha. + + Lemma All_decls_impl (P Q : term -> term -> Type) d d' : + All_decls P d d' -> + (forall t t', P t t' -> Q t t') -> + All_decls Q d d'. + Proof. + intros ond H; destruct ond; constructor; auto. + Qed. + + Lemma All_decls_alpha_impl (P Q : term -> term -> Type) d d' : + All_decls_alpha P d d' -> + (forall t t', P t t' -> Q t t') -> + All_decls_alpha Q d d'. + Proof. + intros ond H; destruct ond; constructor; auto. + Qed. + + Lemma All_decls_to_alpha (P : term -> term -> Type) d d' : + All_decls P d d' -> + All_decls_alpha P d d'. + Proof. + intros []; constructor; auto; reflexivity. + Qed. + + Definition All2_fold_over (P : context -> context -> context_decl -> context_decl -> Type) Γ Γ' := + All2_fold (All_over P Γ Γ'). + + Notation on_decls P := (fun Γ Γ' => All_decls (P Γ Γ')). + Notation on_contexts P := (All2_fold (on_decls P)). + Notation on_contexts_over P Γ Γ' := (All2_fold (All_over (on_decls P) Γ Γ')). + +End Environment. + +Module Type EnvironmentSig (T : Term). + Include Environment T. +End EnvironmentSig. + +Module Type TermUtils (T: Term) (E: EnvironmentSig T). + Import T E. + + Parameter Inline destArity : context -> term -> option (context × Universe.t). + Parameter Inline inds : kername -> Instance.t -> list one_inductive_body -> list term. + +End TermUtils. diff --git a/pcuic/theories/EnvironmentTyping.v b/pcuic/theories/EnvironmentTyping.v new file mode 100644 index 000000000..d5020a507 --- /dev/null +++ b/pcuic/theories/EnvironmentTyping.v @@ -0,0 +1,1457 @@ +(* Distributed under the terms of the MIT license. *) +From Coq Require Import ssreflect ssrbool. +From MetaCoq.Template Require Import config utils BasicAst Universes Primitive. +From MetaCoq.PCUIC Require Import Environment. +From Equations Require Import Equations. + +Module Lookup (T : Term) (E : EnvironmentSig T). + + Import T E. + + (** ** Environment lookup *) + + Definition declared_constant_gen (lookup : kername -> option global_decl) (id : kername) decl : Prop := + lookup id = Some (ConstantDecl decl). + + Definition declared_constant (Σ : global_env) := declared_constant_gen (lookup_env Σ). + + Definition declared_minductive_gen (lookup : kername -> option global_decl) mind decl := + lookup mind = Some (InductiveDecl decl). + + Definition declared_minductive Σ := declared_minductive_gen (lookup_env Σ). + + Definition declared_inductive_gen lookup ind mdecl decl := + declared_minductive_gen lookup (inductive_mind ind) mdecl /\ + List.nth_error mdecl.(ind_bodies) (inductive_ind ind) = Some decl. + + Definition declared_inductive Σ := declared_inductive_gen (lookup_env Σ). + + Definition declared_constructor_gen lookup cstr mdecl idecl cdecl : Prop := + declared_inductive_gen lookup (fst cstr) mdecl idecl /\ + List.nth_error idecl.(ind_ctors) (snd cstr) = Some cdecl. + + Definition declared_constructor Σ := declared_constructor_gen (lookup_env Σ). + + Definition declared_projection_gen lookup (proj : projection) mdecl idecl cdecl pdecl + : Prop := + declared_constructor_gen lookup (proj.(proj_ind), 0) mdecl idecl cdecl /\ + List.nth_error idecl.(ind_projs) proj.(proj_arg) = Some pdecl /\ + mdecl.(ind_npars) = proj.(proj_npars). + + Definition declared_projection Σ := declared_projection_gen (lookup_env Σ). + + Definition lookup_constant_gen (lookup : kername -> option global_decl) kn := + match lookup kn with + | Some (ConstantDecl d) => Some d + | _ => None + end. + + Definition lookup_constant Σ := lookup_constant_gen (lookup_env Σ). + + Definition lookup_minductive_gen (lookup : kername -> option global_decl) mind := + match lookup mind with + | Some (InductiveDecl decl) => Some decl + | _ => None + end. + + Definition lookup_minductive Σ := lookup_minductive_gen (lookup_env Σ). + + Definition lookup_inductive_gen lookup ind := + match lookup_minductive_gen lookup (inductive_mind ind) with + | Some mdecl => + match nth_error mdecl.(ind_bodies) (inductive_ind ind) with + | Some idecl => Some (mdecl, idecl) + | None => None + end + | None => None + end. + + Definition lookup_inductive Σ := lookup_inductive_gen (lookup_env Σ). + + Definition lookup_constructor_gen lookup ind k := + match lookup_inductive_gen lookup ind with + | Some (mdecl, idecl) => + match nth_error idecl.(ind_ctors) k with + | Some cdecl => Some (mdecl, idecl, cdecl) + | None => None + end + | _ => None + end. + + Definition lookup_constructor Σ := lookup_constructor_gen (lookup_env Σ). + + Definition lookup_projection_gen lookup p := + match lookup_constructor_gen lookup p.(proj_ind) 0 with + | Some (mdecl, idecl, cdecl) => + match nth_error idecl.(ind_projs) p.(proj_arg) with + | Some pdecl => Some (mdecl, idecl, cdecl, pdecl) + | None => None + end + | _ => None + end. + + Definition lookup_projection Σ := lookup_projection_gen (lookup_env Σ). + + Lemma declared_constant_lookup {lookup kn cdecl} : + declared_constant_gen lookup kn cdecl -> + lookup_constant_gen lookup kn = Some cdecl. + Proof. + unfold declared_constant_gen, lookup_constant_gen. + now intros ->. + Qed. + + Lemma lookup_constant_declared {lookup kn cdecl} : + lookup_constant_gen lookup kn = Some cdecl -> + declared_constant_gen lookup kn cdecl. + Proof. + unfold declared_constant_gen, lookup_constant_gen. + destruct lookup as [[]|] => //. congruence. + Qed. + + Lemma declared_minductive_lookup {lookup ind mdecl} : + declared_minductive_gen lookup ind mdecl -> + lookup_minductive_gen lookup ind = Some mdecl. + Proof. + rewrite /declared_minductive_gen /lookup_minductive_gen. + now intros ->. + Qed. + + Lemma lookup_minductive_declared {lookup ind mdecl} : + lookup_minductive_gen lookup ind = Some mdecl -> + declared_minductive_gen lookup ind mdecl. + Proof. + rewrite /declared_minductive_gen /lookup_minductive_gen. + destruct lookup as [[]|] => //. congruence. + Qed. + + Lemma declared_inductive_lookup {lookup ind mdecl idecl} : + declared_inductive_gen lookup ind mdecl idecl -> + lookup_inductive_gen lookup ind = Some (mdecl, idecl). + Proof. + rewrite /declared_inductive_gen /lookup_inductive_gen. + intros []. now rewrite (declared_minductive_lookup H) H0. + Qed. + + Lemma lookup_inductive_declared {lookup ind mdecl idecl} : + lookup_inductive_gen lookup ind = Some (mdecl, idecl) -> + declared_inductive_gen lookup ind mdecl idecl. + Proof. + rewrite /declared_inductive_gen /lookup_inductive_gen. + destruct lookup_minductive_gen as [[]|] eqn:hl => //=. + destruct nth_error eqn:hnth => //. intros [= <- <-]. + split => //. + apply (lookup_minductive_declared hl). + Qed. + + Lemma declared_constructor_lookup {lookup id mdecl idecl cdecl} : + declared_constructor_gen lookup id mdecl idecl cdecl -> + lookup_constructor_gen lookup id.1 id.2 = Some (mdecl, idecl, cdecl). + Proof. + intros []. unfold lookup_constructor_gen. + rewrite (declared_inductive_lookup (lookup := lookup) H) /= H0 //. + Qed. + + Lemma lookup_constructor_declared {lookup id mdecl idecl cdecl} : + lookup_constructor_gen lookup id.1 id.2 = Some (mdecl, idecl, cdecl) -> + declared_constructor_gen lookup id mdecl idecl cdecl. + Proof. + unfold lookup_constructor_gen. + destruct lookup_inductive_gen as [[]|] eqn:hl => //=. + destruct nth_error eqn:hnth => //. intros [= <- <-]. + split => //. + apply (lookup_inductive_declared hl). congruence. + Qed. + + Lemma declared_projection_lookup {lookup p mdecl idecl cdecl pdecl} : + declared_projection_gen lookup p mdecl idecl cdecl pdecl -> + lookup_projection_gen lookup p = Some (mdecl, idecl, cdecl, pdecl). + Proof. + intros [? []]. unfold lookup_projection_gen. + rewrite (declared_constructor_lookup (lookup := lookup) H) /= H0 //. + Qed. + + Lemma lookup_projection_declared {lookup p mdecl idecl cdecl pdecl} : + ind_npars mdecl = p.(proj_npars) -> + lookup_projection_gen lookup p = Some (mdecl, idecl, cdecl, pdecl) -> + declared_projection_gen lookup p mdecl idecl cdecl pdecl. + Proof. + intros hp. unfold lookup_projection_gen. + destruct lookup_constructor_gen as [[[] ?]|] eqn:hl => //=. + destruct nth_error eqn:hnth => //. intros [= <- <-]. subst c p0. + split => //. + apply (lookup_constructor_declared (id:=(proj_ind p, 0)) hl). + Qed. + + Definition on_udecl_decl {A} (F : universes_decl -> A) d : A := + match d with + | ConstantDecl cb => F cb.(cst_universes) + | InductiveDecl mb => F mb.(ind_universes) + end. + + Definition universes_decl_of_decl := on_udecl_decl (fun x => x). + + (* Definition LevelSet_add_list l := LevelSet.union (LevelSetProp.of_list l). *) + + Definition global_levels (univs : ContextSet.t) : LevelSet.t := + LevelSet.union (ContextSet.levels univs) (LevelSet.singleton (Level.lzero)). + + Lemma global_levels_InSet Σ : + LevelSet.In Level.lzero (global_levels Σ). + Proof. + apply LevelSet.union_spec; right. + now apply LevelSet.singleton_spec. + Qed. + + Lemma global_levels_memSet univs : + LevelSet.mem Level.lzero (global_levels univs) = true. + Proof. + apply LevelSet.mem_spec, global_levels_InSet. + Qed. + + (** One can compute the constraints associated to a global environment or its + extension by folding over its constituent definitions. + + We make *only* the second of these computations an implicit coercion + for more readability. Note that [fst_ctx] is also a coercion which goes + from a [global_env_ext] to a [global_env]: coercion coherence would *not* + be ensured if we added [global_constraints] as well as a coercion, as it + would forget the extension's constraints. *) + + Definition global_constraints (Σ : global_env) : ConstraintSet.t := + snd Σ.(universes). + + Definition global_uctx (Σ : global_env) : ContextSet.t := + (global_levels Σ.(universes), global_constraints Σ). + + Definition global_ext_levels (Σ : global_env_ext) : LevelSet.t := + LevelSet.union (levels_of_udecl (snd Σ)) (global_levels Σ.1.(universes)). + + Definition global_ext_constraints (Σ : global_env_ext) : ConstraintSet.t := + ConstraintSet.union + (constraints_of_udecl (snd Σ)) + (global_constraints Σ.1). + + Coercion global_ext_constraints : global_env_ext >-> ConstraintSet.t. + + Definition global_ext_uctx (Σ : global_env_ext) : ContextSet.t := + (global_ext_levels Σ, global_ext_constraints Σ). + + + Lemma global_ext_levels_InSet Σ : + LevelSet.In Level.lzero (global_ext_levels Σ). + Proof. + apply LevelSet.union_spec; right. + now apply global_levels_InSet. + Qed. + + (** Check that [uctx] instantiated at [u] is consistent with + the current universe graph. *) + + Definition consistent_instance `{checker_flags} (lvs : LevelSet.t) (φ : ConstraintSet.t) uctx (u : Instance.t) := + match uctx with + | Monomorphic_ctx => List.length u = 0 + | Polymorphic_ctx c => + (* levels of the instance already declared *) + forallb (fun l => LevelSet.mem l lvs) u /\ + List.length u = List.length c.1 /\ + valid_constraints φ (subst_instance_cstrs u c.2) + end. + + Definition consistent_instance_ext `{checker_flags} Σ := + consistent_instance (global_ext_levels Σ) (global_ext_constraints Σ). + + Lemma consistent_instance_length {cf : checker_flags} {Σ : global_env_ext} {univs u} : + consistent_instance_ext Σ univs u -> + #|u| = #|abstract_instance univs|. + Proof. + unfold consistent_instance_ext, consistent_instance. + destruct univs; simpl; auto. + intros [_ [H _]]. + destruct cst; simpl in *. + now rewrite H; cbn; autorewrite with len. + Qed. + + Definition wf_universe Σ s : Prop := + Universe.on_sort + (fun u => forall l, LevelExprSet.In l u -> LevelSet.In (LevelExpr.get_level l) (global_ext_levels Σ)) + True s. + + Lemma declared_ind_declared_constructors `{cf : checker_flags} {Σ ind mib oib} : + declared_inductive Σ ind mib oib -> + Alli (fun i => declared_constructor Σ (ind, i) mib oib) 0 (ind_ctors oib). + Proof using. + move=> inddecl. + apply: forall_nth_error_Alli=> /= i x eq. + apply: lookup_constructor_declared=> /=. + rewrite /lookup_constructor_gen (declared_inductive_lookup inddecl) eq //. + Qed. + +End Lookup. + +Module Type LookupSig (T : Term) (E : EnvironmentSig T). + Include Lookup T E. +End LookupSig. + +Module EnvTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E). + + Import T E TU. + + Section TypeLocal. + Context (typing : forall (Γ : context), term -> typ_or_sort -> Type). + + Inductive All_local_env : context -> Type := + | localenv_nil : + All_local_env [] + + | localenv_cons_abs Γ na t : + All_local_env Γ -> + typing Γ t Sort -> + All_local_env (Γ ,, vass na t) + + | localenv_cons_def Γ na b t : + All_local_env Γ -> + typing Γ t Sort -> + typing Γ b (Typ t) -> + All_local_env (Γ ,, vdef na b t). + Derive Signature NoConfusion for All_local_env. + End TypeLocal. + + Arguments localenv_nil {_}. + Arguments localenv_cons_def {_ _ _ _ _} _ _. + Arguments localenv_cons_abs {_ _ _ _} _ _. + + Lemma All_local_env_fold P f Γ : + All_local_env (fun Γ t T => P (fold_context_k f Γ) (f #|Γ| t) (typ_or_sort_map (f #|Γ|) T)) Γ <~> + All_local_env P (fold_context_k f Γ). + Proof. + split. + - induction 1; simpl; try unfold snoc; rewrite ?fold_context_k_snoc0; try constructor; auto. + - induction Γ; simpl; try unfold snoc; rewrite ?fold_context_k_snoc0; intros H. + * constructor. + * destruct a as [na [b|] ty]; depelim H; specialize (IHΓ H); constructor; simpl; auto. + Qed. + + Lemma All_local_env_impl (P Q : context -> term -> typ_or_sort -> Type) l : + All_local_env P l -> + (forall Γ t T, P Γ t T -> Q Γ t T) -> + All_local_env Q l. + Proof. + induction 1; intros; simpl; econstructor; eauto. + Qed. + + Lemma All_local_env_impl_ind {P Q : context -> term -> typ_or_sort -> Type} {l} : + All_local_env P l -> + (forall Γ t T, All_local_env Q Γ -> P Γ t T -> Q Γ t T) -> + All_local_env Q l. + Proof. + induction 1; intros; simpl; econstructor; eauto. + Qed. + + Lemma All_local_env_skipn P Γ : All_local_env P Γ -> forall n, All_local_env P (skipn n Γ). + Proof. + induction 1; simpl; intros; destruct n; simpl; try econstructor; eauto. + Qed. + #[global] + Hint Resolve All_local_env_skipn : wf. + + Section All_local_env_rel. + + Definition All_local_rel P Γ Γ' + := (All_local_env (fun Γ0 t T => P (Γ ,,, Γ0) t T) Γ'). + + Definition All_local_rel_nil {P Γ} : All_local_rel P Γ [] + := localenv_nil. + + Definition All_local_rel_abs {P Γ Γ' A na} : + All_local_rel P Γ Γ' -> P (Γ ,,, Γ') A Sort + -> All_local_rel P Γ (Γ',, vass na A) + := localenv_cons_abs. + + Definition All_local_rel_def {P Γ Γ' t A na} : + All_local_rel P Γ Γ' -> + P (Γ ,,, Γ') A Sort -> + P (Γ ,,, Γ') t (Typ A) -> + All_local_rel P Γ (Γ',, vdef na t A) + := localenv_cons_def. + + Lemma All_local_rel_local : + forall P Γ, + All_local_env P Γ -> + All_local_rel P [] Γ. + Proof. + intros P Γ h. eapply All_local_env_impl. + - exact h. + - intros Δ t [] h'. + all: cbn. + + rewrite app_context_nil_l. assumption. + + rewrite app_context_nil_l. assumption. + Defined. + + Lemma All_local_local_rel P Γ : + All_local_rel P [] Γ -> All_local_env P Γ. + Proof. + intro X. eapply All_local_env_impl. exact X. + intros Γ0 t [] XX; cbn in XX; rewrite app_context_nil_l in XX; assumption. + Defined. + + Lemma All_local_app_rel {P Γ Γ'} : + All_local_env P (Γ ,,, Γ') -> All_local_env P Γ × All_local_rel P Γ Γ'. + Proof. + induction Γ'. + - intros hΓ. + split. + 1: exact hΓ. + constructor. + - inversion 1 ; subst. + all: edestruct IHΓ' ; auto. + all: split ; auto. + all: constructor ; auto. + Defined. + + Lemma All_local_rel_app {P Γ Γ'} : + All_local_env P Γ -> All_local_rel P Γ Γ' -> All_local_env P (Γ ,,, Γ'). + Proof. + intros ? hΓ'. + induction hΓ'. + - assumption. + - cbn. + constructor ; auto. + - cbn. + constructor ; auto. + Defined. + + End All_local_env_rel. + + (** Well-formedness of local environments embeds a sorting for each variable *) + + Definition on_local_decl (P : context -> term -> typ_or_sort -> Type) Γ d := + match d.(decl_body) with + | Some b => P Γ b (Typ d.(decl_type)) + | None => P Γ d.(decl_type) Sort + end. + + Definition on_def_type (P : context -> term -> typ_or_sort -> Type) Γ d := + P Γ d.(dtype) Sort. + + Definition on_def_body (P : context -> term -> typ_or_sort -> Type) types Γ d := + P (Γ ,,, types) d.(dbody) (Typ (lift0 #|types| d.(dtype))). + + Definition lift_judgment + (check : global_env_ext -> context -> term -> term -> Type) + (infer_sort : global_env_ext -> context -> term -> Type) : + (global_env_ext -> context -> term -> typ_or_sort -> Type) := + fun Σ Γ t T => + match T with + | Typ T => check Σ Γ t T + | Sort => infer_sort Σ Γ t + end. + + Lemma lift_judgment_impl {P Ps Q Qs Σ Σ' Γ Γ' t t' T} : + lift_judgment P Ps Σ Γ t T -> + (forall T, P Σ Γ t T -> Q Σ' Γ' t' T) -> + (Ps Σ Γ t -> Qs Σ' Γ' t') -> + lift_judgment Q Qs Σ' Γ' t' T. + Proof. + intros HT HPQ HPsQs. + destruct T; simpl. + * apply HPQ, HT. + * apply HPsQs, HT. + Qed. + + (* Common uses *) + + Definition lift_wf_term wf_term := (lift_judgment (fun Σ Γ t T => wf_term Σ Γ t × wf_term Σ Γ T) wf_term). + + Definition infer_sort (sorting : global_env_ext -> context -> term -> Universe.t -> Type) := (fun Σ Γ T => { s : Universe.t & sorting Σ Γ T s }). + Notation typing_sort typing := (fun Σ Γ T s => typing Σ Γ T (tSort s)). + + Definition lift_typing typing := lift_judgment typing (infer_sort (typing_sort typing)). + Definition lift_sorting checking sorting := lift_judgment checking (infer_sort sorting). + + Notation Prop_conj P Q := (fun Σ Γ t T => P Σ Γ t T × Q Σ Γ t T). + + Definition lift_typing2 P Q := lift_typing (Prop_conj P Q). + + Lemma infer_sort_impl {P Q} {Σ Σ' : global_env_ext} {Γ Γ' : context} {t t' : term} : + forall f, forall tu: infer_sort P Σ Γ t, + let s := tu.π1 in + (P Σ Γ t s -> Q Σ' Γ' t' (f s)) -> + infer_sort Q Σ' Γ' t'. + Proof. + intros ? (? & Hs) s HPQ. eexists. now apply HPQ. + Qed. + + Lemma infer_typing_sort_impl {P Q} {Σ Σ' : global_env_ext} {Γ Γ' : context} {t t' : term} : + forall f, forall tu: infer_sort (typing_sort P) Σ Γ t, + let s := tu.π1 in + (P Σ Γ t (tSort s) -> Q Σ' Γ' t' (tSort (f s))) -> + infer_sort (typing_sort Q) Σ' Γ' t'. + Proof. + apply (infer_sort_impl (P := typing_sort P) (Q := typing_sort Q)). + Qed. + + Lemma lift_typing_impl {P Q Σ Σ' Γ Γ' t t' T} : + lift_typing P Σ Γ t T -> + (forall T, P Σ Γ t T -> Q Σ' Γ' t' T) -> + lift_typing Q Σ' Γ' t' T. + Proof. + intros HT HPQ. + apply lift_judgment_impl with (1 := HT); tas. + intro Hs; apply infer_typing_sort_impl with id Hs; apply HPQ. + Qed. + + Section TypeLocalOver. + Context (checking : global_env_ext -> context -> term -> term -> Type). + Context (sorting : global_env_ext -> context -> term -> Type). + Context (cproperty : forall (Σ : global_env_ext) (Γ : context), + All_local_env (lift_judgment checking sorting Σ) Γ -> + forall (t T : term), checking Σ Γ t T -> Type). + Context (sproperty : forall (Σ : global_env_ext) (Γ : context), + All_local_env (lift_judgment checking sorting Σ) Γ -> + forall (t : term), sorting Σ Γ t -> Type). + + Inductive All_local_env_over_gen (Σ : global_env_ext) : + forall (Γ : context), All_local_env (lift_judgment checking sorting Σ) Γ -> Type := + | localenv_over_nil : + All_local_env_over_gen Σ [] localenv_nil + + | localenv_over_cons_abs Γ na t + (all : All_local_env (lift_judgment checking sorting Σ) Γ) : + All_local_env_over_gen Σ Γ all -> + forall (tu : lift_judgment checking sorting Σ Γ t Sort) + (Hs: sproperty Σ Γ all _ tu), + All_local_env_over_gen Σ (Γ ,, vass na t) + (localenv_cons_abs all tu) + + | localenv_over_cons_def Γ na b t + (all : All_local_env (lift_judgment checking sorting Σ) Γ) (tb : checking Σ Γ b t) : + All_local_env_over_gen Σ Γ all -> + forall (Hc: cproperty Σ Γ all _ _ tb), + forall (tu : lift_judgment checking sorting Σ Γ t Sort) + (Hs: sproperty Σ Γ all _ tu), + All_local_env_over_gen Σ (Γ ,, vdef na b t) + (localenv_cons_def all tu tb). + + End TypeLocalOver. + Derive Signature for All_local_env_over_gen. + + Definition All_local_env_over typing property := + (All_local_env_over_gen typing (infer_sort (typing_sort typing)) property (fun Σ Γ H t tu => property _ _ H _ _ tu.π2)). + + Definition All_local_env_over_sorting checking sorting cproperty (sproperty : forall Σ Γ _ t s, sorting Σ Γ t s -> Type) := + (All_local_env_over_gen checking (infer_sort sorting) cproperty (fun Σ Γ H t tu => sproperty Σ Γ H t tu.π1 tu.π2)). + + Section TypeCtxInst. + Context (typing : forall (Σ : global_env_ext) (Γ : context), term -> term -> Type). + + (* Γ |- s : Δ, where Δ is a telescope (reverse context) *) + Inductive ctx_inst Σ (Γ : context) : list term -> context -> Type := + | ctx_inst_nil : ctx_inst Σ Γ [] [] + | ctx_inst_ass na t i inst Δ : + typing Σ Γ i t -> + ctx_inst Σ Γ inst (subst_telescope [i] 0 Δ) -> + ctx_inst Σ Γ (i :: inst) (vass na t :: Δ) + | ctx_inst_def na b t inst Δ : + ctx_inst Σ Γ inst (subst_telescope [b] 0 Δ) -> + ctx_inst Σ Γ inst (vdef na b t :: Δ). + Derive Signature NoConfusion for ctx_inst. + End TypeCtxInst. + + Lemma ctx_inst_impl P Q Σ Γ inst Δ : + ctx_inst P Σ Γ inst Δ -> + (forall t T, P Σ Γ t T -> Q Σ Γ t T) -> + ctx_inst Q Σ Γ inst Δ. + Proof. + intros H HPQ. induction H; econstructor; auto. + Qed. + + Section All_local_env_size. + Context {P : forall (Σ : global_env_ext) (Γ : context), term -> typ_or_sort -> Type}. + Context (Psize : forall (Σ : global_env_ext) Γ t T, P Σ Γ t T -> size). + + Fixpoint All_local_env_size_gen base Σ Γ (w : All_local_env (P Σ) Γ) : size := + match w with + | localenv_nil => base + | localenv_cons_abs Γ' na t w' p => Psize _ _ _ _ p + All_local_env_size_gen base _ _ w' + | localenv_cons_def Γ' na b t w' pt pb => Psize _ _ _ _ pt + Psize _ _ _ _ pb + All_local_env_size_gen base _ _ w' + end. + + Lemma All_local_env_size_pos base Σ Γ w : base <= All_local_env_size_gen base Σ Γ w. + Proof using Type. + induction w. + all: simpl ; lia. + Qed. + End All_local_env_size. + + Notation All_local_rel_size_gen Psize base := (fun Σ Γ Δ (w : All_local_rel _ Γ Δ) => + All_local_env_size_gen (fun Σ Δ => Psize Σ (Γ ,,, Δ)) base Σ Δ w). + + Lemma All_local_env_size_app P Psize base Σ Γ Γ' (wfΓ : All_local_env (P Σ) Γ) (wfΓ' : All_local_rel (P Σ) Γ Γ') : + All_local_env_size_gen Psize base _ _ (All_local_rel_app wfΓ wfΓ') + base = All_local_env_size_gen Psize base _ _ wfΓ + All_local_rel_size_gen Psize base _ _ _ wfΓ'. + Proof. + induction Γ'. + - dependent inversion wfΓ'. + reflexivity. + - revert IHΓ'. + dependent inversion wfΓ' ; subst ; intros. + + cbn. + etransitivity. + 2: rewrite Nat.add_comm -Nat.add_assoc [X in _ + X]Nat.add_comm -IHΓ' Nat.add_assoc ; reflexivity. + reflexivity. + + cbn. + etransitivity. + 2: rewrite Nat.add_comm -Nat.add_assoc [X in _ + X]Nat.add_comm -IHΓ' Nat.add_assoc ; reflexivity. + reflexivity. + Qed. + + Section lift_judgment_size. + Context {checking : global_env_ext -> context -> term -> term -> Type}. + Context {sorting : global_env_ext -> context -> term -> Type}. + Context (csize : forall (Σ : global_env_ext) (Γ : context) (t T : term), checking Σ Γ t T -> size). + Context (ssize : forall (Σ : global_env_ext) (Γ : context) (t : term), sorting Σ Γ t -> size). + + Definition lift_judgment_size Σ Γ t T (w : lift_judgment checking sorting Σ Γ t T) : size := + match T return lift_judgment checking sorting Σ Γ t T -> size with + | Typ T => csize _ _ _ _ + | Sort => ssize _ _ _ + end w. + End lift_judgment_size. + + Implicit Types (Σ : global_env_ext) (Γ : context) (t : term). + + Notation infer_sort_size typing_size := (fun Σ Γ t (tu: infer_sort _ Σ Γ t) => let 'existT s d := tu in typing_size Σ Γ t s d). + Notation typing_sort_size typing_size := (fun Σ Γ t s (tu: typing_sort _ Σ Γ t s) => typing_size Σ Γ t (tSort s) tu). + + Section Regular. + Context {typing : global_env_ext -> context -> term -> term -> Type}. + Context (typing_size : forall Σ Γ t T, typing Σ Γ t T -> size). + + Definition lift_typing_size := lift_judgment_size typing_size (infer_sort_size (typing_sort_size typing_size)). + Definition All_local_env_size := All_local_env_size_gen lift_typing_size 0. + Definition All_local_rel_size := All_local_rel_size_gen lift_typing_size 0. + End Regular. + + Section Bidirectional. + Context {checking : global_env_ext -> context -> term -> term -> Type} {sorting : global_env_ext -> context -> term -> Universe.t -> Type}. + Context (checking_size : forall Σ Γ t T, checking Σ Γ t T -> size). + Context (sorting_size : forall Σ Γ t s, sorting Σ Γ t s -> size). + + Definition lift_sorting_size := lift_judgment_size checking_size (infer_sort_size sorting_size). + Definition All_local_env_sorting_size := All_local_env_size_gen lift_sorting_size 1. + Definition All_local_rel_sorting_size := All_local_rel_size_gen lift_sorting_size 1. + End Bidirectional. + +End EnvTyping. + +Module Type EnvTypingSig (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E). + Include EnvTyping T E TU. +End EnvTypingSig. + +Module Conversion (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) (ET : EnvTypingSig T E TU). + Import T E TU ET. + + Section Conversion. + Context (cumul_gen : global_env_ext -> context -> conv_pb -> term -> term -> Type). + + Inductive All_decls_alpha_pb {pb} {P : conv_pb -> term -> term -> Type} : + context_decl -> context_decl -> Type := + | all_decls_alpha_vass {na na' : binder_annot name} {t t' : term} + (eqna : eq_binder_annot na na') + (eqt : P pb t t') : + All_decls_alpha_pb (vass na t) (vass na' t') + + | all_decls_alpha_vdef {na na' : binder_annot name} {b t b' t' : term} + (eqna : eq_binder_annot na na') + (eqb : P Conv b b') (* Note that definitions must be convertible, otherwise this notion + of cumulativity is useless *) + (eqt : P pb t t') : + All_decls_alpha_pb (vdef na b t) (vdef na' b' t'). + + Derive Signature NoConfusion for All_decls_alpha_pb. + + Arguments All_decls_alpha_pb pb P : clear implicits. + + Definition cumul_pb_decls pb (Σ : global_env_ext) (Γ Γ' : context) : forall (x y : context_decl), Type := + All_decls_alpha_pb pb (cumul_gen Σ Γ). + + Definition cumul_pb_context pb (Σ : global_env_ext) := + All2_fold (cumul_pb_decls pb Σ). + + Definition cumul_ctx_rel Σ Γ Δ Δ' := + All2_fold (fun Δ Δ' => cumul_pb_decls Cumul Σ (Γ ,,, Δ) (Γ ,,, Δ')) Δ Δ'. + End Conversion. + + Arguments All_decls_alpha_pb pb P : clear implicits. + Notation conv cumul_gen Σ Γ := (cumul_gen Σ Γ Conv). + Notation cumul cumul_gen Σ Γ := (cumul_gen Σ Γ Cumul). + + Notation conv_decls cumul_gen := (cumul_pb_decls cumul_gen Conv). + Notation cumul_decls cumul_gen := (cumul_pb_decls cumul_gen Cumul). + Notation conv_context cumul_gen Σ := (cumul_pb_context cumul_gen Conv Σ). + Notation cumul_context cumul_gen Σ := (cumul_pb_context cumul_gen Cumul Σ). + +End Conversion. + +Module Type ConversionSig (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) (ET : EnvTypingSig T E TU). + Include Conversion T E TU ET. +End ConversionSig. + + +Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvTypingSig T E TU) (C: ConversionSig T E TU ET) (L: LookupSig T E). + (** *** Typing of inductive declarations *) + Import T E TU ET C L. + + Section GlobalMaps. + + Context {cf: checker_flags}. + Context (Pcmp: global_env_ext -> context -> conv_pb -> term -> term -> Type). + Context (P : global_env_ext -> context -> term -> typ_or_sort -> Type). + Definition on_context Σ ctx := + All_local_env (P Σ) ctx. + + (** For well-formedness of inductive declarations we need a way to check that a assumptions + of a given context is typable in a sort [u]. We also force well-typing of the let-ins + in any universe to imply wf_local. *) + Fixpoint type_local_ctx Σ (Γ Δ : context) (u : Universe.t) : Type := + match Δ with + | [] => wf_universe Σ u + | {| decl_body := None; decl_type := t |} :: Δ => type_local_ctx Σ Γ Δ u × P Σ (Γ ,,, Δ) t (Typ (tSort u)) + | {| decl_body := Some b; decl_type := t |} :: Δ => type_local_ctx Σ Γ Δ u × P Σ (Γ ,,, Δ) t Sort × P Σ (Γ ,,, Δ) b (Typ t) + end. + + Fixpoint sorts_local_ctx Σ (Γ Δ : context) (us : list Universe.t) : Type := + match Δ, us with + | [], [] => unit + | {| decl_body := None; decl_type := t |} :: Δ, u :: us => + sorts_local_ctx Σ Γ Δ us × P Σ (Γ ,,, Δ) t (Typ (tSort u)) + | {| decl_body := Some b; decl_type := t |} :: Δ, us => + sorts_local_ctx Σ Γ Δ us × P Σ (Γ ,,, Δ) t Sort × P Σ (Γ ,,, Δ) b (Typ t) + | _, _ => False + end. + + Implicit Types (mdecl : mutual_inductive_body) (idecl : one_inductive_body) (cdecl : constructor_body). + + Definition on_type Σ Γ T := P Σ Γ T Sort. + + Open Scope type_scope. + + Definition univs_ext_constraints univs φ := + ConstraintSet.union (constraints_of_udecl φ) univs. + + Definition satisfiable_udecl (univs : ContextSet.t) φ + := consistent (univs_ext_constraints (ContextSet.constraints univs) φ). + + (* Constraints from udecl between *global* universes + are implied by the constraints in univs *) + Definition valid_on_mono_udecl (univs : ContextSet.t) ϕ := + consistent_extension_on univs (constraints_of_udecl ϕ). + + (* Check that: *) + (* - declared levels are fresh *) + (* - all levels used in constraints are declared *) + Definition on_udecl (univs : ContextSet.t) (udecl : universes_decl) + := let levels := levels_of_udecl udecl in + let global_levels := global_levels univs in + let all_levels := LevelSet.union levels global_levels in + LevelSet.For_all (fun l => ~ LevelSet.In l global_levels) levels + /\ ConstraintSet.For_all (declared_cstr_levels all_levels) (constraints_of_udecl udecl) + /\ satisfiable_udecl univs udecl + /\ valid_on_mono_udecl univs udecl. + + (** Positivity checking of the inductive, ensuring that the inductive itself + can only appear at the right of an arrow in each argument's types. *) + (* + Definition positive_cstr_arg ninds npars narg (arg : term) : bool := + (* We decompose the constructor's arguments' type and verify the inductive references + only appear in the conclusion, if any. *) + let (ctx, concl) := decompose_prod_assum [] arg in + (* Again, we smash the context, as Coq does *) + let ctx := smash_context [] ctx in + alli (fun i d => noccur_between (npars + narg + i) ninds d.(decl_type)) 0 (List.rev ctx) && + let (hd, args) := decompose_app concl in + match hd with + | tRel i => + if noccur_between (npars + narg + #|ctx|) ninds (tRel i) then + (* Call to an unrelated variable *) + true + else (* Recursive call to the inductive *) + (* Coq disallows the inductive to be applied to another inductive in the block *) + forallb (noccur_between (npars + narg + #|ctx|) ninds) args + | tInd ind u => + if forallb (noccur_between (npars + narg + #|ctx|) ninds) args then + (* Unrelated inductive *) + true + else (* Nested inductive *) + true + end. + + Definition positive_cstr_args ninds npars (args : context) : bool := + alli (fun i decl => positive_cstr_arg nind npars i decl.(decl_type)) + (* We smash the context, just as Coq's kernel computes positivity on + weak-head normalized types *) + (List.rev (smash_context [] args)) + *) + + (** A constructor argument type [t] is positive w.r.t. an inductive block [mdecl] + when it's zeta-normal form is of the shape Π Δ. concl and: + - [t] does not refer to any inductive in the block. + In that case [t] must be a closed type under the context of parameters and + previous arguments. + - None of the variable assumptions in Δ refer to any inductive in the block, + but the conclusion [concl] is of the form [mkApps (tRel k) args] for k + refering to an inductive in the block, and none of the arguments [args] + refer to the inductive. #|args| must be the length of the full inductive application. + + Let-in assumptions in Δ are systematically unfolded, i.e. we really consider: + the zeta-reduction of [t]. *) + + Definition ind_realargs (o : one_inductive_body) := + match destArity [] o.(ind_type) with + | Some (ctx, _) => #|smash_context [] ctx| + | _ => 0 + end. + + Inductive positive_cstr_arg mdecl ctx : term -> Type := + | positive_cstr_arg_closed t : + closedn #|ctx| t -> + positive_cstr_arg mdecl ctx t + + | positive_cstr_arg_concl l k i : + (** Mutual inductive references in the conclusion are ok *) + #|ctx| <= k -> k < #|ctx| + #|mdecl.(ind_bodies)| -> + All (closedn #|ctx|) l -> + nth_error (List.rev mdecl.(ind_bodies)) (k - #|ctx|) = Some i -> + #|l| = ind_realargs i -> + positive_cstr_arg mdecl ctx (mkApps (tRel k) l) + + | positive_cstr_arg_let na b ty t : + positive_cstr_arg mdecl ctx (subst [b] 0 t) -> + positive_cstr_arg mdecl ctx (tLetIn na b ty t) + + | positive_cstr_arg_ass na ty t : + closedn #|ctx| ty -> + positive_cstr_arg mdecl (vass na ty :: ctx) t -> + positive_cstr_arg mdecl ctx (tProd na ty t). + + (** A constructor type [t] is positive w.r.t. an inductive block [mdecl] + and inductive [i] when it's zeta normal-form is of the shape Π Δ. concl and: + - All of the arguments in Δ are positive. + - The conclusion is of the shape [mkApps (tRel k) indices] + where [k] refers to the current inductive [i] and [indices] does not mention + any of the inductive types in the block. I.e. [indices] are closed terms + in [params ,,, args]. *) + + Inductive positive_cstr mdecl i (ctx : context) : term -> Type := + | positive_cstr_concl indices : + let headrel : nat := + (#|mdecl.(ind_bodies)| - S i + #|ctx|)%nat in + All (closedn #|ctx|) indices -> + positive_cstr mdecl i ctx (mkApps (tRel headrel) indices) + + | positive_cstr_let na b ty t : + positive_cstr mdecl i ctx (subst [b] 0 t) -> + positive_cstr mdecl i ctx (tLetIn na b ty t) + + | positive_cstr_ass na ty t : + positive_cstr_arg mdecl ctx ty -> + positive_cstr mdecl i (vass na ty :: ctx) t -> + positive_cstr mdecl i ctx (tProd na ty t). + + Definition lift_level n l := + match l with + | Level.lzero | Level.Level _ => l + | Level.Var k => Level.Var (n + k) + end. + + Definition lift_instance n l := + map (lift_level n) l. + + Definition lift_constraint n (c : Level.t * ConstraintType.t * Level.t) := + let '((l, r), l') := c in + ((lift_level n l, r), lift_level n l'). + + Definition lift_constraints n cstrs := + ConstraintSet.fold (fun elt acc => ConstraintSet.add (lift_constraint n elt) acc) + cstrs ConstraintSet.empty. + + Definition level_var_instance n (inst : list name) := + mapi_rec (fun i _ => Level.Var i) inst n. + + Fixpoint variance_cstrs (v : list Variance.t) (u u' : Instance.t) := + match v, u, u' with + | _, [], [] => ConstraintSet.empty + | v :: vs, u :: us, u' :: us' => + match v with + | Variance.Irrelevant => variance_cstrs vs us us' + | Variance.Covariant => ConstraintSet.add (u, ConstraintType.Le 0, u') (variance_cstrs vs us us') + | Variance.Invariant => ConstraintSet.add (u, ConstraintType.Eq, u') (variance_cstrs vs us us') + end + | _, _, _ => (* Impossible due to on_variance invariant *) ConstraintSet.empty + end. + + (** This constructs a duplication of the polymorphic universe context of the inductive, + where the two instances are additionally related according to the variance information. + *) + + Definition variance_universes univs v := + match univs with + | Monomorphic_ctx => None + | Polymorphic_ctx auctx => + let (inst, cstrs) := auctx in + let u' := level_var_instance 0 inst in + let u := lift_instance #|inst| u' in + let cstrs := ConstraintSet.union cstrs (lift_constraints #|inst| cstrs) in + let cstrv := variance_cstrs v u u' in + let auctx' := (inst ++ inst, ConstraintSet.union cstrs cstrv) in + Some (Polymorphic_ctx auctx', u, u') + end. + + (** A constructor type respects the given variance [v] if each constructor + argument respects it and each index (in the conclusion) does as well. + We formalize this by asking for a cumulativity relation between the contexts + of arguments and conversion of the lists of indices instanciated with [u] and + [u'] where [u `v` u']. *) + + Definition ind_arities mdecl := arities_context (ind_bodies mdecl). + + Definition ind_respects_variance Σ mdecl v indices := + let univs := ind_universes mdecl in + match variance_universes univs v with + | Some (univs, u, u') => + cumul_ctx_rel Pcmp (Σ, univs) (smash_context [] (ind_params mdecl))@[u] + (expand_lets_ctx (ind_params mdecl) (smash_context [] indices))@[u] + (expand_lets_ctx (ind_params mdecl) (smash_context [] indices))@[u'] + | None => False + end. + + Definition cstr_respects_variance Σ mdecl v cs := + let univs := ind_universes mdecl in + match variance_universes univs v with + | Some (univs, u, u') => + cumul_ctx_rel Pcmp (Σ, univs) (ind_arities mdecl ,,, smash_context [] (ind_params mdecl))@[u] + (expand_lets_ctx (ind_params mdecl) (smash_context [] (cstr_args cs)))@[u] + (expand_lets_ctx (ind_params mdecl) (smash_context [] (cstr_args cs)))@[u'] * + All2 + (Pcmp (Σ, univs) (ind_arities mdecl ,,, smash_context [] (ind_params mdecl ,,, cstr_args cs))@[u] Conv) + (map (subst_instance u ∘ expand_lets (ind_params mdecl ,,, cstr_args cs)) (cstr_indices cs)) + (map (subst_instance u' ∘ expand_lets (ind_params mdecl ,,, cstr_args cs)) (cstr_indices cs)) + | None => False (* Monomorphic inductives have no variance attached *) + end. + + (* Conclusion head: reference to the current inductive in the block *) + Definition cstr_concl_head mdecl i cdecl := + tRel (#|mdecl.(ind_bodies)| - S i + #|mdecl.(ind_params)| + #|cstr_args cdecl|). + + (* Constructor conclusion shape: the inductives type applied to variables for + the (non-let) parameters + followed by the indices *) + Definition cstr_concl mdecl i cdecl := + (mkApps (cstr_concl_head mdecl i cdecl) + (to_extended_list_k mdecl.(ind_params) #|cstr_args cdecl| + ++ cstr_indices cdecl)). + + Record on_constructor Σ mdecl i idecl ind_indices cdecl cunivs := { + (* cdecl.1 fresh ?? *) + cstr_args_length : context_assumptions (cstr_args cdecl) = cstr_arity cdecl; + + cstr_eq : cstr_type cdecl = + it_mkProd_or_LetIn mdecl.(ind_params) + (it_mkProd_or_LetIn (cstr_args cdecl) + (cstr_concl mdecl i cdecl)); + (* The type of the constructor canonically has this shape: parameters, real + arguments ending with a reference to the inductive applied to the + (non-lets) parameters and arguments *) + + on_ctype : on_type Σ (arities_context mdecl.(ind_bodies)) (cstr_type cdecl); + on_cargs : + sorts_local_ctx Σ (arities_context mdecl.(ind_bodies) ,,, mdecl.(ind_params)) + cdecl.(cstr_args) cunivs; + on_cindices : + ctx_inst (fun Σ Γ t T => P Σ Γ t (Typ T)) Σ (arities_context mdecl.(ind_bodies) ,,, mdecl.(ind_params) ,,, cdecl.(cstr_args)) + cdecl.(cstr_indices) + (List.rev (lift_context #|cdecl.(cstr_args)| 0 ind_indices)); + + on_ctype_positive : (* The constructor type is positive *) + positive_cstr mdecl i [] (cstr_type cdecl); + + on_ctype_variance : (* The constructor type respect the variance annotation + on polymorphic universes, if any. *) + forall v, ind_variance mdecl = Some v -> + cstr_respects_variance Σ mdecl v cdecl; + + on_lets_in_type : if lets_in_constructor_types + then True else is_true (is_assumption_context (cstr_args cdecl)) + }. + + Arguments on_ctype {Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_cargs {Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_cindices {Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments cstr_args_length {Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments cstr_eq {Σ mdecl i idecl ind_indices cdecl cunivs}. + + Definition on_constructors Σ mdecl i idecl ind_indices := + All2 (on_constructor Σ mdecl i idecl ind_indices). + + (** Each projection type corresponds to a non-let argument of the + corresponding constructor. It is parameterized over the + parameters of the inductive type and all the preceding arguments + of the constructor. When computing the type of a projection for argument + [n] at a given instance of the parameters and a given term [t] in the inductive + type, we instantiate the argument context by corresponsping projections + [t.π1 ... t.πn-1]. This is essential for subject reduction to hold: each + projections type can only refer to the record object through projections. + + Projection types have their parameter and argument contexts smashed to avoid + costly computations during type-checking and reduction: we can just substitute + the instances of parameters and the inductive value without considering the + presence of let bindings. *) + + Record on_proj mdecl mind i k (p : projection_body) decl := + { on_proj_name : (* All projections are be named after a constructor argument. *) + binder_name (decl_name decl) = nNamed p.(proj_name); + on_proj_type : + (** The stored projection type already has the references to the inductive + type substituted along with the previous arguments replaced by projections. *) + let u := abstract_instance mdecl.(ind_universes) in + let ind := {| inductive_mind := mind; inductive_ind := i |} in + p.(proj_type) = subst (inds mind u mdecl.(ind_bodies)) (S (ind_npars mdecl)) + (subst (projs ind mdecl.(ind_npars) k) 0 + (lift 1 k (decl_type decl))); + on_proj_relevance : p.(proj_relevance) = decl.(decl_name).(binder_relevance) }. + + Definition on_projection mdecl mind i cdecl (k : nat) (p : projection_body) := + let Γ := smash_context [] (cdecl.(cstr_args) ++ mdecl.(ind_params)) in + match nth_error Γ (context_assumptions cdecl.(cstr_args) - S k) with + | None => False + | Some decl => on_proj mdecl mind i k p decl + end. + + Record on_projections mdecl mind i idecl (ind_indices : context) cdecl := + { on_projs_record : #|idecl.(ind_ctors)| = 1; + (** The inductive must be a record *) + + on_projs_noidx : #|ind_indices| = 0; + (** The inductive cannot have indices *) + + on_projs_elim : idecl.(ind_kelim) = IntoAny; + (** This ensures that all projections are definable *) + + on_projs_all : #|idecl.(ind_projs)| = context_assumptions (cstr_args cdecl); + (** There are as many projections as (non-let) constructor arguments *) + + on_projs : Alli (on_projection mdecl mind i cdecl) 0 idecl.(ind_projs) }. + + Definition check_constructors_smaller φ cunivss ind_sort := + Forall (fun cunivs => + Forall (fun argsort => leq_universe φ argsort ind_sort) cunivs) cunivss. + + (** This ensures that all sorts in kelim are lower + or equal to the top elimination sort, if set. + For inductives in Type we do not check [kelim] currently. *) + + Definition constructor_univs := list Universe.t. + (* The sorts of the arguments context (without lets) *) + + Definition elim_sort_prop_ind (ind_ctors_sort : list constructor_univs) := + match ind_ctors_sort with + | [] => (* Empty inductive proposition: *) IntoAny + | [ s ] => + if forallb Universes.is_propositional s then + IntoAny (* Singleton elimination *) + else + IntoPropSProp (* Squashed: some arguments are higher than Prop, restrict to Prop *) + | _ => (* Squashed: at least 2 constructors *) IntoPropSProp + end. + + Definition elim_sort_sprop_ind (ind_ctors_sort : list constructor_univs) := + match ind_ctors_sort with + | [] => (* Empty inductive strict proposition: *) IntoAny + | _ => (* All other inductives in SProp are squashed *) IntoSProp + end. + + Definition check_ind_sorts (Σ : global_env_ext) + params kelim ind_indices cdecls ind_sort : Type := + if Universe.is_prop ind_sort then + (** The inductive is declared in the impredicative sort Prop *) + (** No universe-checking to do: any size of constructor argument is allowed, + however elimination restrictions apply. *) + (allowed_eliminations_subset kelim (elim_sort_prop_ind cdecls) : Type) + else if Universe.is_sprop ind_sort then + (** The inductive is declared in the impredicative sort SProp *) + (** No universe-checking to do: any size of constructor argument is allowed, + however elimination restrictions apply. *) + (allowed_eliminations_subset kelim (elim_sort_sprop_ind cdecls) : Type) + else + (** The inductive is predicative: check that all constructors arguments are + smaller than the declared universe. *) + check_constructors_smaller Σ cdecls ind_sort + × if indices_matter then + type_local_ctx Σ params ind_indices ind_sort + else True. + + Record on_ind_body Σ mind mdecl i idecl := + { (** The type of the inductive must be an arity, sharing the same params + as the rest of the block, and maybe having a context of indices. *) + ind_arity_eq : idecl.(ind_type) + = it_mkProd_or_LetIn mdecl.(ind_params) + (it_mkProd_or_LetIn idecl.(ind_indices) (tSort idecl.(ind_sort))); + + (** It must be well-typed in the empty context. *) + onArity : on_type Σ [] idecl.(ind_type); + + (** The sorts of the arguments contexts of each constructor *) + ind_cunivs : list constructor_univs; + + (** Constructors are well-typed *) + onConstructors : + on_constructors Σ mdecl i idecl idecl.(ind_indices) idecl.(ind_ctors) ind_cunivs; + + (** Projections, if any, are well-typed *) + onProjections : + match idecl.(ind_projs), idecl.(ind_ctors) return Type with + | [], _ => True + | _, [ o ] => + on_projections mdecl mind i idecl idecl.(ind_indices) o + | _, _ => False + end; + + (** The universes and elimination sorts must be correct w.r.t. + the universe of the inductive and the universes in its constructors, which + are declared in [on_constructors]. *) + ind_sorts : + check_ind_sorts Σ mdecl.(ind_params) idecl.(ind_kelim) + idecl.(ind_indices) ind_cunivs idecl.(ind_sort); + + onIndices : + (* The inductive type respect the variance annotation on polymorphic universes, if any. *) + match ind_variance mdecl with + | Some v => ind_respects_variance Σ mdecl v idecl.(ind_indices) + | None => True + end + }. + + Definition on_variance Σ univs (variances : option (list Variance.t)) := + match univs return Type with + | Monomorphic_ctx => variances = None + | Polymorphic_ctx auctx => + match variances with + | None => unit + | Some v => + ∑ univs' i i', + [× (variance_universes univs v = Some (univs', i, i')), + consistent_instance_ext (Σ, univs') univs i, + consistent_instance_ext (Σ, univs') univs i' & + List.length v = #|UContext.instance (AUContext.repr auctx)|] + end + end. + + (** We allow empty blocks for simplicity + (no well-typed reference to them can be made). *) + + Record on_inductive Σ mind mdecl := + { onInductives : Alli (on_ind_body Σ mind mdecl) 0 mdecl.(ind_bodies); + (** We check that the context of parameters is well-formed and that + the size annotation counts assumptions only (no let-ins). *) + onParams : on_context Σ mdecl.(ind_params); + onNpars : context_assumptions mdecl.(ind_params) = mdecl.(ind_npars); + (** We check that the variance annotations are well-formed: i.e. they + form a valid universe context. *) + onVariance : on_variance Σ mdecl.(ind_universes) mdecl.(ind_variance); + }. + + (** *** Typing of constant declarations *) + + Definition on_constant_decl Σ d := + match d.(cst_body) with + | Some trm => P Σ [] trm (Typ d.(cst_type)) + | None => on_type Σ [] d.(cst_type) + end. + + Definition on_global_decl Σ kn decl := + match decl with + | ConstantDecl d => on_constant_decl Σ d + | InductiveDecl inds => on_inductive Σ kn inds + end. + + (** *** Typing of global environment + + All declarations should be typeable and the global + set of universe constraints should be consistent. *) + + (** Well-formed global environments have no name clash. *) + + Definition fresh_global (s : kername) (g : global_declarations) : Prop := + Forall (fun g => g.1 <> s) g. + + Record on_global_decls_data (univs : ContextSet.t) retro (Σ : global_declarations) (kn : kername) (d : global_decl) := + { + kn_fresh : fresh_global kn Σ ; + udecl := universes_decl_of_decl d ; + on_udecl_udecl : on_udecl univs udecl ; + on_global_decl_d : on_global_decl (mk_global_env univs Σ retro, udecl) kn d + }. + + Inductive on_global_decls (univs : ContextSet.t) (retro : Retroknowledge.t): global_declarations -> Type := + | globenv_nil : on_global_decls univs retro [] + | globenv_decl Σ kn d : + on_global_decls univs retro Σ -> + on_global_decls_data univs retro Σ kn d -> + on_global_decls univs retro (Σ ,, (kn, d)). + + Derive Signature for on_global_decls. + + Lemma fresh_global_iff_not_In kn Σ + : fresh_global kn Σ <-> ~ In kn (map fst Σ). + Proof using Type. + rewrite /fresh_global; split; [ induction 1 | induction Σ; constructor ]; cbn in *. + all: tauto. + Qed. + + Lemma fresh_global_iff_lookup_global_None kn Σ + : fresh_global kn Σ <-> lookup_global Σ kn = None. + Proof using Type. rewrite fresh_global_iff_not_In lookup_global_None //. Qed. + + Lemma NoDup_on_global_decls univs retro decls + : on_global_decls univs retro decls -> NoDup (List.map fst decls). + Proof using Type. + induction 1; cbn in *; constructor => //. + let H := match goal with H : on_global_decls_data _ _ _ _ _ |- _ => H end in + move: H. + case. + rewrite fresh_global_iff_not_In; auto. + Qed. + + Definition on_global_univs (c : ContextSet.t) := + let levels := global_levels c in + let cstrs := ContextSet.constraints c in + ConstraintSet.For_all (declared_cstr_levels levels) cstrs /\ + LS.For_all (negb ∘ Level.is_var) levels /\ + consistent cstrs. + + Definition on_global_env (g : global_env) : Type := + on_global_univs g.(universes) × on_global_decls g.(universes) g.(retroknowledge) g.(declarations). + + Definition on_global_env_ext (Σ : global_env_ext) := + on_global_env Σ.1 × on_udecl Σ.(universes) Σ.2. + + End GlobalMaps. + + Arguments cstr_args_length {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments cstr_eq {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_ctype {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_cargs {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_cindices {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_ctype_positive {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + Arguments on_ctype_variance {_ Pcmp P Σ mdecl i idecl ind_indices cdecl cunivs}. + + Arguments ind_arity_eq {_ Pcmp P Σ mind mdecl i idecl}. + Arguments ind_cunivs {_ Pcmp P Σ mind mdecl i idecl}. + Arguments onArity {_ Pcmp P Σ mind mdecl i idecl}. + Arguments onConstructors {_ Pcmp P Σ mind mdecl i idecl}. + Arguments onProjections {_ Pcmp P Σ mind mdecl i idecl}. + Arguments ind_sorts {_ Pcmp P Σ mind mdecl i idecl}. + Arguments onIndices {_ Pcmp P Σ mind mdecl i idecl}. + + Arguments onInductives {_ Pcmp P Σ mind mdecl}. + Arguments onParams {_ Pcmp P Σ mind mdecl}. + Arguments onNpars {_ Pcmp P Σ mind mdecl}. + Arguments onVariance {_ Pcmp P Σ mind mdecl}. + + + Lemma type_local_ctx_impl (P Q : global_env_ext -> context -> term -> typ_or_sort -> Type) Σ Γ Δ u : + type_local_ctx P Σ Γ Δ u -> + (forall Γ t T, P Σ Γ t T -> Q Σ Γ t T) -> + type_local_ctx Q Σ Γ Δ u. + Proof. + intros HP HPQ. revert HP; induction Δ in Γ, HPQ |- *; simpl; auto. + destruct a as [na [b|] ty]; simpl; auto. + intros. intuition auto. intuition auto. + Qed. + + Lemma sorts_local_ctx_impl (P Q : global_env_ext -> context -> term -> typ_or_sort -> Type) Σ Γ Δ u : + sorts_local_ctx P Σ Γ Δ u -> + (forall Γ t T, P Σ Γ t T -> Q Σ Γ t T) -> + sorts_local_ctx Q Σ Γ Δ u. + Proof. + intros HP HPQ. revert HP; induction Δ in Γ, HPQ, u |- *; simpl; auto. + destruct a as [na [b|] ty]; simpl; auto. + intros. intuition auto. intuition auto. + destruct u; auto. intuition eauto. + Qed. + + Lemma on_global_env_impl {cf : checker_flags} Pcmp P Q : + (forall Σ Γ t T, + on_global_env Pcmp P Σ.1 -> + on_global_env Pcmp Q Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + forall Σ, on_global_env Pcmp P Σ -> on_global_env Pcmp Q Σ. + Proof. + intros X Σ [cu IH]. split; auto. + revert cu IH; generalize (universes Σ) as univs, (retroknowledge Σ) as retro, (declarations Σ). clear Σ. + induction g; intros; auto. constructor; auto. + depelim IH. specialize (IHg cu IH). constructor; auto. + pose proof (globenv_decl _ _ _ _ _ _ _ IH o). + destruct o. constructor; auto. + assert (X' := fun Γ t T => X ({| universes := univs; declarations := _ |}, udecl0) Γ t T + (cu, IH) (cu, IHg)); clear X. + rename X' into X. + clear IH IHg. destruct d; simpl. + - destruct c; simpl. destruct cst_body0; cbn in *; now eapply X. + - destruct on_global_decl_d0 as [onI onP onNP]. + constructor; auto. + -- eapply Alli_impl; tea. intros. + refine {| ind_arity_eq := X1.(ind_arity_eq); + ind_cunivs := X1.(ind_cunivs) |}. + --- apply onArity in X1. unfold on_type in *; simpl in *. + now eapply X. + --- pose proof X1.(onConstructors) as X11. red in X11. + eapply All2_impl; eauto. + simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. + * apply X; eauto. + * clear -X0 X on_cargs0. revert on_cargs0. + generalize (cstr_args x0). + induction c in y |- *; destruct y; simpl; auto; + destruct a as [na [b|] ty]; simpl in *; auto; + split; intuition eauto. + * clear -X0 X on_cindices0. + revert on_cindices0. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). + induction 1; simpl; constructor; auto. + --- simpl; intros. pose (onProjections X1) as X2. simpl in *; auto. + --- destruct X1. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. + * apply ind_sorts0. + * destruct indices_matter; auto. + eapply type_local_ctx_impl; eauto. + eapply ind_sorts0. + --- eapply X1.(onIndices). + -- red in onP. red. + eapply All_local_env_impl; tea. + Qed. + +End GlobalMaps. + +Module Type GlobalMapsSig (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvTypingSig T E TU) (C: ConversionSig T E TU ET) (L: LookupSig T E). + Include GlobalMaps T E TU ET C L. +End GlobalMapsSig. + +Module Type ConversionParSig (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) (ET : EnvTypingSig T E TU). + + Import T E TU ET. + + Parameter Inline cumul_gen : forall {cf : checker_flags}, global_env_ext -> context -> conv_pb -> term -> term -> Type. + +End ConversionParSig. + +Module Type Typing (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) (ET : EnvTypingSig T E TU) + (CT : ConversionSig T E TU ET) (CS : ConversionParSig T E TU ET). + + Import T E TU ET CT CS. + + Parameter Inline typing : forall `{checker_flags}, global_env_ext -> context -> term -> term -> Type. + + Notation " Σ ;;; Γ |- t : T " := + (typing Σ Γ t T) (at level 50, Γ, t, T at next level) : type_scope. + + Notation wf_local Σ Γ := (All_local_env (lift_typing Σ) Γ). + +End Typing. + +Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) + (ET : EnvTypingSig T E TU) (CT : ConversionSig T E TU ET) + (CS : ConversionParSig T E TU ET) (Ty : Typing T E TU ET CT CS) + (L : LookupSig T E) (GM : GlobalMapsSig T E TU ET CT L). + + Import T E L TU ET CT GM CS Ty. + + Definition isType `{checker_flags} (Σ : global_env_ext) (Γ : context) (t : term) := + infer_sort (typing_sort typing) Σ Γ t. + + (** This predicate enforces that there exists typing derivations for every typable term in env. *) + + Definition Forall_decls_typing `{checker_flags} + (P : global_env_ext -> context -> term -> term -> Type) + := on_global_env cumul_gen (lift_typing P). + + (** *** Typing of local environments *) + + Definition type_local_decl `{checker_flags} Σ Γ d := + match d.(decl_body) with + | None => isType Σ Γ d.(decl_type) + | Some body => Σ ;;; Γ |- body : d.(decl_type) + end. + + (** ** Induction principle for typing up-to a global environment *) + + Lemma refine_type `{checker_flags} Σ Γ t T U : Σ ;;; Γ |- t : T -> T = U -> Σ ;;; Γ |- t : U. + Proof. now intros Ht ->. Qed. + + Definition wf_local_rel `{checker_flags} Σ := All_local_rel (lift_typing typing Σ). + + (** Functoriality of global environment typing derivations + folding of the well-formed + environment assumption. *) + Lemma on_wf_global_env_impl `{checker_flags} {Σ : global_env} {wfΣ : on_global_env cumul_gen (lift_typing typing) Σ} P Q : + (forall Σ Γ t T, on_global_env cumul_gen (lift_typing typing) Σ.1 -> + on_global_env cumul_gen P Σ.1 -> + on_global_env cumul_gen Q Σ.1 -> + P Σ Γ t T -> Q Σ Γ t T) -> + on_global_env cumul_gen P Σ -> on_global_env cumul_gen Q Σ. + Proof. + unfold on_global_env in *. + intros X [hu X0]. split; auto. + simpl in *. destruct wfΣ as [cu wfΣ]. revert cu wfΣ. + revert X0. generalize (universes Σ) as univs, (retroknowledge Σ) as retro, (declarations Σ). clear hu Σ. + induction 1; constructor; try destruct o; try constructor; auto. + { depelim wfΣ. eauto. } + depelim wfΣ. specialize (IHX0 cu wfΣ). destruct o. + assert (X' := fun Γ t T => X ({| universes := univs; declarations := Σ |}, udecl0) Γ t T + (cu, wfΣ) (cu, X0) (cu, IHX0)); clear X. + rename X' into X. + clear IHX0. destruct d; simpl. + - destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. + - simpl in *. destruct on_global_decl_d0 as [onI onP onNP]. + constructor; auto. + -- eapply Alli_impl; tea. intros. + refine {| ind_arity_eq := X1.(ind_arity_eq); + ind_cunivs := X1.(ind_cunivs) |}. + --- apply onArity in X1. unfold on_type in *; simpl in *. + now eapply X. + --- pose proof X1.(onConstructors) as X11. red in X11. + eapply All2_impl; eauto. + simpl. intros. destruct X2 as [? ? ? ?]; unshelve econstructor; eauto. + * apply X; eauto. + * clear -X0 X on_cargs0. revert on_cargs0. + generalize (cstr_args x0). + induction c in y |- *; destruct y; simpl; auto; + destruct a as [na [b|] ty]; simpl in *; auto; + split; intuition eauto. + * clear -X0 X on_cindices0. + revert on_cindices0. + generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). + generalize (cstr_indices x0). + induction 1; simpl; constructor; auto. + --- simpl; intros. pose (onProjections X1). simpl in *; auto. + --- destruct X1. simpl. unfold check_ind_sorts in *. + destruct Universe.is_prop; auto. + destruct Universe.is_sprop; auto. + split. + * apply ind_sorts0. + * destruct indices_matter; auto. + eapply type_local_ctx_impl; eauto. + eapply ind_sorts0. + --- eapply X1.(onIndices). + -- red in onP. red. + eapply All_local_env_impl; tea. + Qed. + +End DeclarationTyping. + +Module Type DeclarationTypingSig (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) + (ET : EnvTypingSig T E TU) (CT : ConversionSig T E TU ET) + (CS : ConversionParSig T E TU ET) (Ty : Typing T E TU ET CT CS) + (L : LookupSig T E) (GM : GlobalMapsSig T E TU ET CT L). + Include DeclarationTyping T E TU ET CT CS Ty L GM. +End DeclarationTypingSig. diff --git a/pcuic/theories/PCUICAst.v b/pcuic/theories/PCUICAst.v index f2e4f3c72..94d4e9bd0 100644 --- a/pcuic/theories/PCUICAst.v +++ b/pcuic/theories/PCUICAst.v @@ -1,8 +1,8 @@ (* Distributed under the terms of the MIT license. *) From Coq Require Import ssreflect Morphisms. -From MetaCoq.Template Require Export utils Universes BasicAst Environment Reflect. -From MetaCoq.Template Require EnvironmentTyping. -From MetaCoq.PCUIC Require Export PCUICPrimitive. +From MetaCoq.Template Require Export utils Universes BasicAst Reflect. +From MetaCoq.PCUIC Require Export PCUICPrimitive Environment. +From MetaCoq.PCUIC Require EnvironmentTyping. From Equations Require Import Equations. (** * AST of the Polymorphic Cumulative Calculus of Inductive Constructions diff --git a/pcuic/theories/PCUICTypedAst.v b/pcuic/theories/PCUICTypedAst.v index 6f8460909..85b9fd159 100644 --- a/pcuic/theories/PCUICTypedAst.v +++ b/pcuic/theories/PCUICTypedAst.v @@ -1,7 +1,7 @@ (* Distributed under the terms of the MIT license. *) From Coq Require Import Morphisms. From MetaCoq.Template Require Export utils Universes BasicAst Environment Reflect. -From MetaCoq.Template Require EnvironmentTyping. +From MetaCoq.PCUIC Require EnvironmentTyping. From MetaCoq.PCUIC Require Export PCUICPrimitive. From Equations Require Import Equations. Require Vector Fin. diff --git a/pcuic/theories/utils/PCUICPretty.v b/pcuic/theories/utils/PCUICPretty.v index 8c8928960..dccec1eba 100644 --- a/pcuic/theories/utils/PCUICPretty.v +++ b/pcuic/theories/utils/PCUICPretty.v @@ -324,7 +324,6 @@ Module PrintTermTree. else (" := " ^ nl ^ print_term Σ' true nil true false b ^ "." ^ nl) | None => "." end ^ acc) - | _ => "" end end. diff --git a/pcuic/theories/utils/PCUICPrimitive.v b/pcuic/theories/utils/PCUICPrimitive.v index 9d7cb25ca..5f47ca192 100644 --- a/pcuic/theories/utils/PCUICPrimitive.v +++ b/pcuic/theories/utils/PCUICPrimitive.v @@ -1,6 +1,6 @@ (* Distributed under the terms of the MIT license. *) -From MetaCoq.Template Require Import utils Universes BasicAst Primitive Reflect - Environment EnvironmentTyping. +From MetaCoq.Template Require Import utils Universes BasicAst Primitive Reflect. +From MetaCoq.PCUIC Require Import Environment EnvironmentTyping. From Equations Require Import Equations. From Coq Require Import ssreflect. From Coq Require Import Uint63 SpecFloat. diff --git a/translations/translation_utils.v b/translations/translation_utils.v index bac74b33f..b9f7f3a2b 100644 --- a/translations/translation_utils.v +++ b/translations/translation_utils.v @@ -372,5 +372,8 @@ Definition TranslateRec {tsl : Translation} (ΣE : tsl_context) {A} (t : A) := ret (Σ', E') end end + (** FIXME:*) + | ModuleDecl _ => tmPrint "Module" ;; ret ΣE + | ModuleTypeDecl _ => tmPrint "Module Type" ;; ret ΣE end) (fst p).(declarations) ΣE. From 4c624623fb9459b68ba79339a0d1f6a114b17ffb Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Sun, 15 Jan 2023 20:39:26 +0800 Subject: [PATCH 41/43] TemplateToPcuic translation for modules --- pcuic/theories/Environment.v | 2 +- pcuic/theories/PCUICAst.v | 10 +- pcuic/theories/PCUICTyping.v | 2 +- pcuic/theories/TemplateToPCUIC.v | 379 ++++++++++++++++++- pcuic/theories/TemplateToPCUICCorrectness.v | 332 +++++++++++++--- pcuic/theories/Typing/PCUICWeakeningEnvTyp.v | 2 +- template-coq/theories/Checker.v | 44 ++- template-coq/theories/Environment.v | 2 +- template-coq/theories/EnvironmentTyping.v | 58 +-- template-coq/theories/EtaExpand.v | 36 +- template-coq/theories/Pretty.v | 29 +- template-coq/theories/ReflectAst.v | 14 +- template-coq/theories/TemplateCheckWf.v | 31 +- template-coq/theories/Typing.v | 18 +- 14 files changed, 781 insertions(+), 178 deletions(-) diff --git a/pcuic/theories/Environment.v b/pcuic/theories/Environment.v index f7eddb88b..05809e31f 100644 --- a/pcuic/theories/Environment.v +++ b/pcuic/theories/Environment.v @@ -294,7 +294,7 @@ Module Environment (T : Term). declarations := []; retroknowledge := Retroknowledge.empty |}. - Definition add_global_decl Σ decl := + Definition add_global_decl decl Σ := {| universes := Σ.(universes); declarations := decl :: Σ.(declarations); retroknowledge := Σ.(retroknowledge) |}. diff --git a/pcuic/theories/PCUICAst.v b/pcuic/theories/PCUICAst.v index 94d4e9bd0..ab60e9124 100644 --- a/pcuic/theories/PCUICAst.v +++ b/pcuic/theories/PCUICAst.v @@ -1,8 +1,8 @@ (* Distributed under the terms of the MIT license. *) From Coq Require Import ssreflect Morphisms. From MetaCoq.Template Require Export utils Universes BasicAst Reflect. -From MetaCoq.PCUIC Require Export PCUICPrimitive Environment. -From MetaCoq.PCUIC Require EnvironmentTyping. +From MetaCoq.PCUIC Require Export PCUICPrimitive. +From MetaCoq.PCUIC Require Environment EnvironmentTyping. From Equations Require Import Equations. (** * AST of the Polymorphic Cumulative Calculus of Inductive Constructions @@ -443,7 +443,7 @@ Fixpoint closedu (k : nat) (t : term) : bool := | _ => true end. -Module PCUICTerm <: Term. +Module PCUICTerm <: Environment.Term. Definition term := term. @@ -465,7 +465,7 @@ End PCUICTerm. (* These functors derive the notion of local context and lift substitution, term lifting, the closed predicate to them. *) -Module PCUICEnvironment := Environment PCUICTerm. +Module PCUICEnvironment := Environment.Environment PCUICTerm. Export PCUICEnvironment. (* Do NOT `Include` this module, as this would sadly duplicate the rewrite database... *) @@ -489,7 +489,7 @@ Definition inds ind u (l : list one_inductive_body) := end in aux (List.length l). -Module PCUICTermUtils <: TermUtils PCUICTerm PCUICEnvironment. +Module PCUICTermUtils <: Environment.TermUtils PCUICTerm PCUICEnvironment. Definition destArity := destArity. Definition inds := inds. diff --git a/pcuic/theories/PCUICTyping.v b/pcuic/theories/PCUICTyping.v index 95bd4e3a9..1d5bc53e6 100644 --- a/pcuic/theories/PCUICTyping.v +++ b/pcuic/theories/PCUICTyping.v @@ -1252,7 +1252,7 @@ Section All_local_env. split. * red; cbn. split; [split;[lsets|csets]| |]. exists [(kn, decl)] => //. - apply Retroknowledge.extends_refl. + apply Environment.Retroknowledge.extends_refl. * split => //. * destruct o; assumption. - intros hl. destruct (IHΣp hl) as [Σ' []]. diff --git a/pcuic/theories/TemplateToPCUIC.v b/pcuic/theories/TemplateToPCUIC.v index 03b590283..806ba9334 100644 --- a/pcuic/theories/TemplateToPCUIC.v +++ b/pcuic/theories/TemplateToPCUIC.v @@ -1,5 +1,5 @@ (* Distributed under the terms of the MIT license. *) -From Coq Require Import Uint63 FloatOps FloatAxioms. +From Coq Require Import Uint63 FloatOps FloatAxioms Logic.Decidable. From MetaCoq.Template Require Import config utils AstUtils Primitive EnvMap. From MetaCoq.Template Require TemplateProgram. From MetaCoq.PCUIC Require Import PCUICAst PCUICPrimitive PCUICCases PCUICProgram. @@ -146,15 +146,376 @@ Section Trans. ind_universes := md.(Ast.Env.ind_universes); ind_variance := md.(Ast.Env.ind_variance) |}. - Definition trans_global_decl (d : Ast.Env.global_decl) := - match d with - | Ast.Env.ConstantDecl bd => ConstantDecl (trans_constant_body bd) - | Ast.Env.InductiveDecl bd => InductiveDecl (trans_minductive_body bd) + (* kn := Coq.Init.M := (Coq.Init, M) *) + Definition kn_append (kn: kername) (id: ident) : kername := ((MPdot kn.1 kn.2), id). + + Inductive kn_extends : kername -> kername -> Prop := + | kn_extends_one kn id : kn_extends kn (kn_append kn id) + | kn_extends_step id kn kn' (H: kn_extends kn kn') : kn_extends kn (kn_append kn' id). + + Lemma kn_extends_exists : forall kn kn', kn_extends kn kn' -> exists l: list ident, + l <> [] /\ fold_right (fun id kn => kn_append kn id) kn l = kn'. + Proof. + intros kn kn' Hext. + induction Hext. + - exists [id]. split; auto. discriminate. + - destruct IHHext as [l [Hne H]]. + exists (id::l). + split. simpl. discriminate. + simpl. now rewrite <- H. + Qed. + + Lemma kn_append_neq : forall kn id, kn_append kn id <> kn. + Proof. + intros [mp i]. revert i. + induction mp; try discriminate. + intros i' id'. + unfold kn_append in *; simpl in *. + intros contra. inversion contra; subst. + assert ((MPdot mp id, id) = (mp, id)) by now rewrite H0. + apply IHmp in H. apply H. + Qed. + + Lemma kn_extends' : forall id kn kn', + kn_extends (kn_append kn id) kn' -> kn_extends kn kn'. + Proof. + intros id kn kn' H. + remember (kn_append kn id) as knid. + induction H; subst. + - apply kn_extends_step. apply kn_extends_one. + - assert (kn_extends kn kn') by now apply IHkn_extends. + now apply kn_extends_step. + Qed. + + Lemma kn_extends_trans : forall kn kn' kn'', + kn_extends kn kn' -> kn_extends kn' kn'' -> kn_extends kn kn''. + Proof. + intros kn kn' kn'' H1 H2. + generalize dependent kn''. + induction H1. + - remember (kn_append kn id) as knid. + intros kn'' H2. induction H2; subst. + -- apply kn_extends_step. apply kn_extends_one. + -- assert (kn_extends kn kn') by now apply IHkn_extends. + now apply kn_extends_step. + - intros kn'' H2. apply IHkn_extends. + remember (kn_append kn' id) as kn'id. + induction H2; subst. + -- apply kn_extends_step. apply kn_extends_one. + -- apply kn_extends_step. + assert (kn_extends kn (kn_append kn'0 id0)). { + apply IHkn_extends. apply kn_extends_step. + now apply kn_extends' with (id := id). + } + now apply IHkn_extends0. + Qed. + + Lemma kn_extends_inversion_true : forall mp mp' i i' id id', + kn_extends (MPdot mp i, id) (MPdot mp' i', id') -> kn_extends (mp, i) (mp', i'). + Proof. + intros. inversion H; subst. + - apply kn_extends_one. + - destruct kn' as [mp' i']; cbn in *. + apply (kn_extends' id). + apply H2. + Qed. + + Lemma kn_appended_is_mpdot : forall kn id, + exists mp i, (kn_append kn id) = (MPdot mp i, id). + Proof. + intros. unfold kn_append. now exists kn.1, kn.2. + Qed. + + Lemma kn_extends_is_mpdot : forall kn kn', kn_extends kn kn' -> exists mp i, kn'.1 = (MPdot mp i). + Proof. + intros. apply kn_extends_exists in H as [l [Hne H]]. + destruct l. contradiction. + simpl in H. remember (fold_right (fun (id : ident) (kn : kername) => kn_append kn id) kn l) as kn''. + pose proof (kn_appended_is_mpdot kn'' i) as [mp [id Hdot]]. + exists mp, id. + subst kn'. rewrite Hdot. reflexivity. + Qed. + + Lemma kn_extends_irrefl : forall kn, ~(kn_extends kn kn). + Proof. + intros [mp id]. + revert id. + induction mp. + - intros id contra. apply kn_extends_is_mpdot in contra as [? [? ?]]. + discriminate. + - intros id' contra. apply kn_extends_is_mpdot in contra as [? [? ?]]. + discriminate. + - intros id' H. inversion H; subst. + -- rewrite H2 in H. now apply IHmp in H. + -- destruct kn' as [mp i]; cbn in *. + apply kn_extends_inversion_true in H. + now apply IHmp in H. + Qed. + + Lemma kn_extends_neq : forall kn kn', kn_extends kn kn' -> kn <> kn'. + Proof. + intros kn kn' H contra. + rewrite contra in H. + now apply kn_extends_irrefl in H. + Qed. + + (** + Claim: The aliasing is a tree. + Reason: + 1. One can only alias backwards to a already defined module. + 2. As a naive implementation, aliasing is (deep) copying. + + We can than verify the claim inductively: an actual module is a + single-node tree. For the inductive step, suppose we already have a tree + of aliases. Then a new alias can only refer to a node on the tree, forming + a tree. + + For the case of aliasing of submodules such as: + Module M. + Module A. + Module B: End B. + End A. + Module C: End C. + End M. + + M + / \ + A,L C + \ + B + + The "submodule" relation can also be considered as a different directed + edge on the tree, and will not affect the tree structure (because cannot + have self-reference). Once one proves the submodule relationship forms a + tree (identical to above), one can prove "aliasing with submodules" form + a tree too, inductively: + + Base case: A module is a tree. + Inductive case: Suppose an alias refers to a certain (sub)module (aliased or not) + on the existing tree, which refers to a whole subtree identifiable by a node + (technically: kername). Call the node K and its parent K'. The aliasing is + equivalent to copying K to a sibling L under K', where L is the new aliased + module. This is still a tree. Qed. + *) + + (** + Therefore, strategy: + Build and store such a tree. + In technical terms, all of these are [structure_body]s. + We can use sfmod with fullstruct. + Finding the correct branch is tree-traversal given a path (kername). + However, every time a subtree is aliased, we add the aliased name to the + list of labels for that root node. + + [([idents...], tree), ([idents...], tree), ... ] + + *) + + Fixpoint trans_structure_field kn id (sf : Ast.Env.structure_field) := + let kn' := kn_append kn id in + match sf with + | Ast.Env.sfconst c => [(kn', ConstantDecl (trans_constant_body c))] + | Ast.Env.sfmind m => [(kn', InductiveDecl (trans_minductive_body m))] + | Ast.Env.sfmod mi sb => match mi with + | Ast.Env.mi_fullstruct => trans_structure_body kn' sb + | Ast.Env.mi_struct s => trans_structure_body kn' s + | _ => trans_module_impl kn' mi + end + | Ast.Env.sfmodtype _ => [] + end + with trans_module_impl kn (mi: Ast.Env.module_implementation) := + match mi with + | Ast.Env.mi_abstract => [] + | Ast.Env.mi_algebraic kn' => [] + (* let target := find_target_structure_body kn' in trans_structure_body kn' target *) + | Ast.Env.mi_struct sb => trans_structure_body kn sb + | Ast.Env.mi_fullstruct => [] + end + with trans_structure_body kn (sb: Ast.Env.structure_body) := + match sb with + | Ast.Env.sb_nil => [] + | Ast.Env.sb_cons id sf tl => + trans_structure_field kn id sf ++ trans_structure_body kn tl + end. + + Definition trans_modtype_decl := trans_structure_body. + + Definition trans_module_decl kn (m: Ast.Env.module_decl) : list(kername × global_decl) := + match m with + | (Ast.Env.mi_fullstruct, mt) => trans_modtype_decl kn mt + | (mi, _) => trans_module_impl kn mi + end. + + + Lemma translated_structure_field_all_kn_extends: + forall sf kn id, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_field kn id sf). + Proof. + set (P := fun sf => forall kn id, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_field kn id sf)). + set (P0 := fun mi => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_module_impl kn mi)). + set (P1 := fun sb => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_body kn sb)). + apply (Ast.Env.sf_mi_sb_mutind P P0 P1); subst P P0 P1; cbn; try auto. + - intros c kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros m kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros mi Hmi sb Hsb kn id. + rewrite Forall_forall. intros [kn' d]. + destruct mi; cbn; try auto. + -- intros Hin. specialize (Hmi (kn_append kn id)). + rewrite Forall_forall in Hmi. + specialize (Hmi (kn', d)). + simpl in Hmi. specialize (Hmi Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + -- intros Hin. specialize (Hsb (kn_append kn id)). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. specialize (Hsb Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + - intros i sf Hsf sb Hsb kn. + apply Forall_forall. + intros [kn' d] Hin. + apply in_app_or in Hin. destruct Hin. + -- specialize (Hsf kn i). + rewrite Forall_forall in Hsf. + specialize (Hsf (kn', d)). + simpl in Hsf. apply (Hsf H). + -- specialize (Hsb kn). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. apply (Hsb H). + Qed. + + Lemma translated_module_impl_all_kn_extends: + forall mi kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_module_impl kn mi). + Proof. + set (P := fun sf => forall kn id, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_field kn id sf)). + set (P0 := fun mi => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_module_impl kn mi)). + set (P1 := fun sb => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_body kn sb)). + apply (Ast.Env.sf_mi_sb_mutind P P0 P1); subst P P0 P1; cbn; try auto. + - intros c kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros m kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros mi Hmi sb Hsb kn id. + rewrite Forall_forall. intros [kn' d]. + destruct mi; cbn; try auto. + -- intros Hin. specialize (Hmi (kn_append kn id)). + rewrite Forall_forall in Hmi. + specialize (Hmi (kn', d)). + simpl in Hmi. specialize (Hmi Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + -- intros Hin. specialize (Hsb (kn_append kn id)). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. specialize (Hsb Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + - intros i sf Hsf sb Hsb kn. + apply Forall_forall. + intros [kn' d] Hin. + apply in_app_or in Hin. destruct Hin. + -- specialize (Hsf kn i). + rewrite Forall_forall in Hsf. + specialize (Hsf (kn', d)). + simpl in Hsf. apply (Hsf H). + -- specialize (Hsb kn). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. apply (Hsb H). + Qed. + + Lemma translated_structure_body_all_kn_extends: + forall sb kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_body kn sb). + Proof. + set (P := fun sf => forall kn id, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_field kn id sf)). + set (P0 := fun mi => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_module_impl kn mi)). + set (P1 := fun sb => forall kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_structure_body kn sb)). + apply (Ast.Env.sf_mi_sb_mutind P P0 P1); subst P P0 P1; cbn; try auto. + - intros c kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros m kn id. rewrite Forall_forall. + intros [kn' d] []. + inversion H. + constructor. + inversion H. + - intros mi Hmi sb Hsb kn id. + rewrite Forall_forall. intros [kn' d]. + destruct mi; cbn; try auto. + -- intros Hin. specialize (Hmi (kn_append kn id)). + rewrite Forall_forall in Hmi. + specialize (Hmi (kn', d)). + simpl in Hmi. specialize (Hmi Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + -- intros Hin. specialize (Hsb (kn_append kn id)). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. specialize (Hsb Hin). + apply kn_extends_trans with (kn' := (kn_append kn id)); auto. + constructor. + - intros i sf Hsf sb Hsb kn. + apply Forall_forall. + intros [kn' d] Hin. + apply in_app_or in Hin. destruct Hin. + -- specialize (Hsf kn i). + rewrite Forall_forall in Hsf. + specialize (Hsf (kn', d)). + simpl in Hsf. apply (Hsf H). + -- specialize (Hsb kn). + rewrite Forall_forall in Hsb. + specialize (Hsb (kn', d)). + simpl in Hsb. apply (Hsb H). + Qed. + + Lemma translated_module_decl_all_kn_extends: + forall m kn, Forall (fun '(kn', _) => kn_extends kn kn') (trans_module_decl kn m). + Proof. + destruct m as [[] mt]; cbn; auto; apply translated_structure_body_all_kn_extends. + Qed. + + Lemma translated_modtype_decl_all_kn_neq: + forall mt kn, Forall (fun '(kn', _) => kn <> kn') (trans_modtype_decl kn mt). + Proof. + intros mt kn; apply (Forall_impl (P := (fun '(kn', _) => kn_extends kn kn'))). + apply translated_structure_body_all_kn_extends. + intros [kn' _]; apply kn_extends_neq. + Qed. + + Lemma translated_module_decl_all_kn_neq: + forall m kn, Forall (fun '(kn', _) => kn <> kn') (trans_module_decl kn m). + Proof. + destruct m as [[] mt]; cbn; auto; apply translated_modtype_decl_all_kn_neq. + Qed. + + Definition trans_global_decl (d : kername × Ast.Env.global_decl) := + let (kn, decl) := d in match decl with + | Ast.Env.ConstantDecl bd => [(kn, ConstantDecl (trans_constant_body bd))] + | Ast.Env.InductiveDecl bd => [(kn, InductiveDecl (trans_minductive_body bd))] + | Ast.Env.ModuleDecl bd => trans_module_decl kn bd + | Ast.Env.ModuleTypeDecl _ => [] end. End Trans. -Program Definition add_global_decl (env : global_env_map) (d : kername × global_decl) := - {| trans_env_env := add_global_decl env.(trans_env_env) d; +Program Definition add_global_decl (d : kername × global_decl) (env : global_env_map) := + {| trans_env_env := add_global_decl d env.(trans_env_env); trans_env_map := EnvMap.add d.1 d.2 env.(trans_env_map) |}. Next Obligation. pose proof env.(trans_env_repr). @@ -163,8 +524,8 @@ Qed. Definition trans_global_decls env (d : Ast.Env.global_declarations) : global_env_map := fold_right (fun decl Σ' => - let decl' := on_snd (trans_global_decl Σ') decl in - add_global_decl Σ' decl') env d. + let decls := (trans_global_decl Σ' decl) in + fold_right add_global_decl Σ' decls) env d. Definition empty_trans_env univs retro := let init_global_env := {| universes := univs; declarations := []; retroknowledge := retro |} in diff --git a/pcuic/theories/TemplateToPCUICCorrectness.v b/pcuic/theories/TemplateToPCUICCorrectness.v index 288187407..f01ba3b61 100644 --- a/pcuic/theories/TemplateToPCUICCorrectness.v +++ b/pcuic/theories/TemplateToPCUICCorrectness.v @@ -81,8 +81,8 @@ Proof. destruct o; auto. Qed. -Lemma of_global_env_cons {cf:checker_flags} d g : EnvMap.fresh_globals (add_global_decl g d).(declarations) -> - EnvMap.of_global_env (add_global_decl g d).(declarations) = EnvMap.add d.1 d.2 (EnvMap.of_global_env g.(declarations)). +Lemma of_global_env_cons {cf:checker_flags} d g : EnvMap.fresh_globals (add_global_decl d g).(declarations) -> + EnvMap.of_global_env (add_global_decl d g).(declarations) = EnvMap.add d.1 d.2 (EnvMap.of_global_env g.(declarations)). Proof. unfold EnvMap.of_global_env. simpl. unfold KernameMapFact.uncurry. reflexivity. @@ -105,6 +105,48 @@ Proof. rewrite trans_lookup_minductive //. Qed. +Lemma lookup_env_add_global_decl : forall univs decls retro kn d, + lookup_env (add_global_decl (kn, d) + (build_global_env_map({| universes := univs; declarations := decls; retroknowledge := retro |}))) = + lookup_env ({| universes := univs; declarations := (kn, d)::decls; retroknowledge := retro |}). +Proof. + simpl. unfold PCUICEnvironment.add_global_decl; simpl. + reflexivity. +Qed. + +(* Lemma lookup_env_trans_global_decl_app : forall univs decls retro kn d, +let Σmap := (build_global_env_map {| universes := univs; declarations := decls; retroknowledge := retro |}) in +trans_global_decls Σmap [(kn,d)] = +(build_global_env_map {| + universes := univs; + declarations := (trans_global_decl Σmap (kn, d)) ++ decls; + retroknowledge := retro |}). +Proof. + intros univs decls retro kn d Σmap. + destruct d; cbn; auto. + - unfold add_global_decl; cbn. + unfold build_global_env_map; cbn. + unfold PCUICEnvironment.add_global_decl; cbn. + unfold PCUICProgram.build_global_env_map_obligation_1; cbn. + unfold TemplateToPCUIC.add_global_decl_obligation_1. *) + + +Lemma trans_lookup_module {cf} {Σ : Ast.Env.global_env} cst m : + Ast.Env.lookup_env Σ cst = Some (Ast.Env.ModuleDecl m) -> + lookup_env (trans_global_env Σ) cst = None. +Proof. + destruct Σ as [univs decls retro]. + intros H. + cbn -[fold_right]. + induction decls as [|[kn g] tl IHtl]; cbn -[fold_right]; auto. + cbn in H. + (** immediately to inductive case: a::Σ *) + destruct eq_kername eqn: E. + - apply eqb_eq in E. subst kn. + unfold trans_global_env in *; simpl in *. + (* remember (fun (decl : kername × Ast.Env.global_decl) (Σ' : global_env_map) => fold_right add_global_decl Σ' (trans_global_decl Σ' decl)) as f. *) + + Lemma mkApps_morphism (f : term -> term) u v : (forall x y, f (tApp x y) = tApp (f x) (f y)) -> f (mkApps u v) = mkApps (f u) (List.map f v). @@ -148,16 +190,27 @@ Proof. split; [lsets|csets]. Qed. +Lemma invariant_fold {A B: Type} (f: B -> A -> A) (P: A -> Prop): + (forall a b, (P a -> P (f b a))) -> (forall a l, P a -> P (fold_right f a l)). +Proof. + intros H a l. + induction l; try now cbn. +Qed. + Lemma extends_trans_global_decls_acc (Σ' : global_env_map) (Σ : Ast.Env.global_declarations) : extends_decls Σ' (trans_global_decls Σ' Σ). Proof. induction Σ. * split; cbn; now try exists []. - * rewrite /=. - destruct IHΣ as [univs [Σ'' eq]]. cbn in *. - split; cbn; auto. - eexists (_ :: Σ''). - rewrite -app_comm_cons. now f_equal. + * destruct IHΣ as [univs [Σ'' eq]]. + split. + - simpl. now apply invariant_fold. + - simpl. + exists ((trans_global_decl (trans_global_decls Σ' Σ) a) ++ Σ''). + induction (trans_global_decl (trans_global_decls Σ' Σ) a); cbn in *. + -- exact eq. + -- f_equal. exact IHl. + - simpl; now apply invariant_fold. Qed. Definition wf_global_decl {cf} (Σ : Ast.Env.global_env_ext) kn decl := @@ -169,13 +222,18 @@ Definition wf_global_decl {cf} (Σ : Ast.Env.global_env_ext) kn decl := Lemma trans_lookup_env {cf} {Σ : Ast.Env.global_env} cst {wfΣ : Typing.wf Σ} : match Ast.Env.lookup_env Σ cst with | None => lookup_env (trans_global_env Σ) cst = None - | Some d => - ∑ Σ' : Ast.Env.global_env, - [× Ast.Env.extends_decls Σ' Σ, - Typing.wf Σ', - wf_global_decl (Σ', Ast.universes_decl_of_decl d) cst d, - extends_decls (trans_global_env Σ') (trans_global_env Σ) & - lookup_env (trans_global_env Σ) cst = Some (trans_global_decl (trans_global_env Σ') d)] + | Some d => match d with + | Ast.Env.ConstantDecl _ | Ast.Env.InductiveDecl _ => + ∑ (Σ' : Ast.Env.global_env) (d': global_decl), + [× Ast.Env.extends_decls Σ' Σ, + Typing.wf Σ', + wf_global_decl (Σ', Ast.universes_decl_of_decl d) cst d, + extends_decls (trans_global_env Σ') (trans_global_env Σ), + trans_global_decl (trans_global_env Σ') (cst, d) = (cst, d')::[] & + lookup_env (trans_global_env Σ) cst = Some d'] + (** Modules are elaborated away. *) + | Ast.Env.ModuleDecl _ | Ast.Env.ModuleTypeDecl _ => lookup_env (trans_global_env Σ) cst = None + end end. Proof. destruct Σ as [univs Σ retro]. @@ -183,24 +241,198 @@ Proof. - cbn; auto. - unfold Ast.Env.lookup_env. cbn -[trans_global_env]. destruct eq_kername eqn:eqk. - change (eq_kername cst a.1) with (eqb cst a.1) in eqk. + (* change (eq_kername cst a.1) with (eqb cst a.1) in eqk. *) apply eqb_eq in eqk; subst. - eexists {| S.Env.universes := univs; S.Env.declarations := Σ; S.Env.retroknowledge := retro |}. - split. - * split => //. now exists [a]. - * destruct wfΣ as [onu ond]. depelim ond. - split => //. - * eapply TypingWf.typing_wf_sigma in wfΣ. - destruct wfΣ as [onu ond]. depelim ond. now destruct o. - * split => //. - now exists [(a.1, trans_global_decl (trans_global_env {| S.Env.universes := univs; S.Env.declarations := Σ; - S.Env.retroknowledge := retro |}) a.2)]. - * cbn. now rewrite eq_kername_refl. - * destruct wfΣ as [onu ond]. depelim ond. + set {| S.Env.universes := univs; S.Env.declarations := Σ; S.Env.retroknowledge := retro |} as Σmap. + set {| S.Env.universes := univs; S.Env.declarations := a::Σ; S.Env.retroknowledge := retro |} as Σmap'. + + -- (** Case 1: looking up [cst] in [a::Σ], and a.1 == cst. + Strategy: if a.2 is constant or inductive, then we should be able to + find its obvious translation. If a.2 is a module or inductive, cst + should not exist in the translated environment. *) + destruct a.2 eqn:E => //= . + + --- (** a.2 is a Constant decl *) + exists Σmap. + exists (ConstantDecl (trans_constant_body (trans_global_env Σmap) c)). + split => //=. + * split => //. now exists [a]. + * destruct wfΣ as [onu ond]. depelim ond. + split => //. + * eapply TypingWf.typing_wf_sigma in wfΣ. + destruct wfΣ as [onu ond]. depelim ond. + simpl in E. rewrite E in o; now destruct o. + * subst Σmap Σmap'. unfold trans_global_env. + split => /=; try now apply invariant_fold. + induction (trans_global_decl (trans_global_decls (empty_trans_env univs retro) Σ) a). + ** now exists []. + ** simpl. destruct IHl as [Σ'' IHl]. + exists (a0 :: Σ''). now rewrite IHl. + * destruct wfΣ as [onu ond]. depelim ond. + specialize (IHΣ (onu, ond)). + unfold Ast.Env.lookup_env in IHΣ. cbn [Ast.Env.declarations] in IHΣ. + destruct (Ast.Env.lookup_global Σ (kn, d).1) eqn:h. + ** simpl in *. subst. + destruct o. apply ST.fresh_global_iff_lookup_global_None in kn_fresh. + rewrite kn_fresh in h. exfalso. inversion h. + ** simpl in *. subst. + cbn. now rewrite eqb_refl. + + --- (** a.2 is an Inductive decl *) + exists Σmap. exists (InductiveDecl (trans_minductive_body (trans_global_env Σmap) m)). + split => //=. + * split => //. now exists [a]. + * destruct wfΣ as [onu ond]. depelim ond. + split => //. + * eapply TypingWf.typing_wf_sigma in wfΣ. + destruct wfΣ as [onu ond]. depelim ond. + simpl in E. rewrite E in o; now destruct o. + * subst Σmap Σmap'. unfold trans_global_env. + split => /=; try now apply invariant_fold. + induction (trans_global_decl (trans_global_decls (empty_trans_env univs retro) Σ) a). + ** now exists []. + ** simpl. destruct IHl as [Σ'' IHl]. + exists (a0 :: Σ''). now rewrite IHl. + * destruct wfΣ as [onu ond]. depelim ond. + specialize (IHΣ (onu, ond)). + unfold Ast.Env.lookup_env in IHΣ. cbn [Ast.Env.declarations] in IHΣ. + destruct (Ast.Env.lookup_global Σ (kn, d).1) eqn:h. + ** simpl in *. subst. + destruct o. apply ST.fresh_global_iff_lookup_global_None in kn_fresh. + rewrite kn_fresh in h. inversion h. + ** simpl in *. subst. + cbn. now rewrite eqb_refl. + + (** Module. *) + --- (** a.2 is a *) + unfold trans_global_env. subst Σmap'; simpl. + destruct a as [kn d]; simpl in *. + rewrite E. + remember (trans_global_decls (empty_trans_env univs retro) Σ) as Σtrans. + set (P := fun sf => forall id, lookup_env (fold_right add_global_decl Σtrans (trans_structure_field Σtrans kn id sf)) kn = None). + set (P0 := fun mi => lookup_env (fold_right add_global_decl Σtrans (trans_module_impl Σtrans kn mi)) kn = None). + set (P1 := fun mt => lookup_env (fold_right add_global_decl Σtrans (trans_structure_body Σtrans kn mt)) kn = None). + assert ((forall s : Ast.Env.structure_field, P s) × (forall m : Ast.Env.module_implementation, P0 m) × (forall s : Ast.Env.structure_body, P1 s)). + (** proving assertion by mutual induction *) + * subst P P0 P1. apply Ast.Env.sf_mi_sb_mutind => //=. + ** cbn. intros c id. + pose proof (kn_appended_not_eq kn id). + destruct eq_kername eqn: K. + apply eqb_eq in K; contradiction. + destruct wfΣ as [onu ond]. depelim ond. + specialize (IHΣ (onu, ond)). + unfold Ast.Env.lookup_env in IHΣ. cbn [Ast.Env.declarations] in IHΣ. + destruct (Ast.Env.lookup_global Σ kn) eqn:h. + *** simpl in *. subst. + destruct o. apply ST.fresh_global_iff_lookup_global_None in kn_fresh. + rewrite kn_fresh in h. inversion h. + *** subst. apply IHΣ. + ** cbn. intros i id. + pose proof (kn_appended_not_eq kn id). + destruct eq_kername eqn: K. + apply eqb_eq in K; contradiction. + destruct wfΣ as [onu ond]. depelim ond. + specialize (IHΣ (onu, ond)). + unfold Ast.Env.lookup_env in IHΣ. cbn [Ast.Env.declarations] in IHΣ. + destruct (Ast.Env.lookup_global Σ kn) eqn:h. + *** simpl in *. subst. + destruct o. apply ST.fresh_global_iff_lookup_global_None in kn_fresh. + rewrite kn_fresh in h. inversion h. + *** subst. apply IHΣ. + ** intros [] Hmi sb Hsb id; cbn; auto. + *** admit. + *** + + + + * destruct m as [[] mt] => /=. + ** + generalize (trans_global_decls (empty_trans_env univs retro) Σ). + generalize m. + * + + + (** Module Type. *) + --- admit. + + + -- (** Case where a.1 != cst. *) + destruct wfΣ as [onu ond]. depelim ond. specialize (IHΣ (onu, ond)). unfold Ast.Env.lookup_env in IHΣ. cbn [Ast.Env.declarations] in IHΣ. destruct (Ast.Env.lookup_global Σ cst) eqn:h. - destruct IHΣ as [Σ' [ext wf ext' hl]]. + destruct g => //=. + + --- destruct IHΣ as [Σ' [d' [ext wf ext' sth hl]]]. + exists Σ', d'. split => //. + * split => //=. + ** apply ext. + ** destruct ext as [_ [Σ'' HΣ''] _]. + exists ((kn,d)::Σ''). simpl in HΣ''. + now rewrite HΣ''. + ** apply ext. + * destruct sth as [Hunivs [Σ'' HΣ] Hretro]. split => //=. + ** cbn. now apply invariant_fold. + ** exists ((trans_global_decl (trans_global_decls (empty_trans_env univs retro) Σ) (kn, d)) ++ Σ''). + destruct d => /=; try now rewrite HΣ. + unfold trans_global_env; simpl. + induction (trans_module_decl (trans_global_decls (empty_trans_env univs retro) Σ) + kn m); try now cbn. + ** cbn. now apply invariant_fold. + * unfold lookup_env. + unfold lookup_global; simpl. + destruct d => /=; try now rewrite eqk. + (** prove that kn of module cannot be found in the translated env. + most probably need to do an induction. *) + ** unfold trans_global_env; simpl. + destruct m as [mi mt]. + admit. + ** unfold trans_global_env; simpl. apply e. + + --- destruct IHΣ as [Σ' [d' [ext wf ext' sth hl]]]. + exists Σ', d'. split => //. + * split => //=. + ** apply ext. + ** destruct ext as [_ [Σ'' HΣ''] _]. + exists ((kn,d)::Σ''). simpl in HΣ''. + now rewrite HΣ''. + ** apply ext. + * destruct sth as [Hunivs [Σ'' HΣ] Hretro]. split => //=. + ** cbn. now apply invariant_fold. + ** exists ((trans_global_decl (trans_global_decls (empty_trans_env univs retro) Σ) (kn, d)) ++ Σ''). + destruct d => /=; try now rewrite HΣ. + unfold trans_global_env; simpl. + induction (trans_module_decl (trans_global_decls (empty_trans_env univs retro) Σ) + kn m0); try now cbn. + ** cbn. now apply invariant_fold. + * unfold lookup_env. + unfold lookup_global; simpl. + destruct d => /=; try now rewrite eqk. + (** A repeat of the above (possibly) induction. *) + ** unfold trans_global_env; simpl. + destruct m as [mi mt]. + admit. + ** apply e. + + --- unfold lookup_env. + unfold lookup_global; simpl. + destruct d => /=; try now rewrite eqk. + (** another repeat *) + admit. apply IHΣ. + + --- unfold lookup_env. + unfold lookup_global; simpl. + destruct d => /=; try now rewrite eqk. + (** another repeat *) + admit. apply IHΣ. + + --- unfold lookup_env. + unfold lookup_global; simpl. + destruct d => /=; try now rewrite eqk. + (** another repeat *) + admit. apply IHΣ. +Admitted. + (* destruct IHΣ as [Σ' [ext wf ext' hl]]. exists Σ'. split => //. destruct ext as [equ [? eq]]. split => //. exists ((kn, d) :: x). cbn. @@ -212,7 +444,7 @@ Proof. cbn. rewrite -eq'. reflexivity. cbn. rewrite eqk /=. apply e. cbn. now rewrite eqk. -Qed. +Qed. *) Lemma trans_weakening {cf} Σ {Σ' : global_env_map} t : Typing.wf Σ -> extends_decls (trans_global_env Σ) Σ' -> wf Σ' -> @@ -237,7 +469,7 @@ Proof. red in X0. f_equal => //. rewrite /id. unfold trans_predicate. f_equal; solve_all. f_equal. solve_all. -Qed. +Admitted. Lemma trans_decl_weakening {cf} Σ {Σ' : global_env_map} t : Typing.wf Σ -> extends_decls (trans_global_env Σ) Σ' -> wf Σ' -> @@ -288,7 +520,7 @@ Qed. Lemma trans_global_decl_weaken {cf} (Σ : Ast.Env.global_env_ext) {Σ' : global_env_map} kn d : Typing.wf Σ -> extends_decls (trans_global_env Σ) Σ' -> wf Σ' -> wf_global_decl Σ kn d -> - trans_global_decl (trans_global_env Σ) d = trans_global_decl Σ' d. + trans_global_decl (trans_global_env Σ) (kn,d) = trans_global_decl Σ' (kn,d). Proof. intros. destruct d; cbn; f_equal. @@ -305,7 +537,7 @@ Proof. eapply TypingWf.on_global_inductive_wf_params in X2. solve_all. * eapply TypingWf.on_global_inductive_wf_bodies in X2. solve_all. rewrite trans_ind_body_weakening //. -Qed. +Admitted. Import TypingWf. @@ -318,7 +550,8 @@ Proof. destruct T; intuition eauto using wf_extends. Qed. -Lemma trans_lookup {cf} Σ cst : +(** FIXME: only true if cst refers to constant or mutind *) +(* Lemma trans_lookup {cf} Σ cst : Typing.wf Σ -> wf (trans_global_env Σ) -> lookup_env (trans_global_env Σ) cst = @@ -330,7 +563,7 @@ Proof. intros [Σ' [ext wfΣ' wfdecl ext' hl]]. rewrite hl. cbn. f_equal. eapply (trans_global_decl_weaken (Σ', Ast.universes_decl_of_decl g)); tea. -Qed. +Qed. *) Section Translation. Context (Σ : Ast.Env.global_env). @@ -669,7 +902,7 @@ Section Trans_Global. Ast.declared_constant Σ cst decl -> declared_constant Σ' cst (trans_constant_body Σ' decl). Proof. - unfold declared_constant, Ast.declared_constant, + unfold declared_constant, Ast.declared_constant, declared_constant_gen, Ast.declared_constant_gen. now rewrite trans_lookup => -> /=. Qed. @@ -743,7 +976,7 @@ Lemma declared_inductive_inj {Σ mdecl mdecl' ind idecl idecl'} : mdecl = mdecl' /\ idecl = idecl'. Proof. intros [] []. unfold Ast.declared_minductive in *. - unfold Ast.declared_minductive_gen in H1. + unfold Ast.declared_minductive_gen in H1. rewrite H in H1. inversion H1. subst. rewrite H2 in H0. inversion H0. eauto. Qed. @@ -752,10 +985,10 @@ Lemma lookup_inductive_None Σ ind : lookup_inductive Σ ind = None -> Proof. intros hl [mdecl [idecl [decli hnth]]]. unfold declared_inductive, declared_minductive in decli. - unfold lookup_inductive, lookup_inductive_gen, + unfold lookup_inductive, lookup_inductive_gen, lookup_minductive, lookup_minductive_gen in hl. - unfold declared_minductive_gen in decli. - destruct lookup_env eqn:heq. + unfold declared_minductive_gen in decli. + destruct lookup_env eqn:heq. noconf decli. cbn in hl. destruct nth_error; congruence. congruence. Qed. @@ -774,7 +1007,7 @@ Section Trans_Global. unfold SEq.R_global_instance, SEq.global_variance. destruct gref; simpl; auto. - unfold R_global_instance_gen, R_opt_variance; cbn. - unfold Ast.lookup_inductive_gen, lookup_inductive_gen, + unfold Ast.lookup_inductive_gen, lookup_inductive_gen, Ast.lookup_minductive_gen, lookup_minductive_gen. rewrite trans_lookup. destruct Ast.Env.lookup_env eqn:look => //; simpl. destruct g => /= //. @@ -1287,7 +1520,7 @@ Section Trans_Global. lookup_inductive Σ' ind = Some (mdecl, idecl). Proof. intros []. unfold lookup_inductive, lookup_minductive. - unfold lookup_inductive_gen, lookup_minductive_gen. + unfold lookup_inductive_gen, lookup_minductive_gen. now rewrite H H0. Qed. @@ -1989,17 +2222,20 @@ Proof. destruct l; auto. now rewrite -trans_check_rec_kind. Qed. -Lemma trans_global_decl_universes Σ d : - Ast.universes_decl_of_decl d = - universes_decl_of_decl (trans_global_decl Σ d). +Lemma trans_global_decl_universes Σ kn d : + Forall (fun '(_, d') => Ast.universes_decl_of_decl d = universes_decl_of_decl d') + (trans_global_decl Σ (kn,d)). Proof. - destruct d; reflexivity. -Qed. + destruct d; try now cbn. + apply Forall_forall. + (** possibly induction again. *) +Admitted. -Lemma trans_consistent_instance_ext {cf:checker_flags} Σ d u : +Lemma trans_consistent_instance_ext {cf:checker_flags} Σ kn d u : let Σ' := trans_global Σ in Ast.consistent_instance_ext Σ (Ast.universes_decl_of_decl d) u -> - consistent_instance_ext Σ' (universes_decl_of_decl (trans_global_decl Σ' d)) u. + Forall (fun '(_, d') => consistent_instance_ext Σ' (universes_decl_of_decl d') u) + (trans_global_decl Σ' (kn, d)). Proof. intros Σ'. unfold Ast.consistent_instance_ext, consistent_instance_ext. diff --git a/pcuic/theories/Typing/PCUICWeakeningEnvTyp.v b/pcuic/theories/Typing/PCUICWeakeningEnvTyp.v index a7f6b32c2..e0ae7cf61 100644 --- a/pcuic/theories/Typing/PCUICWeakeningEnvTyp.v +++ b/pcuic/theories/Typing/PCUICWeakeningEnvTyp.v @@ -336,7 +336,7 @@ Proof. split => //. - split; [lsets|csets]. - exists []; simpl; destruct Σ; eauto. - - apply Retroknowledge.extends_refl. + - apply Environment.Retroknowledge.extends_refl. Qed. Lemma weaken_decls_lookup_on_global_env `{checker_flags} P Σ c decl : diff --git a/template-coq/theories/Checker.v b/template-coq/theories/Checker.v index 96b23418b..584081919 100644 --- a/template-coq/theories/Checker.v +++ b/template-coq/theories/Checker.v @@ -863,47 +863,49 @@ Section Checker. Definition infer_term Σ G t := wrap_error "" (infer Σ G [] t). - Definition check_wf_const_body Σ G kn cst: EnvCheck ():= - match cst.(cst_body) with - | Some term => check_wf_judgement (string_of_kername kn) Σ G term cst.(cst_type) - | None => check_wf_type (string_of_kername kn) Σ G cst.(cst_type) - end. - - Definition check_wf_ind_body Σ G inds: EnvCheck () := - List.fold_left (fun acc body => - acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) - inds.(ind_bodies) (ret ()). + + Definition check_wf_const_body Σ G kn cst: EnvCheck ():= + match cst.(cst_body) with + | Some term => check_wf_judgement (string_of_kername kn) Σ G term cst.(cst_type) + | None => check_wf_type (string_of_kername kn) Σ G cst.(cst_type) + end. + + Definition check_wf_ind_body Σ G inds: EnvCheck () := + List.fold_left (fun acc body => + acc ;; check_wf_type body.(ind_name) Σ G body.(ind_type)) + inds.(ind_bodies) (ret ()). (* FIXME: modify this to follow closely https://coq.inria.fr/refman/language/core/modules.html#typing-modules *) - Fixpoint check_wf_mod_impl Σ G impl: EnvCheck () := + Fixpoint check_wf_mod_impl Σ G kn impl: EnvCheck () := match impl with | mi_abstract | mi_fullstruct | mi_algebraic _ => CorrectDecl () - | mi_struct sb => check_wf_structure_body Σ G sb - end + | mi_struct sb => check_wf_structure_body Σ G kn sb + end with check_wf_structure_field Σ G kn sf: EnvCheck () := match sf with | sfconst cst => check_wf_const_body Σ G kn cst | sfmind inds => check_wf_ind_body Σ G inds - | sfmod impl modtype => check_wf_mod_impl Σ G impl ;; check_wf_structure_body Σ G modtype - | sfmodtype mt => check_wf_structure_body Σ G mt + | sfmod impl modtype => check_wf_mod_impl Σ G kn impl ;; check_wf_structure_body Σ G kn modtype + | sfmodtype mt => check_wf_structure_body Σ G kn mt end - with check_wf_structure_body Σ G sb : EnvCheck() := + with check_wf_structure_body Σ G kn sb : EnvCheck() := match sb with | sb_nil => CorrectDecl () - | sb_cons kn sf sb' => check_wf_structure_field Σ G kn sf ;; check_wf_structure_body Σ G sb' + | sb_cons id sf sb' => + check_wf_structure_field Σ G ((MPdot kn.1 kn.2), id) sf ;; check_wf_structure_body Σ G kn sb' end. Definition check_wf_modtype_decl := check_wf_structure_body. - Definition check_wf_mod_decl Σ G m := - check_wf_mod_impl Σ G m.1 ;; check_wf_modtype_decl Σ G m.2. + Definition check_wf_mod_decl Σ G kn m := + check_wf_mod_impl Σ G kn m.1 ;; check_wf_modtype_decl Σ G kn m.2. Definition check_wf_decl Σ G kn (g : global_decl) : EnvCheck () := match g with | ConstantDecl cst => check_wf_const_body Σ G kn cst | InductiveDecl inds => check_wf_ind_body Σ G inds - | ModuleDecl m => check_wf_mod_decl Σ G m - | ModuleTypeDecl mt => check_wf_modtype_decl Σ G mt + | ModuleDecl m => check_wf_mod_decl Σ G kn m + | ModuleTypeDecl mt => check_wf_modtype_decl Σ G kn mt end. Fixpoint check_fresh id (env : global_declarations) : EnvCheck () := diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 9e8410920..15e00d4cf 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -333,7 +333,7 @@ Module Environment (T : Term). | mi_fullstruct : module_implementation (** Module M. ... End M.*) with structure_body := | sb_nil - | sb_cons : kername -> structure_field -> structure_body -> structure_body. + | sb_cons : ident -> structure_field -> structure_body -> structure_body. Scheme structureField_rect := Induction for structure_field Sort Type with moduleImpl_rect := Induction for module_implementation Sort Type diff --git a/template-coq/theories/EnvironmentTyping.v b/template-coq/theories/EnvironmentTyping.v index b7a426249..b2e12f110 100644 --- a/template-coq/theories/EnvironmentTyping.v +++ b/template-coq/theories/EnvironmentTyping.v @@ -36,16 +36,16 @@ Module Lookup (T : Term) (E : EnvironmentSig T). declared_constructor_gen lookup (proj.(proj_ind), 0) mdecl idecl cdecl /\ List.nth_error idecl.(ind_projs) proj.(proj_arg) = Some pdecl /\ mdecl.(ind_npars) = proj.(proj_npars). - + Definition declared_module Σ kn moddecl := lookup_env Σ kn = Some (ModuleDecl moddecl). - + Definition declared_modtype Σ kn mtdecl := lookup_env Σ kn = Some (ModuleTypeDecl mtdecl). Definition declared_projection Σ := declared_projection_gen (lookup_env Σ). - Definition lookup_constant_gen (lookup : kername -> option global_decl) kn := + Definition lookup_constant_gen (lookup : kername -> option global_decl) kn := match lookup kn with | Some (ConstantDecl d) => Some d | _ => None @@ -94,26 +94,26 @@ Module Lookup (T : Term) (E : EnvironmentSig T). end | _ => None end. - - Definition lookup_module Σ kn: option module_decl := + + Definition lookup_module Σ kn: option module_decl := match lookup_env Σ kn with | Some (ModuleDecl d) => Some d | _ => None end. - - Definition lookup_modtype Σ kn := + + Definition lookup_modtype Σ kn := match lookup_env Σ kn with | Some (ModuleTypeDecl d) => Some d | _ => None end. Definition lookup_projection Σ := lookup_projection_gen (lookup_env Σ). - + Lemma declared_constant_lookup {lookup kn cdecl} : declared_constant_gen lookup kn cdecl -> lookup_constant_gen lookup kn = Some cdecl. Proof. - unfold declared_constant_gen, lookup_constant_gen. + unfold declared_constant_gen, lookup_constant_gen. now intros ->. Qed. @@ -121,7 +121,7 @@ Module Lookup (T : Term) (E : EnvironmentSig T). lookup_constant_gen lookup kn = Some cdecl -> declared_constant_gen lookup kn cdecl. Proof. - unfold declared_constant_gen, lookup_constant_gen. + unfold declared_constant_gen, lookup_constant_gen. destruct lookup as [[]|] => //. congruence. Qed. @@ -207,7 +207,7 @@ Module Lookup (T : Term) (E : EnvironmentSig T). Qed. Lemma lookup_module_declared {Σ kn mdecl} : - lookup_module Σ kn = Some mdecl -> + lookup_module Σ kn = Some mdecl -> declared_module Σ kn mdecl. Proof. unfold declared_module, lookup_module. @@ -222,7 +222,7 @@ Module Lookup (T : Term) (E : EnvironmentSig T). Qed. Lemma lookup_modtype_declared {Σ kn mtdecl} : - lookup_modtype Σ kn = Some mtdecl -> + lookup_modtype Σ kn = Some mtdecl -> declared_modtype Σ kn mtdecl. Proof. unfold declared_modtype, lookup_modtype. @@ -906,7 +906,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT positive_cstr_arg mdecl ctx ty -> positive_cstr mdecl i (vass na ty :: ctx) t -> positive_cstr mdecl i ctx (tProd na ty t). - + Definition lift_level n l := match l with | Level.lzero | Level.Level _ => l @@ -1219,15 +1219,15 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT (** Interactive definitions are stored in modtype if not type-annotated. Otherwise, the interactive definition is in impl, type annotation in modtype. *) - Inductive on_structure_field Σ : kername -> structure_field -> Type := - | on_sfconst kn c : on_constant_decl Σ c -> on_structure_field Σ kn (sfconst c) - | on_sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ kn (sfmind inds) - | on_sfmod kn mi sb : on_module_impl Σ mi -> on_structure_body Σ sb -> on_structure_field Σ kn (sfmod mi sb) - | on_sfmodtype kn mtd : on_structure_body Σ mtd -> on_structure_field Σ kn (sfmodtype mtd) + Inductive on_structure_field Σ : structure_field -> Type := + | on_sfconst c : on_constant_decl Σ c -> on_structure_field Σ (sfconst c) + | on_sfmind kn inds : on_inductive Σ kn inds -> on_structure_field Σ (sfmind inds) + | on_sfmod mi sb : on_module_impl Σ mi -> on_structure_body Σ sb -> on_structure_field Σ (sfmod mi sb) + | on_sfmodtype mtd : on_structure_body Σ mtd -> on_structure_field Σ (sfmodtype mtd) with on_structure_body Σ : structure_body -> Type := | on_sb_nil : on_structure_body Σ sb_nil - | on_sb_cons kn sf sb : on_structure_field Σ kn sf + | on_sb_cons kn sf sb : on_structure_field Σ sf -> on_structure_body Σ sb -> on_structure_body Σ (sb_cons kn sf sb) with on_module_impl Σ : module_implementation -> Type := @@ -1240,7 +1240,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT | on_mi_algebraic_decl kn mt: on_structure_body Σ mt -> on_module_decl Σ ((mi_algebraic kn), mt) | on_mi_struct_decl sb mt: on_structure_body Σ mt -> on_structure_body Σ sb -> on_module_decl Σ ((mi_struct sb), mt) | on_mi_fullstruct_decl mt: on_structure_body Σ mt -> on_module_decl Σ (mi_fullstruct, mt). *) - + Definition on_module_type_decl := on_structure_body. Definition on_module_decl Σ m := on_module_impl Σ m.1 × on_module_type_decl Σ m.2. @@ -1256,7 +1256,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT match decl with | ConstantDecl d => on_constant_decl Σ d | InductiveDecl inds => on_inductive Σ kn inds - | ModuleDecl mb => on_module_decl Σ mb + | ModuleDecl mb => on_module_decl Σ mb | ModuleTypeDecl mtd => on_structure_body Σ mtd end. @@ -1427,7 +1427,7 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT Proof. intros H HP. cut ((forall (m : module_implementation), on_module_impl Pcmp P Σ m -> on_module_impl Pcmp Q Σ m) - × (forall (kn: kername) (p : structure_field), on_structure_field Pcmp P Σ kn p -> on_structure_field Pcmp Q Σ kn p) + × (forall (p : structure_field), on_structure_field Pcmp P Σ p -> on_structure_field Pcmp Q Σ p) × (forall (s : structure_body), on_structure_body Pcmp P Σ s -> on_structure_body Pcmp Q Σ s)). intro md_sf_sb. destruct d; simpl. @@ -1437,8 +1437,8 @@ Module GlobalMaps (T: Term) (E: EnvironmentSig T) (TU : TermUtils T E) (ET: EnvT intros [onmip onmtp]. split; now apply md_sf_sb. - apply md_sf_sb. - apply (on_mi_sf_sb_mutrect); try now constructor. - -- intros kn' c oncp. constructor. now apply on_constant_decl_impl with (Pcmp := Pcmp) (P := P). - -- intros kn' mind onip. constructor. now apply on_inductive_decl_impl with (Pcmp := Pcmp) (P := P). + -- intros c oncp. constructor. now apply on_constant_decl_impl with (Pcmp := Pcmp) (P := P). + -- intros kn' mind onip. apply on_sfmind with (kn := kn'). now apply on_inductive_decl_impl with (Pcmp := Pcmp) (P := P). Qed. Lemma on_global_env_impl {cf : checker_flags} Pcmp P Q : @@ -1549,25 +1549,25 @@ Module DeclarationTyping (T : Term) (E : EnvironmentSig T) (TU : TermUtils T E) - set (gex := ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx)). cut ((forall (m : module_implementation), on_module_impl cumul_gen P gex m -> on_module_impl cumul_gen Q gex m) - × (forall (kn: kername) (p: structure_field), on_structure_field cumul_gen P gex kn p -> on_structure_field cumul_gen Q gex kn p) + × (forall (p: structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) × (forall (s : structure_body), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). intros [Hmi [Hsf Hsb]]. -- constructor; destruct on_global_decl_d0 as [omip omtp]. - + now apply Hmi. + + now apply Hmi. + now apply Hsb. -- apply on_mi_sf_sb_mutrect; try now constructor. + constructor. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - + constructor. apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. + + intros kn0 inds0 oi. apply on_sfmind with (kn := kn0). apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. - set (gex := ({| universes := univs; declarations := Σ; retroknowledge := retro |}, Monomorphic_ctx)). cut ((forall (m : module_implementation), on_module_impl cumul_gen P gex m -> on_module_impl cumul_gen Q gex m) - × (forall (kn: kername) (p: structure_field), on_structure_field cumul_gen P gex kn p -> on_structure_field cumul_gen Q gex kn p) + × (forall (p: structure_field), on_structure_field cumul_gen P gex p -> on_structure_field cumul_gen Q gex p) × (forall (s : structure_body), on_structure_body cumul_gen P gex s -> on_structure_body cumul_gen Q gex s)). intros [Hmi [Hsf Hsb]]. -- destruct on_global_decl_d0; now constructor. -- apply on_mi_sf_sb_mutrect; try now constructor. + constructor. destruct c; simpl. destruct cst_body0; simpl in *; now eapply X. - + constructor. apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. + + intros kn0 inds0 oi. apply on_sfmind with (kn := kn0). apply on_inductive_decl_impl with (P := P); unfold on_global_env; auto. Qed. End DeclarationTyping. diff --git a/template-coq/theories/EtaExpand.v b/template-coq/theories/EtaExpand.v index 9b329dfa8..8f02c3992 100644 --- a/template-coq/theories/EtaExpand.v +++ b/template-coq/theories/EtaExpand.v @@ -430,19 +430,19 @@ Record expanded_minductive_decl Σ mdecl := { expanded_params : expanded_context Σ [] mdecl.(ind_params); expanded_ind_bodies : Forall (expanded_inductive_decl Σ mdecl) mdecl.(ind_bodies) }. -Inductive expanded_structure_field Σ: kername -> structure_field -> Prop := - | expanded_sfconst kn c : expanded_constant_decl Σ c -> expanded_structure_field Σ kn (sfconst c) - | expanded_sfmind kn inds : expanded_minductive_decl Σ inds -> expanded_structure_field Σ kn (sfmind inds) - | expanded_sfmod kn mi mt: +Inductive expanded_structure_field Σ: structure_field -> Prop := + | expanded_sfconst c : expanded_constant_decl Σ c -> expanded_structure_field Σ (sfconst c) + | expanded_sfmind inds : expanded_minductive_decl Σ inds -> expanded_structure_field Σ (sfmind inds) + | expanded_sfmod mi mt: expanded_module_impl Σ mi -> expanded_structure_body Σ mt -> - expanded_structure_field Σ kn (sfmod mi mt) - | expanded_sfmodtype kn mtd : expanded_structure_body Σ mtd -> expanded_structure_field Σ kn (sfmodtype mtd) + expanded_structure_field Σ (sfmod mi mt) + | expanded_sfmodtype mtd : expanded_structure_body Σ mtd -> expanded_structure_field Σ (sfmodtype mtd) with expanded_structure_body Σ : structure_body -> Prop := | expanded_sb_nil : expanded_structure_body Σ sb_nil | expanded_sb_cons kn sf tl : - expanded_structure_field Σ kn sf -> + expanded_structure_field Σ sf -> expanded_structure_body Σ tl -> expanded_structure_body Σ (sb_cons kn sf tl) @@ -991,7 +991,7 @@ Lemma repr_lookup_constructor {Σg Σ} : forall ind idx r, lookup_constructor Σ ind idx = Some r -> GlobalEnvMap.lookup_constructor Σg ind idx = Some r. Proof. intros hrepr ind idx r. - rewrite /lookup_constructor /lookup_constructor_gen /lookup_inductive /lookup_inductive_gen + rewrite /lookup_constructor /lookup_constructor_gen /lookup_inductive /lookup_inductive_gen /lookup_minductive /lookup_minductive_gen /lookup_env. destruct lookup_global eqn:hl => //. apply hrepr in hl. @@ -1361,13 +1361,13 @@ Lemma eta_declared_constructor {Σ : GlobalEnvMap.t} {ind mdecl idecl cdecl} : Proof. rewrite /declared_constructor. intros [[] ?]. - move: H. - rewrite /declared_inductive /declared_inductive_gen /declared_minductive /declared_minductive_gen + move: H. + rewrite /declared_inductive /declared_inductive_gen /declared_minductive /declared_minductive_gen /lookup_env /=. destruct (lookup_global Σ.(declarations) _) eqn:heq => //. move: (eta_lookup_global (inductive_mind ind.1) g heq) => hl. - intros [= ->]. - unfold declared_constructor_gen, declared_inductive_gen, declared_minductive_gen. + intros [= ->]. + unfold declared_constructor_gen, declared_inductive_gen, declared_minductive_gen. rewrite hl; split => //. split => //. rewrite nth_error_map H0 //. rewrite nth_error_map H1 //. @@ -1418,7 +1418,7 @@ Proof. intros hrepr. unfold expanded_decl. cut ((forall (m : module_implementation), expanded_module_impl Σ m -> expanded_module_impl Σ' m) /\ - (forall (k: kername) (p : structure_field), expanded_structure_field Σ k p -> expanded_structure_field Σ' k p) /\ + (forall (p : structure_field), expanded_structure_field Σ p -> expanded_structure_field Σ' p) /\ (forall (s : structure_body), expanded_structure_body Σ s -> expanded_structure_body Σ' s)). intros [Hmd [Hsf Hsb]]. destruct t => //; auto. @@ -1561,7 +1561,7 @@ Proof. constructor. cbn. len. pose proof onc.(on_cargs). eapply eta_expand_context_sorts in X0. now len in X0. exact hrepr. - len. len. + len. len. pose proof onc.(on_ctype). destruct X0. epose proof (eta_expand_expanded (Σ := Σ) _ (repeat None #|ind_bodies m|) _ _ wf t0). forward H. rewrite -arities_context_length. @@ -1578,11 +1578,11 @@ Lemma eta_expand_modtype_decl_expanded {cf : checker_flags} (Σ : global_env_ext Proof. intros hrepr wf onm. assert (H_md_sf_sd: (forall (m : module_implementation) (e : on_module_impl cumul_gen (lift_typing typing) Σ m), expanded_module_impl Σ (eta_module_impl Σg m)) × - (forall (k: kername) (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ k p), expanded_structure_field Σ k (eta_structure_field Σg p)) × + (forall (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ p), expanded_structure_field Σ (eta_structure_field Σg p)) × (forall (s : structure_body) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). { apply on_mi_sf_sb_mutrect; try now constructor; simpl. - - intros kn c onc. constructor. now apply eta_expand_constant_decl_expanded. + - intros c onc. constructor. now apply eta_expand_constant_decl_expanded. - intros kn i oni. constructor. now apply eta_expand_inductive_expanded with (kn := kn). } destruct onm; now repeat constructor. @@ -1596,7 +1596,7 @@ Lemma eta_expand_global_decl_expanded {cf : checker_flags} (Σ : global_env_ext) Proof. intros hrepr wf ond. assert (H_md_sf_sd: (forall (m : module_implementation) (e : on_module_impl cumul_gen (lift_typing typing) Σ m), expanded_module_impl Σ (eta_module_impl Σg m)) × - (forall (k: kername) (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ k p), expanded_structure_field Σ k (eta_structure_field Σg p)) × + (forall (p : structure_field) (e : on_structure_field cumul_gen (lift_typing typing) Σ p), expanded_structure_field Σ (eta_structure_field Σg p)) × (forall (s : structure_body) (e : on_structure_body cumul_gen (lift_typing typing) Σ s), expanded_structure_body Σ (eta_structure_body Σg s))). { unshelve eapply (on_mi_sf_sb_mutrect cumul_gen (lift_typing typing) Σ); try now constructor; simpl. @@ -1625,7 +1625,7 @@ Proof. induction Σ; intros ind idx mdecl idecl cdecl. - unfold declared_constructor, declared_inductive, declared_minductive. cbn => [[[]]] //. - - unfold declared_constructor, declared_constructor_gen, declared_inductive, declared_inductive_gen, + - unfold declared_constructor, declared_constructor_gen, declared_inductive, declared_inductive_gen, declared_minductive, declared_minductive_gen. cbn. destruct a as [kn decl]; cbn. case: eqb_spec. diff --git a/template-coq/theories/Pretty.v b/template-coq/theories/Pretty.v index 345f7215e..df4fbda28 100644 --- a/template-coq/theories/Pretty.v +++ b/template-coq/theories/Pretty.v @@ -325,7 +325,7 @@ Module PrintTermTree. let names := fresh_names Σ' [] (mie_arities_context mie) in (print_recursivity_kind mie.(mind_entry_finite) ^ " " ^ print_list (print_one_ind_entry Σ' with_universes short names mie) (nl ^ "with ") mie.(mind_entry_inds) ^ "." ^ nl). - + Definition print_const_decl kn cb with_universes (short: bool) Σ' := (match cb.(cst_body) with | Some _ => "Definition " | None => "Axiom " end) ^ string_of_kername kn ^ " : " ^ print_term Σ' with_universes nil true cb.(cst_type) ^ @@ -333,28 +333,29 @@ Module PrintTermTree. | Some b => if short then ("..." ^ nl) else (" := " ^ nl ^ print_term Σ' with_universes nil true b ^ "." ^ nl) | None => "." end. - + Definition print_assoc_list {A B: Type} (f: A -> B -> t) (sep: t) (l : list (prod A B)) : t := let fix aux l := match l return t with | nil => "" | cons (kn, a) nil => f kn a | cons (kn, a) l => (f kn a) ^ sep ^ aux l end in aux l. - - Definition print_structure_body (f: kername -> structure_field -> t) (sep: t) (s: structure_body) : t := - let fix aux sb := match sb return t with - | sb_nil => "" - | sb_cons kn sf sb_nil => f kn sf - | sb_cons kn sf sb => f kn sf ^ sep ^ aux sb - end in aux s. + Definition kername_append (kn: kername) (id: ident) := ((MPdot kn.1 kn.2), id). + + Definition print_structure_body (f: kername -> structure_field -> t) sep kn sb := + let fix aux s := match s return t with + | sb_nil => "" + | sb_cons id sf sb_nil => f (kername_append kn id) sf + | sb_cons id sf sb' => f (kername_append kn id) sf ^ sep ^ aux sb' + end in aux sb. Fixpoint print_module_decl kn impl modtype_str with_universes (short: bool) (Σ: global_env) {struct impl}:= let kn_string := string_of_kername kn in match impl with | mi_abstract => "Module " ^ kn_string ^ "." | mi_algebraic kn' => "Module " ^ kn_string ^ " := " ^ (string_of_kername kn') ^ "." | mi_struct sb => - let sb_str := if short then string "..." else print_structure_body (print_structure_field with_universes short Σ) nl sb in + let sb_str := if short then string "..." else print_structure_body (print_structure_field with_universes short Σ) nl kn sb in "Module " ^ kn_string ^ ". " ^ sb_str ^ " End " ^ kn_string ^ "." | mi_fullstruct => "Module " ^ kn_string ^ ". " ^ modtype_str ^ " End " ^ kn_string ^ "." end ^ if short then string "" else "Module Type: " ^ nl ^ modtype_str @@ -362,8 +363,8 @@ Module PrintTermTree. match sf with | sfconst cb => let Σ' := (Σ, cb.(cst_universes)) in print_const_decl kn cb with_universes short Σ' | sfmind mib => print_mib Σ with_universes short mib - | sfmod impl modtype => print_module_decl kn impl (print_structure_body (print_structure_field with_universes short Σ) nl modtype) with_universes short Σ - | sfmodtype mt => print_structure_body (print_structure_field with_universes short Σ) nl mt + | sfmod impl modtype => print_module_decl kn impl (print_structure_body (print_structure_field with_universes short Σ) nl kn modtype) with_universes short Σ + | sfmodtype mt => print_structure_body (print_structure_field with_universes short Σ) nl kn mt end. Fixpoint print_env_aux with_universes (short : bool) (prefix : nat) (Σ : global_env) (acc : t) : t := @@ -392,11 +393,11 @@ Module PrintTermTree. end ^ acc) | (kn, ModuleDecl (impl, modtype)) :: Σ => let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in - let modtype_str := print_structure_body (print_structure_field with_universes short Σ) nl modtype in + let modtype_str := print_structure_body (print_structure_field with_universes short Σ) nl kn modtype in print_env_aux with_universes short n Σ (print_module_decl kn impl modtype_str with_universes short Σ ^ acc) | (kn, ModuleTypeDecl mt) :: Σ => let Σ := {| Env.universes := univs; declarations := Σ; retroknowledge := retro |} in - print_structure_body (print_structure_field with_universes short Σ) nl mt + print_structure_body (print_structure_field with_universes short Σ) nl kn mt end end. diff --git a/template-coq/theories/ReflectAst.v b/template-coq/theories/ReflectAst.v index ca86428a5..b27cbcd1e 100644 --- a/template-coq/theories/ReflectAst.v +++ b/template-coq/theories/ReflectAst.v @@ -252,8 +252,8 @@ with eqb_module_type_decl (mt mt': module_type_decl) {struct mt} := k ==? k' && eqb_structure_field sf sf' && eqb_module_type_decl sb sb' | _, _ => false end. - -Lemma reflect_sf_mi_sb: + +Lemma reflect_sf_mi_sb: (forall f f': structure_field, reflectProp (f = f') (eqb_structure_field f f')) × (forall m m': module_implementation, reflectProp (m = m') (eqb_module_impl m m')) × (forall s s': structure_body, reflectProp (s = s') (eqb_module_type_decl s s')). @@ -273,19 +273,19 @@ Proof. - destruct m'; simpl; now constructor. - destruct s'; simpl; now constructor. - destruct s'; simpl; try now constructor. - destruct (eqb_spec k k0), (H s1), (H0 s'); simpl; now constructor. + destruct (eqb_spec i i0), (H s1), (H0 s'); simpl; now constructor. Qed. -#[global] Instance reflect_structure_field : ReflectEq structure_field := +#[global] Instance reflect_structure_field : ReflectEq structure_field := { eqb := eqb_structure_field ; eqb_spec := reflect_sf_mi_sb.1 }. -#[global] Instance reflect_module_impl : ReflectEq module_implementation := +#[global] Instance reflect_module_impl : ReflectEq module_implementation := { eqb := eqb_module_impl ; eqb_spec := reflect_sf_mi_sb.2.1 }. -#[global] Instance reflect_structure_body : ReflectEq structure_body := +#[global] Instance reflect_structure_body : ReflectEq structure_body := { eqb := eqb_module_type_decl ; eqb_spec := reflect_sf_mi_sb.2.2 }. -#[global] Instance reflect_module_type : ReflectEq module_type_decl := +#[global] Instance reflect_module_type : ReflectEq module_type_decl := { eqb := eqb_module_type_decl ; eqb_spec := reflect_sf_mi_sb.2.2 }. Definition eqb_module_decl (m m': module_decl) := (m.1 ==? m'.1) && (m.2 ==? m'.2). diff --git a/template-coq/theories/TemplateCheckWf.v b/template-coq/theories/TemplateCheckWf.v index 894fed667..315696117 100644 --- a/template-coq/theories/TemplateCheckWf.v +++ b/template-coq/theories/TemplateCheckWf.v @@ -7,38 +7,39 @@ Open Scope bs_scope. #[local] Existing Instance config.default_checker_flags. -Definition eta_expand p := +Definition eta_expand p := EtaExpand.eta_expand_program p. Definition check_const_decl_def kn const_decl : TemplateMonad unit := match const_decl.(cst_body) with - | Some body => + | Some body => tmMsg ("Unquoting eta-expanded " ++ string_of_kername kn)%bs ;; tmUnquote body ;; tmMsg ("Succeeded") | None => ret tt end. -Fixpoint check_mod_impl_def impl {struct impl}:= +Fixpoint check_mod_impl_def kn impl {struct impl}:= match impl with - | mi_struct sb => check_structure_body_def sb ;; ret tt + | mi_struct sb => check_structure_body_def kn sb ;; ret tt | _ => ret tt end -with check_structure_field_def kn sf := +with check_structure_field_def kn id sf := + let kn' := ((MPdot kn.1 kn.2), id) in match sf with - | sfconst cb => check_const_decl_def kn cb + | sfconst cb => check_const_decl_def kn' cb | sfmind _ => ret tt - | sfmod impl modtype => check_mod_impl_def impl ;; check_structure_body_def modtype - | sfmodtype sb => check_structure_body_def sb + | sfmod impl modtype => check_mod_impl_def kn' impl ;; check_structure_body_def kn' modtype + | sfmodtype sb => check_structure_body_def kn' sb end -with check_structure_body_def sb := +with check_structure_body_def kn sb := match sb with | sb_nil => ret tt - | sb_cons kn sf sb' => check_structure_field_def kn sf ;; check_structure_body_def sb' + | sb_cons id sf sb' => check_structure_field_def kn id sf ;; check_structure_body_def kn sb' end. Definition check_modtype_def := check_structure_body_def. -Definition check_mod_decl_def m := check_mod_impl_def m.1 ;; check_modtype_def m.2. +Definition check_mod_decl_def kn m := check_mod_impl_def kn m.1 ;; check_modtype_def kn m.2. Definition check_def (d : kername × global_decl) : TemplateMonad unit := match d.2 with @@ -51,8 +52,8 @@ Definition check_def (d : kername × global_decl) : TemplateMonad unit := | None => ret tt end | InductiveDecl idecl => ret tt - | ModuleDecl m => check_mod_decl_def m - | ModuleTypeDecl sb => check_modtype_def sb + | ModuleDecl m => check_mod_decl_def d.1 m + | ModuleTypeDecl sb => check_modtype_def d.1 sb end. Definition is_nil {A} (l : list A) := @@ -98,7 +99,7 @@ with wf_structure_field sf := | sfmodtype mt => wf_structure_body mt end with wf_structure_body sb := - match sb with + match sb with | sb_nil => true | sb_cons kn sf sb' => wf_structure_field sf && wf_structure_body sb' end. @@ -106,7 +107,7 @@ with wf_structure_body sb := Definition wf_module_type := wf_structure_body. Definition wf_module_decl m := wf_module_impl m.1 && wf_structure_body m.2. -Definition wf_global_decl d := +Definition wf_global_decl d := match d with | ConstantDecl cb => wf_constant_body cb | InductiveDecl idecl => true diff --git a/template-coq/theories/Typing.v b/template-coq/theories/Typing.v index adbf1c5fd..29ba0a59a 100644 --- a/template-coq/theories/Typing.v +++ b/template-coq/theories/Typing.v @@ -1355,8 +1355,8 @@ Proof. + cut ((forall (m : module_implementation), on_module_impl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m -> on_module_impl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) - × (forall (k: kername) (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p) + × (forall (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) × (forall (s : structure_body), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). * intros md_sf_sb. constructor; apply md_sf_sb; apply Xg. @@ -1367,7 +1367,8 @@ Proof. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - -- constructor. destruct o0 as [onI onP onnp]; constructor; eauto. + -- intros kn0 inds o0. + apply on_sfmind with (kn:=kn0). destruct o0 as [onI onP onnp]; constructor; eauto. --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. clear IH; rename IH' into IH. @@ -1391,7 +1392,7 @@ Proof. generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). generalize (cstr_indices x0). induction 1; constructor; auto. do 2 red in t0 |- *. - apply (IH (_; (_; (_; t0)))). } + apply (IH (_; (_; (_; t0)))). } ** pose proof (onProjections Xg); auto. ** destruct Xg. simpl. unfold check_ind_sorts in *. destruct Universe.is_prop; auto. @@ -1409,8 +1410,8 @@ Proof. + cut ((forall (m : module_implementation), on_module_impl cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m -> on_module_impl cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) m) - × (forall (k: kername) (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p - -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) k p) + × (forall (p : structure_field), on_structure_field cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p + -> on_structure_field cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) p) × (forall (s : structure_body), on_structure_body cumul_gen (lift_typing typing) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s -> on_structure_body cumul_gen (lift_typing P) ({| universes := univs; declarations := Σ; retroknowledge := retroknowledge0 |}, Monomorphic_ctx) s)). * intros md_sf_sb. apply md_sf_sb; apply Xg. @@ -1422,7 +1423,8 @@ Proof. all: specialize (IH ((Σ', udecl); wfΣ; _; _; _; Hs)). all: forward IH; [constructor 1; simpl; subst Σ' Σg; cbn; lia|]. all: apply IH. - -- constructor. destruct o0 as [onI onP onnp]; constructor; eauto. + -- intros kn0 inds o0. apply on_sfmind with (kn:=kn0). + destruct o0 as [onI onP onnp]; constructor; eauto. --- unshelve eset (IH' := fun p => IH ((Σ', udecl); wfΣ; p) _). constructor. cbn; subst Σ' Σg; lia. clearbody IH'. cbn in IH'. clear IH; rename IH' into IH. @@ -1446,7 +1448,7 @@ Proof. generalize (List.rev (lift_context #|cstr_args x0| 0 (ind_indices x))). generalize (cstr_indices x0). induction 1; constructor; auto. do 2 red in t0 |- *. - apply (IH (_; (_; (_; t0)))). } + apply (IH (_; (_; (_; t0)))). } ** pose proof (onProjections Xg); auto. ** destruct Xg. simpl. unfold check_ind_sorts in *. destruct Universe.is_prop; auto. From 89b4c006557f47264b11f27489fef0c920d092ba Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Tue, 17 Jan 2023 23:06:25 +0800 Subject: [PATCH 42/43] nested inductive types --- template-coq/theories/Environment.v | 43 +++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 15e00d4cf..618234e02 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -324,22 +324,42 @@ Module Environment (T : Term). Inductive structure_field := | sfconst : constant_body -> structure_field | sfmind : mutual_inductive_body -> structure_field - | sfmod : module_implementation -> structure_body -> structure_field - | sfmodtype : structure_body -> structure_field + | sfmod : module_implementation -> list (ident × structure_field) -> structure_field + | sfmodtype : list (ident × structure_field) -> structure_field with module_implementation := | mi_abstract : module_implementation (** Declare Module M: T. *) | mi_algebraic : kername -> module_implementation (** Module M [:T] := N. *) - | mi_struct : structure_body -> module_implementation (** Module M:T. ... End M.*) - | mi_fullstruct : module_implementation (** Module M. ... End M.*) - with structure_body := + | mi_struct : list (ident × structure_field) -> module_implementation (** Module M:T. ... End M.*) + | mi_fullstruct : module_implementation (** Module M. ... End M.*). + (* with structure_body := list (ident × structure_field). | sb_nil - | sb_cons : ident -> structure_field -> structure_body -> structure_body. + | sb_cons : ident -> structure_field -> structure_body -> structure_body. *) + Print structure_field_rect. Scheme structureField_rect := Induction for structure_field Sort Type - with moduleImpl_rect := Induction for module_implementation Sort Type - with structureBody_rect := Induction for structure_body Sort Type. - - Combined Scheme sf_mi_sb_mutind from structureField_rect, moduleImpl_rect, structureBody_rect. + with moduleImpl_rect := Induction for module_implementation Sort Type. + (* with structureBody_rect := Induction for structure_body Sort Type. *) + Print structureField_rect. + + Definition structure_body := list (ident × structure_field). + + Definition sf_rect : forall (P : structure_field -> Type) + (P0 : module_implementation -> Type), + (forall c : constant_body, P (sfconst c)) -> + (forall m : mutual_inductive_body, P (sfmind m)) -> + (forall m : module_implementation, + P0 m -> forall l : structure_body, All P (map snd l) -> P (sfmod m l)) -> + (forall l : structure_body, All P (map snd l) -> P (sfmodtype l)) -> + P0 mi_abstract -> + (forall k : kername, P0 (mi_algebraic k)) -> + (forall l : structure_body, All P (map snd l) -> P0 (mi_struct l)) -> + P0 mi_fullstruct -> forall s : structure_field, P s. + Proof. + intros Psf Pmi. + intros Hcst Hind Hsfmod Hsfmt Hmiabs Hmialg. + intros H Hmifs. + destruct s; auto. + apply Hsfmod. Definition module_type_decl := structure_body. Definition module_decl := module_implementation × module_type_decl. @@ -351,7 +371,7 @@ Module Environment (T : Term). | ModuleTypeDecl : module_type_decl -> global_decl. Derive NoConfusion for global_decl. - Definition global_declarations := list (kername * global_decl). + Definition global_declarations := structure_body. Record global_env := mk_global_env { universes : ContextSet.t; @@ -379,6 +399,7 @@ Module Environment (T : Term). declarations := decls; retroknowledge := Σ.(retroknowledge) |}. + (* only looks for base ?? *) Fixpoint lookup_global (Σ : global_declarations) (kn : kername) : option global_decl := match Σ with | nil => None From 58ce4816aa7e2044161fefe3249636e6f0fd1aee Mon Sep 17 00:00:00 2001 From: Yee-Jian Tan Date: Thu, 2 Feb 2023 21:13:18 +0800 Subject: [PATCH 43/43] Define well-founded recursion on structure_field --- template-coq/theories/Environment.v | 264 +++++++++++++++++++++------- 1 file changed, 201 insertions(+), 63 deletions(-) diff --git a/template-coq/theories/Environment.v b/template-coq/theories/Environment.v index 618234e02..bed7fffa7 100644 --- a/template-coq/theories/Environment.v +++ b/template-coq/theories/Environment.v @@ -2,6 +2,7 @@ From Coq Require Import ssreflect ssrbool ssrfun Morphisms Setoid. From MetaCoq.Template Require Import utils BasicAst Primitive. From MetaCoq.Template Require Import Universes. +From Equations Require Import Equations. Module Type Term. @@ -322,108 +323,244 @@ Module Environment (T : Term). in the body since it is already included in [global_declarations]. *) (** implementation -> module type -> algebraic (colon-annotated) module type (TODO) *) Inductive structure_field := - | sfconst : constant_body -> structure_field - | sfmind : mutual_inductive_body -> structure_field - | sfmod : module_implementation -> list (ident × structure_field) -> structure_field - | sfmodtype : list (ident × structure_field) -> structure_field + | ConstantDecl : constant_body -> structure_field + | InductiveDecl : mutual_inductive_body -> structure_field + | ModuleDecl : module_implementation -> list (ident × structure_field) -> structure_field + | ModuleTypeDecl : list (ident × structure_field) -> structure_field with module_implementation := | mi_abstract : module_implementation (** Declare Module M: T. *) | mi_algebraic : kername -> module_implementation (** Module M [:T] := N. *) | mi_struct : list (ident × structure_field) -> module_implementation (** Module M:T. ... End M.*) | mi_fullstruct : module_implementation (** Module M. ... End M.*). - (* with structure_body := list (ident × structure_field). - | sb_nil - | sb_cons : ident -> structure_field -> structure_body -> structure_body. *) - Print structure_field_rect. - - Scheme structureField_rect := Induction for structure_field Sort Type - with moduleImpl_rect := Induction for module_implementation Sort Type. - (* with structureBody_rect := Induction for structure_body Sort Type. *) - Print structureField_rect. - - Definition structure_body := list (ident × structure_field). - - Definition sf_rect : forall (P : structure_field -> Type) - (P0 : module_implementation -> Type), - (forall c : constant_body, P (sfconst c)) -> - (forall m : mutual_inductive_body, P (sfmind m)) -> - (forall m : module_implementation, - P0 m -> forall l : structure_body, All P (map snd l) -> P (sfmod m l)) -> - (forall l : structure_body, All P (map snd l) -> P (sfmodtype l)) -> - P0 mi_abstract -> - (forall k : kername, P0 (mi_algebraic k)) -> - (forall l : structure_body, All P (map snd l) -> P0 (mi_struct l)) -> - P0 mi_fullstruct -> forall s : structure_field, P s. + + Notation structure_body := (list (ident × structure_field))%type. + + Section Induction. + Variable (P : structure_field -> Type) (P0 : module_implementation -> Type). + Definition P1 : structure_body -> Type := All (fun x => P (snd x)). + + Variable (f : forall c : constant_body, P (ConstantDecl c)) + (f0 : forall m : mutual_inductive_body, P (InductiveDecl m)) + (f1 : forall m : module_implementation, + P0 m -> forall s : structure_body, P1 s -> P (ModuleDecl m s)) + (f2 : forall s : structure_body, P1 s -> P (ModuleTypeDecl s)) + (f3 : P0 mi_abstract) (f4 : forall k : kername, P0 (mi_algebraic k)) + (f5 : forall s : structure_body, P1 s -> P0 (mi_struct s)) + (f6 : P0 mi_fullstruct). + + Definition f7 : P1 nil := All_nil. + Definition f8 : forall (i : ident) (s : structure_field), + P s -> forall s0 : structure_body, P1 s0 -> P1 (cons (i,s) s0). + Proof. intros i sf Psf sb Psb. apply All_cons => //. Defined. + + Section Nested. + Variable F : forall (s: structure_field), P s. + Fixpoint F1 (s : structure_body) : P1 s := + match s as s0 return (P1 s0) with + | nil => f7 + | cons (i,s0) s1 => f8 i s0 (F s0) s1 (F1 s1) + end. + End Nested. + + Fixpoint F (s : structure_field) : P s := + match s as s0 return (P s0) with + | ConstantDecl c => f c + | InductiveDecl m => f0 m + | ModuleDecl m s0 => f1 m (F0 m) s0 (F1 F s0) + | ModuleTypeDecl s0 => f2 s0 (F1 F s0) + end + with F0 (m : module_implementation) : P0 m := + match m as m0 return (P0 m0) with + | mi_abstract => f3 + | mi_algebraic k => f4 k + | mi_struct s => f5 s (F1 F s) + | mi_fullstruct => f6 + end. + + Definition structureField_rect := F. + Definition moduleImpl_rect := F0. + Definition structureBody_rect := F1 F. + End Induction. + + Definition sf_mi_sb_mutrect + (P : structure_field -> Type) (P0 : module_implementation -> Type) + (P1 : structure_body -> Type := All (fun x => P (snd x))) + (f : forall c : constant_body, P (ConstantDecl c)) + (f0 : forall m : mutual_inductive_body, P (InductiveDecl m)) + (f1 : forall m : module_implementation, + P0 m -> forall s : structure_body, P1 s -> P (ModuleDecl m s)) + (f2 : forall s : structure_body, P1 s -> P (ModuleTypeDecl s)) + (f3 : P0 mi_abstract) (f4 : forall k : kername, P0 (mi_algebraic k)) + (f5 : forall s : structure_body, P1 s -> P0 (mi_struct s)) + (f6 : P0 mi_fullstruct) : + (forall s: structure_field, P s) * (forall m: module_implementation, P0 m) + * (forall s: structure_body, P1 s). Proof. - intros Psf Pmi. - intros Hcst Hind Hsfmod Hsfmt Hmiabs Hmialg. - intros H Hmifs. - destruct s; auto. - apply Hsfmod. + repeat split. + eapply structureField_rect; eauto. + eapply moduleImpl_rect; eauto. + eapply structureBody_rect; eauto. + Defined. Definition module_type_decl := structure_body. Definition module_decl := module_implementation × module_type_decl. - - Inductive global_decl := - | ConstantDecl : constant_body -> global_decl - | InductiveDecl : mutual_inductive_body -> global_decl - | ModuleDecl : module_decl -> global_decl - | ModuleTypeDecl : module_type_decl -> global_decl. - Derive NoConfusion for global_decl. - - Definition global_declarations := structure_body. + Notation global_decl := structure_field. + Notation global_declarations := structure_body. + + Section WellFounded. + Equations alt_size_sf (sf: structure_field) : nat := + | ConstantDecl _ := 1; + | InductiveDecl _ := 1; + | ModuleDecl mi mt := 1 + (max (alt_size_mi mi) (alt_size_sb mt)); + | ModuleTypeDecl mt := 1 + (alt_size_sb mt); + where alt_size_sb (sb: structure_body) : nat := + | nil := 0; + | (hd::tl) := alt_size_sf hd.2 + alt_size_sb tl; + where alt_size_mi (mi: module_implementation) : nat := + | mi_struct s := alt_size_sb s; + | _ := 0. + + Lemma alt_size_sf_ge_one: (forall sf: structure_field, 0 < alt_size_sf sf). + Proof. + destruct sf; simp alt_size_sf; lia. + Qed. + + Equations paths_of_structure_field (sf: structure_field) (prefix: list ident) + : list (list ident) by wf (alt_size_sf sf) lt := + | ConstantDecl _, p := [p]; + | InductiveDecl _, p := [p]; + | ModuleDecl (mi_struct nil) _, p := []; + | ModuleDecl (mi_struct (hd::tl)) _, p := + (paths_of_structure_field hd.2 (p++[hd.1])) ++ + (paths_of_structure_field (ModuleTypeDecl tl) p) + | ModuleDecl (mi_fullstruct) nil, p := []; + | ModuleDecl (mi_fullstruct) (hd::tl), p := + (paths_of_structure_field hd.2 (p++[hd.1])) ++ + (paths_of_structure_field (ModuleTypeDecl tl) p) + | ModuleDecl _ mt, p := []; + | ModuleTypeDecl nil, p := []; + | ModuleTypeDecl (hd::tl), p := + (paths_of_structure_field hd.2 (p++[hd.1])) ++ + (paths_of_structure_field (ModuleTypeDecl tl) p). + Next Obligation. + simp alt_size_sf. + simpl; rewrite Nat.succ_max_distr. lia. + Defined. Next Obligation. + pose proof (alt_size_sf_ge_one s). + simp alt_size_sf. + simpl; rewrite Nat.succ_max_distr. lia. + Defined. Next Obligation. + pose proof (alt_size_sf_ge_one s). + simp alt_size_sf. + simpl. lia. + Defined. Next Obligation. + pose proof (alt_size_sf_ge_one s). + simp alt_size_sf. simpl. lia. + Defined. Next Obligation. + pose proof (alt_size_sf_ge_one s). + simp alt_size_sf. simpl. lia. + Defined. Next Obligation. + pose proof (alt_size_sf_ge_one s). + simp alt_size_sf. simpl. lia. + Defined. + + Definition paths_of_structure_body (sb: structure_body) (prefix: list ident) + : list (list ident) + := fold_left + (fun acc '(i, sf) => acc ++ (paths_of_structure_field sf (prefix ++ [i]))) + sb []. + End WellFounded. Record global_env := mk_global_env { universes : ContextSet.t; - declarations : global_declarations; - retroknowledge : Retroknowledge.t }. + declarations : structure_body; + retroknowledge : Retroknowledge.t; + path : dirpath }. Coercion universes : global_env >-> ContextSet.t. Definition empty_global_env := {| universes := ContextSet.empty; declarations := []; - retroknowledge := Retroknowledge.empty |}. + retroknowledge := Retroknowledge.empty; + path := []; |}. Definition add_global_decl Σ decl := {| universes := Σ.(universes); declarations := decl :: Σ.(declarations); - retroknowledge := Σ.(retroknowledge) |}. + retroknowledge := Σ.(retroknowledge); + path := Σ.(path) |}. - Lemma eta_global_env Σ : Σ = {| universes := Σ.(universes); declarations := Σ.(declarations); - retroknowledge := Σ.(retroknowledge) |}. + Lemma eta_global_env Σ : + Σ = {| universes := Σ.(universes); declarations := Σ.(declarations); + retroknowledge := Σ.(retroknowledge); path := Σ.(path) |}. Proof. now destruct Σ. Qed. Definition set_declarations Σ decls := {| universes := Σ.(universes); declarations := decls; - retroknowledge := Σ.(retroknowledge) |}. - - (* only looks for base ?? *) - Fixpoint lookup_global (Σ : global_declarations) (kn : kername) : option global_decl := - match Σ with + retroknowledge := Σ.(retroknowledge); + path := Σ.(path) |}. + + (* MetaCoq.TemplateCoq.Environment.Environment.destruct_kername => + (MetaCoq.TemplateCoq.Environment, [Environment; destruct_kername]) + for easy lookup. *) + Definition destruct_kername kn : dirpath × list ident := + let destruct_modpath := fix aux mp := + match mp with + | MPfile dp => (dp, []) + | MPbound dp id n => (dp, [id]) + | MPdot mp id => let (dp, l) := aux mp in (dp, l++[id]) + end in + let (dp, l) := destruct_modpath kn.1 in (dp, l++[kn.2]). + + Fixpoint lookup_ident_structure_body (sb: structure_body) i : option structure_field := + match sb with | nil => None - | d :: tl => - if kn == d.1 then Some d.2 - else lookup_global tl kn + | (id, sf) :: tl => if id == i then Some sf else lookup_ident_structure_body tl i end. - Definition lookup_env (Σ : global_env) (kn : kername) := lookup_global Σ.(declarations) kn. + Fixpoint lookup_idents_structure_body (sb: structure_body) (ids: list ident) + : option structure_field := + match ids with + | nil => None + | hd :: nil => lookup_ident_structure_body sb hd + | hd :: tl => match lookup_ident_structure_body sb hd with + | Some (ModuleDecl mi mt) => match mi with + | mi_struct bd => lookup_idents_structure_body bd tl + | mi_fullstruct => lookup_idents_structure_body mt tl + | _ => None + end + | Some (ModuleTypeDecl mt) => lookup_idents_structure_body mt tl + | _ => None + end + end. + + Definition lookup_global (s : global_declarations) (dp: dirpath) (kn : kername) + : option structure_field := + let (kn_dp, kn_l) := destruct_kername kn in + if (dp == kn_dp) then lookup_idents_structure_body s kn_l + else None. + + Definition lookup_env (Σ : global_env) (kn : kername) : option structure_field := + lookup_global Σ.(declarations) Σ.(path) kn. Definition extends (Σ Σ' : global_env) := [× Σ.(universes) ⊂_cs Σ'.(universes), - ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations) & - Retroknowledge.extends Σ.(retroknowledge) Σ'.(retroknowledge)]. + ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations), + Retroknowledge.extends Σ.(retroknowledge) Σ'.(retroknowledge) & + Σ.(path) = Σ'.(path)]. Definition extends_decls (Σ Σ' : global_env) := [× Σ.(universes) = Σ'.(universes), - ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations) & - Σ.(retroknowledge) = Σ'.(retroknowledge)]. + ∑ Σ'', Σ'.(declarations) = Σ'' ++ Σ.(declarations), + Σ.(retroknowledge) = Σ'.(retroknowledge) & + Σ.(path) = Σ'.(path)]. Existing Class extends. Existing Class extends_decls. - Lemma lookup_global_None Σ kn : ~In kn (List.map fst Σ) <-> lookup_global Σ kn = None. + (* Lemma lookup_global_None Σ kn : ~In kn (List.map fst Σ) <-> lookup_global Σ kn = None. Proof. move: Σ; elim => //=; try tauto. move => ??; case: eqb_spec; intuition congruence. @@ -440,7 +577,7 @@ Module Environment (T : Term). all: repeat match goal with H : Some _ = Some _ |- _ => inversion H; clear H end. all: subst => //=; auto. all: try now epose proof (@in_map _ _ fst _ (_, _)); cbn in *; exfalso; eauto. - Qed. + Qed. *) #[global] Instance extends_decls_extends Σ Σ' : extends_decls Σ Σ' -> extends Σ Σ'. Proof. @@ -452,7 +589,8 @@ Module Environment (T : Term). Proof. red. intros x. split => //; try exists [] => //. Qed. Lemma extends_refl : CRelationClasses.Reflexive extends. - Proof. red. intros x. split; [apply incl_cs_refl | now exists [] | apply Retroknowledge.extends_refl]. Qed. + Proof. red. intros x. unfold extends. + split; [apply incl_cs_refl | now exists [] | apply Retroknowledge.extends_refl | reflexivity]. Qed. (* easy prefers this to the local hypotheses, which is annoying #[global] Instance extends_refl : CRelationClasses.Reflexive extends.

K$?RK8)U;uIuh7C^VZ})mVhQslEVy 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�u@R$h` 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 O4ksRY0cB@Q&= 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 + + + + + +dependencies + + + +safechecker/Extraction + +Extraction + + + +safechecker/PCUICConsistency + +PCUICConsistency + + + +safechecker/PCUICRetypingEnvIrrelevance + +PCUICRetypingEnvIrrelevance + + + +erasure/ErasureFunction + +ErasureFunction + + + +safechecker/PCUICRetypingEnvIrrelevance->erasure/ErasureFunction + + + + + +safechecker/PCUICSafeRetyping + +PCUICSafeRetyping + + + +safechecker/PCUICSafeRetyping->safechecker/PCUICRetypingEnvIrrelevance + + + + + +safechecker/SafeTemplateChecker + +SafeTemplateChecker + + + +safechecker/SafeTemplateChecker->safechecker/Extraction + + + + + +safechecker/PCUICWfEnvImpl + +PCUICWfEnvImpl + + + +safechecker/PCUICWfEnvImpl->safechecker/PCUICConsistency + + + + + +safechecker/PCUICWfEnvImpl->safechecker/SafeTemplateChecker + + + + + +erasure/EOptimizePropDiscr + +EOptimizePropDiscr + + + +safechecker/PCUICWfEnvImpl->erasure/EOptimizePropDiscr + + + + + +safechecker/PCUICSafeChecker + +PCUICSafeChecker + + + +safechecker/PCUICSafeChecker->safechecker/SafeTemplateChecker + + + + + +safechecker/PCUICTypeChecker + +PCUICTypeChecker + + + +safechecker/PCUICTypeChecker->safechecker/PCUICSafeChecker + + + + + +safechecker/PCUICWfReduction + +PCUICWfReduction + + + +safechecker/PCUICSafeReduce + +PCUICSafeReduce + + + +safechecker/PCUICWfReduction->safechecker/PCUICSafeReduce + + + + + +safechecker/PCUICSafeConversion + +PCUICSafeConversion + + + +safechecker/PCUICSafeConversion->safechecker/PCUICTypeChecker + + + + + +safechecker/PCUICSafeReduce->safechecker/PCUICConsistency + + + + + +safechecker/PCUICSafeReduce->safechecker/PCUICSafeRetyping + + + + + +safechecker/PCUICSafeReduce->safechecker/PCUICSafeConversion + + + + + +safechecker/PCUICWfEnv + +PCUICWfEnv + + + +safechecker/PCUICWfEnv->safechecker/PCUICWfEnvImpl + + + + + +safechecker/PCUICWfEnv->safechecker/PCUICWfReduction + + + + + +safechecker/PCUICErrors + +PCUICErrors + + + +safechecker/PCUICErrors->safechecker/PCUICSafeReduce + + + + + +erasure/Prelim + +Prelim + + + +safechecker/PCUICErrors->erasure/Prelim + + + + + +safechecker/PCUICEqualityDec + +PCUICEqualityDec + + + +safechecker/PCUICEqualityDec->safechecker/PCUICWfEnvImpl + + + + + +safechecker/PCUICEqualityDec->safechecker/PCUICSafeConversion + + + + + +pcuic/Bidirectional/BDToPCUIC + +BDToPCUIC + + + +pcuic/Bidirectional/BDFromPCUIC + +BDFromPCUIC + + + +pcuic/Bidirectional/BDToPCUIC->pcuic/Bidirectional/BDFromPCUIC + + + + + +pcuic/Bidirectional/BDUnique + +BDUnique + + + +pcuic/Bidirectional/BDFromPCUIC->pcuic/Bidirectional/BDUnique + + + + + +pcuic/Bidirectional/BDStrengthening + +BDStrengthening + + + +pcuic/Bidirectional/BDFromPCUIC->pcuic/Bidirectional/BDStrengthening + + + + + +pcuic/Bidirectional/BDTyping + +BDTyping + + + +pcuic/Bidirectional/BDTyping->pcuic/Bidirectional/BDToPCUIC + + + + + +pcuic/PCUICSR + +PCUICSR + + + +pcuic/PCUICSR->pcuic/Bidirectional/BDToPCUIC + + + + + +pcuic/PCUICNormal + +PCUICNormal + + + +pcuic/PCUICSR->pcuic/PCUICNormal + + + + + +pcuic/PCUICCumulativity + +PCUICCumulativity + + + +pcuic/PCUICCumulativity->pcuic/Bidirectional/BDTyping + + + + + +pcuic/Conversion/PCUICUnivSubstitutionConv + +PCUICUnivSubstitutionConv + + + +pcuic/PCUICCumulativity->pcuic/Conversion/PCUICUnivSubstitutionConv + + + + + +pcuic/Conversion/PCUICWeakeningEnvConv + +PCUICWeakeningEnvConv + + + +pcuic/PCUICCumulativity->pcuic/Conversion/PCUICWeakeningEnvConv + + + + + +pcuic/PCUICTyping + +PCUICTyping + + + +pcuic/PCUICTyping->pcuic/Bidirectional/BDTyping + + + + + +pcuic/PCUICGlobalEnv + +PCUICGlobalEnv + + + +pcuic/PCUICTyping->pcuic/PCUICGlobalEnv + + + + + +pcuic/PCUICCSubst + +PCUICCSubst + + + +pcuic/PCUICTyping->pcuic/PCUICCSubst + + + + + +pcuic/PCUICGeneration + +PCUICGeneration + + + +pcuic/PCUICTyping->pcuic/PCUICGeneration + + + + + +pcuic/Syntax/PCUICNamelessDef + +PCUICNamelessDef + + + +pcuic/PCUICTyping->pcuic/Syntax/PCUICNamelessDef + + + + + +pcuic/Syntax/PCUICRenameDef + +PCUICRenameDef + + + +pcuic/PCUICTyping->pcuic/Syntax/PCUICRenameDef + + + + + +pcuic/Bidirectional/BDUnique->safechecker/PCUICSafeRetyping + + + + + +pcuic/Bidirectional/BDUnique->safechecker/PCUICTypeChecker + + + + + +pcuic/Conversion/PCUICClosedConv + +PCUICClosedConv + + + +pcuic/PCUICGlobalEnv->pcuic/Conversion/PCUICClosedConv + + + + + +pcuic/PCUICProgram + +PCUICProgram + + + +pcuic/PCUICGlobalEnv->pcuic/PCUICProgram + + + + + +pcuic/Typing/PCUICWeakeningEnvTyp + +PCUICWeakeningEnvTyp + + + +pcuic/PCUICGlobalEnv->pcuic/Typing/PCUICWeakeningEnvTyp + + + + + +pcuic/Typing/PCUICClosedTyp + +PCUICClosedTyp + + + +pcuic/Conversion/PCUICClosedConv->pcuic/Typing/PCUICClosedTyp + + + + + +pcuic/PCUICReduction + +PCUICReduction + + + +pcuic/PCUICReduction->pcuic/PCUICCumulativity + + + + + +pcuic/PCUICReduction->pcuic/Conversion/PCUICClosedConv + + + + + +pcuic/PCUICGuardCondition + +PCUICGuardCondition + + + +pcuic/PCUICReduction->pcuic/PCUICGuardCondition + + + + + +pcuic/PCUICReduction->pcuic/PCUICCSubst + + + + + +pcuic/PCUICWeakeningEnv + +PCUICWeakeningEnv + + + +pcuic/PCUICWeakeningEnv->pcuic/Conversion/PCUICClosedConv + + + + + +pcuic/PCUICWeakeningEnv->pcuic/Conversion/PCUICUnivSubstitutionConv + + + + + +pcuic/PCUICWeakeningEnv->pcuic/Conversion/PCUICWeakeningEnvConv + + + + + +pcuic/Conversion/PCUICInstConv + +PCUICInstConv + + + +pcuic/Conversion/PCUICUnivSubstitutionConv->pcuic/Conversion/PCUICInstConv + + + + + +pcuic/Typing/PCUICUnivSubstitutionTyp + +PCUICUnivSubstitutionTyp + + + +pcuic/Conversion/PCUICUnivSubstitutionConv->pcuic/Typing/PCUICUnivSubstitutionTyp + + + + + +pcuic/Conversion/PCUICNamelessConv + +PCUICNamelessConv + + + +pcuic/Conversion/PCUICUnivSubstitutionConv->pcuic/Conversion/PCUICNamelessConv + + + + + +pcuic/Typing/PCUICInstTyp + +PCUICInstTyp + + + +pcuic/Conversion/PCUICInstConv->pcuic/Typing/PCUICInstTyp + + + + + +pcuic/Typing/PCUICWeakeningTyp + +PCUICWeakeningTyp + + + +pcuic/Typing/PCUICWeakeningTyp->pcuic/Conversion/PCUICInstConv + + + + + +pcuic/Conversion/PCUICRenameConv + +PCUICRenameConv + + + +pcuic/Conversion/PCUICOnFreeVarsConv + +PCUICOnFreeVarsConv + + + +pcuic/Conversion/PCUICRenameConv->pcuic/Conversion/PCUICOnFreeVarsConv + + + + + +pcuic/Conversion/PCUICWeakeningConv + +PCUICWeakeningConv + + + +pcuic/Conversion/PCUICRenameConv->pcuic/Conversion/PCUICWeakeningConv + + + + + +pcuic/Typing/PCUICRenameTyp + +PCUICRenameTyp + + + +pcuic/Conversion/PCUICOnFreeVarsConv->pcuic/Typing/PCUICRenameTyp + + + + + +pcuic/Syntax/PCUICViews + +PCUICViews + + + +pcuic/Syntax/PCUICViews->pcuic/Conversion/PCUICRenameConv + + + + + +pcuic/Typing/PCUICClosedTyp->pcuic/Conversion/PCUICRenameConv + + + + + +pcuic/PCUICWcbvEval + +PCUICWcbvEval + + + +pcuic/Typing/PCUICClosedTyp->pcuic/PCUICWcbvEval + + + + + +pcuic/Typing/PCUICClosedTyp->pcuic/Conversion/PCUICNamelessConv + + + + + +pcuic/PCUICGuardCondition->pcuic/Conversion/PCUICUnivSubstitutionConv + + + + + +pcuic/PCUICGuardCondition->pcuic/Typing/PCUICWeakeningEnvTyp + + + + + +pcuic/Conversion/PCUICWeakeningConv->pcuic/Typing/PCUICWeakeningTyp + + + + + +pcuic/Conversion/PCUICWeakeningEnvConv->pcuic/Typing/PCUICWeakeningEnvTyp + + + + + +pcuic/PCUICCumulativitySpec + +PCUICCumulativitySpec + + + +pcuic/PCUICCumulativitySpec->pcuic/PCUICTyping + + + + + +pcuic/PCUICCumulativitySpec->pcuic/Conversion/PCUICWeakeningEnvConv + + + + + +pcuic/PCUICInductiveInversion + +PCUICInductiveInversion + + + +pcuic/PCUICAlpha + +PCUICAlpha + + + +pcuic/PCUICInductiveInversion->pcuic/PCUICAlpha + + + + + +pcuic/PCUICEtaExpand + +PCUICEtaExpand + + + +pcuic/PCUICInductiveInversion->pcuic/PCUICEtaExpand + + + + + +pcuic/TemplateToPCUICCorrectness + +TemplateToPCUICCorrectness + + + +pcuic/PCUICInductiveInversion->pcuic/TemplateToPCUICCorrectness + + + + + +pcuic/PCUICAlpha->pcuic/PCUICSR + + + + + +pcuic/PCUICContexts + +PCUICContexts + + + +pcuic/PCUICArities + +PCUICArities + + + +pcuic/PCUICContexts->pcuic/PCUICArities + + + + + +pcuic/PCUICSpine + +PCUICSpine + + + +pcuic/PCUICArities->pcuic/PCUICSpine + + + + + +pcuic/PCUICInversion + +PCUICInversion + + + +pcuic/PCUICInversion->pcuic/PCUICArities + + + + + +pcuic/PCUICWfUniverses + +PCUICWfUniverses + + + +pcuic/PCUICWfUniverses->safechecker/PCUICEqualityDec + + + + + +pcuic/PCUICWfUniverses->pcuic/PCUICArities + + + + + +pcuic/utils/PCUICPrimitive + +PCUICPrimitive + + + +pcuic/PCUICAst + +PCUICAst + + + +pcuic/utils/PCUICPrimitive->pcuic/PCUICAst + + + + + +pcuic/utils/PCUICOnOne + +PCUICOnOne + + + +pcuic/PCUICAst->pcuic/utils/PCUICOnOne + + + + + +pcuic/utils/PCUICSize + +PCUICSize + + + +pcuic/PCUICAst->pcuic/utils/PCUICSize + + + + + +pcuic/PCUICCSubst->pcuic/PCUICWcbvEval + + + + + +pcuic/PCUICElimination + +PCUICElimination + + + +pcuic/PCUICCanonicity + +PCUICCanonicity + + + +pcuic/PCUICElimination->pcuic/PCUICCanonicity + + + + + +erasure/Extract + +Extract + + + +pcuic/PCUICElimination->erasure/Extract + + + + + +pcuic/PCUICCanonicity->safechecker/PCUICSafeReduce + + + + + +erasure/EArities + +EArities + + + +pcuic/PCUICCanonicity->erasure/EArities + + + + + +pcuic/PCUICExpandLetsCorrectness + +PCUICExpandLetsCorrectness + + + +pcuic/PCUICCanonicity->pcuic/PCUICExpandLetsCorrectness + + + + + +pcuic/PCUICFirstorder + +PCUICFirstorder + + + +pcuic/PCUICCanonicity->pcuic/PCUICFirstorder + + + + + +pcuic/TemplateToPCUICWcbvEval + +TemplateToPCUICWcbvEval + + + +pcuic/PCUICCanonicity->pcuic/TemplateToPCUICWcbvEval + + + + + +pcuic/PCUICWcbvEval->pcuic/PCUICCanonicity + + + + + +pcuic/PCUICWcbvEval->erasure/Extract + + + + + +erasure/EWcbvEval + +EWcbvEval + + + +pcuic/PCUICWcbvEval->erasure/EWcbvEval + + + + + +pcuic/PCUICEquality + +PCUICEquality + + + +pcuic/PCUICCasesContexts + +PCUICCasesContexts + + + +pcuic/PCUICEquality->pcuic/PCUICCasesContexts + + + + + +pcuic/Syntax/PCUICOnFreeVars + +PCUICOnFreeVars + + + +pcuic/PCUICEquality->pcuic/Syntax/PCUICOnFreeVars + + + + + +pcuic/Syntax/PCUICPosition + +PCUICPosition + + + +pcuic/PCUICEquality->pcuic/Syntax/PCUICPosition + + + + + +pcuic/PCUICCasesContexts->pcuic/PCUICSpine + + + + + +pcuic/PCUICSigmaCalculus + +PCUICSigmaCalculus + + + +pcuic/PCUICSigmaCalculus->pcuic/PCUICCasesContexts + + + + + +pcuic/Syntax/PCUICClosed + +PCUICClosed + + + +pcuic/PCUICSigmaCalculus->pcuic/Syntax/PCUICClosed + + + + + +pcuic/Syntax/PCUICTactics + +PCUICTactics + + + +pcuic/PCUICSigmaCalculus->pcuic/Syntax/PCUICTactics + + + + + +pcuic/PCUICParallelReductionConfluence + +PCUICParallelReductionConfluence + + + +pcuic/PCUICConfluence + +PCUICConfluence + + + +pcuic/PCUICParallelReductionConfluence->pcuic/PCUICConfluence + + + + + +pcuic/PCUICWellScopedCumulativity + +PCUICWellScopedCumulativity + + + +pcuic/PCUICConfluence->pcuic/PCUICWellScopedCumulativity + + + + + +pcuic/PCUICRedTypeIrrelevance + +PCUICRedTypeIrrelevance + + + +pcuic/PCUICRedTypeIrrelevance->pcuic/PCUICConfluence + + + + + +pcuic/PCUICContextConversion + +PCUICContextConversion + + + +pcuic/PCUICWellScopedCumulativity->pcuic/PCUICContextConversion + + + + + +pcuic/PCUICConversion + +PCUICConversion + + + +pcuic/PCUICContextConversion->pcuic/PCUICConversion + + + + + +pcuic/PCUICSubstitution + +PCUICSubstitution + + + +pcuic/PCUICSubstitution->pcuic/PCUICContexts + + + + + +pcuic/PCUICSubstitution->pcuic/PCUICWfUniverses + + + + + +pcuic/PCUICContextReduction + +PCUICContextReduction + + + +pcuic/PCUICSubstitution->pcuic/PCUICContextReduction + + + + + +pcuic/PCUICParallelReduction + +PCUICParallelReduction + + + +pcuic/PCUICSubstitution->pcuic/PCUICParallelReduction + + + + + +pcuic/PCUICContextReduction->pcuic/PCUICRedTypeIrrelevance + + + + + +pcuic/Syntax/PCUICLiftSubst + +PCUICLiftSubst + + + +pcuic/Syntax/PCUICLiftSubst->pcuic/PCUICEquality + + + + + +pcuic/Syntax/PCUICLiftSubst->pcuic/PCUICSigmaCalculus + + + + + +pcuic/PCUICContextSubst + +PCUICContextSubst + + + +pcuic/Syntax/PCUICLiftSubst->pcuic/PCUICContextSubst + + + + + +pcuic/PCUICContextSubst->pcuic/Typing/PCUICWeakeningEnvTyp + + + + + +pcuic/PCUICGeneration->pcuic/PCUICContexts + + + + + +pcuic/PCUICGeneration->pcuic/PCUICWfUniverses + + + + + +pcuic/Typing/PCUICUnivSubstitutionTyp->pcuic/PCUICContexts + + + + + +pcuic/PCUICConvCumInversion + +PCUICConvCumInversion + + + +pcuic/PCUICNormal->pcuic/PCUICConvCumInversion + + + + + +pcuic/PCUICSafeLemmata + +PCUICSafeLemmata + + + +pcuic/PCUICNormal->pcuic/PCUICSafeLemmata + + + + + +pcuic/PCUICConvCumInversion->safechecker/PCUICSafeRetyping + + + + + +pcuic/PCUICConvCumInversion->safechecker/PCUICSafeConversion + + + + + +pcuic/PCUICConversion->pcuic/PCUICInversion + + + + + +pcuic/Typing/PCUICContextConversionTyp + +PCUICContextConversionTyp + + + +pcuic/PCUICConversion->pcuic/Typing/PCUICContextConversionTyp + + + + + +pcuic/Typing/PCUICNamelessTyp + +PCUICNamelessTyp + + + +pcuic/PCUICConversion->pcuic/Typing/PCUICNamelessTyp + + + + + +pcuic/PCUICSafeLemmata->safechecker/PCUICWfEnv + + + + + +pcuic/PCUICCumulProp + +PCUICCumulProp + + + +pcuic/PCUICSafeLemmata->pcuic/PCUICCumulProp + + + + + +pcuic/PCUICSN + +PCUICSN + + + +pcuic/PCUICSafeLemmata->pcuic/PCUICSN + + + + + +pcuic/PCUICToTemplateCorrectness + +PCUICToTemplateCorrectness + + + +pcuic/PCUICSafeLemmata->pcuic/PCUICToTemplateCorrectness + + + + + +pcuic/PCUICCumulProp->pcuic/PCUICElimination + + + + + +pcuic/PCUICPrincipality + +PCUICPrincipality + + + +pcuic/PCUICCumulProp->pcuic/PCUICPrincipality + + + + + +pcuic/Syntax/PCUICOnFreeVars->pcuic/PCUICCumulativitySpec + + + + + +pcuic/utils/PCUICOnOne->pcuic/PCUICReduction + + + + + +pcuic/utils/PCUICOnOne->pcuic/Syntax/PCUICViews + + + + + +pcuic/utils/PCUICOnOne->pcuic/PCUICCumulativitySpec + + + + + +pcuic/Syntax/PCUICReflect + +PCUICReflect + + + +pcuic/Syntax/PCUICReflect->pcuic/Syntax/PCUICViews + + + + + +pcuic/Syntax/PCUICReflect->pcuic/PCUICEquality + + + + + +pcuic/Syntax/PCUICInstDef + +PCUICInstDef + + + +pcuic/Syntax/PCUICInstDef->pcuic/PCUICGuardCondition + + + + + +pcuic/Syntax/PCUICNamelessDef->pcuic/PCUICGuardCondition + + + + + +pcuic/PCUICValidity + +PCUICValidity + + + +pcuic/PCUICValidity->pcuic/PCUICInductiveInversion + + + + + +pcuic/PCUICInductives + +PCUICInductives + + + +pcuic/PCUICSpine->pcuic/PCUICInductives + + + + + +pcuic/PCUICInductives->pcuic/PCUICValidity + + + + + +template-coq/UnivSubst + +UnivSubst + + + +template-coq/UnivSubst->pcuic/PCUICNormal + + + + + +template-coq/WfAst + +WfAst + + + +template-coq/UnivSubst->template-coq/WfAst + + + + + +pcuic/PCUICParallelReduction->pcuic/PCUICParallelReductionConfluence + + + + + +pcuic/Syntax/PCUICDepth + +PCUICDepth + + + +pcuic/Syntax/PCUICDepth->pcuic/PCUICParallelReduction + + + + + +pcuic/PCUICPrincipality->safechecker/PCUICSafeConversion + + + + + +pcuic/PCUICPrincipality->erasure/EArities + + + + + +pcuic/PCUICPrincipality->pcuic/PCUICFirstorder + + + + + +pcuic/TemplateToPCUIC + +TemplateToPCUIC + + + +pcuic/PCUICProgram->pcuic/TemplateToPCUIC + + + + + +erasure/EProgram + +EProgram + + + +pcuic/PCUICProgram->erasure/EProgram + + + + + +pcuic/PCUICExpandLets + +PCUICExpandLets + + + +pcuic/PCUICProgram->pcuic/PCUICExpandLets + + + + + +template-coq/EnvMap + +EnvMap + + + +template-coq/EnvMap->safechecker/PCUICWfEnv + + + + + +template-coq/EnvMap->pcuic/PCUICProgram + + + + + +erasure/EWcbvEvalInd + +EWcbvEvalInd + + + +template-coq/EnvMap->erasure/EWcbvEvalInd + + + + + +erasure/EEnvMap + +EEnvMap + + + +template-coq/EnvMap->erasure/EEnvMap + + + + + +pcuic/Syntax/PCUICClosed->pcuic/PCUICReduction + + + + + +pcuic/Syntax/PCUICClosed->pcuic/Syntax/PCUICOnFreeVars + + + + + +pcuic/Syntax/PCUICPosition->pcuic/PCUICTyping + + + + + +pcuic/Syntax/PCUICPosition->pcuic/PCUICReduction + + + + + +pcuic/Syntax/PCUICTactics->pcuic/PCUICReduction + + + + + +erasure/EWellformed + +EWellformed + + + +pcuic/Syntax/PCUICTactics->erasure/EWellformed + + + + + +pcuic/PCUICSN->safechecker/PCUICWfReduction + + + + + +pcuic/PCUICSN->pcuic/PCUICFirstorder + + + + + +pcuic/Typing/PCUICContextConversionTyp->pcuic/PCUICSpine + + + + + +pcuic/Typing/PCUICInstTyp->pcuic/PCUICSubstitution + + + + + +pcuic/utils/PCUICUtils + +PCUICUtils + + + +pcuic/utils/PCUICUtils->pcuic/PCUICTyping + + + + + +pcuic/utils/PCUICAstUtils + +PCUICAstUtils + + + +pcuic/utils/PCUICAstUtils->pcuic/PCUICWeakeningEnv + + + + + +pcuic/Syntax/PCUICCases + +PCUICCases + + + +pcuic/utils/PCUICAstUtils->pcuic/Syntax/PCUICCases + + + + + +pcuic/utils/PCUICPretty + +PCUICPretty + + + +pcuic/utils/PCUICAstUtils->pcuic/utils/PCUICPretty + + + + + +template-coq/utils/LibHypsNaming + +LibHypsNaming + + + +template-coq/utils/LibHypsNaming->pcuic/PCUICWeakeningEnv + + + + + +pcuic/Syntax/PCUICInduction + +PCUICInduction + + + +template-coq/utils/LibHypsNaming->pcuic/Syntax/PCUICInduction + + + + + +pcuic/Syntax/PCUICCases->pcuic/Syntax/PCUICInduction + + + + + +pcuic/PCUICToTemplate + +PCUICToTemplate + + + +pcuic/Syntax/PCUICCases->pcuic/PCUICToTemplate + + + + + +pcuic/Syntax/PCUICUnivSubst + +PCUICUnivSubst + + + +pcuic/Syntax/PCUICUnivSubst->pcuic/Syntax/PCUICClosed + + + + + +pcuic/Syntax/PCUICInduction->pcuic/Syntax/PCUICLiftSubst + + + + + +pcuic/Syntax/PCUICInduction->pcuic/Syntax/PCUICReflect + + + + + +pcuic/Syntax/PCUICInduction->pcuic/Syntax/PCUICDepth + + + + + +pcuic/Syntax/PCUICInduction->pcuic/Syntax/PCUICUnivSubst + + + + + +pcuic/Syntax/PCUICRenameDef->pcuic/Syntax/PCUICInstDef + + + + + +template-coq/utils/MCPred + +MCPred + + + +template-coq/utils/MCPred->pcuic/Syntax/PCUICOnFreeVars + + + + + +pcuic/TemplateToPCUIC->safechecker/SafeTemplateChecker + + + + + +pcuic/TemplateToPCUIC->pcuic/PCUICEtaExpand + + + + + +pcuic/TemplateToPCUIC->pcuic/TemplateToPCUICCorrectness + + + + + +template-coq/TemplateProgram + +TemplateProgram + + + +template-coq/TemplateProgram->pcuic/TemplateToPCUIC + + + + + +template-coq/Extraction + +Extraction + + + +template-coq/TemplateProgram->template-coq/Extraction + + + + + +pcuic/Typing/PCUICWeakeningEnvTyp->pcuic/Typing/PCUICClosedTyp + + + + + +pcuic/Typing/PCUICWeakeningEnvTyp->pcuic/Typing/PCUICUnivSubstitutionTyp + + + + + +pcuic/Typing/PCUICRenameTyp->pcuic/Typing/PCUICWeakeningTyp + + + + + +pcuic/utils/PCUICSize->pcuic/utils/PCUICAstUtils + + + + + +erasure/EInduction + +EInduction + + + +pcuic/utils/PCUICSize->erasure/EInduction + + + + + +template-coq/common/uGraph + +uGraph + + + +template-coq/common/uGraph->template-coq/EnvMap + + + + + +template-coq/common/uGraph->pcuic/utils/PCUICAstUtils + + + + + +template-coq/EtaExpand + +EtaExpand + + + +template-coq/common/uGraph->template-coq/EtaExpand + + + + + +template-coq/Constants + +Constants + + + +template-coq/common/uGraph->template-coq/Constants + + + + + +template-coq/Checker + +Checker + + + +template-coq/common/uGraph->template-coq/Checker + + + + + +pcuic/utils/PCUICPretty->safechecker/PCUICWfReduction + + + + + +pcuic/utils/PCUICPretty->safechecker/PCUICErrors + + + + + +template-coq/EnvironmentTyping + +EnvironmentTyping + + + +template-coq/EnvironmentTyping->pcuic/utils/PCUICPrimitive + + + + + +template-coq/Ast + +Ast + + + +template-coq/EnvironmentTyping->template-coq/Ast + + + + + +template-coq/Reflect + +Reflect + + + +template-coq/Reflect->pcuic/utils/PCUICPrimitive + + + + + +template-coq/Reflect->template-coq/EnvMap + + + + + +template-coq/ReflectAst + +ReflectAst + + + +template-coq/Reflect->template-coq/ReflectAst + + + + + +template-coq/TermEquality + +TermEquality + + + +template-coq/Reflect->template-coq/TermEquality + + + + + +template-coq/config + +config + + + +template-coq/config->pcuic/utils/PCUICUtils + + + + + +template-coq/Universes + +Universes + + + +template-coq/config->template-coq/Universes + + + + + +template-coq/utils + +utils + + + +template-coq/utils->pcuic/utils/PCUICUtils + + + + + +template-coq/Kernames + +Kernames + + + +template-coq/utils->template-coq/Kernames + + + + + +template-coq/Transform + +Transform + + + +template-coq/utils->template-coq/Transform + + + + + +template-coq/AstUtils + +AstUtils + + + +template-coq/Ast->template-coq/AstUtils + + + + + +template-coq/TemplateMonad/Common + +Common + + + +template-coq/Ast->template-coq/TemplateMonad/Common + + + + + +template-coq/Induction + +Induction + + + +template-coq/AstUtils->template-coq/Induction + + + + + +template-coq/TemplateMonad/Extractable + +Extractable + + + +template-coq/AstUtils->template-coq/TemplateMonad/Extractable + + + + + +template-coq/TemplateMonad/Core + +Core + + + +template-coq/AstUtils->template-coq/TemplateMonad/Core + + + + + +template-coq/AstUtils->pcuic/PCUICToTemplate + + + + + +template-coq/BasicAst + +BasicAst + + + +template-coq/Kernames->template-coq/BasicAst + + + + + +template-coq/BasicAst->template-coq/Universes + + + + + +template-coq/utils/canonicaltries/CanonicalTries + +CanonicalTries + + + +template-coq/utils/canonicaltries/CanonicalTries->template-coq/EnvMap + + + + + +template-coq/Universes->template-coq/common/uGraph + + + + + +template-coq/Universes->template-coq/Reflect + + + + + +template-coq/Environment + +Environment + + + +template-coq/Universes->template-coq/Environment + + + + + +erasure/EAst + +EAst + + + +template-coq/Universes->erasure/EAst + + + + + +template-coq/Environment->template-coq/EnvironmentTyping + + + + + +template-coq/Typing + +Typing + + + +template-coq/Typing->template-coq/EtaExpand + + + + + +template-coq/TypingWf + +TypingWf + + + +template-coq/Typing->template-coq/TypingWf + + + + + +template-coq/Typing->template-coq/Checker + + + + + +template-coq/Normal + +Normal + + + +template-coq/Typing->template-coq/Normal + + + + + +template-coq/Reduction + +Reduction + + + +template-coq/Typing->template-coq/Reduction + + + + + +template-coq/EtaExpand->template-coq/TemplateProgram + + + + + +template-coq/Induction->template-coq/UnivSubst + + + + + +template-coq/Induction->template-coq/ReflectAst + + + + + +template-coq/Induction->template-coq/TermEquality + + + + + +template-coq/LiftSubst + +LiftSubst + + + +template-coq/WfAst->template-coq/LiftSubst + + + + + +template-coq/LiftSubst->template-coq/Typing + + + + + +template-coq/Pretty + +Pretty + + + +template-coq/LiftSubst->template-coq/Pretty + + + + + +template-coq/ReflectAst->template-coq/Typing + + + + + +template-coq/Transform->template-coq/TemplateProgram + + + + + +template-coq/Transform->erasure/EProgram + + + + + +template-coq/WcbvEval + +WcbvEval + + + +template-coq/WcbvEval->template-coq/TemplateProgram + + + + + +template-coq/TermEquality->template-coq/Typing + + + + + +template-coq/TypingWf->template-coq/WcbvEval + + + + + +template-coq/TypingWf->pcuic/PCUICToTemplateCorrectness + + + + + +template-coq/utils/wGraph + +wGraph + + + +template-coq/utils/wGraph->template-coq/common/uGraph + + + + + +template-coq/utils/All_Forall + +All_Forall + + + +template-coq/monad_utils + +monad_utils + + + +template-coq/utils/All_Forall->template-coq/monad_utils + + + + + +template-coq/utils/MCUtils + +MCUtils + + + +template-coq/utils/All_Forall->template-coq/utils/MCUtils + + + + + +template-coq/monad_utils->template-coq/utils + + + + + +template-coq/utils/MCUtils->template-coq/utils + + + + + +template-coq/utils/MCUtils->template-coq/utils/wGraph + + + + + +template-coq/utils/MCOption + +MCOption + + + +template-coq/utils/MCOption->template-coq/utils/MCPred + + + + + +template-coq/utils/MCOption->template-coq/utils/All_Forall + + + + + +template-coq/utils/MCSquash + +MCSquash + + + +template-coq/utils/MCSquash->template-coq/utils/All_Forall + + + + + +template-coq/utils/ByteCompare + +ByteCompare + + + +template-coq/utils/ByteCompareSpec + +ByteCompareSpec + + + +template-coq/utils/ByteCompare->template-coq/utils/ByteCompareSpec + + + + + +template-coq/utils/bytestring + +bytestring + + + +template-coq/utils/ByteCompareSpec->template-coq/utils/bytestring + + + + + +template-coq/utils/MCCompare + +MCCompare + + + +template-coq/utils/MCCompare->template-coq/utils/ByteCompareSpec + + + + + +template-coq/utils/ReflectEq + +ReflectEq + + + +template-coq/utils/ReflectEq->template-coq/utils/ByteCompareSpec + + + + + +template-coq/utils/MCList + +MCList + + + +template-coq/utils/ReflectEq->template-coq/utils/MCList + + + + + +template-coq/utils/MCPrelude + +MCPrelude + + + +template-coq/utils/MCPrelude->template-coq/utils/MCList + + + + + +template-coq/utils/MCReflect + +MCReflect + + + +template-coq/utils/MCPrelude->template-coq/utils/MCReflect + + + + + +template-coq/utils/MCList->template-coq/utils/MCOption + + + + + +template-coq/utils/MCRelations + +MCRelations + + + +template-coq/utils/MCRelations->template-coq/utils/MCList + + + + + +template-coq/utils/MCProd + +MCProd + + + +template-coq/utils/MCProd->template-coq/utils/MCOption + + + + + +template-coq/utils/MCReflect->template-coq/utils/MCOption + + + + + +template-coq/utils/MCString + +MCString + + + +template-coq/utils/bytestring->template-coq/utils/MCString + + + + + +template-coq/utils/MCString->template-coq/utils/MCUtils + + + + + +template-coq/utils/MCArith + +MCArith + + + +template-coq/utils/MCArith->template-coq/utils/MCUtils + + + + + +template-coq/utils/MCEquality + +MCEquality + + + +template-coq/utils/MCEquality->template-coq/utils/MCUtils + + + + + +template-coq/utils/canonicaltries/String2pos + +String2pos + + + +template-coq/utils/canonicaltries/String2pos->template-coq/utils/canonicaltries/CanonicalTries + + + + + +template-coq/utils/MC_ExtrOCamlZPosInt + +MC_ExtrOCamlZPosInt + + + +template-coq/utils/MC_ExtrOCamlZPosInt->safechecker/Extraction + + + + + +template-coq/utils/MC_ExtrOCamlZPosInt->template-coq/Extraction + + + + + +template-coq/TemplateMonad/Extractable->template-coq/Extraction + + + + + +template-coq/TemplateMonad/Extractable->template-coq/Constants + + + + + +template-coq/TemplateMonad + +TemplateMonad + + + +template-coq/TemplateMonad/Core->template-coq/TemplateMonad + + + + + +template-coq/TemplateMonad/Common->template-coq/TemplateMonad/Extractable + + + + + +template-coq/TemplateMonad/Common->template-coq/TemplateMonad/Core + + + + + +template-coq/TemplateMonad->template-coq/Constants + + + + + +template-coq/Reduction->pcuic/PCUICToTemplateCorrectness + + + + + +template-coq/Pretty->template-coq/Extraction + + + + + +erasure/ETransform + +ETransform + + + +template-coq/Pretty->erasure/ETransform + + + + + +erasure/Erasure + +Erasure + + + +erasure/Extraction + +Extraction + + + +erasure/Erasure->erasure/Extraction + + + + + +erasure/EConstructorsAsBlocks + +EConstructorsAsBlocks + + + +erasure/EConstructorsAsBlocks->erasure/ETransform + + + + + +erasure/ETransform->erasure/Erasure + + + + + +erasure/EInlineProjections + +EInlineProjections + + + +erasure/EInlineProjections->erasure/ETransform + + + + + +erasure/ERemoveParams + +ERemoveParams + + + +erasure/ERemoveParams->erasure/ETransform + + + + + +erasure/EEtaExpandedFix + +EEtaExpandedFix + + + +erasure/EProgram->erasure/EEtaExpandedFix + + + + + +erasure/EEtaExpanded + +EEtaExpanded + + + +erasure/EEtaExpanded->erasure/EInlineProjections + + + + + +erasure/EEtaExpanded->erasure/EOptimizePropDiscr + + + + + +erasure/EWcbvEvalEtaInd + +EWcbvEvalEtaInd + + + +erasure/EEtaExpanded->erasure/EWcbvEvalEtaInd + + + + + +erasure/EEtaExpandedFix->erasure/EEtaExpanded + + + + + +erasure/ErasureCorrectness + +ErasureCorrectness + + + +erasure/EEtaExpandedFix->erasure/ErasureCorrectness + + + + + +erasure/EOptimizePropDiscr->erasure/ETransform + + + + + +erasure/EExtends + +EExtends + + + +erasure/EExtends->erasure/EEtaExpandedFix + + + + + +erasure/EDeps + +EDeps + + + +erasure/EExtends->erasure/EDeps + + + + + +erasure/ErasureFunction->erasure/ETransform + + + + + +erasure/ErasureCorrectness->erasure/ErasureFunction + + + + + +erasure/ErasureProperties + +ErasureProperties + + + +erasure/ErasureProperties->erasure/ErasureCorrectness + + + + + +erasure/EArities->erasure/EInlineProjections + + + + + +erasure/EArities->erasure/ERemoveParams + + + + + +erasure/EArities->erasure/Prelim + + + + + +erasure/EGenericMapEnv + +erasure/EGenericMapEnv + + + +erasure/EArities->erasure/EGenericMapEnv + + + + + +erasure/ESubstitution + +ESubstitution + + + +erasure/ESubstitution->erasure/EDeps + + + + + +erasure/Prelim->erasure/ESubstitution + + + + + +erasure/EDeps->erasure/EOptimizePropDiscr + + + + + +erasure/EDeps->erasure/ErasureProperties + + + + + +erasure/Extract->erasure/EArities + + + + + +erasure/EWcbvEvalEtaInd->erasure/ERemoveParams + + + + + +erasure/EWcbvEvalEtaInd->erasure/EGenericMapEnv + + + + + +erasure/EWcbvEvalInd->erasure/EEtaExpandedFix + + + + + +erasure/EEnvMap->erasure/EProgram + + + + + +erasure/EWellformed->erasure/EExtends + + + + + +erasure/EWellformed->erasure/EWcbvEval + + + + + +erasure/EGlobalEnv + +EGlobalEnv + + + +erasure/EGlobalEnv->erasure/Extract + + + + + +erasure/EGlobalEnv->erasure/EEnvMap + + + + + +erasure/EGlobalEnv->erasure/EWellformed + + + + + +erasure/EPretty + +EPretty + + + +erasure/EGlobalEnv->erasure/EPretty + + + + + +erasure/EWcbvEval->erasure/EProgram + + + + + +erasure/EWcbvEval->erasure/Prelim + + + + + +erasure/EWcbvEval->erasure/EWcbvEvalInd + + + + + +erasure/ECSubst + +ECSubst + + + +erasure/ECSubst->erasure/EGlobalEnv + + + + + +erasure/EPretty->erasure/EProgram + + + + + +erasure/ESpineView + +ESpineView + + + +erasure/ESpineView->erasure/EEtaExpandedFix + + + + + +erasure/EReflect + +EReflect + + + +erasure/EReflect->erasure/EGlobalEnv + + + + + +erasure/EReflect->erasure/ESpineView + + + + + +erasure/ELiftSubst + +ELiftSubst + + + +erasure/ELiftSubst->erasure/ECSubst + + + + + +erasure/EInduction->erasure/EReflect + + + + + +erasure/EInduction->erasure/ELiftSubst + + + + + +erasure/EAstUtils + +EAstUtils + + + +erasure/EAstUtils->erasure/EInduction + + + + + +erasure/EAst->erasure/EAstUtils + + + + + +pcuic/PCUICEtaExpand->erasure/ErasureCorrectness + + + + + +pcuic/PCUICEtaExpand->pcuic/PCUICExpandLetsCorrectness + + + + + +pcuic/TemplateToPCUICExpanded + +TemplateToPCUICExpanded + + + +pcuic/PCUICEtaExpand->pcuic/TemplateToPCUICExpanded + + + + + +pcuic/PCUICExpandLets->pcuic/PCUICExpandLetsCorrectness + + + + + +pcuic/PCUICTransform + +PCUICTransform + + + +pcuic/PCUICExpandLetsCorrectness->pcuic/PCUICTransform + + + + + +pcuic/PCUICProgress + +PCUICProgress + + + +pcuic/PCUICFirstorder->pcuic/PCUICProgress + + + + + +pcuic/PCUICProgress->erasure/ErasureFunction + + + + + +pcuic/PCUICTransform->erasure/ETransform + + + + + +pcuic/TemplateToPCUICExpanded->pcuic/PCUICTransform + + + + + +pcuic/TemplateToPCUICWcbvEval->pcuic/PCUICTransform + + + + + +pcuic/TemplateToPCUICCorrectness->pcuic/TemplateToPCUICExpanded + + + + + +pcuic/TemplateToPCUICCorrectness->pcuic/TemplateToPCUICWcbvEval + + + + + +erasure/EGenericMapEnv->erasure/EConstructorsAsBlocks + + + + + +pcuic/PCUICToTemplate->pcuic/PCUICToTemplateCorrectness + + + + + +pcuic/Conversion/PCUICNamelessConv->pcuic/Typing/PCUICNamelessTyp + + + + + diff --git a/dependency-graph/generate-depgraph.sh b/dependency-graph/generate-depgraph.sh index e8e61731d..66b2addba 100755 --- a/dependency-graph/generate-depgraph.sh +++ b/dependency-graph/generate-depgraph.sh @@ -21,7 +21,6 @@ dot_file=$filename.dot # Associative arrays of the folders together with a color declare -A folders folders[template-coq]=aquamarine -folders[checker]=seagreen3 folders[pcuic]=lemonchiffon1 folders[safechecker]=paleturquoise1 folders[erasure]=tan @@ -33,6 +32,7 @@ for folder in "${!folders[@]}" do cd ../$folder echo `pwd` + # WARNING: coqdep <= 8.11 only supports -dumpgraph coqdep -f _CoqProject -dumpgraph ../dependency-graph/$folder.dot > /dev/null cd ../dependency-graph # remove the first and last lines From d921719aaee8373fa647e0bcb8d2a878e26e3384 Mon Sep 17 00:00:00 2001 From: Matthieu Sozeau Date: Fri, 1 Jul 2022 11:32:02 +0200 Subject: [PATCH 15/43] Point to 8.14 branch in README --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b8f9274fc..827c22e03 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ MetaCoq