OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Comparer les révisions

Ignorer les espaces blanc Révision 143 → Révision 144

/trunk/OpenConcerto/Configuration/Template/Default/Avoir.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/CommandeClient.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
Nouveau fichier
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/ExportArticle.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/ExportArticle.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ExportArticle.xml (revision 144)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<contentDocument>
+
+ <table firstLine="2" endLine="10000" endPageLine="10000" lastColumn="AK">
+ <element location="A" type="fill" controleMultiline="false">
+ <field base="Societe" name="CODE"/>
+ </element>
+ <element location="C" type="fill" controleMultiline="false">
+ <field base="Societe" name="NOM"/>
+ </element>
+ <element location="I" type="fill">
+ <field base="Societe" name="FOURNISSEUR"/>
+ </element>
+ <element location="P" type="fill">
+ <field base="Societe" name="QTE_ACHAT"/>
+ </element>
+ <element location="Q" type="fill">
+ <field base="Societe" name="QTE_MIN"/>
+ </element>
+ <element location="R" type="fill">
+ <field base="Societe" name="PA_HT"/>
+ </element>
+ <element location="T" type="fill">
+ <field base="Societe" name="PV_HT"/>
+ </element>
+ <element location="AF" type="fill">
+ <field base="Societe" name="POIDS"/>
+ </element>
+
+ <element location="AG" type="fill">
+ <field base="Societe" name="FAMILLE"/>
+ </element>
+
+ <element location="AJ" type="fill">
+ <field base="Societe" name="PAYS"/>
+ </element>
+ <element location="AK" type="fill">
+ <field base="Societe" name="CODE_DOUANIER"/>
+ </element>
+
+ </table>
+
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/EtatStocks.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/EtatStocks.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/EtatStocks.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">57</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/BonLivraison.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml (revision 144)
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="B1" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="TYPE" />
+ <field base="Common" table="SOCIETE_COMMON" name="NOM" />
+ </element>
+
+ <element location="B2" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
+ <field base="Common" name="RUE" />
+ <field base="Common" name="VILLE" type="villeCP" />
+ <field base="Common" name="VILLE" type="ville" />
+ </field>
+ </element>
+
+ <element location="D7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUMERO_URSSAF" />
+ </element>
+
+ <element location="G7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" />
+ </element>
+
+ <element location="J7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_APE" />
+ </element>
+
+ <element location="B5" type="replace" replacePattern="_">
+ <field name="ID_SALARIE">
+ <field name="CODE"/>
+ </field>
+ </element>
+
+ <element location="E5" type="replace" replacePattern="_" cellSize="75">
+ <field name="ID_SALARIE">
+ <field name="ID_INFOS_SALARIE_PAYE">
+ <field name="ID_CONTRAT_SALARIE">
+ <field name="NATURE" cellSize="75"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+
+ <element location="G2" type="fill">
+ <field name="DU" prefix="Paie du " type="date" datePattern="dd/MM/yy"/>
+ <field name="AU" prefix=" au " type="date" datePattern="dd/MM/yy"/>
+ </element>
+
+ <element location="D54" type="fill">
+ <field name="DU" type="datePaye" />
+ </element>
+
+ <element location="G9" type="fill">
+ <field name="ID_SALARIE">
+ <field name="PRENOM"/>
+ <field name="NOM"/>
+ </field>
+ </element>
+ <element location="G10" type="fill">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="ID_ADRESSE">
+ <field name="RUE"/>
+ </field>
+ </field>
+ </field>
+ </element>
+ <element location="G12" type="fill">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="ID_ADRESSE">
+ <field name="CODE_POSTAL"/>
+ <field name="VILLE"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+ <element location="D12" type="fill">
+ <field name="ID_VARIABLE_SALARIE">
+ <field name="CONGES_PRIS"/>
+ </field>
+ </element>
+ <element location="E12" type="fill">
+ <field name="ID_CUMULS_CONGES">
+ <field name="RESTANT"/>
+ </field>
+ </element>
+ <element location="F12" type="fill">
+ <field name="ID_CUMULS_CONGES">
+ <field name="ACQUIS"/>
+ </field>
+ </element>
+ <element location="B6" type="replace" replacePattern="_">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="NUMERO_SS"/>
+ </field>
+ </field>
+ </element>
+
+ <element location="B3" type="fill" >
+ <field name="ID_SALARIE">
+ <field name="ID_INFOS_SALARIE_PAYE">
+ <field name="ID_IDCC">
+ <field name="NOM" prefix="Convention collective : " cellSize="125"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+ <element location="B9" type="fill">
+ <field name="DETAILS_CONGES"/>
+ </element>
+
+ <element location="H52" type="fill">
+ <field name="COT_SAL"/>
+ </element>
+ <element location="I52" type="fill">
+ <field name="COT_PAT"/>
+ </element>
+
+
+ <element location="I54" type="fill">
+ <field name="NET_A_PAYER"/>
+ </element>
+
+ <element location="D57" type="fill">
+ <field name="SAL_BRUT"/>
+ </element>
+ <element location="E57" type="fill">
+ <field name="COT_SAL"/>
+ </element>
+ <element location="F57" type="fill">
+ <field name="COT_PAT"/>
+ </element>
+
+ <element location="G57" type="fill">
+ <field name="AVANTAGE_NATURE"/>
+ </element>
+
+ <element location="H57" type="fill">
+ <field name="NET_IMP"/>
+ </element>
+
+ <element location="I57" type="fill">
+ <field name="ALLEGEMENT_COTISATION"/>
+ </element>
+
+ <element location="D58" type="fill">
+ <field name="SAL_BRUT" type="cumulPaye"/>
+ </element>
+ <element location="E58" type="fill">
+ <field name="COT_SAL" type="cumulPaye"/>
+ </element>
+ <element location="F58" type="fill">
+ <field name="COT_PAT" type="cumulPaye"/>
+ </element>
+ <element location="G58" type="fill">
+ <field name="AVANTAGE_NATURE" type="cumulPaye"/>
+ </element>
+
+ <element location="H58" type="fill">
+ <field name="NET_IMP" type="cumulPaye"/>
+ </element>
+
+ <element location="I58" type="fill">
+ <field name="ALLEGEMENT_COTISATION" type="cumulPaye"/>
+ </element>
+
+ <table endPageLine="60" firstLine="15" endLine="51" lastColumn="J" base="Societe" table="FICHE_PAYE_ELEMENT"
+ blankLineBeforeStyle="Titre 1,Titre 2" fieldWhere="IMPRESSION" orderBy="POSITION">
+ <element location="B" type="fill" cellSize="52">
+ <field name="NOM" />
+ </element>
+ <element location="E" type="fill">
+ <field name="NB_BASE" />
+ </element>
+ <element location="F" type="fill">
+ <field name="TAUX_SAL" />
+ </element>
+ <element location="G" type="fill">
+ <field name="MONTANT_SAL_AJ" />
+ </element>
+ <element location="H" type="fill">
+ <field name="MONTANT_SAL_DED" />
+ </element>
+ <!-- <element location="I" type="fill">
+ <field name="TAUX_PAT" type="Devise" />
+ </element> -->
+ <element location="J" type="fill">
+ <field name="MONTANT_PAT" />
+ </element>
+
+
+ </table>
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/ExportArticle.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/ExportArticle.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/ExportArticle.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ExportArticle.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/ExportArticle.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/DIPE.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/DIPE.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DIPE.xml (revision 144)
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element0 location="C1" type="Value" ValueName="SOCIETE">
+ </element0>
+
+ <element0 location="C2" type="Value" ValueName="TELEPHONE">
+ </element0>
+
+ <element0 location="A5" type="Value" ValueName="LIBELLE">
+ </element0>
+
+
+ <element0 location="E16" type="Value" ValueName="BASE" />
+ <element0 location="F16" type="Value" ValueName="ANCIENNETE" />
+ <element0 location="G16" type="Value" ValueName="TRANSPORT" />
+ <element0 location="H16" type="Value" ValueName="BRUT" />
+ <element0 location="I16" type="Value" ValueName="TAXE" />
+ <element0 location="J16" type="Value" ValueName="IRPP" />
+ <element0 location="K16" type="Value" ValueName="CAC" />
+ <element0 location="L16" type="Value" ValueName="CCF" />
+ <element0 location="M16" type="Value" ValueName="TDL" />
+ <element0 location="N16" type="Value" ValueName="RAV" />
+ <element0 location="O16" type="Value" ValueName="PV" />
+ <element0 location="P16" type="Value" ValueName="TOTAL_RETENU" />
+ <element0 location="Q16" type="Value" ValueName="NET" />
+
+
+
+ <element0 location="A30" type="Value" ValueName="NUMERO_EMPLOYEUR">
+ </element0>
+
+ <element0 location="I30" type="Value" ValueName="NUMERO_IDENTIFIANT_UNIQUE">
+ </element0>
+
+ <element0 location="E21" type="Value" ValueName="BASE_PENSION_FAM">
+ </element0>
+
+ <element0 location="H21" type="Value" ValueName="MONTANT_PENSION_FAM">
+ </element0>
+
+ <element0 location="E23" type="Value" ValueName="BASE_PENSION_VIEL">
+ </element0>
+
+ <element0 location="H23" type="Value" ValueName="MONTANT_PENSION_VIEL">
+ </element0>
+
+ <element0 location="E25" type="Value" ValueName="BASE_AT">
+ </element0>
+
+ <element0 location="H25" type="Value" ValueName="MONTANT_AT">
+ </element0>
+
+ <element0 location="H26" type="Value" ValueName="TOTAL_COT">
+ </element0>
+
+ <element0 location="O21" type="Value" ValueName="BASE_CCF">
+ </element0>
+
+ <element0 location="Q21" type="Value" ValueName="MONTANT_CCF">
+ </element0>
+
+ <element0 location="O23" type="Value" ValueName="BASE_FNE">
+ </element0>
+
+ <element0 location="Q23" type="Value" ValueName="MONTANT_FNE">
+ </element0>
+
+ <element0 location="Q26" type="Value" ValueName="TOTAL_FISCAL">
+ </element0>
+
+ <element0 location="H31" type="Value" ValueName="COT_PAT">
+ </element0>
+
+ <element0 location="H33" type="Value" ValueName="COT_SAL">
+ </element0>
+ <element0 location="H34" type="Value" ValueName="COT_TOTAL">
+ </element0>
+
+ <element0 location="Q31" type="Value" ValueName="TAX_PAT">
+ </element0>
+
+ <element0 location="Q33" type="Value" ValueName="TAX_SAL">
+ </element0>
+ <element0 location="Q34" type="Value" ValueName="TAX_TOTAL">
+ </element0>
+
+ <table0 firstLine="11" endLine="16" endPageLine="36" lastColumn="Q" table="ECRITURE" pageRef="P8">
+ <element location="A" type="fill">
+ <field name="NUMERO" />
+ </element>
+
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="C" type="fill">
+ <field name="CNPS" />
+ </element>
+
+ <element location="D" type="fill">
+ <field name="INTERNE" />
+ </element>
+
+ <element location="E" type="fill">
+ <field name="BASE" />
+ </element>
+
+ <element location="F" type="fill">
+ <field name="ANCIENNETE" />
+ </element>
+
+ <element location="G" type="fill">
+ <field name="TRANSPORT" />
+ </element>
+
+ <element location="H" type="fill">
+ <field name="BRUT" />
+ </element>
+
+ <element location="I" type="fill">
+ <field name="TAXE" />
+ </element>
+
+ <element location="J" type="fill">
+ <field name="IRPP" />
+ </element>
+ <element location="K" type="fill">
+ <field name="CAC" />
+ </element>
+ <element location="L" type="fill">
+ <field name="CCF" />
+ </element>
+ <element location="M" type="fill">
+ <field name="TDL" />
+ </element>
+ <element location="N" type="fill">
+ <field name="RAV" />
+ </element>
+ <element location="O" type="fill">
+ <field name="PV" />
+ </element>
+ <element location="P" type="fill">
+ <field name="TOTAL_RETENU" />
+ </element>
+ <element location="Q" type="fill">
+ <field name="NET" />
+ </element>
+
+ </table0>
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/DemandePrix.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/DemandePrix.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DemandePrix.xml (revision 144)
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="B1" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="TYPE" />
+ <field base="Common" table="SOCIETE_COMMON" name="NOM" />
+ </element>
+
+ <element location="B2" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
+ <field base="Common" table="ADRESSE_COMMON" name="RUE" />
+ </field>
+ </element>
+
+ <element location="B3" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
+ <field base="Common" table="ADRESSE_COMMON" name="VILLE" type="villeCP" />
+ <field base="Common" table="ADRESSE_COMMON" name="VILLE" type="ville" />
+ <field base="Common" table="ADRESSE_COMMON" name="CEDEX" prefix="CEDEX " conditionField="HAS_CEDEX" />
+ </field>
+ </element>
+
+ <element location="B5" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="TYPE"/>
+ <field base="Common" table="SOCIETE_COMMON" name="CAPITAL" prefix=" au capital de " suffix="€"/>
+ </element>
+
+ <element location="B6" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
+ </element>
+
+ <element location="B7" type="replace" replacePattern="_">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_NII" />
+ </element>
+
+ <element location="B8" type="replace" replacePattern="_">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_TEL" />
+ </element>
+
+ <element location="B9" type="replace" replacePattern="_">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_FAX" />
+ </element>
+
+ <element location="B10" type="replace" replacePattern="_">
+ <field base="Common" table="SOCIETE_COMMON" name="MAIL" />
+ </element>
+
+
+ <element location="B16" type="fill">
+ <field name="ID_COMMERCIAL">
+ <field name="NOM" />
+ </field>
+ </element>
+
+ <element location="B13" type="fill">
+ <field name="NUMERO" />
+ </element>
+
+ <element location="C13" type="fill">
+ <field name="DATE" />
+ </element>
+
+
+
+
+ <element location="H10" type="fill">
+ <field name="ID_FOURNISSEUR">
+ <field name="TYPE" />
+ <field name="NOM" />
+ </field>
+ </element>
+
+ <element location="H11" type="fill">
+ <field name="ID_FOURNISSEUR">
+ <field name="ID_ADRESSE">
+ <field name="RUE" />
+ </field>
+ </field>
+ </element>
+
+ <element location="H13" type="fill">
+ <field name="ID_FOURNISSEUR">
+ <field name="ID_ADRESSE">
+ <field name="VILLE" type="villeCP" />
+ <field name="VILLE" type="ville" />
+ <field name="CEDEX" prefix="CEDEX " conditionField="HAS_CEDEX" />
+ </field>
+ </field>
+ </element>
+
+
+ <table endPageLine="57" firstLine="22" endLine="52" lastColumn="L" table="DEMANDE_PRIX_ELEMENT">
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="K" type="fill">
+ <field name="QTE" />
+ </element>
+
+
+ <element location="L" type="fill">
+ <field name="T_POIDS" />
+ </element>
+
+ </table>
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml (revision 144)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<contentDocument>
+
+
+ <element0 location="B2" type="Value" ValueName="PERIODE">
+ </element0>
+
+ <element0 location="C49" type="Value" ValueName="TOTAL_QTE">
+ </element0>
+
+ <element0 location="D49" type="Value" ValueName="TOTAL">
+ </element0>
+
+
+ <table firstLine="4" blankLineBeforeStyle="Titre 1,Titre 2" endLine="1999" endPageLine="2000" lastColumn="J" base="Societe" table="AFFAIRE" sheet="1">
+
+ <element location="A" type="fill">
+ <field base="Societe" name="CODE"/>
+ </element>
+
+<element location="B" type="fill">
+ <field base="Societe" name="NOM"/>
+ </element>
+<element location="C" type="fill">
+ <field base="Societe" name="QTE"/>
+ </element>
+
+ <element location="D" type="fill" >
+ <field base="Societe" name="TOTAL_ECO"/>
+ </element>
+
+ </table>
+
+
+
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">57</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/DIPE.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/DIPE.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/DIPE.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DIPE.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/DIPE.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">60</sheet>
+</spliteveryrow>
+<offset x="20" y ="20"/>
+<resize percent="92"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/BonReception.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.xml (revision 144)
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<contentDocument>
+
+
+ <element0 location="B2" type="Value" ValueName="PERIODE">
+ </element0>
+
+ <element0 location="C49" type="Value" ValueName="TOTAL_QTE">
+ </element0>
+
+ <element0 location="D49" type="Value" ValueName="TOTAL_BASE">
+ </element0>
+
+ <element0 location="E49" type="Value" ValueName="TOTAL_TAXE">
+ </element0>
+
+ <table firstLine="4" blankLineBeforeStyle="Titre 1,Titre 2" endLine="1999" endPageLine="2000" lastColumn="J" base="Societe" table="AFFAIRE" sheet="1">
+
+ <element location="A" type="fill">
+ <field base="Societe" name="CODE"/>
+ </element>
+
+<element location="B" type="fill">
+ <field base="Societe" name="NOM"/>
+ </element>
+<element location="C" type="fill">
+ <field base="Societe" name="QTE"/>
+ </element>
+
+ <element location="D" type="fill" >
+ <field base="Societe" name="TOTAL_BASE"/>
+ </element>
+
+
+ <element location="E" type="fill" >
+ <field base="Societe" name="TOTAL_TAXE"/>
+ </element>
+ </table>
+
+
+
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/DemandePrix.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/DemandePrix.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/DemandePrix.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DemandePrix.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/DemandePrix.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/VenteFacture.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/VenteFacture.xml (revision 143)
+++ OpenConcerto/Configuration/Template/Default/VenteFacture.xml (revision 144)
@@ -76,6 +76,8 @@
<element location="H11" type="address.customer.invoice.full">
</element>
+
+
<element location="L62" type="fill">
<field name="T_HT" type="devise" />
</element>
/trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.xml
Nouveau fichier
0,0 → 1,30
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
<element location="A1" type="Value" ValueName="NOM">
</element>
 
<element location="A3" type="Value" ValueName="DATE">
</element>
 
<table firstLine="6" endLine="57" endPageLine="57" lastColumn="E" table="SAISIE_VENTE_FACTURE">
<element location="A" type="fill">
<field name="CODE" />
</element>
 
<element location="B" type="fill">
<field name="NOM" />
</element>
<element location="C" type="fill">
<field name="QTE" />
</element>
 
<element location="D" type="fill">
<field name="TOTAL_HT" />
</element>
 
<element location="E" type="fill">
<field name="TOTAL_TTC" />
</element>
</table>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/Devis.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.ods
Nouveau fichier
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/DemandePrix.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/DemandePrix.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DemandePrix.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">58</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">49</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/AvoirF.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/VenteFacture.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingVentes.ods (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingVentes.ods (revision 144)
/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: OpenConcerto/Configuration/Template/Default/FactureFournisseur.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: OpenConcerto/Configuration/Template/Default/EtatStocks.xml
===================================================================
--- OpenConcerto/Configuration/Template/Default/EtatStocks.xml (revision 0)
+++ OpenConcerto/Configuration/Template/Default/EtatStocks.xml (revision 144)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="A3" type="Value" ValueName="DATE">
+ </element>
+
+ <table firstLine="6" endLine="57" endPageLine="57" lastColumn="D" table="SAISIE_VENTE_FACTURE">
+ <element location="A" type="fill">
+ <field name="CODE" />
+ </element>
+
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="C" type="fill">
+ <field name="QTE" />
+ </element>
+
+ <element location="D" type="fill">
+ <field name="TOTAL_HA" />
+ </element>
+ </table>
+</contentDocument>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">49</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/Default/DIPE.odsp
===================================================================
--- OpenConcerto/Configuration/Template/Default/DIPE.odsp (revision 0)
+++ OpenConcerto/Configuration/Template/Default/DIPE.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">68</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: OpenConcerto/Configuration/Template/PDF/3310_2.pdf
===================================================================
--- OpenConcerto/Configuration/Template/PDF/3310_2.pdf (revision 143)
+++ OpenConcerto/Configuration/Template/PDF/3310_2.pdf (revision 144)
@@ -1,886 +1,1075 @@
-%PDF-1.6 -%âãÏÓ
-6 0 obj -<</Linearized 1/L 44631/O 9/E 39191/N 1/T 44465/H [ 3436 407]>> -endobj -
-xref
-6 157
-0000000016 00000 n
-0000003843 00000 n
-0000003918 00000 n
-0000004312 00000 n
-0000004765 00000 n
-0000005056 00000 n
-0000005217 00000 n
-0000005380 00000 n
-0000005543 00000 n
-0000005674 00000 n
-0000005835 00000 n
-0000005996 00000 n
-0000006159 00000 n
-0000006318 00000 n
-0000006477 00000 n
-0000006636 00000 n
-0000006798 00000 n
-0000006959 00000 n
-0000007123 00000 n
-0000007285 00000 n
-0000007447 00000 n
-0000007609 00000 n
-0000007771 00000 n
-0000007932 00000 n
-0000008095 00000 n
-0000008257 00000 n
-0000008418 00000 n
-0000008582 00000 n
-0000008743 00000 n
-0000008904 00000 n
-0000009062 00000 n
-0000009220 00000 n
-0000009378 00000 n
-0000009536 00000 n
-0000009695 00000 n
-0000009854 00000 n
-0000010015 00000 n
-0000010174 00000 n
-0000010335 00000 n
-0000010496 00000 n
-0000010655 00000 n
-0000010814 00000 n
-0000010973 00000 n
-0000011134 00000 n
-0000011341 00000 n
-0000011571 00000 n
-0000011648 00000 n
-0000011794 00000 n
-0000012067 00000 n
-0000012161 00000 n
-0000012936 00000 n
-0000013025 00000 n
-0000013099 00000 n
-0000013170 00000 n
-0000013206 00000 n
-0000014361 00000 n
-0000014452 00000 n
-0000015536 00000 n
-0000016613 00000 n
-0000017207 00000 n
-0000017358 00000 n
-0000018303 00000 n
-0000019203 00000 n
-0000019609 00000 n
-0000019774 00000 n
-0000019823 00000 n
-0000021088 00000 n
-0000021796 00000 n
-0000021875 00000 n
-0000021957 00000 n
-0000022036 00000 n
-0000022118 00000 n
-0000022197 00000 n
-0000022279 00000 n
-0000022358 00000 n
-0000022440 00000 n
-0000022519 00000 n
-0000022601 00000 n
-0000022680 00000 n
-0000022762 00000 n
-0000022841 00000 n
-0000022923 00000 n
-0000023002 00000 n
-0000023084 00000 n
-0000023163 00000 n
-0000023245 00000 n
-0000023324 00000 n
-0000023406 00000 n
-0000023485 00000 n
-0000023567 00000 n
-0000023646 00000 n
-0000023728 00000 n
-0000023807 00000 n
-0000023889 00000 n
-0000023968 00000 n
-0000024051 00000 n
-0000024131 00000 n
-0000024214 00000 n
-0000024294 00000 n
-0000024377 00000 n
-0000024457 00000 n
-0000024540 00000 n
-0000024620 00000 n
-0000024703 00000 n
-0000024783 00000 n
-0000024866 00000 n
-0000024946 00000 n
-0000025029 00000 n
-0000025109 00000 n
-0000025192 00000 n
-0000025272 00000 n
-0000025355 00000 n
-0000025435 00000 n
-0000025518 00000 n
-0000025598 00000 n
-0000025681 00000 n
-0000025761 00000 n
-0000025844 00000 n
-0000025924 00000 n
-0000026007 00000 n
-0000026087 00000 n
-0000026170 00000 n
-0000026250 00000 n
-0000026333 00000 n
-0000026413 00000 n
-0000026496 00000 n
-0000026576 00000 n
-0000026659 00000 n
-0000026739 00000 n
-0000026822 00000 n
-0000026902 00000 n
-0000026985 00000 n
-0000027065 00000 n
-0000027148 00000 n
-0000027228 00000 n
-0000027311 00000 n
-0000027391 00000 n
-0000027474 00000 n
-0000027554 00000 n
-0000027637 00000 n
-0000027717 00000 n
-0000027800 00000 n
-0000030471 00000 n
-0000031375 00000 n
-0000032168 00000 n
-0000033011 00000 n
-0000033182 00000 n
-0000036855 00000 n
-0000037287 00000 n
-0000037591 00000 n
-0000037788 00000 n
-0000037845 00000 n
-0000038540 00000 n
-0000038752 00000 n
-0000039047 00000 n
-0000039125 00000 n
-0000003436 00000 n
-trailer
-<</Size 163/Prev 44455/Root 7 0 R/Info 5 0 R/ID[<D6D7F99391B95179C4934F04168803DF><A940CE7B8BF59E43BB240391604C126A>]>>
-startxref
-0
-%%EOF
-
-162 0 obj -<</Length 318/Filter/FlateDecode/I 515/S 101/V 376>>stream
-xÚb``˜ÅÀÀ»:O2  faàh`À
-ÝÒ:ˆHšfA1ƒ
-XâBþµìêYä…zö -ÕìêØ/4°?¨! ÈƒZ Tû ÊւЅjÊ «y4Ù¼e^ô˜9@É€Áõƒ¹c‹ Òƒb‹Ë â
- WÎj1h3= }СúåmæôÕ¨ ýq`À…ŒA“¹™™È1à?†é  eò ]ÊÀ¡ÍÌÂÊÆÎÁÉÅÍÃËÇ/ ($,"*&.!)%-#+'¯ ¨¤¬¢ª¦®¡©¥£ëèäìâêæîáéåíãë矐˜”œ’š–ž‘™•“›—_PXT\RZV^QYU]S[WßÐØÔÜÒÚÖÞÑÙ´š•aµÄI  –¬
-endstream -endobj -7 0 obj -<</Metadata 4 0 R/AcroForm 8 0 R/Pages 3 0 R/Type/Catalog>> -endobj -8 0 obj -<</Fields[11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R]/DA(/Helv 0 Tf 0 g )/DR<</Font<</Helv 2 0 R/ZaDb 51 0 R>>/Encoding<</PDFDocEncoding 1 0 R>>>>>> -endobj -9 0 obj -<</CropBox[0 0 595 842]/Annots 10 0 R/Parent 3 0 R/Contents[60 0 R 62 0 R 63 0 R 64 0 R 66 0 R 67 0 R 71 0 R 72 0 R]/Rotate 0/BleedBox[-6.86 -9.8 601.72 851.62]/MediaBox[0 0 595 842]/TrimBox[5.88 2.94 588.98 838.88]/Resources<</ColorSpace<</CS0 57 0 R/CS1 58 0 R/CS2 59 0 R/CS3 70 0 R>>/Font<</TT0 68 0 R/T1_0 54 0 R/T1_1 55 0 R/T1_2 56 0 R/T1_3 61 0 R/T1_4 65 0 R/T1_5 69 0 R>>/ProcSet[/PDF/Text]/ExtGState<</GS0 161 0 R>>>>/Type/Page>> -endobj -10 0 obj -[11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R] -endobj -11 0 obj -<</Rect[217.9 756.815 296.911 775.334]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(B1_1_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 145 0 R/K 146 0 R>>>> -endobj -12 0 obj -<</Rect[218.517 733.976 297.529 751.877]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(B1_2_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 143 0 R/K 144 0 R>>>> -endobj -13 0 obj -<</Rect[218.517 707.433 297.529 725.334]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(B1_3_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 141 0 R/K 142 0 R>>>> -endobj -14 0 obj -<</Rect[38.2713 673.483 181.48 686.446]/Subtype/Widget/F 4/P 9 0 R/T(B1_3_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot>> -endobj -15 0 obj -<</Rect[496.292 756.198 575.921 774.716]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(A_04)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 139 0 R/K 140 0 R>>>> -endobj -16 0 obj -<</Rect[496.292 733.976 575.921 751.877]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(A_05)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 137 0 R/K 138 0 R>>>> -endobj -17 0 obj -<</Rect[496.292 707.433 575.921 725.334]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(B1_3_3)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 135 0 R/K 136 0 R>>>> -endobj -18 0 obj -<</Rect[496.91 683.359 576.539 701.26]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(B1_4)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 133 0 R/K 134 0 R>>>> -endobj -19 0 obj -<</Rect[408.021 617.31 487.65 635.211]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 131 0 R/K 132 0 R>>>> -endobj -20 0 obj -<</Rect[408.021 598.792 487.65 617.31]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 129 0 R/K 130 0 R>>>> -endobj -21 0 obj -<</Rect[495.675 616.693 574.687 635.211]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_5)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 127 0 R/K 128 0 R>>>> -endobj -22 0 obj -<</Rect[495.675 598.792 574.687 617.31]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_6)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 125 0 R/K 126 0 R>>>> -endobj -23 0 obj -<</Rect[495.675 552.496 574.687 570.397]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_7_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 123 0 R/K 124 0 R>>>> -endobj -24 0 obj -<</Rect[495.675 533.978 574.687 551.879]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_7)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 121 0 R/K 122 0 R>>>> -endobj -25 0 obj -<</Rect[408.021 553.113 487.65 571.014]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_4_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 119 0 R/K 120 0 R>>>> -endobj -26 0 obj -<</Rect[408.021 533.978 487.65 551.262]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_4_3)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 117 0 R/K 118 0 R>>>> -endobj -27 0 obj -<</Rect[408.021 475.336 487.65 493.855]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_3_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 115 0 R/K 116 0 R>>>> -endobj -28 0 obj -<</Rect[408.021 456.818 487.65 474.719]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZRP_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 113 0 R/K 114 0 R>>>> -endobj -29 0 obj -<</Rect[495.675 475.336 574.687 493.855]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_3_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 111 0 R/K 112 0 R>>>> -endobj -30 0 obj -<</Rect[495.675 456.818 574.687 474.719]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZRP_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 109 0 R/K 110 0 R>>>> -endobj -31 0 obj -<</Rect[495.675 444.472 574.687 454.966]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_5)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 107 0 R/K 108 0 R>>>> -endobj -32 0 obj -<</Rect[495.675 418.547 574.687 433.361]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_8_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 105 0 R/K 106 0 R>>>> -endobj -33 0 obj -<</Rect[495.675 398.794 574.687 408.053]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_6)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 103 0 R/K 104 0 R>>>> -endobj -34 0 obj -<</Rect[495.675 373.485 574.687 392.004]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C1_7)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 101 0 R/K 102 0 R>>>> -endobj -35 0 obj -<</Rect[495.058 332.745 574.07 351.88]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C2_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 99 0 R/K 100 0 R>>>> -endobj -36 0 obj -<</Rect[495.058 309.288 574.07 327.189]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C2_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 97 0 R/K 98 0 R>>>> -endobj -37 0 obj -<</Rect[495.058 285.832 574.07 303.115]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C2_3)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 95 0 R/K 96 0 R>>>> -endobj -38 0 obj -<</Rect[495.058 262.375 574.07 280.893]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C2_4)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 93 0 R/K 94 0 R>>>> -endobj -39 0 obj -<</Rect[494.441 218.548 571.6 232.746]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_10)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 91 0 R/K 92 0 R>>>> -endobj -40 0 obj -<</Rect[184.566 207.437 220.369 222.869]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(C2_5)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 89 0 R/K 90 0 R>>>> -endobj -41 0 obj -<</Rect[219.751 157.437 298.146 175.339]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_11)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 87 0 R/K 88 0 R>>>> -endobj -42 0 obj -<</Rect[219.751 125.956 298.146 144.475]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(D1_1)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 85 0 R/K 86 0 R>>>> -endobj -43 0 obj -<</Rect[219.751 103.117 298.146 122.253]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_12)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 83 0 R/K 84 0 R>>>> -endobj -44 0 obj -<</Rect[495.675 156.203 575.304 174.721]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_13)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 81 0 R/K 82 0 R>>>> -endobj -45 0 obj -<</Rect[495.675 125.339 575.304 143.24]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZRP_3)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 79 0 R/K 80 0 R>>>> -endobj -46 0 obj -<</Rect[495.675 101.882 575.304 121.018]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(D1_2)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 77 0 R/K 78 0 R>>>> -endobj -47 0 obj -<</Rect[495.675 80.2776 575.304 98.1787]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(D1_3)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 75 0 R/K 76 0 R>>>> -endobj -48 0 obj -<</Rect[466.663 40.7717 572.218 56.2037]/Subtype/Widget/F 4/P 9 0 R/Q 2/T(ZCP_15)/DA(/Helv 9 Tf 0 g)/FT/Tx/Type/Annot/AA<</F 73 0 R/K 74 0 R>>>> -endobj -49 0 obj -<</Rect[552.465 815.457 567.897 825.333]/Subtype/Widget/F 4/P 9 0 R/T(B1_1)/DA(/ZaDb 0 Tf 0 g)/FT/Btn/Type/Annot/MK<</CA(8)>>/AP<</D<</Off 52 0 R/NEANT 53 0 R>>/N<</NEANT 50 0 R>>>>/AS/Off>> -endobj -50 0 obj -<</Subtype/Form/Length 88/Resources<</Font<</ZaDb 51 0 R>>/ProcSet[/PDF/Text]>>/BBox[0 0 15.432 9.87646]>>stream
-q 1 1 13.432 7.8765 re W n 0 g BT
-/ZaDb 6.0449 Tf
-5.6698 2.892 Td
-5.8212 TL
-(8) Tj
-ET
- Q
-endstream -endobj -51 0 obj -<</Subtype/Type1/Name/ZaDb/BaseFont/ZapfDingbats/Type/Font>> -endobj -52 0 obj -<</Subtype/Form/Length 30/Resources<</ProcSet[/PDF]>>/BBox[0 0 15.432 9.87646]>>stream
-0.749 g 0 0 15.432 9.8765 re f
-endstream -endobj -53 0 obj -<</Subtype/Form/Length 111/Filter/FlateDecode/Resources<</Font<</ZaDb 51 0 R>>/ProcSet[/PDF/Text]>>/BBox[0 0 15.432 9.87646]>>stream
-H‰2Ð37±THW0BCS=c#K= s3S…¢T…4…BC4K˜Ã%Âò€êÓœB¸ô£]’Ìô L€æ„¤q™ê™™YZ(éYX)„¤ùF†@–—†…¦BH—k—B @€ê'R
-endstream -endobj -54 0 obj -<</Subtype/Type1/BaseFont/Helvetica-Bold/Encoding/WinAnsiEncoding/Type/Font>> -endobj -55 0 obj -<</Subtype/Type1/FontDescriptor 153 0 R/LastChar 233/Widths[278 333 278 556 556 889 667 222 333 333 389 660 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 660 660 660 500 800 667 667 722 722 611 556 778 722 278 500 667 556 833 722 778 611 778 667 611 556 722 611 889 611 611 611 333 278 333 660 500 333 556 611 556 611 556 278 611 556 222 222 500 222 833 556 556 611 611 333 500 278 556 500 722 500 500 500 333 222 333 660 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 222 0 0 0 500 0 0 0 0 0 0 0 0 0 278 0 556 556 0 0 0 0 0 800 0 0 0 333 0 0 0 660 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 556]/BaseFont/GENEJE+Helvetica-Light/FirstChar 32/Encoding/WinAnsiEncoding/Type/Font>> -endobj -56 0 obj -<</Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding/Type/Font>> -endobj -57 0 obj -[/Separation/PANTONE#20Reflex#20Blue#20CV 59 0 R 148 0 R] -endobj -58 0 obj -[/Separation/PANTONE#20Warm#20Red#20CV 59 0 R 149 0 R] -endobj -59 0 obj -[/ICCBased 147 0 R] -endobj -60 0 obj -<</Length 1084/Filter/FlateDecode>>stream
-H‰œVÉn#7½÷Wð u‡ÅGY¶åX=Y`#ËÞecæóóŠ½h±¬É $ ·ªb½WÅz*úAF+¢ÓÒ OJ:+úÑi¢x^¿‰ûâ©PR-É…KN* -›ú±³!¡ð#aB’†’R0òÖJE>¥hÄü®ø0œ*1œÂHL‡gˆª“ŸEñáG¼ÿ´*8À]A)HK¿°‰ùJÀ\ˆÕü¾3·È2+B´2&-t”Z#{RŽ!!³›zÉMg£}çDVQه@´hƒPt҄À&†"Lx [Q¼52„u|~^Ç¡ ¬—0n¼•ÖºÁ6ü¶uIj,ÞÂN$µ‹M`¼îV‡ -y‡)˜&Á%ޝPÝl¢ƒÖ29ýö´‰ymî‚èC &6 SmJQ†DTÕÔÂ9T5W‡dhh<ªxÍ+PþÕå­è/RuÃ
-±*‰j.’ŒY_|Íú BÅÑGQÝåà´Wý Á6Jc²q¾±´cœ֗åä¬ê[péãsy<šÖ7“ó™!ºð×j<9k^_ðÛÁÉxÊWØþYý\ŒªŽ sSs íïƌ­Co0i=v‹w Þ7˜Äñû E›æ—%ç>œœžW£t}=Ô×ê×ÌIý03JÕwçõÛ¤Ë?F‡‘SòyÏ|ò}x)¢=µx‡Œv¨á† [v¹XÇãŠÍ7ƒò’ۖuµ'*$¦ª°ixY~ ¦Ed¤Û,m'Þ½ËÉa x Ü®Ð|t“ñ„3î·Bù¼[{Â~Æ&ßt¹,we-Ƨç“éàèd4³ò'Yõˆ¨”³^†£8ì6u ¾-ƒ"¢I|5“³ÉÙF6-»4zç¤3ß@£Ú“Qæ·^:Õ&ÔÉ^[*.>b{p›ð-’ðAÅ-Ïòè­r¬F{·qg…«ÕBüóð¼/=Ë«/‹^ßZÊ܃ð(®_ïá6h&ÖÓÿǽ²A'°ÆÐÈÇy»|Vcð õIöQsÔ¬O~‹ƒÛÖ÷h…¬N~wèä¯OüÀSB>ïûŠáSÒHçòRÅؽ¨'‚mØTÃî¯'zçŒ¤u‘ê'4DƒóB ††ñýõòéuñ,–ó¥¸]ˆÇ‡×çÅr¾¸¹ú„²à?3Ž®_ç/ˇûzkà”å“üT×\ÛÇÇÛåüêïÆ]Ü^‰Göy^>À}5ÓZ/oÅbõ"®—7ü&å;¬²'d 7B“ùÕÅu§ç¹Èó–o4ŠãÃRP)§,ËìØ6¤=¤S„‚, L/žë†fÇÓKàCƒ«:}S~žtÈl C˜c|gBi&‹ÖG#WÔ¡µ4zW4ÙÖB5ζŠ[4Dƒ’¥µHT ÖÀn„”’Ià -i¥ä³ìš’ð2ùn |*Ä ùá][
-endstream -endobj -61 0 obj -<</Subtype/Type1/BaseFont/Times-Roman/Encoding/WinAnsiEncoding/Type/Font>> -endobj -62 0 obj -<</Length 1013/Filter/FlateDecode>>stream
-H‰¼–MoÛ8†ïòæ(-b–Ã/Q{ë&Á‹½,bô²^Œ¬4,dÉÑGRì¯ß!%ײ¢mZ¬}1IÍ;/GFàôEh˜5çJZÍP
-Î¥…b»àLåð ‹ð `i“ªÅíâ¯Åã'•&µÈscAÍòÜrŽö‘šiQd¦X.pFùheÆey&Œ9“\ç¤R04Šdõ¹1RfJè$ðÛjñæê–CёtE½x³Â÷‚«{
-å3XÁƒ”9¬žÁ0#”Ii'Yț™<¡X&r«í"ù³ì`ã»]ÓùÞ75 -hµ½/*ú!Õ%H -eÒÐ
-TªÆC®>’ɐ,ä‘,Ïì˜G2+ÈQ–3ŠÁ0­ÆLM ú›V1Ž¹™ûü;Éì’7øèê'_¶´ŸÌ¶Ùø{¿–KhËÊõþ©„µTDm-„ðõ}Óniöq(/Á -ŸÖpï‹Šï¾h*W¶}è  An·«B@ݧK)Uò+”UÀñÁµ®î}×ÑÊ%욡M—*ZJÿYý1#² Ös Kdœö¸!ÿ›¦®£Ëžš¡ƒ¢©‹²­]Prî¥5ޅý$ޖñüv·–Fõ)ª¤»„¡†MÛø6ÑdQŒ1´‹ÃJ€PôD¤pá<ÙhŒ¨gùH -!&‹|oîšÌÝúÑTp®ò]ùo4ÐìÂDëÆÒðdÌÍv;Ônˆ¦œoK2¶+ë1Rwd‚ŠÊq£Û8õàê¡ÞJ¸ó2t”x}Q´$5‹íš&‹T&Qç÷ Q†ªÐu3¸ºŒâ00HQ'§ç±ú…6éëMiÂ:)îÔ -Uz9e;ñ}õV®ÓàÍêøú
-ºG¹°`¹e
-©±óbcÉ2CÀÏ€äH÷Âp®dÔeŒÆ(%2«Ž4)ݬНÇÏwž:GØdÆlF%ÄL?Ò¥4$oî”ž.Çt‰Bêä]ªuB…O¯MÑ&e×»}€®lŸˆË„‘Ñù©†Zª¡òPÑ Û½®ägW´›ð85A‘«èjú‰–Z5Ô#[¥ü¬/棽­9,l-÷ܞ_à&¹bôê8§&p7Ÿv -Ýz¶ÇõÐP'¹º9AËOyÍüE'2<o™±fz’¦Äw@U¹`–ÌýL¨/ÁûZ¥ÉŒÚµ601{;ôS}v“-½tÜ]õR•áy•½®ÌfžþÇ2û©Cm£Ò_CUS7ú2.ÒÒfŽë¸²$C‹‡Ê’¯ª¬ŸÇñ5•E-¥Á —Üã*¿ÿÛrün¢÷Òòœ•ÑǕu K,q€…ßK„ƒôwon÷G‹îUÕ5Ëÿ 0}+žE
-endstream -endobj -63 0 obj -<</Length 1006/Filter/FlateDecode>>stream
-H‰¼VKÛ6¾ è˜K¨¸äðÝ[ºIE¢‰Ë:(T[›(Ðc#Éi~‡åµ¼v‹E}1% -g†ßÌ÷qîRn6™@©ÓŸ«¯}Q -];@Վ}±ëšæЇ±¨úpi9l>ä?%œ!¢‚|Â0«5pÈ÷IÊæß&ÿLœs,£½RáëM.~“ ¿†ÂûÙУWdɗ¥òȼ …‚ ihCsŒòÜß_ãs.B|˜õ8ŏKř²Ü€ñžI!ä~›î»v„¯e;–l¥â°¯†±hw%”ãMw€îa+µè‹±"'0 L‡(¯“»t_BCŠ%|¿ÉÐjÔ)·±¯vŸŠq€²…ûž\~ª†ò q¥˜E¹Füìxà{fœ}ß>|òÀ”3æ¥Àϼ`ÆjȐÉüâ1ž÷Û~ó/s`Äàr텓LjEÅ·š#ì\üMØý&O¾$b²¦.rŽ彗¬SÌy͹’°k’`ÐLÕ§þõh NÐ1$_Y(‘¤Ës°e­“wɯW¼+™°T0+½  ½£õùVe$s©lLÌRL\'Æ -ãN/‰ù91½$情fNé+Þ©€>@ä× ×y9úö4/ɉ Òët̋ŽäfÀ½€?à9ËLtqsûŽ>q`صɜƒ©5ÓÄÊY6™çÌ+}™Ü'?äaûļë„üيýj©?yÂðºÀP¯
-¡øw)êÀR¥ÒÛ>0|_@dÎßo¬J_Á6­«m ”ÈC±§'a¨gŽ ÆI3íeÍ<É&ˆ¦_xk¹~Ê[Œ¬]( ÔF¤‘N¬r~a±üg¼¤cÜñ2¯·eó{w臲!Õ$̚¢Ý#0qòI‚ MÐJnd8ú]:z¸ïzrãÒæP/·´óÎËá
-+O -ã=%,‰sžÏ¼í¢,Æ@ëäGb8 œ@Ϭ‰:OéyøÜÑ58ï]ªGXuA~Ï*h(‹hå™ÿTÀÓ4þïrKä´>Ð>iø雫ð 3–ýcóëÓæÇUóOa…g¸jþ3ܨî8yÜEԜѫÌ_äB¹!™ R.ˆùA‘¤!Í'Ô|× Þ6½-DZ„f( -†«ØE¬pAʺÀÉÝÌ’˜º€‡i_GãAEÆ{vu1ä7ù‰$A'=`áZ ²N•9ͨJ£|};ž´Êq*’’î.æÓþr:ôÀÔ.E] -῜æ™ûiDj›±ïºº7èÒpž)ýËXgGQÐ3ÜŞÌ7ti¦ÅáOh…(jê¯ïL˜ª\úí¹ì’ u}pz^ƒÀ_ áªsc
-endstream -endobj -64 0 obj -<</Length 524/Filter/FlateDecode>>stream
-H‰ÌUM›0½Gê˜K%[
-îøslµê¡RµnKµ¢ +Q%Pûó;$ÐMVÝTé
-.Xf0oޛ÷ˆP ¢„tڈ˜VézÁP¡ãéÅ‡T>j çO ªT¡Îˆ„Šðp7‹Ø[ NI¡U8h»`âFWöî_<"—=òhl2ÞÐJ…
-já|þa<Jœc)—R²¼ûM¦­\we viá=ÿ–~!>]áP‰Â50w›ÖCØڒ6Ç/ D{•6“îf§ÍÈ"µ«Œ±þ|®–=Xïš^£„+c|"¡ŒþoMt¾@3¹1·iÀŸÏ¿Aabt`‡ ¹ß…aoò¶¬«}?ùù¦Ü‡{±‡uN›ZÜÝ}Ùf‘"ÉDRØ0²L"$É;ñTU7´çÙ6߀_Z©Ø³3kI¢SßÒZçÎR£³(Á®q–µN83Sgý5õ¬N†Šà()ÏSO-å R¯ÒfÒÝì´Y|Ašyn†S)SA´ou—¹=Á›³¯H9úÆê8ïÆ\¹ÝÕûü{¶L„®‚¼k›Z®|0C?üC¢ÝÑûûÜäÕª€m8§mê]½)ûê²* îBBfüÄëkBRüX­Ê¢‚öôÝÓ¸xŠCySÏ -Ô?·ž§X<æ.&×YÏx<WëMš„ß ýZ5r
-endstream -endobj -65 0 obj -<</Subtype/Type1/FontDescriptor 155 0 R/LastChar 1/Widths[834]/BaseFont/GEOAOI+EuropeanPi-Two/FirstChar 1/Encoding 156 0 R/Type/Font>> -endobj -66 0 obj -<</Length 875/Filter/FlateDecode>>stream
-H‰¼–KoÜ6Çïúæ(–á›Çí¥@Qrñ…²+*´ZGÄ?CIkiœ xE‘Cþç7Ã!ðÿ\|‘R ¢m¥0òCr—’Î6$µNÿ~Ø*CmÑWǦƒêðp슏uÙÁVi„¡¾á¡hy¼Oûj7ÔUÙÂ6ÝG»ÝñðЗPÞgÜy_îú!~…nh¡hšò±¥áÍ6Ë>ä&($?ï@£@5æû$˓åÿ%Œz)³‚Â<ƒÁØûkNÿ(àÞ{ž§ÉD½¿pž5,Þ®çÕ³ýå -OºiÒ½rÐݎ”fWä)3G*Ÿ9¾a°ý²ªڈ½<”Mc8öCÅÑ#7u}.Û®l/ØS^™kö¯es;å„ħèYDxIƒÎ»‚ðJ‘7éËkú
-µ:â—$ô¸0ٓ1Ί§¬ô•-†7Ghû4Á:ö™ôiQþ„º€9‚ÙFjJ?¶Çj?p¼Òºú·á-‡~Š™y¿¬Tá»Ö¬Á;³Ò¼8ü"Ê+»Ÿ
-YNCS%rv·9£t³)'ìæµé]úû‘Óÿ íX~vŸ†ª«æ²ÖômÁµê04Å0ŤjËî’ñ³ûRÛÀøM8È¢¾/§Ïì6pç…ôn ·N©[¸GÃoã>ž#cïË®¯šñKÌÿ¿Ž -‡à/²¸ÿ^à‹õëqÿ‘'Ÿ!ž9²šÅ°š—³:„ awHâ€øŸOLÍL¡NÞ%oW¦:p7.ðÆMFØ`ؔS6³.˜:ÙHv@jØhÇßÜÔɝګIµŒ˜Û«dPðZːӇ+…Vñ!¹Êq…0쨲!¨sç v½ŽüQñT¨„ñ±knö]^O­„‘‘}WÄÞÅ´ó¹­á ,+X-ø¸ž!’—ŠÉÓHÞ³¶`Vø(87Φ¿å/J¹§B–„%3ÀҟÀœôΧMٟ—o¶‚­d^SKê«;yö̝çù,­rgÒþòM,Ê ¾…°„–ŒˆÒâ‘°¢ëªCUÇRÀ­]Qómqnp‘qH.-–³C U#ˆùžØD98ùíPϞÇ7e˜€á­B1]çMôýxqÛ¸ÐÌ9ë y É/–T´¯ ¾6aÇ
-endstream -endobj -67 0 obj -<</Length 830/Filter/FlateDecode>>stream
-H‰Ì–KoÛ8€ïúx”°5Ëáð!S —Ø­°—¨(› -èáJr»Ý_¿CÊr»-œ.ÊCBœ×7ú6E‘­¤Íӛì}ñ6\ÒbŚ!—V2ÁŠM’òo¬¬xHV‚ ! \Á[î;g]8UÀdtþ‘‹¨VqG—Dü¯œnHÇ­dEûmc—¯Å,Ìf£‡Ú˖ç*šŽŠKE>hž[ÐÁömŠÙJ§D¤黾mýÈJT‚Õív7ù!s2}Éü¿Û¡nKÔ@Ǿc~7d§ýø2B”µa+àÂ`äñ•­û–DFV…Íäé»»òcð÷:H®\~Ný¶áà¨óËQ;Ey²\£µWB=û÷ÔäƒQÖíIC ¬ÔÊÕCÿ›RvÏ¢œkŽ ®ÅXΌ…ÿ²ÊÉq¥8èÙ4ÊE\ì}ž¤ãºM‹Ìª´Ÿ2™§U3ç`?¾ú•iSßw_æì&‹Üƒ>5ëäJ/ŒJÂvb8À2P„2; )¦å¼h”6<ãyÄ!9ØçŠz؈ TjÔe(%· CE*Õ\weúgIûÝ]Sûÿ(ZPi5²g}ÝmÏϪqßøÖwUÑ0øqÛw›ª›ÈÿáM‘|J ºKȍåÎW$•ÏPW"[·I8Wä_Κä]òבœ¶À4¡…Ÿ%쫝S.à@r¨å€jl Ñ$+0š äL"XOsÚ-ß³î×ÅEL<cù!ZnÑâLܾ“_×¾CӍS=íQir¶ý]ÝÔc5Õttò̀ã¨~ôÎüÌ*_œ5sðX,v„xa; ë̓xÑÐ< ž° –búf7ÅaH|ï"u?±ÑŸëµ?#ŒÑ]ðiXG±(*.¡iËgÑ>
-ùjãsñõËw¸K~иÃ)wVüFçÍ<37á•Ùìêùì$"X ñŒWÎ?O„æÚÊ^èK_±˜ˆc¿¸ì%8°ürÿo¿íÚç)͖[‘{=±j»­†ªÇ0uâ«Å董¡ÞTlo­ãUšç~ÎÖº!©._ô]öžý/ÀËûh´
-endstream -endobj -68 0 obj -<</Subtype/TrueType/FontDescriptor 151 0 R/LastChar 122/Widths[278 0 0 0 0 0 0 0 0 0 0 0 278 333 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 722 722 667 611 778 0 278 0 0 0 0 722 778 0 0 722 667 0 722 0 0 0 0 0 0 0 0 0 0 0 556 0 556 0 556 333 611 0 278 0 0 278 889 611 611 611 0 389 556 333 611 0 0 0 556 500]/BaseFont/Arial-BoldItalicMT/FirstChar 32/Encoding/WinAnsiEncoding/Type/Font>> -endobj -69 0 obj -<</Subtype/Type1/FontDescriptor 158 0 R/LastChar 2/Widths[500 790]/BaseFont/LEKOLE+Symbol/FirstChar 1/ToUnicode 159 0 R/Encoding 160 0 R/Type/Font>> -endobj -70 0 obj -[/Separation/All 59 0 R 150 0 R] -endobj -71 0 obj -<</Length 1194/Filter/FlateDecode>>stream
-H‰äUɎÛF¼È?t¨Àj÷¾'ãÀ€á80ÄäBõ8 (jLŠãA¾>õšÔ2Ÿ#Ød÷[«^uõ®\áǪšiÅc”L°j[”ü«~‹êïb)¸B’'e¸°zöð‘ö_WòÍ°ƒ˜"G4<âÈO5>:¦œçÒ{ͪÝצñ\ZVNa§ sdσɡóB©iC)Á¥žC+MæÚq)ã\Š2Gb.$W˕öӉßÊjáM¹?,T(7-«~¥×«ÅRYn×ÚÊíXš?ÛÄÖeÛ|êÒÀà}­@ðõbñ{õî2ã38ÒsÃ#p(›«âs!s-MtÜtܹ\Œ³.FïY½+èÀ®ðh5åÚ«âㅡ¡´^!!ǝñBhE†¯¯WŠ]¯˜Ì¶ºþ€´<ºö…ÍN[JÉ­´³Ûª=Ø>P -h®†U_µßnLÐÌ9®%Ý¡‘W‡Cê;[,­+¿e¿t‰ -ÍaÜÐ7¶MçÞ¶¬ûÜÜæÐ7õ©·LY6¤þ®IëëRn.QŸs6ÄQ$Césá°~ƒ¸Ûf¸MݐØmÆp`Ûq^6i‡Œz`¾÷Xm†¡Ù5-EÇ[†¸n7ýü>§yŽý*Î*¢¶Ý3h¾;#…¬Tð<¢/Á2Nó uŒ˜,( 7:<°•Vñ`J¤W‘-1Ý"ZlJ‰çO_žÅ,7è)ɝsæ—Óà‰BÚÊX›§e]®ÁVï»»Ôšž¥Ž¥±ß’@, -Ú¼é7]=€òà°3¢ÊÕEH>‚¶ž ¶}3!V -»ÛëÖ‰Í]úg›>ín[Äیõˆ^O=ófßïÆvÓôĈ34ßLZ+«K©cÙÑÖЮ•×ëÅ+v—Ʀm¡Þ×¥¾@FVo†tÄŒ4Öj®0—9o2öhû2Br+dä4GAy®P‰µŽGm<-X]"+<×ÁÄh,sÄ
-í±6YÄy4s4ì O[Ãh¦6¶¦·Ì«žNº˜²˜õÎØò`‰bž†Ñs#å j5dµ‡Ì„ÙÇi@‹ Ïù°ÄEהèÊÖ/ø0àŸ’³’dõ€zcCÝÆq°Åh$%h"ÏKä(n2µ¯W‚LädpÁôÀÃD¼¼ÀÐHeƒBrÏÌ{¿™i%֖RB<¯SÅçœÃ¤¿ùù§iȳšá,&ïI!ÆCÇþ–XÖgî -H¬MwD9¨Ë$&ã}6¯¾' -‚f¼’¸5|(¿£X‡¦³ö÷áGÁå±9ÛcÏÚ<&]—îÓZŠéºzF‰¬wÜ+¨ œÀœTé¡yœ‘nàã -§ ‡(<iÅÌXÉÞJK@¾~‹þ.¤MOÜ\â~E¨ù±+–'b~o 0e6šV'C‡ÁÒ†6ZÒ¦“!bDªÅMñ†Ykû"àô~ x¶ßOöǸGûcÜ£ýê¿õ„ÔÓ¥:_¨êÝ'è.‚PÜn:œDéEυÉâtÎûøõ¢…{÷<$$ð|ÿ¿8hpÄö¯ižtH
-endstream -endobj -72 0 obj -<</Length 638/Filter/FlateDecode>>stream
-H‰ìT»n1 ìõ,by”¨g'0Üv4Rœ/‚»âðï‡Z=¯Mw"9%ŠÌ ]€ÅêˆÉÁEqsx‡)ÁYFg@k ^ÂÅZŠÙ‚K Œ:ŽpLƒ„&‹& ›5hƒ C螳b0ê ÂN#ó„(¤”éZ9œËaa4փ‘ZÞÃâ0F¨öóQBl5u@ߓŠA‚)§JUðS#*5J ×®ø¢çØûŽ“mB›yîf”[‚c"ŒúíÖ]UvKîæNÝ䋭ы£'‡„ä;w±z=\uÕÜYôQž*t|ûx½›žfò8 Z˜MLh¢Ížˆ,‘Á²Û;¯`e|&HD«g’îØëì9Õ#ãiŒ…‰„=º4Õ)vÎéR¤‰í$·ýÇô÷aIvîx8ŠV–@Ô£™ÁPÛe)ÎÆN–ÛžºÝ5TGU9J½BktH¨€&±ÜöpT«úª~+-“K ÁÈçMšˆ8@ôŒål…ø¢÷+Ãý* Xï¿(™-o +ÁóEû§´©üJš~@ñŽ/0Þ§mšái«†ß—Ñû2z_Fÿó2ÒhØzb)Ièu0ÉrÞD‹†('—¤V´^Nê\%‘ÄoòªqIF%OS1+ ñ.ƒø†÷ã&[M³‡ç¾Õ›þá$eû©DCH°…"
-sfÒH‘‚ÌlŠ2½ÛEÝ}'2¶_•é!ïI›÷$åT!z9lnGØބUÒY˜+È80Õ
-°Óï`éƒó吰=©»Çëëéåzz…>=<fÜçM®4_ê¿^ÚèãfÝ[Ô2
-‘%Eþ¤üY¹V'3«s޺ׄ¿ zF
-endstream -endobj -73 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 2, 0, "", true\);)>> -endobj -74 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 2, 0, "", true\);)>> -endobj -75 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -76 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -77 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -78 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -79 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -80 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -81 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 2, 0, "", true\);)>> -endobj -82 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 2, 0, "", true\);)>> -endobj -83 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 2, 0, "", true\);)>> -endobj -84 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 2, 0, "", true\);)>> -endobj -85 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -86 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -87 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 2, 0, "", true\);)>> -endobj -88 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 2, 0, "", true\);)>> -endobj -89 0 obj -<</S/JavaScript/JS(AFNumber_Format\(1, 3, 0, 0, "", true\);)>> -endobj -90 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(1, 3, 0, 0, "", true\);)>> -endobj -91 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -92 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -93 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -94 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -95 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -96 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -97 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -98 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -99 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -100 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -101 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -102 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -103 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -104 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -105 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 2, 0, "", true\);)>> -endobj -106 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 2, 0, "", true\);)>> -endobj -107 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -108 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -109 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -110 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -111 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -112 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -113 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -114 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -115 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -116 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -117 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -118 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -119 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -120 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -121 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -122 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -123 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -124 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -125 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -126 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -127 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -128 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -129 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -130 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -131 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -132 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -133 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -134 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -135 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -136 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -137 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -138 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -139 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -140 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -141 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -142 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -143 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -144 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -145 0 obj -<</S/JavaScript/JS(AFNumber_Format\(0, 3, 0, 0, "", true\);)>> -endobj -146 0 obj -<</S/JavaScript/JS(AFNumber_Keystroke\(0, 3, 0, 0, "", true\);)>> -endobj -147 0 obj -<</Length 2575/Filter/FlateDecode/N 3/Alternate/DeviceRGB>>stream
-H‰œ–yTSwÇoɞ•°Ãc -[€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤ 
- 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é -@8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ
-V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” -Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)뫔ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW=
-€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtܛò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)˔z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ -߁Þô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð
-¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()ӔWT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèҏӿ¢?a0nŒhF!ÃÀXÇØÍ8Åøšñ܌kæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…僰d¬VÖë(ëk–Íe‹Øél -»—½‡}Ž}ŸCâ¸qâ9
-N'çÎ)Î].ÂuæJ¸rî
-î÷ wšGä xR^¯‡÷[ÞoƜchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
-n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYψÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎъèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIڐtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ˏËïϟ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÒsK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø -چ žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠ-nßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾
-¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûۀÜ܊ÝݖÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ -æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû
-
-endstream -endobj -148 0 obj -<</Length 761/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-H‰,ÂiL’P×֟¶ÖÖVk«ÖªÕjë^µÎÕì>¼ïïoñÊû¾oóDäVNñ@T@ðTÀQÁÅyöÉz{GGG‡{û‡»»;;ûÃÞööž~koS¿»¶¾£[ßÑê «ZƒFkXYÝVk¶–Õ[Kê­Åe½jI¿°¤Wª6ç6ç”³Ê -ùìšlfmZ¡›Rè&å:©L+‘iÅSډÉÕq©fLª•hFÄ+ÃâÑøŠpL-UŽ,ó‡—D‹<á"W¸È¨ú‡T}ƒª^þ{`ÍS²xÊ®’É™ïæÌwõÏ3úæ:سíìÙ6Ö ½g¦•© 1ÔnµKNaÈɝrR§ŒØ!kiŸnn›&Чñô)\ë$–6‰¡JÑ)Š,m"K$ ‚(ō-bX³F˜h L@ñãõ¸ñ:ìX-v¬=Z­Büm©"‡+ÃåpQ\TÚ(* ‹ -Â"¨ *(¨ä× -åÕæÖ æ«ùÙUü¬*~æ߁ `%/½’—VÁK-禔s“˸ɥœ¤NBIBq|Q_\a_,° 7¦ 7:¿’φ䱣rY‘¹¬ˆVD6+<›–ÕšÕ’É Î`‚3ºÁéÝAi]i]©@†*Ã/…á›ÌðIêô6öJìðLìðHhwÿÓîßæ×æKwŽ¥;ÅwŒ¡;D·ÚCZí 4[`Í&’fIµŠ Z†S,Â)æá³0²Y(ùw(ùW(ùgéGé{0é[0é+˜øLü &~
-j1 -l1 -hþhüÁ¿ù=ЏðΏð֗ðƗðÚÿÊÿè{á{î…{æ…}ê‰}â‰}ìyäyèŽyàŽ¹ïŽ¹ç†¾ë†¾Bß¡oP7]Q7\Q×]P×\š®:#¯8#/;!/9!/:".8"Î;"Î9 Î: Î8 NÛÃOÙÃOÚÃOØÁMìMlm`ÿ[L¬Œ-ÐãÆæõÿÝ3
-
-endstream -endobj -149 0 obj -<</Length 650/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-H‰Â[AП¤Øb‹ÝÝÒytH(Ý¡4Gwݍ€´”Hƒ„€’·=»³3îÜûÆËCC€% ,æÌӘÓbÙÇ̦w1µƒµÉÃm|¸…6Ñþ´¿öÖÑîÚYE;+ä¿%ôw m/¢­´56çÐæ,ú3ƒ6~¡i´>…Ö&ÑêO´:AþG+còò(Z•—Fä¥ayqH^$çä¹~y®Oží%gzä_Ýòt—<ÝIN}•';äŸíp¢M·þhãÍp¬ Ž5ÂÑ8ZGêàH-®…ßkàP5ª‚ƒ•p°”Ãþ2©¯ö•J½©·Dê)–¾‘Ý…RWÔ•/uæI¹Òש#[jÏÒ͔Ú2ÄÖt±%lN›SĦd±Q-6&‰ -Ib}¢XŸ Öŋuqbm¬X ªc@u4¨þª>ƒÊ(PÊ#AyYJÀ&hB€&”ƒâ PŠ…¢¡Ð_(ð#ó}…<!Ï[ÈýDæ|²•^B–§å!dzðî|Æ>ݍLsåS]øTg>EéÄ';ñjG^íÀ«íù${>юO°åTd¼Š‹³á⬹X+2ƒ‹¶à¢Í¹/J3î³)eBF“Fl¸!þž -S¾cCߒ!oÈà×lÐ+6è%¨|Á<gýŸ1J¿§ŒßÆ÷1ã£|Äx+2Ÿ0ï“^÷¯»ŒçÆCy›qWÞ¢?ܤÝnè^§]¯Ñ.´³ít•vºB:^¦.Ñöʋ´Ý%e{žR£Tú”>e}–²Rž!-OS§(󓔙òezœ29®5>¦«§5ÒÓÕ¾Wù/À–ñ.2
-
-endstream -endobj -150 0 obj -<</Length 700/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-H‰úÿÿÿïß¿|ÿþõ˗ϟ>~|ÿþÝÛ7o^¿zýòÅËçϞ?}òôñ£Ç<ºïÁÝ;÷îܾ{ëæí×o^»zãê•k—/]½xáò…ó—Ν½pæô¹S'Ϟ<qúø±SGœ8røø¡ƒGî?²ß¡}{îÙ½×Î};·ïÙ¾m÷¶-;·lÞ±yãö¶nX·eÝÚMkWo\½jêëV,_»|隥KV-Y´rñ ç/[0oé¼¹KæÎ^4gÖÂY3̜>oÆ´¹Ó¦Ì™:y֔I3'M˜1±ú„¾©}=Sz»'÷tMìê˜ÐÙÞßÑÖ×ÖÒÓÚÜÝÒÔÕÔÐÙXßÑP×V_ÛZ[ÝRSÕ\]ÙTUÑPQV_^ZWVR[Z\SRT]\PY˜_QWžŸ[–—Sš›]’“UœQ”•^˜™–Ÿ‘š—–’›šœ“’”œ˜•”™Ÿ‘›“•™‘ž–èàîïæïêçâëìãäåèéàáæïîêçîâëæìãêäíâèíìèåäàéhïá`çî`ëfoãjgãbkíbcålmédmáheá`inoafgnjgnbkfbcjlmbdelhilhad`a¨on gf kª¯k¢§c¬«m¬«e¤£e¨­i ¥a ©®¯©®§¡¦«®ª£¦¢­ª¬­¢¤¥¢¤©¬¨¡¤ ®(¯¦ §*/«Dr2ʲÒJ2RŠÒ’
-RòRr’â²b2â¢2b"ÒbÂR¢Â’"B‚Bâ‚|b¼¢ü<"|ܼ\B<‚Ü\ìüœl|l¼¬<ì,Ül,\¬Ì@ÄÉÂÄÁÂÄÎÌÄÆÌÈÆÄÈ
-B ,Œ Ä D ÄFŒ0Du`å0 
-
-endstream -endobj -151 0 obj -<</StemV 133/FontName/Arial-BoldItalicMT/Flags 96/Descent -211/FontBBox[-560 -376 1157 1031]/Ascent 905/CapHeight 0/Type/FontDescriptor/ItalicAngle -15>> -endobj -152 0 obj -<</Subtype/Type1C/Length 3586/Filter/FlateDecode>>stream
-H‰lT PSgþoBnÂ+"ٛÕr#",¯,Êä!‹¢Ñ`©˜&Q
-tkkuÝ]-¢®m•ÚÝÝ鬸T¬ÔJ+¢ :Æl1ºŠ/XQ±j]΍'Œ{Cg;;;;wæܙóßï¿ßw¾sE¼„¢¨_ÎÍ-È}=÷WyæJ‹¹®Âhˆž_Q¾ªÎsÂ))NîµÙOÀùÉ1 w½Üô²\œ&wôEýõxNUõÆHaŒTk““fEybâDLòÄä™1Yeªzˬ.ÚX[g^[«ž·ÎXUS]Uc¨3›bÔê¬ÊJu¡çžZu¡¹Ö\cá³?ÓRWÔª -꺃ɼÖP³F]µR=¿b]UÝÆjs4ÿQ¥:k®Ú°Î[U£®à/¨]ÿVm…©ÂPSa®ù_m„âB"B&ù‘ #DCH4!q„Ä H"!ÙÞd)¡H!vB„$ó%#B"" -ä 2LQiT>e¤NPNA´àà[a°p«ð¸WŒW“W›×ˆh‰è°è[Ñ=Ðt‹X!N—‰JæJöHF½3¼7ys>é>Ÿ¿ø´ùû}Ûüüªýù üü«ü›üû¤Ò©uR˜^ª—r= -=%8Ñs¬Ööì­¼ìy?ê5=²Ž.WÜa´³3µqÎÌáß9‡ïç8ãØ
-Ûén™^W¨ïì9ßÑyžÅý°ÎtÆÅeÍÖj¯f;¯«0 £+9ÝÛ{º³··S¯ÓéKt¬¬¾‹Ëƒ£ÌRÚ=mÜ(:KKÕ\s=ø -Q@· !Úeb²ãVÐƍSEµRüUÓߏÙÒÝ®úzª»OW=ƒCçcæ+°ðNF©Îб\ñ¢€4$Œ€Jõ
-Ì}Â1,b€@èE‚|Àd@”JO?Àà )
-LÓaBò(}O&ˆ'“3ô¹xΟõóÇò¡ìx±TïùÉvh ž[›Ç¯ˆÎÑÒw­X©6;<³ 9=üÀ`ÈzLÆ(TÁæAÜç jˆüŸŠRa6¼d°¬óð5\ڎ)°–´C*,„¤uð&šYéA wð+`yEÝv!tËí®b=mAÿ¼÷ÕÛ$x],m°r¬ŽR\¸"»ÁÜ:fä—n=P:–Äò†,mÄpÌ`e—/ݺäƒ< g°ºƒé]—O~ùM«äÅMX~
-*€dbˆJvYm,²,¯ºÎÂ~kàQ»ÑV»É.{oÃCFö>zR¾iIÒîŒÙ3”ÓçôŒ±ù4&è/†D%ÌØ}ëH—ê®ÏhQÉ;š[ºûà£=‡Bn›±LUZfÑÏWØé¡ ïô­œ‰$©
-}wªx±måVób_òb_Êí=jäVëhpWˆƒSÌez¹}p¿ØíPd¥¸»°ò Û÷£¦*A2v"`Fô2ùå[ʳí°E§­øœ.tS]ÛDgÚκ¨sd…„秆ľÖ1òބާV0[©våÍkàš½—|…J4.Ã5˜ŠÿŠ‡i0ýö „À´ä{j(*6²0õãPYJç×¥9Ÿ°‰¡ Î.@*Á‹¾(){tcäüÍ'7]R;QW„½.)ÃIhTòÉñOïâ
-ÉúCP]ƒÏ`9lœwOh´Ya5°/?´ÙWÙùâ·À(óÈùFDtN~ŒzîåÁûO²²ÇÛ¡—yüaNø"SFzÎñÁÛöö,RøoXjåŠÜDªÀ'÷hF¯êÖ—2óæ\þ¼ù,oŽÈ$*îÖ¦i‰Gª+TžŸ¬ðb¢ OìÂ.ˆeP¼ïN1”ÉÏUüJ
-! 1&;§bð=-L¹s±í»“lãÊ~W‡˜ªL/ûÒ¹‰ -·y²£wÎtE”.5<t¡} Ý}@'fúþ{¼ú¹fbÌ`˜o ‹“Ú¨®á]ù]°ˆ`€¾Ñ›]&QÇÆM"øÞ¥a`š[*ÂVšÇ5Ø ÍM¶À¸«|óFÂcæÑð‹;ëyS&çÖ£†Å,š{êZZÆA¤uµvæ›%Âb& -wÂG»@3²¬/âÛ(–q¶{¾þ–¼~LWaÓ¸‰–rÁl.¹êp]îC"ëÜÀ%aèt<Œ+†0j x¼maçÐHWg$b€õ‹ fA†“ç– -“®•â¤Ã¬ZÿCžp¹Ër›;Ú8±Í-†&.Öæ®7ñˆï%S=õÂ!„,¹Ë4דk°¹4õ $wi&²\ñO»\‹ƒ÷4‚góœj€†Ù`„r¤!×óMr§
-þ‰ý .J -d@ê¿´@Ês”b)¦¥ò»k!ë©ñ^è·ÁuÓÁ)yÃÀ¨ßyIXº!ŒmÔ1ŽÞ-韲ûoCåáeç^zã'[ljǵßßOh–ÜþâhÇ°¦Î<‡¿Vaë¸É7y[7Ø^QáýæÉj{EMéÞc äÖ_*uÈž„5 Ɓ0'—òø0ZÜQ¨¨„ÕÕ͝wA¥”=}p·ì%¼w¦Œb‚g%ńó+qùµŠ´â\¾‚Y§€yß³x\ÛÂO=m´a\ãpi`ƒÍ}ÐC¥áæ"O­ÿÌ}/«†ƒr' -»øÎû7ëUÅĹÀí‚ ë^¬ÛÞV*¢âU%¨|+§© ÀVꩨµˆ§Õ¶õ@$mMÔñ0€ˆÔâ5)F«‚T£‚r~tDb@-ˆ´b%©v–ÆÎ"¶¶iú‘6¹Þå½y3ó~³3î®~2×ô¥faõº²ÙáSI‚)qûäñ0—÷Õ%›óæ¡ú«çŽtæiÏæžÍ­±¹bl ƒ3 IAÃýo-èlm:tÞ®åÂsV䙎ouåeägïöÙò¬b;?ýêáPƂGð _TOX€ž[´—˜»…ܺʗħg}`Þ"š·¤nݐåJg:Ò6Êë`ö¹!Á£®DØ˃[ãCP×E_ÔlÓ¢&{š~”€ê¸ûà-b¤ËNffٍÔF®YéÀO<ê£VÆ.¡ÂÀr›Ÿ¤HŠ*ɳª*ÒH éÐ]ÀñÁ$d#QׂîšæëÀÚÈ&eÎM
-ÐËH«À©\`ÈÍÚäH›øû<Ï7À#‰«–WSžè€êQÓZ@“­Ͷ‹ÀKU£?º‰ w©_uT/Pfô‚~¨»B†5Þ8ÖT&îd¸Í¤ÞC¿v¾m‡ÙÕéè$7QÁþÁžóíp:2Jl0òŸԃ¾Žžˆ^€ºf¡0¬®õÁ!1š™š¿4B@ÖÐ.9¢B8Ùd‡ÉŽífŸn‰ëê–M|ŸI’Míþ -lÕΚºÂ¢,˲Ðs,×eÍÈÈIÂÖ¼"†DIÉÊÐ䀑Jë2ŸÛMÅîæÑ-ƟtÚ+ñhvQµ9­-=¨ëÐ[„H—,¦É~,FÀ°hR-úµ -׎ÖWˆènÝ@œ fÄ컞N͎˭‚q+aˆ"×&›¨¶«š%8%9Ã0 -fËsî9¢­-©9sM¸_±èu;%¸ÇžÌþrÝ1­#5q¬0}‘iþBy•¢›á¥Ÿë±T>ŒÐÈņ¾b–ë©ïuç;bi.½°bcojÿ¶veÛú;r1ϝè»ÇÎË\÷F6‰µe ÷ó«îˆò7,—f…Å|L`#£\ Z%8‚­ÿR9§?wêXƒÅÊoèË\YÏaþd~}éQíñC'KN í¥ÉQ"þ,QYú÷MöGsŽˆŠ_½R{nÃÊÓBtܪ„ÕbÃU_§"¤&ÑEý=¢1ŠT…ÿÇ=âN7?‹òŒô¼¹/2yðûž ã"`0NÆ 0z®Œ'²Ê,f@)ÎFšm}¿Klr±ÿ>À‹ž4jfo„9¨yFån¢òn¼ë§Ušbò®D_ÅPT1ÁMD½Klŵ•-á„Bú.Ü1,&<u¦I)¹­Óð$Ubÿý7Lþ -Cÿ“Ç%–këM%ÜåROW\Î45û´J\Çs—Àµü!íe6hÁûÁ«”„v?ëLÍt<uºPõíS§)[ŧN•µNÕÅ°58WÂd~Ì®«à)€gÇÙDXˆí4 -¯=Qþu«ã½°BDpÛ¬¯DâltÜ$—Bûc;ܸ,9hbò‘Ž4š4è}¦ÙU]„±¼*~{Æ&K†`Ìú¬F趏…‘©7¶ô -a#¬ýê`iu¯2¥)ÈÆi9 >â‘I­K©îÐB—¿cÑ©2´§ìå4ñ¦M—ˆJ5;®%õÝ'§’q¼«¹Â@²\¬ž¥Gx_†Ë ´ ýÜR}*¿ã,ë4Í &¾¬ê© îËð5X¦Žb`6Zq!ÚÔ- +%PDF-1.7
+
+4 0 obj
+(Identity)
+endobj
+5 0 obj
+(Adobe)
+endobj
+8 0 obj
+<<
+/Filter /FlateDecode
+/Length 19263
+/Type /Stream
+>>
+stream
+xœì½y|TEÖ0\Uw¿½ï[:ݝN:K'$$B ’ˆ°š#a_THM!*;*8*àJÜA¥IX:®óÌ#Ž:‹yFud䙇AFI÷{êv‡eƙ÷}¿ï÷ý¾¸MÕ©[U§êÔ©S§Î¹uo@!¤C­ˆAõu㠋M7¬8Šn€Ü¦·LkîÝÿå!äý=äý8cébÿOCžù ¡²U “g7ϹEüúpB¾qŸÌ¹ù¶ÙmY˜EhHBCçϝ5mæzxh ðр¹a^!ÝmYá>sî-‹—÷sº2ྡ´Œ›Θö៿Ü»®CȽÿ–i˛mœy”„úþÓn™µçú¿Bèq¸%†æ…·.Nä¡OzÒH˛ÍjþïQ_Úʊ!dú­:6ÎzǑ,yÿTCÅßD—ˆèõô^
+ß5¼îÇ/ô‘˜ u%µ>½
+CâcÐ0#úñÇo7¢‹%}W'ÍÑEQâPðŽ #*D¯ú%PÊ0’£P*rr%Ѐ' ™÷Ñlb9¢XB/¶å%ºÑòaЪD›ž0z˜ÁÏïâ>ˆÅ%ÂÜ® œH$bCÜa:RÄò)’Hy*ìFÌ¯Qs‚EûÒPvÚb_@¡þ’îƒjÞ­h„§!”@Ê›Ò‡éñªÐ¿¹¸·Ô°Â4q“ÐÃìhkªl ôuïÅö¾@Oð»Ñ¿/GQZ·¯¤GAy>¤ä&Ñ1Cþ$½ÿªo[Ð7ðÖœpB½jú ô˾±öø³ò€0ÂFS¯Š_íùàþ>HkRã×BУÿÍÕ7ŽË/J×ÏÕýßñóÿ‹ ÆuýÿtQùøNj½5qáó`n¡«×Õëêuõºz]½®^W¯«×Õëêuõºz]½®^W¯«×Õëêuõºz]½®^W¯«×¿ºHê˜ÐŠšÂnü¥ãLL­så… Ë!$"¤Ñ"½™Åj³#'Bž´TÌ¬PvN.
+ç#TXÔ¿¸•(XŽW$‹‡U¯¹vU{BuõcǍŸ0qÒõ +Q4冋½Ì¢Ñ|5ÙüïFpß¿ ó÷Ñè ú?¿XÔq„ž¤o2PÊEù¨‚ rTƒF¢z4 EÊyh)º +µ¡ý¨½Xßø-~—z.鬬"ÀˆªÐt‡PšƒnFËÿ+ñÅÿö7#ñiâ»Ä㉠+‰µ=Oö<ñO'Ïÿ‡—R5A©rMÅàAåËJ#%Åý‹
+ûä‡órs²CY™ÁŒ€ß—îMó¸]N‡Ýfµ˜MFƒ^§ÕȒ(ðËŒò‡kšü±PSŒ +GŒ( ÷Ái1í²Œ¦˜²j®¬ó7©ÕüWÖT æ쨩$k*kb£¿Uäû‡ý±ßTýxòØHßWŒúc§Õôh5½YMë ‚¸snµ?†›üÃc5KçnÞT +ÍíÓÈÂÃfÉùhŸ¬¤R1G°yv Áj‚8†ÚG¨¢bî`õð˜+XM)ˆ1Yç͌Տm^í ¢ù1<lFpz ‡Æ aµ
+¦vã‡Åµÿ<:´Ñ¿/¿{ýF4½)¬œ9톆3-Jû0…¡ßê˜ãö“ÎK·Ð¸yXÃÚËK=̆áÎy~z»aÃZ¬{lÃå¥G£Ðà’¬š¦ +5Ðõ½ÀÄÚñ~荬Ž6ÄðjèÒOGBG•߬àpšÓ4ß“‚Cƒs7Ìo‚©qoˆ¡q·ÚÝn¥+уÜÃý&4±JO0:­:mŸmw[‡Kñ»®,)Èßg4%»OoH%´ºË³.–©)µ:MՎ»ÈYL)
+Žˆùgø’† Œi f +Df „jpE1`ÅfŒ̋IÚ6Ñ|Š㲌Aÿ†¿!€àéï®Ì™–Ê᳌C4Iå䢨Ay_:Çòò¨ˆÃ`NÆ!ê}iAþÒN2 Ølôö¡zàí´è B` @'xc§‚¦ÃM¬ulCòޏ¦{ڑRŽÆH-éî+±M¤%­}%ћ‚ ÉûÕEo‹‰¡‹ÿ F»eøÜA1lÿ7ų’åµãƒµc'7ø‡ohJñ¶vÂwÉòËR©˜eXã!©ñ0j)å ++ӛmŒÍ‚¼*Ô3c ¥šý51cӈd•‰Ó)ˆ—!u&ÎP,\BKQ¾ò~ð÷WP§ÝÀ½lˆÔN˜¼aƒ|EY +(  +j‚þš +M¦u&Z§ýÆà†.²“ìÜÐ<¼©oB;‡7zb5÷Fasñ V‚†î âuc÷)xÝøÉ +]FÐüë&4´L†5 +î˄²†.?¨\5—\Ì¥w~z‡j1z;Õ"O—‚P«ZʪêýŒNŒÔ<±/£$™gTóà*@û&´Vé`ÓÛ  #Ä~m¤0/tºb¥ ÙªÂv{¸¸+Ñ +‰A%j~ÁCÅ­G™=h**ì=íiöž¥ºX…%ƒ“°°¿
+ÛÅd±`-öU¹­A†TªÂ&Û!¼‚ö Ï!$ 0Ì.æéö´ð4d¨²2ÏÁ¨ˆßƒ€ÀõÏÁXžCߧrX ê™IK»FÅò0ϖb#„V{!¼C !Þ!ÔÓPö4"ÌÓÌSíFŸ±JfžD+!æQdÀù õmF•7t,ÅJ•‘yÕC (ƌFÝ4û =€T¯m/诲°¶CÖ¡þF z#²ºlƒ«÷
+Zc‡ÅN›¿§Ý`Rñîh/Š$Fgq=pa9ÂÌ,f
+"³`:À½§33‘N¥Sé0‹[¡¿J¨^ÉØÀBñ1UŒ¬fÜÈ£V[Ò®Oö³¤='¯F<ŒqªU Œ #2B{±Ï„QTæ¯ë4”¾uíF[ñ1f5#€äcZ¡–Ãg8ÆÈ0³²:’ ’®xs•–™Ãœlñ¸¼@mhA;4Teb†3iÈe71^dXä«p'óR>扎Pš¯ûó ŠõKÚ(t?$)ZC:túâî*‰¥1æ~˜€ûÕÎ7w„£ª“ƒŠ àñJH­T…~¤6À¬m€™Ú3µˆÚ҇˜õP²ê2·£ffÚ a;¤©XÙځ¡]j"3§¸‹q1N`Œñ°C®»CÒSʜíf‹ZÍÙ¡ÕWcn9¿ÚT˜ÅgñÂ#Lž:”ü§‡"4·ƒ¸cÉ©D;’cL0‚2Æˤ·Û|±*ÜSAöÙý.9N™D> Ñé&ïÁ=…¿NÁߤà&a¢›O.
+ò[
+{ªÒȗÐØTò´R„!¯ƒê#Ÿ‘NJù”t¡J€'à~&À.€%·Þöu’Î@ûcí:;,y½=\˜Jø²R ‡'•0ۋ«²ÈkäU”M|0૤,gy `7YŒÞx€”¢Á÷§à¯ÈQ*âä9V²t´ë) ±v‚½í</µ£ä]}¡ï(y‰ìAn¨úb{È +¹»:B™>Ãh“çÈâv¯Ï\%“§p> •ÚÐ
+‘™<Ý^FÙÜ~Ôïë"›ÉfÅY¦d)ʦ(«¨ hãÏòøËü;üUFr?(íÖ/Ùqò
+„Íd};[«ê…1ÑqÔ
+q›šj‚¸YM!ˆKϨ©J²ÕA ÐÆ
++!´B¸ <Íävw@ø„;՜Å–@XÚ¤0š£0šUŒfÀhŒfÀhV1šÕޗ@ M€ÑM€Ñ¤b4F`4F“ŠAémŒ&£0ê£0êUŒzÀ¨ŒzÀ¨W1ê£0êU 0ÀPCQ1ÀPC EÅPC EÅ(Œ"À(Œ"£0Š£0ŠTŒ"À(Œ"Ã~Àð†_Åð†0ü€áW1ü€á ¿Ša #`èbÃFÀ0ªFu~–@ =€Ñ=€Ñ£bôF`ôFŠÑ=€ÑC–ícŽW½(Çå8 WQŽÊq@9(ÇU”ã€rPŽ§†¾Xe±Ya%„V·p»·p»UÜnU¼–@ ¸1ÀˆF 0b*F 0b€Œ˜ŠŒ`ÄTŒ6ÀhŒ6ÀhS1Ú£ +0Ú£MÅhSw Šñ/”ÿ×SCî +"쵤çªp%úN…+Ð މö©ðh‡
+ï@w«ðvT¦Âe(¤BhO…‹‘OÄí¾2C•T@„©BØa/„W jê=ŸCHR%ƒ5uÂva¯ðŠÀízbàëøíü^þžÛË÷ðÄ_å!:U‚jA›Ôx%ÄßC€MâJ5UI"Ðoôl)ü"$¢˜Nû¿ÏÃïåáWòðÞ<¼)WIäZ̪šÎÊÀöáEâ;¡,”=4Óý¿søÚC|øhä*a€ßAØa„»!”A(†P! ‚OÍ˃ú +JFªÉ£²! øiÈn¿Àl•.¢Ã;:ÞÐ!‰ö“xGÚ³‹t¶g×8Ԟ=ÝW%áƒ(›ZEøÌÜ€{Û}'¡øÅ$x¡ÝwÀ®v_@c{v?SÚ³ã«Òá‰ÈÇRÔ )8ÆMá¸vß$¨6¶Ý— ܞ¢µó £,(ÍÅ +è$À¬Vf²§`»o0€Œv_9­-¢l:ñ˜G*y
+™ èû.ÜÀbEã;í{Ð÷ ÿ âñ©¿“ð^V'ž¤È¾£OBå*_{•LëÃþ°/cðíÈZï{ ÚÂY}øúùî/è!û> {½ÚE»ïnðõö(_«¯È·¸à¤ïVß(ß4ß8_cä·ûnð¥d¢(n {úê¡Á‘0Š¬vßµY*‰5¾Û|Š/ÛWî?Jù‹&Û-+8J9€Š“½çó²:©ŒO,ëÄ&%O8#l¦C…ÁBPÈÒ¯`Í¢QԋZQE‘Y‘ˆH´v&z”0}fgåÕÏx–Ƭš6ÓÇ{à0,4
+Å,L-©?×ƺg ÚéþعñÁN,ƒ+Ň☹ÕN®íãbeáژP?¥aÆ÷G!7Fց£2¡¡'hÖj}f±£Õ÷yºÆ®Õ÷E£Èi_Zé¬41•×TÿLԔŠÃ—.çåIolKíø†Øno4VL o´6v}¢ÑE D7¼º‹è)ˆ6t±ÍÄ0|Íg›«£Pí¤Z +¤YÕP6PMŠü´蓡´ÌQ²^С^€¨'ëPH­’uj=ÓzûNø‡WïóûÕ:YPëœÈB—Õ‰Üê}¡Z+èÇ +´núUÂrՆ|>¨RàS«`°ëԆ|Xí,Vx©JVªJéÅ*¥j_ ¾TǗ¬cÍé«ć:áÿ—׬¡aÜÑɊ×éC¢¦àðYšb—ÎuÆZ§ûýûV,I==
+5MŸ1—Âi³bK‚³ªc+‚Õþ}ý_ÿ™â×iqÿ`õ>ôúð +û^WfU·÷WúN«ŽvTV4T]Ñ×ú‹}5TüLc´±ÚWeÕÏWÑâJÚWí«ŠöU©Tª} +ŸGå¾¾aŸˆ†F‡Ý„D#ƒ 7yÑ¡vcó*Ð]ƒÎžÃ,»&iƒCc:´¨ ª ŠÁ:£Ezú$0Uä\18à9Œw¥ŠŒm
+E}¬E´Rm¬tlm,0~r•˜2íççìVz©ÅN4|^5üƒûÅj€ßå5Ñ­?{-þ¹kɒ%·ÒhIøV„jcyãkcÆ%‚]5UG!¯__èyû$ixg¢
+Ã@^L»£©0¼.´ñm¡®Ââ··xá1ØÁWB?Ž,k/TÝg²¬##‹ú/‹;
+K“ÜU
+Û݁bè¡£ P)ÌJBÅT‰ÍY› 6—µeµ´•ñ{pdúvЭ´½pƒ‡oíc$GÙ@íï©ö4¯ÚqM„ÃÑð­Xå×?3÷1}ñ%ö§ Úüâ¾ Iæߚjf"Ùû’>´%)$µp‰Š”l$yw1ºtÁBÜa”¦†( +…'ûB|^â$-£| šÜ› ©«½€>Á9؏:ðÈÎcîF‚tþ¦Û^ԋ÷~ڂÍà³ÙÑD4³P'Œîŏ%–&¾A× _¢§‡ð݉ÝP¾ ½‰Î„² úÑ,ô +ó%Š&E"Z‹4àӍÃv4 +} ¿¿ +¢‡ÐËø‰óêYÊÝÐ^ªBU‰WPº—Ý̝ ÐÌ'f$恅”6pâãÄç(„¢èôÐÆÝì@7¡Õhv1oBêaô,Šc-id†q¯@O#Ñ$´-CÐnô.6ãzîw&qGâH¡åMóÐ7¸&ϱÚĐÄgh
+êBoÃx鯛Âîä¦Ä+O$^ïû–ñQü*WÌÝß{Wâ©ÄKH ôôŽŒ~¦£{Ыèôßè¯deb%ÆCÏo`/öãpücâ"+È
+æÔFÛÔ.AÛQ fä0:‚Žo~‡zЗ؊=xžŽÀ%Z2“¼Ç<Æìg>d1û<ð;ˆ²€G‹Ñsè úôôæ ý"\çã…x+~÷ùŽüÀŠì=ìOl/Š÷ÄJŒIü +|n7ºݎVoŸAh?úOôú+útñ@<?…c¸G$’AêH3ÙÞó‹ÌææU¶”ÊÞÄþ†ýŒ[Ãm¦ ñ ;âÆ_Œ¿Ÿ8”xdGí‡P +pô.ŠçÐ+èhýSôô'*?Ðþ`<߽܊×á‡ð‹ø +ü>þF‰Ô_Lª¡×…dðénò yz>é Ÿ‘??“¿1“Á `Z˜§˜ÓÉg¾blˆíÇögëØÉlf¦˜»–Ïíâöp¯qgø
+~&ßÌ-Ü-¬ÿ£7¯÷qŸÅ;@vE¤ÛO¢§Aî÷ü ýO ¸…YpãκËq +®Å£ñõø< ߍ×â_âmø1ü4~ Fc Ð&Ud<™Ff‘Ud-¹ì‡ßaòù˜œ §rdÂLf$3™™Â,€1,fV0«€³0»™÷˜˜SÌ×Ìi˜5›Î.aogaw²ûÙ÷¹ë¸[à÷4÷
+×ͽÏ]à.ð„wói|!?ŸßÅÿIà…B½°^øPø±§á< ÜùÉqÁL'»‰•]‰OC†¼Œ< ó0VÅÿ J&ó¢§å@›¸X Åä6FŸYà#¨¿Vò„ÐíAíø÷¤‡}\ƒ>ÂMØÅîdpï’ÚÚh39JŽà¡h?© “Èã Â_®ø%Èûrô¾ ߊöàÓx¾—á•èCbgÆãU¨"ñ4a±„Gâ3(@w±3эÿþÄ—£ß£oâO²:ö Ÿ:јÑÐçøyô#æ߁vc@M-s/ÈûjDµ^#¬³•°] AnæßCûéé¶PÆaoGgÐßÑ7Üa¨¡ IOÅç±O²_$Ê°Â`•¡]°îæ¢kaÅ| Rr îéÝ +°ÒeÐ%Å°ªëÑd4Ý ZïD,ñxâžÄm‰…è׀û#ÎÇ?â6X€QÞ†ß&ô)ÞëðZôÿèŠÏDÝè[ìÄY¸ÖÃin)·™ÛÍíç^æ~Ã÷n¯BDÿ ¤Y†Ì@ï£oÑX„¹q¡|zí +èfeŽ¡a؍šaÍ怚ɭÐÊÝÀ½Ça=ƒµqôÄ +èetì€̀þEh§ø<jw@ÎLÐÚyèÏ0n=y>R ¥- µº¦ß£¯€Û •®|Ð Õx´õº̈́ z¼fà *ÍZÍüð;ÑPœŸ¼&X¡zäEåܘ üø˜Ä@29{LòÛ`÷ò kp Pa€qô"®C¥ñq@Øacø·*Y‰µÌ²øÍè×èy˜…]*TÓå¢~? +ÝOpœ:I¥bAg,°qŒ\"ÏÅ s‡JӉœa㹊ފ1Ƴ£{+P%¤ ê_0LY—….ø™î
+‡~B~¶›¾IÑ rü5ìגЇI Ґb%,sŠË1p>Žp“Ł<CÄ˛4Xãr¸)ċ! +a&DøÃä!0¨R´„n›0ƒ]²¦‹¯ö€—4ælcÅè“'§“¿1Æᳪ¿jò*+F{¿j ÷/Â5Õ5՘*aXƒE#~+ävò5nˆïêuÆ×`WüÐM¼Áã>}âo4 ;{»2Ɨ¶0 +§}äM·z½é^moM÷û"ùiEÞàɁ+:é +çJ'sžô¥ƒú¸Æx +¹Æáp£>¡"{Q>>“óo0ø}~âïĒâE<>Ãcþë^¤Åg´X{CÈA®ŠÑÜaàqãèÞƖs44¦cúV1úôÙӅ'!2™Ë1s¹­ín¼Óø«þE–È€’b»ÍÊ3BeV‡½¤¸l@i$;ÌxÄ%øߔG_|è‘iø]À•_àòû]ù®®8Îèލ¿ò▭—
+(„˜­ãåcoBx{SÿÌÌþ›6eeöÿñ¯ùié/¿üƛ/¿ü–šµI-¦®÷Mñ±d.pوj}Ža'CD #ɈÌâ1œAÿìÄæ\–þGû˜Ÿ-b ÛI¶t˜ž»‰JaãéÞ³0Õ¨²ÒXaùÍ8"¥Fˀ²BlV³ÃNf½úHیI«º×Ϲ¦4{
+ÿõØîHϱøûñëÿòl|×c³)%ÀE¥d¤âÌ&Ùò2GÞJv’]zAþ™”&«@¥i¿ø?ÜcZJyþ0JÍéޓWc”FSb7Û¬a†¯”6{ý+[w­}!>¶ýåóŸ/ù ~~O?ÿþ÷ñ³ñŸ(%Ñì$öC¼ŠKd$ÂM/b†0edz%ªÙ§ór'yZ1rxzÙDÚC\ڋòrÖâITØx¶·ñd’”,SàâoÅ­á»â+?€­IÀwÆï‰ÿ=~í{I¼ ?‡é.Zy@5¼,tâtÅÃ?Žjdy ™X~T+Ü¥³4ÕåÉ^7Hc/6•#Sy9ˆ^Ċ² ( ދ]yK&—MAÖa×;·ß×ì_œ6}"íïAˆ^€þ”©ØÈ@$“Ðeí³Û省÷/*ú¤+,QàäÄ)VÏuƒ&ô£•Úåò:y'Þ-ì–vêIoKâ$SÔuOòÍ1͵ÏuÏñ‰å¤œ +Ѝ$#ùáRn§ôkòÿ+éWºOÉïø¥u&£Óï$Nêde™íçQç3ˆA;ÃÄyOԁ}êΰžÐ¸¼¦Ò7”͹–ÑÀ‚Óáèä£ÆF\찛Œ¬.d2– +pdðo2Úa™ +(`2†B¤ø£å›6/ûèãø—ÔÛ½‘º’$ືíO7ÜJj~òà–oª&܇ëU¥jÂÍ°+‘W«€ƒOƒò$4I‘n"w l'Îí˜Êa®“ÜxH”8Œ´ø +ô7Ò¨è8ÄúX?cYÖ%Æ;a·N2ºb4ÕìªÎ<Ûx¦5&^(YV„â§}&E'Ùàæá‰ÌwÖÐ9,;I xq¥2õ€ó »Ëó.û–ó¸ó¸ë¸[æ–6Ì;Éõû°s7»#MäÝ~”×¹G°ÃœÃ\ÃÜb¦3ӕéfì!úuÎÇ=§=îݝ¶Û+š‘×èõ{û{—zWy7{?öŠ^:/v«-â%F­Ák„y'TV êáNòTÁZ}Ôôi µDKçN»ÃÂI'ìvØ 1rû 'ŒËˆ+½oϪ3
+•®ßÞpËIØԍ-ª^- 7RÇyÝí¦rJC»AŠÞXΊÆrN44•'ýÖè>ž ›Ð h$ËC<L-L“ªš£T2jÇ6CžDJƒàMô 80Š[A^Læ²Tƒ
+慬™Iõ,ð,/°Ú Ùƶï^šm˜+Æ¿vañÍOÏ_;º$~îZ;æâ?=„¥ßí«¼~⍳æߑöõ»ß¾4£czÕÙú¥Ñ°V<0K¹èS¥x­í¹#mcÙÁ<Ïí´ds­Ÿ9ÿàíV|Ÿý> È:Äb‡ÅðéŒZ¹g*Ú:Vt›tD§ÃöNLƒÏRh!Ê^ˇåŒ W ÀœbÈfwdëbÚn˜­Ýxb¥o“o»o¯ïçëNÔeâLwØ~± Ÿ@®¼‹‹élj9šÊ SB#zÛršîtTͨ,¥\¦ûP£%K][*÷„2ûE6!%ÅôM>Á
+fdŽÆFÝ¢±×/[4n@­oÑò†‘#fk⽞[^¿í½;ç|°bkü«ß¾ÿ¯Ì]°ªyþ/l_2ó®Õ0³)õö)«n^÷ꭞ£«_Ÿ¡ÇÌS€¯¥Ü~£’+êýÚ2ópóH×#º'õ[͟é%³Éb˜‚æÕfXtX'kµ:³ÉÔIÚ»^gÕëufÙJÍ3õx3,ë+˜xHå¡GÛÌdEç“ e"SvË;¬”Å«=â·Y+cíÄ{«Éä3I¡±ÒXgdŒ´ª‘öe1ô¬ÁL?îÀŠ;Ü>}'(fÝ2|ô8Â
+øç{aÁŠèÂצ”‚“0j‚*£º& #|qF[`ÖrýÂz08ðÅYQgäŠéȶÀæ#€¹`@#fNÁNíÒÑ +·ß6í¶¦“›É©Þ¿äß8ýfçmŠÿ:ðmÞ© 7m^»ö¦ù)þ÷¿ÆÏ|zàþ×>Ç'¾b=WÏDEXw Hôú"¡ÎÄyåfH¼ezËò ÷‰À.1.µ®22!”§€kkÐuÚì öÛ²ìµÙ[uۜÏêžw>ïޑ¾3{GþóE]îCéŽe–5–5ÖµÙìV0ŶÂü¦õÛ©°DÓYL?ÊÑÊ~uýH¿Ãä~XÀ݊ÑîŒ4§µ¦‘60 +Óxs ªå(9$§“ܯè̺ʌº ’A±3hŽ›ç|'¤eáulp»N0˲NØ]ýÿy +¨›JceocبJøtc˜.€F(·SòZÃa
+•öÙtª´³ÁŒlše±^œ
+ž¹,GÜ2ãËÞ?5¿éö•ñÞOÞ^ýÄÒ®©uõMSnjmr/‹^¿hqtÎ,ÆÑ辶g?þøÙÙÛóú½ã×ñy¿8±ì-<vS'ÔMmê½fñÝw.sçýtO®‚Ù±Âì8PW›jM³4·‹ëÅç¹çÅú–¨‹9 ï4í·¼Þ5u[LË$MT7Õ4ÎÒdá]Ü2û#Ž??·rs-àF`Áiöy
+ARÞyv8cÀ Êd#ävI¸Nú\:#1R'®ëhÖPà2=äQאMç<QgÆfw(›eé'´®Ìb¶ªiÎ6‚À§öqÊhÔ'Îè¢D—ü’Òa6AŸ„°ÊK›Ê×Fl”' ¿þvÓüí/þ„¥ß|ŽÓãÿ‡äÆ;Ǎ™Ó<aìB<>}|}ۅ;°æãϱ)¾3¾$¾ þø!&mݖ;î½ukò­sîð•$ãª.$$N(RYy„ρHP,§4Â+ÁÝ ¥> +eå¢<6Ë‘ µQW©æ“YÌln®8Gþš1Œâ15°Y’XAÂଠV„^bY?Ç[9ŽeÅí"«ÊÅíÈY„ax–ž•*z^ Ëb$j©SÓI¦)Vɵ‚/ÖI2É'á"©U"Òa’‰X¨!ùÁ
+qinœÑgȹ€» Zœ½ªC#uШS{n¸‚*“µwþjm?'‚±¢bí¯~•ÜR÷KIAaº‹ÖÆ4ãkcéc'ÃÆÌ$âí"+NāSöñìÀ©=5¹# üpÀÂ0Ü+ñ—[{Þ“ ÆåyノGÇ;¸Ã6oõƒ·ç§ç-`[ä£Jå²<<W¿<ï+öËJ›Äçä²ìfŸ­ÎFŠl{mÄf³3²ÌÑo͈x²›ùVžðµ9Ù{AsP³DÒD@ß«Šú)ýêû5õkî×Úos¿¶~¢¿_¨k†ù-E°•v’ýÇ÷c½`€ÏNn†ª§MƒªT“Ä–hm÷–Û¨I⦠uŸ…Z!Q¨t™ì&ye G²øB·Ê@q:éS`§ó\ pÿ¨^ÜãÔM(¸…ŒziÏÚÉ §®ÙÜøÔÒQñ/ã:œóڋy×]_;*ÿýÝØÜ:^¹í]î°÷†G¦Îy!œ}tåÌc-:‘°oÆ_ä¤ë¯­ž(q½]ñ咶qÌÐò¨=2-qŠ»ü-7úX³FZo]oߎ¶ñoI2jþÆHYRŽ6G—k͵/á–Hk8Q°‡ÅáÈ%yL'äpp[¥w˜74\%®ƒ}sœát†>h–›œÊ /x²âp°¢^ћ#úÚ©LÕ®bsFÀJÌQ2Ì2cø^? }Ô¦ÜE ÊmÙm6>¡H`˜½ϊñ÷Å1FÐIíÜ{6œa
+i¢‘Ú̘sÏýTAü»ƒ QÖ?¨¶û†Æó]ü÷ñuøvÁº]3‹ã¿s?·ô™_¿Ý¶t7ñL9ó +ބ'ãøáí7Æj­ú6þcüÛï¶P +ûHè4P#8J+•’Xî×:f±³´\ž£Ü1µϵs厞µžG¸-Îg¢bi1gŒ¢+{¯€…”LÒQ)–ÖöŠ@¥šÌ …Æ"#1R)ôÿ¬^A:ÊLÅÈaWÝ[žþ‚I!B¨Ü€=D¼‡šîêl*(›=úžéÏö~€sþð‹²S+*n?äw8-ôZüÔ¸§mFmž}íB©Þ<éÝ»Î6멌< žÅ©mV®9V³x³ÃEÜ^ŽpœÄ°YàÉR–‰_ː2Ò`Û¯+Ò):FÇJ~LÝ ‘öò©X®òيŸYV¬'o9ë –wŲb8ÐHª'j ¤ÂÃlå…oHO¯Ÿ)៏ù!ÞòP¿¨_ÔKh‘R Ôó\–à‹ÄWÄÏE¶PÜ,QDÉ!H@%_ZcƒàÞí×iˆæJú埣¿1é¬õV˜)ñ?GßVætï`2³÷qJÛsç{ œ¥Z.Oåì3J–Är2C$9‹5ïe0à žã€A¯œèçߣ2C6*Š®^פcšu­:B™Ü¦ëÖ±:¢I’ÙM½0•ÑK®EçSO
+Ue¥Vå4£ršI*0
+þÓ}ƒ¹øۂsH5ΉŸè=Êî}…TýXCîê] cº¶ÆÄ …ê vG"õ`–
+•J«#‚8…«çZ¹ŽóqM\3w†c[9êM3H$̧¡êAL7Õ$tPÇáŽE ØþÛS‹Qj(•ê#ž–E@-¥ï^œÃþ±èxæý9î%Ä¡kw½@ÛfAc!‘åÜa.ŸR¾×åS§íŽîM5­ŽÚöŒ·‡{駑?ÐyƒÉé0Ò§¢Ñ0!1¤aX˜3QEJ‘ýƒG¤ÎDOG
+*Ϧõƒ\ˆxI”¿¾“a“e Ic’O’|Ö/ÊsÈ\v–4_^F–³ÏJ»åÒaùœô£lßÎn–¶ËoJïȟìÇÒ§ò)ò5û¥ô­¬[&-—ï!÷²÷H÷ʛ‰Ð ™Eæ³s¤¹òRr+T“Z¶Zª•¯¯—dÁ)ê#d‘˕z!Z–—$ÙFܬCR³%KœVŠy½¶¶c#CÄzQÑÐH¥^£‹ˆŠ>;¢¡d=®iB#2Ô\$‚ŒD*h•à»;Ry#.<müð4Íðt&+ЋŸ%©˜a­ Í,3’ša´,!Zl$Aôé1øIºúÝ×a2P«)IqrŒŸáŠEX)bñØJ˜…c¿FK:É@Å r¤@E¤@%T죆4££+ÃxÌË°±â/Æ
+·ËØÛÒÛRáv‚k† ãÉêg©Ë¨½ÒJÙ=–ñ°nÄDÏ>Ÿ9ê¥Êa…[¨Ø`¬>èeü>‚e,à£ñÓñ?Ä¿ˆÿL'óõ5ìÝ?­ djè‚ ÕSø?½Äð¢‹qˆ¬Vpu˜5•t]ÒaS¨äÁˆ˜bA´
+‚Ȉ„Œü^1,1KGÌóï©OŸ6*.ES¯iÒ0͚V +iÓtkHR·‰RªQI}2~|D*¾B‹È—i0 Aô)¸S×µpÊ„µýèàCI9¢Z¥G‘@*DRFºITjTã‘j—þEÃÔZ­5¥b«¦TØ5î~q<DcgŠ…ak˜Õ ¦ÛÄvñ$ÃÿŠyOüLdüL¡a‹uâ/™íb³WŒ1¯ˆš¤Q^R!J‰j”÷(ºÂâñÓH°–BÎVE
+ô‹ ©µkÒýp‘HÁI‡O²…Á¤DCá2I¬Ä#Œ&ÅG…=¯ɧäkrJø;Ñd“a”°\X'¼@xªƒ]zå¥O¢H•ªC°iö“l‰Ò» €ùàÇæè…jjMDÁ;v˜yÐÓÊÄ­ÜVq›v›ž±  +‚3Û¹\Zf–™–ÛÖ°ëÅõÚ5úÕæõÖu¶uŽuÎ5n­`IpÛÌn«Ûis –ä*{ö^#Ù(ûeF¦v†¿È«x›¼ÍÞVo›—÷{Ïx‰×˜Ý†0}Þ[¤Îù½i+^¿hb©6Gcò©jåiª[Àn€UZ6 $eX!l5_ôe£ÃŠ_œ³¾WãÕññcñ®ø
+Üÿ«}û¾øáC=äÞmÍíáAàj="¾Ì«¹'‰ ç¢| ¶ÆyX”˔,žë²v9™k9<‡û˜#fS–N¯G#Ý­ +H´ÿ“e÷y‹Rãã¼FÃåZ>íJSê¢%•Ú¶/YS0a`*¦ ò`ÐE`h){üaü;¬·b÷ô­cæ¿óêÓ{—»qDiwØøÃÞµóL¶ÞOØ×âMý¦WÕÏÕÉÐ1Ýáa‡D6@ç•»Ë +# +× ó5óµôéx[ð þ„$ó"/;D»<@_£¯1¢Q2YõVƒÕ8@?Àp­a‰þ6ã²f¹´ÜµÔ»NZçZãå%»UÒôãõKô«ôéŸÑsz¿NkÕé´­Mç°gYŒVÜdm³«ù”]À8õԅÌF:£Žè>ôd·ñ1¾›?γüÚæ ö‹‚$°]εŒþ3.qM•…”¤*ÇKªè‰×eO T¼¥‘2´Øžzâ°˜~$4™.q\›…þ¨õµW›îœßòãEnœ]ñ»æWԍÈÜŠ;\÷îÝÏ}’6p͞øŸpåžh ÷qfLfÃÐQS´ݍG%¾bÿ
+k'W®é2uz漙ς£bGÅæ Ïâfå,æ—ëç|ªý8¨Êõ3¢Á¹ÚÙæ9y9sò—y×x·´æ ݱÓ}
+•Y.wdlÆØ૯ٖŒ–à]wÿ+㿂|XÎÓefdËu‘`­\««Îœ¯›¼Mw{Æz݆ŒòNÝ® ‹$K:>ƒºd—Ξ!de‹“œŠËYèÄ ÛÄy˜ÌBÐBZw¹Ïƒ=VÀT-tû#ôqd=n›qŽán,â¿°Š»ÜÈb¶ Or~Ÿp`‡bqDµBvÈÝϗÝfŒßP‹¿7%'ÐUð۔Ì׎o؇”QՃc<0¼ˆºM-᳍á“I¸(|v»¤êRÍ à‡Ç;øq<¿h·”g{ÀÝ;ífzw\1˜Ëu~s¹¬ÍûZÑk!OW.;i°”_ñ>[ßÃyÛ y®4£ø8R7,£&¸C~>CFô}Ò±¹øì2[ý•F€Òa“nœÀÛ¬;«JõñFa¿{ûÚM\s]¤ë/MkW~ÿ<¶b‡?a¹óλFæı÷–Ü›@¯Ä¿ŒÿöÀºÛÆFFzÌýOºí¥æ×gÿõ]]ˌҌòHVáì[Žm\ñû›0ýƒ(tR—úh‘,”ŠØ"®^j–Z¥Í’ÀcŽd± (9nv%Ýoq"ó‚!ú1½51úzÒLZÉf—ØûBjVÆ6ì#0+ªÑ[ÑðYÕ'S:©B5?aã(¥þþ<>š½/>†}íüùŸè§hŽ‘ T¹Ðe 
+’`%"]+^+ ×K“Œ[Œ[MÛlÙwÙ?±}ɟã5:­\P!Ë"i5~Ý{Ô¨RÝ O½§ÉÃ4{Z=Äï)ò´yº=¬ƒÝíw¹º]Œ‹*÷¿t'N«Ê@5Ã-L‰]]Ú°çõ$˜A]ÐÒqŽÆ²é+ZÝ8§è®/ýöÓV/l‚_8ù–9[^bÂâñóŸm‰N{lâŠsˆþ1yМ`|<Öw ‹Ô 4—«Æç÷ H·ø1þ˜|Ê~ÊqÔÐ]ÎmÅ[È#ì6n»(2HÊԘn—aÁ…ì|.
+ñ#ѵüõ0‹ !~Œ¬0¹<sñ‰ÓI¦+<-ì(L¸Ãdý&Š¶†Å+ÙVös¶‡eÙN¬Qä•L+ó9ÓF?¬ÕPÌÎÃXƒ}ÖV„1v —=kƒÖx¶±1ì<}Ѫ<}¥MyÉbêî0&m¥`&McºQ5”Ôƒ)Æ`Y0µ,1ÑôžÅUøV<êýîðO¯³×€ã“ük ÜxêUâÁÊS&Ö#e'Ëìn‡°GzVó;ü¡À¯ÖlÃ1r[…G¥‡4»ð³ŒäÆ6!‡„(ž$¬f6p$)‚ Ä%ûÙB¹š½Nž"¯bï•`·Ëmì‡ìe];P~}L~‹}G>Î
+2‘xÀˆ¼†eD?Í! y?
+nxÆ8+Pž-LXþ«åè!^±Ø"|-}¾Ù!ºuÀÊ£ôÕܐKj5tËÒ¤š–²ÕEùê¤*ì4$Ï%S¨ð¢[{%o +p%ù{ôSv„¥Z> ß=$™"òˆú RUë´´´ Eýq’Ïôþ[|žŒC؏¯„»ÇâGâ‡I/9ÏşôìÕãŸât/¢ÿ×¼Ñ] >/+C4¥Ý2f–c–c.™ö <ÁjŽŸ¨©Y¬~Å [q²3ÑIæ€TR~Ð(!h›'Ž`÷ûx9ŽCøâv=»C¢ü1ÂÊtO‚7“ Q’rg<w2õ~
+ìώrSÊ·aËèT`T¬ék+Nõ_¨ C콧ðÅãðÄÞ/É<flïQR}áÅÞG@âòØ]ø{؁t­jõw˜mT†{mzf¤6ªGjQE&‰©³L¦ .ö™=ÉÇÿ½ê!K#=µ‡q:ý~_ü;<ÚÃèF&¾fû±CPãe®àÓ8¯Ý=Ê3"mdÖ›¤®×õ¡Ù®9¡5¡_ºtïpwyÞr¿íÑò¼Îfç]öl>×u-#kÈþÿ&¯}%ò©‘x3‹û›òu™J¸_$SÉȁÈå,̼I2kÔóå"½!rÓsð˜÷ï^ÖëÍÇ%H\j541 ¤™*ŠÇ‘Ó t’ÅXA«“ó©m
+e*„bB|¨¡(VMzÿ˜+åè¢>ív-ÿ4.ª¢·G´îºŽ4oï§ê¤$70Ձ?wà:ÇTÇBãp•Ì«ê{âßrº‘>Š
+'ïNªZ6pÓÔ^µÓÂÉuÐ^èÅ-ÑÓ}J'372!sf&i GéÓzFoLnA-tQd çYvcµ;t/æéÛJt?.P–:Ä¢ö²zú¢žãY‰ðoß;ÚYËx²âßjŒ3âÙÆgMzì—o\W¿°v¾qÀ·™e +Õ× +/1jȟú=úPtý¡x罫¯K+s‰55íë&ßW›–åO;|pü·æbgvÅàIÅ¡²ÌYÀòµ +©~Bz¢ ™ç•þšò2ϵbžÄO’'Ù'9£i?|);X7ØRêÎÖêj-Ã= H²VâˆÜôÕ~N°Ò¹°h4$;¢»9§s 2ÐOß´¸ѓ —·2Éѧ{+¾þCÒ{8M÷?P-¸qXƒ¢™ÍϖgÛg;ç¥qàý©O¥€uæäU¶Í¢¾à•ò•Öb×Ýí¯Åã½]Sö)æÈÈÛïY5gÖîpâ§âŸ‰6%ú8É{®®yûžƒO=¡¾™c¯„•àBÿ¥Œm0DÍQû\Ã<ó<ûÎÛ\[ÉVí›Æ7Ÿ?v~Ã#~cùÆvž· ´ ´2²×8£ÚyZa¹Ì^æd–qË k¹5†õ®]æö.óA»¤W%ÔÑ«›5¢/ÑÑWzD…SDw³Hž™M¤@U¤@=T²äô0¬uŠüÓ\@…:šÐêÀÜp{„€Õån¨ºô¾NãèÓ᳧Ãô~ãÉpòù=À¤&ž&Ø'ÏôÊ8>ùQdûÇÿ¬ŸQ7ïΕ7Õ϶akøìo¾‰ÿÛO¿ö%ù®xü„v{|Ê—_µÍbgí¤þåàÝ´”ÜlV
+ÌQ>*GÍIiÙ¢q^’šÓ[ÓÉ &¢d‹¸F1ÕÚQ¶j×#’dUÅEC¥FÑk½¦Bväêu!L%Å`@îMTv¢ËÛPqq„-ç’£ZuIZõŠ@Vtóøyò<sRZøÆh Pš xÓS_.*ì´øOUû&Šÿ­ýnìê5Vß>mݪ93×>>%Š³Á;Ðc×CÄx¡y÷u ž{öÐSÛÕsà¯Ùl+JÃÏt!#¬“Mù#Ò£º-Æ]ÜNùˆtD×éE+A®åkäºô]ºƒüA÷[òÛڏåÚóÂ:]š!ͦ€†°)zSÄ`{Åöž±©Ò^©B½ ¹O—Ô\¯oÒ½ÓL½˜ƒ.O—˜Õ# ¯?y”‘›„á‚$t¦©P1€:m£Ö‹Ȟj6ÓïoXÙIٝ©PڒBT˜>5}aúöt6ݝ! OiÃðgB§é÷?V§’c­t*éˆ@;©®VwûÊ^ÕÉ1PÃL‰J攪¦°½¯*¨YÕoQ˜Ë)Ñí
+b’<D½­
+TªÞDOR +Ú¨v¯W€KzÚ©žv¯W€YIkC=hW |çÕzm©ˆûÁ`¦2Ž˜€jK[’ÞŽƒüˆ¾ÙÿóêyØúÁilæ{æîiC'g3Ë'ÝPQñ¸ÂGŸ:ðÀ@Âñ·âÇîÜ8ß|ûÊaÃnUe?>–mRwÐB<F™¾Ì»ÖKÌZ]sÿ5ºÖþ¬ƒïÏáRÂ(xÆL1D­Ñ¬I¹“€Ô› çMç-æÁºûàœ’|pzíµ9Õùg´½ù~س4Z&O«ËÖÛ¶Ü2g&•€ª¨­7©LêÐh“0'/)Á¬$ìI
+‚dó¨ßTŽ.8Ÿ!›½\@Acœ.>/Wr;颓\.·{SÜ–`§"£’Ì€ÙUtqõM­?ãicïÉ>eÝ{6õœ®oÿC*qjçí’6¢N¦¶}†A_£)§6QJÅ·¨ëÖ0Ï:/kNîìð¼Bžjygwôí{¥¼ú²@G)øCàùa£¼üՏÛp•è͙´ ,Ë¢[ÑýñÓ1~åV, i>²)þ×?]¸§iÎýëæκ§&{ -=`ï¼ñ±lúk°ûŇ/\{ôðüŠ®ûõäžçŸxêÉçÚè_`û%ø¨QÐkvÔ®„ +؇ËéD‡â¡¦?â¿cIàì\&i0Í5q‹Õd¶0V‚ +”©^FdÙj“íiä()þÌÈ^ '$,¹Õw0홑ÍÎ6'ivžq’ïØ‰¬!»M]¶P·Í†ÏØ°Íå¨L2¾eQ8u8©s©;UÿQ ý4ðÔ¡šbEò +ML7Ètbƒ2¢ª{ž&ñžuǦ=^獟ò½¦fAIül‹_nѼnSï¤ÿÎÉ¥Õë×ô~Gÿ»1’|ƒU=uв.$Ñs&“\©Hõi•bR·t\ú^â|R“´Rjƒ ŽáÖ·¾uEO—Ô6Ïñ+ö U™Ö%¦ÆuiàŸ7¶\v4ú|QØB‰N¾?…]ìAÌÆ/ü4Š +ýôYß;¶*…ãÕs1%—ÒÇÕs¤•‹qÝÜqîûäaØJ® +28 †m– aÔG r±ÿDIªïÔ+¹©³¯ñÛ`¥gãÁ](°¡/Ð,Zo×F˜ˆqF‚Õd¸8ÜYÔú™ÂÜñRSnkîöÜgùÂíþ€6–{<·'Wr së¡à•ÜÏsù\ŝ©„ûVµ¬àöÚé•jõ*é¬`4™²=ii¡lØi0†Ì&eri“ /æt’Åàö„¼i·0 +7¥á4È۟
+eÓ]´¡luc‘*)TÝÙP5[©‚P!3;’­ º&R˜ý^öçٌ!ۗݚ͠lvQv"›Ívå|QÑg§6%×Å9ÐáZ×ÄQuÇA-\öžÆ¢05yqØ°Q›×¡Z¾»*žÙÅ󒤮ÀÌÆîÙ[Šjž¾aÉÓ9 ¯Þ챃çö‹ŸJ¯P5· ~Š +=ðü„‰'L½¡z[o”L}²_ň[â„Ô<69¿fÕ#½’gŠlæ̎¶+NÁâ°LçŠl'‹a¶ŒÕbµá#Ç«ËÕ$èu¼V£óƒà©Ë|OúFí¿X®²&¤ÕSþêtڋ«6ù¡Ã•«VåÔ?-\Õ±¾h¹®X¦*“`ñ²Ñø©Ì±å#‡Aø¹4>Zç#é/ÌX¿ª=îcCï6wÕt­Ž›äQ©,حʈ¯ñ)ñË6ö-ò5GÌ.Î%‘¨q’e’=êÜJ¶ñÛÄ­ÚNé#ò;î÷ÒGÚSÜ)þkq§økòüëâ›Zn‰¸ž_%2&U
+5Ê"++XËw“§ÙC<úºÂäLîIC¬O£KóŒ³Á›çd1Uç¸Ñ1'_’¤ï©†².ÓÝã6ô>þß8ç»_Æ؀ý[,xøá ¶Œ{1¿!þÖ÷ÿ}Ubד»vµ=¾kïÆøÍìV¯lÎG•~-#,ÄaÊu喈§š©i©öüÝ#Q¿¥Ï='üÝ#Âú¹ÜG±k4Fƒ¾ÏG1åêõ†Ñ¨ŸšôRFŸ®€‰4žü'?EÕ·t£~Êe¶'}ÉF%=õ.]65?/z#æK^šß…IüBWæ:˜bûý³§ß½fƜu0µõ3ãŒ÷ÆÏÅ?­™Øû +Óձ牎OSûs
+Œ}:ŒÝ„¼è ¥Ì\A"ºˆµ"m©ÖU[G¥‰Í>ìmŽH”‹Ê×ë&Y¢Ž¨{’w‡¼#í¼tN÷ƒUkBze«±%5Á`ä`d§›sÁÛ™Lª£&m2b£Û—ÜúÏ]6þ³ÿ0üpKŠó¸yòlË<Ç<×l/0›xuãNztç¾üuBfdÙ³S,ـ™îùU`&~fõÌÙëWM›öËøÍÄ~íøuÛ±#ì›<å‰k˜ýÏl:¶÷±—¨·¶!¦Lý]JÎVKz<ž›Í-á˜Bsƒ~®¾ÙÌʒAëӒMڄ–Tjë´DÛI–)¹‚+œ!¼œƒ$£T$5K¬ä^iÞn&SÍ+Í{ÍÇͬوB˜Q%€VÜn­ËTمÓPŸ³zqAŸkt>‰œI/ÖwyqRZPmÌ1ž~ôOßK+U¿5HʂCP—¹ ·Ñ5=ì¦ê¦èõ×^3x\!ÚzSuéßúUíŽÿ7Œ±V´ƘG^Sºy³&Gp›y›uköÃy’`­±ó]—þ­À—Áóºs|®n¢n–îaÍVóΌ.­PT2«Cs2f†Öš×Z×dܓ)•…†ó5šQº:CM`h†‘™*ӖèiAi¦À˜I
+8uÙڌŒŒ ™¡äߪ]n½Í¶4wIÞ:Ûª¼GmçíÏØÔµâMŽ{ä=ŸËç»FìJš/â³ãÏíØ^"ê³6e‘,Åéd¹ó՗
+`ß©ÏÇEù¸0秊@¸JÀ™MíMÉwÛäÊäÎLϳ]á坔å`¿QŸÇ¤t¨úΠ݉N£Ô‘G)1í8”1 P˜€£Ž™xžã–±ƒ°î@ɱè´$Ç=•ÅlMŽ¦ÞÝ5¡²—¾|LÒ¾ÐØâ¡4¿¦vt 3 3Ô¬LzßÓáËLÞ»Üê½âÄM:< £&c›î¡Œ_e|˜Á2´:–u£”¥ŽJ¨ÍÞá(¨Ä)·F½ÏȊ¨gR^ØýNžJ±M¸ŸÁ }´GϨXµ¦Å51VF#OeÏ°„Á®@Óö‡í:hÔ¡”–Eôy›CÉʅÚ58|ê£-Ö1Ñ­ÀþepãzwÂMRƒW©Ô‹¾ã×ØBßö[”¼M2#u®”zE®Æä›M™‰wIc®4ä@|øî ®\kՖÓd»–žT}»OS®:d˜×÷½]œü/;3;õ&÷GNŽÔÇzEØm^0㖲,«mdü…)+>ûò³sâ?˜¦6,,ò§…ð«Ñ†³ßڋ Ãã&æ¤úmVSíIl8zÿÆþC†úìÁt[ÚìQµk~ùÛ¢úñkò÷슿Qrý29×0H?J5.r2vr˜-Vì0+v2’ Z'e·9Ú1Ó ÛÁ8:1ÛnÃtÓè@6ú-ébE¯ÕH…r!ßoªú,–UrœLÈažh«´n·îµ2MÖVëfëqë+‡¬F+ý µºÜËÛúÌ©ÚXè‰Á껾ÖD7=¶º<µ2žuQÕrZýªž¤Ÿ”Ðïêǀ¶ ÉªòÔÁ§ŽƒLÁҒÒ,¹½[“–=Ê9ý×Ý^®‘îº »ÙPO|ÂÝá4Ïgy%c‡÷¿×óÁ³ñõÀŸû@ˌgC`!=®8®7Í1má‰wñ¤ÂTKjM§ˆ ú3&VcG²Íj•%Þb +Ùlˆ*H½]µ“ì8kþßØI’xÑ@ñ‹ÿÚ­In2ÿ`5&â„BôÌzé,Œ3èؼ›v_‡]¾q•#åa×ö‰Óoܽ…´Å=³×-9‰»ÁQ€qjÀœ ãÔ`bãr܅F<D1‰UÅïy”Å<£EY«?Œ˜·ä–3Pæ-ÖöÅîõGdÄi¬È¥ÉByš¤Y‹¤ÔûÜ2ÖiÕ¶4’#Âb$aÉô̦QýÊ¡Ü£˜5Hf5²$‚yHKåôy âLˉht>õMOVçp¸r¥\§¾lR¤hXR®a+Ù:–a“"0Q[ƒ¶a?ýλ´¿jK愝£O7ÂNÕèJ~UKïU ݨ¾¥ˆui‡é3’äÛä8`qЇϖƇâpöۃ¼Þø.ā{½:0Ü^P@ғ<ÕO›TžnS6æo³d›Ð…?Îè8Qp³N>‡/CÅ8Š—r‡…xPƒG Û4çùó‚”ņ„<9Â’‡±cä×Yñ:y•g²·ÈËñòCìá°üû{ù‚¬cX¼j;ëgóä¶R®a%ë’Écä›äì!öù+ 09f'É`ѳ)Ŧ5E0+ ,"*ÕS4(9˜[I¨¯ö({f„ ]:YKŸÑ`šTP¬ ]vÚƧNÛÈ-í|‰@ш³êtÛu=:FÇÐlR¢¡Ùæ3ɇpɏ?g]š£zÎvÚ5Úبž¸ýã[¸¥ïÌ-™Âÿ«½ó‹‰£ø7³{wlÛ]î8à°Ð¹¶
+\¹ksÒÅó5ˆ=›bPŽpÀ¥ÀÁr­iR­/} ±1ÚÄh¢©<-m!­ÛÄãCÓÄXclš>Ô¤mú‚6&>àßÌ.x +ñ¥¾¿ÜÌ7ÃÜ·;vvo¾™w¥6¹n|Ó¢"ƒ‹èƒcm㳧§mnr³; Ö(¯Ì¨¢T’cÅÈþ+ߓ‹“Ùâ—7nÒmT)Þ"ۋÚß?’Š—x­êŽjk5Dâ‚-âY¯«4â5#î㎗;žŒ£¼½nÁ««¿î5)„¼jˆªŠÂmÁ¡A¼É/‘sØԍ@»Þ,Ü +|hCÜ›âbÄ#¸¹1æ¶þ¤bÕEâ|Æái¶4*B”P
+’$X›wÅ]³eõwn/Úꘃy‹w–^`iÙ½æw¸é«Ýiïdm]}Jút1öä¶ú—Î›Ø ?ƒð¢jÂ7%¬­ÒƒÅ$b­…;mú¾¥ªö„ÌP`Ýofàþ"†]B¢¼}º‚ϽÍb€]'­Å¿È¶âlêÉÔþc¯ì}9ò\bè^N:}¸J—†º¶VÝ
+Ì€RəîKÒ&hÁÊðÁI’&#ð”&Ìè3Þ70˜qÚ8gÜ6<Y¢© =­„Ë4;x~¦¨EØõ<?¡–ç…–à a ÛÆUèiFo™&œoð£Šm‘¾Ç9*ÜÇô1«ŠÞfe¬¹’èÑôª8ó·ô´RÂÖÕð6—àíç²ú}WØ-SVˆ°`8N·X*DÌyU¸ÅRCù.˜¼^i晄ˆzïèÚrÕ³ÌfÉ óò òlq…›,‹?ƒ»7ü·¢Œ¶;¹#ïa5X&ýÜÞ_ò+~ð“«ü·Tø™•Vɼš§GñÌ¢ùÞ±éۖ´Þ‘Sãxü;æ=hÇ^3Ö¡$¢aU!óׯã)¯‘/<_+>0°~>M¼Œ«v^â±Ëå¤êæ'WÉUZA-äMäWe«ò§:§Îyú9ÞÞkâ›­èª¸©õigµUmuÓȦyÁJ ã•ÀŠ~ÚøÁ¬7OT5#wƒƒðaè“êÚê‹á§k:ñÉ0Z;WûSס‘·"¿×OÔÿöÄ`ƒÒpªÑ׸и°åSöúÞYç£2®<6+ÿ‡¨¶NÓ: ‰D"‘H$‰D"‘H$‰D"‘H$ÉF@‡³Àß
+Çÿœ +Ù¹ìƒ! ­í>ž€k®¬€Ÿ/9²Z&{ËdÄH%ßq^Õ\ŽL †t¹2¼êÊJY¼Z&{Ëdç|΃Ð1„Á>ƒ,ú½‡IüàL‰˜†l”¹›ÁøœHцÿé†q„AãFñû˜¡,úYL}Ýa±§‡)2"mN¤Éৠô +cš ôm8ˆqyyœs9ÃvvÄblßX–õæ'ó…#SY–ÊÛSy;SÈå'ÛX÷ø8KçFÇ
+3,Éڇ³ÃmýV:ѹ;ÙV˜˜ê¶s™q–›aV°3ÃىŒ}åGþ[!ôƒ…M@'ì†$f±€™˜Y…C˜Qž!·@©~Ù¸GÀ?Üø²´
+endstream
+endobj
+11 0 obj
+<<
+/BaseFont /CIDFont+F1
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F1
+/CIDSystemInfo <<
+/Ordering 4 0 R
+/Registry 5 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 715
+/Descent -211
+/Flags 6
+/FontBBox 6 0 R
+/FontFile2 8 0 R
+/FontName /CIDFont+F1
+/ItalicAngle 0
+/StemV 7 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 9 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 10 0 R
+/Type /Font
+>>
+endobj
+12 0 obj
+(Identity)
+endobj
+13 0 obj
+(Adobe)
+endobj
+16 0 obj
+<<
+/Filter /FlateDecode
+/Length 24310
+/Type /Stream
+>>
+stream
+xœì¼y|”Å8<3ϵ÷>»Ù{7{d³›c I "y8‚"W8MHK$@P‘ rˆ(h+*à²„€áhIµZ)X­­Z…Z<[”ZJÈîûyö ÁÚþú¾ÿ¼ïçýðlfæûÌÌóÌ<3ß{f‚0BȌZ‡jG+.•{-߈®ƒÜÆió¦6½3ûe¨ÌGˆØ§-Y~<ð‡¿"Tz=BâøëšfÎ{{Yýf„ÂUpÃÌë—]÷RÛ²gêہPÓ3³fLþɂñ§à]‚ÐgdØËôÏÂûpŸ;kÞ¢¥ý‡e{ᾡÀ +×ϟ6µ¤ßÈ0BÏÍBÈ×6oêÒ&ûÓt(ï õÃ7L7㙠s^CèPúcmšß¼(]ˆ6!ôz-oZ8£)öþȃÅ_DÈøKöm‚wó¹UÓ¦X«þ©ó뽞øK^!Mß|ñÍýgwtΔ‘Î·zVŸ^JR£Ð`Ýqö&u•h×'4Ç\ú"UÁØ$£b4!þEh—@)Ç­Å¡T'lÊà~5åÞA×»N F‘'ô⏣ÂtZ:˜õ®ñ#‡‘‚Âa¯ðnj .“àVát: +o ûé—"^Ìt‰TªÁ@×h”²ÑLžG·ÐÐu_‰ž‡ûî£ÏòÍh„cª L„àË䍄0Â8zu÷¢ÿp ӝÂD´Ix]á1€Ÿàÿ‚¶‰•h^¦ÍƒZ]x×&ñyô …¡|Z×;Þ@Ãs“á¹’ ¬ÿq;ðž»2i^·ï«‡w^ a5P-¤C! ‡:Y‚°¿Öâ7ÒOÐúßí¯¡ù†dÒ+à=«àùjx.îoØÇú‹BB>ú/ýæçÑ~ý[žÚÇáZ@ÿ‡‹öñ¿•se@¿ÿÃß÷ úÿÐÅ7§Ïÿ8ææzôÿâcäýùsÑ¥ëÒuéºt]º.]—®K×¥ëÒuéºt]º.]—®K×¥ëÒuéºt]º.]—®K×ÿ¿.’Yrt ŽBØA¼°4Š ¡u.¾ CB:„Œ&„¬²ÍžåpºÜ¯ÏÈVëäÆâyù…¨¡âTŠPï>}Ù’æ¤ 4xHÍÐ˯våð#ÑèÚ1cǍŸ0ñªºztõä­•4šC£ùM j¹7gÒÛ»zs÷ÿ@ŽÅ;i´ý®÷YL—µ¾‡¸/]•EˆsP  ~èr4 A—ÑDt5j€î-A7¡­h;J¢6ԎÞDÇÑ×è4y=œöÒµÝ̓ù0áÉðäXöd#º-ýѓ_\x2ý—ÿú›¿wÓ Üô#éu¥×¤äãôßV´ÿûeêÏG P‚aVO?P©pYUÿ~•}+z——•ö*)îÙ£(QXŸåFs"áP0;à÷y=n—Ó‘e·ÉV‹Ùd4èu’(ðÁ¨¨&:´1œŒ7&ùxôŠ+zÐûèTȘÚ-£1†¬¡×I†YµðÅ5¨yݏj*jM¥«&–ÃU¨ªGQ¸&N +·ãIcê¾{H´>œ<Éà‘ ÞÈ`3À‘<®ñÌNâÆpMrè’Yëj‡Àëv +ƒ£ƒgz¡#€F€’îhÓNì€@Ü5ýv¤3C§’¾èš¤7:„ö ÉÅj¦NO֎©«âDê{%ñàiÑk“(:(iM°*h0k&)NJ¬™ðlú5è®ð΢ŽuëÛetmcÂ4=:}êäº$7µž¶aK@»C’î›Nx.ÜÂËíƒëÖt/õsëj<³Ãôvݺ5áäÖ1uÝK#4®¯‡wÀ³$6´qÝPhz= âðqah¬ª¯KâUÐd˜~ ý*õûfDkhNãœpRµnN#Lo]]iõù”½éãÈW^7¾.IVû£õS‡v:к±Ëvy•°÷â’E;e›:°;-Ö `2wft•1ˆU§Ðð±]#‹i¢Ã!’áiaèI]¾©/fôEë¦õ…jpÕcx*9fdvR?¸qÜæÓç“BLŽ†×ýDOþí✩™1&ÿQâIªA¹'‰da!Ei0Ì)ôq»ïÝ£hI;‰F›ä0$0|¨Ævj}¿bþH„Nð]í
+ºn’-cêÔû0ºÖߊ”âD}’4Ғ­Ä9–´h%]7F“Û p&uñ®?«ìʪ™Õ/‰]ÿ¥x†Z>|\tø˜Iuášu™±>þ¢;µ¼oWYJf +®ãü$?ÇJ)'wU¦7u¦$ƒ?‘!õôvIXÉrpxhRn¼Bë +‘ÈÿøP{ú}Š%Ët3Ù/qñ}ÿ‹î/êžiæãdøøIëÖ.*TS–IãÑøºHxpMʌÁ_{º£/ +õþ¤C6˜VüS³2·Uôgàz¸(vö(
+Œnݺ¡ÑðÐuë¦¶§[®†å躽äòʺ¦šF +qÚÓûîò'‡®¯‡±š…ûQ4hg¯³SÁkÇMªÛ+ƒÜY;¾®•`2¸qPýÎ\(«ÛæÎr Í¥™ô&LoÐp ÙJt¬¾/HèVʳ v?­#–§Óò0šÖNÔ<YË#Ç«y
+Ë£å1ƒÇ×uÇF’õ=ڋÆsù»âžÐÑ\:p­‰ìÐ^.ËníRÚ¹è.»³Ô:°†6‹Y†x>„rTJO႐/C¼B „B8
+tˆiiÂ|[ §%\6h +‡äyœžõÂ7X97úB‡BC +a
+„ +¶@Y=š3Â
+!œb%
+çn½¯ úîn½‹%»æ\_Ên§ª·“Øí®«êÕtä52L­ÖO­Ö«\Íî9HMóŠÔÔ+m¡©Á\Ú1ÐŹà#]Ðñ&ˆ19„¬£ÚÊ9QáÄLŽÂÙwåÆK·äx„9Âa4…Òn5ÛJHš|‹ì(D¾!'Õrr—ÅVºeà•äS´ÂAù~&F+Èq:æWCØá „#¾… ’ãð;¿OÈ'ÈJ>FŪ!L°ÂAßBÈÇËäO”?±˜ÂÕùÄ2ù>ë#ˆ­äC€>$B×Þm­¨,ÝˀDqÅ2€ÛŸì®Òvò»Ö
+£â0ӀQû¹PC˸œÖX¯P;çi­šj'ÙN„¶,!ï¡$ªø¾-¿‡Âj!4Bh‚ ô>@ï£!l…„X± !Lނð6„÷Q B-9Ú
+Í´“#­ñA¡.ò[òrÈ&¿féÛäu–þ†¼ÆÒ7! +Búy½5BPŽàRÒb(ȯvåÚCé6rÆ.q1„j£!L°‚H’œÖé!;¼d?z Ô÷iE_±ôô„)sBJ|0 `˜Fñ~—іð–8Q⛂[Åï¹ ÅïXâ7­ˆFñë—D£øô9Ñ(>i
+@4ŠDí䱗sóB£çâð@+¹FéF¥a”nD<¹‘þÐ<íÛ텅0b›•DAa¨en9€[Æâ–'pË Ür+nY‰[ªpË5¸%[¸%ˆ[ܲ÷…¡hÁJÛE·•Š·¼…[¶ã–fÜÇ-1ܒ‹[¸Bi'‘Öae,©aÉ®”è ½lp+‰ÀˆFç#ÀB|BšÝ)P)œ£Vöiš³«°Z½ïÙ¯tþÀ+È«ðà«0 +¯¢cx˜ W^…—¼
+/°B\ +a
+„ßBHC¡vt|‹­C¨†0Â
+ßBYw¾…@ÐüLw°Žg:=šÞ‘Wá—¿‰(Ùr@NÈWpØÄ£ƒé ©@.¨v›Î֎Í{þeþþ_f¤¨'÷ +(&bc&ÝÐúCv¨?ØßèÄ  X‡+QÇ í‹šÙ}oÐÑ´È –¶&ÂcÖÖxQh¶Ð§ö„~œ}h'~ØúC¸Ç­¡ßCÎ {Bïî ½YÜ®ƒœñv ɾ0«º7Ð7´ý-Vu%ln +ÝJ“=¡åËCs¬`†ZpM3Ü)ÖÐØø¤Ðð¾!kCJ3¼sO¨:pM¨J­Õ›>³'T]H¨`!t¶ ÀÙ 'T´ãYJ‘´Iª“FK}¤R©HŠH!)[òK]'ë,:“ΠÓéD¯#:¤s´§+ j1;D¶áXäiÌ3X&4¦Æ5ezXGЕ(™Å +'ÃÇ +ÂÓÓÐðkÃÉ3ã¢íØڊ„“öáhøøAɾ‰áíRzl²"1<)Õ^]·ã{ê!7Iւ”_׎Ó4k•ŸÚ{ƶUwûiš¿êîúzäq-©öTÛØ*‡ù‰¨1'.\ž‹àìä¦áãê’Ïg×'K)Î®žü5öâïð©š!{ñßiR_·—€¿«Kó¹Cê뇷㉬
+ã¿C=À˜¿³z:Ì´
+ë‚j½Íj½<õriõôzcõbz=«ÇcZogsn͐¹¹¬Ž;ŒšYfw¸{·bP'cu\-è-Vç-W ­“ÀªP%`U°X•ö±*/T)ÎT¹³«Ê¬%_¨P똏kuÌÇ¡Nâ½f J$ð®þõÓ&S£«1Z3Bcò®%³<ɖkÃáÓê3ÖX¼ñÚi³h:uF²>:cHrZtHxgÿÉ?Q<™÷ى&׌¯Û9Y™1¤µ¿Ò¿&:uHý®ËkË+.jëή¶Êkâeµôeå´­Ë+~¢¸‚_NÛª mUж.W.gm!†ãµu;uhP=èø,ÝEŒÀ×F¤~KnÀ·Äs«h+ېL˜Ïf´¨ÇÀiÐ-²PË:S乵ĿoËɐm‹B‰E‹›#OÍì!ê_3\µh1p5N4ÿ§ ÊjÀHÒ¼¡áÉÂqÓՠÍî”$Èm¤Ÿ”ì§å5 Û«™=!³Í丮Š4¯Šæéõ™Šÿ>ÿ‹3é`J-dÿ.¬ñ"Ô\Ï%ƒÃÇ`ã3&Ì>Ð¥¨xh®‡lÆ Ü¬½#ÓíD©÷ˆ~³-Î@™±X”IÕ'á‘fmHº.:X‰®[/DÂ>ä…àžE^>Ž<¥¿€ð%MS³Ó_Òrš’¯ÑµgBÛÐv<mGÑ+ø<µ 6DU !èt ú9Zbmä܉ÆÂO€üŸcoº +£ÇA°=ŽCݫЭhraOú+´­âޅ§V!3ÊAQ-šîÆ#ҋÑdtŒ¿U èԄ[Òué{Ò÷¥ŸBO£½Ü¯ÓÈˆ|hü§¿þ˜þêO܏BÇð}úÝHVZ æ£h!ÚÌ5ð8=3}zA7Bx4Æ$oŸ¾À| 7Þòd:™>µ¨ÍB›Ñ>Ü_N"ÂäôÈôaä‚6–Â[B­hüÚÑ/ЇØ$œJ?•>…¼¨ +ƒïiC¿Å\ªseªFL€Q*@•P2ý½Žâ(þ™/˜„RAnJ¿‡¨š½}žüÿ‹Ü
+¿ÜëüÐô dq¹—Ž6z +ýûp1'’2Ÿ<Æ-D:h±ü¦£Ù0ÞÂÛ?4ÚCLä÷$ÿNÌNO[`Fâèaô(ú6׆q3¾ +¿ÿB“)äaò)÷sþ9þwÒTøêkÐ<t7zý Ûq_<_gá[ð|/~ÆGñ—d Oæ’o¹YÜîü øã›ùۅÕÂ]◩ºÔ¡Ô;©¥KÓ«ÑÀ‡•ÐûûÑcðe{ÑôüŽ¡O±€Ø¿0Žà øfø݊ïÆOàmø9Ü­şâ¯@$ýŸ# i‰Hü üP(J‚†ùsò9¿£äoäÎÍåp ®7WÅÕsó¡Wk¸ðÛÍý™÷ñGø4Œs©°IØ"l^^N‰&é6ñoŸ²³°ó“J­MmJµ¦ÚÒFN˜C`pUAï§ÂoÌ÷&À¸è]l‚±óáB<€‘™‚çàx)Œäx3~šõý%|Féø[賙XŸ{’Þd +¿kÈ ²”±ûHyŸœå$ÎÈY9'WÈ]Î5p3¸EÜ2n—äÞæ>æ>åÎpçá—æ +|ˆÏáã|‚¿œŸÂ/æã¿à¿& ¿> +â<qµØ.þ´šR­4Fj6H{¤÷t€¯¢ÝèåîŽc|œ[ÉÕp»Ñ=¤Œ÷‚ ó[Àç)h:7’¦’mx-YŽÛH®°TìOúãQ臱~l!gHn$ŽÇ¡9¤—ú6ÑÁ?Iÿ*:É€oû-¼y©h·’oEjÅì,~+áÜoЇÜ1,ñ£xvã“äY®°àü¡E¸GÐKܼí&5Îé֏ÂÏ_Kñ÷\ÔàQ€EÜ_Ðíh.ù#: t¼=€§ó3Ñ=¨ ߂¾@ÏU7ˆ…¢¿IfóëHnC„ŽžQ¹˜èÜÀm¿% Åèo@Ÿp/B—¸‘ü)a,ž°­F Ò+Ñ2¡Žÿž‰8<ÅøãÀÝnáJù¤+€«Lž¶¨{ðÜHÈñ挼˜b3ü>ÁÍ¿
+¸ØoQ›8ž´£™‚×AˆÿMj,š”~=”ž‰nH߇z?X“¾Þ¸ +}†6 mxUêfÔ¦ä@Û#„¡äˆ04݃¬#qdÓÅó £Ãô5ü^‚›Â~´Žÿ‡ªÓëÓ¿ìÎûºÖð•ß@ Wp¨,5ŠìLåšà{¡1égÓ!l@³Ò×£ÑèzZÐT)sœÄ¿ƒï½Í cӋ¸©Ù0`­ÅÀîm˜1<.ßHEl[ "МÑù0×q^Ð9æ;h¥Óo‰[„w‹»‘åÁ JŠa£w£ÌÒùü~j7Z=^‡ÇãõøV¯¯WÂ~€lAz8Ù¢9Ÿ×Ëa¿Ç˧ù!ÈïI¶´ÆŒd3J@Oz‘Í»r^ì-Ò{'Ü[á•zê„Z\~Õ$OB>ÓpòôIù D¨údçI¹J®ª† ŒmöÊJÖôL,—õ*ñ ^¦ŒÅeÁD•…{…p8@Ź™‰5„ܼ3„m€²tfçƒÝ¨(¯g•D!²`S»ˆd£=„DH“ÐXV↬ò>e¥.§CŒæÄqŽèt¸ÊJûô.s¸ ãÿPvãc›Öí~yõª¸rpý¤AC p9÷ÿ3þì± ` +ô£™5õ“øIþ鵃ûÞ|¿¶èớm¾§ùl³¨ÿá_øžÇ>¢oàC‹^¿ˆÀ`ݒCaždt™bȳ‚ýc—t²ÜŽËv¡-¤ŠMÚb¹q2æ8îEÛ£ëÙàvž¡ƒ‹ªaP{•à'¶òŠ>e¢?§Œñ±û;rҁ•Ëò.‹Â÷§ÆÀßcË7vž;Z¿nÓþ_¤B©ðEíÏPLù$_&zƒŒ‘]O{`ØÂaHÛÐîK{úT›,“ |ßfµ2àD›Ù̀¿)VƒL°ZBbyўé#ñõ3+Šlåyqø•¹Ü.§L:WÂää\–wÓÊ“FIÁÇñŸìÝ´nÒïÎu~øM껔zù|ê|;è4j·ÿ±×*qÌU‚ +¸
+7Hì+õ +<w>p­@[?=9Ýpú„|0‘¡ ¬â`¯’²Þe0ÛR^Ÿ>{×^UZه;|xÁ]ñ‘Þ©WC»q;™Cæ½)Þ&Òđ‘x$4EÄ'4A/ßt·'1J>Ñ ŽŠGžìU‚ÀGöŽ8’ܾ{75c÷A´zÏ¡˜â!´³Ujw ~+”oåY/Ï44PRQ;µïðáÃÌNA*a~84n/âҟ´:*I{ú%ì¨|€Ã„ÛÂíà·„3ÆÀ 8dà¾DäK˜·ç q~×Mðæ*(Qƒ5BÏD£9 Óã¤8ÿÜÆTWøÛY]Ӟþ‚· €ÙĪ˜­&“iЫÉh4AlO©Øè½à¡÷’Lc?Í5RH­÷§—Ù<hB@¤±ÕDcI¦ñNBފÁäGÐlvëáa†KP¼™ô6d¢9Èe2Al¢y¨é0D‡a|èùwŠÿþ¦Óð&‘¾ésÀJ|£xF‘¾R¦9H6™hLóº^yámbØ+Í[IØøËôqä‚`‡`MWFñâ²Ö¸Öú¦EÐKF©Éá¼Ò;Ø?>k²s²w¬®4×8-ëzç\o£¹Q\b¼ÉºF|PÚ$¿éù¼/¾oüÈêëê.í-I¾k£ÃÀ÷Šƒ’»Y¯D¢å%zŒô²ž°£5Øh +ýƐÍ‹ÍB l:šikF`3)ax”ž©&ˆÕ@:Z±hcð»(žÁG7$NBLÁ† Ì nXªy_zaÝ sà¥Y²²G—È8d^<K¦üÑ&Ç£9’8aî»[—´.4çÝÇß[vïÞçn¹å¹çn½åÊò.æñe/NٕJ˜J¥^ÝþàËøÑÔߞÝwÎ7³WS,?¨w°Î€>T†Ԟ³ØÀ¾±Ø ~‹9Ål+ŸË¯ ÈC:þEë‘(N/`ÁoØPè("L¹\{ú8ã]|­ØzzYzÁœ+^Š<†0lñ™ €r¾ËBß%à0ØDð÷á*¼
+©„¿@GvÁMÕÈN`3ÕîJl«¤ã‰4é‰ÚDQê +¬¦Œœkøîø>-^Äß<à–ÐK—¿5zYô*Á(‰g/’€2èè(»eäFi…,‡ Æ.FW*5èm²Ù“•%N0Sœ±Ùð¢—e€‚!H1ÈM+ƒ´4°@IÐD¿6ØNö+&bp»Ã!ÙFH8ü±ø½Ã4>ŒŠ)Š$ªi|¨”’éjÐd·Ö ¢·ÚˆÖÎqÅhÏ"‚šGßÝ
+¯V?€P\ÿ›ÂFþ§Z£IÛ£­±Æ”>ý…þâ~á ¸_zC÷f@fª7·Ì5M·Üd¿)ëNûûg¾Ïü§|¦ƒÆ—³ˆ_ÈÙrP F£䫃T3ì d(¾ð9Ÿ.àþ©ó8sPn'OímövìÙM¿Ñ.ïÂÄdÐÕ ª*ãf†f÷»€¼”Xñ~²…‘Œû*&Ûîj°ûæ“„'ûH.¨Nv2²k êP‚òbFoUU 5œ°Ù)®@´ÆÒ3aÖ¬J&¤Ñ`_Ԁf(1æŒÄ+ƒúP­$šÃ$—ª±€Ô%^:_Aܱ'7»í¡›o{ïÍúþwÏ\ñì+OLnß>°jZÇ­‡>»nîÏY—u䃯·×=ੵS{Q
+œ˜þœwî%pÛÎØ|{)°«û6z=
+<OaJ Üà‚¨¤…5h08ƒ>X
+ÌQ³Éãm",Sj KqöN¨/¦Ì÷p1ý!{eu5Èä“0ù'_—_·Wʇ¥4ÐÉÏÌ.syµ™¯±]e[âçƺ®—ç8¦»›—9V›×9îô?m6aŽ!Ñd¶ð†v1Sº»S÷†qòž}ä)ä%³=ôR€nšíÚÛµ)¶wñb{ó”ðü0 {(‰„[$­ª¤U•ºªJÍqƶãÅå8/=ý2}*¾±‡§÷mõ¾‹÷ÑÿífìâÑ‹Úñ}ìH0uYãǧ +]l¹ó¥ PZ(²¨¸œ°˜ ^POÙKV…+£ª+®è5ü "сb;±-tÿÜ;žX^6Âa76·¯ž3{½£-òõKKߚ{ÝôÛ6¦¾|ÿWi|»ç¡5ÉÛnyÜñYº|ÚmwÜÞýÆÌÖéSéüÅ=©~Nµp,YØ|ی_ދLé³Ê‹t|Ì"CÆÂEëUvÎb±s‘Åz•µ³XÒ1†Çb‰ .Nͧ¬c±Àb‘Åz«bÁ^gšeÚlzÎô¦IÁ0ÿœçì@ÞÈ$r’`0rȳù-Žwpϙ1™y‰ÛOö#ØU[ây¨‚Þ2ðí亗Á d‡Ê +šà0¨Z¾aꅡW(fIɉ–K-‘ÞÒF+¡Ä`4;Ê‘I˜p„>LŸàÄú ÙmiÇëÙ|ÿÊ`*7NS²®’?—™ØOW©²UVâŒuÄ?°Z­0ÝÌáiÐ^ Üö=ÅXVÉåô¨äøìì*úŠz@¨£8LŠ±ÒÔR[iR╦œ¤=*ï¨Ç‰¿P,ÈÞ¸ÌVæŒÚ8&›:ï þìõ×ÛR½ñ”§¹=ç¯|:õ8°²û;çR>AõÈð
+âóJV›N;‹Œi0%ÅH¡ LDqS(‹i‡vsM¡aD¤V¢PSí,6zØ|ÓJl²/æB{†Ñ6ÓáÅ‹!ètìT„­< ˜-IöL¹dãXT¸PŽC©
+HªópÊd
+ìLZY<Ü·,{]ö¦¬g³^5½oúȯÓgy,…>N_"”÷@á€ÓÈY§=+ë-‹ÕaÉrX¬f`7JíˆbÙ
+6Åª8q¦S/[yü.eE ^ížmŠ<_^!oyùÿÀT<Œ©x0òÈâјŠgcØ~÷FV|?P^ßVËîŸb.¡‹™ËE쥁ÚBÀPØ84Ø >±F×3!Ê!&‚˜ôÁ ÀNø7G|w~L&+âŒpÀhÓ!QÛyÂ/œ][ÛöõW­ÏîòAçˣ︷ëÝ}úם¸E^wס'6·Ž®v‘¿¿˜Z29uæ7îm=N9ÊHÀ/'È¡lTH¸½ ~ŸbcckÏam´t§¡Q´ "ª}Âb C&V›qª©T“ÄtA¦…¬8„§`û󃊛͠Åø…œ Ãlb“éSÌ<‘ƒn™â”›I473OÜ[âð{‡å×4Üj8)j ¸Õc®‘çïð$ûøð\nº4]7Ç>=¼H·8°J·:ð¾î=—M
+ӉÍSy†H?Ä…"¬@¢yáh8B l´—µfýôãw©îØNEšÖgLÚӆ(¦aV¬ ³bÍ2Ã,°õe`pð§^¦º¯¼±8[_%+Ȩ:Ès±Ø`;®TrªÝSÜóÝ+ܼ›™n6Šn}Öí¢=u·“Ü]‰.KC•cÝQï¤*Ԙ0ƒaÊàsÓëÎ¥ÀæÀR<™¢D%™j:Ñd“+¨\ÎnhȝÛå)6wâÀ גf¶uÞxôŽ?§N<zç—Û?î¬}Ϩ…O=qóMÏóã,sJF– øæOÓSÿúݺ“·âáøüܯ¶½rþã†çëÛ{pÇÑ© Û\³ȌšË!3æáèx=ÊhJæõ&s3Ç:£™ÎÇŸU׬ÿ+ +È4…pՐÌÇ+ÀòZ2Ä8J>Ý° jä铣ä3ÔZ v9Õ+m•ªâGý"âD)ÚÇn¯˜Êí^Ÿ:9¼u/wÛ?îäÏn_ʞ:×þÑvü5~ãê +Tãªq£(*á†îEÍT÷16,y2´“ÉÍa÷Å,î¡éy]¼;~¡:³ìs%ºî}ì¾@#¼ì½*fq«SÄÉaœ<Ðuïc÷gg3º˜Ä=Ø|› ùƒ=©`»…LèÙÓ ŠB~ÐnR‚9Nïa~ƒ„•òJ›VÍР+´z8Í}Åiµ¸.šær&ZÝÉÞèd4í¼à¸Øù@-”“••]>ˆ—YGD­#¢Ú‘ÌaÕ¦}šÀy%‡fÒfé“N&uœìK/|ŸÖ´…‹3Ðe+½]¸À5Ì5,þ¹é«A_‚—£åø~‘nq¡i±ù&÷]h^ϯ֭4ÞaZm¾Ûý¶íõ,{°Ö@ØG“p¸˜&=ÂqÊS¼a
+z º±µ'î6Ò jl$HÙc¢Áæƒz¬ßGf¢D¦RB«”èâ5‰f«^cÅÈ*[‰µß«xK=ŒÁxƒñ0ãiNr˜k'3g.+Ìe…¹¬0·Ù©âa§â$΍½ÞÐdhÌ¡qºK¾uiÏöÊ6ˆT£Êð&×.@ êR)R/÷ÖüÁšòŒ 'Ëэçtg@xNÓõŸìøzî¼5w§Î|ðAê̽׮ž;k՝×Í\ÛoØÆq+·m¿mųœ¿àÁ9[?<¶õº
+Š­=Fwlø?ëŽÛ§L[sÇùôȍ£Ÿi¹íùmš?ŽRväáÖ½È
+¤¥Ãáô¨1“€,Žª”Î.ÒEÊ.™éàô>›BNF›y,Žªb’©d‘.âvɚ³¯íBmÌ%gè—Ýœ/C œÄl šœaøíQ%-N)ùÁ=6†á6æ\±ylE c~ºŠG[8‹Åj1f†¤Y¶‰0Տr¨ +N'ïP¢¡”I‰R6€ü”e*i?~­ËÑ­4>¥©|6FÔÿ¡Õ‹ÛúQSÅÝRÊûùF¸”èÕ®«¢×q×»æùfFoò-®÷ÝÜìzÎwÀ÷µëóð™pÖe®Ç\Û]\¿‚é"É£ÚbhË ‹áüàh˪h“øÝZUl·ÑN„4 iäÒ¼<¡}¸3ÅF:̴ب©´¶]¬&n,¢€â€¡CŒÑQL§
+~[Ù±mL\DG ©34”¡ .%Q“Ô¨anøÉ-;ªV8€ô.Ï£RRäc·1wa3"Q×Tš¶»n™:nymÜgÿ¼=ç±ôú†“7ßô÷'^üüæéEK[Ÿ»eùãxœ|Ó +#Vü±Éä™8ëþx ˛SI}—ú"µë¥ƒ\ùÃ{=²D5PÉ^0MVóq¶.ÖW ó%=«x®
+‹¼TÊõ>®Ë¬, r÷¤¬®E1֐ջÌÉAØ{øða®þðáóÏ>ŒHº!¡l\ YH65;¾×BçÛ2&Ï÷šŸDxÊùÜlY‘W-ÚL¥³*éDóT
+±{ÂèÓûŒ +Œ:]ÌÊʌ̪6Ø{X¬·°÷3Xb0¶Xefq~ז¾gÔHè{뙠bBG`q±\"ÏÔÍÒ7Êk¹ò›Âëb‡|J6ê„z<‘ÔʳŒIù¦˜ÿaÑó&ÞÌ[8£A/ð¼Élщ’dX'š$Œýb+ó¨†%“ŠÇÑ<'Íã¼ÉO郂  ŠœØNš=ҙ¾R&d6 4*vS͐¸±µüþÏmä1ߎ±b¬5uHÇLÜF6Ñ{Ù*‘È
+©E"ÒϬïÿAM/øóÀŒú¼òɓÈS]å;Y}¢Š®ûœ¤«t¥qMOKÕH°°åC‡,‡­Ô|xÒ8nx28fR]oåtÒ¾ô)0«¾§x_.hHü—+ŠËp”‹pY.ž'J){‡Ô}üBçÏ€ÿþÐМ@™°ïìP| 5„L›öÞx÷]TwÛzæW€_6jóàU{3U@×(x~htbôºh³þ½8Û·XhÒ7on7Šy.=çÉ+ º²õšöÖeM3ÜÏLf}–=XXXP€ÙAéP0hC:à)ö„Gc5”w+fªÇ{⢉*IÀä?Wb”“ŠvÊEE‘Σ¨£½æˆŠUâø˜ö¶î6Æ%‹¾-7èÛLúÅÀ<ú“¯úÓͼ0ÐÚÁ0sՇ3~ú3Œ‘3 ã£?ÛÆLDÕko`žú†Dÿɞ./|CU'ÄU£ØýHՙ¦^¯€¥UÉ wSb£«ÑXõ«Q}™-ÒÍif!Q)U}®ñhÊ*(£ð&ßö›æëf®ÚpU˯֧~†/[Ù÷ÊáCo{,õžwM|ð¤~ãï_ŸÚ.ì«ß;ãšgÊò´ÌÜÙ؋ks]7rØü‚s[%Sß¹CÇ.c>ØëÒ_K„w¾Ý=ÌÉ&XSö­_*S(F¥æi¨ -ÊnAwdoD›…¸§Í{¹6óæ£èDö?²m{¶-;›+óm…pèróDÇUΉÞYÂÜì›íwÙ7sY6¶á§È6Ûï-Yȁ|²CöñtY±5¿’IâšüJي0ï3óy½·^‰âa™¾›M›M›M;Öa`oÔÐ6Ñ^ê¼Ái“™­ÓÁ¦f€Œígc +Etµ ­…Ø-òќ\T{nY)ï–âTT§ÃN…ßöÊe©W?;™úÃÃ;ðàWþ„‹ú,{ågÏýeò¼ÏW?ù)!½¾=÷+|Ãï>ÃvÿM­÷=‘úöÞý©¯Ö ²á1àߓ€¾¬({{8„ëTz°ÉA+Ò¹5 î¾wFÉÉ|˜‡˜·[ÏSo`«•–Ú±T_([fã!3­XfRWþŸú_B¯!tð':sÛp÷*¼LéÃù%¨t¼Ž½Ÿ‡ˆFP.‡+Ëʼn~ÎÁv D] ‚][±}…p­Ä +ãÝ.· lø‹”fÀúŽ<†xaÒ­õ‹šGÝtïáU©¸òÞ§{Ռ|àúQÛSo ûœÙ#®M9ôl*õÜÔÒí}zÕ|õÌçÿ*¤çŽžÞF÷:Q›â… N'IˆãéàôA#ÒIۊe{¹4ž»2l›‰ÁgæõDnŒ1 Óÿß`zýà¦þWgp23¬#5FÑ0òô‰ã ½J`Pœ‘Lx‚Ï=ÿ—8ÿ{îaßöTõ‹)óvè(éü*øB=zB¹Œ}á w}$|à#a6â3þ?ú*ªÄ&þÙ§¤þí› ý'ÿÇo:¡z¨îöãïÙÆ}|þ3’쬥ßÒo{çu”ÿÌþ³øO R|~‡ßIóð5º,lçrsQÄî&1$ŒA8i?0ÝA v¢ãx^,W£¤\’r)%1Qn˜ã`$ò™_üûR¦¥dä²ùcZJ}7Yؒ‡ó²Ùe³!ËfC–°±³' Þø´«/b5#å†3™±Ù`P?S—í÷ê:J%õ·ý á£þ€/à +p¢).ǜñP\ããјǜA.kV*;²ÂÜ屁6ˆ‚úHår±ÍF@Pt£S—J@I 5àÞ1ÛE Îå–zàpt«ŽÃΏ«°q#ȼ +©£[ÿ˜ÚÒ¶ ×~´ãûâ;"×ê•#}×`rï­§êqçñ…Í{ñ5|7·ÍlÿyISËÈ1wŒ^»åPêû–©ØFçò D+/9œ£x FŽÅDbx)£lþÀæ 0êՃC:´‹¡ø\ øœÂ†Ÿ¢4¡+â»ú^ÆVÆw••«i5Í/PÓhLM³ƒjêñ©+é…f¹<,lv€ 9n@[QñÅHAµè:…{27"NP×S(%x2ò7B¾Ñ(„¢S;…<Á¿_ߍož\×ÚºeCý‚…U]º]haòG»Êle¶ƒ¯På FŽêc…0rºM1aÂsAéÂT%Ï*‰¨ÃÈ1œäØ pÿ3s:óoŒ^ü)FÿyƒÊ‹(ÅRšÝô
+ùôîÛéÌ>ˆh…þɜ[1é
+ÐÂbmaDƒÂ؆Îb¶1š‚Ñ@ ›ò)d²ÓbÁjâôÞhA:=1EúF™öì˳{h-£ŒèÚWæÛ¾×¾í|ÛEs¨s¬º£C>z´ƒ.O&êø"m£NHb$²˜c1ÏbÅ:àJ”B„±: CÊ,ì‹%͜¡{ ”[_°)l°—[Y$˜8„- Xt aè‡Ó·1€½d?™ˆìH&s†§ŠÚ„°×"êjKœ.>Í$luU•ú1 +Ý°EÝSèWV bÕ9ˆ_Ç/1­6ý†Ò4Ì4ÌÊð1s‘¥Ž»š_b^jYcÖ‰ «4÷±Œ&ù!’¢id1<Hâ6I›tÛ¸g%ÑN¬K‰@‚@t&³¹DШ3µŽÅ
+H:lA³Ùb‘é<5Ú[ìľlCfÜ«UëÚq/ÅeÒ˜Á¨š‡†°bZaÄÆ}ðÁl„Z¤+FšÑs¡°µIÆr;™ørXhZ <²m—­?’—îk¨òtR´d–ÜùºÝžhK JîöóýE-®5˙ÁI¯tÁ°ú2¥Ï–¾ÆõûÌ®ž4AY>”Ñ%ÎïwZ 47³âùޞH¥¥(ÂV=÷TTZJ+¸»äfV6õ`™¡ +Ô-(9ƒ‚ãîS#¶¨ +G±íAœ‹¯.qy{ã)X؟š¸#U'ì;÷ݽWÔ>̝?;”ÿ͹Þüñsaª-Nø±ð² ?v)Ã}V쐿Ûïçy™wÝF?ÿœ{åu çv{ü$œ­ØFgv+¾:¡N•<Á6%k’{Šg¢ï*ÿ]ì +rœ=hÔ;5áèԄ£“Îc Îx”m£ÛèCéMÒøœ¤®~1àk†Ò’æe“¨’PÍhÃג³­Œ;Yw²²—[ã”9©ûÀ˜ÜDb7Ì÷¦]P 4U½¡k?ÓÈï +•=KF‘Rž*ŠL¤UȨ¬ÙÊ ¨ìh^‹ûü}¡-µçà‘Ô¾m¿ÆÙøû—}uïoS oáyøÑWROÿéXjëî_ãI¿Lý+u—cÿ.lüYê3ÿÇA[s yPé§DìF ¶÷ L
+]§›3„Ñ>‹%ƒ‚ÑÁFƬ:ÐT3“F +°·§?Ýe÷•CzjWN^¹Þgç•Ë™ÔšI¡ü»²ãj9ԗ3)-W†³\¸2<Î890/°P¿Ô²ÌºÊ°Öú€ù9k»õKËVøUØfuØlV›Õ¤·ûIÄç2ˆvºKJðèõ.·ÏtÓg¬ УèT¸Ý(’ÃÔEÇjµè‚ªtw¸ŸQôÌJŽ[µ]“¢&cDêÀ/g6ºÈìò†pnSnK.—›ã!ÝÜì !<ÿ«Ö)f´Î7O¢ý·ý”Ö™Aï OÆFQ7}34‘è„›Êb¶ÛIÝì$tíCív¡ŒàV :ÅZi•ûÙìý(…ãŒXҟ(>o¥-Ç[i‡`Q•rŽB‚3ÃõÝ x°j²¢\O†LÔÙêÖ©ÈãdÝ¡·ozëݑùF¤O¿2ᆫzD†ÿ?¾jÓ¨žL•ûFÿzÙ#ïgÇrG-N-À½îXß×(u.æÊ*–]>‹íYœœþ‚ÿ+hË%äµ½(/㍍knY¶Òêf«Ìïe±ÅfÍUcÒ£4€m«½ìÂf ÂbÌâiÜ4¾™[Äó±¼Þ\e`07L‘]’;4oW/Mξ*ÿÎ,K”"ã\ +ˆi@\ò4 ʦ_­¬1 +ˆk@E¡Ê7ÇsI.—ëc-‰ÕO
+OŒNˆ]oœcžk¹Î1óÌx“ù&ëryqnsl5·Îx§yõnyUîí±ư̂¬›œÁŒZÐ#·ûã>}¼Ç*ðÙùÒ^q4ø€¹Ç2ÿ~⏹Ì=‚y1\5Tçe°‡>tqŒ1%@oPUzš4°ýQÅ'՟_é˵˜BL~¿NyŽˆ8–›y`­ù{øŠê|Øw҅z0ۆ)G2ãZ܈›ðF,âvœT,=h“´ièñ•zÍa¯×hTßµ(¦£\@YµÅBè:çi%DßYà+¨Ë3Œ#Ì#€ãvªÚÒÊv í]UûxJ­Þ^+̺]OÏ8U4ñ¬È åž Ñi:
+@gÔÑI[õ ‚éVUíÂÝoÑeUIYiÆæÏÍc‹_lïXÆãt¸]¼›•|?>ùeó”_/Ÿÿü¸ÚÉýS׏™=óÖï~þä«…}ÖíÏ%¯ì‹?¨k¹iõ¹GßHýã!üù†»¯Ô<¤ffÔ=5QñäŒù¿š>û핖»îYyõè²²¹ùýw/Y|¤yÑW”²J@ßÇ<îŸ(^‘ñ/‰Å"³Z¤ÿd»ˆÌj‘~Âv±QH A˜}Äþ—¾4ï
+«æ—Å0&ÅtåãÝ8³_øKÅÈø£.ÿÓTøO5.y^ãŠ)Uu¤oÔíy¨»6³†÷‰†Ïevö@õ×t³;èÖ+j“¬T6¿.åÌÛ·Ÿý]¥-$FÀMŠ!n­ãëtoêxÅNW–³¼œï¯Ê_©[b}FøÒ*™±Ñ-¶¢Þ¡I‡†•œÙC¿Þ'šýDínÕ°"rÆê>®ôdÚwC؅îZit5¹Z\œËÌÞÌÖÌć™Yàlƒ5tÅÎlSňAÃ_C—1ð\#†.1bhpRó‚Q][`¾7,`CØ¥|°“# °£Ël¥£7ØEêÒ«o|ezêÜ{¿MmzåòíËßß#ì;¿óãÔù'ïÁ毸Ñç[î¾öì€QՃn1”îVÄ'•,¡ˆ¡ c¨¼'³¯:¥m-:ËÔM%ûNÛ{ýŠlªH,Òÿº-³Íèku±ÔÀV¾©é¤JœKcÂbƒ/óòÏ&p.3ÌYœÙd@ec$ô:¡øãÃòLJmee€HÕl§ˆ_É-p!Êçb†bS‰©Ñt§îNýFS‡é”É6՚OŒ:’Y¨ÕcØEðÊêj¶üOôú°NpètÉa"8ôÐÔWa3txÑ1#<¿²V‡[tup±b&J~å‚7-„šc µ)óa£Ð!œ0!Öî26nSMˆt›< +Y=ˆâóžô¨‡Q2«2tQF5`´"+àÉß[õvL°³@V×í©µÕú0k±ÿÅtÓíêÆÙ"¸LµÊ0Øùëßáå=C9=ðú×;Áæ?÷‡–¦¥KùfûߕšM<Œó U<—ÀDÄ’ì!’ø/Ä0bK!0<z2²ŠuÎÊvò>]Å(½Ë9›Ö{ÔVæ¼ ßýÁ©ÙҘûøà~ÊãòR³qk©ZqóBBeŽ$¶‹LöK<“¨¿ìÚڋú‡é‘ºÓ?ÕŽô.³E{Gp[ªùƒðÝ©Ù÷‹y¬zþyüŽð
+âP£bäúº½åD±ÚÊéáˆ]pÃÑ©õ¹¼åµ¸–#
+W‹Gÿù†Œ ^@;׊Wsí¤qñò öâbvâá´êÆïÖÆ蒩o8ʕáwîýâïФ‡ÚQW¦¿äü”*È6¥HoÖz;Âsa!ÃÎ
+¿Âa… +æ†Â9æم%ëÌ« 6»ö=gvæk‹yìL…žñ>Ÿ¿Ç»?ÿ÷Hþïœç놸0ݕB73‰ìö š½)+M¡;äI–Wò•EÃø+Š&êê×éf'–˜Ö˜Þ4ý`þ!a«(·`^.Î-w—Fž)ó HA ØRmÙ`ÙbI[„-––o-œ¥kÉÖbʜ{ûZ; wZ‰ÐÓ¶ÁÁ"Ò +–8¥q ۍa±8w;y^1{»ñÜïèÄfºŽjò ¥ÎX0UžÚÝ2ÿ^c?çé9 j²1¡‹äRžQêþ¦òð\ž¢H.uªÒML¹*Ïb¦ÑŸ¨ˆõ+WY¹íäjŒ§Ð}êáxI|G\¨¤F Õ?@Ù{_èv&Ðh{U²½ÁhyIeG%ÙZ‰+éñ%e.}µ›-j»cžœb¦Í3ý¦˜qÅâ܃â‘„Äj‘ˆÆmêæm&Ë-̂a›­D3]Ø&,‘ùeD 3c˜‡WìÕ·ë€ + T}'‘¡°ÃL'»$s %>ûŒJ‰ê“‰Ꙓ®g¨ª¢¶©èKvтÕl˜ÞSÁ~½ËóÔý­S„\N§ÃåŽÆ9Q²u#T⪦ãÀåÍWôžûáL\V³vŲì¤ç†£w®}¾VÖ»sÜך?¹tÞìYOijoŸ0ô…U£VŽrX̾ܘᆗÕ/ð,¸k¸2õʞKO[uY_üq~@ÎY|EãÕ£/»‘RÓj ¦õù¡lü¦r3LÖ\¡·P#Õ¡dˆ„B9²À @ShcHì—Uåªòpð5èÌuÖ×5¾9ºëͳ¬7¸nðu„>0}èþÐûiÖßÜóþ%ûx(ò†…bk±£D¨¶*Âk­pðaö?ù³²IvZx‘ @”°Á°=š}ãÑô_ºŠ¬Ärç5bÙ¨-F^]532Š1z2.Å3še~Š¡¨Q;´g¤»[é\Óe{ã"l#ì`C[²3âà=0œ§0ÐPǐŽS†ÅéÀ ´oÅI|
+ó!\GcSÙNéSšÊ¦Žêa¦a;E=ÌPÓO¤¸Íªºh÷°‡-w°%oì +^^q‘ÖBÑj¡ºÖÀò@?gëÝ°•¢#ü±efŠs ®¢ 6P±ƒÄ)£hNö…Íd=žm[¸óÚ ”Ôw¿80—”O¸wɋO/^ò¢°¯óŸFox«9õmêýGñ¦ƒî:ü›£¯³Ó¢µé/¹“Àu}ø{‘;}JÉaÎ@6‚z[Y,«cªë¦q”[VX±Õˆ©¾ Do%O€7b‹SÒÑ“Ø€Il?=û 1#¬Ãï½®Ú‡Ji ŠÉåzg +vËçnÌjt?Læ6›Ÿ’Ÿò™tf¯a™ÍÍ›šÌ-ægL»õ{ »M&—iµé/„³äL±Î·®°rVLyg¼„­ +4B·6¢­è8:šœÕjDú€®ki¥ÉpŚkÑ1¾œãg:ýi«~£¬d¸”kL„0Ý+–èa
+ÓÔ¦“õaF†Â0BaèpCC‚a'C7'C='ãwÎÜ#IÕ‘,ÌGg IL:Iê)XV[êå/?Ôe&¨rÁ5,ÌüCHv¡o=”.<Mw.,Ԗ°l•Årà øc& ’¦ö`·º7ºœÓì2Û(NqU;³¿}éÃÔ¿~uçö?…vxWLZûüSw̹¯r¿|gc˘¬Üñ¸îõ¯¾ûþ+·Ï
+¸tLݗ‚*·oŽ™ËÍCÌBoGïÀUd¼a¬c\`&™.ÌÐOs4:Bï ¿ÏúØûYÖgŽoÝõ~Æx‹+Jø(Cî£ÜIê *pOW?ÒÛ<œÔ˜‡:†®2L4Ï4&~á:‹O[dìÍZ¶Ï1J6L‡»ˆé|ÿ2c:et>¿{™ÍbÌfÕ*\Œy b²|Ԇe›bk´µØ€/QÌU¹“ÍNY‚‰cʧl"ÅsãV6f$Ñy´Yè<Ú´E›¶X@¥‘Ò"»zI=ðÁž+1å^=ù|P:"“ÒOñc´ÄIAF?LîIA•®Î0EBò1œñËk»qj±3“¨3ѝõT1Wpœªk‰† ¬†zÆ#½©`ɦb°Ü}k߇Vü~ñœ÷noÜT¼«3üââ%Oo»yéã«[îÉ-˜[7f ±œJìo¿õ«×?|û•HÃA"Ó8;SÜ!p’ \ƒÐ Ÿ`œÁÍæëguNõ?°¡:¡Œ¥Pv€s° œuœññ½ìý¼½í#}c쓽cSíó|SKÅ¥Î3äŒGF.l5»Ýµ.jr®€u£¼U&²Ìû í#ÏS*Ñ8{‡Â¦J‚¾? ؂[;5rÑ1k¦Ö¸3èGÌT5kGºÌT±£#o¦¯Òç–'ÍØì Q}9/§éËT
+ᐋʆÉlWl™ÊL3û?ȹ’’[X®ÍµJõ*w›÷›w•W،³tÞ/–0 + æ_=y€g˜çfd×öL(P7hVu.¨ÊlgÌìc¢šÍB-¨~z‡av3Ž°ƒ"w;¢oö~•ú;þô{lÁç¿4´®š¶¾óC2ÆÔw❷<‡'ºŸlÃ!¡&œŸú$õƒÞ±o¾õàYÏP™“èÐ"¼‹Ü¸@ :ôØê-ö–xo“÷aÓ#æçÌ:Ÿ9ߜôvxy/VÅ*Ï֙9“5`ÀN’pdñœˆ [ؑÎbc˜¥ð™ÍEl0Ý&UÅäGîØY/½ú2+FIBåö*”z½Š¨9˜ß&Ÿùmr(=£¢ŒÇ滌_ۑñkÍÄ<[Þd‡¿AÏgg`Гï¼EÐl›'q¦;ÁQ?÷i°}՝Lœl Ž*vš·Ò¦î'pÈ6Q/‰:Ð{e½Ýl¢Õ8Q¸r%N=.¤[Yïò
+ê`>MÙ´“Àkݲ%Ëwû’“ý}KÇ9r„Û¼~ÁÜò¡WÙ5 m¼výùë€ò¥Æp_åQ!~Mi4G‘1æa¬qˆúlov‘1î(ŠVû8®4uL”ꌳŒg +ÿtZzF‹òDäÈÛX´µHêéSP]4Ô84RS0>2¾`¶4-2­ ±¨¥èü/#ßD¿Í³¹]¢³ìlËdILËaTÂq ê@GÁxm'ËY¬†šœ€Éàr–Åʺ•þNÛ+û½’Ç\1ç¨ËnÅÝènqóE0%dBãÆnƍÝ]ÜØ͸1=TÄr¿V¹1­Ee¸±[]ŠfÀYÖÏ*³æ,²âÊ 1d
+1d
+1d
+å´±³¦­|ÈZm +š†ú.¯¶2µú(®XsØñ‘mY=he¼ÙêM-ŠPöœuLd\±rwÍX4#ß3ôÌ݉̎êªWkˆp7ÝxÅl‰<u×4åÒn°ê™§5Þý¼Áu;Œ¥ƒ-_ë±à%ɏNÝðÎÝnzfÆG[ùõCÏ,¿eÛö›–n«ó‰•NŸT‘¼ W}ü Æël9?çû#K_à
+ßé8øö«¯¿J©v +BܗÌÃxÿ^ä’rºËÙjfxÅøÞ\ +·Ï̳,§Û[îÖÙL6'`d +’Ãh0i2פM7ÛàYHÇÑÓ+e}ÊÓzÜ¡Ç.&p]
+Û>—ÏbX=µ`ml#Óæõ>ZOϖ¥ÙípЉf^uvŽn½c÷gö°m£˜;´ ¼OyÒuÊEš\[]IWÚÅ»ˆƒMµƒM©ƒM¾#Æø†"C¯NÑÿªì=Žx¶7#³vVq3n¡š:ÚÄg8ÅYÕ@„±Â̎QÎËk=Ý·‰Ìö +€N_ŒÚÎSըę}GÑ"Å,¢ÉÍ:àˆnZ‰ô?F”©¦Ëå´EmlêE§mMÛ­K^Þ¶xníÝU`|w_ÃStN!¯¹yÜ=Ë;÷wX “[E÷ý ?«x‰AݦÒmC¹!ã=?¯9Îk‡pU€gsnªyY,²Xb1<Ü©©ÒÚÖ÷Nmë{§zЄ0Cc±Èb‰ÅX%ØAÚ&’LË`-÷c+(}èðÖoÔoÕ'õúcúSz éCú&}‹~K&ë¸>­7„ô ¿K<áô"ógõ`­ÞŠ‘(ˆ¼A”bâ·ð[ù$ßÁçÅþOæÂÏ«¦¡-g¦ŸgÓÏhû<¼&(xÍÕÏúi ¨ÀÒý V±ƒÜ0Չ®sE }a÷õ–‹/vðæ{m[[ÿ×#GÎ9ùø¹A¬¦ŸHÁýØlÚqe¡êmV=Ï&Õ%oQýRlÄU3˜Å&›Õ|Õ0f±‰ÅfóBLèϗ «Á­‰ç /d!l6Îaâm‚QbC׆Ô(J›u#Hj·¸ 9f0l4␱Ú8ÚÈÑ +CJÂÌ"fX™OÇdÖ¾‰Ž¢QÇì|ÆKÞ,ÇöÈå?æ¢Ô–®%×ÌòùT=’šÎ ¶Y¯k@meekdºùÕ¢“­qlðc½Eò#•ˆ~´¨LG«ÿ.Ð3Ê«ÛR³rú„*ú´• +|`ÿÕ;ïüpóC–a÷ñ“Ïm=4r:呷CTÁöЍTÌÝ)é"êÉì›ëF+чzà²;5\DêjÀðí“«è«î—+ï­¦%½Ô4GÝO§Ä€Q[…°E8&ð£!:%p!¡IhÒœÍ@8•ÙÑ71¦çMc Â`7“îœïû œ/»çc¨ŸÑ‘tI[âJ§µE¯  QüÅ@)€yÂÕ=vìîÇåm··±ívª$ã ÏDɧ{QVF–ÈÝþ‡
+Ø4 [¾€ø5À§ÙÚᜀø5À§&m¹Ç¬ +°j@–¦ÁÈ`כdi‚PÖ»Ø4À¬m×Ñiȱ?*#æò‚?¡ÿ³û³°ð{áL˜¸uá¨Þãë9. ˆNªzHXŒú¼²áh oŒm‘П%¶Ñ†m<3`=ÌxeafÀ:ؑ·Ìqx€3cù٘/ئmîfÌâ%èÑuÛ,ÕÛèÇ~ր¿«?kÀO)6ڀŸÉI?ów@nJØ~mʯ¹ý´…|DÊ¢ìõQƃ¢ŒCEcø(ÂÔ¹CB¨~Gߢb%ã&HÖöAÓÿ –‘Êç5ýý´â`âYEI¦Á on¬/Ýõcî¢úê˜:Ö̓×Ðý”½ïŸÏBDU{àæ#麕ÍÝ}Ó°ÅäȊ;L6?¶›šðÖ¬®ÿÄêéÿÙ`«ênv°”Év¦þw—ò—>3gÉ¡[ßzìù]ÑÉš~ÞV7}ÄÊ~|üþQS®­Û·cOgyôú)ýîªóÒºtiíæ{;?ÈètŸ%¹ðN%KàÄ,²Mn—ÿÂ}‘uŠ;“%òtÛx Ü2?(õ÷¤=|Xç°8\vÐé°è2Ì“ECZ‹Fq–Ì€r=Ló0ÎÈ´9#ÓæŒ]ڜ‘±c«‘9ݬžisFºVϐÃhÈø}Ï(ÌAfd
+£ßq”‡²­"ªÙyNyH“g«'ééððŽ”9] o\ ‡\ {\1uW£Í–Ùlû“
+áG
+­›BÇg¸[‡bÿ±‚8ÊÍÎCv]ªŠwš)y$ÔãEêÚH¬ ZžK´é +:ƒdàD9n-~l5Ø3C÷‡/oCŒÌ"C7¬XóÄ⏯• +m…s¯h~–?°£¦idéòÎf²ú†yï{»“q’þ’σ™7#/>¸ÇÉþ]Q–z¾žBÿR™A!/+°K¯érñ
+ÝD±^7Sœ­Ó•Ëýìý\½=5òpûpWg²0Y?Vn°7¸Æzæ óôÓåyöy®éž±S/
+櫹ñÂxÃզ빠Ãõ&ƒ;ÀK6`TÝwœÖö!|¯d1u<×Ϭ<?C©ë±IÌۖñ'k  ÈloTÍg¶@2 C±äÆÊK$Œ$Y
+Kœtázô:܊֘G5[º¨
+’EU–r‘ÉBìdbîl`ØÁ\1þÁ¸%bÿ×)ÐeL1'Næ_ë±3™¨—:k2ÿT¯;&È  +g -ëÕtŽøÖ«S¦87¡‘ßþÉ~‹M¸}¸ -4Õ"̓ó):†ö%b¨œ¨Ž¦ËûJԋ×<f¦°i“ÕšA
-<¶œRí-Š–—ñ}–%²å#£/+ü·^6ù¹—-þO^¶>çktQÁüªé”×ÿ%ë0nñð
-ŧAÒEµgZIoJ ®Ý ¡y šòÙÖ®´v³’ÜíùR¾Ç`¹v(ÿeãÑt
-
-endstream -endobj -153 0 obj -<</StemV 60/FontName/GENEJE+Helvetica-Light/FontFile3 152 0 R/Flags 32/Descent -204/FontBBox[-164 -212 1000 979]/Ascent 720/CapHeight 720/XHeight 518/Type/FontDescriptor/ItalicAngle 0/StemH 50/CharSet(/I/n/d/i/q/u/e/r/space/c/l/p/o/t/a/g/eacute/b/s/quoteright/f/one/zero/percent/V/comma/v/period/four/E/x/h/C/three/two/A/m/five/six/L/parenleft/agrave/slash/colon/seven/T/endash/parenright/R/nine/j/eight/B/O/S/y)>> -endobj -154 0 obj -<</Subtype/Type1C/Length 218/Filter/FlateDecode>>stream
-H‰bd`ad`ddswõwô÷Ôv--Ê/HMÌ ÈÔ -)ÏÉ(üaü!ÉòC–GÌå÷œ_5??°~7ãÿn)ðÝFpÁ÷h!fFF6¯CCS#çü‚Ê¢ÌôŒdMCKKǔü¤T…àÊâ’ÔÜbϼäü¢‚ü¢Ä’Ô=ǜ… úb… ÔâÔ¢2 (š Û‹˜Y¤¾÷ñý¼ö}ÑqÆï?Þ1ÿLú¾HôøŸwþì|õÓILÿýcú÷¼éßãºÙ~—Mg¿É -`xPN
-
-endstream -endobj -155 0 obj -<</StemV 78/FontName/GEOAOI+EuropeanPi-Two/FontFile3 154 0 R/Flags 4/Descent 0/FontBBox[-71 -264 1000 860]/Ascent 0/CapHeight 0/Type/FontDescriptor/ItalicAngle 0/CharSet(/L1152)>> -endobj -156 0 obj -<</Differences[1/L1152]/Type/Encoding>> -endobj -157 0 obj -<</Subtype/Type1C/Length 609/Filter/FlateDecode>>stream
-H‰bd`ab`ddäóqõö÷qÕ®ÌMÊωXüeø!ÇøCžé‡<óq–ò<b¿=~ïüuíW«ÜÆÿÝÝ’‡ý{‘À÷2þïՂ3~²1°M“R¬iJÎ/¨,ÊLÏ()NÌ+N,.I-Ê,ÎÎM,É000Ô30°p†É+h$k*ZZ˜ê€Hs0i "- -À¤¹‚cJ~RªBp%АÜbϼäü¢‚ü¢Ä’Ô=ǜˆ5
-E©Å©Ee@A¨/˜´30v0¶30}ÉÀÂp‹±þ{ߏŽï7¶Ï¿&ô½i¶ð‚ï]ߥD÷Ϟ߱œ£}kÑ´³R;çÏi”;™>7evíÜêÕ§Ìæ~0yvëêÂÉÙS²§fOI›Ö8}Ñ´³«ú›6OÕ¿nIùÚ¦YÙ½E J«ºóskš[;{öÐ9csßԅ'B»B{úõ5ÎHžÐÛØSÚÚ[3hfàÊî¥sŠæew6Քg®+šÕ4ascÿ”³9‹ëÓ²›²³›
-›[³'WO©^Ý:wöì™s7\Ï1gjgy«”gQC{¢\GþìòÅí|?WÕl~¿óû™mß73îÙü]vß÷ú]ß63ÿ8øCC´mióꌕ¡;”z£,\»[s¾`ù{æC»÷ô¬ë™ÏÃ֙_]X\šh?9u»ßå¥ßyWm<s÷»@ÜdgŽ?±Ž¢¿ƒ¿ëýÖû „zßÁ4§÷;â¿ƒå6‹}·ù. „6 ú·ìo „Ó q9¾Šy?MgýŽÁöœë7@€!!
-
-endstream -endobj -158 0 obj -<</StemV 85/FontName/LEKOLE+Symbol/FontFile3 157 0 R/Flags 4/Descent 0/FontBBox[-180 -293 1090 1010]/Ascent 0/CapHeight 0/Type/FontDescriptor/ItalicAngle 0/CharSet(/copyrightsans/asteriskmath)>> -endobj -159 0 obj -<</Length 224/Filter/FlateDecode>>stream
-H‰TP»nÃ0 ÜõSd¥¥-`hIZÀC›"n»ËmˆåÁIvtàäñÈ#é©;wÎ$ _Ñ«ŒÆ鈳_¢Bp2mTÚ³ŠÊÊ4‹ûuNh;7zh[B¯™œS\áЯvð·cóô5Fã&8|³Ÿß\è—nhÑ%h@Ð8zúáSZÌô.­u¶/ôç Fé&„¶a"€Nÿçßø¥{kÎÙ³ U¶ÁûËÛ« yÄ_s™VN{˜QKŒÙg½¿Z,¦ŒÃNj‚ÅC r`žÇl¿
-
-endstream -endobj -160 0 obj -<</Differences[1/asteriskmath/copyrightsans]/Type/Encoding>> -endobj -161 0 obj -<</TR2/Default/Type/ExtGState/SA false/SM 0.02>> -endobj -1 0 obj -<</Differences[24/breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring/tilde 39/quotesingle 96/grave 128/bullet/dagger/daggerdbl/ellipsis/emdash/endash/florin/fraction/guilsinglleft/guilsinglright/minus/perthousand/quotedblbase/quotedblleft/quotedblright/quoteleft/quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE/Scaron/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron 160/Euro 164/currency 166/brokenbar 168/dieresis/copyright/ordfeminine 172/logicalnot/.notdef/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu 183/periodcentered/cedilla/onesuperior/ordmasculine 188/onequarter/onehalf/threequarters 192/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]/Type/Encoding>> -endobj -2 0 obj -<</Subtype/Type1/Name/Helv/BaseFont/Helvetica/Encoding 1 0 R/Type/Font>> -endobj -3 0 obj -<</Count 1/Type/Pages/Kids[9 0 R]>> -endobj -4 0 obj -<</Subtype/XML/Length 3649/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.0-c316 44.253921, Sun Oct 01 2006 17:14:39">
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
- <rdf:Description rdf:about=""
- xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
- <pdf:Producer>Acrobat Distiller 5.0 (Windows)</pdf:Producer>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xap="http://ns.adobe.com/xap/1.0/">
- <xap:CreateDate>2002-01-07T10:25:57Z</xap:CreateDate>
- <xap:ModifyDate>2009-04-14T15:49:41+02:00</xap:ModifyDate>
- <xap:MetadataDate>2009-04-14T15:49:41+02:00</xap:MetadataDate>
- <xap:CreatorTool>PScript5.dll Version 5.2</xap:CreatorTool>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:dc="http://purl.org/dc/elements/1.1/">
- <dc:format>application/pdf</dc:format>
- <dc:creator>
- <rdf:Seq>
- <rdf:li>GUILLE</rdf:li>
- </rdf:Seq>
- </dc:creator>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default">10217831_BAT_M8_BC.qxd</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
- <xapMM:DocumentID>uuid:e3285f3f-8d6d-4379-a839-6ccaac6dc85f</xapMM:DocumentID>
- <xapMM:InstanceID>uuid:b10b14b9-f4bc-44e9-ab18-0659d4f00d73</xapMM:InstanceID>
- </rdf:Description>
- </rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end="w"?>
-endstream -endobj -5 0 obj -<</CreationDate(D:20020107102557Z)/Author(GUILLE)/Creator(PScript5.dll Version 5.2)/Producer(Acrobat Distiller 5.0 \(Windows\))/ModDate(D:20090414154941+02'00')/Title(10217831_BAT_M8_BC.qxd)>> -endobj -xref
-0 6
+ㇶ—’zåè.7ý8aœþZáZ=êÙÞâ,ö¯-Pæ]t7þ†<uçka×ͽëXêäÞÖ5«[w­ZÓJ²pÞ=KRþ¿Ú{öð(Š<«ª{zú5Ó=ÌLÏL’Î$™L2!d’8Hó~-Fž’
+BÀ„`ÈC”••°¢øýNÅs?|žî
+òTÏYQqñ|ë‚ì'p¾8=/ç'²3¹ªêž8€ûÏÞýu_æ÷M÷¯{ºzª«~]õ{Wêð׿…yÐñ֛o½óڛoàÊ®O·²˜*Ü ÞcôÈêu¤:Ueôí:Ê×KåÂܪœªÜ1¹+ôM:?Ü?<4Å?%ÔÄ_&ÏóÏ µñËäVu¹Yh¿þ®÷hàhðݼÞyÇõ~ÝWÈÆÕxN +;\ÀNQ›Õ“Ò×¹iUr9_˜‹8_Ø)§–!-Cšå¸±¢#"TEC\ öŠ¬NÉB7,ߑS†DÝI_j8Êöè6 +G"¡íêWÒ=Õ¨ÚRĚ*XS[ À/[„2† 5ˤžcúá|C52㟂ò'Öà9– CP¼ïą6 jr%³M@žÌ|àËñÒ é“Õãë~×U·i»æ³ë›ï¬p=¶òº§ïéޑnµ½xÛôéúïۖ>{û¯†§Î2>ðæûo¾ñ! +&¥[™ã¸ßU†×튣²À4­’¹†œmª¶)ï¡<[“5äóŒ ÍôÌ -ò,
+-ÈëÍ{{ß}ŠûRþ* –¢ˆÏI¢y2š 7£Vô±üiàsߗکÐߐY‡7–ìNÎfqgûÕ ÓßÙÖKõˆ"^ªb( ”^…Í£ªŸ<Úã
+Uý(ª…ª~ªúQ(CA•1>ÒŠñʙ—ϧ#\•3;+fÑ:÷lLo¨ŽÇNu<vŸéDmj`sóÎ×îXʝ,ÍNF¯ÓWaׂN貌1µ–2ç{yÙ½³_LÛñî +¯unM<}]÷cϬ¼f[ºñ#.†ÐþPúÆÇîøi,óûÇ_ýÓ{ü‰pÊ7áÎ=ˆûÕŽÓ*=Pea!›`Dz3Ù%lË .^à‡Ç%8ÃC‰¾ˆ@b›xÈGtô È9)CÍæúûº‘ áGÕ5•rt°<‡ÿ2Õ#¦K9oªGÜü’zä„:¿¯‹D¦‘öJfRõÐz'˜ßE‚Í·ÂTÚñ<xÓÖQ­ +—]>j̘—{óØèݓ†?^2±aAWê=\ç†þ/˜¸e†2˜ó1•Ç&«Ñm,+W”‰D³R#õebÖL¤0ƒD2HA!ɧŒ5TÏñF† S„qEs"-‘Õº¢Ç<O•¿Â80à:µü¿-„f#¤VA10Ÿ'ÌçIóäyŽ6¾MhÛ¤6¹Í±+º«D!î–E¥µEÍb“´8º8ÖSØSÔ[t·ø€|WìÞòúˆø¤¼­ä‘ØÎèkQ_,#AD2Ha)Ê Öór™Gà2Åe“#"Ò1ݗlæKŠe‘ +êÑVªÈ +5oD+§F2­AkԮОÑþ¬qŠ–¯uhŸil¾v§†´1ä`z¤öÃK.WI°Š
+@dúÔëKP»Œêt% ¬˜—Ûž‹rÃ9vÖôR¡š—SíÊ)ÃCȈ +WHùA,Ò O QEŠ×Pý~Àܒ·U£Ù5”ÔtRJ£¾"µ _qß?.öþï÷PµWQ¾ÑîpòH,#ÿIʗeéË2cJ™éÉG‘¾=ä.eAZƒ‚’²Ä‚ªýU¨¡ª·
+US˜¢ ¥wÝl|df(#õ¢Ô’Oê¦S*ԋ:»(´îŠn +n?Q:äÑ`'KÇL=(‘Ï$ÒÚ0Ë"„G¡ì`v< ÇOw]œq„‰Ç;‰](K9M¬Æq’Lµ“ºÁyœø“Ý@¤ßäS’!y…6oyÔ¥ºUÊp‡BÌ‚¶!x“çŇΈ:d¾T ÁX‰ rq6òÕ\ÂњÁtCE ²øÚµkAֈIô`ó>qNêʒhIªIÔÖ]àvŒ!™ Q´áYåÖëW_WS|÷Á-£/*Û<ó7/6»¶ËÝ­«Û|¾Êк—îÓzð7þŽ /ëj7²0P\5yíÅWÅò㓮_˜1oF]a8×#U^=¯ùÁKŸ&ckQÿ÷¨Ì¶øa>Éc™Îd[ð5{á2ˆHƒ£ PÉLŒôj@Ù!BøT!®ˆ˜b$E€tœÃžˆ&{"Ã~;?^¿À¾ÂÞkßdgfj²o·ï·±s4Ȋê£ÄJQ©C†)©Yˆô¥=Â.
+cœÅ5›Â€ýyÔ°vǒó´64Cº©¿>Af´ÓÄ»Ìh®êjõPV˜F±ß´%–«Žæ¤ž¸H +þªþÊöòuëvîÞí‰Çò~PÕ²-ÚííéRwO+­«“5qàÏ 1´æøH÷øH Íw†æö&âXÄ{|2ôø$<¹pûj_F.õe˜ ߀\ê+ø‰¤Ò©ŸÊ¥~75 +øÉùéäåHý^ːdÙüT]á7saà&ë÷Ãý~è¿8H:¶„£Áï‚hEð¡àö` +šªTS +kª[åba`"%Ù»uáˆp\`…ÌD* L¤–ÅC¤vòtþ¨4*Pó‚p±vŽbͲ!\(vš“*u0ªOZ)äðËdU§Cq ÎL €EOVï25¤eek1Ÿ‚KZž%QªõÓW‘*I™†Õï_¾­Q•vI®«§O¿cÄ®vMZÞXӍîJíÜ8lâô™wނ’g?Á=$¶$Ü£"ª%ѧß[ùlœ#x¾k4òYÊρDŽßôU@j–?’ßÆ‘ç 7à]DˆßVÏöƒ¦nÐ{klD\I‘LiWRð¹Ã žlþӝx­½H´nB^AÄð†
+B¤8|xƒ>1nˆU$€Ž7Š\
+bBTL‚q˜(΁sP?WX— V¾U¸\ ¯E«øë„kÅõp=º™¹Õ~ ›ð;pŸ°Y|l_{í;ÄCà5ñð¾ø +ø\< úÄrü8bøĈŠub#0DÁf¸} nœD&‘7ñþæïF¨U¡Îò€Î ¤-È9*V¡g‘Í&KÄÏñh· +þŽŽƒÊ7ñ:ÑÎółè0aŽÏ !®ˆˆ¹CžGrvQ`´UÊPŽð†a½$õ< í6l½6dØ!èȀé«#dy:¨¥æ§æ§OÌ·2( +Ä{¹’çF’ØËÇòçO¶·v¬ömO5„H·ÿñDq~ þÍsé«ÙhjÝҎY+Ñ-ā‚)í?1¥©’ÐP‹ÒԌþ÷†ø³Ä¢£J‹qü¸
+e"”J"ŽáöñSúQÜP‰hIŽÐÏ%Z²Y¹‡½‡ßâ¼_ÙoÛÏí·¿©ŠáKãª5p¸´Þ!ñ•îKÙ&{“4×y/¼O¼OڋöɯKo8ßR?aÞÞq|ªžÝn«O%¸]JÀÇšÍI0…ÈDq4ܘ4d<nyç/á8ÆÎ ä8ÁÆ2x
+Qð+퀊âP%<º ‡ÄȪÈ)HՃࠀÔb xä8耎b™ñÊ2#
+à s)² ÄF7tOvÜ GDe!'Ü`ˆ¸g÷Ü%\/ÍË4ÖpêÌ +(҈{²kõ+o9ílÜ×êIµï4NXÎÅ\QÂêìùVîؤ¢¬ç¬wªÌ-Þٝj}=_ßd¦2Þå ä&%ÒÞRnRŽø“ þ’ãg ’*-ÉIÂHAR0™˜¾xՔ‘Ð%š{ ÓJµŸPMÆ
+™¨Àué-ÝV./Þùaz3¼ýè'ÃÓ_¢LŸ™8tLõÙ´œzNiJÏ'”TžÎü¦¤ Z†y´€i06=úèC·
+k©óûŒJSD•ùt+›W˜Š¥,k›9¸ˆQÎ&Æ\Ñ«0Ö7'qíè’!ëQj•ñàÑ`àpPSɎÊH”9 íTÂÄÁñ˜±<œŒyç(ψŒá0pÏ뱡 •lì²àö9î©D.qÔʵŽç—sÇ<“|Mî&OSN«»ÕӚ³Š[éXåúµ÷×979nsmpoðÜê½O|BúWõ×óÞ¯Ä÷þ·#¥žñö‡ó2¤ëóHá«ŒSÖ)Œ¢ +Tߔá̈;B°uŠ"«.·1š×ã)v‹^| ÈŠK.–D,"ˆâª/qä ¬†Qeø¥0
+ïC +»Ü†wšeH +nÍ®p¿äFî}pÌFÀøH~¢­eèòP¹Qf.‘ûe$ã+vVçOÔ°+¤¯ÆL +n¼É†©•Ä§Ô¾Y¥át0 ž¦æ&Cº< @±aÚuZ´»žꁩ۝3§nLožûæ¿Rÿð"3ք¢zûí©KŠ‘º¤¿Î»s’.+ü´‰LÏvf +yqO‰éçQG‚Q2CÉÜ_YãQ^?ÉïŠÚ¤ôòWŽÆ#ùñÏw¥ÛG +]='‘^ú¤+
+-SrÙXjË5kW¯DËξþ̘¦™„–cxT|Ó²¾¼¬9ÕÊôêއñÈ +«Üþ>û¶!`ŽÂ³>z؂‘R*Õ$LŠ“á4Ÿ,4ªóà,4‹o.QÛá"´K¬×Ãþzávx«pö¡ÆGa)’ü£ü‡ÐNÞÚ½jN•»“IP^ˆe 4\/ŠÅá A’7-$Ñ.œ¸ÐÌe#äˆ;E´*»xÞnã^À‚À¢[ŸAM=öˆã!'NùÀÙëüÎi£‰"ò“³ˆ7@ø € ô¨WSԞ2|µ(§ŒœˆSç-5Eä¢zõ$ærOR_IkÊR¬Ü–œ‚;{w)ŒòDž5['m‰^ÙKZ‘4¥™ú¥³ Χ¤ÁãaL!`í¾ØJ
+¼/4R ‹Ëø“f¤¨/‰¼øôý<À‘Ü5+$QÐ^[]CtÏM72‹S/w¬jƒ_ßÅðÜ]צ.¿^øgÐßoæW²—£(¡há,Øb†Š§JxDùNA•Ê&<L }ifפ8„Ês¨”pþüÎ|§c{ßa½ÃXðnúáD&¿M¢dXœG0ùŠXÅjÈÿ^’î ~æ¸ÔZê/àUàu;`˜Æy½Üìüpe©aøm¸Ÿì‡†×„™0áïÛCêæ3•èŠÓ;RRZI擀ÿ²êq¼à»T R‚óêq~©±à(.݁ˆ¯¦á•’WäÃ|³xþÏÅ;ã5¿Pþ² +(1H7FÔèƐª„¢?¨# Šâh‹nÐ7ëM-/ô3¬;ÇwÐñ6*ª†!ç;.«g•­Á2}/ózÊZ¡mÄs@Aw
+7æìCŸe ~q7îV0x£Œ1seµ§¿[e®¬–¢KE¥HNÎìõÌê²tŒ½Ûºz¶nëîÚ¶|фñ‹Ÿ°ˆýc÷Ö­ÝÝÛ¶öLX´hþâ[cÿ5Ò±âpþ: CÙbQŒ¬½è3Èt0kÀ†é5ÂKdU2Ĭ‡,܇<‹H°ØÌÝ@c?~܌Kõ¥h¤£¦§š9vÓ7!qbé/p“õÿ +¾Ávàžy†kÈÊZ4à™.]•½²ƒß
+–í†olÞLF½væK8Òv·_}×þ¹í°¿jGßóðnþauó¿åÑl¾s·<ä%ðOÙÉ¢ay9ƒ^ ÔC€˜z`¿ˆ/Á!ÔdÒºDɂ‡ ¢¿ÇRp*{¹0€Å`ÐՉ?°³“¸”xíæÒa«_Ώ_V^[ð?¾óèÍ#¦—Nô]AGf +·î]¸u90ÙðÚ8HV†@h=XÌ2ÀVύd)™
+r‚] 3k`=ÒìO^ˆk¸i)í‡@*Ç[2‰{»¾ž´¤½ÐSí)„s;ßþhÿ_ß²ÍÊ´$X–¾ …15å€Ñ»$A.ìC»w;h¤yf›1»Ey¸ô(·Ò= +¢à>8j§ïRJP)ÌÖõ A…?œî#q}þºjšû¬óDgêhòÏ7̞³ióŒQ’‘wy4×?êþËÄى©Ýò5lЛë{éB‰9çÁ—`)\MaüžAØvæ[Ûn’}4ß)ìeéŒcƒãùlp~¥|«Þïšë:ä®ôä`x–€åìÈÙáë$à?¨uk}ÁCÛàdèdØOavîßòU½¶`|dJ!**.vÿÝÝ[ÒVª”Éq¹§¼ȆÊß½rØÔªÞªÞêGk¤Zþ<(€q°¼ö–Ú'j]§Î…ºÒ_€¶ÿ#¸y>úßÁEJÌ„A„A„A„A„A„A„A„A„A„A„A„Aøÿ'ø 뱑OÝÜ®ÄG˜Ÿð–…3@"™Ã(Îfá\nàŒ¯„¬`ÝÓÄ!ðÁ‘Ž€δp&ë<›…sY¸YŸ'ªÀP0 ƒf«@ ÞOàjüí«À
+zf,>êÂ8Ù.Äç[éø—Ñ ƒfàsKqùÐMZð¾_½oã+Gc¼—%׶Òkâo½ßb|Ír¼ïËð¹°ä©Ë“zÕÐaÃôYWµèÓ:®îèYµ¢EÛѵ¢£kaOkÇÕúèöv}FëÒ«zºõ-Ý-]+[W43jÕu=ËWŒîj]Ø®·vë õž®…‹[–/ìZ¦w,ùû7ÍÀÀZ ÔáGìÁ±‚>úRp +~Pò@€þ²Ìùþ¢K]O
+endstream
+endobj
+19 0 obj
+<<
+/BaseFont /CIDFont+F2
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F2
+/CIDSystemInfo <<
+/Ordering 12 0 R
+/Registry 13 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 716
+/Descent -211
+/Flags 6
+/FontBBox 14 0 R
+/FontFile2 16 0 R
+/FontName /CIDFont+F2
+/ItalicAngle 0
+/StemV 15 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 17 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 18 0 R
+/Type /Font
+>>
+endobj
+20 0 obj
+<<
+/Filter /FlateDecode
+/Length 16338
+>>
+stream
+xœí}]#;nè{ÿŠ~`ßÒ·˜žÍX 79@‚<ØÁT€»/ùûW²]IQ²Ý-ÍÔg·M»Ä’(’"©iëÌÿ½OÛiÂlêï¼Û §Ië÷ÿœßþßxHi!œXí&Þÿþ_o*Ø­ !xÿ.üvò‡_ÎoÎêø£i€B°Rsz0‚Á ¼ûÛÛÿˆi« Ý3
+!åÖØ)QQxµ5‘|Ùù"“püÛ?¼ÿOBRÉ&ÿ‘¿Ât&2#QHÓÖ;mDzćI„$¢ CBET©÷K?P˜©h!÷Üó›²nëU$ËÂqŽÁ£ÛsçƏ Tq+~\Ŏ«Øq[ä ƅÀ=ž#¨w[‘ Ž {<7FҙÂV¦9ЫƒÐ= Ÿ[ƒ°ÇÅaÐغgáskva™#plݳð¹5HK)¶:ý-áغgáskÖQ)*oÍjä‚nÅq¶D-å$/ø¸Â㢗ÊÄG\TbN¤?&a­®ò´ƒ+1%€²‘bbÀsc„Õò¨m‘¨!pρçÆêÄÖzJ/î9ðÜ¡@CÔ÷–Ò {<7F(P¡ôV¦9‚×
+„îYøÜ€ã.¦’ªBÊA÷,|n +ߪÙA‚îYøÜ€¥9Niƒ×!€.k¥³éÿË?½MïÿýwڃO?ûç´Æÿÿß7°‚l\A‰C‰cÖÏ·ý*6c¶ …[ÅV˜¢ì ,ËCyCØ8–‡òÇÜV*yq…Š¡ÌatÓc¹‹
+ÎûÓZç¹ËÂDz=–¿h窤á¯Ð1–?„å{(R¨bð|åãcùË_D1%ۅ¬>@ÇXþ>–ï±ü¹¸©&|á¯Ð1–?„åûëø°|°:-ÀtYÀ_ÇÆKÃ8lì°d) ÄfXÞRä ÄÕ&Çb h?ðHû wt–ˆ¡ØÐËR1Üòx2Æâƒ[OÇP|hKà鋪hžŽ±ø Êä銯¬±™„säf ¶2,Sú ŸNy&dÐùê/hú÷ÿzûø3ÒùçßßþÏñ®¤ÛZwéŸ{ï08+¢*‚Û†¸b‚HÓY,šøÏùíßÿˆ`¹Û¨ÓïÓGµÛèòњ_š,Ÿ¤Þ9ðQ¹]~ÇÃɝŸ|^Y8ö¤ðƒø§‘HÑü–<I€8§ÝÆ!þ,Wµ(Šüm<øˆ™ÿ±Ë“$}ô‘@FÚLÛ¤ðþ?ÞÿüëÛ?þyŸé ÏMi'Ÿ¶G½u¼ØÊ8½eX¦ƒ@òn·±A#>Á×æ#r +¤`ÐÃF¢©d zÆÁ·¤5þ-þò;”|"øA»«'„þ¸‚,‹Þ+•ÍO&°0`$)““:A]ûȈ1îóˆW*”ƒ<±nhµ
+“Vœ0RiMVÜáßù…ã¶þh2Ëƚl[±DƖ%#°rŠŸ…£\ÝïkòmܾT»¸à˯Œô*¸›0oÉá]řùzÞ}LZ—g\”N4ö1ßTfZg с[—ïì’d#Óx§¶x§&ûÙS±žuú’ Á:¼ñö7î+è½\tìÈH4âÌ´SˆÑΰØÀŒjƒ~« ,•ìŸkÎy¡£§rüÌ̹dÈLç ™›By¼ù£í¯hK>ÝgóOô¥ß‰uó‡ëæ¿nþió_èŒ?y
+™‹ÜS?þ9}q¸ù3l¨°Ó¶¹«ˆÞÆ{Íæo¿õöO‡¶=¼¡“qû.=¢W“Í6‰8)wš!È>vfÀ:·Oq;Ä>Mã0OeÄtÄLpX(Jg;yÒUé]zi!Ø)pÓ9Éã9 Gëнõ.nöj!dÒàð"žn]“¼»Ðâì@UӘZÍ÷€«4àUÍy4¥ŸÖ52N«dwùÉpo%ÉÏþVÑ´ócˆ{°_Y靚ÔâÛm­twÌÅ"Ê©Öj¦?†ÃÕL¿©8Ÿ?&§¥ +‡õ(e#&èÙÒbj¢ÀMØýq&øD÷=jö¢FgL7BKÏô&{3µõÁÈ$¡0”Ÿ|ç´«2G}Ï'ÐKþÊØ¡uϹE^³5YzÐy—RJ7f=>Z·¦5‚ô,$í­^eQA²Äs{R®œ[yäÄHs¬›t/æëvDø›=·ºÚ?$èu² úÖDä\xô Š}Áà±ð9Þô}Ù{u(|H#aòqH(°—úCO<{vJ¯Dü¹WX²Þ«Q=ó_cÉ2º†Ž«¯C³-GýA­Üæ[&–ªïDßúGÞ]úªÕ€¬nòãÐ[ÀDӐ‹eö”gàؙ1¿™þċÌr{ªŠ,.­î¹gxbH‡í'Rº7ã’öÛ¿ZPóÈWaÿ<å:I'>e–§³ŸWÚÆá/e2ëírÚÆh¦~ð)nñý–Áå»?Ò!αšæ¼x£¶†¤íÞ5 ù8{(<›Üòy‡kÈg +ù Ó «œÜ
+¡m(ÌoôtB“üê²\ìÒæäÙ_nHö= &E¥gI~ô+JkcSü:ÆÔ‹µ:u¿ëÁÅ·;\ÈI,¥Ö]lZw±iÝÅÒ¿‡\8s\”Ηƒ‹o—¦¾NÁ©ÆU¢ÆZÎ\œˆ3ތUØy>x{TítI¿“8ò$qàIâОlã¡?6èÛt„./¦±:E€#‰ŸõèÙT¬ðÉþï{x£¨$:I,Hˆˆ0H‰·’³©¢]ªÍ¯ ;5µ_J¨úh§±è¥wV<nµhcõbº2‹žˆôÄw,H”V"y‘“1’+*Úèý)­:D‚±}kÈt®´£¦d²ã)ið¤Ó¡Ë·©RêrtÙ$žFéU3g?HD]¥€[¤‡T;îŽ_(W¥£Ú«P,=³Sí÷‰ß‘^qÙ©¹”Bj~uIŸ¸õ\P*uM1þO :ÆM9PôA8'gLÒu5( v;&•Ÿ…#v´úMBðÝ9™. +\îÚٓb42NÒéx»˜â\Õ)>ˆú±kÏyG~{î`ªýI²?Vqî¿2*D‡ k
+5 õ\¦Ó~ ¼;ôÒÄMŸÃñþ%Ocø5O»ä5O˜9~MQƒ½ÓáÉáPóØ:ëއ'RÉ­NÛû£Öbi6~ïsiro»5âõ׈×ñÒä}þÝkG˜x™W(öfØÀ½õhæè·¶•žêŠ®íD‡Øž3=\Ðý&.}ýÜræîäç9'ÃVLî÷úžœ|>ÞÏ;“4':YsÈUª¶ÇEВýK•4GÜ3ä]†ÊN'+DG¡^[͝>­sãUômҁ[…IâŠhɛœ3
+z~ÄÀ„Öç÷{øY·5©žv=ð{‡«ùópóçinKjíxùMé^~V1Öã]rqØ¡5½8,›‡eŸ +Œ  p Ý5×,qÜø5½uõ=jøiq€1xt{áÜø1¸í4=Ð}H¸çÀscp šÚêêš,Üsà¹1B†éØ)]W{<7Fҁ¹p
+A÷,|n +g­]"h•èž…Ï­AØs÷7!螅ϭAàhò8e¾¿ @÷,|n +ïQÜÝPzÕ×~‘NüKçùMîQS̽ƒ¸çÀsc„«¨5î9ðÜ܂ff¾w÷xnŒ®›ô6ºÀtÏÂçÖ \¢xHŠÆ½ƒ¢Ü;Ø€`.bDÐ= Ÿ[ƒÀkÐ|™2e@螅ϭAà]jv{І¯Eýú]j`Eó…‹ìâúú 2ÕSRÃØ
+x(¶Â„wK[Ιgy(oÇòPÞDT/܋+T e£ã˜Ë]4
+òý¥<×cÙCøX¶Çò“|E&Ï÷Xþ>–ï¡üÉh 6?Mø+t åãcùË_4Òòݛ<ßcùCøX¾Çòçt1=x¾Çò‡ð±|£ËsZ‡›eÉ yTp‹Å ¯ÿ`„ Œ‚àqïý‡ëˆH {ššÝ ŽÉ(¢Àd@ø]o0ÿÂv˵Uèò:»¬É¡w×1£bÝsdpŽ!НO£¶ +ÈÐr9c‡ù{Ç\o¨}Š³‘ÅšÁC%ÉD‡æ7B»®bÜÎ,#q!ûš¡`$.dï2ŒÄ…ÍO†„¡È1ÈÑ02Í8"FbÆGÄPlÈlሊ +.àUH*ÿqÝ|S\•Ëm™ZÖ¼¤ã¼ø¸ +CNJ‡‘m¬;¬k²:ç®çÃ7º©|Œ,Kô[xÎ~¼EÞèçÚ×®)Û)•­C'«×]nˆ²wɃgø·;Ú0]*gڝàé„äÖÁï¯m³WKí!i2×L;ZÌÕç¾­²zxyÐ;']{nàÅ! +*æ?È,¬Þi»/În‘ +É +‰² +MyÖäŽà²îP­L§ɪˆ Ë:xcç™Ë6:×SzÚ3 'úWèp"NÖRMêË6:iEUŽÀ…|ý[,ªÉsM?@J¨î5e360ä2‹ºâU;io±s£¬ŸÞWßiaÿÝÒ~¤÷KˆÂž.¼^o¸z‡kÖϚô ·2+Å!oB·.·4O{ƒK±å.Ö»-Ù͙&#©ÐûW½£Òx—;ñ1S'Š^µý:-†º©¿ßI™/²ôl/—„ªÕ˜V`Zm€ôïî6€ËZ©iÉq,î,½Æ +)¡òpü)ޕV¯Óm˜2Ì˸usÀË{©Sƒ¡jÔ³®Œ)tëÂ:mÄûWŒÖÝÕ_`JÔS¹nb„%_u1Út!½Ê-ï®â®®B¯ö wWu­ÿhÎÄë´ÃÓC{ÐH©£^LQK÷®ã䥍^¼ނM%ª@Ƶ i—u®-hÈWC½¿Ó]ž2þÒyÚÚ|í@3Zà^¹Ã©ZMœyó´{0¢û…ÌI•I²¼ÖÜ¿¦ýÌM/.T:
+Ž´ÿ½m€95D:e5Ý5„$oå”׸FBÃá Y#!Á׫<ÇSÊJú® 1Ô;Þ(˜$)×\†u¦­G'C ò•»× +RÏÄ&û(j³u6™ôœð{•ÑZ>ŽnL¾‹š¡û£“j!®:ŠB¿í‡_ªf»pù +'±õÄý¾cæœ8ÓKƵ§ ¢B=Aü J[Ý §ãØWwòAYvïÇ|ڙ潰K+óWZ!qe˜%€¥-w#¹ª°ž»ç.dt_O1ê°kOŽÞE«t%øÞt¦Ñ2ë½ÕÈÍ@ C\·!´ÕÏu™Xx9udDº=ó!U@ÇRïLsxû­G&Æ_WOÆÓNôϼ;Ó:RØyõôþÜ8¶ìH¾yìÊ +*º(©ÌÞ
+n径»~¦|w‘÷5“».T®'¼»Ó¬-¹åoušW§yušï½I”B#=Qª{ ¾Æ¡+È0&z¦§3³WÊ`ÞF?ÀôŽJk»¼sü¥°Ä¸Cæv’%wÅę#æŽ ¬{Æ{7Ùáº#æÍ¥gÌOãïqkGD\ϳ=#»Š.ÌA§H'¦Â¤ØogN”ÉE]uÓãÞ;õ™páÑ¡Ù=é$06įã‡à
+T ÌZyé=ýfËGýªLðVqlÑùÛñšû‘±*_¼—.uª%þ©„ë|ê+ ‚—úÊM÷‰žwrq™®Þ¤À›Ž<Ó»“ºô^¨vaˆ3Ú<¢qTAÚÛJR»¨Noݹ0¥ê{)Š1ù—[º–§!“z>7Çsoõ,\èb]+€çÍq2ΤÆiF9ʼn—ªYý=³ 'í%ª¯äð*³®¹]ß+¬jÕÒÐæîiPN›VùûGt½9ø “]#ºâpè®]PfU¨"ºösaM/>ªµS¶1ÔüщʅdX€Ïoœ<iɓ]jÕ®Yø°äî.ˆ¹*»Æ¥Ý
+,ÂR¿”£—hiš~ô/’º¼Ü,ú³˜ùË";©ZòíEML]4ՎÒŒªëŽìqH–Šêˆ¹WÌW•Ó`ò};xÔ[ Á[÷¸j“‰_ûn>Yë\ÖîÎ? ÜɺØN|— ¹²Ý‚è&4‘n èÝ”KR¯{qùqJ+o U¢ëÝH¤ —³ÓÂĆé,½³âaÏ:‘¯åe&ÞAiéøªŸø…ð/ïï2{ïKøÌ̸ÆoTwòå$—¶«÷vÞdÜÚOÇWçí1®ÎÛ꼁'm ½ì™–'ÍƑú f”~¦‚\ /8|¨i1L‹M˼Œ*‡Øÿ6´™Í ù´5lhÒö3Ä5Í7ðiw;µè\æyÛ(5j×ëvQ'xgftóè{MØ.ÃYÞpB˒"H(3M© Þ?þhˆ&L%ã™Y-/ZŠÚ†š·Øe"AÝ áÐX|—$AÄ2ÝÌ«Î'-ٞT¼N„ªÛ˜…¬ ]ósú_}ùK»‘ +ju–p}-¹í¬ï¶—O^C7Õ¯òÛå…ÔUUƒmz.òÒ«<È:0ÕZhÎó8Ì«ÃєqìB{‰¦;aJ>¼N%P¿JÓ½6ÝY›î|®éŽ –‹·=$Uä·H7¹Î®z"º¯òúž'l'xºu'ªWû™*¾»… +eX®<¾wº‰Ô‡{—RÚåÝ#–FÚÅ5b¹F,׈å½ýþhœ¿xíõö@¡jD,÷I +¼ÆlXÞ1\à;¢ˆí‰ÍVC³ +P'Ê=ø̹.@úRw]6Æð”N–±",}x‚u¹'ïd]nv'wDöº3 D”½ê³v§œTÛ ð·hdêۅ~:: +%ÒöŒ:‘’~Oà§õ2¬H¡÷c0‘YùÈxCz{“m~—ŠpK{ZNÖ/7`®–Ó´ZNÓoi9Ýå®tÁ)Ђåxc­9^`Î+ÓzÀH½¯Xú €Â۔&h!÷Üó›Sn+}
+OÃqŽÁ£ËÔ_'0-•|yx§Høµe’GÐ!‰þÓò0’‘G6ä¡]¾AŒ  p ݞd~3"—o€¡ÒÀ¸gG™ßlìá:d ÇP8Håžå²)’i Üs/an°@•)—~ç pρçÆjÔ!Ôv¸p;{<7F(Px#z÷xnŒP K?nDžÀ=ž#©O~k+A 螅ϭA8ŽT/A÷,|n +ÀÚ¤øãñó2„îYøÜ€­b^"‚îYøÜ€Ó½ZéoƒÆ†Ð= Ÿ[ƒp\=Ì»DÐ= Ÿ[ƒpôàR'¡hÑñ!ôš]ÀL:¯ÚÉlCrÕqÞK•2‹ûaJŠ›b„µ¶史@z¯—Ûçñ6xÅŠbâG(Pu<(Á ÷xnŒP Ëýõˆ^Üsà¹1B–ëò¡bÀ=ž#hô©D‚¢y{<7FRO—7'ñ8ôâ tÏÂçÖ ,óòtÏÂçÖ ¬³û…€îYøÜ€­e^"‚îYøÜ€½YR„‘bÐ= Ÿ[ƒpò¢O³H1è¢<:fñ¿üSô…ÿÿûï·ôxÿç·ÃÅûÿ¾-—LŸ¤RNµª3„‹óçÛ¿~Ÿ5ziqˆðøP|PeJ°!UjVàòDø œâƒò„øœGòä¦ÁÎËy¬<>VÎcå ññr+O›Yšr+O„•óXyB|¼œÇÊÓ§‡¢Æ6Dž…Ž±òDøX9•'ÄÇËy¬<CX"1sCÎcå‰ð±r+Oˆ—óPyjáøý¨Ð1Tž+ç¡òDøx9•giÜ<7ä<Vž+ç±ò„øx9•§Ñì~è+O„•óXyB|¼œÇÊÓIv?tŒ•'ÂÇÊy¬<!>^Îcå»:ÆÊácå<Vž/ç¡ò4S(Þ)/ç¡òÄøX9•'ÂÇËy„<Õr†Ÿðqû-€—'·ßÅǏ;¿9k–c¡ø¤[®ó›¶KQ8;,Z ·BWb”9eBðƒ—:æ„zFrǏ‹C=#ññ㢩9–¿²ÔA4~¦!µ|¬kñ‘Ú0|ü¸HžCñ±gÜóN¶Ê°ˆ9–ˆ¡Ø`”Ž%b(6Ãb‰Š +FxX"†bƒñ–ˆ¡Ø`t€%b$6ä;³D Å=K–ˆ¡Ø ßÅ1ôJX"†bƒ6;KÄHlÈc‰ø:6gõ6D L#ÂGêe0.: â鋪fDÇÀ8.TÎ<cñAõÌÓ1TÐ<cñAÍÓ1RÒ<cñA5ÍÓ1TÔ<cñAUÍÓ1TÖ<Cñ¡OÇߗê +r¶PýJçê&ÓxÃ$ýrQïÒêÇ ®[F·¶â`JkÍÒí`-ˆ5´ Ô)|…BM*[PהÈ^cTLBÿ§?ȸzgÚm5òU´÷3VíG¾õÚtD=)€«ï¸æ3¢ÌƒêÚÄumÁIæ}“QšþbiJTE¦*¾¬gL”WRxÿ\òr6è­M”…(°É-•àEÀâ*M;2]Ü.ø ÄÈS㗍hG{Þ¸Îýx惶f6œ½ñ}¸©ÍÇÇå|kürZ£éy–ƒˆ
+Q’2C¢SŸ_À\Ýsd#Dó8R±ˆÛ©a©‰S¿¤vƒ%25ª>T¤½4®D<ÙN•ªuoV}h›);!Ž1;´a Lۋ;§bPÑ~exÑD*Bç­à·\¢úGU€«š/]Ón|¤iÕ#—Ê÷Šh9D©ÅU3…FŒ¨Î¬Ã
+Fˆ©ó‚=QWeuñk»×;îÓÝíÏF;՘N_zßáäÑ,#ž7+5}N:R¼,û’Ø:V‰=á#¢æù¤ÝQOgŠo·¬f7‘¬SV©C+Áøo­f‡k5ûI{#zÍ©°®…u-|ñëçl‘|)!ÕBr×úþ¤!
+ž0l$ŸOö}>ejwZ§­§NSYÒq ÷†"×lS§Ïwî;Ïêš+wì¬!RßæE°Þ*vWeµ¬~sËX¬¾ÄÊÜ:~=æ„EÖ0ÞjuÏõ÷ò_ÉÊ~õ_Âáj³¯þëºÖµðxiOO~)^Ø­Ágßé­tÉí¸Î­ÙxEÿU_xßÀƒV+uêæãלä/pX7f5¯@¬ÉÊÜ:~=æú'®Xá{âÍÞÉa-&®ëc8\ôÕa]׺/í‡8¬WåyÇ­Ên%®{Xó¼¯Èóv;’ÊKnF,vGÂW÷Y#š°\¤Ãå%OL5=éE6ðè_gIÁAíÀ¿zõGÿDO¡±×/V.¿¹³°¦Í®ÌAÀ:^ô‘/dQßË©×"×e¯Nýc8\™Õ©_׺/íç<…~ ; eŒ!½ âNé.‹†?Ñ14ÃÇ+C›žÓ§_!šykõõˆÕ™X™[§Ã¯ÇÜçÓ¨Õ½X™ûC®ìc8\öՁ]׺/í§/ÖÑãغ©shÈY X-››€¬¶à:~‰ýVÌUóãu$ÖØ¿ÿÆyLÚ-­­Wé1®Vâê1­ka] —öóçñêt^£S“rñüy¼4·%®[ w’hiÖ¯áúãDÐeö[/ýØWœöº:ÓÆá³…DJ[>ûO77§4~tFš>v`ȳ¨t?µùÚ.ÔÍ4î;t¡nK¯Ù…ºÍŒÜ‘ï›Nš1¾ï!.P0RÊÒ§ï/´md0ËW| Æ’@$‹å]kK&Õw”×NsâÚ‚¼gÕ[%Ý4©Éð»;˜ò9¼Ö5Þ°N‡×”ØoÅ\?¥ûûSœˆ{½\íµÆwÃáêÓ®ñu-¬káñÒ~úqã£Px‡8Zî2º6ê(4HlÀ´+o©¿÷âF7/H@¨ã³'Ô`7Ý(R8Ü˜Ä ­Wïùº5×D­º^³BBıÀ¹öýŠjEÂtø="V¯
+Âîj&¨°ð˦²3(ÊUÇÀP<ȑΝðyÛ݉á:ÉîÕq: m?v~K ÄXq “ICGòíuHb»õmu€-Ñ?'Aú {q®mÉ:%¡óiãmBYg—ê NƒR½¶Çú”[±°BÀw`­¯ªn©ÀͲ/kDy!­z¸f’[ï#|õpÅájÕ¯îºÖµðxisÛj4ðûØAfBÊ­±Sځ~¾¹èí¦Îy˜Ÿoû·û‡÷ÿIHª}9ÿ‘¿J{¯?üe¦°µé/{ܾ£µcDzćI„´%ª¸%ÖFê}ÅÒOŒtOþÍ?€À=ž#¨:é’E0.î9ðÜ¡@I-±â„ãBàþM9¹Õ>½d4²
+Ó²ùáÁ£3Hç}Bª&TCàžG87É+`g€Y˜)ƒ@ðžÿbnSÀH0¦ainp_ Ñ Ûº–P(ºçQÎM F!ãsxç‘gH`h‡Ð=?Êüæâ¯Bü %Âá@ +¬{ïÜú9½5éM{D;„îYøÜ€£ “CcC螅ϭA€ž‰Æ{Ê>Hæºgásk¨ÃâÄI)¬tÏÂçÖ ¬ÂV$”H&ºgásk #ãæ Ü 5 ¡h +¡ÑÁjAÃC¸qËæƒV‚ïßÌ푀*†´B͍yøÛq{¾`ç´Âf +M¶Îà½T&>ã\t#Eúc2ÖÚ:•ßÊc…0Ø: ð³['?B~vëäG(Ð ¶NvsãG(P¸säðöÀçÆzÁ¦Én<üzÑÆÃ+W0T®üyåÚ€?¯\ƒ€™øyåÚÎòO+×Æ |rEÊ© ‚tSYE—(׿‹TýË?½Mïÿý÷[¿ÿóہ›÷ÿ}ƒêÊêòõi6@¸¶}/“Xÿõ«øLnƟðéCÐ.áð¡øQëçÙÎó=‚?µ +ñõx…å5þb] +ÆWä†øƒr6eÆ ”§üÂÒܐóPþ0>–ï±üE'øtÚ;7øËÂÇò=_œ‡"ÊÍ)‚/®¿d7Ÿ—ìüt Åçò$ÁWè‹OM‹ÞštŒÅ§=«?C׃v¿‹zÄ ¼œuK¸i(ào(> ·”Xœ°>‹;nH}ÐÏOŒÀo…¯ì«sƒŽ¯ã‹»í>r‡ãÂý§c(>´ñtŒÅ÷‡ÓAâÜ cÄzÈ·û"|dŸ:Á‡ï°—Æâû8Úÿ|èþÆEûKÇP|xÿcé‹í,cñ¡ý¥cì~kí5Âû‘ãìk°®Ó>—‚è—Ä÷-ôÚoy:ÆêmAí³«_ >¨_†â+ü¡÷gKLe°<9?}nØ5_Ç¡ùžÅ™c‰Š +š.,C±AÅ%b$6d¶°D Å7u–ˆ¡Øàg‰Š +,C±Aó%b$6d<°D ÅM–ˆ¡ØÊ:óD Å·–ˆ‘ØÐ&Îñuliï<ê¡MÂGú°p\¸ +ðtŒÅcÔ<cñÁ­Ñ10† ÆE›OÇX|0ÆÉÓ1TÑ>ÒǃãB%ÍÓ1RÓ<cñAEÍÓ1TÕ<cñAeÍÓ1R×<C}`W1ÇaV;?.>Šø\p¾@Ÿ‹¾¿§«'´FNéÐXŠÐ¨'ô¯POÈ°¡®\Raç_Rï4./꼉N WU™ˆªÈúk|ïQß)*#_ö諺Q¹NaeuÙ +*¶#çJÙ`oû­Wmˆ ós¤U]ÔG²uåX’kzþé
+ºœˆ 1ZÊin§öC’fwÿæ]Kē²ÿK÷yy^J×éð37=e…h°&>yTäI«›ímpa,® +´ëÑÝ*D­1¹BTæҝµBô1®Uqkßê§Ùãò•î]¸¨D’ߍؼD‘•+VnR;Þ?¯ŸÆ°¡,iœ‚¬û Y÷•DZ£tڐtҐå/½–1iÏ Šž¬4ž~ÀD} ï½Æ.§æ'´Ï|^‘vħ"mpãuÞ³MN0òÏö8éc˜¤oíž,G´¥KÕìõªÏб!®éE±þL3¡)ââ60¦rQ³$¾çme"dpK—rN)$„ÕÚE¿«°2÷•é t¯k žüdîå‡h±ä0¬~Èc8\ýÕéYðAe}Lj +V}ù…ß^õ¨P7¢‚ü–g½ªk1‰í¡ð׿;-‡¯ó›R²TdøO·‘«œ‘ÆApPŸ©ŒÕ¦1s_ +¼™FMVl¥O7Š¼G‚L§Ëà2OùcGcŠÎUõ…Фþ¶ë]ÊR_ށzåéiö¬n”¸fdo™9ÞLrºOÄöü|Ì%7èmÕøÇ9ïëºûqº7˜À/É&=ÍöDóS ê†TóÓ£ùiHÊþ!ruíÏjrÇNÚèÍGrõŒÂD×Ô¢M$½ßi£ø¹Û½<©ºC
+7'íN:ïß5„©¥sÛíò"¸òâ¤?ÁfÚÃC§l˜œH›±×š²íé©ÖšÓnkŽß×®»Ö褏> ü…Ö„®ÖåsÊDGM¹õ.Ú
+Š•ÉäÑbeZó궨‹èXHQüDi Áé^õc×^@dõÇ¡nõ‹É¶gÚëjm*²§>,a“*”Öޚ@ss~Eæ&ghn–gÕ5¹}™’Q€\¥†Ûÿóº.ÒɅ¥(?t“ÝBSëG +7ããìñÑãC¹Ãaôlî”4Òÿ£r–R h(Æܪ£z?V‡=Z…Å™y0͌PcvôjB¤lªk1ã}SÝUt•y&:ÜL»¶ ¾1}#/¨ëS0¦¸ ¡<Ô ý£ûóî-cNNJœ€tŽ¤³Æ<l¥Ë¨ì|λ`VHGg?9凸‘?ÝõçÂõ/Î:Ýì†uõìŸ·×¨ïc8\£¾kÔ·k:yUyšÆK{0âx6<eoi-ó-&ÚŧÑÎ
+¬q~Ëý+-Gb!ì„@â,8êÃÍ©ËÁôþþŸoêØ­ñUòôÃSeiùü¬Õ˳z':Dâø¬^‰ ­O Ó ›LùáÙÓ8›L{eR!È2Ïft,ÁkRÏ.šC±æᇠö؆0NB‹ dµÆ-ñk—œÝòe|6¿͌oŽ½ ÉP|¶,Œ ýÉL4%űÂòfLÊe @Éb(ïIn$ÐÂ`!9 ¯“H"ÔND^æà)"P~u‡gOœF¨_ž- <Uœ*鳙¡‚7 ­Q˜[Ø sdÁ³‹òä/¯€\^"ÈÙX•Ë›) Lz6¯¾ý €ù +ÿä¦ÇÏ«:ýêhŽdï¢ÓK9â§ôXÖBYˀ?üDÿ(S#sÄr’m-(VƢ̽iyPY‘‰9¼Ø“úËä‘I, 8'
+4ϲ¢LU­Fð<ž²RTgdõVæ„$g‘À
+º~2ñÙë:ê›EsÆE&ÐH,‹ÂF|¶l.E±#Øä) Š €ó+G0Mvµ н“>/¼ˆ"/Û²²ä‹Rۓ'Т:óp…ÓŒ©Îü}Qy`¨!Š
+4‹¡ —¥%¬dy–Ú<Àd„[h dÀÏ4™øEÂ%|Wù +ú" ²Z €Ì@çófoü
+ÕuêÐí}T]r©Lÿ¤ê:ýÉLÈ +ÐYT´šøE–¦5‘/] ì¨Ð˦U 5dvmio l%ÝÁ
+,=^Æ/?- ~Ëmr¸$rö¢exh^y?ߘÝ3s¨*¢x%Uæ3óUÓW ¤aÇÇ 8P{b÷kGçÂQÊvªj§zHMÑ—ž
+aVÓÁáf·a–x'­€¬®/¸ 5 ™¯×¬f|›"®æiékñÅ՜_ÑÏ7$yQCÙ 7 û8 Tź‡ãdiº9høtyýT©e§^ž1¦ž0L·е*Óŀ¹*,e´Ð'Ò É”œÀúRÅ3²ÄóÌäˆ"²„T€Ÿ {rx°ó3E&ŒFûffc8C&"0Ź„`"eYp005¿¼ô´.é×bð³ûNJht
+Ø°» ¿. °$U@eÓ@®¿gdõz²¨"
+‡½UÙš÷ˆ‘²0z¹ŸÂXq¤“¯|3+xœÞ0fÏ-ºÈ•m(+2 Ո܀¼h˜À× ^Ž€x¨ÖøÉ=}­¼ÃÒD'ͽӟŸ\œŠXP™‹©ø”’¨Øƒ‘‹ì¨d—ä40ÏN‘à ‚‘K¤e*q |‘ÀY.Ð¥™¨] °ôþ[öԊyë^‹ÓXÞ¢V2e}‚hB dïB¬~Ȁ¬çžÍNz„üÊí/F¥.Îßbhä$j]ýÐÒáÐáYg di@îxåeæþn2ˆ8)†»Fzь¦Xe 1¦’–×kÀd+b5eK†nD \
+hÉØI`‡1’yœY/›ú(ypL(†Ù8 b™×ŒÛâÔä\‚:Æ7‹ʀ„¬ßTž¥ÐÏe@ž¡¨àbZ7Dç0„‘ŸŸ*e\À©¶Ñ¡—.dB†´¥‘_´ÁÿõÕ¡±+¶Òó{œ}—vd‰ñÐ<­Æ&:þ3Ž–”[ô„qß²Ž8tº­aÕt<†ª‰Ë†`EpA(…êœÁÀ,‚1˜… +&ƒ`ž‹ÕÀ·Tb5<ڞª©òìCpc˙ +Ôx帲D¤ó¾;Mà鉆®Í!¨äa´¼#—£SÆí?N™â$‹êU1:GŽnâX_¶|Uח#ŸY­U±KrÀÚQtîA$¦%²Ð`43¿±êÆå °XªÅ׎^¤Å<¡Í—­8›=Ý@X‹jŒ0¦c¶• oëøDB¢û>4S!Ô³:—fîá݇ ì³ó2MF™2£o–Ìá/Çð¤¯Ùc¡g—XþÓÁ/ýÄ ÉA¼¡ñZ‘éQ{3'f©üä<2Ë\‘Ì”eÖãV@Ÿ¢Ç ¡¨~æø³ìnÀ ( ì„J/„
+[ý0ƒŠSq⠞½•A9ÍcáóB=ÑRŸ¶|I0ç!*ú’ÊN‹Ï™-}I$oÚ3Â*Þ
+ÈÅô%•¬ø’tíIí){´®õ¨n·õ¨èBÍEMÙßkØDæ +˜o§_BPŽc—‰ZL +$.^ÜÆy‡.§©æËÏ£hà˜3&=åw57M5Þ2LuNQ؀I<…ß“?””ßâÄ”¬Q™ŸÅÎÍl”…i£(¿EÅ0®=¤™uNX?æË۟%LìµÔÎÞF—;™—>Ð_˜|-Õüô×Õ©„Þ&“V%KfY¥Ù`öMÙtmÍ@ETìi8§O<•álÉÈYðZ   e¯œ7X\r@¥Â°{k-‹ß•=ÓR (ÂæÊ~»¼6[¢‘å8Á=SH‚äçuùƒQ¾<½dˤY˜±Å¦’€ÐfjKhu‘Xî\îaVœŒ®€1Àò⻑AU^žÉN$Lú);¶\”yN‹6šhŽ„8'ºšTý>adZU¶ÖQÙX* çªÔ9ê÷@9_§´ìÒ_þ €4/í €”eøbE5yÀ!|Ž&èz‡±žFý`¸£ìE0¹%«KgNÑ5
+if³SSÅr&z¤ôD‡8©Šº…_M¬\ÿóùMËjË °¸ð9бº€I”t?jôL`cÂtèÙ~à‚wâ˜,.Бð +œ3Su4ÁÅ €~"Àt¤Â*ŒÚÜ40”7 +ƒ1'0‡Á*èÅa0V¦¿LLеûBa°`ʑýô»¦²—Nø©T¶ ­ò!a*ÍnCg¬0•í‚ì6¸¾A欑˖óÖ@.Ûù̵F.Ûù̵F.Û4џeȯ—Ë\ñÁÅÓejt‚0к@5—ÃâüC«éh”}¨GÁƒ æl;Aâ$•šŽõËBF´˜³õüRÑRËø˺uBF]كŽw™Z)¶¢
+œoŠº +€ªSJ¸{mê´ÓM½R7çŠÖ+šÆM±z ¯ZW/Çà3Ðkú³&>Xûž "/kR³54™,µ•Ù•Éa¯)„ ¥œV"cÚÔ¦;( ¨M.xtO‹c68«­›IB§ö†õX™“¢MC‡ۘ£­Æ12—‡²a’X6|áI&LÁ…M}ôŸo]m6UÊ;hÀ›Éñ%ËF퉃ڦ• Ú€ž8àøß*\`.æ„CE8Á{¶´*5¢„Ъ–{Ñhz–©©ãʽdmðÖ9 +õZ€Ñ^0É™±ˆ7 wPÌs͖l&‘O…Wsøƕ_1‡QÙQ[Ã÷¯ì˜]¿Ž5l¦#›B¬ ‹Ì,—ºÞ'žMôPkÜ5ŽX%ñðšºs<¼JÍþz<¼ò:^#ΔY|%^Õè>Q<¼ìÏCâá4,nD‚?² îœ[ò,õð%T¾ÖÃ>/¨‡¯á¿\_9ڛ߸Þ³\«~‹º¿¼‚510&.éòáu èlÝs@[í\LJ²'€…èŽÉ”" +?¨î¯ W°SÅ± &|ݟªÚ©ÎÙ/¬èó$ªð©º?¶3’§öl–T”LÌ>{ÉÌö2—„ÉÖý•ÜÊJ'²¿* vs¿²?¦ö¢èÂ\öWø½ã¼¿î•Z·@È\RöwäšûeUØkkokÃV¼0KX6Ÿ-ûÓÕNu‹²?#åÒw\Ùp¿Ù$&~LϽΝrՖ9TZÔª¯»gB3îeŽnõ°SW•Žõ
+ +KUrÞ ‹ç
+µÓDõŽ)â4ò¸1¬ãBkŠj6^;¨ãb•<ô‚xMQy'ðüuãv3Î9ôâÕ¡p»Êg:ÕÆôŽS3m½µgOØQS=›_[ +]ìT؞QRíULÕ +;GŒ>aŒÐÊ]"Ž•knOVh}ÂUŸéO+Üä«á3æ
+jGFù€ŠO vÊ©ÒÙ0‰mó/$³Í1Pœ§Ÿ“òK’ÒT~ÐBÔÔ~ƒkž3=XoG×»ÔF×)m÷† m M]ÿEj–û>%SŽ«?º„4WxS7/ÁawjØՎ|V]– nx¶°A9Ìܝ&Âc³G3ì$ ù‹]l˜ê ‰p–§¬êg²aª´±Ù{Yñ6B~eñö†ÏÇ{ÜãÄñ 4m®J@= ®‘aa†½Ò‡WOÛÜ­CeYák‡Ê‰®Åjâ_‘3¶–m¥Qß*9y?ºC%§8_$"§ìe)WÓæî¦MåN´M›â*T›ÈjÚüò¦M vȆ Ù®¦Í×M¿uÑ´qb@ž5¡–¯ªè™ÓÎÅÁÀ³uäôçÓyéç³b`® ‡Àœváè{db
+(r /&:É¡m#A´µè êVæ€]¢bÛ´’µØJØnë|¶Ç>“xP©þw\«D3;ár©JŸÞq« ã¨:ÜAS‚±A™VÓÔ"ë^“•”Z"K&¸0@°ª™1ªünj~š)…ƒÖ@°8ê¯\ã”O_5xª7
+séÏh§wŒq\ïµ`í#Óºšsl1wN>?­ºwØv ^/sÞBï<B†©ÍoS›Rð`j²*ˆœS/©iŒ#¿òƒüj˜$ê +È¢. +ûÐÐÇ\#Õ*«¨ìR6[Yª¹Iù¡ˆàÁ±g|ÆB³¨¯6-.À gÏèå3p¬QW¼ ]ë,΍aΗêªù +k×mØs­*œ^ö¿£´ð|DÅÝÛS§LþãÚH±[-ˆ`ÖÜÔKEfD),]‹Û|…êyŠÛh"Âû³·­dHmUükmÛëÔ¶U– ŒQ¬µm ,{ô4ùµmò¾Ö¶QÈ-jی_
+Ú^#åº2¥ßהë5åz³¦\§Ål3ìw)TV™®mÈOªž¾\¯ £Tt-è U3„žbÓ;_¨PÕº­Š›§77ºU
+$}:° 4¾ƒ¸Nµ+!g.ƒå'
+†Ô +A{Œ)zbæÁFÍ¥+ó „’ÎA“âêî[w¦v°r1£sõíÙ¹­é\…KOÛOùaæ‚,Á€By®v^Ç刉ƒÏ
+‰G³íüå]yÓÍ™ÁÉ-<÷•Ë+©Âƒ¨ú“¹Œ*³Ç´(,ê¸nj'‚Ðœ£ÄÕÍ&¦¾‹Çb KÓ ’Ù° ð$¡¶­‹=-8žr˳cšp2æ-_ŒÁNGæN†VǪи£¯÷Ú(d±ÚŸõnœ*äŒ`ÀŒ‡`­ë¿ª‡¨…xÑ=8œ!úÞL@*æm¨¬c„¿§²øìùïÆñ•H˜#“£j¶U¸¸”êÊ£C*è„x_ ‰{ ÷H«©7õA;v*à/û¿4͂öùB[-K"×%¾¶%ᩁ—ÿ§,‰QÏcI8âRÍȼèXu ¸iIœÖ´$²qäí‹1–„\våê®?bIœìZ™_bIè©úáŖD6ÆXžŠ¯~½×Z~ʗr­ç™ŠL–èé=jÜéÙÅûKÞmËÔ¸3wÛò5î‚î0Lvd«Æ½[Ð>änÛï™ÎÒ0§ñLûewÛò5îÌݶÃkܙ»m/®qgî¶ý-k܋7cÁÛ«jܙ{lUã>þj[æhõk5î•éþœ5îޖä%®\ªrÊÖ+—¿ë•K’€Þå+—àîyæÊ%Mç/Ì=­+—L˜ÊŸj1Y×­-&1è}½rim1 d³^¹4%Õm€åPëJ÷<{e|ÝÂc¯ÖÝ xì_éJ÷ý]éV#¿aWºðØ×®tWî ‘Ú5LþóJ‘Éâ/Lëlnè3\ Q'N†¼óy‰t¬F^b]Ib#/±“^ØÏK<ñô[\ a§Ó«¶ºBd¹éÕÚ‚€îÔ"ƒÖÎï·é ‘DZ(•¶Yñ%œòÌWg—ÃǟoÓûŸû??Ä»’nqºÿüۛx‡Ö·x—Q~«¦Éyñ.¼PjùðçüöïÄ_©]Ú×âÊPâ?ÞÿüëÛ?þù”‹øMV§{Â0åÚíÄò@üøaw®|Òz·º|6ýظŸä.=ò +ð~2i¸©9þq$ìDF¥j/w ‡Ǘ¼Öô¥8kÌÍ^Š<ûR´ÛgMìK‰ÓÉÆDdDx…qªù…gñ‰A¯Çr“A%y44Gk&Þi’†`?«óM¹5ñɤìòqy7 Š}“ÂD-Nuȅ´º%NÆPêÒ®’ö@w8¥:5û:/ߨ£þËÕ@Þ.d‹€Ò´Å“TP}tǯ¿\.øò+#½Šî&Ì[røPi?§“N–`|˜„Ùšã‡e‘j¤¨¾5Õ3Y  Òí6¾0­8¸?¨¥5#xƒ
+[°*ì ‹ŒR’èQ4ŒÝ ðëh‘¦ÿ5ñG-tÑ"…Oh‹ +T½;³i[¶'ù2J£m@W²Áö´…3‚=C>±/.æ˜Ð4ᇟ+côÔÈ÷õ+§4`n(Á¿TÛ^õ¤H»~܄íØ¥‘f«>gN¾€ +Æi¯® +†&²ð·´Á€!”NÍWChZ +¡i5„žÏJé1â¨WxCèã5 ¡šh ‰6V5õ¶lÑ3‰6‰<6‰Œl=7K… +"„ÕìBóIB¯B݄÷d4ÙÝÉÖÿ}'»6Ä&hÚ@öýRâ€#2J*#‚H‘…ˆRS½nSUæ/1åðÛ%„’™0!\qtٞSµ¡‡¦‚|Òpª6]äzüÌ-¬(.œú
+VTJj&ªï
++êã^V”ÌÙ'«5­VÔ´ZQwP%g­Ôþ)*ï`í»Œª!Ÿ?Öh46¢k3(FBˆ– øÒ¨wHxGyøSi‘É£g~o¦Ò '~`:åÁ9LJÑû§ÒÝ!í0ÇËÅåäŒ^Ô8o´F–­Óˆi¨Ê“}áіoÑ.Ž +•Úb°$P$qÀ…°!–&Ž#Iô²{]Z*ÉI®kÎ'íð¹3á—ã (Eúˆ H%š­˜=ý‹ónù궰dO SEÄröH2œûŃ¹ +Zù*ì?ÄÖé°Jì×dîù¶´õ‡”k×N?ø†6ü¥½—ÓfܒQº:mápuÚÖÐwLJJå³Âe‰ýÁ>Du¬ŠƒÈr7øØÙ÷<bzW®
+téâH—»Ô +èQ\…­7$z‹£Í×PÎ#ŠûCÙ¥xµ0@¬ÖÓÊÜ:VæÄ{pCxÑ(9ç
+³ÞÜˬwvi½½šõáp5ëW³¾cÖËɛ¾Y¯›ºâÁqx¢$¼_ò9r: ÿûNœ¼ë}T©-N§ÉhÁO@OÁ~Ûµ¿Ô¨ÜÃMؗq„|R°ñçbò{àÆÓVËèÔÔQÇרûánµa`5iWæ¦u:¬Ì‰_ÝÃùUÎd ­"¥—4Cð xßïfKt£’Ø®¡ÖÅ·Žuñå!hÍÜ´“ Y ÈæùNq•¿èØK$þIÍ:LZ•·ºi&uP³Œd^hò[MB’¹d±m¨;x;’¼D~'ø}Yš½«>¾y{!çêŸt +¹è£¤¶Bq-ñk(¾ƒ“ŽÒÿ†ž›J'— ¥eöÒI܏Ú'Ú4¤mºemµ a‘£›ÜҞˆI=gHåknþý"
+¿>‡¿}Ô췏 þAÚWYP¿}ö·˜O£žÔIò6u§²ÖÂûž(?䲩'N¹ãBêÝ:)OSñïr6ç¦i=›[ÕþcÑz6×;›óZÐÜ]sá9þ3Å»j6”Ùurô‰~µcOuô«}¶fºñZt„OÓºçr´ö§‘£1Ì*ÞúQ7Ý.ª*¨,-³&u@B_J>Aáb¥o4Lyq´Ìj<Ðí‚x(ô£:¦¯˓×zÖ±[T‰ï¯9(ÆÑ¿sìÒãaÝ}ëç
+ǞS鈈d1¼8­Ã•³ýîç\ât¬'ƒ¿ðtÀIˆ=GG]˜Xtø7ÎÑ)í{VGç1®ŽÎêèPGǸÍ bz@Šn¢<Ö!ÆÑlx^G‡aCÙÞI>n 0Ñ$DRŸß©Tê§V½ Úvo/KRWgí:
+?z®˜ùδ¨¿;ÒQÄ`%ö,á±+-â;iNÑ—ëԋó0eÛ1 ®6öû¼ÑLì~|T»J­;kª|‚3S•f¦^šíAÈ÷½P~mÏ+Êût&/‚aUF: §íÂ~sóøY2W‡âU§6þ|ûÿ +Ãoó
+endstream
+endobj
+21 0 obj
+(Identity)
+endobj
+22 0 obj
+(Adobe)
+endobj
+25 0 obj
+<<
+/Filter /FlateDecode
+/Length 10670
+/Type /Stream
+>>
+stream
+xœí|y|UºèwNUuuõZ½wgëêtB:!! Á@²°Ä°“h$D¶$d#
+ .££‚Šˆ+°ƒ è¸+Ê,¿¹:‹0óp™QD\FM÷ûNu'ÀlwÞ}÷Ýßû#çäì_Õ9ç;ßz* 0Âfà`ú´Y¹ùç>¼ïmR‡½Mó—5·mÝ4q/€Ë}Gæ¯îTÆ~˜Y > @hZضhÙìcˊÜ'±ýö¢¥köݘ³ 뀯tqKó‚ß<¾ð3|×ï0-ÆÓDޏï²c;mñ²Î57~`\Ží0€£iéŠùÍ7=½ñ>€ê3¶/—5¯i3|(â\d4Â+˛—µ<0sÑ+sß æ¶+;£)š^€æÙx[GKÛ¤Yæ6€\³f¿º7Á¾Þü˜¹|®¹ô+­G ,<Ôñâ1V¾>¥rö÷¿ï_¤;%~$ž,Åq‘©P®{ìûß7Sw
+| ÂÅ!Ì`¤o¡Ÿƒ¸£ C.ÌÁU]‡óR¥Ü6²Ð
+÷BÕ²û9,¤V­@õžR*Qþ4è¢kÊcóÌ®)W°¦(ᗑ+H8Žô;õ +Ÿ!e;^_,-‰%µþÄÿ ÐÇàIúXt7ü'_ kàÿ2¯ÂÑNó4 ìøoô1’…koÀTÁ¬Är)¦k/XŽb0äUK^jãõ"œ¿\…_ ø•ÑObïQŸŸŠÏ±wlþÛyp,óÿtml]ÿ¤ÿ–à0 žàÿó@^%0†ÂP
+Ca( …¡0†ÂP
+Ca( …¡0†Âÿ@ ñ+V;p¬F0iàÂ%1¥ æҀƒjUoèü»KٌÁZÞÈ¿›¶¼¢²jâ¤ÉSàò˜6}ÆÌY0§ö
+v—ÀÅ®ÛÚះ[á_îBõüû‡{1Oe·Ð¸kÃ!Êa*,ÂEµÁ*X{ᜆ?)žh@…ÉTaj  Za)t Â|Ì`¢ÿëÆùÑ÷¢]§ïƒ})¨Qóvœ‚ãgËƍ-½lLÉèâQ…ù#órGäd²†gËHOó§úoJrRb‚Çír:ì6«E6›Œ½NҊç(ìJU“Êh
+ñþI“rXÛߌÍu4…쪺&¤4©`Ê¥A„\ø7Ádp’ÈJ)”æd+•~%t¢Â¯„IÌ:¬ßZá¯WBgÕzZç3Ԇ>>¡TºW(!Ò¤T†ªV/îªlªÀ÷uëuåþò]N6tëôXÕc-äò·u×8¢V¨«rL7­WJðWT†<þ
+¶„—^Ù¼ 4}F]eE¢ÏWŸ“"åóýóBàŸ2T(W§ iÊC¢:Òʶ·(ÝÙÇ»¶‡e˜×0,ð/h¾ª.Ä5׳9,œ·"äZwÆ}¡‰/·–×m½x4‘ëªt·*¬ÙÕµU íQwñ¨åõõø|–¦W5uUáÔÛݹ¸¶|¶•Ø¦Zü•¬§é%$ù'øw]ӄ’Ђ™k}= Á¾èiH¨Tºf×ù}¡²D}sER·ºf®íõÏ¥#9Ùݲ%†Ín“9^1/®´ Ž©5œÕªg¢“°ù'#„”ù
+®¤ÎͲ–ÑÐ54‚a¨'øThCkH*oê’Ç°~ö|HH—ýJ×W€Çî?ûé¥=ÍñMºü°*#ŽAÃñz(ee1ºËñ qãÔö¨œìÕaZäo“,}0½«“‹8÷ùØ©ÞÂ<l„6Ϩ‹µ˜—ØÁÜ@}ˆ6±‘ã#Ž9ldóÀÈàãM~$ßC*s;BڌÁ³ì´U."Î1ܯžå¯žÑP§Tv5Åq[=û’Vl|ôàX¼²•×q‰4^£‰œ:Š”xÕ 0kÔB|:þhTJ^µHŠjQªBrÓ¤X^¯óùþ͇ÂÑÏÙSjqá±ø2Cc—¶/»¤}Éò ].˜Ï Õ³ººt—ŒU¡Üéêªò+U]M]Íáèæy~EöwõчéÃ]m•M'Ž½%1Tµ½7±˜ŒAj¥0¡ÛO¶Íè’m³êúdßÛf×õPB˛&Ôw§áX]Ÿ‚’Ví¥ƒ½¬¥°T¤ôªU‡û‚›ÕQ^íPÛóÃÔ>í@ùaë“Õ> 9ݳ󞡏áhè))†é^ّÏÊ‘5í5Xó7·ÐýpÓ1Lç0ñ‡ù4Ls1qøøþž ~Ï\µè:#3+/¯ÉWÛÁI±RgŒ•Ò˜X™WÀàöõV®aí}½ùcbí¬‘±vZ:N/Ó}¸ÆsjnÆ<S¦M˜xœ|_¯#9ö˜dg=ԛ˜o>FBˆ‡ð¹‡Ô%>Ôá°ušfšHύ/&ŸàÛö¨ù&5Ÿ«æejž«ææøèŸÙìj~Lͪy®š—©ù45_¡æ*<9‹ñSŒŸ`ü3ùsÐ
+Ù¼DFUä%Álô’>"}O¡wW˜èƒÅ…ÞJ¹7S2ћ¥Óú¬IÞL¾¬
+o1Á÷‚DP§€Ë…|kµhƒaòÄӑ­Æþ­FÂ¤¬'ërïx‰Œ£<›®Ó=˜øž¬ïóø´¢6‘êèã=Þïs¤¶Çû7¬%=Þ¿zÔmÞo½g¼ßxŸñ~åâ}=ëqoBÝÓã +{Ã<BíÍ
+Óǃfï-ޙ¸¸3Þ5Þ¥ÞåŠ:´Ô‡EP5d5xëP¼á,Su–‰^|Ío%Vd… 9â +zoö䨏æ³GxGz;¼#¼êtÙ±é†Ç֖Ɋ#Þa8Yª:K¥wŽQ2JÅ;'î< îÜ/îÜ(î/î¼LÜY$î%îÌwæŠ;âÎtqg²h×Zµ²Ö¤5huZ­V£åµT Z{8z:`v¥]#³BóœWë2e93A]”h)L«¦Õ³&êÐñùP=O }=Ë&:”‚ Y«¡zöwht :,Fg†ŠÕ!qú•u݄ÜV½!º +Ysv]˜xXזD¦›ûðT=[nMdetË­õõà\]æ.³Ž³”TUüƒ¬)ž.wà’P=}mžr]¯è+bs6w²æNÖt'‡î¬žUz,¹>”Ï*ÑäúêÐîYÊUu}ä)òDeEy’õu}\6yªr&ëç²+êë«ñhT8$û§ÜS¬@8í¯¡ŒÁA™ö×*Obp~É.çTÀ¯ÂùÊ%p)äI—Å
+„s†.Åuú"¸î£þʊn¿à]GU˜£±w…JU¯A|^YÅ«‚x UAª.€äÄAF ‚ŒPgâÈo ƨ ÀÙL+´L*[­L¯ëÖ„zÔ\jé”ÛÆ©çnôŒ{8ñ(ü‚ûô¨¼uhýéý ¬ÌKI®ÆÒ`—ˆ‰A_æsoL<Ê9 B°ÛÊŸ3ž +!õ²!3#ãCù’ñ!»-8ÇEëìì\…ܕ­ƒ?+ãaU¼ì„êPÖ¬êP*ÍnQ¬D˪¢ûòúôúÊpôx¬sv–²NŽ쓤8 bãÈ´l2ÍKŠq õ•¸œèb v®TsdPá(xÔ´ø pD?Âô1+#­ÑÏØXdEôôÈ®‡ã)ž…c°za?Æn  `-܂ñø3tÁƒ°‹‚•è1íÃú3ä9Ú +°\èïü ò= OÀbD?È
+¯Ã ¨…]ÑÄzð ÏÕ}ÜkÜD?#Ud9Š‹D¨€™p„û Þ%<+¸…•ÑtZ%xNÐËqÝtY‹a2ztWášÁµ¾ ¿%™By”ý&TfáÌká6xÞ ;h ]E÷q¯ s¢÷Dqö;OèáV¡Ÿ×†«¾îÁ}œ#:b#/87oäËÈ_£ûpçàÆC%zŒ›á%xރà[2‡,¤:›kã~QÔ=„kNFïq
+Ƙƒä`bì>è¦qÛ#/E¾AÈaÌÁUÃÜâêü†Xˆ‡¤“ad™EZÉ^ò=i ½Žî£ßp—‰±ˆ{ˆ;Ìýž;Å}ÁOâ×ðjôÑÌhutqtMtOôXôˆS/z¯—ã;¯‚«¡wu-\7À6<­{1Þ{àaô Ã€Œ¿„Sðø¾!&’O.#¥d!YJÖ :Lž&ï_ÐFÚL¤'8?׀sïC¦¨à§ó+ù_D 2:²=Òy;jŠöD_~íGlzçéˆÑ¨ƒœy 삻qÆÇá „0…ßÂïàOˆ9 £LìÄEÒÈp’CrI™Nf²ˆt’µäzrÙIî&÷’éÅÕ<O^&¿!“ÏɗˆD3ÕS3õÒTšMsè:•.¢[éNú=LŸÅx’þŠ¾KK? _пrΎ1•Ëà&qS¸«¸Ün-·‘{ñù&wšçñüÌ|&ŸÍßÈ?Ìäßá?áÿ*è…Û„ÝÂO„„4 ‘5c5Ó5‹5whš÷DNœ!.7Š›ÄëÅ#¨ýüÚ' ¹£wzQ WÁðKò<¼Oösvú8™N!wç†%ÜOÉυj¸™–Ò©¡Nî/d5Y +îQrÎÃ4Bß%þ²žENÚN—Ð5¼™\Á?Ê÷“Nþ<GÏÀ~ú™z­`çÁÙV£~]FÆam,ƒû©ÞD«n ´Ã‹p¿F¢;ñÜw@£Èdv6ô|‚Üa!ep +òI?yH褐uÜÇÔµ¤Ÿž"— °5úu¤—NåÞ$góžEz©&‹i ™ýð!y|Hç@ +½â ¿"¿'2UXÌn9øÓÜdn!µÑgþî.ä BN8—s¯ÁUäÇÈý'h&Óp÷ù"?âq‹q•k(On@^xz¹I¼&À!î<Op¿&8ȯ!ËÉîhe#|¥ÙÏ?Åu E|RôÈïÈÃädô(ýŠ£ops"‹È½¼ùòGȽˆ!=<ŽÏߋc?h±–ŽüxÒ«e›„\^…’ër¸š|‰sb©ˆdÂTš
+KèxQÑØÄaðX”qòrN~Ã@ùpíܜÀîÖ8aJ7%Ï bԀH‹{@àÃdÄ!t"«&àÑj6N#å½Ò•Ï£Âúº´¿tª|¾´¦¿Ê°.ÿ€ÙÈ<ŸÅgIÇ ­*øAáŽÿà{Pøã̬z22ƒ›*üLP4ßgzÒDE¬†©Tû­&_õRÓ·&çSyÙ:w__sþ¬Œ?gQIŽÌ#„Z
+­ÅEÅ ÙF¦Ü·éúÚçn]ù~õÊÈ RG–|IxkÛ»"c"S~9¹Htwd-Tg­
+ZZud·i/ì5q&mÄKæ + SÃæRŽ&Èa2«{[Ä׍5gÙ2úã‹h$V‹ŠÑ_ÖQ2Gî¼ÓõW<{k'ѬZ)ü2r rç_"M'¶½»‘¼B¿O¦fÜû¤³MÂq”>{ŸžjžšÔšÀ™ÂÑ·‚5&K¡AÁl˜9-!=©„+2—XƒÉRêé2ýbÛ„¦Ä¦¤ùÉóRÖÓõ\íâv'>¬ s.¯ɉYà4I žGKÅ.(hJÔ¯ýòQ<b y5ˆj+UWæNðßü”º›š³q¼~¨ž[ÙY‹«ÄUB,Ö¶¹@ ÆQÄ1ÆQ…þT8¬¨¨ ßétØE Ñˆ>qMÒü}¾­°:Õµcñ¢{|Ý ß?³áͅ‹ƒ‘×nºÁGwúoèÞóL{ÑÔê‚Ò–[wܟð³?,~vÁ·Îþæšm¥û~$¼‹'’{zïÔšå½fK¡jž›²"[
+-ŠÑRèf]#õ–BÞmwÓ {™\Å­‘yÙdw:<²Õ\bú±ž”ìd&;oÍÑsž^‚õ$L›ƒvóz“3+O$¹" “LåɅå ÊçÛk¦Î#U-;k-Ém<#÷Ÿ·”XKˆµ$††FÕ FâҀ_‹l+òåó.1#ÝY_ÄÿòÅ«"{ù*òêg¿"—ý‰ø\O'ÞùËþï÷üäkÊ'F"? •G¶î£ï~iÙsß¹·#üñ³WP"~‡vŒ›ÖËö$"®X,–Šä‰âD©Jžl­ç®´.å–ñ­Ú%R«¡Õ¸ÂÚj[‘°Öº)áfn‹¥Ëú¨õ]멄Ä= §h·†–Ï®;¤ƒŽ~Ük0by2˜€¸4Éú¤BG3Áaâ€è­ Õ¢\VZVZj±ºJØFÙ闠CbŽžî1)šg£ÇAÀÄGý/T#jµ‚Áh2éͲÅb²Ù«Óåv;¶™´’Ž¶ô
+V ú}™Á™B*)V‡Ý*h­-Ö-&»E “¤Ó¥èMv½Þ„–âvØñ +q;¨dZ¯ÍÔRJ¨ÛšiµXôz.´’¤“´a²ê°À<a&—eZëݒÃ!¹Ý»Ʉ\t¼wx P-éj,5Ʌ¦\ýýA=·B¿IJÏésÊhÂ:\ÄzI¯ß-)ÂN6 D< &½Ã-ë]nWÕªs%—¢Iî±0âh¬ûœ¸sëþÀrùËöurcû kì”ccÇc +â‘Ï0{þ¢
+”ðuÀމˆzVž-E±†lF6È/máV -–ÂÅœh«lz饚ÁèÑ£ÉèÑõH·í¤Àæt“â·Ù4"ñsÃ4"×@ò¿¸=Y»ƒÒ¯"o¿p÷¨ùeýï?·Û.yÜ?Žþ0å™'nïç¶WE_ÿ†ìxø‡ñÜ×=ñBûõH­ ZMH­62?ØÚÉ­֚¸S½i¡ÐjÚ, à ņ–ÕºÕú­ôf£¨E‹&³,-V›,Ûd£-Eý+bÐëSt¢‡©l4¦ˆÔ.Ššfâɋ +›Qn ™FƒÏÞh “ï‚ ‰ÒõÌÀÞ* ßKbPÜ,RÝ7‡ƒ„HŒ:l¶õ’r™ _%‰öL‚
+L—èÂùÔSE¬Ç6 'uSÙÉ5ÖÕÄÎ=0<Àø9~Ѩ–êë¼ïúcüXA=J™eY©úrvž[7 ž'ZV^rd1†=,+:C¡ˆ"®KôÑØ6Bccì Ù)Úð‰z| HÁóß´OÈÈO~èXäí#·7™G…£ý¿ù቏õ½Ì]ý]7íôã;Nþ°Éâ¡ëðÄ8LÜLÉz´ªö¢¥zœˆ Žp»˜±“Ë{‰‡?ÑG×CL墉Rv¶‘”Ä!á
+läìÏ~׉Vž-r±Ûý˜/âÇ¡¿1
+^θ2‡¤ëÒõ~CzöÔuš\m‰ö
+ß"_˜¥çs33ŒœÒSü™ÎfÔå'dÙ:#’€Ñ™æu×L›7AÌÐå{9½«Îì$Î0ùY0%WÑd™•¨“ým~ꏦ-ÖBH‘SV¤p)ÏÒ5hÐd`®JôÆ@Í׍(ÑÕÕcÉõ²³ýg¶šFLˆ}Æg%,1ADŽþÄq®ÑøS3F¡¾Kc*o؝Ǿi‰œÆawù3l¨ùLÔ¡Jþ"N¾ú©ù»͸©y,™3Å1¢lmÇ.ßÓ£ÿÒ÷òÊ:ÏeIΧÍc3®XxÿõZ›ö7Ý8£úÉ­õ7ϲLÉSF–¥å·4Ê÷¸ºªmN[äۍÓò¯.$šeɸºäòyscßA+Ǔ¿~.L`B
+Ëxß´ôUŽ.Ë£–>‹f¸%7½,}¢£Ö±Ð¡Yç#œÕîHµá"­\R§ñÚ(õ°#sPä.ÍëՈ¶Lй½f½¤X˒$å&•%MK:—$$%…ɱ ¥,à§0)
+z¤< Hê0 +æ² ‡Ú4ôŠÀUÛÂÄd)c#U6vü#¹¤cc;:ÿ½mIèù7ÖõtqÊúÏ`—~ì€;Æ'Fæ¡îeZYS͇ÝÄáA +m¢zÖ¸q¢© ù‡—Õn¿üŽW§¯ÞxãØÖ½9YËÈõÍs÷,¼nî¼}ÅÑCÎOÿþ¯ný󞹹+:^'‡R·Ý¶…$\{ÓíwÝ·
+eÛJĵé9¶u%\«}Qâ]^µ<æ R¢»ÅB¯Jl•$­•ïÖ
+»Ó>\*'u´N«1§™féIZºÑ;Ù`ÞêՋ/Úÿu
+*~J>791#É\&ÙDMÕÉ£«lJF­hV6^b†œQ™®1fzÄ(ӚƶÏLTMœ9ßáŠï÷>ù]„<üøk=dåÕËö^¹¦®îrƒíÕN¿þ™~ð…=†–Ž®ÈG×oÛvRÔRÜåëHQfô€ôA2š\¸9+Ûå\¤+‰Ó˜ød×j˜D§Éž<\ô;&š®0iì.ô}}ºlG­n¡NCòu¥Žj2A7Å¡q›Í(Òí’½’h6éì^ª7¾eª3¼%›çšW˜÷šys˜¤ñɊ¡dô‘ô¸”9«"áLÿ¶{´B˘®Eá¸A=ûFTexúéq 0^TE¡Ý‰Û¦&ÊÉ?}ô®×÷œ[óJ˚C‘·‰äe_3eý‚›n\0~Ië¤{zNýêE2~ï1zÙwUä¹›çl~컍·¹å׌îA|ŒÇS÷@*ïâAB„x™éédX©cXÑd¦Þâ¾Åû=¨‡=/{ÐCÏÖ_›°5 ‰ ÀY‰Åœ i2iBˊÈd:Vx2‹OLȶì´îµR«•W¼х”a +ÓíŠ6߬˜ƒ.¥̲¹Í|
+15.-c\Œ<1úˆ¡G%æcõ7¶ŸQm5ä”׌T:ڙ©Š´Â#¦‰Å.ú41J!¾¸ÏMeDÎ=·úåE¸ãùÿeúáKþæù‡"it6Ù¶¤óiµÞð鲓[ž"÷|úÖԙ^Ï÷­#ë’ ÛvíE.iD¥QŽ6»^ ^ãI&®/OÙNÙ7É°Y9E ïଧӂu z§—L§Ójaš‰˜‰Øi6gCŒðœÆ‰ÒÈÖiç:eÔÿÖN4êœÎ:øNB¤\fՇ©ýKzs;J›uò—ªÂFùr†©h&`Xù&÷Œª‹™a…‘95íL° ˆ~k‰üº(È¥¥"&†µv”ü6qAñ8Š¤%ª’D,ý\ã &?èu¬œ_yƒïªq£Šíî7’ßx»gû]í Æ'ßï5¿cû Š\Á߈”
+$¹2b52+ó +•1‰=Ò>’òîiNFKÆæQBz oM·¦;Ê ÔË£[•írétžLc¦Ûãñë\¨]$ +@Æ)Âô¶`1×kݙ.M¦×¨Óx“Ín·äñÔ¡5äBlI®M.âuåº6»Þqñs]P§†iú!ɯÈèÕ¾L¢Êñ½,g”éÐ&"ºÂL—¬sé
+usãV³ˆÛɇ¨;?ûë¾lllïP- ¸?©_ šºàfd©âü,R«ªhUc•çV“ü’6&ÂU.¸\4gã_ÄÑÅœ‰ÆÈÖfw9/Huó4MM9uߤÜLë­{xïñO7ü¼=mÿ¯ýonÙÜwåGŽ”õ¡e»–Løђâ&˸q眒cµ;ξ×K²ï~å©ï£>·x¦™:kYq͌ +Dsí +?¸ë +vnc1KS-#ô +ƒºG¸W¸¸¯8^bŽÃå¹£ §I›¥“ç•r¥=ÒA阕4 ð<á4"²7—IEÑÏ;ë™Ï4+ºÅb&¯£TÅå¼$ Ò7{¡_¸™?ÉS>¨7ò«´¨>yWí¸‹Ôg =€ˆEy˜֌(S“Ê2Êøà¸tµÕ[ë5÷a¯=3«?6”œ+“rc¥+*Ùhò0µÕãñ•]ò±¢žq³}Ù(Î@,?WÊì0Eá"® ´“â‘Ø
+8R8ˆT¼ø}þì‰ßÛøŒïƒhj#WP¿Š[+œN¼Y"¹ö+ôÐÄ'œÁh¤ÏÈ[½HF¿ŽØوŠE½FT,fD¢Ñ¨è$‰è: ñHŽS%]Ð\2ÉWÖåêÊtÓt¼®VÒÙ2 £e›®¶÷"ZV­ûFUZàOÇ̒F¢nô"ѡډê†ãäl߀Cƽo•_*ÙÁlçŌFÑ(GB@:F$ôúee\ޘÊôS‡? Œ®¾i"ÃÇ_o¼ÇRsÏûþà;Õ PŠ!j’U¬D‚sÐáœ&lN
+œ–x…\apP8&D‘rœ?æ%©ÖJFÄÇ-É#(8ïÝ '‘ˆƒz´†ó1[lî11ZꈑÝÖ2 %`¤¤¶LIÅØBFB¬«×W+‘t`€t€‘ŽÚ‹¤qdåÓãÙ ßz)= +ÔßÐÓ §ÒsNIÚk‘·…£ßU!fÊѯ܌24‹LŽ­²ì ¤+ܓýŒÿXö;®×ýQÍÝ®»ýO9ŸJ=˜ýŒKSiªÕÎ1]a]hڔ­‘Hª6Õ4J[`ªÒj²Ù§åBnx¥YY “D‘KP‘ B“SRü^Å®°…x½ŠÙjõÛìv;받͞îÕx¼2x&ÑdyS˜™œ&¿ífÉZg—Á&Û(ZÄK‚Fo²œR‡ÂÕ+{©—õxÊYuD¾`&×ð`Ùk—mŒÕc„K¨Ö™«éÇ,V½¸ö‘U]†a@¥¡c#l”ÌÔÖܗV±&šT +42Ë[¨šÌ®¸á,r~[Ü
+Ð\Z/ÿpz˞Æù[3zçoÙâÚqøǶ ¥34ú—¾S_Xóè5©­|ÆÁöÚÖ«ÌßØ1²½6}¾6½°tޞ‡ûûé‰ÉÞÂ༃Ftx–hþ–àYºà\pzš8J¤~š¦-¢UÚZz…a!]«]cyÌrLûŒå-íëçtQ^ÃQ—K=« \Ò¦žzø~£l—±£C&F£lC¯ÝÔHÐB)Ñd\F#j1²&O÷êd,‚Æ2#‘ÓŒs+Œ¼ñº-;JŽö¸ê¶‹ÎÆ +.c\³Ã`F(»ÄBuàU3¢4PV
+ù ê9¤à8ƱǸzqcz饘9ˆñKp-rïï¶ähóu»¶¾Õ1¹ò–÷
+ñ}Ël_uÙ¦þ +ôy¹£&¼ö—ˆzÚ£3{&P`MXÐz˜…ÖC¢z5,‘¦Ô¶Tªö®ÞÞà¨M©õ®p4y5åé”WÛ×'¬K9Ä I^^DDoV ˜“[>¢,¶‰œ¸25£å"ß-LÕ¶dzº3$mrqlT5'‹™ É.ƒãZyÁÓw}uü“Û#çîúћKï\1¦c^¥Ã»kùœíí£ÈnRüցÏßz:òòk^ÜuçOs›ÖOœåÎ=3î}‡i†O"­ü$ܟ|ð]0µÒ[Ë_mnp,1 c£¼•|y²CHçG˜Žb¾Ô,ÈáèçÁ¸ù$†z÷²Ö}3¹ ¾õi<î Ãh2‰,’»5Z±Z(—ì¢K\|ʲ)Ùãd—פ·d‚IR anMS_0ù¸’Å‚†æ6U²ÊÌÒ¼\‚ÔL&N!U÷æ¸K•É†ç „0ŒT-s6ƪq·Ö‚~̯©D½˜SoÖ92H*”ùwø¸é3`ù8HÁ#ÞÆÝ3òÚò½ûjµ®é¶x:ªï=~]Såê– ‘Vá¹Û›«ÿöþȹýS_ì?ÆM¾vÄøédîÓ[wOÞõ‹rW"žÍp>¸^ân’vkwI¼Æè4î×¾Êÿ‰ÿŽÓdÐL~4)¢“ÈZr3MfÊé©ÙǞ„n­>Ž>sL ™Ñ} +šäBTɨ†P°AsvÑBm‚6TGŸ#WÅø‹ƒZYÕIoö‘RTK_ªº¸½£œýê 2±ûâªÆäBmbtÆTLŽK-{RâÚ¥>®¯P> VTÒ@󖑈X1fÓsȂ{sfÞ7³hڔÜÑs_+ià3Þ[¿z؁Ô_EÎFjÙ=üTä;ñ• +_Ög™Ñ G;Fp̀÷`åã½¾{S¹ÕÜ:ϝú; ¼ž¤ÂÌ|,} ª+[¸[Üûôû|·V¿MÏeÒ|©þÑ^1è¹dÔTXòĕæœiƒ4B†'xm¢à®OV‚2‘;I6s %R§°ÛÂüž œÃîÇ>×*.§Óôϝ c–´á…à”ô´“8_QûBŒ¥Û5çûÏ4bµã,Š³öÁ[v©`axb—^3ÉcŸ8lŪC­Þz¥ +c†¸ª7bw +$Lv•P3æλ®v͚´ôÈ2Ë+^;ôÚÏùn~óª«ç¤l8YTÛüêÖðuב%ú©Ë«šÆçfe­÷ _1i㡾» Mmµùù E +…³®ö“+¯¼R½uùŒþX8 °-˜5żмڼÕüÓݶG¤PÒñ¤m¨R3XõÙjgNoþ܂z Gî´%°ÑÄ^{dÓÄc§þYšˆÄš"IŸ–Ä*K;$N
+Ó½‰£{Ù'ËÆÀù3çÙ·Ìc÷è*ZT÷QOº¨îsTa1s +mÅsc~4ù$eüØ¥Á¼„ëv$ï(~gFOJ÷zWzVéîÛ-£2+ýiëv"lˆlÜ޸ͩ¤âþ6#]­æ3P E‚«<Zt‡þˆxD÷‘ã·(i%éFÃMî;Ä;tsj´ÃtÅîÕâj]§a•[“MråËd ïð¸Q9:=v'êÂMxÜNSŽ‚Ö®ÍCå¨%‚ ­Ç)iÑ74{©ÞãÖ ™NV]uN¦öÌîº2‘=Ó<s=+<¼'L7ô&"‡3™dPòrR8-|.p¹B™@Kp ºÑ/ÄÅßTÆ´±¯ŸíX ܞ3Gá,jH4RTǤúÑ+êµ·I¸ÂkŒßá¨Vsüú´Xµ¡ýœçØkëïJÝ|ø6ë䉗ïjõ9“›¿ÿÈñwo]Xþm鯟“[Z>ecmqyÝ Âþ_ ïAœZ /8ý&Úe¤ý*²‰_§k3~¬×T’j5 «aä(á š„ç bwͺN´w¤i" ´’f6ËÀø®À¢³¹\ՒÜia¶„Ž™k{ÄNA8~ý®¬ÞTç¬çԋ»óÕx;†mçÏL•+[*>„²š³íìæáLY¼DÛLý ›/þ¡]µ ŠI:Á¾bŸH4bQOÌL¦—­¾ntd•Âr÷Ù|×hò o;½¡b²ñ®ŽþµÅMҞh4vï.¥LÆʉ…ý.wPGII“†aÑG>á @xõ†K…Ÿ¤Âß
+€O3\Áàýÿ¾œXà3 Ÿ0øŒ ðȜ +ü#ô;Õ«© Úk¹EôZÊÅ>,
+›)¡a*Í;PÁÞÃõåÂ4r<èÊMíÞæŽÙ]ý_7²o +há6ª÷møÒgÏD¾Žj`¿ýÊ=O‹…C Áâ 3MS¤¡¢Fâ´ρæ³èe_èõ½PI¸0½§ +Dˆ}[I êõ.WwV’ƒ&Õ½º+»˜ 8ßf*;³zœ¸mkö½€‰GÕåS—ŽÒ
+Ò(x;=uG³eõ0þ£‡¸Ã0Í×Ç~+dÌ?Œ« ü·‘ŒûOãñ¿œ‹ûü?|2ÿŽ°EøV³Yt‹h7h7HéˆtDW®®Í0Úð©áS㍦ )dnŒïýÓøŅ(K²ï¿gý·Çû‡âPŠCq(Å¡8‡âPŠCq(Å¡8‡âPüÕ¿3ÁS0ðO~bÿ,ˆÕE˜‡­ÿ§3
+ފ×9ЯóÕ5ÕEI ì¿!ñRü±:'¯S0‘Yñ:wQ?Q]sQ=¶žGA|ȃ‘˜ +‹¡ËXË1uÂZhS{ʱՁu–7c«
+1GÆÃRŒ
+ÌľEø|'¬T[-X¶ ôjÌ äx¬·â³ ¶U…iÆÔ©¾oÂ,ò–`ß
+Xø_YË£J~ÞȑÊìÅ-J͊å+:׶µ(å+:ÚVt4w¶®X>B¿t©2³uÑâΕÊ̖•-«[ŒhÎ5*¯pD粶ñ­ÍK•Ö•J³ÒÙѼ eYsÇeÅÂþBh€ ntÆ<(Ä-vâ&ÚÔ­/‚U¸Q¶!vöÑóšäè0¸óïÿÀÿšÅã…
+endstream
+endobj
+28 0 obj
+<<
+/BaseFont /CIDFont+F3
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F3
+/CIDSystemInfo <<
+/Ordering 21 0 R
+/Registry 22 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 715
+/Descent -211
+/Flags 6
+/FontBBox 23 0 R
+/FontFile2 25 0 R
+/FontName /CIDFont+F3
+/ItalicAngle 0
+/StemV 24 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 26 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 27 0 R
+/Type /Font
+>>
+endobj
+29 0 obj
+<<
+/Filter /FlateDecode
+/Length 19850
+>>
+stream
+xœí}M‹ìȒå>~…ÖÊv—\. ª^÷h˜EÏô¢éՃžbˆl˜ÞÌßŇ܎™)B™‘÷FAA^ ÉåŸfÇ>ý_vÿwÞBûv¨¦?Žÿ©?–~úûûˆmŠ±ÏÓ9õ¡«ÿúß»ßÿ؅êÿÚýÃߚªmú·ÜãØVüÇ.VÐN«8ænzs›8VÍÔT~ëN?þñ¾û·¿„Ûùüüá_ã:Á?õùGÞb75“þ½úãŸwÿôÇî<È+ûÚ¿ +éôqßÓÜuom7ŽCWõ©y;<פÒËø£Ž-t%þˆ½úç§þl~ +oCÛL«yŏ·´ô]&àÓ&ó‘#üÒٞ‡iNY“»4~+‰ax§šcÕ¤¡ ¡œÑN1‹n%°’&†uàCÀÊáxÔ±Ïï@Œ±iÞº½Ýïú¡}뚩±•J3ûݟ»ýoÕ^äP]|k§†B¬úaz`j&ôS'ºæ8Úq¬ú¾y;LË0LNäscš|îrƒìyۇžýÇiôl-Ï#ŸÿèÚ·1>ƒM\\Wßàá4œV³™çw¿;¼t"¶oÍüʘgҙaÇ·æüjz‹§«¿OÝïóL=7=ÍNyðÜðiizwš»ÆP§•VHç/LNÔ¶9?(¤s‘tžõn’òàHm–>Û½ºß•ßVº sª‰ç¯”ÞK‘$ÔóÌHsi^®2 º{‹ øüµ‰šæŸû<‘òé»ÍÛ0ÒqÀ°I¦¹ø663©)‹ç7¤7¸‹ÆyÖF»…ŽïÆÆ|ä°ScvÄ:HKeþýæßväòyÍŽœï]ÙEudZGbœ‡„ÄI„yr²LCÌl ›.ËT˹Æ­qfçGåÛebk\SÙKÂ8dk<ÉÂ`æíT6åáur¬à/iia€×g²ì$iRfK¾惣:/óUš—ÍUf#ÀÄm6?XÚ® +ʤóíXËI*cxßIêvÞ°rđ÷†ò©ZN]ò#v ûÏ]ÇqÞ?dÂîBž.!d™ëò¡ÜL–Göu’ùٔGÆ,Ô±¤¹2{€fæ9uZÖq´ËɞÃŅÙÅGûìi£ýÌiS†Á.‰ì ù&Ò ór eå‘66–VÒ¯ «GÚà¾^öêôú&žšß†Zê'ÜÔ§'†òT9dç‰<ÊY1¤^+dZó<ï°7Êâìw²(H,³V^ß³67
+¢ñ´‘‚¨èÄwD3¿U‚hÞºT:eAŽ²7óܐlá~n².½:°óé,_‘cØÄ"K]h§+oË££íwBUvmC …o„2ºùÎLoÁ‰’"…z夜|ӹҏSçåH çðb[æ#bçWÙbùdð‚|YŽ!Ð;ïˆ÷}éɼ=ré»ìŒÃŽ.ë!;¤l8é{!;Jtíñ/“>"f:…Tõ.ŷٞÜTÖµv§¯Yh¹+
+YÃåäÀ¤¾<Š+XÉ£¿.ç !KouHY–!9“Ge»}¦O!oc²}.=í«~í—ôÙÁ£}‚l༶–)¨cg=ÚÙ\DEÑamd±ðÁ„#âe ä¥‹ *“ׯUŒ +r åh“5–]Bߐ6â†&«[ӍÀø½¢â9
+" +úL€éD²z«ÁlѓzÓÔØ¥%+Î „[”/×ä!¾ +vÃ1Ç#ƒŠÍDzˆTrr¤rÞ?k,ÿ†ÃF¦ïüY½óȑVìûê{i3£øê­Æx`U£eédÛ#*i A¡³,u²·³Ø
+Pp–µ +Ñm)«ÇŠŒõ<+ù…ÑZ4*áƒEaÔbÑüXЛä¨æ`iŠ{!ىqùL ø’˜{‘”­øfYâÆbKäÔ£yJ©Ñ°ÿ£AKp†²GMÐB²ƒER†MâŒ(2ƒX„ßDsìðüý‰Ì­22q²øò=Ä:À£ŽJ±]&è
+¿\TªÑï€Ñªê x­vCH–·@Q{§fyôaƒÁp6<¶wõ{„!’£…~<³+±X‡2 äi~p,Ì¥ø=b#C jy°÷ï–Õ)ß@b¹G +µœ%ÿØ1æç`öý¾¼‹ö}Qð¢Uÿ©²#2ò‹íûcsêU{[”ÃûÃÄ[mQçyÖ¶(ËN÷À®´-ªqf'ÒæÆI5黢+T ¢S ›X6Õ2tÕ[ƒ‹¶µ"ëì,ÐRŸ±Î¹“ˆ abA"¿nAn01‚sQ¶ú3‚å1€ Åm 3×àBâuÐV¥›aa¶Ø
+<QWÀ°j\¹ uÁ‚=Õun– Ù%# +²+3?øµb-„ùã¢éov­×2ׁÝõŒ.†Òü÷rU\/Î;äZWÅúÀc8Û1“ ‰¡+Þ •9<_į¢·o‡@—ƒ‹ƒexûûk:¼åöÍóIÒkš´(½¬¿ù
+éu'Ûjò—lŽú9¶aŠ÷³ +Ü$˜3žÛ:+"d@Ó^ôbYÙÖlÈ3Wk±² +8qŽÐí¶ëX…³Ù6ð!⢞Ç6p50Hø¶ym˜õ[Ó.;¿Zù;¿“2Bø±Z*¥ŒÈZ}H¹mϋñëÎ{þs•"6ˆtùje䢺›2Òۓ´AyŒ™yðkÊH9ªçy½U¹V’látãÛp®ùÈéÎAî·)#¾Ã × +ôeER²‚¼¡tžI8îhè N^ÑC 'Å‚óIޅŒQ:ÂpµóñI>,#¯[ „àõù –†1·fo©$>ù!bá`û¬ôƒ&Y?NJ+šeaz£?éü¡wE$Èb°G¿°’ãL4V $.ÌXø³„…†ˆ{HfpI¼2Í
+è¬Üª0À¾¼‚šÁ08’ì8¤û`9Sò…Æ{ ¶ilËô¢|a·Ê^)QH.û'‰®n F+Î'=CB‡CÙGàˆ<S|`zà±Æj=¿‹Åƒ1Ðà‰°~02g»>äleóÍ06~
+ëú+váDýûÄw‰]¸Ú>aä–Ø…ì÷Œ]øeíòå_Ë>ÑJ–è½bJ… câõ‘¦rJ`»çof]̅ý#IKfRæ%ÒÜk ÖÆÈû~†)8ROߝ™$+ü:ùF/‘sg0µ3\¤*¸\µÛ{,zI®RfÊ$”c!¤ÎˆjY"uBu܄äÿ!uî#lbŸxPàElÓixÝÍç‚(Hx±ñ3GàÒ¹ݹF„碳Â`¤ÍÚZ:SM2Ô[ÏTgw¼|ã♚‡·v¦0uϔœ´r¦ä˜]8S’ò±v¦’e{ÊBùá3=ÛÞp¦ÄÈ>Þ)ReiD¨+â¬Ì;—´yøTã’iÞw˜JN#ÍàÌônH¾Ål"ró mˆ@«!hR¥ƒÙWÍûÙ|vɼ4—†U/d0<±ymOÛ­ûò DŒÎºÙ.ÍQŸ0°îãögY÷½Â÷A/ó¬û¸ê~'çÒªGyݺŠõªuÿüÊgZ÷%õ01&ÊÙ#­ûiâÄÝ9eå•}õ¬§C“ñð
+æ9Qk,c~!˜Gì^¿z0ϵ<úÊ`ÿüÕƲ LúYŒe lxcÙJâéǍe][‚yž¯Â™ ³sÓ·T8ôž/¯p,—«¶T8 ÁÌéB…3áÚç7¸û<ùÊA €õ8˜W8›O%T8›üªpÆÏÜ8—z¼=¬ÄÒïEœÊäׄ]_¤#äš8=ë¥tsáÌy6Ñ F¢p¨ÃæJ`큓Úk)dI@„žB5)²×Â*C d5©Í€ð¼&•d¼ÞeÜÂipf+
+”:P`´Iև_©‚åØÇO²áàZÃ-ÞXŠý£º½,AÌ=)úíÊ –Vý}©œ °Å;•DaõDå;Ëåh™Œ¢þÁòº¾P&7wú»û'('ØXMo–t’XÛð)Œú²Ì—‹åC҅r‚­›=R3R[þ½9ý¥~Lé›ëë ¦@:ÿmê Æ’¸_S¯ˆ)óè«ÚKõ«½ü9ª½¼"¦Â:;
+íV…ô:õsQ#õ¼æMi¤Ž¬hΫd4ÒÖkyÈ0‰šJ¡¼"Î;ꍔ4À@œÒ'µFš½ú¬¶àÎ}ív5¯Ç +Ôh¤Î4¬Ê…+žÉPOiýW=wÚȰg}«ˆJJRIdöEKiÙAfY¦Â¸”Q +¬’¸Q—1Ȓùש5xŠaCtãHÎoê+k©®$Šµ+ÍT£±RACQ¢[A)Ö³ºk‘Ë›Q,œÎ‘À¬ž¡4äY ¥­(ˆÕß)sbxCD¢#"É&ÆÕºâLkÕe¨—°À<Qˆ$ÚÆÓFk¿ÐS†¶ŠÑnr…`\F±ò¨XE¤øµ X( Ì_ò.QDJÄÀŸªJr¸´&ڒÒÞ½|²Ö™–B0=& ×F¸ØҦܱ)€þµÔ¯j—¯ÛÁ×ðì‚aˆØ¢PçeÒ¹f¥zîÀjù¦äiÎr¡U.’;¥h‰}ƒÚ\t˜Ò†{«úiîÈ˲:]ª¼4‚Sýð/÷«Öú‰ +†X#u4 È£.$KÑ:`¸ý’œÔ0‚]+Äi½Ý¥jַᓻ™Ìq5ƒÀgW̙NpCbR³n)Ph¸
+ðNì™ÿR—% —3@…Jg¸E3Dçí¤<Žçwx|£T†¸!Ç®d·?‡.ƒùš:¡2±Huá"uî„ê¢$!uÐ ¡iÁ¡²ÂÀ¡ÙNeÞT8´·;i‡Jd„3cPÏ%ËÜ&*çàC8ô&§ÄÕ04YѸ.Œ»z +†º$c’Z‡¡b~ºC…}†vN-Y„¡Á2҅†š**è”ùÂØ݉½N0úah1ŹÄC³ÐZ[ _Ö(a5ŠÍaÈûBXyðÁԟÉ ÊÜkÄ©Æ<jÖûr7 ÚمR4…A;w’8M0â0èµh×1¨›­‹_ —`ä2Þ\z7ÚCþ :ž¬Ð‡ª“Ÿ!é9~EH…W„”ÞëRé>„T•_?1 +Æp¾UÌaÖîÆ¡¢Û=i°”]J½¹ÅKü* +´öFKƒµåÁsÃä
+Áê KƒEÏ¡Î_Ñ®õ›Jƒ¹4¥ni0{ø +Jƒe+„6”sÚàm¥ÁÜc¤ZXuSi°¢&•Ç~¢Ò`MßúCŽhw™3ïw$›¦Çp»”óômHYͅÉö¨]Li-ëEÒyÔþ†óÜZ¦AB‹«-é1boi„è¬5É;“wKŏCÂ(kÆYt1é133€ô˜yÀwIÁÊC˜#fÂh +žÓcHy–ÏKišP‚K²mE¸çáÉ$TH½´µr¥&ÐÖ5êðx}E`4s/æài=k5»ý@±Y¤é×y`mv_Wöê}©IDÇݓ—îe×õ’âÊ©l:½[1.œ¹µem]Jv yº<$.ýÝ­'9ÍÇ÷•\z~÷ë’Kíz%—†/N.½Þ²á̵±xï_÷ë]?kéÔìçŸ8L“î‰9f†Ñ³xEœw^>‡õí\¦ÞǪ÷4ª÷ןö.tBÉԓ€°Þ×À–²pÚÑуQ*Nú$¥N»Y:{hjb¨Q4–QóR">qÄå‹óF¢S|N%4zê¼ÞÌqâ8ñü =8•Îóý®ƒUýÌ»#“X¯Ì½IÀG[^·ñ6ª\!}0'ÓzäˤˆÂ]vL§Ò§Ä
+G˜q±&Ì#Æ}AI†ˆS"5GŒXõæekhÒ@”G~ˆ:Oóà>t–Oª²åz;EŠ6Z ©d"#od²išèþaGחàý®Š¼¿bçò «¿ë xTáÈFøLÅNh;kÒªoËb'Š÷-óÝ­'9?¶Fè-ù¿$Vü óÁ"p¢pÓeøInt,'ZøÏÿ=wíN7&Xoø×åÿ‚þ£zÝèø9ù¿ç „ÛØ·CEãH–~ºÈÌÿcª?þk÷kª¶éçŠVüÇ.V
+ëTc?i×]7výAr ýpd;Æê÷Ý¿ýezhøQÏ¢åðÏöÇaLÛ¨ÿ^ýñÏ»úãÒEÈÿó¿O}ùçéÿÿ#ö«ÿqr®Uÿo×týiÚ&i5Nzþ!æýXg»iæ}¯è}xëã8öñ0¡¤ÿ¹û_Ÿ3Ñ텉Ž!æãˆcW5Ý´-޺ӏóL/OíW÷¼éÚ·ñ´-šÔ +¾˜ô„0bÏÛ«öȤËý1«"çiãŽô^OéG–atÓ0’ú'ü˜þö£àŸýÑÀ¿òtfü[µ›:Ó¾9àof^uºfúöoÐÝí~Äv±)Ûýtõgû`?Ó.MÃÔCh¯^\©™ÀßóØ¨Ï¨Þ«)œšêÕgTwMÃ]ÛIêUÿõúÑÛYŸ#Ó£¨µÿ¢£sILôÝp2¶#=:ž,ÏëmÏnz5¶êÅ'=û”{!6}S$ù×Ç·vÚôCÙ Qq¸˜ãˆ]Ó¦dÆьÝØ<lñÒ8R“‡·éç!ttíÄ‚渍f­â¡u“4‹]^ê©iÕV;1˜³&ýh5O«͙ÎlF}ñH=Èlù Œ’æ0½f¥­’Múe=ûìöý}:pýòËæS¿™ÙŒ?Î_h Ã^þbLê×øWý²y:ÿ¶ÚV§~m’„Løëa·GkwqŸ»îËNc§—fnÌvñ4ΈËãad­!Œí…'AÕÚ¸üJûWÜŒGÆàŒwï@Œ±9i‚ÓdïwýÐÎ1â‹?([Ü¿þ·ê??®ñä|à†“zÒNR5Í·\¼+z>ã‡Ã÷&Ñ;«3‹tigÿYúÎ6)ÑÅЭK‰~YJ }Ž_7Ž”°­N›ã°Ž0Ž¦Wàô %Öð]¿$ï'‘`$BÖ¡ËK¯N‰ùÊ.XX4Á{|7­ªùo?|´2½—;Ù)É3I/õ]‹Ì‡]̼kZž$qÔúV­årlÖDZ¿øYÓ°ù¬Q<VôºI¨=ÕoBn[!~‹¯@ѧ:œã’tÏí’Ù]–,oºô?–7Š>Éú_F +6ß4ûdEÉ´½3‰fuhƘWzïz„Nºw£f(.7k •=¦z’4v›Ni¼Ö¾ra +ê‚Q¿W§å9÷ù¡Cy–ŸlŸ“Ú5Ó?tÏí&¿°IÖLgˌÜŸÒÚ.žzt™›–øàͶÑj`øÑ,8ۛŸ¸üÊeýà>íK§‰Mâ§iÇ&?øàŒa(¹MaRFó„™s[ŽüïÆüÐhlÒ®‰'m­6*¿ÞéM^ÛéF…Ƈ'u\ýSqÞ¨w¾Õä'žÝªWñסýь‹G}0€;.J:ß_ÝÝFcÙOuRèü ckv£fÍÚºûÅٟ„z“Jk +ý¦d¯æpæÇåÍbv’³®Ç¾êvK³ |´H?Ò²Ïáwݬ†^æ#Ëvš/ևÇ1 ÂãþÕ=ÏÝôæ86qœDxâì œ5yµZQ›Ù̏]Tó¯ìk?G¢0/EJNË8¡ŽvûáŠù½Ã§s71ën‡®š–u¶Ò̵Î=ýÛYä>ñ瞋¿+~¼¥¥ï2Ÿ6™á—ÎöYd¯ ,ÙCgñ±šIzbì0~9x⟬…÷]Û7ǨØa»@Å6øç6…‹Ê|´é +ÏqßCŸºxxeÃ$¦?Æ4¦þcó‘¦÷»ãe–0Hü“‘ßZjŸO1d-¶‹Ä?ù}¡˜Ð¦ÄÑâ"õOJ_jÈy’¡ñl°—6ú'¥¿/5äþ´­G5!Šú'¥¿/5"äæ`x8•%…¶uÓÞëfè6ß8 M{8}?Âƒýb:Šmióµý[j{Cš™øÑÍÇ[êG7oA¨7l¾…F€|Íæû +a}E%ĸ¾R§Vö}'±é@ŸÕG¿©ïf®þ¾3ì˜îñ½aœ£ +õ÷€~×ïÉ8Æé÷â3äã¾ëøô÷è¸ï;>qƒ¾/Œû¾ãSߣã¾ïøÆnÖµÞÆ}ßñ©ïÑqßá{rÚT©Ó.ä»|­@–’Eý¾ÓÈÝõkê¨+Üt·“>54«°êsH¿+g)ÃН +ú®£SŸã£¾ëèÔ1gƒ¾ïèðs|Ôwݘ
+ÑAßwtÈSø¨ï9º&…3Æc¥¯w>ê»OO;ÏÞw|]ÿvØÓÛï ã¾'>~ïÙ•’bÒH¿ó„âfú_¤#QRö¾C\hXÉÙ;‘7|šÔÙ>pßed2\#Ï»ÊvÚ®FžwýmWÍç]¿§ä8€¤ß½P…Ë)FQÄÔ÷´bt¿ïÑvõòÝw|q–|Zæ"ྣTâíªñ¹ïÝä4’2ïîmÁõ˜k•c.¡ sÔ¤
++j;î“Uœ‡Ž hþêéöæqp¥/öšÅæTÙ¤MÓ ‡]—4÷”î¾ñûqbw‡ÞÞ¸)MØî°èÏûâéWûïM¿ê8™}p´ëþuFˆ.TÊýZ‚ŠyÕWE¹ü–ÂÒ-gørEtxÕZ‚ßo+ñÌ«q_&©#敤Ãßãʏ>Qõw[µÿLÅiÆQ?ü¬Ñ ¹k‡·cvCwéa‡dë5ÜCv¿`®¯®! +Çbml¿7b>Vk& A¥Á†Ðá‘¡m*>¨a ‡RMó9¡ÍN5 ¦éÊ¥:Á+ô#¼B?Â+ôãÉípÐàÎ?qD;~D;„.™üI‡Z Q×Iݏ•t1@«“œ|ª….B±)×bµôÂÕÅ"Ò1\ßaE«a°ÊìÝRbuR×nt;§?­øÏÃߚ~:9ÝsßC‹҄[Îñ« Y'v¯WOÑÅ?t{`Ô1EZVË°˜éµ"".ÔDËÛ
+NÈÃóå}—^¿r
+ÿQ +ÅÔ~ÑCù%OºfŸ«C-tTä†h0ÏòÊókR߉#)MŠl§ø»:zíš&Õ}–&5i6ÇÊzݧkR£øC^šTx
+lÿÒ¤^šT×Ï.Ëcí¦ù§Ù6­Ìô¯CÔ‰É +Ãó‚Ã1ŽƒÉgú9Lìæã¾H†ÖVÖJ Œ6­_ãÝhæç£%˜LêiÚP!ÐàM£¥jw‚-ÏׯÔî3ÈZOißX k úSÚú6•²Ýÿ=t:Â}.',kªÜ(M¯ëZ%šMe,W-+þ,D}®®n`Œö0¯6¼Î%z[ÐÍ>ŠÚ öœ Ë缈ƒ=ì£or&Åôp785\…¥ž˜ÖªÛj†i%É°R…ã†Q͎Ζ¸ìÈÍzsE]Ð8Q[Siú eû¢ÄEqóÛ·¨ÇÙ¥pŒ4™¶ÝSǓ—÷°<­eãùíßIêêŽ#n© .äXl1¸|–ëz<ȝè?Åà‚Ÿ>”€;E~ú§Sóef¦®1þ23½ÌL/3ÓÓ8ìÛ0¶ƒ¹oÂ8ìûû6ô)WÅ'™™òok*ªÑ÷ÖtÝu?g¿víB÷¤aŒíÿÜ y Kô-TÁ6Æ6ç$n‰ß­á9‡5„q60³aeӅ /š47E ›¢„›«¾3ÄöÏÖN^þªQZÌïñ‚‰õ†@kÝAT*mNxZÓÿ¤%/“ž„ÅÒ¹‰Xç/üõG»¼ÜSrF­wâ¯möw<¿ò8í“f4Û[”ÇüYÊcŸ?UyD5jèŒòøR£^jÔK:þw锵«§,M€èT0"Nçy®~'5€ëx°»CWº¶”ò]9\˜3(´P¸Þ_N*J4ÎiØ6ŽØ]R±êîí‚ +¹,ÚÆm»»ì +qµ +…ŽÚMZüù øÄUý*®*X±_îIº³5òSaϗÀ³§«shðig¡ìãödšY±óÑ>y5ÊIýÌó‘ŠqNûÿàµûåRáÒ¹¼¶›/¬Õ×îby[îæ=ÛrU´ý ܍R·rýs(—'rc~‚+Àç{sËWôÅ»xùô|‰·Ü5Lî–V×·«Û©å¯¹!¡•;}ÕõÑ5¹¸–Ù’¯}ùùؘùò7Å×p峺<¾,䕗ÇãMÐvö§Ûœ{;ïK—û[¹ñbã¨)‹ÑÚ©Ë Gr4lv.xSã.š\}¦^—ˤÏd™k¸_ZžjáBhi²™çKn /—I'»GÔ»°Æ­¿à~X<økôÕ_rc÷ho×>ÍxtG/ g4Ù5^>Ͻì ù¦ÐÔ­úxßýÊ +ú5¹*ß¾îÿ’sDöj¹2ûJ¦šqûg¦Zî‚þSåç­\§îŽ 9È£}.…Á/VÌt±Zw8eÓÍ,–#_¤É-ö¸˜gê^ÏáÛ}v¤±‘…ÕÌB¶4WN¿-EgOò ÇN‹àØGMZTœ«Åep¼OíÐÁu{<nk¶Õ#À/¼"qDœ-AGËKבY¹¤xEÙ¨ó\ÁvRÙ÷C€)æÁÒSx¡ü!b¾pr¼ósÂ|´àsüt¿C†Úڝ½ ÁMޟ;%øÏâñ}§b "*Øì` ¡RÉ#ßèavæi/Œ‘`$…ÁÍ,ná÷eŸ8’å%㌠+é敵áøIsE…á‰%çx,wT~¿ï2‚þnöìôRNÑKñflg¿Ðþ~“´É§ï¿ù»ìád7’ðP$ËñPpÄƑ¼+»-Ig„ØÏo / +ɑ.°q! +ö4 2€ŠˆÈÜù¯DP•ÑDF÷(jŽ;ZMdlL7•ÖÑYί5TdJ‰~´E°ˆ°i-bÐèÅUv¨qQk º*@ ¢6L¬µµ#-1ÀhÅ)’νAî"2PhŽQê)CO˜X*«à°ŠÞ¨ZŠ٤ſ¬>ÊtOi¼gè™ihˆ>šÁÓ¢¬rG¸F$*n$8a+VÃ5H"Z‘€¤Â ‚Ì92?¦ ;Y®õ%ò*fkòA‘&ºû»VëœâV¸¤õ2öWõšŒµy´'MŽ +ùºlGÜŽ*)¯vþÁi¢HË:?M¤'š¨ûUÃsl(6~Ä¢ðŽ(Øä´äõ˜éëÑ£ª)RDì€VuB5ë›ðÉ8ßë0á“Réƒø$Yv‡˜tÀh¥,®Ÿ€ \ßò ³(à“­ƒ ûÜ
+á§Âøpò¦—¶E
+—VD£<y_~GÒYr
+)3DêyÖä#Ý<kҕæJFÒùñv2Þy®:Ø©rø
+MŔƒù‚²s±œôN ^£Æñ]15Ÿ[D­ ˆ5Ǿç?F»ò™ü¾#ÆfD}É°@Nš_AtèHz„2gÍàföLÂù+ ®Uy0óYä¦Þe'É)ãER„wk‘æÊæCcyßø>—¿»„y
+£È©#1™ÓK?u„’DqF“­S§‡äHˆW_„@j²%7ré>‰F{³éì…ûxĒÁ57bÔGM%Û5GM•Ÿòàh¹%ñ먽VvïXY‹ÐØ8Ro5>uXáÁ”)֍ܤÌù`GŒ– ô7ÈöˆÂE`ƒöVëÇmöp|£±X[„6E fÒÀþP(É[>Lû°¥pW«LãœH_|•ø®ÐPœ’#‰¨%æùHé“t2æ®ÑC[=?Š¹®¼ËY*b-ú_kõP¦ç,{µ–U/mg%JË;÷²9 8‘ÆÖÙY@Z$Q™Ø)óCÌ7¸šsD£Ò?̬Ž‹ÕÁڐÔ$CŠ
+Ü +V³BRòïFx··+Š¤râÄ´’a¼=;dû *‰D”Θõ¤³ŠòpxÑS’1-¡cî‰0ÿ‘Ig/¸¬#C<FÅBÜÅî lÄC+·»<Ï3ZÛ Z26ø<ËJó!âËT4§Z7Gc!µ š¶U¡±­µŒMªÈÉƒŽU“OhÜ[ՇºŠP}¨žÄ…P¾È¦$؃x`qîé«Ívj•¯¶wvc¡½›¯vÙ/‹Ö/TxñÏÌ3°änm̓p€³ÙLsüóÜ­òQd”gªv·&Ëë.¹[7°º{:ÜÈÙ3+’zGØY?ˆœˆÖN3ª;×éTD¡:¾»ªS’sZÜBPg› «£¢…`©lÅû~א+¤¥™ˆ¼óŠ ¦ɑ¤ÓH-ä=̀I,,ÜY­ +ÕÔeTéÂð ÑHÅEÐ ªŸ²±oÃÀE>Å
+WˆQ?Ǧ í1r‚Înq;Ì·p;cÂ9î®8ȑռäßØAî£w^ò´ƒ¼³Ç«º¿ƒÜ몟æ W´ïç!wÁÐÕ¢‡|lÖhö3½bƒ‡Ü…Xo¹#UÔC®>s?ù؉ñ$äùrí"gÙïj‚>6-ÙdÅøÎâl÷»ÚÚQ––×÷¬Í¸.ß×¹¥õ°Îè³(G"E ( º³¤_Pœ.èR‚pnÑ¥ÖìǍU|žL—BÒv]jp²sø)…w]—rö².U ]¶Xóë]y1œg¨ù&vÞo“Û’m—¿.·…A_¹-ø^›Û’Œa¤z嶼r[>)·å:†>.ØzÞ pgmîþÊ× +ý,àÎÕWŸ ðh?„†¼Ÿ5Ü¥Ôß(\öåý2Àc,ŌâpˆLæô‡`H/”üýQrcÅëS¢ä«}¾%Hvœ}$³x)’Ñjržª÷¦–¶#³ ĚT'Ú³F7ZXbùR7‹ŽÖž?*:Ê!QÜ?ú³{[õ–脿FÞŒ¤cNÃkwÆ#ÕЏ„Ò‘C'$ ¥sÇa¯ˆ.ðøb(Ý݅žƒá ÂW‹¡tÞKü»ËBO¶‚ßFè ¹µ2“zX/…ÒQVΜ’[>”.˜Ö|”IÅBéÀ»ÄJçÜ Èñ(¿¸&”n]M=–ֈ͹›­©¡qxãØ÷C!öªh,|c#?nÎv‚ôª¯ñª¯a§¢z…=QøЫ¾†žœŸ¼¾š¸žº¼†<ð*¯¡{Ï<t] ‰0ª>±ºFl28ä¿0qûê(’dpeFÁ†Äí™Ë©Äm&].wu}âöՑ󂋞:Ú£‡K DZÿDìë|œ­’  [±¯3à®^ +÷¢Ygû
+z +ð®Ã¾›\œ úº}Xã–o/@ß«]œDMôu'fô%6
+â©[B¾Ò\A¾ŽT-¤P
+x½òÎ{Oä+ބ‡"ßÎÊýeäÛ»½Œ4P\ºø#/Iè¾ù&§–ä‹xö+€¯—êä7¾Áé҈\Õ¾
+DùòÀ— ÜO¾Ù>· |È}ð%Ž¾ì¬Ýø¶­ò“œ/ð½ÙÅ>÷•ž,KªLDÅJ´ ;Ýöuö—óÖÚxëÌ-û1ÙíwÄx´ßY‰¨¬Ô()•ËöTÖîi\ +†û+¬@\#{o“)•iä„ «u"¬y´BÞçaV: jžZ[i_´EÀ>fC#\»ÝûC‹ìþ2ßßrܲÜssŽÊùϚf£ÔÌQ)œäŠ•Ñ ¿ÂßæÖiëßâKu÷¨}Ínõ¿Q«;×¾jLûà•”Ãj_͚®®}•­ØEÖ¾Êí¡
+Sj_Í]¹_í+gÔ¸±ö•÷X®¥¸K½jK]ðÔ`šzýÙµ¯œ2y[í+ µ-¹K½íJEk_Ñú¬ -¤ž{ÿ +j_9ªÇy>|Xóƒ8/îyÔ@¹²öÕèÄV&½P]¡p;·Zé@Ù¢©‘ 3w¶BÑŠÞj&sÈ}!Ña¼_/QHÛ3ñˆ'F|T&¢TÄ +0à¯ÊDllo¾M&bê!iº„ƒÜæø®”æƒaÃUi(¾õ‚Ùkg‰l-Î`Sl$gRçÍ!Vîϯdܖ½ðé1c¢ °PQËbøó'ÃÍ;e((ý³è1 æ,YÞ¸gK©ñaë¶øx”Ô½ÖÅbyÃ!HWCÐÄy»}Ê}ßñÂ}ß±ËýñíœO†þ­;ý6ßn›ôí©ÇËXÍ嬍¾èU_Îz¼²}ùýÃm¬-^xۘçÍû_vqú¥‰lã¤eôÔÐЉ ÉßXÜ 0òv03mFή¢mzsW0^É{˜Ú¦]YºÁ| ™¥#KÕl\*ÕÁÔûµvD§Ä¼ÐŽ?:¸`wڛ±Yû^v×m”÷Á\ökûg÷fÿ£]níðt4_oӆõ³wZ..Æù¶óŸ~óóߚéM+.vºCqðW:«åèȈV¦·ÍôšétòWrBÔ''"}Ö›&O²uÂæ¡ã¼ái{ŽÒ¡àÎAÔõCœ;~81QŸ˜^ïÜíV%…º<ã]ÚúþðÃ|­jYw#ٛÍÍ6 WRô¿íóv‰ìò¥ŽwáǸ|~â3×헇:õ–¼™Wg§W÷£:Œïþîn<Ï׶l›Ê+Ón¶Æõ.OÚßÔ?'>—gm½‡Çé:0ú¤8s^ü˜Ù;iDÆG'Ë|Ç ù·þ 0‘1Ž ü¯ê2úø…WÀ¯3 IˆÑý!t,Ç›(§'Þ5}8ÂêtøØAªèq~҄Ú#=”+Z–éå»û…þlS [ȞšúxÐ;ã]½‚·dO¹Ôlrµu]‹åG¬vbyuÁ™Õ–Ë“WIgB¥3‹æíé-¸h‘B+xgŸN0±bM¦ÑUf¨yµÏD>^£iw°Æ÷š˜™´S½dÎ%ÒZàå(³U$Ah趴Š²qŽÎéS^°ÖÏJ%°Ú¨D8,¬JáÅüÕdìõÅüU’¦ü¾&VJq +ö9ß՘ϲ-_'ljÔÑNÁ‘$²A…?…ù\)ªØ#ƒý ›‹fæ$F©{<»o5xù]U,_Éo/p $cý¯Cg¼èì÷¹ +GÖ¾Kk= H:÷›TQï‚ëPH9˜ï¢ €x|Èm~èfjÀ?#{¡°L—_‚Œµóš&.“*}Õ)"âHÚI²TWb—‚Ûì>Bn.àK9çÅfêŒÐä~!ã3üøõ^àŽh¬eŸ”“7Æþ¶‚ÄÖnrèŒ+õ^éûôŠàšRïÆP¯x’ÀÄä…PQ»ýnk=$i¸”Û1€3 Vh‰cJ‘%^@6œ‹,°2ĝ‰%Fo%œ˜E² ±/ +"‚hՃÞxQ +sA…$$‘T÷P.¦(—=v–e’Üxãm‚{0[öT7ld„$ÄMP{9U_ÌpI£$jŒÇ!ªX
+,XëÀP}=º^Ðwñ´W£Òƒn µÊó‚©=NÕ¾;Ç jr©J:Ê°Uށ¯î”Hnҙøyt°jċUk¼ïÖ×#H„ß OÖ$%ùˆK ©°üä#d¡I]QãêõjA(Kjº¤¨ÌÝX*ÜCtUwkRšGy(/ú{kâ"Ç ~TûföÂçU)ß½[-¦Ib¦ ,;«SAâ-jU“dÄY¼pv‰ç†eGVèO e‡‡\Ø!Ä:Sd6@aٟ‚˜G óô–'WV×o×5þW™ùML²•º•¹­ã7Ç£ž§l¯³õâÖ.ÿè0´®<9fÒ$!ª‹«ƒ£mš2¸ã÷¥@¾ȗùü
+$½+ý¥@~²µgö¥@º/(ÎòR ú KX]èoG>ÿ)£<½ç·o²²N ˜õí+eÿzl3S‚]M_b§W[°ôy5ð"ØbØk-«A‘$Hcn®“¨Çù»Wé`'ƒ›YK–[¹çc“Çȱɒv1kÙgbdFû š zƒàĊ ŽM–½³é³l«Ž&žn°V\Ä畹}WIŽ6’Tú„Õ@Y%axplLs²zISy×qÑä™#n%¡˜›Ä6#¨0ݾ³ÇNG9öA„‰½Ñê¥j˜YœšhÀñ"µ,vÌfúÈònd—Y¢ä1ãÄ.s¼1}ƒ…”Ÿ§ÌˆÄãê¥!hJƒiyÍ«+$WËþøê`-Ä…$L|쐏—Ɖi%bÀ[Æ¥$‰¡ÒÕtl¶-Pq@Ђ>§*Ô¶UïêËÔ$U{A|ƒÝûõ”ÖžAš°ƒê‡SJ(;艺E#H\Ä圷ƪ$4•-µ6ø¬ŸUVš¬â£#jŸ{½ær#`¢TZE;®d6Îó&64ʝ_gžñé.Viœ\§æbF‹ +á`÷2ÏÌÍ}Ä<ã
+ /™g\Ô5ÏpqJ
+M9[ áK•`ÙnžYµÅl7Ï8 +šXl⿓y¦÷ÿ.òÇO5ÏÈöL3ülg}÷:óL°ÃÐ&´Ï°`ÀûŒÛJ·Ûg\ð×­öç‡Z²ÏÌ3~Ñ>ãêm°Ï¤ò‘»Øgœ1†Ü²dŸqa­·Ùg\Â÷’}†TvÙdŸqÕ]bŸé“Ôì|ù®®›²^ªÂKìù§T{R ”‘k^ÌÍí ÊÔ}sšÃÂ_ª˜cwºŠ!ÂE$52zF…Õ©éU(5Ißc¹3N…Ž±X_EÅò?ó×ë÷ÕÃ\5YõIe «‰^«ø$§ËVªTªqiy…¤àÓå?ªÛ >õ£Jêxñ¨ËS6œWµ}ّ^v$MûYíHh4ºƒ +/;ÒíHC>ÍDsÏðѲ X
+’Þb˞¨£CÏØh5ã¥Bꮄ +žíBbw¼|BÒÈH½£J‡y”óq¥Á«`F`´zs>¥#u†ÔZ{êýh«p®ùäJª€_œèѯÈhµß¤êu‰aÂæL,†ƒ0Œ‘>„1®?tcxëº9ïôVãíŠìPl/×xKl š%—œVXêñŽ­[ ·»[·JáAìfw­s0«Ï‰­“•Dã­ Åoœ… u{l]²Üþ‚=÷Á±u 23WCM@QÍcëž?9Ëj7ÄÖ¹ëH¥ËˆÑ|çä,Ñ÷Š­sÖ-Š¬["5jbÍùÄغ"$üêÙY)øGåì,o +à>ïu6FùUÀeû¤ì,"Ÿ ;K¦ûnÙYBûPv–ðGùæ7ÎÎâ(h—ì ˜åæ:<Ä9s…˯âwô€Ý4;sæ:ñ¸°‚)øÕÂf¨Ã#ÄRtg•„£±@u„°Ï|C˜7óIM®«VUR¯‰™6)]›:<›s¢¡bx*[E´»–-0úí£x¥WÁ­ËÇû©+uçBAQÑìb~ïÁF7ÞÇ]£v‹uxú짝ÕáauÅk¢kÖ4Ú7Zž¦ì¨'÷‹Úâ­ ñ8­¾F£œÀi7›™Û©㘿g"åËØó)ŸÈØóU‰”/cÏËØSÿœ‰”Odì¹"å÷5ö*ÁÚ¿‹/u0´\€,ºäjP¹Ý…âBÉrHAfP´ J2/¡f{†ñ~ ç
+¬T0EòX^™µ„éŽÜ±bíª‰T›q ±€ù=êöfn¸j‰Ý«³LV½¼´ßÕ$MP©X¢«5ɯ$³Ú\4Ù¨øHçί‰×¿æû¨¾2Dœ‰˜j12gƒ4ò †f(¡î^2=uO]\@͑LM®'S/õ®ƺÃêÖÊGeç­
+ºÃm5wJ¨©¥aå“Xµª„cgÕª:ÃÇkz-·è¬\5[›ˆ^Ïb. )º¼&‹Ì®ˆWΫ†f0f®ªùmÉ`DA²Ø†àçƱQeH«Y-+’á` +Ÿ¬|µÀ”Ñ®¹þ:HÌFZ“Ë÷ôîâwŒKi^G³_g·™;u²¾T8X½Hßà~u±KÀ¨I$œ…Èn3í· &ÈÕ¯w (ƒr3чF¡-[ávMbÖÜZH|š(a‘˜֢ֈ[£Â,¸K™„Dá7¬qÒN9 „c[Ž¥2èËTðËqݱ&ojØUltîþá _•²žòÊ aԇç…Ø"Õs公øž4/$6ù­içHÇWbÈu·€0# o©?\Bu;—r<…øþÍÎwESü +¾5¹tZk7R(XǬ^Šì±ºPÓH†û˜Û_©fÄ~®”Àà‡±Pj7Þé¨à¢·ó÷;궕~7óŠ8ƒÌEO.ÉÅÑá8gƒµlÖ$Iǚœ©^Üý¹z™L¼;Š¦”Ì@p™AY»dfð4r’Ž]îÑc†Œ“­$fiÞmÑ]DÆ_რl3|þËÅk¡bÁ½yžÞîp;Uۜ:Òªö渹I7Å®t
+Ÿp Öu,:ðBÜöT¯€ÐiÖ  XaGр~q³¯‰™l-·¬‹£Êýö¹OÀŠgTO°’É´¿VÂÂ\så®ôWi){€n+-å|fßý|¥¥f®^¥¥Â­¥¥PÊ<ci)šR-”–rÑ)hYJ„¾JKU4bÅÑWח–âXì×*-u!¥ßíΟ¤´TLùë‘} p‰Jàp¥#LϯÇ2qKßÍöt «»±ò' P'þvb³@|‚œß±sXéèERF¼ÌÕ¥ÊâÙ”$s%•Å#0©,^Žþ<ŒNÄ<ÞN)l]Ê_ϧH)’:•‹_ÆJÜ1›ÞiÖف¹FÄËÌ ‰_ψœpzR{CˆÀr¶~^® tG%™œ°òàhßÅä¨"Ü Gí¬(¾TBÊBȦ^­ƒèˆ”!egD¡Æ šòà5$j‹Ïñoogš–8ï è)T„jÅP*«O`<ûaPÄpM¢<Ÿ7x³¨y.RIêÀº¼)½h}CÐl…]|hšF6‚Ï»Q˸N땑’Ðg‚7‰Ñ£ºpiUù>’P=i­DÄf×â&©â˜AЈTA|*ìo´§÷… ²uAªˆ¬pÞ,+VXé¼3Ù­‹ù¨²¬‹`'¥¢Ðê×[ƨ¯CIþÁÞ6G¼mÆÊàîR:kO¨ôU*…Y^C2ï–ïºH*T85DHNhj5Äåã"©”Ôë-üT–{ko.}ˆâxïZý±Ê™»ï%w~³Ho—þ²½êš›E¸S–Þ,Ò5Ž„eÈf*)õ—¼cMLe èÕFϨVa¢iûä»û²=9PÑKüÌDDKü­…Ù«6‰Ü<°;ŠÙ—íåEûâ´ï—íåE»§-wPùç¶XSO«iô©[kµ;Õë4jêÈ5:uVÐʤ؜{)¡L•òÔ¶À 5{
+†šFÒ)ü¹§ET œªCM]Ö*¾„¤æšÄ•Þjê}®!h
+B#ý§¨¶ˆ‰ >u9ö´ºC¤iߜ>Ýß3ï °¿ý}'„ñz$´ ‰Yˆ€»‘J2ñ:PÓn՛ª6‰*Í3P“êªêcØ1ÒÂÖµKà†¸[-ôò‡¯…žünö5«…ÞûcëÃAI= HPé2¥¨µK¬C¿:!:˕”ms‰:N’· +ÁÍ£”Ålãì’Ì6"j;%kç“è;e¿ˆöAT®zƒ¤”ÕF_GR’׺•û¹&¢©&Zr:”À)! ö\ô2[D#Ôù/H—$9A¼˜2)ÄLôJT*ÑGJ`ˆ“«h=ÙĈ¸r0n0rø<ZéKR;‘ÛenQÛ 7´«JQ"1h‘´4Üs$¯ ¿ë¨Ùìp>‹ùUŒòUŒ2­)¿ŠQÖW£ÌîÑoTŒ’ådçà¿ùk£Æ[%IPÙÖ/«dP»àW·J¾ŠQ¾ŠQ^e•¼"SkLoÇ Éfjüc¦–ú3µTS,Së
+F; +¥Ð4­<øŒTküMÿÔ5GKÁxHêê$©k\۞ó½>‚|!67’z—ˆ`]µõÝ­2—c¡„ƒV:썸:Ið5žþs;ÞIҚáUßRš‹)°5Ñ`kW£T¡›Ávª&a+õ¦Ò\“[Ksõ֜S­°‡Ô85gɁ
+‹u]ͦɩu ¸œÉ‰Xb_“„ë7`!öÃîYi.ŸÿMrˆ+Sƒg¥ Wñ)ª4×z.¼„u^¸Øäz±4—‹l®o.͕­`gkP™¤k’‚é±Ñ{j^šËñ”û„9£ê +®ªíA÷ J(áÚï:ÐqtŸ¼¢4—7°Ò\¤H×5è˜V±%ÂårÔ¼"©ÒïVšKh}^¤i>KâjV®ëz£a?îYšËm&\ë8¦ g~m¡_º9ÒUC?ýà&ÝÔ3'é7!?«䵪âU*šIJÚîU²Z½a×¥¤Ußó†]DzAÉ +»¾‡ ÿ¨VnØù™7ì’J·Ü°‹1ä£ý®ÞæŽyÝvÃî`›û/†Ð>ÿ†Ý&6À1_5°®›³ÌjÄ<øZb!m¿–Ø)FDª¾òZbÂTžçZâ¥ËD ” ©0š×µÄ!Ü£>fÓàm…ݽr ¬W›a(Ì?³Uç¼O×œ#®’µ$–ñQ¾OnmÀ„ŒLU$Ìï6V+Þ%]é‹_–ïŸ@u¸G…7N’ë¢Å2Ò’]<è"îqFÊ÷QYW]ÚGý|;gº9E1”ñÃò )Z¼Tì‹S~/äð`²›cZ2’íJ&5¸çŠ$5Þµ(TÄL‰(àÛ¸Épúê1"³pð:R—è¸ìâ+«)*‰è¸äüg¢ò'оϒ¥}¾Øw;ˆÌ,ÄäA‚e(™˜¬#  )¿Ò˜Ô2kmcÿ‰@CpIzO¡Ô†Ù,1m£<›îXÕE]ùƒ[骎ٴ¼’¥‹3XÀ‹_H¿!Ã"—(ê]Qå‹þ­$óZ6[™$³Ù€ʚTª0ž›`é¬8®tÝ­b¯h-çZº(.[¹M*•" /ŠÏ>š?ÄH?[¹q t~Ö¢„Ô°{AQGijµ³Vê®FVx…jw0W–#¼Kíl™
+:^À%K^†£ÕÒßw$?”ÜÉG칕Îe^ËGî‰ +–\Ԃ$Xî¼t-áyö‰‘­Ñ +QfÖ—ÿŽDã„V¹¤Tü.‰.#ù¤ª”z¸£ÊNuË«—½lÇw´K¼C$¸ÒÁÂÑ®º¯™ « Ç˵¥tta…3‘±{»ð Â.,UCJú{c†.]š-%£öD—KŒæW_*,ºh{+s*`oåä&Çg­ê‡²׆»4-¯ä·~Rfûxðy´xM[ùao~菢 KÇ°)øáù|)BˆwûvTàã혻ô¦^_t\ÙFUÏÕê€AÓPe¢8¿j>j8ÁëŽ`õ]¡·Xƒª„ªșšI‚£}û¦þ¸„ãÃT(9x½
+EÄÝwU¡\Æ U¡êÕDÉçÖ¡ºîÔjú^™‰gkžùqUô×i;Šaøn™C2ÃT)*óC<˜wËü`‘\ó×M>»ïaýÚ=Ž|Õµ{^ +Qˆ:Ç#2?н€™ΗP“Z¸õbæÇú–nº­‡Z¶ÕÝ2?|D$‰Û¯0éF½änÞ«oÌü äêQ™­›N²ì[ +–ùÄ÷c¼'—ÜàÊ©•¾²,5-µ(N¢×,6Œ„ƒi&ûÁ-ó•8U{=æSÇi!F¹<¬RK³†*p!8*Š_
+Á\aÝúÄðD‡Ö +_…Qòü¾'ãò[Nõ¤°œšíI%:+o7æs-ŒÅé?ÊkS“Õêè“H8!î€l€*ñ©«-…±èí £]Æ'–!#Ð\ҁ“4%MRl¨Á•ç]u,:1-D£6”i¤5×|¥yŸbª
+3çø=Ú¦\©ÑÆVå4Z1)ÇØ[\¢”XЊ% •T©-Uª;<çÖôTÓê¸ÅšÉw©I¸´¢‘Ñ(MÈ5œú¦(ñXze¬¦ÕjPÿ•k-M¸’h-ú`I‡ ns1m0ýÇ’à²IRÛz‰ËÎ
+ySb¢è°ÂM\Ý?ï‡Qj-‘4æTáÚ8óçOKÞìŸÞXÅ"’ïÓ>I„%]ÀY’ˆÈSÿ“`O>j4i^¨.7õŠâœSvë²C'“ ÒühᱦŸZ=D=?핛rŠûÀ`Å¡Þ»{¿ +{å;·žÝí~Ùf;å£(ýû@#š
+Îífzb³÷ídïÊúvËó™À )ÿÝrrzÈ4+öàd=7Ø{¿k¹kžºŸõýéSÍ=´.¶Ÿ=7ә‘H½¡j!7SHO›Éê²lÈ͔O¾¿Hn¦ ®ž47sÖà×YnftJ)&ù«ÜÌà´ÿM¹™îªÙšçk6Á4T=in&³ßnÈÍ$šýM¹™ÎI_=*7“„p»ß´Äý)7³µ«¦üWn¦>wÌÍ„r17ÓiB5IÂÔcÿšÜL·™¶¢ ‘Ý}üà„‡Ù ‹ /£ªX¨ +ƒòç½@³[\Ð
+*R݌&¼ÓńNJŸ)á…{+Ք“„!ñ2ŒNó¿ðBŠäфYJ äq8 H O”ð2dVÇæC§ggò¡8!c¨L̈h±©lçë¢gEŠ(«œê)Þ{e…»ãRŒ ¾²$¯š³±…h¯×¯RuV˜Õ¯Ru¯ 4Ág(Uw-sË3C»+"î÷­=¶C_«ð*qWˆ"øÐ/rôÕÖ£Ÿ—3Ê +ØZ†Ý$0©Â뤠~4±Ø‘¢á$©Ù¨ù-g?« ¤Ñëø‹wznlUœO ³&&èO
+³¶ÙõOf݆³7iüIîþD±f…ÓIšêsîþ£|&Šîö»?éÒ98RcŸªn¿ûÓq7Åtœ ©¾âîO¾_}÷'1—U wv¶ƒîþt÷@\ºâÚÀÜ"NUØp÷§3¢Ò»?u¸ºþîOW4 Z¸ûs°Í-•A"Iñ×TFZ0<æîO£Dïþt¡GÕõwÊiúÜ»?™Û™ÍÚݟW^ù¾áîORú斻?;;}·ßýÙÆtZ´ø*q¦~]fLªåOžØÔFT_Å!’nêUÂ*J¯â1ÈV¯âÁÝ_¶8„ Rx‡P ò*ñäÅ!®Ä +-qý20êËÀ|Êg˜Û‰ÖãÐßųk=WŸæÙeén,F­±ˆjѳëÊ?^ ;Bæ 'ž]A[—<»î@ª-L£OßàÙ%e½k’2RQ™¸O™óÕ\~¶ŠÁWfÞÊÕ¢UÏ®µ#òV³yvWQæƒ=»¾Wܳ‹¢ ¸c×Y©c×%âU<Rr¯©óv"»ú¶;ÈÚoi‡‹(Ú¶…ÒÃp…þî›ÐM=óEmÛ%c ¯ —í·ý.¿ðíc¯ —Çg¸|óÛÇ^.¯ ÃUž;ÃeÃíc2\.û6.m
+—>—/÷Ti ©å'Ց/Ò@Úò£ìðVM‘Ü¿ßA²ß´×A(ŒŠ ê#®}4èH $GQ¡cLÍÙë³]4¯š\eBâõ>VpªW%§¢øXð ÕGÑxÄ¢…bC2Á*xîy÷"7¿ÌÖ·œ¸|쯔Šëæ,ƒáí֌ Þ—lˆ#/f ­!œF_֒‡®È"Ýg –ô¼§ +´‹oí4ÿC÷Ênye·|uv ±–-pÉúáìo}e·À ¿qvËÄØÞº81·ñm‚N}2› ¶KÎÌ«m‚B]· 2b}½MPðôE› K´®Éµ„Z[¼£MP"ö?hÖ¼nl˜UŽ×¬~€Mm¤z]|½ªÞè~› “³­53|¹MPdH±_Yµü6AÏb¾Mp½`«km‚$øa6AAØÞ÷rÏZÓ¯ª7êõ½ªïX—j„XßT¨ÆD•ŠÑS'˜’\»ûë]Ïg ȩºžsÃ$ºžÕèzVM=µë9ç·æÐÓpG‹ÊuìÉ02tæµ¢ÚçGªMÕþ°Ái@±†Dm³2½ó<PªM]m³B½§5D, /cÞµsÖ0€~aQ-<«[‹j}Õ-òß°¨ÖëùOŽ]í»”²KØAg_ÔÄÁ +…;¬æ.D{ۀdŸ“\qeˆêD[pî8Yýîh[”¤fðï
+îÜBŒÔÙ/gŸ;›U’í<¼ìõ£ì3"ê¬Ñ`*Ýñ`2ûêÚÜ!dÏLGôNg1³ýM®ÛÓh\sBõ®'‡·q:"9~ô„xøbs°ÀT-Z“¶·™‚aULK^ÔÑ[DgvJî#×â;u*W²ïrRE*Ì6-·+E‘g€)"T†‹V']I’ÂMÉf ryëJƒ¦g‚_¢cqª¶ÙËÈûM(­å.Eª£MF¬‚
+Šøwö aVéì¸ÁŠëÒ
+¹¥©ÒÙq¥œÃ`md6+,DÔ«­ ¹!ëãع]DÔkõˆß·ÒyœåH¶Ö6A–w«bR0ÅÃú…P.hµZȀrÎÆûg@+ó+ê<”ÏD‘w,Ízao6îÖ®Îñ½¹¬ä-9´Ü®£zŸÛ…Kz)¦¼®÷ùÈυ„ÌÛÚÆ÷;?k{Æä÷*¾ˆˆÁj—(¸± ²ób‰Ð/¤Dõ ä7vò|!ÑEJ>¬½pç"IÀFòNŠä….’ÄϓHMç\@C÷\ç×½ó¦f&⪃ý6Ìv¼§S™;Ë͈£l™hZ˜Fìòî-U«™‚}^ªë#ìÖUéK>Ð詔ó1ÇtŸ;NYÿ~š¸ƒÏÈEúUânÎEzżâ숟<îàKs‘<‹yÅ„WÜýú¯wÛΤXBôåm¹HžV¯e'Õ÷MEj›Å¶œóÐDˆÚ6Δœ;DÅnèT¤HZ
+¬¢ê¤£Ø¬Qu*’ã–õÕ©H4ï螩H°‘ûPqÿ¢m±ç>pc‘—_fêן·âër—Ís–ߺƒzvˆ>êK*̍sžÂšøµƒT$t+ÎÜYOöµškuc­ˆ–Lp`&9éʵ(¨+û˾¤Ÿ°U­U±uޒ jNòZüéu¯ÈËž
+]±ÁÁerÃ{m®‡ïÝ£2óîßo¬øµ¢68¸Ã3‘:‚$/ž kºŸ»÷Ž@£ƒ‘¦²£ë]ǓÐ:©TLîî4B÷ºGˆÉ3 +k +˜é+
+Õ©óÉyúHÅk¶/*“£âª«SåI}-ª÷ïjöפh¿Uäeš`§“,ûF7ÔÄÃÞò!в½oÀ“œÚÈ]Šˆ~àn±Ð¸+ ¸Ü=õ««¼Y©$9lßéªoJ'Y9Ïõ‡ê#ç«¢)…Ù•«‰G·&uµõë¸JÂÓ9fIuߚ(ZÄ-?Ø5QŸ1ƒŒýïòæög¨¶ä)œ—ø²½ !ð_8Þø.¿åTwpª_黿xú./aÈÌ{"TA³ôÝK–-ðJßÕÓþJß + s Ìm¸tÂJ^P.¥U,*™´
+É,ÿ—ɪHÍ=£L˜}¹C?Ϻ¡4ã˪ûôr‡ê…}¹CÕx¹CÝ£/whýr‡†ŸÂšÚ¦Ð^¸—îe€û) pm N×[K6:ìwè…*:¤Ÿ°ýŽÝüGü {I\¶­8ˆø,®CÈ”¬)Œ8*zïÁÎ؀jŒøސ+A¸ÂƒÊ'¦ÙÅ O™†B,
+®òÜ3IÃüsm®K3­0)¼&3·ZHÕ·×Óp“}Ué˘s;i.áVÃÀìeÔBríS%Ò¢{¸cQ%;ç5"D^6Õ§`³C6ʈÐ}ßâÖcÛ+·I:£ +·»MD]):’ – °¶2“´E+J§Ú_r›(4/äÑAcþk]g•Ø=v
+4G©²X(˜‹víLŸ(œˆD {E\NýÄb¢ÚÜ„VÎæ§f‚Ý)\“KR•¡É%’éeD+3r8ˆ†£Ü=ä*“[0,vˆœÜ Ê*Yfl<F¢÷žO;Ѥ—*ÙØBoÉÕ1{…EÚjo‰¯—ҍAÄÞà2ÚÀ²ºE¦\fç–4âG¥j^]¢‡¤jºb<•Î³/©š«•wðZè;•Ù)_Y­ž#&thõœ{gòm/•Óö¸!.òž½ëŽL*¾âb7ÌÙøà²ð.§“Ä•ü}÷ÿFç«Ô
+endstream
+endobj
+30 0 obj
+<<
+/Filter /FlateDecode
+/Length 9790
+>>
+stream
+xœí=Ë®ë8r{…ÖÐ!)’¢€Æî½3`€,&i`AV +tÏ™M~?òC¬§héXö±OëÝð)I|ë]Eãö>Ûá_c÷.~  Ó#ÈÚÔûó/»oÏ¿š_wÆï}ÁáÜÌ v„eËa¥»áóò  çƯ€.ƒ% +–ÝÞù”lj¦Ë Û}›Æo˼hl®&”•°û>1Øq%Ê0Ы~o3oÒïc’ØÀ†9À¼X>€áy#0¬94 ;[z×wV¡À8Ýò«ü8~[BÝø#m„LœÖ»<½´P¶ª ì'ý2èe¼´}¨7—Ø”–-Ú»ßw½Ëò¿¡]’ËîÅöÀØyi‚òªã¯âÝÉh’mQçéê>`-ß"|)à…Â/X7ÚbœVé·Ýßvÿ;œ1¾„h».?Bòû¶þ…ÆÙÔïãð³Kͯï;ôQœ€Ç=ìlì›þ÷N6‰¾ä= `Ár j“E+ [ۂ€ÆǏ>A½(5ž™ @§op\ €L‚ì01ÊãWûñkç¦GƒIA¼së“X„lå8öt‡Ó%¹
+Fùú°3x”
+´´Ppä°7þð1ç3n:7ü?Š›…ø•œæ•]Â$¬±D4øÒ¢Õ°|ˆ‰]€
+™ÇäÈ|9@61è2n\"ߖé`P²¬ß‚¯§oma*ý8µÌÉðŲ§é
+’…©SÎ]Okì$dDŽZp µTæHh¢M [( àÚ&ÑIÇ  ¦kÀùÓ8@`LiDGà_ ác²âÅÞ3–g _`!eÌt™f4ÀT7ʯ¶ÉÑ`2®Nƒé
+Årã`b _¨˜q€Ã R]à ȁvü[LÒ—<ƒ*Ï #@$f*¶t2þRœÁˆÛNÀ‘ËO“!ÊP vC\ˆð玟y+…gÜ U +ÑÒ¾P¤ŽsSª&ôžAµË'€$tB°X:ñœt,–14[ñbûý)¡~…¦¥èd0_KÛñ9­DNܯ"lcQ›Ëü„kÜd?Ên7Ö\“Õpú.ìãQô<qú|‹û §Ç+gåÊ9¾¯˜go*¶µO bc¡c%S½k*¶å+£ªØ™nT±¹ÿ„*vR–}S±íÄZ"â–÷þ¨cÛ3q;6ú7¾y:½4šÊ¤¨{º…
+~Müö¤aÀa§×@s4XøÒ q%ˆŽÐBL +¡,LjP40 +á Au\QAh­Ññ‡Åê?"*d¡7Z)êJʄ…TÉ5†…Ž„‡]…ÐT~ÐQ”Ɲ¸<ìúÑrЯaÔÊVN,qž¨.µØ&F¯Å~J ѱ'N¢uÎj•ÃCè*²ˆHÑg0ã¹´†.Íbdt˔QÌZDšè¹ƒÅ 6³õ…cØ,aÁ*½cås(h®ÉDÞ²Õ8K-×ðZò +†E¯ô^:Ph*»…‚ˆ§dñ”`ö@[z/a[A ÁA¯*ÖQ£#’QPNÓdb6áÚ-h²u.ä†Á„°Y Ü`BK‡%O
+²Ø +,  Ã¿à£NŒ¿Ðì°dÛr}!o`m;QÌEDI&[Ó TÖKŸ×\WÖ²[ª&tüE¬ E•K3’Ä(dX{ʅ!Mª É:ƒ"•Ë®a}TÓÑa6€´¬†xÎPÈÚôŠ!ƒ|Ô'Ù'4c#„tZÐ¥@§íùžÓÞá(ª§Áj֐ƒ“•¯v¥w×;Ü»&ÅÇ$aBC sÇBþÂãfMfì¹½†,bËÇAñ³|¾P
+êíy©âš®½® ˜ƒZ#»$aA[LÅNBžnÇ¢ ܾÀx26r
+4+ŽÀxbG½r
+0SÂ*vLj.\5„¿xís¼KÀ¦uhi–AaY?À––2ßÂv@KšÞxÍÞ-6”M\±üزÅŠpMr(¯0`E½Â¡ÖtŠöþÜmwû©Æ¨ì6lqAÂÃN.ØÑù…ʇIa € +D¨†}=Y~^pá@<^q4Žn´T4sbE/:.“+hÙ¨Îó)š§P…Ó«½X´éí?"@} CߟQü¤Öú‘¸¿ï¢<AìAA–k
+=(¨hÅyxG@çüy¦ÃÈ».Ÿ—ÒWùþýOÍ?fâ{´gÜtíq¤)iû>ÝÌŬº£öC +åb€"cÃޔ\"ó•lqˆ6 m¿Í"-rȄÔO:û‰-´bÍÅÑÂ>|%ú¤e ½t¯¨RؗŠ†^Xvf_b(°XÉ»¬ÌG8èràW쏊ÿD±]’H%
+¬eÓ œ8vGNƒ
+E¨«áøÔ Îç÷V-K¤…pL‘õdŋB Ò°°GČ܄„Õ@/EæS|ÀXÜWb¬Øe+¢Ì, Èì5db,Ë-”YÂÁÐá½|a¤ƒ‰LUÕÝùIììBïHtq¢›]¿Šwd¶ë×qs§êúí¸àI-HŠå–( +žKÍ'Ôz Àâ筂`óp˜Õȱ5×/HÞ×\¿"êÒ(¤ç¼Œ"*rÂõ”Î'\¿VùÈ*ó&:¬¹¦VtÍõ8mšrýÔã®\饹æúõìxc­)Â@;Å +7?bƒ˜2>âúÍü=nÜõ¬[ j9‚—GÝ󛸥f€s Pa÷ÑLI7жpj×u ®‡D‰K>Šf"¸Zø]§üFs"©•0ê†ÆßÝ/¸ìå`zÉ[ñ‹ÕxëŒA8¶°™ìɃ«£ëN‹éî•0¨`fD%Ô#¶¨„»G%8©™=STÂdÿG¢®Ç)¬•½#'n r¼,â–G¸åJ3Çä8!ê>0ȑ ~W Ž0s…Â! e\J³Kié L +ât×®‘Æõ$ÉӞ;5 üc— šÐ?ljX%[ìjjX„ +«ÂM¹zjø¿›;‰Süe ³¥†YªN?>5lAðœ0¼˜WM +y` RÃ:N2õh Íc¿+§†%Ë@ÍcRÃZ…kE×{`jXôùÔ«÷+ÚФö¤¹Tˆò*Ì\Òàk¤\K¾EñRÞEoqÍ[ +—¶dô>Ÿ CKsj{Q kڛÚvßRZ>Jl]‰L{½dþË(ñLIÂ%R—*ž.ÄaúÐR= ˆÜ¶@„Ê›@nÒ8s ¯‰äŒX¤®˜Äª +ÝöHˆ¹,¨ˆMD™ù:ÀT‚$5^j°•CчAkŠbD”%‰È\$ë¹F­À’
+[3HáRBí"lE}qšK5Ùʂÿ(Ìçô­ð\*>岕«*½BŒ.E1¤ ±$‘ s•%a“í¥M”ý[¬ç
+'lDB,ciÄfÖlTTw4ÀŽv\šÄQ'šôŒäv‘¸ „Alð@:~L°ªféI} —y®2á~´j7ÁóU+0(®±½K%‘àWôæe›È*Sœ¹‚7Ÿ˜U&¬¥Í£²Ê4—œ¹KV™&ŽgC‚¾PVÌþ®Ye°oo§@9M Ö´Ýæ+f•aŸ òfFV™Ï’U¦‰ÌæS³Ê„6g^'«,ˆ +º1«LÉ/kî•UvS>Í]²Ê¬Y#«L€Í e•Å0°ënÐãíÓTpbnLS²²ß‰˜&xõÓcš„œfž5¦)ÚÇKèJ0KâÄ­yºº#ç Ýq|5w©û Ð}ZBÿܺ­¦Jè '!'b Ýk2²^÷¡K¦Jè
+A3‹ê>Ôbh^RBI#Fw{š›ë>€à»½ îCbÈãê>ÌΪ}T݇º7Jså|Ž„.¬ËÓzí Õ}vjóë>À؞IB~Œ-]UB¿¬)•Ðýø‰ã<Lá SR¶à@ŠðÜüºS8–“ xŸµð­§Vb51,R<»l²Œ‰@¡1ly +a/@Îb„@|B‘‹xŠ<…呬.t/w¤€4û«ª¹(
+‰-oé14Ÿ£{Ü»Êã4È|0Ÿ¢å\©Ùò)ÖɧPRI’O!Ã!¬¥¬Á½v:E²(x+ 1oÍp
+ʧݨÑ1 —Q‚(ÜátìX)Zvà°iÐbJØô-7j€¶™,ë÷jØtÇÕ¹©°i‘§ª†Mƒ,ýé„®†MƒTŠÃ¦—ÎUPËÕۆ¦Ô¬r£†ˆlUÌ^D¬\éFN~Û+&,0®r£†R^ƒJØ´ø¡ÄHƒØV@–KÍü°i§ˆ‹J6‡#;þ¶jväüfÚÞ<¾0Ó ÅE•Õ®ÔX'tþÅMëAjJÜôx¼QÜ´ž1×qsÀ‚+5Béd•+5@V‚ÔpÜôǃÔ‡®¤¦I³Š ËÏ<ýÍ̺R£îK^-n:%¤<«—ñ¶³Xý¿<k«×2¤æ²zjn½<keV¯¸³ô ©/ÂêëŽÊêggH)¬~í )•Õg+@z†Ôê¬~AŠÔX=°õ•X}˃¬^O‘z"V¯¤HÍfõ¹=묾î”ZÕwíi‹üVB +C·j[ 5|ZôÂw(¡v[a‰Ìßk~}áj·^ž»tžT÷ÉÎÌ Ha«;3;ù­ðZYwfz.(¿ª3‡h• Ïvf´HJv•æÌT"ËþÎ̌S>÷Ê:-F§ۜ™Û•urƒ7óúª7óz]ÿ˜ãÈ×X]ÿœÐµ¸¸®?y€Ê÷Ó¦žº®o×¼ò÷¥e^5¼Miá“zI¥eö•¿7(-’ülJ ëök+-};ú[¾D˜Åæ{Ù|/LßK½¾Ææ{±›ïå«û^îV èKø^’=ã¿_Õ>™È-r¹
+-GU¯«kp̖n‰µË(YÇF‰ç7ŠYì,vÅ$_ÍüUƒ“+‘ +_(¬­0MD„HÙ/-#ìhˆdãhe‚ԍrïeÃÒé@®§Ó +ä¦t:E]§ÑàãH˜Ì¾ž²Å8ûNsja ‚!jëÚ°Œ^Ç%@Ô$Îë$ÕÞ´ìEØM/$ìè9x™e™ åþYªõêwÙBŸ î•5/ŒrYlC2H1~Šð Î*UKÄ(÷ܜìÙä—QÉÅV4Âò%Á +E#±Q ¼ÍD"ýœ:Lž›vÝzŽãÔ[ñK0W–R!bځÑЊœ–˜§/‘lFƼïäLî¥äÓh¹+ÔZ‘¼¬H¸Cê;½oPbÒÌ#—r0s
+H1ʜ6*ÌM¹š|[Èt‚ü{-×ïš™¨èOEÊLÔÐB+-×TÑy'º™,6 R ¶öš ©s×ÀX3)à}‡)¼rqäK1¥+WŽ­¶SlÊÝ#Š±U±ª0[‹çߢk1ÅjÅ™ ,§8M;̅oJ +í¾¦`(ڄâèö #^Œzà ¬ó":äPä-Ÿmæš%TŒê6?µ„™æܶ~ò3£¤…ê‘V}׺CZw^Ð©k^°›Ú)-(©øJÒÎ× ÔM-
+ƒ˜Ù9·ªOúIrnyë +)ø^–Pz®”s›\GäøOrl<ɵ;OïØ™í\»3Û±! rl€Å`ÇÆÊ×îÜâØøâ×îÌslhª'VRÇ_‹ü¾«_CȟwñkóՂkwfû5”kwVök€‚ÕŽy×î¬ï×Q…W4‘çñkø’õR~ + / {Mø5f’¼›_#qˆÁå#‰_c\½ýc“Ÿã×(jô8Œ)¿Fà„mókŒ°/á×PJ¾–_£Å¥ö¶Ì»-ˆUˆt[æ¦%wb•ûŸ0ˆ5qt¸S«X‹Å´-žfçükÚzþ`A¬›­g³õÜZ@䶞G±¾²­ç11¬_ÚÖóDõC^ÄÖJj¡³Û·±ïs\5:«êB·’q`üŠ¬Š¿Pê®Cœ-YÅø[˜¬¤,ϕ+ÛºL¤5&sÁ ¨ÒG¢F¹º$ˆˆÎ+Œ&Êj£åÎ^|+0X˜4~2$Á]Árn’’}“zógÉHøžakÙÌQ_`Xœæ0âaYÛw$èDÈ«êÎáîÑò$+^IRÌôuK»(ÉhÔ£’r±Œ!äÆÒcÙûq¥áëÅg‹h.¬Y¯¡Á˜Šº•˜nI拡e³]b˧lïbzÙ#/øfõÙ¬>B¸Û¬>›Õ‡ÐºG¥.ßlõ‰þ´¹Þo×;*’Õ®wT"õ?ëzG[š{öHýK9’­¤ñ–V¿¥Õ7[I㗰HZ>fK«·–˜tÆ¿kZýýM’[Ick×0I&€=&)¯cFOʋ‚ùß=)‡
+]ЃÀ΄µ×{%åuœ¸5wIÊ”Qˆ%cOÊë +eõ¤¼Q,CIy ©õãÌý’òÀŠtǤ¼Ö³i`¶ü
+®¤(ã+$å%µžâV~˜A·òÃ[ùáýÎî»A¹ïÜ«Ü`œù*n7ß|권}ê:t9è Tä*Ô2·V( +a·Ä ·–ç
+æÖWÁCZl^rk%žpkÅ$;Ÿpk yÔ(Áú +‰á¿æ֚]‘· À5·–Tó8¡žíÖr̄3U‘W$zvªâ¸=íÖºKE^a ª²BêÖÆ!Õ­¥ñhn«I·ÀÖ«È;0šóð»íâãÕ/>ÐãâㇸD¼©bïm¶Š¼BÚ«¹n¹øø×AP¿]Ýu I sh&»›\"¿²ùByÁä¶Üu°rE^!º¼¸ë gp<_4³(-wK43Ðï¹^O£™#ó‚hæ‘Á¯Í<6‡¢™!nÎ+ ð~Ñ̞¿E¨z=š9”oŸ;šyу£™mfÝ6‰f¶Štv[4sæ/>U4³ØÞ¥ô²¿Oğjl]ñ'Å‚M²Ö· ŠËêœ@>‚äª/D‘(¡_ÅñqÅþj¥ês«±5rʪÚP±Š™¹:φz³›BÄ8*¡‹×NȚsÉÉAӛ% +)ÿˆpL,X9…@IË–ó„ՌɈ½>ü(r‚<U|/³ã„ïˑÅVUäS5 c)ÁD?ÆU@”B# óh@œÃ„D=!®t.ñR@L Ü& ú¼B •¼E&·ä˜]À`lfx"gmÉ +‚À„äOÆÒçaªfê¤` içÀe'·³ø~Ó­¶Á*"úVÛ`«m`íVÛ༠~z$±–˜¥£ñ×VÛ`«m`îH¬ï=¡5°³ªb´U՟µfÎïÝ ËtíšÔ%µ?#HÛD0#|*ß §"1æ¡èüjæ¯¬Í ò$1IµƉ¨,¶Ã ‚¥ô[CaAEHàFæ¬Ø°Bˆ–Û‚ +&T,
+„d6ƒ&ý & žKr +ÎN7J•H£—ˆŒXi˜{‚ ¶_ŸÔïŒh¦`€ìÅ谙Í9¢™n75øB´ó™½˜}Dƒ{ø„ g” ƒUf? +–†;Îç –³^4,\^í¼ü•á×(£¤Ýg`§Á^/䍏Ú>;םZóýš¶Ïá{°Ò * öû‰:® +©‹M8ÎË_ASÒñ­;*ùªÅØ È(e`m¦X|Hˆ“U2£ÔV0ŠÎI(¢×>Ç»„/ŸÔ È&D 0QR™ÀFy8äB]#_”^¦\Jҍ¢y¢™}û$Ð ÞàÐÌ;Ti^pª½C§úë²êõYæ²¾B}–ÄÁææ@Ö;Ôg™ÈzC}–²Êú, Y…®6_U{Æ@Vªô¸ú,·²vžÞ7ýꁬ[ +Œk`聬Ï]c d d}î
+d]`ºÞYO¿>/õ–[ k•Õ·8©o3NhjV
+bY¤,k¶°¬a;Rf \Q9Œô¶R…OdÞ +ôj9Õ¼B”0õº´ANF©sf”,NŠ! ó"¤ÉèÁOfæ%TF»2˜]€˜ ¦ Qý`ÚÎV³3cXôJ率…¦²ûQPt<%‹§$.S2JäQ2©©Í9(Ñ-6$PNc=FtšÉZ&uaGrÃû®Á² +²ºb…#suÆ(áÞD–¹bßÅÛjqÕ໘@£n9ƒ$®
+¤WÁÚ*1Fð¸ýO³ŸÕ¯) ¸w¡…è0ýš²Ž¿ˆù˜à,Ôö¦Ç^ 2¬=mXd–²ºÂŒ&¼)XÚ¹ìÚ;†*ö*b<|Ó(n;Å¢„!fœöbqŸÐŒÊZøjÆi Aý<Yùj'z'n8Ý|“„ ÓÄÅBý…ǁLãxÆB°3Jí .# d:œ­B¢dü;k‚øqƒóÂ؆Á9 UڍÇG¹«.9umÞûv³NÊ¥ïÃE”ö ÈhÖzP$@+®A|G@çüy‡‘ +­å¶T>z@ñßÿÔüc®˜ì¾F—óŠVè}µpæ†fí ‚ˆ‰B)ØFätn­: íLZáåÅðT¶åÒ°f(ãócºF¶0!@cèš~×ô{ÍýQ~qY¯Ñƒ„&Û|bÄ>“~P$`a{nYÁï¡Ô“37ð¸"']ó{X£€×O›/VÀÄXÕb…_U’ÌtLJˆÊTZ⪙ªàPø5¿‚‡Q,8”E°hƒ¡pHB—ÒìRZځŸ¥³#Ç¿£ŸÅK|žWk\ÍȌ»(ÕAt]HuªÄ²Å}¢iq8X®àÎÙU€%tç°Ãҟ—¥/{N¦1*AÒ®çÆ"‚J-ñ6J“$H—èðEÝJdô,X\ˆJ
+ Ø*œ/r‚ÃìÈ
+‡ª–Âí~aÓ²8ÄÄS¡¾8mZn>RAIš1u;²çj3Á‘¹vdÍË¡†@—ãÜjú#։]Qkžcæۑd¤y݅ž@^·ðˆHMÅñŽÅ…‘‘A¢º£(‰l“…TÕ}^ÈÛ&,T˜©DDç@-äADµb«•Â‚&«xID¨sVð×*¦õ#«iœ1u^ÄÁb$‘Ÿå>HÜòò|î€.wô®îq9̳ºDa¥îQ偨*™Ð9îQ×xÊ} ”O6J½W£#’©ë{/é>ašKa÷¦˜.pD¡i<Î}03~yú-lÛ=Üu5±ºI”~N÷AହÙ}‚lèF÷6AÔà/ì>€±ÝÝ}°D
+ʧö|xä}vZå>;š’ZæT&oæßg;ÿ>;裗ƒÁ¥)„ „ç6]E›‰_\B5OŸ]—†!v}Ÿíš¸¹$ϲ,‡n2#á"|
+“Ø× â‚eQÏ·ûLf¢"Êf!ÊbYTM€ JGP¢ ‰ +F`1̊†ˆð¤i†Èš°2cïØ c”;®JÄÔþÙ;F©ñÿ¾3J£ÔjÐ֕+@šh/–››Þ4aOªB
+ק²–¤|¡[ߌ’‡g%Üï„WEüü ҁŽÒq+N.ÂÕp%ޙ¨|ÚÕÄ!ï»Üz…NV]%‘ßÙÙæ—îþågß´¾Û§£‡»m~ùmç‚ë卥ŠW›³wû¶Ï¡ÍÍ/ï»ÿüÉÚнD:þ™ßüÓÛðÛ¾u6|Т?ãú+Úڏ7ç'?ú2½í›cñSGFÆF‘Þœ…?‡“ŽÄ¤a»Ž~LFéù°HcŽ<í,4ŸQuÐéy™O‰~ËÖ}ØWÙú-[ÊαùÒ +¦kÇF[ú-_iÒ_÷aaùJºé…fk~~3þtÃÇÙÈ{ëþ«ù寻¿üò„DZ÷Ãéh‡%Ïn<ŽmâOë¸Ü/a__«øÖѓl:‚ºd$.?]o~ÐÙÖr<ø³8qd$Ñ[tjÈ,ØñlqSlN‚v9FaÈ!úñæI7Ó§þÊÙ¦r
+"è+ޕ+G™MޒóFÉkä•mw‘g¨Á¦ÇéGôþLH¯Ø۶ƫª{À‘èÏÕRh/ÙÀŸ1*°-QÙM£ §ãìX ²Îp¡‚8||O§ý=‘¶†9 +ç§ý;}ê„üßÔ%G©«2ñz¬‰'u#Õi–ýþF1„´Ìö¢§§öŠE ë­Ä§&ïݺ^µqü ¸«í
+çRÎgªOvˆª8ÑÕ$6ŽÚl_CŸ0¢ÙMn«¯`ž0[v!cáu–ì°FŒªÕ-AœªÄ-6_Š ÓR#=;ìd…:Õ¯á“¥kk›[×!$‡¬jWŅuéá ˆÅɶLK½ÂÍ߈"?ð¦_Õк
+F,Í9Ùጟa Ç̚ÞÄ0Ü4} -w•ö¯ü*¡ž~×wo~’|²åÉ\<©Í«b’›^MÿímZcbrŽÔ=*²_±§5 ÅuûÆôÂÖєÑ1·Pr›ÖèžÜj¾éÈìÜ4¦0Z[7W]³ ­Ž4MUÚeè[c-õef,Ó¾ž¼|4š´“óãŒÈ×¥›ù$WîvÅÎ#)—ÇÜ즗ªb“„QJzæï {ÆO†à›+aUS°§IË:Ó²²ë÷¶íû.Ì7貘Ó]„â%0ü]ká}צ :;`(nCïn‰·/TF8-HîBt'ÿro]\>ôÇÅÿ؂ÄÐòþ®ß'Z@3wî”]×'²Òú»
+ŸjS§µ¡¿«ð÷©Fì};Š¦¨m]tmÊ@c.nïa¿ÈF›ëÛ8|ÓuJ»ãÅf?µ‘Ç$ËStÁÀ¼DÀ²DÀß5ðûD µ‘¿]K8ý÷¤ÿ¿ÿýÏ®ÐÕæßα¶Íÿít|ßWRNü°ûûÃےûQÙx'ð¡¿K0Í
+ýÅ0^òOûCðUûƒyô!îû¡‹Ü²ùõö.ó£ý¡ù­ÚÌà +K9F“¼OL|Õ ²ՙßÞ¡Îé‰øíýãsÆþ0†bøšŠÚ%ƒû[cP»tõ¬ºØ Av?XyŠCÃaÀà臹û1W…9êSy§çsÍ9N4üNèª=ê +W5Ž)×íQ?â”x¯yôõv)ñ^µ?µ]² w#mm«“¶¡¿ËÍëîf˜pqa†ôG…‹õúSÛ¥ûw§ùH·&]àës{ĝЙ_µÇaŽ—kHž ¨»ì!îïášýnˆW”°5Wt¢á÷)t:÷xé³u]›uÈÔ£A§sBý+?ˆÄ]s€´­/†?Œ·ü1uoÝøÁÙ„,Cíwlò¹bGÿFLìaÛ¾¥D:éq/?X/ØpÕÆ·S|nקž¹–>¶²4XæZòyX¸-܀ླý ’•­8Å>{䧙ƒÂmûaä!ŸÒQ°˜‹Ä øý´Ñ·!<×<n¿ÔБËh;jœoû·LP GqÚ ^õˆ0óz®ØŒ™·„{øB8Øï4nTùa[û·º/hºǬô®¯¼üݽUˆ•0YD£*ê#¤q/.‘w±õ„ísaë ‚Ù¶gé:æ%p= §ð
+`â¬ÎœD7š•)¤àÅ£ž>Èç钞ÑÍ kt +w%eHV)­£Á ÃßØ7öèǝ¾3.j鎫ÝÙR¿íáãxˆ¶V¾Ê<l1ï9ÃO]í{{üñÿÐåÞ/!÷æ|45ED,=:¤G)ýýJ¨Z%ð…Ç$° (qÉbHâ«Hôûµ ')\ÕS—¸ÌÉÆM¤6ön=šµ'#¢õ*¨Ï«­tyP­ÂÅ4|{=«÷m¿w}ï]9ñÕÀ3!Øz†~º¢1±æòQJžz×¥Šfà(*»–©‡ö„ã^'™ósíEÌ}¬í‹ ›§2|@ËxÚO$ÀÝM§úd\8šIE‰Å¸ùô¥O©¿‹C`Xì~pŸÜo3Œ™c½¦ Îh—>Kê}Ü4¡MÚ4¡'ӄRŸG*ÖÚ|t]‰Ž†ûø¬2–ïÚaÔÝÈT&4¡c´«„T¦P—ÚÚzš΄ÌW’Òx:ãôøÎI›<£º’2-Œÿ¤@ƒ}KógTÉ9a
+#Ojf8ª.7©–*IUJžþÒU2gªGºjâA– ϯñ´6¹ÈNDµÛ¹oÕl8?wՄú¥*rí<TÓf«þ«óqYŽÕ¢,LWMÉ}R@(þ­^å@ ½cLåI¦sü8´ ˆmžf-ר’ã_=À<•‡hÞ™Œ#–:‘/ěÅ·§ÅáK±À£ÅWÄOÃáEA<­k£ã#géx?s ¢T[WGR +½˜7û{µÛ¿Å1NPêÇkxÆcêò¤nL+R-×^ÆuŸnÝ}~£—¦¬<±Ñ‹Œü•¸?ùÑüE†F´Ô +?¸ÿà1†ÆXbíbhÄ]wvŒB~x×ُÉE7¯ö%8~3¯~Î 7óêf^­š´>¦Äi7uïÆIòìs<¥sßgWõŽcIðý)¿ao}ˆVšWÖ%üQCwÕ“G-eZ%Hß®T„e.ÔÄ:‘{T÷'½ð¢Ø=×¢ S£j…IÓÛd¸¶ ¶Ÿ¶+J”¯*QŽ‰nRyñÏ- +"ðXáÄ†%‹WMÕþúTìõÖùrðZŸœÛ'p0mZ?þjEï½¥3o>ÙtÑ·Ç3>’Bu>« LeŽ(!¬^h†]É@p¬ÜwN´þT_>œÆ‹œVyM¡œµÏÝ??[Œf
+ ¸UÔm«¢nðåÒøaÝNC}$f¯Ñ.täFŽ©cqÙ1s짺¿"ÄJø_øAÚaìDüus2r mGwÅ(ü¤¹PHB͟ ½æNqm¼}$‹*+í1Cãä҈µ  +w¢\oµN^8Ë뚥©É +ˆ«PcYæ:MŽWVS›ÞKºí¢¬.[}¼Í¡:ÊJ«èßvÿëÈ;
+endstream
+endobj
+31 0 obj
+<<
+/Font <<
+/F1 11 0 R
+/F2 19 0 R
+/F3 28 0 R
+>>
+>>
+endobj
+3 0 obj
+<<
+/Contents [ 20 0 R 29 0 R 30 0 R ]
+/CropBox [ 0.0 0.0 595.32001 841.92004 ]
+/MediaBox [ 0.0 0.0 595.32001 841.92004 ]
+/Parent 2 0 R
+/Resources 31 0 R
+/Rotate 0
+/Type /Page
+>>
+endobj
+10 0 obj
+<<
+/Length 1193
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 62 beginbfchar <0003> <0020> <0004> <0021> <0008> <0025> <000B> <0028> <000C> <0029> <000E> <002B> <000F> <002C> <0011> <002E> <0013> <0030> <0014> <0031> <0015> <0032> <0016> <0033> <0018> <0035> <001B> <0038> <001C> <0039> <0024> <0041> <0025> <0042> <0026> <0043> <0027> <0044> <0028> <0045> <0029> <0046> <002B> <0048> <002C> <0049> <002F> <004C> <0030> <004D> <0031> <004E> <0032> <004F> <0033> <0050> <0035> <0052> <0036> <0053> <0037> <0054> <0038> <0055> <0039> <0056> <003B> <0058> <003C> <0059> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <004A> <0067> <004B> <0068> <004C> <0069> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0054> <0071> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <0059> <0076> <005B> <0078> <005C> <0079> <0065> <00C9> <006A> <00E0> <0070> <00E9> <00AC> <00C0> <00B1> <2013> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+9 0 obj
+[ 3 3 277 4 4 333 8 8 889 11 11 333 12 12 333 14 14 583 15 15 277 17 17 277 19 19 556 20 20 556 21 21 556 22 22 556 24 24 556 27 27 556 28 28 556 36 36 722 37 37 722 38 38 722 39 39 722 40 40 666 41 41 610 43 43 722 44 44 277 47 47 610 48 48 833 49 49 722 50 50 777 51 51 666 53 53 722 54 54 666 55 55 610 56 56 722 57 57 666 59 59 666 60 60 666 68 68 556 69 69 610 70 70 556 71 71 610 72 72 556 74 74 610 75 75 610 76 76 277 79 79 277 80 80 889 81 81 610 82 82 610 83 83 610 84 84 610 85 85 389 86 86 556 87 87 333 88 88 610 89 89 556 91 91 556 92 92 556 101 101 666 106 106 556 112 112 556 172 172 722 177 177 556 182 182 277 ]
+endobj
+6 0 obj
+[ -889 -211 889 905 ]
+endobj
+7 0 obj
+889
+endobj
+18 0 obj
+<<
+/Length 1319
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 71 beginbfchar <0003> <0020> <0008> <0025> <000B> <0028> <000C> <0029> <000F> <002C> <0010> <002D> <0011> <002E> <0012> <002F> <0013> <0030> <0014> <0031> <0015> <0032> <0016> <0033> <0017> <0034> <0018> <0035> <0019> <0036> <001A> <0037> <001B> <0038> <001C> <0039> <001D> <003A> <0024> <0041> <0025> <0042> <0026> <0043> <0027> <0044> <0028> <0045> <0029> <0046> <002A> <0047> <002C> <0049> <002F> <004C> <0030> <004D> <0032> <004F> <0035> <0052> <0036> <0053> <0037> <0054> <0038> <0055> <0039> <0056> <003E> <005B> <0040> <005D> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <0049> <0066> <004A> <0067> <004B> <0068> <004C> <0069> <004D> <006A> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0054> <0071> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <0059> <0076> <005B> <0078> <005C> <0079> <005D> <007A> <0065> <00C9> <006A> <00E0> <006F> <00E7> <0070> <00E9> <0071> <00E8> <0072> <00EA> <007B> <00F4> <0083> <00B0> <00B1> <2013> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+17 0 obj
+[ 3 3 277 8 8 889 11 11 333 12 12 333 15 15 277 16 16 333 17 17 277 18 18 277 19 19 556 20 20 556 21 21 556 22 22 556 23 23 556 24 24 556 25 25 556 26 26 556 27 27 556 28 28 556 29 29 277 36 36 666 37 37 666 38 38 722 39 39 722 40 40 666 41 41 610 42 42 777 44 44 277 47 47 556 48 48 833 50 50 777 53 53 722 54 54 666 55 55 610 56 56 722 57 57 666 62 62 277 64 64 277 68 68 556 69 69 556 70 70 500 71 71 556 72 72 556 73 73 277 74 74 556 75 75 556 76 76 222 77 77 222 79 79 222 80 80 833 81 81 556 82 82 556 83 83 556 84 84 556 85 85 333 86 86 500 87 87 277 88 88 556 89 89 500 91 91 500 92 92 500 93 93 500 101 101 666 106 106 556 111 111 500 112 112 556 113 113 556 114 114 556 123 123 556 131 131 399 177 177 556 182 182 222 ]
+endobj
+14 0 obj
+[ -889 -211 889 905 ]
+endobj
+15 0 obj
+889
+endobj
+27 0 obj
+<<
+/Length 731
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 29 beginbfchar <0003> <0020> <000B> <0028> <000C> <0029> <0015> <0032> <0026> <0043> <0031> <004E> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <0049> <0066> <004A> <0067> <004C> <0069> <004D> <006A> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <005D> <007A> <006A> <00E0> <0070> <00E9> <0071> <00E8> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+26 0 obj
+[ 3 3 277 11 11 333 12 12 333 21 21 556 38 38 722 49 49 722 68 68 556 69 69 556 70 70 500 71 71 556 72 72 556 73 73 277 74 74 556 76 76 222 77 77 222 79 79 222 80 80 833 81 81 556 82 82 556 83 83 556 85 85 333 86 86 500 87 87 277 88 88 556 93 93 500 106 106 556 112 112 556 113 113 556 182 182 222 ]
+endobj
+23 0 obj
+[ -833 -211 833 905 ]
+endobj
+24 0 obj
+833
+endobj
+2 0 obj
+<<
+/Count 1
+/Kids [ 3 0 R ]
+/Type /Pages
+>>
+endobj
+1 0 obj
+<<
+/Pages 2 0 R
+/Type /Catalog
+>>
+endobj
+32 0 obj
+<<
+/Author (Utilisateur)
+/CreationDate (D:20170504160720+02'00')
+/ModDate (D:20170504160720+02'00')
+/Producer (Microsoft: Print To PDF)
+/Title (3310-2016.pdf)
+>>
+endobj
+xref
+0 33
0000000000 65535 f
-0000039191 00000 n
-0000040382 00000 n
-0000040470 00000 n
-0000040521 00000 n
-0000044247 00000 n
-trailer
-<</Size 6>>
-startxref
-116
-%%EOF
+0000107898 00000 n
+0000107839 00000 n
+0000102366 00000 n
+0000000009 00000 n
+0000000035 00000 n
+0000104450 00000 n
+0000104487 00000 n
+0000000058 00000 n
+0000103805 00000 n
+0000102559 00000 n
+0000019409 00000 n
+0000019881 00000 n
+0000019908 00000 n
+0000106624 00000 n
+0000106662 00000 n
+0000019932 00000 n
+0000105878 00000 n
+0000104506 00000 n
+0000044331 00000 n
+0000044809 00000 n
+0000061222 00000 n
+0000061249 00000 n
+0000107781 00000 n
+0000107819 00000 n
+0000061273 00000 n
+0000107465 00000 n
+0000106682 00000 n
+0000072032 00000 n
+0000072510 00000 n
+0000092435 00000 n
+0000102299 00000 n
+0000107947 00000 n
+trailer
+<<
+/Info 32 0 R
+/Root 1 0 R
+/Size 33
+>>
+startxref
+108126
+%%EOF
Index: OpenConcerto/src/org/jopendocument/link/OOConnexion.java
===================================================================
--- OpenConcerto/src/org/jopendocument/link/OOConnexion.java (revision 143)
+++ OpenConcerto/src/org/jopendocument/link/OOConnexion.java (revision 144)
@@ -35,7 +35,7 @@
*
* @author Administrateur
*/
-public abstract class OOConnexion {
+public abstract class OOConnexion implements AutoCloseable {
// weak to let go OOInstallation instances
private static final Map<OOInstallation, ClassLoader> loaders = new WeakHashMap<OOInstallation, ClassLoader>(2);
@@ -44,6 +44,7 @@
private static final String OO_VERSION = "3";
protected static final int PORT = 8100;
+ protected static final int PORT_MAX = 8250;
static {
// needed to access .class inside a jar inside a jar.
@@ -74,7 +75,7 @@
protected PermissionCollection getPermissions(CodeSource codesource) {
final PermissionCollection perms = super.getPermissions(codesource);
perms.add(new FilePermission(ooInstall.getExecutable().getAbsolutePath(), "execute"));
- perms.add(new SocketPermission("localhost:" + PORT + "-" + (PORT + 10), "connect"));
+ perms.add(new SocketPermission("localhost:" + PORT + "-" + PORT_MAX, "connect"));
// needed by OO jars
perms.add(new PropertyPermission("*", "read"));
// to be able to open any document
@@ -123,28 +124,28 @@
System.out.println("--type is either file or url");
System.exit(1);
}
- final OOConnexion conn = OOConnexion.create();
- if (conn == null)
- throw new IllegalStateException("No Office found");
- final boolean file;
- final String arg;
- if (args.length == 1) {
- file = true;
- arg = args[0];
- } else if (args[0].equals("--file")) {
- file = true;
- arg = args[1];
- } else if (args[0].equals("--url")) {
- file = false;
- arg = args[1];
- } else {
- throw new IllegalArgumentException("Type not valid : " + args[0]);
+ try (final OOConnexion conn = OOConnexion.create()) {
+ if (conn == null)
+ throw new IllegalStateException("No Office found");
+ final boolean file;
+ final String arg;
+ if (args.length == 1) {
+ file = true;
+ arg = args[0];
+ } else if (args[0].equals("--file")) {
+ file = true;
+ arg = args[1];
+ } else if (args[0].equals("--url")) {
+ file = false;
+ arg = args[1];
+ } else {
+ throw new IllegalArgumentException("Type not valid : " + args[0]);
+ }
+ if (file)
+ conn.loadDocument(new File(arg), false);
+ else
+ conn.loadDocumentFromURLAsync(arg, false);
}
- if (file)
- conn.loadDocument(new File(arg), false);
- else
- conn.loadDocumentFromURLAsync(arg, false);
- conn.closeConnexion();
}
protected abstract Component loadDocumentFromURLAsync(final String url, final boolean hidden);
@@ -166,6 +167,11 @@
protected abstract String convertToUrl(String path) throws MalformedURLException;
+ @Override
+ public final void close() {
+ this.closeConnexion();
+ }
+
public abstract void closeConnexion();
/**
/trunk/OpenConcerto/src/org/jopendocument/link/OOInstallation.java
146,8 → 146,11
// MacOS and Linux
add(cp, ureDir + File.separator + "share" + File.separator + "java");
}
if (basisDir != null)
if (basisDir != null) {
add(cp, basisDir + File.separator + "program" + File.separator + "classes");
// at least for LO 5.3 on MacOS
add(cp, basisDir + File.separator + "Resources" + File.separator + "java");
}
}
 
private static final void addUnixPaths(final List<File> cp, final File progDir) throws IOException {
286,4 → 289,17
e.printStackTrace();
}
}
 
/**
* TODO add methods to call the program, but there's currently a bug preventing from running a
* headless instance when there's already a running instance :
* https://bugs.documentfoundation.org/show_bug.cgi?id=37531#c45
* https://ask.libreoffice.org/en/question/1686/how-to-not-connect-to-a-running-instance/?answer=1701#post-id-1701
*
* <pre>
tmpdir=`mktemp -d /tmp/libreoffice-XXXXXXXXXXXX`
trap "rm -rf $tmpdir" EXIT INT
libreoffice "-env:UserInstallation=file://$tmpdir" --headless --nolockcheck --convert-to pdf "$out"
* </pre>
*/
}
/trunk/OpenConcerto/src/org/openconcerto/laf/WindowsTableHeaderUIFix.java
Fichier supprimé
/trunk/OpenConcerto/src/org/openconcerto/laf/WindowsLookAndFeelFix.java
Fichier supprimé
/trunk/OpenConcerto/src/org/openconcerto/laf/LAFUtils.java
163,9 → 163,6
* <code>true</code>.
*/
static public final String fixLookAndFeel(final String laf) {
if (!Boolean.getBoolean(LAF_DONT_FIX) && laf.equals("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")) {
return WindowsLookAndFeelFix.class.getName();
}
return laf;
}
}
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListPanel.java
15,8 → 15,6
 
import static org.openconcerto.task.TM.getTM;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
39,7 → 37,6
import org.openconcerto.ui.table.TimestampTableCellEditor;
import org.openconcerto.ui.table.TimestampTableCellRenderer;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.SwingWorker2;
import org.openconcerto.utils.TableSorter;
import org.openconcerto.utils.cc.ITransformer;
 
84,6 → 81,7
import javax.swing.JToolTip;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.ChangeEvent;
97,6 → 95,7
 
public class TodoListPanel extends JPanel implements ModelStateListener {
 
private final UserManager uMngr;
// Actions
private final JCheckBox detailCheckBox;
private final JCheckBox hideOldCheckBox;
120,11 → 119,12
final ReloadPanel reloadPanel = new ReloadPanel();
TableSorter sorter;
 
public TodoListPanel() {
public TodoListPanel(final UserManager uMngr) {
this.uMngr = uMngr;
this.setOpaque(false);
this.iconTache = new ImageIcon(TodoListPanel.class.getResource("tache.png"));
this.iconPriorite = new ImageIcon(TodoListPanel.class.getResource("priorite.png"));
this.userTableCellRenderer = new UserTableCellRenderer();
this.userTableCellRenderer = new UserTableCellRenderer(uMngr);
this.timestampTableCellRendererCreated = new TimestampTableCellRenderer();
this.timestampTableCellRendererDone = new TimestampTableCellRenderer();
this.timestampTableCellRendererDeadLine = new TimestampTableCellRenderer(true);
140,8 → 140,8
this.iconEditor = new IconTableCellRenderer(l);
this.iconRenderer = new IconTableCellRenderer(l);
 
final User currentUser = UserManager.getInstance().getCurrentUser();
this.model = new TodoListModel(currentUser);
final User currentUser = uMngr.getCurrentUser();
this.model = new TodoListModel(uMngr);
this.sorter = new TableSorter(this.model);
this.t = new LightEventJTable(this.sorter) {
public JToolTip createToolTip() {
161,7 → 161,7
} else {
r = "";
}
r += getTM().trM("assignedBy", "user", UserManager.getInstance().getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
r += getTM().trM("assignedBy", "user", uMngr.getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
}
 
return r;
260,8 → 260,12
this.model.asynchronousFill();
}
 
public final UserManager getUserManager() {
return this.uMngr;
}
 
private void initViewableUsers(final User currentUser) {
final SwingWorker2<List<User>, Object> worker = new SwingWorker2<List<User>, Object>() {
final SwingWorker<List<User>, Object> worker = new SwingWorker<List<User>, Object>() {
 
@Override
protected List<User> doInBackground() throws Exception {
271,9 → 275,8
canViewUsers.add(right.getIdToUser());
}
// final Vector users = new Vector();
final SQLTable userT = UserManager.getInstance().getTable();
final DBSystemRoot systemRoot = Configuration.getInstance().getSystemRoot();
final SQLSelect select1 = new SQLSelect(systemRoot, false);
final SQLTable userT = getUserManager().getTable();
final SQLSelect select1 = new SQLSelect(false);
select1.addSelectStar(userT);
final Where meWhere = new Where(userT.getKey(), "=", currentUser.getId());
final Where canViewWhere = new Where(userT.getKey(), canViewUsers);
514,10 → 517,10
}
 
private void initUserCellEditor(final TableColumn userColumn) {
SwingWorker2<List<UserTaskRight>, Object> worker = new SwingWorker2<List<UserTaskRight>, Object>() {
new SwingWorker<List<UserTaskRight>, Object>() {
@Override
protected List<UserTaskRight> doInBackground() throws Exception {
return UserTaskRight.getUserTaskRight(UserManager.getInstance().getCurrentUser());
return UserTaskRight.getUserTaskRight(getUserManager().getCurrentUser());
}
 
@Override
527,12 → 530,12
final List<UserTaskRight> rights = get();
final List<User> canAddUsers = new ArrayList<User>();
for (final UserTaskRight right : rights) {
assert right.getIdUser() == UserManager.getUserID();
assert right.getIdUser() == getUserManager().getCurrentUser().getId();
if (right.canAdd()) {
canAddUsers.add(UserManager.getInstance().getUser(right.getIdToUser()));
canAddUsers.add(getUserManager().getUser(right.getIdToUser()));
}
}
userColumn.setCellEditor(new UserTableCellEditor(new UserComboBox(canAddUsers)));
userColumn.setCellEditor(new UserTableCellEditor(getUserManager(), new UserComboBox(canAddUsers)));
t.setEnabled(true);
} catch (Exception e) {
ExceptionHandler.handle("Unable to get user task rights", e);
540,9 → 543,7
 
super.done();
}
};
worker.execute();
 
}.execute();
}
 
void initPopUp() {
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListModel.java
15,7 → 15,6
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.IResultSetHandler;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
31,6 → 30,7
 
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.LinkedHashMap;
43,9 → 43,9
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.AbstractTableModel;
 
public class TodoListModel extends DefaultTableModel {
public class TodoListModel extends AbstractTableModel {
 
public static final int EXTENDED_MODE = 1;
public static final int SIMPLE_MODE = 2;
58,12 → 58,13
// que l'on ecoute
private JTable table = null;
private List<ModelStateListener> stateListenerList = new Vector<ModelStateListener>(1);
private transient User currentUser;
private final UserManager uMngr;
protected List<UserTaskRight> rights;
private boolean historyVisible = false;
private List<TodoListElement> elements = new ArrayList<TodoListElement>();
 
TodoListModel(User currentUser) {
this.currentUser = currentUser;
TodoListModel(final UserManager uMngr) {
this.uMngr = uMngr;
launchUpdaterThread();
this.mode = SIMPLE_MODE;
}
83,8 → 84,6
e.printStackTrace();
}
}
// System.err.println("launchUpdaterThread end");
 
}
});
// this only read data to be displayed, it can be safely interrupted at any moment
135,10 → 134,10
// size before removing
final int newSize = newDataVector.size();
final int oldSize;
synchronized (this.dataVector) {
oldSize = this.dataVector.size();
synchronized (this.elements) {
oldSize = this.elements.size();
for (int i = 0; i < oldSize; i++) {
final TodoListElement elt = (TodoListElement) this.dataVector.get(i);
final TodoListElement elt = this.elements.get(i);
final TodoListElement eltN = newDataVector.remove(elt.getRowValues().getID());
if (eltN == null) {
rowsDeleted.add(elt);
151,7 → 150,7
}
 
for (TodoListElement elt : rowsDeleted) {
int index = this.dataVector.indexOf(elt);
int index = this.elements.indexOf(elt);
if (index >= 0) {
removeRow(index);
}
158,12 → 157,12
}
 
for (Integer i : newDataVector.keySet()) {
this.dataVector.add(newDataVector.get(i));
this.elements.add(newDataVector.get(i));
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if ((rowsModified.size() == newSize) && (rowsModified.size() > 0)) {
if ((rowsModified.size() == newSize) && !rowsModified.isEmpty()) {
fireTableDataChanged();
fireModelStateChanged(ModelStateListener.CONTENT_MODIFIED);
} else if (newSize != oldSize) {
174,7 → 173,7
Integer indexModified = rowsModified.get(i);
fireTableRowsUpdated(indexModified, indexModified);
}
if (rowsModified.size() > 0) {
if (!rowsModified.isEmpty()) {
fireModelStateChanged(ModelStateListener.CONTENT_MODIFIED);
}
}
193,7 → 192,7
@SuppressWarnings("unchecked")
@Override
public Set<String> createChecked() {
final SQLSelect sel = new SQLSelect(tableTache.getBase());
final SQLSelect sel = new SQLSelect();
sel.addSelect(typeF);
sel.addGroupBy(typeF);
return new HashSet<String>(tableTache.getDBSystemRoot().getDataSource().executeCol(sel.asString()));
205,15 → 204,15
private static final int societeID = ((ComptaBasePropsConfiguration) Configuration.getInstance()).getSocieteID();
private static final DBSystemRoot base = Configuration.getInstance().getSystemRoot();
private static final SQLTable tableTache = base.getRoot("Common").getTable("TACHE_COMMON");
private final static Where where2 = new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", tableTache.getUndefinedID()).or(new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", societeID));
private static final Where where2 = new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", tableTache.getUndefinedID()).or(new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", societeID));
 
private synchronized void fillFromDatabase(final Map<Integer, TodoListElement> m) {
long time1 = System.currentTimeMillis();
 
final SQLSelect select = new SQLSelect(tableTache.getBase());
final SQLSelect select = new SQLSelect();
select.addSelectStar(tableTache);
Where where = new Where(tableTache.getField("ID_USER_COMMON_TO"), this.listIdListener);
final int userID = UserManager.getInstance().getCurrentUser().getId();
final int userID = getCurrentUser().getId();
where = where.or(new Where(tableTache.getField("ID_USER_COMMON_ASSIGN_BY"), "=", userID));
 
where = where.or(getAuthorizedTaskTypes(userID, tableTache));
229,49 → 228,28
where = where.and(w3);
}
select.setWhere(where.and(where2));
 
select.addFieldOrder(tableTache.getField("ID_USER_COMMON_TO"));
select.addFieldOrder(tableTache.getField("DATE_EXP"));
 
// System.out.println(select.asString());
this.rights = UserTaskRight.getUserTaskRight(getCurrentUser());
// don't use the cache since by definition this table is shared by everyone, so we can't
// rely on our modifications
final IResultSetHandler rsh = new IResultSetHandler(SQLRowListRSH.createFromSelect(select), false);
@SuppressWarnings("unchecked")
final List<SQLRow> l = (List<SQLRow>) base.getDataSource().execute(select.asString(), rsh);
final List<SQLRow> l = SQLRowListRSH.execute(select, false, false);
for (SQLRow row : l) {
TodoListElement t = new TodoListElement(row.asRowValues());
 
// Calendar t2 = row.getDate("DATE_FAIT");
//
 
final TodoListElement t = new TodoListElement(getUserManager(), row.asRowValues());
// add tasks that we created, we must do, or that we can read
// plus for preventec, tasks with a type must visible to everybody
boolean add = false;
String type = row.getString("TYPE");
if (type != null && type.trim().length() > 0) {
// if (isHistoryVisible()) {
// m.put(row.getID(), t);
// } else if (!row.getBoolean("FAIT")) {
// m.put(row.getID(), t);
// } else if (t2 != null && t2.after(cal.getTime())) {
add = true;
// }
} else if (row.getInt("ID_USER_COMMON_CREATE") == userID || row.getInt("ID_USER_COMMON_TO") == userID) {
add = true;
} else {
for (int i = 0; i < TodoListModel.this.rights.size(); i++) {
UserTaskRight element = TodoListModel.this.rights.get(i);
 
final UserTaskRight element = TodoListModel.this.rights.get(i);
if (element.getIdToUser() == row.getInt("ID_USER_COMMON_TO") && element.canRead()) {
// if (isHistoryVisible()) {
// m.put(row.getID(), t);
// } else if (!row.getBoolean("FAIT")) {
// m.put(row.getID(), t);
// } else if (t2 != null && t2.after(cal.getTime())) {
add = true;
// }
break;
}
}
297,8 → 275,9
return 5;
}
 
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
synchronized (this.elements) {
// Modifier la priorité de la tache
if (columnIndex == 1) {
return true;
308,11 → 287,11
return false;
}
 
if (this.dataVector.size() <= rowIndex) {
System.err.println("Size error :" + this.dataVector.size() + " i:" + rowIndex);
if (this.elements.size() <= rowIndex) {
System.err.println("Size error :" + this.elements.size() + " i:" + rowIndex);
rowIndex = 0;
}
final TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
final TodoListElement task = this.elements.get(rowIndex);
if (task == null)
return false;
final int size = this.rights.size();
319,14 → 298,14
if (columnIndex == 0)
// Validation
for (int i = 0; i < size; i++) {
UserTaskRight right = this.rights.get(i);
if (right.getIdToUser() == task.getUserId() && right.canValidate()) {
return true;
}
UserTaskRight right = this.rights.get(i);
if (right.getIdToUser() == task.getUserId() && right.canValidate()) {
return true;
}
}
else if (columnIndex == this.getColumnCount() - 1) {
// Colonne d'assignement
return (task.getCreatorId().equals(UserManager.getInstance().getCurrentUser().getId()));
return (task.getCreatorId().equals(getCurrentUser().getId()));
} else {
// Modification
for (int i = 0; i < size; i++) {
342,6 → 321,7
return false;
}
 
@Override
public Class<?> getColumnClass(final int columnIndex) {
switch (columnIndex) {
case 0:
353,9 → 333,10
case 3:
return Timestamp.class;
case 4:
if (this.mode != EXTENDED_MODE) {
return Integer.class;
if (this.mode == EXTENDED_MODE) {
return Timestamp.class;
}
return Integer.class;
case 5:
return Timestamp.class;
case 6:
362,19 → 343,16
return Integer.class;
default:
return String.class;
 
}
 
}
 
public Object getValueAt(int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
if (this.dataVector.size() <= rowIndex) {
System.err.println("Size error :" + this.dataVector.size() + " i:" + rowIndex);
synchronized (this.elements) {
if (this.elements.size() <= rowIndex) {
System.err.println("Size error :" + this.elements.size() + " i:" + rowIndex);
rowIndex = 0;
}
TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
 
final TodoListElement task = this.elements.get(rowIndex);
switch (columnIndex) {
case 0:
return task.isDone();
398,23 → 376,32
return task.getUserId();
default:
return "????????";
 
}
}
}
 
public TodoListElement getTaskAtRow(int rowIndex) {
return (TodoListElement) this.dataVector.get(rowIndex);
return this.elements.get(rowIndex);
}
 
@Override
public int getRowCount() {
return this.elements.size();
}
 
public void removeRow(int row) {
elements.remove(row);
fireTableRowsDeleted(row, row);
}
 
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
synchronized (this.elements) {
if (rowIndex >= getRowCount()) {
// Cas de la perte de l'edition de la derniere ligne supprimee
return;
}
TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
 
final TodoListElement task = this.elements.get(rowIndex);
switch (columnIndex) {
case 0:
task.setDone((Boolean) aValue);
446,14 → 433,13
break;
default:
break;
 
}
 
task.commitChanges();
}
fireTableRowsUpdated(rowIndex, rowIndex);
}
 
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
490,7 → 476,7
 
@Override
public Object doInBackground() {
final SQLRowValues rowV = new SQLRowValues(Configuration.getInstance().getBase().getTable("TACHE_COMMON"));
final SQLRowValues rowV = new SQLRowValues(tableTache);
final Calendar cal = Calendar.getInstance();
rowV.put("DATE_ENTREE", new java.sql.Timestamp(cal.getTimeInMillis()));
cal.add(Calendar.HOUR_OF_DAY, 1);
501,7 → 487,7
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
rowV.put("DATE_FAIT", new java.sql.Timestamp(cal.getTimeInMillis()));
final int currentUserId = UserManager.getInstance().getCurrentUser().getId();
final int currentUserId = getCurrentUser().getId();
rowV.put("ID_USER_COMMON_ASSIGN_BY", currentUserId);
rowV.put("ID_USER_COMMON_TO", currentUserId);
try {
535,9 → 521,9
}
 
public boolean deleteTaskAtIndex(int index) {
synchronized (this.dataVector) {
final TodoListElement t = (TodoListElement) this.dataVector.get(index);
final int currentUserId = UserManager.getInstance().getCurrentUser().getId();
synchronized (this.elements) {
final TodoListElement t = this.elements.get(index);
final int currentUserId = getCurrentUser().getId();
if (t.getCreatorId() != currentUserId) {
JOptionPane.showMessageDialog(this.table, TM.tr("deleteForbidden"));
return false;
593,10 → 579,14
}
}
 
public User getCurrentUser() {
return this.currentUser;
public final UserManager getUserManager() {
return this.uMngr;
}
 
public final User getCurrentUser() {
return this.getUserManager().getCurrentUser();
}
 
public synchronized boolean isHistoryVisible() {
return this.historyVisible;
}
604,4 → 594,5
public synchronized void setHistoryVisible(boolean historyVisible) {
this.historyVisible = historyVisible;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/task/config/TaskNX.java
16,6 → 16,7
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.ui.ConnexionPanel;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.utils.Exiter;
import org.openconcerto.sql.view.EditPanel;
import org.openconcerto.task.ModelStateListener;
51,9 → 52,9
public class TaskNX extends JFrame implements ModelStateListener {
private static TrayIcon trayIcon = null;
 
public TaskNX() {
public TaskNX(TaskPropsConfiguration conf) {
this.setTitle("Task NX");
TodoListPanel panel = new TodoListPanel();
TodoListPanel panel = new TodoListPanel(UserManager.getInstance());
panel.addModelStateListener(this);
this.setContentPane(panel);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
82,7 → 83,7
this.setJMenuBar(menuBar2);
 
// add state listener before, otherwise System.exit() prevents the save from happening
final WindowStateManager m = new WindowStateManager(this, new File(Configuration.getInstance().getConfDir(), this.getClass().getSimpleName() + "-window.xml"));
final WindowStateManager m = new WindowStateManager(this, new File(conf.getConfDir(), this.getClass().getSimpleName() + "-window.xml"));
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
99,7 → 100,8
 
public static void main(String[] args) {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
Configuration.setInstance(TaskPropsConfiguration.create());
final TaskPropsConfiguration conf = TaskPropsConfiguration.create();
Configuration.setInstance(conf);
final Runnable r = new Runnable() {
 
public void run() {
106,7 → 108,7
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TaskNX f = new TaskNX();
final TaskNX f = new TaskNX(conf);
f.setVisible(true);
}
});
/trunk/OpenConcerto/src/org/openconcerto/task/config/ComptaBasePropsConfiguration.java
187,7 → 187,7
dir.addSQLElement(new TaskRightSQLElement());
dir.addSQLElement(new TaskSQLElement());
 
dir.addSQLElement(new UserCommonSQLElement(getRoot()));
dir.addSQLElement(new UserCommonSQLElement(getRoot(), false));
dir.addSQLElement(new CompanyAccessSQLElement());
dir.addSQLElement(UserRightSQLElement.class);
dir.addSQLElement(RightSQLElement.class);
/trunk/OpenConcerto/src/org/openconcerto/task/config/TaskAdminNX.java
34,7 → 34,8
 
public static void main(String[] args) {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
Configuration.setInstance(TaskPropsConfiguration.create());
final TaskPropsConfiguration conf = TaskPropsConfiguration.create();
Configuration.setInstance(conf);
SwingUtilities.invokeLater(new Runnable() {
 
public void run() {
59,7 → 60,7
new Exiter(f, true);
f.setTitle("Gestion des autorisations concernant les tâches");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(new UserRightsPrefPanel());
f.setContentPane(new UserRightsPrefPanel(conf));
f.pack();
f.setLocation(20, 20);
f.setSize(800, 600);
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserTableCellEditor.java
24,12 → 24,11
 
public class UserTableCellEditor extends DefaultCellEditor {
 
public UserTableCellEditor() {
this(new UserComboBox());
}
private final UserManager uMngr;
 
public UserTableCellEditor(UserComboBox userComboBox) {
public UserTableCellEditor(final UserManager uMngr, UserComboBox userComboBox) {
super(userComboBox);
this.uMngr = uMngr;
}
 
public Object getCellEditorValue() {
38,7 → 37,7
 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value instanceof Integer) {
User u = UserManager.getInstance().getUser((Integer) value);
User u = this.uMngr.getUser((Integer) value);
value = new IComboSelectionItem(u.getId(), u.getFullName());
}
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserRightPanelDetail.java
13,8 → 13,7
package org.openconcerto.task.ui;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
22,6 → 21,7
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.task.UserTaskRight;
import org.openconcerto.ui.DisplayabilityListener;
import org.openconcerto.utils.ExceptionHandler;
48,7 → 48,8
 
JLabel labelDocumentation1 = new JLabel("");
JLabel labelDocumentation2 = new JLabel("");
UserListModel model = new UserListModel();
private final UserListModel model;
private final SQLTable tableTacheRights;
UserTaskRightListCellRenderer cellRenderer1 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.READ);
UserTaskRightListCellRenderer cellRenderer2 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.MODIFY);
UserTaskRightListCellRenderer cellRenderer3 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.ADD);
59,7 → 60,9
private JList list3;
private JList list4;
 
UserRightPanelDetail() {
UserRightPanelDetail(final UserManager uMngr, final DBRoot root) {
this.model = new UserListModel(uMngr);
this.tableTacheRights = root.getTable("TACHE_RIGHTS");
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(4, 10, 2, 2);
186,9 → 189,6
}
 
protected void swapState(User user, User toUser, String field) {
final SQLBase defaultBase = Configuration.getInstance().getBase();
final SQLTable tableTacheRights = defaultBase.getTable("TACHE_RIGHTS");
 
final SQLSelect sel = new SQLSelect();
sel.addSelectStar(tableTacheRights);
Where where = new Where(tableTacheRights.getField("ID_USER_COMMON"), "=", user.getId());
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserComboBox.java
15,7 → 15,6
 
import org.openconcerto.sql.sqlobject.IComboSelectionItem;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.util.List;
 
22,9 → 21,6
import javax.swing.JComboBox;
 
public class UserComboBox extends JComboBox {
public UserComboBox() {
this(UserManager.getInstance().getAllUser());
}
 
public UserComboBox(final List<User> items) {
final int size = items.size();
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserListModel.java
19,15 → 19,15
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.util.List;
 
import javax.swing.DefaultListModel;
 
public class UserListModel extends DefaultListModel {
public class UserListModel extends DefaultListModel<User> {
private final UserManager uMngr;
private final SQLTableModifiedListener l;
private SQLTable t;
 
public UserListModel() {
public UserListModel(final UserManager uMngr) {
this.uMngr = uMngr;
this.l = new SQLTableModifiedListener() {
@Override
public void tableModified(SQLTableEvent evt) {
39,7 → 39,7
 
public final void start() {
if (this.t == null) {
this.t = UserManager.getInstance().getTable();
this.t = this.uMngr.getTable();
this.t.addTableModifiedListener(this.l);
this.l.tableModified(null);
}
56,9 → 56,7
* Reload
*/
private void reload() {
List<User> users = UserManager.getInstance().getAllUser();
for (int i = 0; i < users.size(); i++) {
User u = users.get(i);
for (final User u : this.uMngr.getUsers().values()) {
addElement(u);
}
}
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserRightsPrefPanel.java
13,8 → 13,9
package org.openconcerto.task.ui;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.PropsConfiguration;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.ui.DisplayabilityListener;
46,7 → 47,8
private UserRightPanelDetail detail;
private JList l;
 
public UserRightsPrefPanel() {
public UserRightsPrefPanel(final PropsConfiguration conf) {
final UserManager uMngr = conf.getUserManager();
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
56,7 → 58,7
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(0, 0, 0, 0);
// Liste des utilisateurs
final UserListModel dataModel = new UserListModel();
final UserListModel dataModel = new UserListModel(uMngr);
this.addHierarchyListener(new DisplayabilityListener() {
@Override
protected void displayabilityChanged(Component c) {
80,7 → 82,7
this.add(sep, c);
//
c.weightx = 1;
detail = new UserRightPanelDetail();
detail = new UserRightPanelDetail(uMngr, conf.getRoot());
this.add(detail, c);
//
c.weighty = 0;
102,7 → 104,7
if (frame == null) {
frame = createFrame();
frame.pack();
new WindowStateManager(frame, new File(Configuration.getInstance().getConfDir(), UserRightsPrefPanel.this.getClass().getSimpleName() + "-window.xml"), true).loadState();
new WindowStateManager(frame, new File(conf.getConfDir(), UserRightsPrefPanel.this.getClass().getSimpleName() + "-window.xml"), true).loadState();
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
FrameUtil.show(frame);
109,7 → 111,7
}
 
public JFrame createFrame() {
return new IListFrame(new ListeAddPanel(Configuration.getInstance().getDirectory().getElement("USER_COMMON")));
return new IListFrame(new ListeAddPanel(conf.getDirectory().getElement("USER_COMMON")));
}
});
this.add(manageUsers, c);
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListElementEditorPanel.java
88,7 → 88,7
c.gridwidth = 2;
c.insets = new Insets(2, 2, 2, 2);
c.fill = GridBagConstraints.HORIZONTAL;
JLabel label = new JLabel(TM.getTM().trM("todoBefore", "date", e.getExpectedDate(), "user", UserManager.getInstance().getUser(e.getUserId()).getFullName()));
JLabel label = new JLabel(TM.getTM().trM("todoBefore", "date", e.getExpectedDate(), "user", e.getUser().getFullName()));
this.add(label, c);
// Ligne 4 =====================================
JButton bOk = new JButton(TM.tr("ok"));
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListElement.java
16,6 → 16,8
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.sql.SQLException;
import java.util.Calendar;
25,9 → 27,11
 
public class TodoListElement {
 
SQLRowValues rowVals;
private final UserManager uMngr;
private SQLRowValues rowVals;
 
public TodoListElement(SQLRowValues rowVals) {
public TodoListElement(final UserManager uMngr, SQLRowValues rowVals) {
this.uMngr = uMngr;
this.rowVals = rowVals;
}
 
151,6 → 155,10
return this.rowVals.getInt("ID_USER_COMMON_TO");
}
 
public User getUser() {
return this.uMngr.getUser(getUserId());
}
 
/**
* Returns the user who created the task.
*
/trunk/OpenConcerto/src/org/openconcerto/erp/action/NouvelleConnexionAction.java
14,6 → 14,7
package org.openconcerto.erp.action;
 
import static org.openconcerto.task.config.ComptaBasePropsConfiguration.getStreamStatic;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.config.DefaultMenuConfiguration;
import org.openconcerto.erp.config.Gestion;
52,6 → 53,7
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.SQLTableRightEditor;
import org.openconcerto.sql.users.rights.TableAllRights;
import org.openconcerto.sql.users.rights.UserRights;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.users.rights.UserRightsManager.RightTuple;
import org.openconcerto.sql.utils.BackupPanel;
132,14 → 134,7
}
}
comptaPropsConfiguration.setUpSocieteDataBaseConnexion(selectedSociete);
try {
// create table if necessary
SQLPreferences.getPrefTable(comptaPropsConfiguration.getRootSociete());
SQLPreferences.startMemCached(comptaPropsConfiguration.getRootSociete());
} catch (Exception e) {
// don't die now, we might not need them
ExceptionHandler.handle("Impossible d'accéder aux préférences", e);
}
comptaPropsConfiguration.setupBarCodeIfNeeded();
 
// needed by openEmergencyModuleManager()
UserRightsManager.getInstance().addRightForAdmins(new RightTuple(ModuleManager.MODULE_DB_RIGHT, true));
154,13 → 149,15
openEmergencyModuleManager("Impossible de configurer les modules requis", e);
return;
}
MenuManager.setInstance((Gestion.isMinimalMode() ? new MinimalMenuConfiguration() : new DefaultMenuConfiguration()).createMenuAndActions());
MenuManager.setInstance(
(Gestion.isMinimalMode() ? new MinimalMenuConfiguration(comptaPropsConfiguration) : new DefaultMenuConfiguration(comptaPropsConfiguration)).createMenuAndActions());
 
final User user = UserManager.getInstance().getCurrentUser();
final UserRights rights = UserRightsManager.getCurrentUserRights();
// Si l'utilisateur n'est pas superUser ou si il n'a pas de droit d'accéder
// à toutes les société
final int userId = user.getId();
if (!user.getRights().isSuperUser() && !user.getRights().haveRight("ACCES_ALL_SOCIETE")) {
if (!rights.haveRight("ACCES_ALL_SOCIETE")) {
 
final SQLTable tableAcces = comptaPropsConfiguration.getRoot().findTable("ACCES_SOCIETE");
SQLSelect sel = new SQLSelect();
197,7 → 194,7
// even for quick login, check the license before displaying the main
// frame
 
MutableListComboPopupListener.setLockOverridable(user.getRights().isSuperUser());
MutableListComboPopupListener.setLockOverridable(rights.isSuperUser());
 
StatusPanel.getInstance().fireStatusChanged();
final MainFrame f = new MainFrame();
289,7 → 286,7
return panelFrame;
}
 
private void initCache(final ComptaPropsConfiguration comptaConf) {
static public void initCache(final ComptaPropsConfiguration comptaConf) {
final SQLBase baseSociete = comptaConf.getSQLBaseSociete();
Thread t = new Thread() {
@Override
314,6 → 311,7
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("JOURNAL"), 600);
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMMERCIAL"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PERIODE_VALIDITE"), 1000);
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TYPE_REGLEMENT"), 1000);
SQLBackgroundTableCache.getInstance().startCacheWatcher();
/trunk/OpenConcerto/src/org/openconcerto/erp/action/TaskAdminAction.java
13,6 → 13,7
package org.openconcerto.erp.action;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.task.ui.UserRightsPrefPanel;
 
27,6 → 28,6
 
@Override
public JFrame createFrame() {
return new PanelFrame(new UserRightsPrefPanel(), (String) getValue(Action.NAME));
return new PanelFrame(new UserRightsPrefPanel(ComptaPropsConfiguration.getInstanceCompta()), (String) getValue(Action.NAME));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DmdAchatDmdPrixEltSQLInjector.java
Nouveau fichier
0,0 → 1,26
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.injector;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInjector;
 
public class DmdAchatDmdPrixEltSQLInjector extends SQLInjector {
public DmdAchatDmdPrixEltSQLInjector(final DBRoot root) {
super(root, "DEMANDE_ACHAT_ELEMENT", "DEMANDE_PRIX_ELEMENT", false);
createDefaultMap();
map(getSource().getKey(), getDestination().getField("ID_DEMANDE_ACHAT_ELEMENT"));
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLCache.java
40,9 → 40,14
 
public class OOXMLCache {
 
private ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess = null;
private Map<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>> cacheReferent = new HashMap<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>>();
private Map<String, Map<Integer, SQLRowAccessor>> cacheForeign = new HashMap<String, Map<Integer, SQLRowAccessor>>();
 
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.postProcess = postProcess;
}
 
protected SQLRowAccessor getForeignRow(SQLRowAccessor row, SQLField field) {
Map<Integer, SQLRowAccessor> c = cacheForeign.get(field.getName());
 
71,7 → 76,7
 
}
 
protected List<? extends SQLRowAccessor> getReferentRows(List<? extends SQLRowAccessor> row, SQLTable tableForeign) {
public List<? extends SQLRowAccessor> getReferentRows(List<? extends SQLRowAccessor> row, SQLTable tableForeign) {
return getReferentRows(row, tableForeign, null, null, false, null, false);
}
 
89,8 → 94,15
} else if (row.size() > 0 && (groupBy == null || groupBy.trim().length() == 0)) {
 
list = new ArrayList<SQLRowAccessor>();
SQLSelect sel = new SQLSelect();
sel.addSelectStar(tableForeign);
// SQLSelect sel = new SQLSelect();
// sel.addSelectStar(tableForeign);
SQLRowValues rowValsToFetch = new SQLRowValues(tableForeign);
rowValsToFetch.putNulls(tableForeign.getFieldsName());
if (tableForeign.getFieldsName().contains("ID_ARTICLE")) {
SQLRowValues rowValsToFetchArt = new SQLRowValues(tableForeign.getForeignTable("ID_ARTICLE"));
rowValsToFetchArt.putNulls(rowValsToFetchArt.getTable().getFieldsName());
rowValsToFetch.put("ID_ARTICLE", rowValsToFetchArt);
}
 
Where w = null;
if (foreignField != null && foreignField.trim().length() > 0) {
118,11 → 130,20
if (excludeQteZero) {
w = w.and(new Where(tableForeign.getField("QTE"), "!=", 0));
}
sel.setWhere(w);
addSelectOrder(tableForeign, orderBy, sel);
System.err.println(sel.asString());
list.addAll(SQLRowListRSH.execute(sel));
final Where wFinal = w;
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValsToFetch);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
@Override
public SQLSelect transformChecked(SQLSelect sel) {
sel.setWhere(wFinal);
addSelectOrder(tableForeign, orderBy, sel);
System.err.println(sel.asString());
return sel;
}
});
 
list.addAll(fetcher.fetch());
 
} else {
 
final List<String> params = SQLRow.toList(groupBy);
167,6 → 188,9
if (expandNomenclature) {
list = expandNomenclature(list);
}
if (this.postProcess != null) {
list = this.postProcess.transformChecked(list);
}
 
if (c == null) {
Map<SQLTable, List<SQLRowAccessor>> map = new HashMap<SQLTable, List<SQLRowAccessor>>();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractJOOReportsSheet.java
174,7 → 174,7
if (ooConnexion == null) {
return;
}
final Component doc = ooConnexion.loadDocument(fileOutOO, !show);
final Component doc = ooConnexion.loadDocument(fileOutOO, true);
 
if (this.savePDF()) {
File pdfOutputDir = DocumentLocalStorageManager.getInstance().getPDFOutputDirectory(getDefaultTemplateID());
191,9 → 191,11
 
} catch (Exception e) {
e.printStackTrace();
ExceptionHandler.handle("Impossible de charger le document OpenOffice", e);
ExceptionHandler.handle("Impossible de créer le document PDF", e);
}
 
if (show) {
FileUtils.openFile(fileOutOO);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetXml.java
25,7 → 25,9
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.print.PrinterJob;
import java.io.BufferedInputStream;
52,6 → 54,12
 
public abstract class SheetXml {
 
private ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess = null;
 
public ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> getPostProcess() {
return postProcess;
}
 
// INSTEAD USE THE PREF IN L.O. CALC --> Formules, toujours recalculer
private boolean refreshFormulasRequired = false;
 
64,6 → 72,15
public String getStoragePath(SheetXml sheet);
}
 
/**
* Post process line
*
* @param postProcess
*/
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.postProcess = postProcess;
}
 
private static StorageDirs STORAGE_DIRS;
 
// allow to redirect all documents
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/ReportingTaxeComplementaireSheetXML.java
Nouveau fichier
0,0 → 1,213
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 19 nov. 2012
*/
package org.openconcerto.erp.generationDoc.gestcomm;
 
import org.openconcerto.erp.generationDoc.AbstractListeSheetXml;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ReportingTaxeComplementaireSheetXML extends AbstractListeSheetXml {
 
public static final String TEMPLATE_ID = "ReportingTaxeComplementaire";
public static final String TEMPLATE_PROPERTY_NAME = DEFAULT_PROPERTY_NAME;
private Date date;
 
private Date dateD, dateF;
 
public ReportingTaxeComplementaireSheetXML(Date debut, Date fin) {
super();
 
this.dateD = debut;
this.dateF = fin;
 
}
 
@Override
public String getStoragePathP() {
return "Autres";
}
 
@Override
public String getDefaultTemplateId() {
return TEMPLATE_ID;
}
 
@Override
public String getName() {
if (this.date == null) {
this.date = new Date();
}
return "ReportingTaxeCompl" + this.date.getTime();
}
 
@Override
protected void createListeValues() {
 
this.mapAllSheetValues = new HashMap<Integer, Map<String, Object>>();
this.listAllSheetValues = new HashMap<Integer, List<Map<String, Object>>>();
this.styleAllSheetValues = new HashMap<Integer, Map<Integer, String>>();
 
fillSynthese();
 
}
 
private static SQLTable tableVF = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE").getTable();
 
class TaxeComplRecap {
private final String code, nom;
private BigDecimal percentTaxe, totalBase, qte;
 
public TaxeComplRecap(String code, String nom, BigDecimal percentTaxe) {
this.code = code;
this.nom = nom;
this.qte = BigDecimal.ZERO;
this.percentTaxe = percentTaxe;
this.totalBase = BigDecimal.ZERO;
}
 
public void cumul(BigDecimal qte, BigDecimal total) {
this.qte = qte.add(this.qte);
this.totalBase = total.add(this.totalBase);
}
 
public String getCode() {
return code;
}
 
public String getNom() {
return nom;
}
 
public BigDecimal getQte() {
return qte;
}
 
public BigDecimal getPercentTaxe() {
return percentTaxe;
 
}
 
public BigDecimal getTotalBase() {
return totalBase;
}
 
public BigDecimal getTotalTaxe() {
return this.totalBase.multiply(this.percentTaxe.movePointLeft(2)).setScale(2, RoundingMode.HALF_UP);
}
 
public BigDecimal getTotalBaseHT() {
return this.totalBase.subtract(getTotalTaxe());
}
}
 
private void fillSynthese() {
final SQLTable tableVF = Configuration.getInstance().getRoot().findTable("SAISIE_VENTE_FACTURE");
final SQLTable tableVFElt = Configuration.getInstance().getRoot().findTable("SAISIE_VENTE_FACTURE_ELEMENT");
 
SQLRowValues rowvalsVF = new SQLRowValues(tableVF);
rowvalsVF.put("NUMERO", null);
rowvalsVF.put("DATE", null);
 
SQLRowValues rowvalsVFElt = new SQLRowValues(tableVFElt);
rowvalsVFElt.put("ID_SAISIE_VENTE_FACTURE", rowvalsVF);
rowvalsVFElt.put("T_PV_HT", null);
rowvalsVFElt.put("QTE", null);
rowvalsVFElt.put("QTE_UNITAIRE", null);
rowvalsVFElt.putRowValues("ID_ARTICLE").putRowValues("ID_TAXE_COMPLEMENTAIRE").putNulls("CODE", "NOM", "POURCENT");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowvalsVFElt);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getAlias(tableVF).getField("DATE"), dateD, dateF);
input.setWhere(w);
return input;
}
});
 
Map<Integer, TaxeComplRecap> recap = new HashMap<Integer, ReportingTaxeComplementaireSheetXML.TaxeComplRecap>();
List<SQLRowValues> results = fetcher.fetch();
for (SQLRowValues sqlRowValues : results) {
TaxeComplRecap r;
if (sqlRowValues.getForeign("ID_ARTICLE") != null && !sqlRowValues.isForeignEmpty("ID_ARTICLE")) {
final SQLRowAccessor foreignArt = sqlRowValues.getForeign("ID_ARTICLE");
if (foreignArt.getForeign("ID_TAXE_COMPLEMENTAIRE") != null && !foreignArt.isForeignEmpty("ID_TAXE_COMPLEMENTAIRE")) {
final SQLRowAccessor foreignTaxeCompl = foreignArt.getForeign("ID_TAXE_COMPLEMENTAIRE");
if (recap.containsKey(foreignTaxeCompl.getID())) {
r = recap.get(foreignTaxeCompl.getID());
} else {
r = new TaxeComplRecap(foreignTaxeCompl.getString("CODE"), foreignTaxeCompl.getString("NOM"), foreignTaxeCompl.getBigDecimal("POURCENT"));
recap.put(foreignTaxeCompl.getID(), r);
}
r.cumul(sqlRowValues.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRowValues.getInt("QTE"))), sqlRowValues.getBigDecimal("T_PV_HT"));
}
}
}
 
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
this.listAllSheetValues.put(0, values);
Map<Integer, String> style = new HashMap<Integer, String>();
this.styleAllSheetValues.put(0, style);
 
BigDecimal totalBaseHT = BigDecimal.ZERO;
BigDecimal totalTaxe = BigDecimal.ZERO;
BigDecimal qteTotal = BigDecimal.ZERO;
 
for (TaxeComplRecap item : recap.values()) {
Map<String, Object> vals = new HashMap<String, Object>();
 
vals.put("CODE", item.getCode());
vals.put("NOM", item.getNom());
vals.put("QTE", item.getQte());
vals.put("POURCENT", item.getPercentTaxe());
vals.put("TOTAL_BASE", item.getTotalBaseHT());
vals.put("TOTAL_TAXE", item.getTotalTaxe());
style.put(values.size(), "Normal");
totalBaseHT = totalBaseHT.add(item.getTotalBaseHT());
totalTaxe = totalTaxe.add(item.getTotalTaxe());
qteTotal = qteTotal.add(item.getQte());
values.add(vals);
}
 
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Map<String, Object> vals = new HashMap<String, Object>();
vals.put("DATE_DEB", this.dateD);
vals.put("DATE_FIN", this.dateF);
vals.put("PERIODE", "Période du " + format.format(this.dateD) + " au " + format.format(this.dateF));
vals.put("TOTAL_TAXE", totalTaxe);
vals.put("TOTAL_BASE", totalBaseHT);
vals.put("TOTAL_QTE", qteTotal);
this.mapAllSheetValues.put(0, vals);
// style.put(values.size(), "Titre 1");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/BonReceptionXmlSheet.java
25,7 → 25,7
public class BonReceptionXmlSheet extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "BonReception";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBon";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBonR";
 
@Override
public SQLRow getRowLanguage() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/FactureFournisseurXmlSheet.java
25,7 → 25,7
public class FactureFournisseurXmlSheet extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "FactureFournisseur";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBon";
public static final String TEMPLATE_PROPERTY_NAME = "LocationFactureFournisseur";
 
@Override
public SQLRow getRowLanguage() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLField.java
311,7 → 311,6
listOfExpectedValues = SQLRow.toList(this.elt.getAttributeValue("valuesExpected"));
}
 
String stringValue = (result == null) ? "" : result.toString();
if (typeComp != null && typeComp.trim().length() > 0) {
 
// Type spécial
324,6 → 323,9
sel.setWhere(w);
return this.row.getTable().getBase().getDataSource().executeScalar(sel.asString());
} else if (typeComp.equalsIgnoreCase("Devise")) {
if (result == null) {
return "";
}
Number prix = (Number) result;
if (listOfExpectedValues != null) {
for (String string : listOfExpectedValues) {
346,6 → 348,7
return result;
}
} else if (typeComp.equalsIgnoreCase("cumulPaye")) {
assertNonNull(typeComp, result, field, this.row);
double val = ((Number) result).doubleValue();
double valC;
if (this.row.getTable().getFieldsName().contains("ID_CUMULS_PAYE")) {
356,11 → 359,13
}
return new Double(val + valC);
} else if (typeComp.equalsIgnoreCase("cumulConges")) {
assertNonNull(typeComp, result, field, this.row);
double val = ((Number) result).doubleValue();
SQLRowAccessor refRow = this.row.getReferentRows(this.row.getTable().getTable("FICHE_PAYE")).iterator().next();
double valC = ((Number) refRow.getObject("CONGES_ACQUIS")).doubleValue();
return new Double(val + valC);
} else if (typeComp.equalsIgnoreCase("globalAcompte")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
int pourcent = this.row.getInt("POURCENT_ACOMPTE");
long l = Math.round(prix.longValue() / (pourcent / 100.0));
388,6 → 393,7
final long cumulPrecedent = getCumulPrecedent(this.row);
return new Double(GestionDevise.currencyToString(cumulPrecedent, false));
} else if (typeComp.equalsIgnoreCase("DeviseLettre")) {
assertNonNull(typeComp, result, field, this.row);
// Devise exprimée en lettre
Long prix = (Long) result;
String deviseLabel = this.elt.getAttributeValue("deviseLabel");
400,18 → 406,21
}
return getLettreFromDevise(prix.longValue(), Nombre.FR, Tuple2.create(deviseLabel, deviseCentLabel));
} else if (typeComp.equalsIgnoreCase("DeviseLettreEng")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.EN);
} else if (typeComp.equalsIgnoreCase("DeviseLettrePL")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.PL);
} else if (typeComp.equalsIgnoreCase("DeviseLettreES")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.ES);
} else if (typeComp.equalsIgnoreCase("VilleFull")) {
return this.row.getString("CODE_POSTAL") + " " + this.row.getString("VILLE");
} else if (typeComp.equalsIgnoreCase("Ville")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
return stringValue;
} else if (typeComp.equalsIgnoreCase("Traduction")) {
return getTraduction();
433,7 → 442,7
return getDateEcheance(idModeReglement, d, this.elt.getAttributeValue("datePattern"));
} else if (typeComp.equalsIgnoreCase("Jour")) {
int day = this.row.getInt(field);
stringValue = "le " + String.valueOf(day);
String stringValue = "le " + String.valueOf(day);
if (day == 31) {
return "fin de mois";
} else if (day == 0) {
455,13 → 464,13
return "";
}
} else if (typeComp.equalsIgnoreCase("initiale")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
if (stringValue.trim().length() > 0) {
stringValue = String.valueOf(stringValue.charAt(0));
}
return stringValue;
} else if (typeComp.equalsIgnoreCase("initiale2")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
if (stringValue.trim().length() > 0) {
stringValue = String.valueOf(stringValue.substring(0, 2));
}
473,6 → 482,12
return (result == null) ? "" : result;
}
 
private void assertNonNull(String type, Object result, String field, SQLRowAccessor row) {
if (result == null) {
throw new IllegalArgumentException("null value for " + type + " for field " + field + " in row : " + row.asRowValues().toString());
}
}
 
private Object getDeviseLettre(Long prix, int country) {
String deviseLabel = this.elt.getAttributeValue("deviseLabel");
if (deviseLabel == null || deviseLabel.trim().length() == 0) {
683,7 → 698,10
} else {
d2 = (o2 == null) ? BigDecimal.ZERO : new BigDecimal(o2.toString());
}
 
// Exemple cmdcliet.total - cmdclient.acompte
if (o1 != null && o1 instanceof Long && o2 != null && o2 instanceof BigDecimal) {
d2 = d2.movePointRight(2);
}
if (op.equalsIgnoreCase("+")) {
return d1.add(d2, DecimalUtils.HIGH_PRECISION);
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
26,6 → 26,8
import org.openconcerto.openoffice.spreadsheet.SpreadSheet;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
34,6 → 36,7
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.StreamUtils;
import org.openconcerto.utils.Tuple2;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.Point;
import java.io.File;
46,7 → 49,6
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
88,6 → 90,10
this.row = row;
}
 
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.rowRefCache.setPostProcess(postProcess);
}
 
public synchronized File createDocument(String templateId, String typeTemplate, File outputDirectory, final String expectedFileName, SQLRow rowLanguage) {
return createDocument(templateId, typeTemplate, outputDirectory, expectedFileName, rowLanguage, null);
}
374,6 → 380,8
// BigDecimal portHT, SQLRow rowTVAPort, SQLTable tableEchantillon,
// SQLRow defaultCompte) {
SQLTable tableElt = Configuration.getInstance().getRoot().findTable(tableau.getAttributeValue("table"));
SQLBackgroundTableCacheItem cacheItem = SQLBackgroundTableCache.getInstance().getCacheForTable(tableElt.getTable("COMPTE_PCE"));
SQLBackgroundTableCacheItem prefsCpt = SQLBackgroundTableCache.getInstance().getCacheForTable(tableElt.getTable("PREFS_COMPTE"));
if (tableElt.contains("ID_TAXE") && tableElt.contains("T_PA_HT")) {
boolean achat = tableElt.contains("T_PA_TTC");
TotalCalculator calc = new TotalCalculator("T_PA_HT", achat ? "T_PA_HT" : "T_PV_HT", null, achat, null);
382,13 → 390,13
 
calc.setServiceActive(bServiceActive != null && bServiceActive);
if (row.getTable().contains("ID_COMPTE_PCE_SERVICE") && !row.isForeignEmpty("ID_COMPTE_PCE_SERVICE")) {
SQLRowAccessor serviceCompte = row.getForeign("ID_COMPTE_PCE_SERVICE");
SQLRowAccessor serviceCompte = cacheItem.getRowFromId(row.getForeignID("ID_COMPTE_PCE_SERVICE"));
if (!serviceCompte.isUndefined()) {
calc.setRowDefaultCptService(serviceCompte);
}
}
if (row.getTable().contains("ID_COMPTE_PCE_VENTE") && !row.isForeignEmpty("ID_COMPTE_PCE_VENTE")) {
SQLRowAccessor produitCompte = row.getForeign("ID_COMPTE_PCE_VENTE");
SQLRowAccessor produitCompte = cacheItem.getRowFromId(row.getForeignID("ID_COMPTE_PCE_VENTE"));
if (!produitCompte.isUndefined()) {
calc.setRowDefaultCptProduit(produitCompte);
}
396,9 → 404,6
long remise = 0;
BigDecimal totalAvtRemise = BigDecimal.ZERO;
SQLTable tableEchantillon = null;
if (row.getTable().getName().equalsIgnoreCase("SAISIE_VENTE_FACTURE") && row.getTable().getDBRoot().contains("ECHANTILLON_ELEMENT")) {
tableEchantillon = row.getTable().getTable("ECHANTILLON_ELEMENT");
}
if (row.getTable().contains("REMISE_HT")) {
remise = row.getLong("REMISE_HT");
if (remise != 0) {
409,7 → 414,7
if (tableEchantillon != null) {
List<SQLRow> rowsEch = row.getReferentRows(tableEchantillon);
for (SQLRow sqlRow : rowsEch) {
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), TaxeCache.getCache().getRowFromId(sqlRow.getForeignID("ID_TAXE")));
}
}
calc.checkResult();
440,12 → 445,12
if (tableEchantillon != null) {
List<SQLRow> rowsEch = row.getReferentRows(tableEchantillon);
for (SQLRow sqlRow : rowsEch) {
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), TaxeCache.getCache().getRowFromId(sqlRow.getForeignID("ID_TAXE")));
}
}
SQLRowAccessor rowTVAPort = null;
if (row.getTable().contains("ID_TAXE_PORT")) {
rowTVAPort = row.getForeign("ID_TAXE_PORT");
rowTVAPort = TaxeCache.getCache().getRowFromId(row.getForeignID("ID_TAXE_PORT"));
}
if (rowTVAPort != null && !rowTVAPort.isUndefined()) {
SQLRowValues rowValsPort = new SQLRowValues(tableElt);
453,11 → 458,10
rowValsPort.put("QTE", 1);
rowValsPort.put("ID_TAXE", rowTVAPort.getIDNumber());
 
final SQLTable tablePrefCompte = Configuration.getInstance().getRoot().findTable("PREFS_COMPTE");
final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
final SQLRow rowPrefsCompte = prefsCpt.getRowFromId(2);
SQLRow rowDefaultCptPort;
if (rowTVAPort.getFloat("TAUX") > 0) {
rowDefaultCptPort = rowPrefsCompte.getForeign("ID_COMPTE_PCE_PORT_SOUMIS");
rowDefaultCptPort = cacheItem.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_PORT_SOUMIS"));
if (rowDefaultCptPort == null || rowDefaultCptPort.isUndefined()) {
try {
rowDefaultCptPort = ComptePCESQLElement.getRowComptePceDefault("PortVenteSoumisTVA");
466,7 → 470,7
}
}
} else {
rowDefaultCptPort = rowPrefsCompte.getForeign("ID_COMPTE_PCE_PORT_NON_SOUMIS");
rowDefaultCptPort = cacheItem.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_PORT_NON_SOUMIS"));
if (rowDefaultCptPort == null || rowDefaultCptPort.isUndefined()) {
try {
rowDefaultCptPort = ComptePCESQLElement.getRowComptePceDefault("PortVenteNonSoumisTVA");
504,7 → 508,7
int currentLineTmp = tableElement.getFirstLine();
int currentLine = tableElement.getFirstLine();
 
SQLElement styleElt = Configuration.getInstance().getDirectory().getElement("STYLE");
StyleSQLElement styleElt = Configuration.getInstance().getDirectory().getElement(StyleSQLElement.class);
 
boolean cache = false;
String ref = tableau.getAttributeValue("table") + "_" + row.getTable().getName() + row.getID();
523,7 → 527,7
final boolean included = isIncluded(tableElement.getFilterId(), tableElement.getForeignTableWhere(), tableElement.getFilterId(), tableElement.getFieldWhere(), rowElt);
String styleName = null;
if (tableElement.getSQLElement().getTable().contains("ID_STYLE")) {
styleName = styleElt.getTable().getRow(rowElt.getForeignID("ID_STYLE")).getString("NOM");
styleName = styleElt.getAllStyleByIds().get(rowElt.getForeignID("ID_STYLE"));
}
 
if ((included || tableElement.getTypeStyleWhere()) && (styleName == null || !styleName.equalsIgnoreCase("Invisible"))) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractSheetXml.java
62,6 → 62,7
templateStream.close();
}
final OOgenerationXML oXML = new OOgenerationXML(AbstractSheetXml.this.row);
oXML.setPostProcess(getPostProcess());
AbstractSheetXml.this.generatedOpenDocumentFile = oXML.createDocument(templateId, getType(), getDocumentOutputDirectory(), getValidFileName(getName()), getRowLanguage(),
AbstractSheetXml.this.getMetaGeneration());
if (isRefreshFormulasRequired()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PaiementRemainedProvider.java
57,7 → 57,7
}
if (r.getTable().contains("ACOMPTE_COMMANDE") && r.getBigDecimal("ACOMPTE_COMMANDE") != null) {
long totalAcompte = r.getBigDecimal("ACOMPTE_COMMANDE").movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
if (totalEch > totalAcompte) {
if (totalEch >= totalAcompte) {
totalEch -= totalAcompte;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/ArticleCodeClientProvider.java
Nouveau fichier
0,0 → 1,70
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProvider;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
 
import java.util.Arrays;
import java.util.List;
 
public class ArticleCodeClientProvider implements SpreadSheetCellValueProvider {
 
final private String parentTableField, field;
 
public ArticleCodeClientProvider(String parentTableField, String field) {
this.parentTableField = parentTableField;
this.field = field;
}
 
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
int idClient = row.getForeign(this.parentTableField).getForeignID("ID_CLIENT");
SQLSelect sel = new SQLSelect();
final SQLTable tableCodeClient = row.getTable().getTable("ARTICLE_CODE_CLIENT");
sel.addSelectStar(tableCodeClient);
Where w = new Where(tableCodeClient.getField("ID_ARTICLE"), "=", row.getForeignID("ID_ARTICLE"));
w = w.and(new Where(tableCodeClient.getField("ID_CLIENT"), "=", idClient));
sel.setWhere(w);
List<SQLRow> result = SQLRowListRSH.execute(sel);
if (result.size() > 0) {
final String val = result.get(0).getString(this.field);
if (val.length() > 0) {
return val;
}
}
}
return row.getString(this.field);
}
 
public static void register() {
List<String> fields = Arrays.asList("CODE", "NOM");
for (String string : fields) {
SpreadSheetCellValueProviderManager.put("sales.customer.product.quote." + string.toLowerCase(), new ArticleCodeClientProvider("ID_DEVIS", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.shipment." + string.toLowerCase(), new ArticleCodeClientProvider("ID_BON_DE_LIVRAISON", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.order." + string.toLowerCase(), new ArticleCodeClientProvider("ID_COMMANDE_CLIENT", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.invoice." + string.toLowerCase(), new ArticleCodeClientProvider("ID_SAISIE_VENTE_FACTURE", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.credit." + string.toLowerCase(), new ArticleCodeClientProvider("ID_AVOIR_CLIENT", string));
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementVenteNG.java
22,6 → 22,7
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
31,6 → 32,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.utils.cc.ITransformer;
 
import java.sql.SQLException;
316,8 → 318,11
private void paiementCheque(Date dateEch, SQLRow source, PrixTTC ttc, SQLRow rowClient, SQLRow modeRegl, SQLRow mvtSource, boolean avance) throws Exception {
 
SQLRowValues valCheque = new SQLRowValues(base.getTable("CHEQUE_A_ENCAISSER"));
SQLPreferences prefs = SQLPreferences.getMemCached(valCheque.getTable().getDBRoot());
boolean createEcr = prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CREATE_ECR_CHQ, true);
 
valCheque.put("ID_CLIENT", rowClient.getID());
 
valCheque.put("SANS_VALEUR_ENCAISSEMENT", !createEcr);
final String foreignBanqueFieldName = "ID_" + BanqueSQLElement.TABLENAME;
if (valCheque.getTable().contains(foreignBanqueFieldName))
valCheque.put(foreignBanqueFieldName, modeRegl.getInt(foreignBanqueFieldName));
339,40 → 344,43
rowVals.update(this.idMvt);
}
 
int idCompteClient = rowClient.getInt("ID_COMPTE_PCE");
if (avance) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_AVANCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("AvanceClients");
}
} else {
if (createEcr) {
int idCompteClient = rowClient.getInt("ID_COMPTE_PCE");
if (avance) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_AVANCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("AvanceClients");
}
} else {
 
// compte Clients
// compte Clients
 
if (idCompteClient <= 1) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("Clients");
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("Clients");
}
}
}
}
this.mEcritures.put("ID_JOURNAL", JournalSQLElement.BANQUES);
this.mEcritures.put("ID_COMPTE_PCE", idCompteClient);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(ttc.getLongValue()));
 
this.ecrClient = ajoutEcriture();
this.mEcritures.put("ID_JOURNAL", JournalSQLElement.BANQUES);
this.mEcritures.put("ID_COMPTE_PCE", idCompteClient);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(ttc.getLongValue()));
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = rowPrefsCompte.getInt("ID_COMPTE_PCE_VALEUR_ENCAISSEMENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("ValeurEncaissement");
this.ecrClient = ajoutEcriture();
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = rowPrefsCompte.getInt("ID_COMPTE_PCE_VALEUR_ENCAISSEMENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("ValeurEncaissement");
}
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
this.mEcritures.put("DEBIT", Long.valueOf(ttc.getLongValue()));
this.mEcritures.put("CREDIT", Long.valueOf(0));
 
ajoutEcriture();
}
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
this.mEcritures.put("DEBIT", Long.valueOf(ttc.getLongValue()));
this.mEcritures.put("CREDIT", Long.valueOf(0));
 
ajoutEcriture();
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementAvoir.java
17,6 → 17,7
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
92,13 → 93,16
ajoutEcriture();
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = typeRegRow.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteRegl <= 1) {
if (typeRegRow.getID() == TypeReglementSQLElement.ESPECE) {
int idCompteRegl = typeRegRow.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("VenteEspece");
}
 
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("VenteCB");
 
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
} else {
fillCompteBanqueFromRow(modeRegRow, "VenteCB", false);
}
this.mEcritures.put("ID_COMPTE_PCE", new Integer(idCompteRegl));
this.mEcritures.put("DEBIT", new Long(0));
this.mEcritures.put("CREDIT", new Long(prixTTC.getLongValue()));
ajoutEcriture();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtSaisieVenteFacture.java
127,9 → 127,6
}
 
SQLTable tableEchantillon = null;
if (saisieVFTable.getDBRoot().contains("ECHANTILLON_ELEMENT")) {
tableEchantillon = saisieVFTable.getTable("ECHANTILLON_ELEMENT");
}
BigDecimal portHT = BigDecimal.valueOf(saisieRow.getLong("PORT_HT")).movePointLeft(2);
TotalCalculator calc;
if (clientRow.getTable().contains("ID_COMPTE_PCE_PRODUIT") && !clientRow.isForeignEmpty("ID_COMPTE_PCE_PRODUIT")) {
138,29 → 135,37
} else {
calc = getValuesFromElement(saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, saisieRow.getForeign("ID_TAXE_PORT"), tableEchantillon);
}
Map<SQLRowAccessor, BigDecimal> compl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
ajoutEcriture();
 
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
this.mEcritures.put("CREDIT", Long.valueOf(0));
ajoutEcriture();
}
}
// On génére les ecritures si la facture n'est pas un acompte
long ttcLongValue = calc.getTotalTTC().movePointRight(2).longValue();
if (acompte == null || !acompte) {
 
Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> taxeCompl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor row : calc.getMapHt().keySet()) {
long b = calc.getMapHt().get(row).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
if (b != 0) {
final Integer idComptePCE;
long taxe = 0;
 
if (taxeCompl.containsKey(row)) {
Map<SQLRowAccessor, BigDecimal> compl = taxeCompl.get(row);
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
ajoutEcriture();
taxe += taxeC;
// this.mEcritures.put("ID_COMPTE_PCE",
// rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
// this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// ajoutEcriture();
}
}
}
// TODO check if taxe compl > b
if (this.useComptePCEVente) {
// Utilise le compte de la facture
idComptePCE = saisieRow.getInt("ID_COMPTE_PCE_VENTE");
167,9 → 172,10
} else {
idComptePCE = Integer.valueOf(row.getID());
}
 
this.mEcritures.put("ID_COMPTE_PCE", idComptePCE);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(b));
this.mEcritures.put("CREDIT", Long.valueOf(b - taxe));
ajoutEcriture();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtFichePaye.java
27,6 → 27,8
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.Tuple2;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
35,8 → 37,6
import java.util.Map;
import java.util.Map.Entry;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
 
public final class GenerationMvtFichePaye extends GenerationEcritures implements Runnable {
 
private int[] idFichePaye;
114,16 → 114,43
}
// Salaire Brut Debit
// float totalSalaireBrut = 0.0F;
// Salaire Brut Debit
for (int i = 0; i < this.idFichePaye.length; i++) {
BigDecimal totalSalaireBrut = BigDecimal.ZERO;
 
// on recupere les élements de la fiche
// ensemble des net
SQLSelect selAllFicheElt = new SQLSelect();
 
selAllFicheElt.addSelectStar(tableFichePayeElt);
 
Where w = new Where(tableFichePayeElt.getField("ID_FICHE_PAYE"), "=", this.idFichePaye[i]);
w = w.and(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_BRUT"));
 
selAllFicheElt.setWhere(w);
selAllFicheElt.addFieldOrder(tableFichePayeElt.getField("POSITION"));
List<SQLRow> resultElt = SQLRowListRSH.execute(selAllFicheElt);
 
for (SQLRow row : resultElt) {
 
if (row.getBigDecimal("MONTANT_SAL_DED") != null) {
totalSalaireBrut = totalSalaireBrut.subtract(row.getBigDecimal("MONTANT_SAL_DED"));
}
 
if (row.getBigDecimal("MONTANT_SAL_AJ") != null) {
totalSalaireBrut = totalSalaireBrut.add(row.getBigDecimal("MONTANT_SAL_AJ"));
}
}
 
SQLRow rowFiche = tableFichePaye.getRow(this.idFichePaye[i]);
SQLRow rowSal = tableSalarie.getRow(rowFiche.getInt("ID_SALARIE"));
this.mEcritures.put("NOM", rowSal.getString("NOM") + " " + this.nom);
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idComptePaye));
 
float sal = rowFiche.getFloat("SAL_BRUT");
// float sal = rowFiche.getFloat("SAL_BRUT");
// totalSalaireBrut += sal;
 
this.mEcritures.put("DEBIT", Long.valueOf(GestionDevise.parseLongCurrency(String.valueOf(sal))));
this.mEcritures.put("DEBIT", totalSalaireBrut.setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue());
this.mEcritures.put("CREDIT", Long.valueOf(0));
ajoutEcriture();
}
196,10 → 223,10
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", -montant);
ajoutEcriture();
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// this.mEcritures.put("DEBIT", -montant);
// this.mEcritures.put("ID_COMPTE_PCE", idComptePayeRegl);
// ajoutEcriture();
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// this.mEcritures.put("DEBIT", -montant);
// this.mEcritures.put("ID_COMPTE_PCE", idComptePayeRegl);
// ajoutEcriture();
}
}
}
206,8 → 233,34
 
}
 
// Salaire Brut Credit
// Salaire Net Credit
for (int i = 0; i < this.idFichePaye.length; i++) {
BigDecimal totalSalaireNet = BigDecimal.ZERO;
 
// on recupere les élements de la fiche
// ensemble des net
SQLSelect selAllFicheElt = new SQLSelect();
 
selAllFicheElt.addSelectStar(tableFichePayeElt);
 
Where w = new Where(tableFichePayeElt.getField("ID_FICHE_PAYE"), "=", this.idFichePaye[i]);
w = w.and(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_NET")
.or(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_BRUT").or(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_COTISATION"))));
 
selAllFicheElt.setWhere(w);
selAllFicheElt.addFieldOrder(tableFichePayeElt.getField("POSITION"));
List<SQLRow> resultElt = SQLRowListRSH.execute(selAllFicheElt);
 
for (SQLRow row : resultElt) {
 
if (row.getBigDecimal("MONTANT_SAL_DED") != null) {
totalSalaireNet = totalSalaireNet.subtract(row.getBigDecimal("MONTANT_SAL_DED"));
}
 
if (row.getBigDecimal("MONTANT_SAL_AJ") != null) {
totalSalaireNet = totalSalaireNet.add(row.getBigDecimal("MONTANT_SAL_AJ"));
}
}
SQLRow rowFiche = tableFichePaye.getRow(this.idFichePaye[i]);
SQLRow rowSal = tableSalarie.getRow(rowFiche.getInt("ID_SALARIE"));
SQLRow rowRegl = tableReglementPaye.getRow(rowSal.getInt("ID_REGLEMENT_PAYE"));
218,10 → 271,10
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idComptePayeRegl));
this.mEcritures.put("NOM", rowSal.getString("NOM") + " " + this.nom);
 
float sal = rowFiche.getFloat("NET_A_PAYER");
// float sal = rowFiche.getFloat("NET_A_PAYER");
 
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(GestionDevise.parseLongCurrency(String.valueOf(sal))));
this.mEcritures.put("CREDIT", totalSalaireNet.setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue());
ajoutEcriture();
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementChequeClient.java
19,6 → 19,7
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
 
33,12 → 34,14
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private static final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
private int idCheque;
private SQLRowAccessor banque;
 
public GenerationMvtReglementChequeClient(int idMvt, long montant, Date d, int idCheque, String s) {
public GenerationMvtReglementChequeClient(int idMvt, long montant, Date d, int idCheque, String s, SQLRowAccessor banque) {
this.montant = montant;
this.date = d;
this.idMvt = idMvt;
this.idCheque = idCheque;
this.banque = banque;
SQLRow chequeRow = base.getTable("CHEQUE_A_ENCAISSER").getRow(this.idCheque);
String num = "";
if (chequeRow != null && !chequeRow.isUndefined() && chequeRow.getString("NUMERO").trim().length() > 0) {
62,7 → 65,12
this.mEcritures.put("NOM", this.nom);
this.mEcritures.put("ID_MOUVEMENT", new Integer(this.idMvt));
 
fillJournalBanqueFromRow(chequeRow);
if (this.banque == null || this.banque.isUndefined() || this.banque.isForeignEmpty("ID_JOURNAL")) {
fillJournalBanqueFromRow(chequeRow);
} else {
int idJrnl = this.banque.getForeignID("ID_JOURNAL");
this.mEcritures.put("ID_JOURNAL", idJrnl);
}
 
setDateReglement(this.idCheque, this.date);
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtAvoirClient.java
104,28 → 104,34
} else {
calc = getValuesFromElement(avoirRow, avoirRow.getTable().getTable("AVOIR_CLIENT_ELEMENT"), portHT, null, null);
}
Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> taxeCompl = calc.getMapHtTaxeCompl();
 
Map<SQLRowAccessor, BigDecimal> compl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("CREDIT", Long.valueOf(0));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
ajoutEcriture();
 
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
this.mEcritures.put("DEBIT", Long.valueOf(0));
ajoutEcriture();
}
}
 
for (SQLRowAccessor row : calc.getMapHt().keySet()) {
long b = calc.getMapHt().get(row).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
if (b != 0) {
long taxe = 0;
 
if (taxeCompl.containsKey(row)) {
Map<SQLRowAccessor, BigDecimal> compl = taxeCompl.get(row);
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("CREDIT", Long.valueOf(0));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
ajoutEcriture();
taxe += taxeC;
// this.mEcritures.put("ID_COMPTE_PCE",
// rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
// this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
// this.mEcritures.put("DEBIT", Long.valueOf(0));
// ajoutEcriture();
}
}
}
 
this.mEcritures.put("ID_COMPTE_PCE", row.getID());
this.mEcritures.put("DEBIT", Long.valueOf(b));
this.mEcritures.put("DEBIT", Long.valueOf(b - taxe));
this.mEcritures.put("CREDIT", Long.valueOf(0));
SQLRow rowEcr = ajoutEcriture();
// addAssocAnalytiqueFromProvider(rowEcr, avoirRow);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/history/ui/ListeHistoriquePanel.java
30,7 → 30,9
import org.openconcerto.sql.model.SQLFieldsSet;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
43,6 → 45,7
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.Color;
import java.awt.Font;
181,6 → 184,11
this(title, req, listTableOnglet, panelBottom, listFieldMap, undefinedLabel, false, where, null);
}
 
public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap,
String undefinedLabel, final boolean sourceWithOutTransformer, Where where, SQLTableModelSourceOnline tableSource) {
this(title, req, listTableOnglet, panelBottom, listFieldMap, undefinedLabel, sourceWithOutTransformer, where, tableSource, null);
}
 
// TODO verifier que les tables contiennent bien la clef etrangere
/**
* @param title titre de la JList
194,7 → 202,7
* @param where
*/
public ListeHistoriquePanel(final String title, final ComboSQLRequest req, Map<String, List<String>> listTableOnglet, JPanel panelBottom, Map<SQLTable, SQLField> listFieldMap,
String undefinedLabel, final boolean sourceWithOutTransformer, Where where, SQLTableModelSourceOnline tableSource) {
String undefinedLabel, final boolean sourceWithOutTransformer, final Where where, SQLTableModelSourceOnline tableSource, Map<String, String> splitWithField) {
super();
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
228,105 → 236,166
for (int i = 0; i < listPanelTable.size(); i++) {
final SQLElement elt = Configuration.getInstance().getDirectory().getElement(listPanelTable.get(i));
 
IListPanel liste;
final SQLTableModelSourceOnline createTableSource;
if (tableSource == null) {
createTableSource = elt.getTableSource(true);
List<SQLRow> splitter = new ArrayList<SQLRow>();
 
final String splitField = (splitWithField == null ? null : splitWithField.get(elt.getTable().getName()));
if (splitField != null) {
SQLTable tableSplit = elt.getTable().getForeignTable(splitField);
SQLSelect sel = new SQLSelect();
sel.addSelectStar(tableSplit);
List<SQLRow> result = SQLRowListRSH.execute(sel);
splitter.addAll(result);
} else {
createTableSource = tableSource;
splitter.add(null);
}
final ListSQLRequest request = createTableSource.getReq();
if (sourceWithOutTransformer) {
request.setSelectTransf(null);
}
if (where != null) {
if (new SQLFieldsSet(where.getFields()).getTables().contains(request.getPrimaryTable())) {
request.setWhere(where);
JTabbedPane tabbed = new JTabbedPane();
for (int splitIndex = 0; splitIndex < splitter.size(); splitIndex++) {
final SQLRow sqlRow = splitter.get(splitIndex);
IListPanel liste;
final SQLTableModelSourceOnline createTableSource;
if (tableSource == null) {
createTableSource = elt.getTableSource(true);
} else {
createTableSource = tableSource;
}
} else {
// Evite de charger les listes completes à la création de la fenetre
request.setWhere(Where.FALSE);
}
final ListSQLRequest request = createTableSource.getReq();
if (sourceWithOutTransformer) {
request.setSelectTransf(null);
}
if (sqlRow != null) {
if (splitIndex == 0) {
request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
if (elt.getTable().contains("ID_MOUVEMENT")) {
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getID());
Where w2 = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getTable().getUndefinedID());
w2 = w2.or(new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", (Object) null));
input.setWhere(w.or(w2));
return input;
}
});
} else {
request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
liste = new ListeGestCommEltPanel(elt, new IListe(createTableSource), "historique-" + title) {
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getTable(createTableSource.getPrimaryTable().getName()).getField(splitField), "=", sqlRow.getID());
input.setWhere(w);
return input;
}
});
}
}
if (where != null) {
if (new SQLFieldsSet(where.getFields()).getTables().contains(request.getPrimaryTable())) {
request.setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
protected void handleAction(JButton source, ActionEvent evt) {
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.setWhere(where);
return input;
}
});
// request.setWhere(where);
}
} else {
// Evite de charger les listes completes à la création de la fenetre
request.setWhere(Where.FALSE);
}
 
if (elt.getTable().contains("ID_MOUVEMENT")) {
SQLRow row = getListe().fetchSelectedRow();
if (source == this.buttonModifier) {
MouvementSQLElement.showSource(row.getInt("ID_MOUVEMENT"));
} else {
if (source == this.buttonEffacer) {
PanelFrame f = new PanelFrame(new SuppressionEcrituresPanel(row.getInt("ID_MOUVEMENT")), "Suppresion d'une pièce");
f.setLocationRelativeTo(null);
f.setResizable(false);
f.setVisible(true);
if (elt.getTable().contains("ID_MOUVEMENT")) {
 
liste = new ListeGestCommEltPanel(elt, new IListe(createTableSource), "historique-" + title) {
 
protected void handleAction(JButton source, ActionEvent evt) {
 
if (elt.getTable().contains("ID_MOUVEMENT")) {
SQLRow row = getListe().fetchSelectedRow();
if (source == this.buttonModifier) {
MouvementSQLElement.showSource(row.getInt("ID_MOUVEMENT"));
} else {
super.handleAction(source, evt);
if (source == this.buttonEffacer) {
PanelFrame f = new PanelFrame(new SuppressionEcrituresPanel(row.getInt("ID_MOUVEMENT")), "Suppresion d'une pièce");
f.setLocationRelativeTo(null);
f.setResizable(false);
f.setVisible(true);
} else {
super.handleAction(source, evt);
}
}
} else {
super.handleAction(source, evt);
}
} else {
super.handleAction(source, evt);
}
}
};
};
 
} else {
} else {
 
liste = new ListeAddPanel(elt, new IListe(createTableSource), "historique-" + title) {
@Override
protected void handleAction(JButton source, ActionEvent evt) {
if (source == this.buttonAjouter) {
// toujours remplir la createFrame avec la ligne sélectionnée
// car la frame écoute la sélection mais pas les modif, et se reset
// qd on la ferme
// donc si on clic ajouter, on ferme, on modif la ligne, on clic
// ajouter
// on doit reremplir l'EditFrame
int selectIndex = ListeHistoriquePanel.this.jListePanel.getSelectedIndex();
SQLRowAccessor row = ListeHistoriquePanel.this.jListePanel.getModel().getRowAt(selectIndex);
if (row != null && !row.isUndefined()) {
SQLTable table = this.getCreateFrame().getSQLComponent().getElement().getTable();
Set<SQLField> fields = table.getForeignKeys(ListeHistoriquePanel.this.jListePanel.getModel().getTable());
if (fields != null && fields.size() > 0) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put(((SQLField) fields.toArray()[0]).getName(), row.getID());
this.getCreateFrame().getSQLComponent().resetValue();
this.getCreateFrame().getSQLComponent().select(rowVals);
liste = new ListeAddPanel(elt, new IListe(createTableSource), "historique-" + title) {
@Override
protected void handleAction(JButton source, ActionEvent evt) {
if (source == this.buttonAjouter) {
// toujours remplir la createFrame avec la ligne sélectionnée
// car la frame écoute la sélection mais pas les modif, et se
// reset
// qd on la ferme
// donc si on clic ajouter, on ferme, on modif la ligne, on clic
// ajouter
// on doit reremplir l'EditFrame
int selectIndex = ListeHistoriquePanel.this.jListePanel.getSelectedIndex();
SQLRowAccessor row = ListeHistoriquePanel.this.jListePanel.getModel().getRowAt(selectIndex);
if (row != null && !row.isUndefined()) {
SQLTable table = this.getCreateFrame().getSQLComponent().getElement().getTable();
Set<SQLField> fields = table.getForeignKeys(ListeHistoriquePanel.this.jListePanel.getModel().getTable());
if (fields != null && fields.size() > 0) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put(((SQLField) fields.toArray()[0]).getName(), row.getID());
this.getCreateFrame().getSQLComponent().resetValue();
this.getCreateFrame().getSQLComponent().select(rowVals);
}
}
FrameUtil.show(this.getCreateFrame());
} else {
super.handleAction(source, evt);
}
FrameUtil.show(this.getCreateFrame());
} else {
super.handleAction(source, evt);
}
}
};
}
};
}
 
this.vectListePanel.add(liste);
this.vectListePanel.add(liste);
 
setRenderer(liste);
if (elementSheet.get(liste.getElement()) != null) {
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(elementSheet.get(liste.getElement())).getRowActions());
}
liste.getListe().getModel().setCellsEditable(false);
liste.setOpaque(false);
liste.setBorder(null);
liste.getListe().getModel().setHibernateDelay(-1);
setRenderer(liste);
if (elementSheet.get(liste.getElement()) != null) {
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(elementSheet.get(liste.getElement())).getRowActions());
}
liste.getListe().getModel().setCellsEditable(false);
liste.setOpaque(false);
 
if (listPanelTable.size() > 1) {
Font f = UIManager.getFont("TitledBorder.font");
f = f.deriveFont(Font.BOLD);
Border b = UIManager.getBorder("TitledBorder.border");
b = BorderFactory.createLineBorder(Color.BLACK);
liste.setBorder(BorderFactory.createTitledBorder(b, elt.getPluralName(), TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION, f));
}
liste.setBorder(null);
liste.getListe().getModel().setHibernateDelay(-1);
 
tabbedPanel.add(liste, c2);
if (listPanelTable.size() > 1) {
Font f = UIManager.getFont("TitledBorder.font");
f = f.deriveFont(Font.BOLD);
Border b = UIManager.getBorder("TitledBorder.border");
b = BorderFactory.createLineBorder(Color.BLACK);
liste.setBorder(BorderFactory.createTitledBorder(b, elt.getPluralName(), TitledBorder.LEADING, TitledBorder.DEFAULT_POSITION, f));
}
if (sqlRow != null) {
String titleTab;
if (splitIndex == 0) {
titleTab = sqlRow.getString("NOM") + " et non classés";
tabbedPanel.add(tabbed, c2);
} else {
titleTab = sqlRow.getString("NOM");
}
tabbed.add(titleTab, liste);
 
} else {
tabbedPanel.add(liste, c2);
}
}
}
 
tabbedPane.add(key, tabbedPanel);
547,6 → 616,34
}
 
/**
* Permet d'obtenir la IListe correspondant au nom d'une table
*
* @param tableName nom de la table
* @return la Iliste associée, dans le cas échéant null
*/
 
public List<IListPanel> getAllIListePanelFromTableName(String tableName) {
List<IListPanel> liste = new ArrayList<IListPanel>();
final int size = this.vectListePanel.size();
for (int i = 0; i < size; i++) {
IListPanel listeTmp = this.vectListePanel.get(i);
// FIXME Null pointer Exception when client deleted
if (listeTmp != null) {
IListe list = listeTmp.getListe();
if (list != null) {
final ITableModel model = list.getModel();
if (model != null) {
if (model.getTable().getName().equalsIgnoreCase(tableName)) {
liste.add(listeTmp);
}
}
}
}
}
return liste;
}
 
/**
* Permet d'obtenir la position dans le vecteur correspondant au nom d'une table
*
* @param tableName nom de la table
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/history/ui/HistoriqueClientBilanPanel.java
14,6 → 14,8
package org.openconcerto.erp.core.reports.history.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.finance.accounting.model.Currency;
import org.openconcerto.erp.core.finance.accounting.model.CurrencyConverter;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLSelect;
249,7 → 251,9
final SQLSelect select = new SQLSelect();
final SQLTable tableElt = base.getTable("SAISIE_VENTE_FACTURE_ELEMENT");
select.addSelect(tableElt.getField("T_PV_HT"), "SUM");
select.setWhere(new Where(tableElt.getKey(), listId));
Where w = new Where(tableElt.getKey(), listId);
w = w.and(new Where(tableElt.getField("NIVEAU"), "=", 1));
select.setWhere(w);
final Number n = (Number) base.getDBSystemRoot().getDataSource().executeScalar(select.asString());
if (n != null) {
valueTotal = n.doubleValue();
402,10 → 406,12
this.poucentageVentes = pourCent;
}
 
CurrencyConverter cc = new CurrencyConverter();
 
private void updateLabels() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
 
String symbol = Currency.getSymbol(cc.getCompanyCurrencyCode());
String total;
long nb;
// Ventes comptoir
414,9 → 420,9
if (nb == 0) {
HistoriqueClientBilanPanel.this.labelVentesComptoir.setText(" pas de vente comptoir");
} else if (nb == 1) {
HistoriqueClientBilanPanel.this.labelVentesComptoir.setText(" une vente comptoir d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelVentesComptoir.setText(" une vente comptoir d'un montant de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelVentesComptoir.setText(" " + nb + " ventes comptoir d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelVentesComptoir.setText(" " + nb + " ventes comptoir d'un montant total de " + total + " " + symbol + " HT");
}
// Ventes facture
total = GestionDevise.currencyToString(HistoriqueClientBilanPanel.this.totalVentesFacture, true);
424,9 → 430,9
if (nb == 0) {
HistoriqueClientBilanPanel.this.labelVentesFacture.setText(" pas de vente avec facture");
} else if (nb == 1) {
HistoriqueClientBilanPanel.this.labelVentesFacture.setText(" une vente avec facture d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelVentesFacture.setText(" une vente avec facture d'un montant de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelVentesFacture.setText(" " + nb + " ventes avec facture d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelVentesFacture.setText(" " + nb + " ventes avec facture d'un montant total de " + total + " " + symbol + " HT");
}
// Propositions
total = GestionDevise.currencyToString(HistoriqueClientBilanPanel.this.totalPropositions, true);
434,9 → 440,9
if (nb == 0) {
HistoriqueClientBilanPanel.this.labelPropositions.setText(" pas de proposition commerciale");
} else if (nb == 1) {
HistoriqueClientBilanPanel.this.labelPropositions.setText(" une proposition commerciale d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelPropositions.setText(" une proposition commerciale d'un montant de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelPropositions.setText(" " + nb + " propositions commerciales d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelPropositions.setText(" " + nb + " propositions commerciales d'un montant total de " + total + " " + symbol + " HT");
}
// Chèques
nb = HistoriqueClientBilanPanel.this.nbTotalCheques;
445,18 → 451,18
HistoriqueClientBilanPanel.this.labelCheques.setText(" pas de chèque");
} else if (nb == 1) {
if (HistoriqueClientBilanPanel.this.nbChequesNonEncaisses == 0) {
HistoriqueClientBilanPanel.this.labelCheques.setText(" un chèque d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelCheques.setText(" un chèque d'un montant de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelCheques.setText(" un chèque non encaissé d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelCheques.setText(" un chèque non encaissé d'un montant de " + total + " " + symbol + " HT");
}
} else {
if (HistoriqueClientBilanPanel.this.nbChequesNonEncaisses == 0) {
HistoriqueClientBilanPanel.this.labelCheques.setText(" " + nb + " chèques d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelCheques.setText(" " + nb + " chèques d'un montant total de " + total + " " + symbol + " HT");
} else if (HistoriqueClientBilanPanel.this.nbChequesNonEncaisses == nb) {
HistoriqueClientBilanPanel.this.labelCheques.setText(" " + nb + " chèques non encaissés d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelCheques.setText(" " + nb + " chèques non encaissés d'un montant total de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelCheques
.setText(" " + nb + " chèques d'un montant total de " + total + " € HT dont " + HistoriqueClientBilanPanel.this.nbChequesNonEncaisses + " non encaissés");
.setText(" " + nb + " chèques d'un montant total de " + total + " " + symbol + " HT dont " + HistoriqueClientBilanPanel.this.nbChequesNonEncaisses + " non encaissés");
}
}
// Factures impayées
465,9 → 471,9
if (nb == 0) {
HistoriqueClientBilanPanel.this.labelEcheances.setText(" pas de facture non payée");
} else if (nb == 1) {
HistoriqueClientBilanPanel.this.labelEcheances.setText(" une facture non payée d'un montant de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelEcheances.setText(" une facture non payée d'un montant de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelEcheances.setText(" " + nb + " factures non payées d'un montant total de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelEcheances.setText(" " + nb + " factures non payées d'un montant total de " + total + " " + symbol + " HT");
}
// Relances
nb = HistoriqueClientBilanPanel.this.nbRelances;
493,9 → 499,10
if (cents == 0) {
HistoriqueClientBilanPanel.this.labelTotalVente.setText(" pas de vente");
} else if (HistoriqueClientBilanPanel.this.poucentageVentes <= 0) {
HistoriqueClientBilanPanel.this.labelTotalVente.setText(" ventes de " + total + " € HT");
HistoriqueClientBilanPanel.this.labelTotalVente.setText(" ventes de " + total + " " + symbol + " HT");
} else {
HistoriqueClientBilanPanel.this.labelTotalVente.setText(" ventes de " + total + " € HT, soit " + HistoriqueClientBilanPanel.this.poucentageVentes + "% des ventes totales");
HistoriqueClientBilanPanel.this.labelTotalVente
.setText(" ventes de " + total + " " + symbol + " HT, soit " + HistoriqueClientBilanPanel.this.poucentageVentes + "% des ventes totales");
}
 
// % des ventes
504,7 → 511,7
if (HistoriqueClientBilanPanel.this.totalVentesArticle == 0) {
HistoriqueClientBilanPanel.this.labelTotalVentesArticle.setText(" Aucun article vendu");
} else {
HistoriqueClientBilanPanel.this.labelTotalVentesArticle.setText(total + "€ HT d'articles facturés");
HistoriqueClientBilanPanel.this.labelTotalVentesArticle.setText(total + " " + symbol + " HT d'articles facturés");
}
}
});
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/supplier/component/MouvementStockSQLComponent.java
26,6 → 26,8
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
43,6 → 45,14
super(element);
}
 
@Override
public Set<String> getPartialResetNames() {
Set<String> s = new HashSet<String>();
s.add("QTE");
s.add("ID_ARTICLE");
return s;
}
 
public void addViews() {
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/supplier/component/FournisseurSQLComponent.java
178,6 → 178,29
JTextField textResp = new JTextField();
this.add(textResp, c);
this.addView(textResp, "RESPONSABLE");
 
// Siret
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("SIRET"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 0.5;
JTextField textSiret = new JTextField();
;
this.add(textSiret, c);
this.addView(textSiret, "SIRET");
 
// tva
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("NUMERO_TVA"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 0.5;
JTextField textNumeroTVA = new JTextField();
this.add(textNumeroTVA, c);
this.addView(textNumeroTVA, "NUMERO_TVA");
 
c.gridx = 1;
c.gridy++;
JCheckBox boxUE = new JCheckBox(getLabelFor("UE"));
354,9 → 377,10
c2.gridx++;
c2.weightx = 1;
panel.add(compteSelCharge, c2);
 
addView(compteSelCharge, "ID_COMPTE_PCE_CHARGE");
 
 
 
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridy++;
c.gridx = 0;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/ImportProductsToOrder.java
Nouveau fichier
0,0 → 1,330
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.action;
 
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.erp.core.supplychain.order.element.EtatDemandeAchatItemSQLElement;
import org.openconcerto.erp.importer.ArrayTableModel;
import org.openconcerto.erp.importer.DataImporter;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.Tuple3;
 
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class ImportProductsToOrder {
 
private Map<Object, Integer> fabMap = new HashMap<Object, Integer>();
private DBRoot root;
private Map<String, SQLRowAccessor> artMap = new HashMap<String, SQLRowAccessor>();
 
public static void main(String[] args) throws IOException, SQLException {
ImportProductsToOrder importer = new ImportProductsToOrder();
importer.importFile(new File("export-inventor-17-819.xls"), null);
 
}
 
private SQLRowAccessor rowAffaire = null;
 
public void setRowAffaire(SQLRowAccessor rowAffaire) {
this.rowAffaire = rowAffaire;
}
 
public void importFile(File file, DBRoot root) throws IOException, SQLException {
this.root = root;
DataImporter importer = new DataImporter();
importer.setSkipFirstLine(true);
ArrayTableModel m = importer.createModelFromXLS(file, 0);
m.dump(0, 40);
 
// Chargement des fab
try {
 
resolveFab(root);
} catch (SQLException originalExn) {
ExceptionHandler.handle("Impossible de créer les fournisseurs", originalExn);
return;
}
 
try {
 
resolveArticle(root);
} catch (SQLException originalExn) {
ExceptionHandler.handle("Impossible de créer les articles", originalExn);
return;
}
 
int size = m.getRowCount();
List<List<Object>> cleanData = new ArrayList<List<Object>>();
fetch(cleanData, m, 0, BigDecimal.ONE, null);
 
ArrayTableModel cleanModel = new ArrayTableModel(cleanData);
// cleanModel.dump(0, 392);
SQLTable table = root.getTable("DEMANDE_ACHAT_ELEMENT");
importer.setTable(table);
importer.map(0, table.getField("REPERE"));
importer.map(1, table.getField("QTE"));
importer.map(2, table.getField("QTE_UNITAIRE"));
importer.map(3, table.getField("ID_UNITE_VENTE"));
importer.map(4, table.getField("NOM"));
importer.map(5, table.getField("CODE"));
importer.map(6, table.getField("ID_FABRICANT"));
importer.map(7, table.getField("ID_ETAT_DEMANDE_ACHAT_ELEMENT"));
importer.map(8, table.getField("ID_ARTICLE"));
importer.map(9, table.getField("REVISION"));
importer.map(10, table.getField("REPERE_SOURCE"));
importer.map(11, table.getField("CODE_SOURCE"));
importer.map(12, table.getField("NOM_SOURCE"));
if (table.contains("ID_AFFAIRE")) {
importer.map(13, table.getField("ID_AFFAIRE"));
}
importer.importFromModel(cleanModel);
// importer.commit();
 
List<SQLRowValues> rowsToInsert = importer.getValuesToInsert();
 
final List<String> queries = new ArrayList<String>(rowsToInsert.size());
final List<ResultSetHandler> handlers = new ArrayList<ResultSetHandler>(rowsToInsert.size());
final ResultSetHandler handler = new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
return null;
}
};
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
String date = formater.format(new Date());
for (SQLRowValues rowValsToInsert : rowsToInsert) {
 
String query = "INSERT INTO " + rowValsToInsert.getTable().getSQLName();
query += " (\"REPERE\", \"QTE\", \"QTE_UNITAIRE\", \"ID_UNITE_VENTE\", \"NOM\", \"CODE\", \"ID_FABRICANT\", \"ID_ETAT_DEMANDE_ACHAT_ELEMENT\", \"ID_ARTICLE\",\"REVISION\",\"REPERE_SOURCE\",\"CODE_SOURCE\",\"NOM_SOURCE\", ";
if (table.contains("ID_AFFAIRE")) {
query += "\"ID_AFFAIRE\",";
}
query += "\"DATE\",\"ORDRE\") VALUES (";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("REPERE")) + ", ";
query += rowValsToInsert.getInt("QTE") + ", ";
query += rowValsToInsert.getBigDecimal("QTE_UNITAIRE") + ", ";
query += rowValsToInsert.getForeignID("ID_UNITE_VENTE") + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("NOM")) + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("CODE")) + ", ";
query += rowValsToInsert.getForeignID("ID_FABRICANT") + ", ";
query += rowValsToInsert.getForeignID("ID_ETAT_DEMANDE_ACHAT_ELEMENT") + ", ";
int foreignID = rowValsToInsert.getForeignID("ID_ARTICLE");
if (foreignID < SQLRow.UNDEFINED_ID) {
foreignID = 1;
}
query += foreignID + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("REVISION")) + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("REPERE_SOURCE")) + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("CODE_SOURCE")) + ", ";
query += SQLBase.quoteStringStd(rowValsToInsert.getString("NOM_SOURCE")) + ", ";
 
if (table.contains("ID_AFFAIRE")) {
query += rowValsToInsert.getForeignID("ID_AFFAIRE") + ", ";
}
query += "'" + date + "', ";
query += "(SELECT (MAX(\"ORDRE\")+1) FROM " + rowValsToInsert.getTable().getSQLName() + "));";
 
System.err.println(query);
queries.add(query);
handlers.add(handler);
 
}
 
SQLUtils.executeMultiple(table.getDBSystemRoot(), queries, handlers);
 
}
 
private int fetch(List<List<Object>> result, ArrayTableModel m, int index, BigDecimal qtyMult, Tuple3<String, String, String> parent) throws SQLException {
 
final int size = m.getRowCount();
 
// Fin du parcourt
if (index >= size) {
return size;
}
 
while (index < size) {
List<Object> line = m.getLineValuesAt(index);
// repere
String repere = line.get(0).toString();
if (repere.trim().length() == 0) {
return size;
}
// qty
Object c1 = line.get(1);
int qty = 1;
BigDecimal uQty = BigDecimal.ONE;
int idUnit = UniteVenteArticleSQLElement.A_LA_PIECE;
if (c1 instanceof Double) {
Double d = (Double) c1;
qty = d.intValue();
} else if (c1 instanceof String) {
String all = c1.toString().trim();
List<String> splited = StringUtils.fastSplit(all, ' ');
String uQtystr = splited.get(0).trim().replace(',', '.');
uQty = new BigDecimal(uQtystr);
if (splited.get(1).trim().equalsIgnoreCase("mm")) {
idUnit = 11;// mm
} else {
throw new IllegalStateException("cannot parse " + all);
}
}
 
// Test Nomenclature
String repereNext = null;
if (index < (size - 1)) {
repereNext = m.getLineValuesAt(index + 1).get(0).toString();
}
// designation
// ref
Object des = line.get(2);
Object ref = line.get(3);
if (parent == null || parent.get0() == null || repere.startsWith(parent.get0())) {
if (repereNext != null && repereNext.startsWith(repere)) {
BigDecimal qtyMultChild = qtyMult.multiply(uQty).multiply(new BigDecimal(qty));
index = fetch(result, m, index + 1, qtyMultChild, Tuple3.create(repere, ref.toString(), des.toString()));
} else {
 
List<Object> cleanLine = new ArrayList<Object>();
 
SQLRowAccessor art = artMap.get(ref.toString());
 
cleanLine.add(repere);
 
if (art != null) {
idUnit = art.getForeignID("ID_UNITE_VENTE");
}
 
cleanLine.add(qty * qtyMult.intValue());
cleanLine.add(uQty);
cleanLine.add(idUnit);
 
if (des.toString().isEmpty()) {
cleanLine.add(ref.toString());
} else {
cleanLine.add(des.toString());
}
cleanLine.add(ref.toString());
// fabricant
Object c4 = line.get(4);
if (c4 != null && c4.toString().trim().length() > 0) {
Integer key = fabMap.get(c4.toString());
if (key == null) {
SQLRowValues rowVAlsFab = new SQLRowValues(root.getTable("FABRICANT"));
rowVAlsFab.put("NOM", c4.toString());
final SQLRow insertedRow = rowVAlsFab.insert();
fabMap.put(c4.toString(), insertedRow.getID());
key = insertedRow.getID();
}
cleanLine.add(key);
} else {
cleanLine.add(1);
}
 
// ETAT
cleanLine.add(1);
 
// ARTICLE
if (art != null) {
cleanLine.add(art.getID());
// cleanLine.add(art.getBigDecimal("PA_HT"));
} else {
cleanLine.add(null);
// cleanLine.add(BigDecimal.ZERO);
}
// INDICE
Object c5 = line.get(5);
cleanLine.add(c5.toString());
 
// Source
String repereSource = "";
String refSource = "";
String desSource = "";
if (parent != null) {
repereSource = parent.get0();
refSource = parent.get1();
desSource = parent.get2();
}
cleanLine.add(repereSource.toString());
cleanLine.add(refSource.toString());
cleanLine.add(desSource.toString());
 
if (this.rowAffaire != null) {
cleanLine.add(this.rowAffaire.getID());
}
 
result.add(cleanLine);
index++;
}
} else {
return index;
}
}
return size;
 
}
 
private void resolveFab(DBRoot root) throws SQLException {
final SQLTable table = root.findTable("FABRICANT");
 
final SQLRowValues vals = new SQLRowValues(table);
vals.put("NOM", null);
final SQLRowValuesListFetcher fetcher = new SQLRowValuesListFetcher(vals);
final List<SQLRowValues> existingRows = fetcher.fetch();
 
for (SQLRowValues sqlRowValues : existingRows) {
fabMap.put(sqlRowValues.getString("NOM"), sqlRowValues.getID());
 
}
}
 
private void resolveArticle(DBRoot root) throws SQLException {
final SQLTable table = root.findTable("ARTICLE");
 
final SQLRowValues vals = new SQLRowValues(table);
vals.put("CODE", null);
vals.put("NOM", null);
vals.put("PA_HT", null);
vals.put("ID_UNITE_VENTE", null);
final SQLRowValuesListFetcher fetcher = new SQLRowValuesListFetcher(vals);
final List<SQLRowValues> existingRows = fetcher.fetch();
 
for (SQLRowValues sqlRowValues : existingRows) {
artMap.put(sqlRowValues.getString("CODE"), sqlRowValues);
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/ListeDesDemandesPrixAction.java
Nouveau fichier
0,0 → 1,42
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeDesDemandesPrixAction extends CreateFrameAbstractAction {
public ListeDesDemandesPrixAction() {
super();
this.putValue(Action.NAME, "Liste des demandes de prix");
}
 
public JFrame createFrame() {
 
final SQLElement elementCmd = Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX");
final SQLTableModelSourceOnline tableSource = elementCmd.getTableSource(true);
final IListFrame frame = new IListFrame(new ListeAddPanel(elementCmd, new IListe(tableSource)));
 
return frame;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/ListeDesDemandesAchatsAction.java
Nouveau fichier
0,0 → 1,42
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeDesDemandesAchatsAction extends CreateFrameAbstractAction {
public ListeDesDemandesAchatsAction() {
super();
this.putValue(Action.NAME, "Liste des demandes d'achat");
}
 
public JFrame createFrame() {
 
final SQLElement elementCmd = Configuration.getInstance().getDirectory().getElement("DEMANDE_ACHAT_ELEMENT");
final SQLTableModelSourceOnline tableSource = elementCmd.getTableSource(true);
final IListFrame frame = new IListFrame(new ListeAddPanel(elementCmd, new IListe(tableSource)));
 
return frame;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/ListeDesCommandesAction.java
13,49 → 13,30
package org.openconcerto.erp.core.supplychain.order.action;
 
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.supplychain.receipt.component.BonReceptionSQLComponent;
import org.openconcerto.erp.generationDoc.gestcomm.CommandeXmlSheet;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.model.graph.PathBuilder;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.table.PercentTableCellRenderer;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.Set;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeDesCommandesAction extends CreateFrameAbstractAction {
public ListeDesCommandesAction() {
super();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/NouvelleDemandePrixAction.java
Nouveau fichier
0,0 → 1,33
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.view.EditFrame;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class NouvelleDemandePrixAction extends CreateFrameAbstractAction {
public NouvelleDemandePrixAction() {
super();
this.putValue(Action.NAME, "Demande Prix");
}
 
@Override
public JFrame createFrame() {
return new EditFrame(Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX"));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/ui/EtatDemandeAchatRenderer.java
Nouveau fichier
0,0 → 1,58
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.ui;
 
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.ui.table.TableCellRendererUtils;
 
import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
public class EtatDemandeAchatRenderer extends DefaultTableCellRenderer {
Map<String, Color> map = new HashMap<String, Color>();
 
public EtatDemandeAchatRenderer(SQLTable table) {
SQLSelect sel = new SQLSelect();
sel.addSelectStar(table);
List<SQLRow> r = SQLRowListRSH.execute(sel);
for (SQLRow sqlRow : r) {
final Object o = sqlRow.getObject("COLOR");
map.put(sqlRow.getString("NOM"), (o == null ? null : new Color(sqlRow.getInt("COLOR"))));
}
}
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
TableCellRendererUtils.setColors(this, table, isSelected);
 
final Color c = map.get((String) value);
if (c != null) {
this.setBackground(c);
}
 
return this;
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/table/ChiffrageCommandeTable.java
Nouveau fichier
0,0 → 1,237
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.table;
 
import org.openconcerto.erp.core.common.ui.DeviseNumericCellEditor;
import org.openconcerto.erp.core.common.ui.DeviseTableCellRenderer;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.view.list.CellDynamicModifier;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableControlPanel;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.DecimalUtils;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.ToolTipManager;
 
public class ChiffrageCommandeTable extends JPanel {
private RowValuesTable table;
private RowValuesTableModel model;
private SQLComponent comp;
 
public ChiffrageCommandeTable(SQLComponent comp) {
this.comp = comp;
init();
uiInit();
}
 
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM"));
list.add(tableElementNom);
final SQLTableElement fam = new SQLTableElement(e.getTable().getField("ID_FAMILLE_ARTICLE"));
list.add(fam);
final SQLField fieldHA = e.getTable().getField("PA_HT");
final DeviseNumericCellEditor editorPAHT = new DeviseNumericCellEditor(fieldHA);
final SQLTableElement pa = new SQLTableElement(fieldHA, BigDecimal.class, editorPAHT);
pa.setRenderer(new DeviseTableCellRenderer());
list.add(pa);
 
final SQLField fieldPV = e.getTable().getField("PV_HT");
final DeviseNumericCellEditor editorPVHT = new DeviseNumericCellEditor(fieldPV);
final SQLTableElement pv = new SQLTableElement(fieldPV, BigDecimal.class, editorPVHT);
pv.setRenderer(new DeviseTableCellRenderer());
list.add(pv);
 
SQLTableElement qteU = new SQLTableElement(e.getTable().getField("QTE"), BigDecimal.class) {
 
protected Object getDefaultNullValue() {
return BigDecimal.ZERO;
}
};
qteU.setRenderer(new DeviseTableCellRenderer());
list.add(qteU);
 
final SQLTableElement unit = new SQLTableElement(e.getTable().getField("ID_UNITE_VENTE"));
list.add(unit);
 
final SQLField fieldTotalHA = e.getTable().getField("T_PA_HT");
final DeviseNumericCellEditor editorTotalPAHT = new DeviseNumericCellEditor(fieldTotalHA);
final SQLTableElement totalpa = new SQLTableElement(fieldTotalHA, BigDecimal.class, editorTotalPAHT);
totalpa.setRenderer(new DeviseTableCellRenderer());
totalpa.setEditable(false);
list.add(totalpa);
 
final SQLField fieldTotalPV = e.getTable().getField("T_PV_HT");
final DeviseNumericCellEditor editorTotalPVHT = new DeviseNumericCellEditor(fieldTotalPV);
final SQLTableElement totalpv = new SQLTableElement(fieldTotalPV, BigDecimal.class, editorTotalPVHT);
totalpv.setEditable(false);
totalpv.setRenderer(new DeviseTableCellRenderer());
list.add(totalpv);
 
final SQLField fieldMarge = e.getTable().getField("MARGE");
final DeviseNumericCellEditor editorMarge = new DeviseNumericCellEditor(fieldMarge);
final SQLTableElement marge = new SQLTableElement(fieldMarge, BigDecimal.class, editorMarge);
marge.setEditable(false);
marge.setRenderer(new DeviseTableCellRenderer());
list.add(marge);
 
SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
this.model = new RowValuesTableModel(e, list, e.getTable().getField("NOM"), false, defautRow);
 
this.table = new RowValuesTable(this.model, null, true);
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
 
// Autocompletion
// AutoCompletionManager m = new AutoCompletionManager(tableElementNom,
// ((ComptaPropsConfiguration)
// Configuration.getInstance()).getSQLBaseSociete().getField("ECHANTILLON.NOM"), this.table,
// this.table.getRowValuesTableModel());
// m.fill("NOM", "NOM");
// m.fill("PV_HT", "PV_HT");
 
// // Calcul automatique du total HT
qteU.addModificationListener(totalpv);
pv.addModificationListener(totalpv);
totalpv.setModifier(new CellDynamicModifier() {
public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
System.out.println("Compute totalHT");
 
BigDecimal qte = row.getBigDecimal("QTE");
BigDecimal f = row.getBigDecimal("PV_HT");
if (f == null) {
return null;
}
BigDecimal r = f.multiply(qte, DecimalUtils.HIGH_PRECISION);
return r;
}
});
 
qteU.addModificationListener(totalpa);
pa.addModificationListener(totalpa);
totalpa.setModifier(new CellDynamicModifier() {
public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
System.out.println("Compute totalHT");
 
BigDecimal qte = row.getBigDecimal("QTE");
BigDecimal f = row.getBigDecimal("PA_HT");
if (f == null) {
return null;
}
BigDecimal r = f.multiply(qte, DecimalUtils.HIGH_PRECISION);
return r;
}
 
});
totalpv.addModificationListener(marge);
totalpa.addModificationListener(marge);
marge.setModifier(new CellDynamicModifier() {
public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
 
BigDecimal f = row.getBigDecimal("T_PV_HT");
if (f == null) {
return null;
}
BigDecimal f2 = row.getBigDecimal("T_PA_HT");
if (f2 == null) {
return null;
}
BigDecimal r = f.subtract(f2);
return r;
}
});
}
 
/**
*
*/
protected void uiInit() {
// Ui init
this.setLayout(new GridBagLayout());
this.setOpaque(false);
final GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 1;
 
c.gridy++;
c.gridx = 0;
final JPanel control = new RowValuesTableControlPanel(this.table);
control.setOpaque(false);
this.add(control, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
JScrollPane comp = new JScrollPane(this.table);
comp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
this.add(comp, c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
 
for (SQLRowValues sqlRowValues : lists) {
getModel().addRow(sqlRowValues);
}
}
 
private static List<SQLRowValues> lists = new ArrayList<SQLRowValues>();
 
public static void addDefaultSQLRowValues(SQLRowValues rowVals) {
lists.add(rowVals);
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("CHIFFRAGE_COMMANDE_CLIENT");
}
 
public void updateField(String field, int id) {
this.table.updateField(field, id);
}
 
public RowValuesTable getRowValuesTable() {
return this.table;
}
 
public void insertFrom(String field, int id) {
this.table.insertFrom(field, id);
}
 
public RowValuesTableModel getModel() {
return this.table.getRowValuesTableModel();
}
 
public void refreshTable() {
this.table.repaint();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/table/FacturationCommandeTable.java
Nouveau fichier
0,0 → 1,236
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.supplychain.order.table;
 
import org.openconcerto.erp.core.sales.order.ui.TypeFactureCommandeCellRenderer;
import org.openconcerto.erp.core.sales.order.ui.TypeFactureCommandeTableCellEditor;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableControlPanel;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.table.PercentTableCellRenderer;
import org.openconcerto.ui.table.TimestampTableCellEditor;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.ToolTipManager;
 
public class FacturationCommandeTable extends JPanel {
private RowValuesTable table;
private RowValuesTableModel model;
private SQLComponent comp;
 
public FacturationCommandeTable(SQLComponent comp) {
this.comp = comp;
init();
uiInit();
}
 
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM"));
list.add(tableElementNom);
 
final SQLTableElement tableElementTF = new SQLTableElement(e.getTable().getField("TYPE_FACTURE"), Integer.class, new TypeFactureCommandeTableCellEditor());
tableElementTF.setRenderer(new TypeFactureCommandeCellRenderer());
list.add(tableElementTF);
 
final SQLTableElement pourcent = new SQLTableElement(e.getTable().getField("POURCENT"), BigDecimal.class);
pourcent.setRenderer(new PercentTableCellRenderer());
list.add(pourcent);
 
final SQLTableElement type = new SQLTableElement(e.getTable().getField("ID_TYPE_REGLEMENT"));
list.add(type);
 
final SQLTableElement ajours = new SQLTableElement(e.getTable().getField("AJOURS"));
list.add(ajours);
final SQLTableElement finM = new SQLTableElement(e.getTable().getField("FIN_MOIS"));
list.add(finM);
 
final SQLTableElement comptant = new SQLTableElement(e.getTable().getField("COMPTANT"));
list.add(comptant);
 
final SQLTableElement date = new SQLTableElement(e.getTable().getField("DATE_PREVISIONNELLE"), Date.class, new TimestampTableCellEditor(false) {
@Override
public Object getCellEditorValue() {
 
Object o = super.getCellEditorValue();
Date d = null;
if (o != null) {
d = new Date(((Timestamp) o).getTime());
}
return d;
}
});
list.add(date);
 
SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
this.model = new RowValuesTableModel(e, list, e.getTable().getField("NOM"), false, defautRow);
 
this.table = new RowValuesTable(this.model, null, true);
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
 
// Autocompletion
// AutoCompletionManager m = new AutoCompletionManager(tableElementNom,
// ((ComptaPropsConfiguration)
// Configuration.getInstance()).getSQLBaseSociete().getField("ECHANTILLON.NOM"), this.table,
// this.table.getRowValuesTableModel());
// m.fill("NOM", "NOM");
// m.fill("PV_HT", "PV_HT");
 
// // Calcul automatique du total HT
// qteElement.addModificationListener(this.totalHT);
// this.pvHT.addModificationListener(this.totalHT);
// this.totalHT.setModifier(new CellDynamicModifier() {
// public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
// System.out.println("Compute totalHT");
//
// int qte = Integer.parseInt(row.getObject("QTE").toString());
// BigDecimal f = row.getBigDecimal("PV_HT");
// BigDecimal r = f.multiply(new BigDecimal(qte), DecimalUtils.HIGH_PRECISION);
// return r;
// }
//
// });
 
}
 
/**
*
*/
protected void uiInit() {
// Ui init
this.setLayout(new GridBagLayout());
this.setOpaque(false);
final GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 1;
 
// Ajout catégorie
c.gridwidth = 1;
c.weightx = 0;
c.gridx = 0;
this.add(new JLabel("Ajouter un terme"), c);
 
final ElementComboBox boxCat = new ElementComboBox();
final SQLElement element = Configuration.getInstance().getDirectory().getElement("FACTURATION_COMMANDE_CLIENT");
ComboSQLRequest req = element.getComboRequest(true);
req.setWhere(new Where(element.getTable().getField("CHOICE"), "=", Boolean.TRUE));
boxCat.init(element, req);
 
c.gridx++;
this.add(boxCat, c);
 
c.fill = GridBagConstraints.NONE;
c.gridx++;
JButton buttonAjouter = new JButton("Ajouter");
buttonAjouter.setOpaque(false);
this.add(buttonAjouter, c);
 
c.gridwidth = GridBagConstraints.REMAINDER;
// Listeners
buttonAjouter.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
 
SQLRow rowCat = boxCat.getSelectedRow();
if (rowCat == null || rowCat.isUndefined()) {
return;
}
 
SQLRowValues rowVals = new SQLRowValues(Configuration.getInstance().getBase().getTable("FACTURATION_COMMANDE_CLIENT"));
if (comp.getSelectedID() > 1) {
rowVals.put("ID_COMMANDE_CLIENT", comp.getSelectedID());
}
rowVals.put("NOM", rowCat.getObject("NOM"));
rowVals.put("ID_TYPE_REGLEMENT", rowCat.getObject("ID_TYPE_REGLEMENT"));
rowVals.put("AJOURS", rowCat.getObject("AJOURS"));
rowVals.put("COMPTANT", rowCat.getObject("COMPTANT"));
rowVals.put("FIN_MOIS", rowCat.getObject("FIN_MOIS"));
rowVals.put("MONTANT", rowCat.getObject("MONTANT"));
rowVals.put("POURCENT", rowCat.getObject("POURCENT"));
rowVals.put("TYPE_FACTURE", rowCat.getObject("TYPE_FACTURE"));
getModel().addRow(rowVals);
}
});
 
c.gridy++;
c.gridx = 0;
final JPanel control = new RowValuesTableControlPanel(this.table);
control.setOpaque(false);
this.add(control, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
JScrollPane comp = new JScrollPane(this.table);
comp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
this.add(comp, c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("FACTURATION_COMMANDE_CLIENT");
}
 
public void updateField(String field, int id) {
this.table.updateField(field, id);
}
 
public RowValuesTable getRowValuesTable() {
return this.table;
}
 
public void insertFrom(String field, int id) {
this.table.insertFrom(field, id);
}
 
public RowValuesTableModel getModel() {
return this.table.getRowValuesTableModel();
}
 
public void refreshTable() {
this.table.repaint();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/FabricantSQLElement.java
Nouveau fichier
0,0 → 1,72
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 26 sept. 2012
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JTextField;
 
public class FabricantSQLElement extends ComptaSQLConfElement {
 
public FabricantSQLElement() {
super("FABRICANT", "un fabricant", "fabricants");
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
final ListMap<String, String> res = new ListMap<String, String>();
res.add(null, "NOM");
return res;
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
public void addViews() {
this.addRequiredSQLObject(new JTextField(), "NOM", "left");
}
};
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".manufacturor";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/EtatDemandeAchatItemSQLElement.java
Nouveau fichier
0,0 → 1,81
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 26 sept. 2012
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.IColorChooser;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JTextField;
 
public class EtatDemandeAchatItemSQLElement extends ComptaSQLConfElement {
 
public static final int EN_ATTENTE = 2;
public static final int DEMANDE = 3;
public static final int COMMANDE = 4;
public static final int RECPETION = 5;
public static final int RECPETION_PARTIEL = 6;
public static final int A_RELANCER = 7;
 
public EtatDemandeAchatItemSQLElement() {
super("ETAT_DEMANDE_ACHAT_ELEMENT", "un état de demande d'achat", "états de demande d'achat");
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
final ListMap<String, String> res = new ListMap<String, String>();
res.add(null, "NOM");
return res;
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
public void addViews() {
this.addRequiredSQLObject(new JTextField(), "NOM", "left");
this.addRequiredSQLObject(new IColorChooser(), "COLOR", "right");
}
};
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".achat.state";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixItemTable.java
Nouveau fichier
0,0 → 1,47
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 19 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.ui.AbstractAchatArticleItemTable;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
 
public class DemandePrixItemTable extends AbstractAchatArticleItemTable {
 
@Override
protected String getConfigurationFileName() {
return "Table_DemandePrix2.xml";
 
}
 
@Override
protected void init() {
// TODO Raccord de méthode auto-généré
super.init();
setColumnVisible(getModel().getColumnForField("PRIX_METRIQUE_HA_1"), false);
setColumnVisible(getModel().getColumnForField("ID_TAXE"), false);
setColumnVisible(getModel().getColumnForField("T_PA_HT"), false);
setColumnVisible(getModel().getColumnForField("T_PA_TTC"), false);
this.table.writeState();
}
 
@Override
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX_ELEMENT");
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixSQLElement.java
Nouveau fichier
0,0 → 1,198
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 18 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.supplychain.order.component.CommandeSQLComponent;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLInjector;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.utils.ListMap;
 
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.AbstractAction;
 
public class DemandePrixSQLElement extends ComptaSQLConfElement {
 
private SQLRowValues getLivraisonAdr(SQLRowAccessor rowAffaire) {
SQLRowAccessor rowClient = rowAffaire.getForeign("ID_CLIENT");
SQLRowAccessor rowAdrL = rowClient.getForeign("ID_ADRESSE_L");
if (rowAdrL == null || rowAdrL.isUndefined()) {
rowAdrL = rowClient.getForeign("ID_ADRESSE");
}
SQLRowValues rowVals = rowAdrL.asRowValues();
rowVals.clearPrimaryKeys();
return rowVals;
}
 
@Override
protected void _initTableSource(SQLTableModelSource source) {
super._initTableSource(source);
// {
// BaseSQLTableModelColumn cmd = new BaseSQLTableModelColumn("Commande associée",
// String.class) {
//
// @Override
// protected Object show_(SQLRowAccessor r) {
// Collection<? extends SQLRowAccessor> l =
// r.getReferentRows(r.getTable().getTable("COMMANDE"));
// String s = "";
// if (l != null && l.size() > 0) {
// for (SQLRowAccessor sqlRowAccessor : l) {
// s += sqlRowAccessor.getString("NUMERO") + " ";
// }
// }
//
// return s;
// }
//
// @Override
// public Set<FieldPath> getPaths() {
// // TODO Raccord de méthode auto-généré
// Path p = new Path(getTable());
// p = p.add(getTable().getTable("COMMANDE").getField("ID_DEMANDE_PRIX"));
//
// return CollectionUtils.createSet(new FieldPath(p, "NUMERO"));
// }
// };
// source.getColumns().add(cmd);
// }
 
}
 
public DemandePrixSQLElement() {
super("DEMANDE_PRIX", "une demande de prix fournisseur", "demandes de prix fournisseur");
 
MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(DemandePrixSheetXML.class) {
 
@Override
protected String getMailObject(SQLRow row) {
// TODO Raccord de méthode auto-généré
return "Veuillez trouver en pièce jointe notre demande de prix.";
}
 
@Override
public List<RowAction> addToMenu() {
List<RowAction> actions = new ArrayList<RowAction>();
 
PredicateRowAction action = new PredicateRowAction(new AbstractAction("Marqué comme acceptée et transférer en commande") {
 
@Override
public void actionPerformed(ActionEvent arg0) {
SQLRowAccessor row = IListe.get(arg0).getSelectedRow().asRow();
SQLRowValues rowVals = row.asRowValues();
rowVals.put("ID_ETAT_DEMANDE_PRIX", EtatDemandePrixSQLElement.ACCEPTE);
try {
rowVals.update();
} catch (SQLException exn) {
exn.printStackTrace();
}
SQLInjector inj = SQLInjector.getInjector(row.getTable(), row.getTable().getTable("COMMANDE"));
EditFrame f = new EditFrame(Configuration.getInstance().getDirectory().getElement("COMMANDE"));
final CommandeSQLComponent sqlComponent = (CommandeSQLComponent) f.getPanel().getSQLComponent();
sqlComponent.select(inj.createRowValuesFrom(row.getID()));
 
// SQLRowAccessor foreignRow = row.getForeign("ID_ADRESSE");
// if (foreignRow != null && !foreignRow.isUndefined()) {
// ElementSQLObject obj = (ElementSQLObject)
// sqlComponent.getView("ID_ADRESSE").getComp();
// obj.setCreated(true);
//
// SQLRowValues asRowValues = getLivraisonAdr(row.getForeign("ID_AFFAIRE"));
// asRowValues.clearPrimaryKeys();
// obj.getSQLChild().select(asRowValues);
// }
sqlComponent.loadItem(sqlComponent.getRowValuesTablePanel(), Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX"), row.getID(),
Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX_ELEMENT"));
f.setVisible(true);
}
}, false);
action.setPredicate(IListeEvent.getSingleSelectionPredicate());
actions.add(action);
 
PredicateRowAction actionCreate = new PredicateRowAction(new AbstractAction("Créer à partir de ...") {
 
@Override
public void actionPerformed(ActionEvent arg0) {
SQLRowAccessor row = IListe.get(arg0).getSelectedRow().asRow();
DemandePrixSQLComponent createComponent = (DemandePrixSQLComponent) createComponent();
EditFrame frame = new EditFrame(createComponent, EditMode.CREATION);
createComponent.loadDemandeExistant(row.getID());
frame.setVisible(true);
}
}, false);
actionCreate.setPredicate(IListeEvent.getSingleSelectionPredicate());
actions.add(actionCreate);
 
// actions.addAll(new DemandePrixAction().getEtatAction());
return actions;
}
};
 
getRowActions().addAll(l.getRowActions());
 
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NUMERO");
l.add("ID_FOURNISSEUR");
l.add("DATE");
l.add("ID_ETAT_DEMANDE_PRIX");
return l;
}
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("NUMERO");
l.add("ID_FOURNISSEUR");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
return ListMap.singleton(null, "NUMERO");
}
 
@Override
public SQLComponent createComponent() {
return new DemandePrixSQLComponent(this);
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".demande";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixSQLComponent.java
Nouveau fichier
0,0 → 1,608
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 19 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.panel.PanelOOSQLComponent;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.sqlobject.JUniqueTextField;
import org.openconcerto.sql.ui.RadioButtons;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FormLayouter;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.TitledSeparator;
import org.openconcerto.ui.VFlowLayout;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.sql.SQLException;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
 
public class DemandePrixSQLComponent extends TransfertBaseSQLComponent {
JUniqueTextField field = new JUniqueTextField();
DemandePrixItemTable table = new DemandePrixItemTable();
PanelOOSQLComponent panelOO;
private ElementSQLObject componentPrincipaleAdr;
 
public DemandePrixSQLComponent(SQLElement elt) {
super(elt);
}
 
@Override
protected void addViews() {
 
GridBagConstraints c = new DefaultGridBagConstraints();
setLayout(new GridBagLayout());
// Champ Module
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
final JPanel addP = ComptaSQLConfElement.createAdditionalPanel();
this.setAdditionalFieldsPanel(new FormLayouter(addP, 2));
this.add(addP, c);
 
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(new JLabel(getLabelFor("ID_COMMANDE_PREV"), SwingConstants.RIGHT), c);
// c.gridx++;
// c.weightx = 1;
// final ElementComboBox boxCmd = new ElementComboBox();
// this.add(boxCmd, c);
// this.addView(boxCmd, "ID_COMMANDE_PREV");
 
c.gridy++;
c.gridwidth = 1;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("NUMERO"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
this.add(field, c);
this.addView(field, "NUMERO", REQ);
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("DATE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
JDate date = new JDate(true);
this.add(date, c);
this.addView(date, "DATE", REQ);
 
c.gridx = 0;
c.gridy++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_FOURNISSEUR"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxFournisseur = new ElementComboBox();
this.add(boxFournisseur, c);
this.addView(boxFournisseur, "ID_FOURNISSEUR", REQ);
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("DATE_BUTOIRE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
JDate dateButoire = new JDate(false);
this.add(dateButoire, c);
 
this.addView(dateButoire, "DATE_BUTOIRE");
//
// c.gridx++;
// c.weightx = 0;
// this.add(new JLabel(getLabelFor("DATE_DISPOSITION"), SwingConstants.RIGHT), c);
// c.gridx++;
// c.weightx = 1;
// final JDate dateDisposition = new JDate();
// this.add(dateDisposition, c);
// this.addView(dateDisposition, "DATE_DISPOSITION", REQ);
 
// c.gridx = 0;
// c.gridy++;
// c.weightx = 0;
// this.add(new JLabel(getLabelFor("ID_CONTACT_FOURNISSEUR"), SwingConstants.RIGHT), c);
// c.gridx++;
// c.weightx = 1;
// final ElementComboBox boxContactFournisseur = new ElementComboBox();
// this.add(boxContactFournisseur, c);
// final SQLElement contactElement =
// Configuration.getInstance().getDirectory().getElement("CONTACT_FOURNISSEUR");
// boxContactFournisseur.init(contactElement, contactElement.getComboRequest(true));
// this.addView(boxContactFournisseur, "ID_CONTACT_FOURNISSEUR", REQ);
//
// boxFournisseur.addModelListener("wantedID", new PropertyChangeListener() {
//
// @Override
// public void propertyChange(PropertyChangeEvent arg0) {
//
// SQLRow selectedRow =
// boxFournisseur.getRequest().getPrimaryTable().getRow(boxFournisseur.getWantedID());
// if (selectedRow != null) {
// boxContactFournisseur.getRequest().setWhere(new
// Where(contactElement.getTable().getField("ID_FOURNISSEUR"), "=", selectedRow.getID()));
// } else {
// boxContactFournisseur.getRequest().setWhere(null);
// }
// }
// });
 
// this.addView("ID_ADRESSE");
// Etat devis
// c.gridx = 0;
// c.gridy++;
//
// this.add(new JLabel(getLabelFor("ID_COMMERCIAL")), c);
// c.gridx++;
// ElementComboBox boxComm = new ElementComboBox();
// this.add(boxComm, c);
// this.addView(boxComm, "ID_COMMERCIAL");
 
// SQLRequestComboBox boxEtat = new SQLRequestComboBox();
// c.weightx = 0;
// this.add(new JLabel(getLabelFor("ID_ETAT_DEMANDE_PRIX")), c);
// c.gridx++;
// c.weightx = 1;
// this.add(boxEtat, c);
// this.addView(boxEtat, "ID_ETAT_DEMANDE_PRIX");
 
c.weightx = 0;
c.gridheight = 1;
c.gridx = 0;
c.gridy++;
c.anchor = GridBagConstraints.WEST;
c.weightx = 0;
JLabel labelObjet = new JLabel(getLabelFor("OBJET"), SwingConstants.RIGHT);
this.add(labelObjet, c);
c.gridx++;
ITextArea area = new ITextArea();
c.weightx = 1;
this.add(area, c);
this.addView(area, "OBJET");
 
RadioButtons radioEtat = new RadioButtons("NOM");
radioEtat.setLayout(new VFlowLayout());
radioEtat.setBorder(BorderFactory.createTitledBorder(getLabelFor("ID_ETAT_DEMANDE_PRIX")));
c.gridx = 3;
c.gridheight = 5;
c.anchor = GridBagConstraints.NORTHWEST;
this.add(radioEtat, c);
this.addView(radioEtat, "ID_ETAT_DEMANDE_PRIX", REQ);
 
// c.gridx = 0;
// c.gridy++;
// c.gridwidth = 2;
// c.weightx = 1;
// this.add(new TitledSeparator("Adresse de destination"), c);
// c.gridy++;
// c.weightx = 0;
// final JCheckBox boxLivr = new JCheckBox("Livré par le fournisseur");
// this.add(boxLivr, c);
// this.addView(boxLivr, "LIVRAISON_F");
// c.gridy++;
// final ElementComboBox boxAdr = new ElementComboBox();
// final SQLElement adrElement = getElement().getForeignElement("ID_ADRESSE");
// boxAdr.init(adrElement);
// c.gridwidth = 1;
// final JLabel labelAdrLiv = new JLabel("Adresse de livraison existante");
// this.add(labelAdrLiv, c);
// c.gridx++;
// c.gridwidth = 2;
// this.add(boxAdr, c);
// c.gridy++;
// c.gridx = 0;
// this.addView("ID_ADRESSE");
// final DefaultElementSQLObject comp = (DefaultElementSQLObject)
// this.getView("ID_ADRESSE").getComp();
// componentPrincipaleAdr = (ElementSQLObject) this.getView("ID_ADRESSE");
// this.add(comp, c);
// boxLivr.addActionListener(new ActionListener() {
//
// @Override
// public void actionPerformed(ActionEvent e) {
// if (boxLivr.isSelected() && !comp.isCreated()) {
// comp.setCreated(true);
// componentPrincipaleAdr.setEditable(InteractionMode.READ_WRITE);
// final SQLRow selectedRow2 = boxAffaire.getSelectedRow();
// if (selectedRow2 != null) {
// SQLRowValues rowVals = getLivraisonAdr(selectedRow2.asRow());
// rowVals.put("RUE", "");
// comp.setValue(rowVals);
// }
// } else {
// if (!boxLivr.isSelected()) {
// comp.setCreated(false);
// componentPrincipaleAdr.setEditable(InteractionMode.DISABLED);
// }
// }
//
// }
// });
// comp.addValueListener(new PropertyChangeListener() {
//
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
// boxAdr.setVisible(comp.isCreated());
// labelAdrLiv.setVisible(comp.isCreated());
// }
// });
 
// boxAffaire.addModelListener("wantedID", new PropertyChangeListener() {
// SQLTable tableAdr = getTable().getTable("ADRESSE");
//
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
//
// SQLRow selectedRow =
// boxAffaire.getRequest().getPrimaryTable().getRow(boxAffaire.getWantedID());
// boxCmd.getRequest().setWhere(Where.FALSE);
// if (selectedRow != null && !selectedRow.isUndefined()) {
//
// SQLRow client = selectedRow.getForeign("ID_CLIENT");
//
// boxAdr.getRequest().setWhere(((AffaireSQLElement)
// boxAffaire.getElement()).getWhereAdrL(client));
// boxCmd.getRequest().setWhere(new
// Where(getTable().getForeignTable("ID_COMMANDE_PREV").getField("ID_AFFAIRE"), "=",
// selectedRow.getID()));
//
// }
// }
// });
// boxAdr.addValueListener(new PropertyChangeListener() {
//
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
// final SQLRow selectedRow = boxAdr.getSelectedRow().asRow();
// if (selectedRow != null && !selectedRow.isUndefined()) {
// SQLRowValues rowVals = selectedRow.asRowValues();
// rowVals.clearPrimaryKeys();
// rowVals.put("RUE", "");
// comp.setValue(rowVals);
// }
// }
// });
// boxAdr.setVisible(false);
// labelAdrLiv.setVisible(false);
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 1;
c.gridy += 6;
c.gridx = 0;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
this.add(this.table, c);
 
// boxFournisseur.addValueListener(new PropertyChangeListener() {
//
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
// // TODO Raccord de méthode auto-généré
// table.setFournisseurFilterOnCompletion(boxFournisseur.getSelectedRow().asRow());
// if (boxFournisseur.getSelectedRow().asRow() != null &&
// !boxFournisseur.getSelectedRow().asRow().isUndefined()) {
// SQLRow rowFam =
// boxFournisseur.getSelectedRow().asRow().getForeignRow("ID_FAMILLE_ARTICLE");
// if (rowFam != null && !rowFam.isUndefined()) {
// table.getRowValuesTable().getRowValuesTableModel().getDefaultRowValues().put("ID_FAMILLE_ARTICLE",
// rowFam.getID());
// } else {
// table.getRowValuesTable().getRowValuesTableModel().getDefaultRowValues().putEmptyLink("ID_FAMILLE_ARTICLE");
// }
// } else {
// table.getRowValuesTable().getRowValuesTableModel().getDefaultRowValues().putEmptyLink("ID_FAMILLE_ARTICLE");
// }
// }
// });
 
// INfos
c.gridx = 0;
c.gridy++;
c.gridheight = 1;
c.weighty = 0;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
c.gridwidth = 3;
c.fill = GridBagConstraints.HORIZONTAL;
this.add(new TitledSeparator(getLabelFor("INFOS")), c);
 
c.gridy++;
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
JTextArea infos = new ITextArea();
final JScrollPane scrollPane = new JScrollPane(infos);
scrollPane.setBorder(null);
this.add(scrollPane, c);
 
// Total
// DeviseField fieldHT = new DeviseField();
// DeviseField fieldTVA = new DeviseField();
// DeviseField fieldTTC = new DeviseField();
// fieldHT.setOpaque(false);
// fieldTVA.setOpaque(false);
// fieldTTC.setOpaque(false);
//
// addRequiredSQLObject(fieldHT, "T_HT");
// addRequiredSQLObject(fieldTVA, "T_TVA");
// addRequiredSQLObject(fieldTTC, "T_TTC");
// JTextField poids = new JTextField();
// // addSQLObject(poids, "T_POIDS");
// final TotalPanel totalTTC = new TotalPanel(this.table.getRowValuesTable(),
// this.table.getPrixTotalHTElement(), this.table.getPrixTotalTTCElement(),
// this.table.getHaElement(),
// this.table.getQteElement(), fieldHT, fieldTVA, fieldTTC, new DeviseField(), new
// DeviseField(), new DeviseField(), this.table.getPrixServiceElement(), new DeviseField(),
// this.table.getTableElementTotalDevise(), poids, this.table.getPoidsTotalElement());
//
// c.gridx = GridBagConstraints.RELATIVE;
// c.gridy--;
// c.gridwidth = GridBagConstraints.REMAINDER;
// c.gridheight = 2;
// c.anchor = GridBagConstraints.NORTHEAST;
// c.fill = GridBagConstraints.NONE;
// c.weighty = 0;
//
// this.add(totalTTC, c);
 
addSQLObject(infos, "INFOS");
 
this.panelOO = new PanelOOSQLComponent(this);
c.gridwidth = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.SOUTHEAST;
// c.gridx = 0;
c.gridx += 3;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(this.panelOO, c);
// this.addView("PRIX");
 
// boxAffaire.addValueListener(new PropertyChangeListener() {
//
// @Override
// public void propertyChange(PropertyChangeEvent evt) {
// SQLRow selectedRow = boxAffaire.getSelectedRow().asRow();
// if (!isFilling() && selectedRow != null && !selectedRow.isUndefined()) {
// Calendar date = selectedRow.getDate("DATE_LIVRAISON_EFFECTIVE");
// if (date != null) {
//
// dateDisposition.setValue(date.getTime());
// }
// }
// }
// });
 
}
 
private SQLRowValues getLivraisonAdr(SQLRow rowAffaire) {
if (rowAffaire != null) {
SQLRow rowClient = rowAffaire.getForeignRow("ID_CLIENT");
SQLRow rowAdrL = rowClient.getForeignRow("ID_ADRESSE_L");
if (rowAdrL == null || rowAdrL.isUndefined()) {
rowAdrL = rowClient.getForeignRow("ID_ADRESSE");
}
SQLRowValues rowVals = rowAdrL.asRowValues();
rowVals.clearPrimaryKeys();
return rowVals;
} else {
return new SQLRowValues(getTable().getTable("ADRESSE"));
}
}
 
@Override
public void select(SQLRowAccessor r) {
// TODO Raccord de méthode auto-généré
if (getTable().contains("LIVRAISON_F") && componentPrincipaleAdr != null) {
final boolean bLivraison = r != null && r.getFields().contains("ID_ADRESSE") && !r.isForeignEmpty("ID_ADRESSE");
componentPrincipaleAdr.setEditable(bLivraison ? InteractionMode.READ_WRITE : InteractionMode.DISABLED);
}
 
if (r != null) {
// final SQLRowValues rVals = r.asRowValues().deepCopy();
// final SQLRowValues vals = new SQLRowValues(r.getTable());
// vals.load(rVals, CollectionUtils.createSet("ID_AFFAIRE"));
// // vals a besoin de l'ID sinon incohérence entre ID_AFFAIRE et ID (eg for
// // reloadTable())
// // ne pas supprimer l'ID de rVals pour qu'on puisse UPDATE
// vals.setID(rVals.getID());
// super.select(vals);
// rVals.remove("ID_AFFAIRE");
// super.select(rVals);
super.select(r);
this.field.setIdSelected(r.getID());
this.table.insertFrom("ID_DEMANDE_PRIX", r.getID());
} else {
super.select(r);
}
}
 
@Override
public int insert(SQLRow order) {
 
int idCommande = getSelectedID();
 
// on verifie qu'un devis du meme numero n'a pas été inséré entre temps
if (this.field.checkValidation()) {
 
idCommande = super.insert(order);
// this.table.updateField("ID_COMMANDE_CLIENT", idCommande);
this.table.updateField("ID_DEMANDE_PRIX", idCommande);
// Création des articles
// this.table.createArticle(idCommande, this.getElement());
 
// generation du document
DemandePrixSheetXML sheet = new DemandePrixSheetXML(getTable().getRow(idCommande));
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
 
// incrémentation du numéro auto
if (NumerotationAutoSQLElement.getNextNumero(DemandePrixSQLElement.class).equalsIgnoreCase(this.field.getText().trim())) {
SQLTable tableNum = Configuration.getInstance().getRoot().findTable("NUMEROTATION_AUTO");
SQLRowValues rowVals = new SQLRowValues(tableNum);
int val = tableNum.getRow(2).getInt("DMD_PRIX_START");
val++;
rowVals.put("DMD_PRIX_START", new Integer(val));
 
try {
rowVals.update(2);
} catch (SQLException e) {
e.printStackTrace();
}
}
 
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("DEMANDE_PRIX_ELEMENT"), idCommande);
} else {
ExceptionHandler.handle("Impossible d'ajouter, numéro de demande existant.");
Object root = SwingUtilities.getRoot(this);
if (root instanceof EditFrame) {
EditFrame frame = (EditFrame) root;
frame.getPanel().setAlwaysVisible(true);
}
}
 
return idCommande;
}
 
@Override
public void update() {
 
if (!this.field.checkValidation()) {
ExceptionHandler.handle("Impossible d'ajouter, numéro de demande existant.");
Object root = SwingUtilities.getRoot(this);
if (root instanceof EditFrame) {
EditFrame frame = (EditFrame) root;
frame.getPanel().setAlwaysVisible(true);
}
return;
}
super.update();
// this.table.updateField("ID_COMMANDE_CLIENT", getSelectedID());
// this.table.createArticle(getSelectedID(), this.getElement());
this.table.updateField("ID_DEMANDE_PRIX", getSelectedID());
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("DEMANDE_PRIX_ELEMENT"), getSelectedID());
 
DemandePrixSheetXML sheet = new DemandePrixSheetXML(getTable().getRow(getSelectedID()));
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
 
}
 
@Override
protected SQLRowValues createDefaults() {
SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(DemandePrixSQLElement.class));
if (getTable().getUndefinedID() == SQLRow.NONEXISTANT_ID) {
rowVals.put("ID_ETAT_DEMANDE_PRIX", EtatDemandePrixSQLElement.EN_ATTENTE);
} else {
SQLRow rowUndef = getTable().getRow(getTable().getUndefinedID());
SQLRow foreign = rowUndef.getForeign("ID_ETAT_DEMANDE_PRIX");
if (foreign != null && !foreign.isUndefined()) {
rowVals.put("ID_ETAT_DEMANDE_PRIX", foreign.getID());
} else {
rowVals.put("ID_ETAT_DEMANDE_PRIX", EtatDemandePrixSQLElement.EN_ATTENTE);
}
}
if (getTable().contains("LIVRAISON_F") && componentPrincipaleAdr != null) {
componentPrincipaleAdr.setEditable(InteractionMode.DISABLED);
}
return rowVals;
}
 
/**
* Création d'une demande à partir d'une demande existante
*
* @param idDemande
*
*/
public void loadDemandeExistant(final int idDemande) {
 
final SQLElement demande = Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX");
final SQLElement demandeElt = Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX_ELEMENT");
 
// On duplique la demande
if (idDemande > 1) {
final SQLRow row = demande.getTable().getRow(idDemande);
final SQLRowValues rowVals = new SQLRowValues(demande.getTable());
rowVals.put("ID_AFFAIRE", row.getInt("ID_AFFAIRE"));
// rowVals.put("DATE_BUTOIRE", row.getObject("DATE_BUTOIRE"));
// rowVals.put("DATE_DISPOSITION", row.getObject("DATE_DISPOSITION"));
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(DemandePrixSQLElement.class));
rowVals.put("ID_ETAT_DEMANDE_PRIX", EtatDemandePrixSQLElement.EN_ATTENTE);
rowVals.put("OBJET", row.getObject("OBJET"));
rowVals.put("ID_COMMERCIAL", row.getObject("ID_COMMERCIAL"));
this.select(rowVals);
}
 
// On duplique les elements de devis
final List<SQLRow> myListItem = demande.getTable().getRow(idDemande).getReferentRows(demandeElt.getTable());
 
if (myListItem.size() != 0) {
this.table.getModel().clearRows();
 
for (final SQLRow rowElt : myListItem) {
 
final SQLRowValues rowVals = rowElt.createUpdateRow();
rowVals.clearPrimaryKeys();
this.table.getModel().addRow(rowVals);
final int rowIndex = this.table.getModel().getRowCount() - 1;
this.table.getModel().fireTableModelModified(rowIndex);
}
} else {
this.table.getModel().clearRows();
}
this.table.getModel().fireTableDataChanged();
this.table.repaint();
}
 
@Override
protected RowValuesTable getRowValuesTable() {
return this.table.getRowValuesTable();
}
 
@Override
protected void refreshAfterSelect(SQLRowAccessor rSource) {
// TODO Auto-generated method stub
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandeAchatItemSQLElement.java
Nouveau fichier
0,0 → 1,367
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 18 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.StyleSQLElement;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.core.supplychain.order.ui.EtatDemandeAchatRenderer;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLInjector;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
 
public class DemandeAchatItemSQLElement extends ComptaSQLConfElement {
 
public DemandeAchatItemSQLElement() {
super("DEMANDE_ACHAT_ELEMENT", "une demande d'achat", "demandes d'achat");
 
{
RowAction actionP = new RowAction(new AbstractAction("Transfert en demande de prix") {
 
@Override
public void actionPerformed(ActionEvent e) {
List<SQLRowValues> rows = IListe.get(e).getSelectedRows();
StyleSQLElement styleElt = getDirectory().getElement(StyleSQLElement.class);
int idNormal = styleElt.getAllStyleByName().get("Normal");
 
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("DEMANDE_PRIX"));
rowVals.put("DATE", new Date());
SQLInjector inj = SQLInjector.getInjector(getTable(), getTable().getTable("DEMANDE_PRIX_ELEMENT"));
for (SQLRowValues sqlRowValues : rows) {
SQLRow row = sqlRowValues.asRow();
row.fetchValues();
rowVals.put("ID_AFFAIRE", row.getForeignID("ID_AFFAIRE"));
SQLRowValues rowValsCmdElt = inj.createRowValuesFrom(row);
rowValsCmdElt.put("ID_STYLE", idNormal);
rowValsCmdElt.put("ID_TAXE", TaxeCache.getCache().getFirstTaxe().getID());
rowValsCmdElt.put("ID_DEMANDE_PRIX", rowVals);
rowValsCmdElt.put("ID_DEMANDE_ACHAT_ELEMENT", row.getID());
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
BigDecimal ha = row.getForeign("ID_ARTICLE").getBigDecimal("PA_HT");
rowValsCmdElt.put("PA_HT", ha);
rowValsCmdElt.put("PRIX_METRIQUE_HA_1", ha);
} else {
rowValsCmdElt.put("PA_HT", BigDecimal.ZERO);
rowValsCmdElt.put("PRIX_METRIQUE_HA_1", BigDecimal.ZERO);
}
}
 
EditFrame frame = new EditFrame(getDirectory().getElement("DEMANDE_PRIX"));
frame.getSQLComponent().select(rowVals);
FrameUtil.showPacked(frame);
}
}, true) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection != null && selection.size() > 0) {
int idAff = -1;
for (SQLRowValues sqlRowValues : selection) {
if (getTable().contains("ID_AFFAIRE")) {
if (sqlRowValues.getObject("ID_AFFAIRE") != null && !sqlRowValues.isForeignEmpty("ID_AFFAIRE")) {
if (idAff == -1) {
idAff = sqlRowValues.getForeignID("ID_AFFAIRE");
}
if (idAff != sqlRowValues.getForeignID("ID_AFFAIRE")) {
return false;
}
}
}
}
return true;
}
return false;
}
};
getRowActions().add(actionP);
}
{
RowAction actionP = new RowAction(new AbstractAction("Transfert en commande") {
 
@Override
public void actionPerformed(ActionEvent e) {
List<SQLRowValues> rows = IListe.get(e).getSelectedRows();
StyleSQLElement styleElt = getDirectory().getElement(StyleSQLElement.class);
int idNormal = styleElt.getAllStyleByName().get("Normal");
 
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("COMMANDE"));
rowVals.put("DATE", new Date());
SQLInjector inj = SQLInjector.getInjector(getTable(), getTable().getTable("COMMANDE_ELEMENT"));
for (SQLRowValues sqlRowValues : rows) {
SQLRow row = sqlRowValues.asRow();
row.fetchValues();
rowVals.put("ID_AFFAIRE", row.getForeignID("ID_AFFAIRE"));
SQLRowValues rowValsCmdElt = inj.createRowValuesFrom(row);
rowValsCmdElt.put("ID_STYLE", idNormal);
rowValsCmdElt.put("ID_TAXE", TaxeCache.getCache().getFirstTaxe().getID());
rowValsCmdElt.put("ID_COMMANDE", rowVals);
rowValsCmdElt.put("ID_DEMANDE_ACHAT_ELEMENT", row.getID());
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
BigDecimal ha = row.getForeign("ID_ARTICLE").getBigDecimal("PA_HT");
rowValsCmdElt.put("PA_HT", ha);
rowValsCmdElt.put("PRIX_METRIQUE_HA_1", ha);
} else {
rowValsCmdElt.put("PA_HT", BigDecimal.ZERO);
rowValsCmdElt.put("PRIX_METRIQUE_HA_1", BigDecimal.ZERO);
}
}
 
EditFrame frame = new EditFrame(getDirectory().getElement("COMMANDE"));
frame.getSQLComponent().select(rowVals);
FrameUtil.showPacked(frame);
}
}, true) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection != null && selection.size() > 0) {
int idAff = -1;
for (SQLRowValues sqlRowValues : selection) {
if (getTable().contains("ID_AFFAIRE")) {
if (sqlRowValues.getObject("ID_AFFAIRE") != null && !sqlRowValues.isForeignEmpty("ID_AFFAIRE")) {
if (idAff == -1) {
idAff = sqlRowValues.getForeignID("ID_AFFAIRE");
}
if (idAff != sqlRowValues.getForeignID("ID_AFFAIRE")) {
return false;
}
}
}
}
return true;
}
return false;
}
};
getRowActions().add(actionP);
}
}
 
public void updateStatus(final SQLTable table, final SQLTable tableElt, final int id) {
SQLRowValues rowVals = new SQLRowValues(tableElt);
rowVals.put("ID_DEMANDE_ACHAT_ELEMENT", null);
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowVals);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
 
Where w = new Where(tableElt.getField("ID_" + table.getName()), "=", id);
w = w.and(new Where(tableElt.getField("ID_DEMANDE_ACHAT_ELEMENT"), "!=", (Object) null));
w = w.and(new Where(tableElt.getField("ID_DEMANDE_ACHAT_ELEMENT"), ">", 1));
input.setWhere(w);
 
return input;
}
});
 
List<SQLRowValues> result = fetcher.fetch();
List<Integer> ids = new ArrayList<Integer>();
for (SQLRowValues sqlRowValues : result) {
ids.add(sqlRowValues.getForeignID("ID_DEMANDE_ACHAT_ELEMENT"));
}
updateAllStatus(ids);
}
 
private void updateAllStatus(final List<Integer> ids) {
 
SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("QTE", null);
rowVals.put("ID_ETAT_DEMANDE_ACHAT_ELEMENT", null);
 
final List<String> refTable = Arrays.asList("COMMANDE_ELEMENT", "DEMANDE_PRIX_ELEMENT", "BON_RECEPTION_ELEMENT");
for (String tableName : refTable) {
SQLRowValues rowValsRef = new SQLRowValues(getTable().getTable(tableName));
rowValsRef.put("QTE", null);
rowValsRef.put("ID_DEMANDE_ACHAT_ELEMENT", rowVals);
rowValsRef.put("QTE_UNITAIRE", null);
rowValsRef.put("ID_" + tableName.replaceAll("_ELEMENT", ""), null);
}
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowVals);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
 
input.setWhere(new Where(input.getTable("DEMANDE_ACHAT_ELEMENT").getKey(), ids));
 
return input;
}
});
final List<SQLRowValues> result = fetcher.fetch();
for (SQLRowValues sqlRowValues : result) {
updateStatus(sqlRowValues);
}
}
 
private void updateStatus(SQLRowValues rowValsDmd) {
Collection<SQLRowValues> rowValsBR = rowValsDmd.getReferentRows(getTable().getTable("BON_RECEPTION_ELEMENT"));
int newStatus = EtatDemandeAchatItemSQLElement.EN_ATTENTE;
final SQLRowValues createEmptyUpdateRow = rowValsDmd.createEmptyUpdateRow();
if (!rowValsBR.isEmpty()) {
int qte = 0;
int idBR = 1;
for (SQLRowValues sqlRowValues : rowValsBR) {
qte += sqlRowValues.getInt("QTE");
idBR = sqlRowValues.getForeignID("ID_BON_RECEPTION");
}
if (qte > 0) {
createEmptyUpdateRow.put("ID_BON_RECEPTION", idBR);
createEmptyUpdateRow.put("QTE_RECUE", qte);
if (qte >= rowValsDmd.getInt("QTE")) {
newStatus = EtatDemandeAchatItemSQLElement.RECPETION;
} else {
newStatus = EtatDemandeAchatItemSQLElement.RECPETION_PARTIEL;
}
}
} else {
Collection<SQLRowValues> rowValsCmd = rowValsDmd.getReferentRows(getTable().getTable("COMMANDE_ELEMENT"));
if (!rowValsCmd.isEmpty()) {
createEmptyUpdateRow.put("ID_COMMANDE", rowValsCmd.iterator().next().getForeignID("ID_COMMANDE"));
newStatus = EtatDemandeAchatItemSQLElement.COMMANDE;
} else {
Collection<SQLRowValues> rowValsDmdElt = rowValsDmd.getReferentRows(getTable().getTable("DEMANDE_PRIX_ELEMENT"));
if (!rowValsDmdElt.isEmpty()) {
newStatus = EtatDemandeAchatItemSQLElement.DEMANDE;
}
 
}
}
 
// if (newStatus != rowValsDmd.getForeignID("ID_ETAT_DEMANDE_ACHAT_ELEMENT")) {
try {
 
createEmptyUpdateRow.put("ID_ETAT_DEMANDE_ACHAT_ELEMENT", newStatus).commit();
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors la mise à jour de l'état de la demande d'achat [" + rowValsDmd.getID() + "]", e);
}
// }
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
 
l.add("REVISION");
l.add("CODE");
l.add("NOM");
l.add("QTE_UNITAIRE");
l.add("ID_UNITE_VENTE");
l.add("QTE");
l.add("ID_FABRICANT");
l.add("ID_FOURNISSEUR");
l.add("CODE_SOURCE");
l.add("NOM_SOURCE");
l.add("ID_COMMANDE");
l.add("ID_BON_RECEPTION");
l.add("QTE_RECUE");
l.add("ID_ETAT_DEMANDE_ACHAT_ELEMENT");
return l;
}
 
@Override
protected void _initTableSource(SQLTableModelSource res) {
final SQLTable foreignTable = getTable().getForeignTable("ID_ETAT_DEMANDE_ACHAT_ELEMENT");
res.init();
res.getColumn(foreignTable.getField("NOM")).setRenderer(new EtatDemandeAchatRenderer(foreignTable));
 
BaseSQLTableModelColumn dpt = new BaseSQLTableModelColumn("Prix", BigDecimal.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
if (r.getObject("ID_ARTICLE") != null && !r.isForeignEmpty("ID_ARTICLE")) {
SQLRowAccessor rA = r.getForeign("ID_ARTICLE");
return rA.getBigDecimal("PA_HT");
} else {
return null;
}
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
final SQLTable clientT = getTable().getForeignTable("ID_ARTICLE");
p = p.add(clientT);
return CollectionUtils.createSet(new FieldPath(p, "PA_HT"));
}
};
 
res.getColumns().add(dpt);
 
super._initTableSource(res);
}
 
// @Override
// public Set<String> getReadOnlyFields() {
// Set<String> s = new HashSet<String>(super.getReadOnlyFields());
// s.add("NUMERO_CARTE");
// return s;
// }
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_FOURNISSEUR");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
return ListMap.singleton(null, "CODE", "NOM");
}
 
@Override
public SQLComponent createComponent() {
return new DemandeAchatItemSQLComponent(this);
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".demande.achat";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/EtatDemandePrixSQLElement.java
Nouveau fichier
0,0 → 1,77
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 26 sept. 2012
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JTextField;
 
public class EtatDemandePrixSQLElement extends ComptaSQLConfElement {
 
public static final int REFUSE = 3;
public static final int ACCEPTE = 4;
public static final int EN_ATTENTE = 2;
public static final int EN_COURS = 5;
 
public EtatDemandePrixSQLElement() {
super("ETAT_DEMANDE_PRIX", "un état de demande de prix", "états de demande de prix");
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("NOM");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
final ListMap<String, String> res = new ListMap<String, String>();
res.add(null, "NOM");
return res;
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
public void addViews() {
this.addRequiredSQLObject(new JTextField(), "NOM", "left");
}
};
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".state";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixItemSQLElement.java
Nouveau fichier
0,0 → 1,84
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 18 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
import java.util.List;
 
public class DemandePrixItemSQLElement extends ComptaSQLConfElement {
 
public DemandePrixItemSQLElement() {
super("DEMANDE_PRIX_ELEMENT", "un élement de demande de prix", "élements de demandes de prix");
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("CODE");
l.add("NOM");
return l;
}
 
@Override
protected String getParentFFName() {
return "ID_DEMANDE_PRIX";
}
 
// @Override
// public Set<String> getReadOnlyFields() {
// Set<String> s = new HashSet<String>(super.getReadOnlyFields());
// s.add("NUMERO_CARTE");
// return s;
// }
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("CODE");
l.add("NOM");
return l;
}
 
@Override
public ListMap<String, String> getShowAs() {
return ListMap.singleton(null, getComboFields());
}
 
@Override
public SQLComponent createComponent() {
return new UISQLComponent(this) {
 
@Override
protected void addViews() {
this.addView("CODE");
this.addView("NOM");
 
}
};
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".demande.item";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixSheetXML.java
Nouveau fichier
0,0 → 1,86
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 18 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.generationDoc.AbstractSheetXMLWithDate;
import org.openconcerto.erp.generationDoc.MetaDataSheet;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
 
import java.util.Arrays;
 
public class DemandePrixSheetXML extends AbstractSheetXMLWithDate {
 
public static String TEMPLATE_ID = "DemandePrix";
public static String TEMPLATE_PROPERTY_NAME = "LocationDmd";
 
// private static final Tuple2<String, String> tuple = Tuple2.create("LocationDmd",
// "Demande de prix");
//
// public static Tuple2<String, String> getTuple2Location() {
// return tuple;
// }
 
@Override
public String getReference() {
return this.row.getString("NUMERO");
}
 
@Override
public SQLRow getRowLanguage() {
SQLRow rowClient = this.row.getForeignRow("ID_FOURNISSEUR");
if (rowClient.getTable().contains("ID_LANGUE")) {
return rowClient.getForeignRow("ID_LANGUE");
} else {
return super.getRowLanguage();
}
}
 
// FIXME Prefs printer location
public DemandePrixSheetXML(SQLRow row) {
super(row);
this.printer = PrinterNXProps.getInstance().getStringProperty("dmdCliPrinter");
this.elt = Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX");
SQLRow foreign = this.row.getForeign("ID_FOURNISSEUR");
if (foreign != null && !foreign.isUndefined()) {
MetaDataSheet meta = new MetaDataSheet();
meta.setKeywords(Arrays.asList(foreign.getString("NOM")));
setMetaGeneration(meta);
}
// Calendar cal = Calendar.getInstance();
// cal.setTime((Date) row.getObject("DATE"));
// this.locationOO = SheetXml.getLocationForTuple(tuple, false) + File.separator +
// cal.get(Calendar.YEAR);
// this.locationPDF = SheetXml.getLocationForTuple(tuple, true) + File.separator +
// cal.get(Calendar.YEAR);
}
 
@Override
public String getTemplateId() {
return "DemandePrix";
}
 
public String getName() {
return "DemandePrix_" + this.row.getString("NUMERO");
}
 
@Override
public String getDefaultTemplateId() {
return "DemandePrix";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandeAchatItemSQLComponent.java
Nouveau fichier
0,0 → 1,281
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 19 oct. 2011
*/
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FormLayouter;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.TitledSeparator;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
 
public class DemandeAchatItemSQLComponent extends TransfertBaseSQLComponent {
 
public DemandeAchatItemSQLComponent(SQLElement elt) {
super(elt);
}
 
@Override
protected void addViews() {
 
GridBagConstraints c = new DefaultGridBagConstraints();
setLayout(new GridBagLayout());
// Champ Module
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
final JPanel addP = ComptaSQLConfElement.createAdditionalPanel();
this.setAdditionalFieldsPanel(new FormLayouter(addP, 2));
this.add(addP, c);
 
c.gridx = 0;
c.gridy++;
c.gridwidth = 1;
c.weightx = 0;
this.add(new JLabel(getLabelFor("DATE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
JDate date = new JDate(true);
this.add(date, c);
this.addView(date, "DATE", REQ);
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_ETAT_DEMANDE_ACHAT_ELEMENT"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxCmd = new ElementComboBox();
this.add(boxCmd, c);
this.addView(boxCmd, "ID_ETAT_DEMANDE_ACHAT_ELEMENT", REQ);
 
c.gridx = 0;
c.gridy++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_FOURNISSEUR"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxFournisseur = new ElementComboBox();
this.add(boxFournisseur, c);
this.addView(boxFournisseur, "ID_FOURNISSEUR");
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_ARTICLE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxArticle = new ElementComboBox();
this.add(boxArticle, c);
this.addView(boxArticle, "ID_ARTICLE");
 
c.gridx = 0;
c.gridy++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_FAMILLE_ARTICLE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxFam = new ElementComboBox();
this.add(boxFam, c);
this.addView(boxFam, "ID_FAMILLE_ARTICLE", REQ);
 
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("CODE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textCode = new JTextField();
this.add(textCode, c);
this.addView(textCode, "CODE");
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("NOM"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textNom = new JTextField();
this.add(textNom, c);
this.addView(textNom, "NOM");
 
c.gridx = 0;
c.gridy++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_FABRICANT"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxFabricant = new ElementComboBox();
this.add(boxFabricant, c);
this.addView(boxFabricant, "ID_FABRICANT");
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_UNITE_VENTE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxUnite = new ElementComboBox();
this.add(boxUnite, c);
this.addView(boxUnite, "ID_UNITE_VENTE", REQ);
final JTextField textqte = new JTextField();
final JTextField textQteU = new JTextField();
 
boxUnite.addPropertyChangeListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
textQteU.setEditable(true);
if (boxUnite.getSelectedId() == UniteVenteArticleSQLElement.A_LA_PIECE) {
textQteU.setText("1");
textQteU.setEditable(false);
}
}
});
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("QTE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
this.add(textqte, c);
this.addView(textqte, "QTE");
 
c.gridx++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("QTE_UNITAIRE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
this.add(textQteU, c);
this.addView(textQteU, "QTE_UNITAIRE");
 
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("REPERE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textRepere = new JTextField();
this.add(textRepere, c);
this.addView(textRepere, "REPERE");
 
// c.gridx++;
// c.weightx = 0;
// this.add(new JLabel(getLabelFor("QTE_UNITAIRE"), SwingConstants.RIGHT), c);
// c.gridx++;
// c.weightx = 1;
// final JTextField textQteU = new JTextField();
// this.add(textQteU, c);
// this.addView(textQteU, "QTE_UNITAIRE");
 
c.gridx++;
c.weightx = 0;
this.add(new JCheckBox("En stock"), c);
 
boxArticle.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
final SQLRow selectedArt = boxArticle.getSelectedRow();
if (selectedArt != null && !selectedArt.isUndefined()) {
textCode.setEditable(false);
textNom.setEditable(false);
textCode.setText(selectedArt.getString("CODE"));
textNom.setText(selectedArt.getString("NOM"));
boxFournisseur.setValue(selectedArt.getForeign("ID_FOURNISSEUR"));
} else {
textCode.setEditable(true);
textNom.setEditable(true);
}
}
});
 
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(new TitledSeparator("Nomenclature source"), c);
 
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
c.gridwidth = 1;
this.add(new JLabel(getLabelFor("REPERE_SOURCE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textRepereSource = new JTextField();
this.add(textRepereSource, c);
this.addView(textRepereSource, "REPERE_SOURCE");
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
c.gridwidth = 1;
this.add(new JLabel(getLabelFor("CODE_SOURCE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textCodeSource = new JTextField();
this.add(textCodeSource, c);
this.addView(textCodeSource, "CODE_SOURCE");
c.gridx++;
c.weightx = 0;
c.gridwidth = 1;
this.add(new JLabel(getLabelFor("NOM_SOURCE"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final JTextField textNomSource = new JTextField();
this.add(textNomSource, c);
this.addView(textNomSource, "NOM_SOURCE");
 
}
 
@Override
protected SQLRowValues createDefaults() {
SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("QTE", 1);
rowVals.put("QTE_UNITAIRE", BigDecimal.ONE);
rowVals.put("ID_UNITE_VENTE", UniteVenteArticleSQLElement.A_LA_PIECE);
rowVals.put("ID_ETAT_DEMANDE_ACHAT_ELEMENT", EtatDemandeAchatItemSQLElement.EN_ATTENTE);
return rowVals;
}
 
@Override
protected void refreshAfterSelect(SQLRowAccessor rSource) {
// TODO Auto-generated method stub
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/component/BonReceptionSQLComponent.java
21,6 → 21,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.product.ui.ReliquatRowValuesTable;
import org.openconcerto.erp.core.supplychain.order.element.DemandeAchatItemSQLElement;
import org.openconcerto.erp.core.supplychain.receipt.element.BonReceptionSQLElement;
import org.openconcerto.erp.core.supplychain.receipt.ui.BonReceptionItemTable;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
436,6 → 437,9
}
});
 
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("BON_RECEPTION_ELEMENT"), idBon);
 
// generation du document
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(getTable().getRow(idBonFinal));
sheet.createDocumentAsynchronous();
524,13 → 528,17
 
// Mise à jour du stock
updateStock(id);
((BonReceptionSQLElement) getElement()).updateCmdElement(cmdFrom, getSelectedID());
((BonReceptionSQLElement) getElement()).updateCmdElement(cmdFrom, id);
 
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("BON_RECEPTION_ELEMENT"), id);
 
} catch (Exception e) {
ExceptionHandler.handle("Update error", e);
}
}
});
 
// generation du document
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(getTable().getRow(id));
sheet.createDocumentAsynchronous();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
80,9 → 80,15
gState.addItem("ID_LANGUE");
gState.addItem("ID_TARIF");
 
final Group gCustomProduct = new Group("customerrelationship.customer.customproduct", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomProduct.addItem("customerrelationship.customer.customproduct", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomProduct);
 
this.add(gState);
final Group gInfo = new Group("customerrelationship.customer.info", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gInfo.addItem("CODE_FOURNISSEUR");
gInfo.addItem("REMIND_DATE");
gInfo.addItem("CONDITIONS_LIVRAISON", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("INFOS", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("COMMENTAIRES", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("OBSOLETE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ClientNormalSQLElement.java
44,43 → 44,48
 
public ClientNormalSQLElement() {
super("CLIENT", "un client", "clients");
final String property = PrinterNXProps.getInstance().getProperty("QLPrinter");
if (property != null && property.trim().length() > 0) {
PredicateRowAction actionPrintLabel = new PredicateRowAction(new AbstractAction() {
try {
final String property = PrinterNXProps.getInstance().getProperty("QLPrinter");
if (property != null && property.trim().length() > 0) {
PredicateRowAction actionPrintLabel = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
printLabel(row, property);
}
}, false, "customerrelationship.customer.label.print");
actionPrintLabel.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionPrintLabel);
}
 
PredicateRowAction actionFicheClient = new PredicateRowAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
printLabel(row, property);
FicheClientXmlSheet sheet = new FicheClientXmlSheet(row.asRow());
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
}
}, false, "customerrelationship.customer.label.print");
actionPrintLabel.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionPrintLabel);
}
}, false, "customerrelationship.customer.info.create");
actionFicheClient.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionFicheClient);
 
PredicateRowAction actionFicheClient = new PredicateRowAction(new AbstractAction() {
 
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
FicheClientXmlSheet sheet = new FicheClientXmlSheet(row.asRow());
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
sendMail(IListe.get(e).getSelectedRows());
 
}
}, false, "customerrelationship.customer.info.create");
actionFicheClient.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionFicheClient);
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
 
 
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
sendMail(IListe.get(e).getSelectedRows());
 
}
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
} catch (Exception e) {
e.printStackTrace();
}
}
 
public void printLabel(SQLRowAccessor row, String qlPrinterProperty) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLElement.java
17,8 → 17,14
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.request.SQLFieldTranslator;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.light.LightUIElement;
import org.openconcerto.ui.light.LightUILine;
import org.openconcerto.ui.light.LightUIPanel;
import org.openconcerto.ui.light.SimpleTextLine;
 
import java.util.List;
 
29,7 → 35,7
final CustomerGroup group = new CustomerGroup();
GlobalMapper.getInstance().map(CustomerGroup.ID, group);
setDefaultGroup(group);
 
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
54,4 → 60,33
fields.add("OBSOLETE");
return fields;
}
 
@Override
protected void fillDataPanel(final String sessionToken, final List<SQLRowAccessor> selection, final LightUIPanel dataPanel) {
final SQLFieldTranslator translator = this.getDirectory().getTranslator();
final SQLRowAccessor sqlRow = selection.get(0);
 
final int rowId = sqlRow.getID();
final LightUILine mainLine = new LightUILine();
final LightUIPanel mainLinePanel = new LightUIPanel(dataPanel.getId() + ".main.line." + rowId);
mainLinePanel.setWeightX(1);
 
final SimpleTextLine spacer = new SimpleTextLine("", true, LightUIElement.HALIGN_LEFT, 2);
spacer.setMarginBottom(4);
 
String name = sqlRow.getString("NOM");
 
mainLinePanel.addChild(new SimpleTextLine(name, true, LightUIElement.HALIGN_LEFT));
 
final SimpleTextLine titleSituationContact = new SimpleTextLine("Coordonnées du client", true, LightUIElement.HALIGN_LEFT, 2);
titleSituationContact.setMarginTop(10);
mainLinePanel.addChild(titleSituationContact);
 
addFieldToPanel("TEL", mainLinePanel, sqlRow, translator, true, "non renseigné");
addFieldToPanel("MAIL", mainLinePanel, sqlRow, translator, true, "non renseigné");
 
mainLine.addChild(mainLinePanel);
dataPanel.addChild(mainLine);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLComponent.java
16,6 → 16,7
import org.openconcerto.erp.core.common.component.AdresseSQLComponent;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseClientItemTable;
import org.openconcerto.erp.core.sales.product.element.ClientCodeArticleTable;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.utils.TM;
import org.openconcerto.sql.Configuration;
72,6 → 73,7
 
public class CustomerSQLComponent extends GroupSQLComponent {
private ContactItemTable table;
private ClientCodeArticleTable tableCustomProduct;
private AdresseClientItemTable adresseTable = new AdresseClientItemTable();
private SQLTable contactTable = Configuration.getInstance().getDirectory().getElement("CONTACT").getTable();
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
92,6 → 94,7
public CustomerSQLComponent(SQLElement element) {
super(element);
this.table = new ContactItemTable(this.defaultContactRowVals);
this.tableCustomProduct = new ClientCodeArticleTable();
this.table.setPreferredSize(new Dimension(this.table.getSize().width, 150));
}
 
160,6 → 163,8
return new JDate(true);
} else if (id.equals("customerrelationship.customer.contacts")) {
return this.table;
} else if (id.equals("customerrelationship.customer.customproduct")) {
return this.tableCustomProduct;
} else if (id.equals("customerrelationship.customer.addresses")) {
return createAdressesComponent();
} else if (id.equals("NOM")) {
236,6 → 241,7
super.update();
final int selectedID = getSelectedID();
this.table.updateField("ID_CLIENT", selectedID);
this.tableCustomProduct.updateField("ID_CLIENT", selectedID);
this.adresseTable.updateField("ID_CLIENT", selectedID);
}
 
246,6 → 252,7
this.checkAdrFacturation.setSelected(r == null || !r.getFields().contains("ID_ADRESSE_F") || r.isForeignEmpty("ID_ADRESSE_F"));
if (r != null) {
this.table.insertFrom("ID_CLIENT", r.asRowValues());
this.tableCustomProduct.insertFrom("ID_CLIENT", r.asRowValues());
this.adresseTable.insertFrom("ID_CLIENT", r.asRowValues());
}
}
284,6 → 291,7
} else {
id = super.insert(order);
this.table.updateField("ID_CLIENT", id);
this.tableCustomProduct.updateField("ID_CLIENT", id);
this.adresseTable.updateField("ID_CLIENT", id);
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.code.getText().trim())) {
SQLRowValues rowVals = new SQLRowValues(this.tableNum);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxSheetXML.java
25,9 → 25,8
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.text.DateFormat;
48,8 → 47,8
public final static int MODELETTREE = 2;
public final static int MODENONLETTREE = 3;
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
protected Date dateDu, dateAu;
protected int id;
protected int lettrage;
141,7 → 140,7
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) JournauxSheetXML.this.compteDeb, (Object) JournauxSheetXML.this.compteEnd));
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheet.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
51,8 → 51,8
private final static SQLTable tableMvt = base.getTable("MOUVEMENT");
private final static SQLTable tableCompte = base.getTable("COMPTE_PCE");
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private SQLRow rowSociete = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
 
private Date dateDu, dateAu;
189,7 → 189,7
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033A.java
311,7 → 311,7
// 068 SommeSoldeDebit( 410, 418* )
// Racine = "410-411, 413, 416-418"
// S068=41(D)...411+41A(D)...41Z+413(D)+416(D)...418
long v068 = this.sommeCompte.soldeCompteDebiteur(411, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("413", this.dateDebut, this.dateFin)
long v068 = this.sommeCompte.soldeCompteDebiteur(410, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("413", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteDebiteur(416, 418, true, this.dateDebut, this.dateFin);
this.m.put("ACTIF1.8", GestionDevise.currencyToString(v068, false));
 
687,8 → 687,7
- this.sommeCompte.soldeCompte(1684, 1689, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("17", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("426", this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(450, 454, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(456, 456, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(458, 459, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(512, 512, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(514, 514, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(517, 517, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("5186", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(512, 517, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("518", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("519", this.dateDebut, this.dateFin);
this.m.put("PASSIF3.25", GestionDevise.currencyToString(v156, false));
 
701,7 → 700,7
// 164 -SommeSolde( 4190, 4195* )
// Racine = "4191"
// S164=-4191
long v164 = -this.sommeCompte.soldeCompte(4191, 4191, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(510, 517, true, this.dateDebut, this.dateFin);
long v164 = -this.sommeCompte.soldeCompte(4191, 4191, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(510, 511, true, this.dateDebut, this.dateFin);
this.m.put("PASSIF3.26", GestionDevise.currencyToString(v164, false));
 
// 152
787,7 → 786,7
* false) - this.sommeCompte.sommeCompteFils("509");
*/
 
long v172 = this.sommeCompte.soldeCompteCrediteur(411, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(421, 421, true, this.dateDebut, this.dateFin)
long v172 = this.sommeCompte.soldeCompteCrediteur(410, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(421, 421, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(422, 422, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(424, 424, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(427, 427, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(4282, 4282, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(4284, 4284, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(4286, 4286, true, this.dateDebut, this.dateFin)
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxMoisSheet.java
17,7 → 17,7
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
 
import java.text.DateFormat;
37,12 → 37,12
this.modele = "JournauxMois.ods";
}
 
private static DateFormat dateFormatMonth = new SimpleDateFormat("MMMM");
private static DateFormat dateFormatYear = new SimpleDateFormat("yyyy");
private static DateFormat dateFormatPG = new SimpleDateFormat("yyyy-MM-dd");
 
@Override
protected void createMap() {
final DateFormat dateFormatMonth = new SimpleDateFormat("MMMM");
final DateFormat dateFormatYear = new SimpleDateFormat("yyyy");
final DateFormat dateFormatPG = new SimpleDateFormat("yyyy-MM-dd");
 
this.mapReplace = new HashMap();
this.mCell = new HashMap();
this.mapStyleRow = new HashMap();
92,7 → 92,7
select += " AND \"" + schema + "\".\"JOURNAL\".\"ARCHIVE\"!=1";
select += " AND \"" + schema + "\".\"ECRITURE\".\"ARCHIVE\"!=1";
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
select += " AND \"" + schema + "\".\"ECRITURE\".\"COMPTE_NUMERO\" LIKE '411%'";
}
141,6 → 141,8
* CONTENU
**************************************************************************************/
Calendar cal = Calendar.getInstance();
// 1 er Jour du mois, sinon si on est aprés le 29 du mois, probleme pour février
cal.set(Calendar.DAY_OF_MONTH, 1);
// && (posLine % endFill !=0)
for (int j = 0; (j < endFill - debutFill + 1) && i < l.size(); j++) {
tmp = (Object[]) l.get(i);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxSheet.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
47,14 → 47,14
public final static int MODELETTREE = 2;
public final static int MODENONLETTREE = 3;
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
protected Date dateDu, dateAu;
protected int[] idS;
protected int lettrage;
private String compteDeb, compteEnd;
 
public static String TEMPLATE_ID = "Journaux";
public static String TEMPLATE_ID = "JournauxAncien";
public static String TEMPLATE_PROPERTY_NAME = "LocationJournaux";
 
public static void setSize(int debut, int fin) {
81,7 → 81,7
Calendar cal = Calendar.getInstance();
cal.setTime(au);
this.printer = PrinterNXProps.getInstance().getStringProperty("JournauxPrinter");
this.modele = "Journaux.ods";
this.modele = getTemplateId() + ".ods";
this.dateAu = au;
this.dateDu = du;
this.idS = id;
167,7 → 167,7
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) JournauxSheet.this.compteDeb, (Object) JournauxSheet.this.compteEnd));
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheetXML.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
48,8 → 48,8
private final static SQLTable tableMvt = base.getTable("MOUVEMENT");
private final static SQLTable tableCompte = base.getTable("COMPTE_PCE");
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private SQLRow rowSociete = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
 
private Date dateDu, dateAu;
204,7 → 204,7
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/action/ListeDesEcrituresAction.java
34,7 → 34,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
72,7 → 72,7
 
final SQLTableModelSourceOnline src;
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
src = element.getTableSource(true);
src.getReq().setWhere(new Where(element.getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
} else {
142,10 → 142,11
frame.getPanel().getListe().setSQLEditable(false);
 
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
JPopupMenu menuDroit = new JPopupMenu();
menuDroit.add(new AbstractAction("Consultation du compte") {
menuDroit.add(new AbstractAction("Consultation du compte") {
public void actionPerformed(ActionEvent event) {
SQLRowAccessor row = frame.getPanel().getListe().getSelectedRow();
((EcritureSQLElement) element).consultationCompte(ComptePCESQLElement.getRow(row.getString("COMPTE_NUMERO"), row.getString("COMPTE_NOM")));
156,6 → 157,14
EcritureSQLElement.contrePassationPiece(frame.getPanel().getListe().getSelectedId());
}
});
// menuDroit.add(new AbstractAction("Valider le mouvement") {
// public void actionPerformed(ActionEvent event) {
// if (JOptionPane.showConfirmDialog(null, "Etes vous sûr de vouloir valider le
// mouvement?") == JOptionPane.YES_OPTION) {
// EcritureSQLElement.validationEcritures(frame.getPanel().getListe().getSelectedRow().getInt("ID_MOUVEMENT"));
// }
// }
// });
 
menuDroit.add(new AbstractAction("Dupliquer") {
public void actionPerformed(ActionEvent event) {
209,7 → 218,7
public void correctNomPiece() {
SQLTable tableMvt = Configuration.getInstance().getRoot().findTable("MOUVEMENT");
SQLTable tablePiece = Configuration.getInstance().getRoot().findTable("PIECE");
SQLSelect sel = new SQLSelect(tableMvt.getBase());
SQLSelect sel = new SQLSelect();
sel.addSelect(tableMvt.getKey());
sel.addSelect(tableMvt.getField("SOURCE"));
sel.addSelect(tableMvt.getField("IDSOURCE"));
238,7 → 247,6
try {
rowVals.update();
} catch (SQLException exn) {
// TODO Bloc catch auto-généré
exn.printStackTrace();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/EtatJournauxPanel.java
26,7 → 26,7
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.GestionDevise;
 
65,7 → 65,7
 
private JTabbedPane tabbedJournaux;
private EventListenerList loadingListener = new EventListenerList();
private static final DateFormat dateFormat = new SimpleDateFormat("MMMM yyyy");
private final DateFormat dateFormat = new SimpleDateFormat("MMMM yyyy");
private static final SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final String baseName = ((ComptaPropsConfiguration) Configuration.getInstance()).getSocieteBaseName();
 
294,7 → 294,7
Where w = new Where(ecrTable.getField("ID_JOURNAL"), "=", jrnl.getId());
Where w2 = new Where(ecrTable.getField("DATE"), inf, sup);
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(ecrTable.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListPanelEcritures.java
15,7 → 15,6
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.sql.Configuration;
22,7 → 21,7
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.IListener;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
61,7 → 60,7
}
});
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
getListe().getRequest().setWhere(new Where(getElement().getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ImportEcriturePanel.java
73,7 → 73,7
 
JLabel label = new JLabel("Import depuis un fichier CSV, XLS ou ODT.");
JLabel label2 = new JLabel("Le fichier doit contenir les colonnes :");
JLabel label3 = new JLabel(" - Date (format dd/MM/yy pour le CSV)");
JLabel label3 = new JLabel(" - Date dd/MM/yyyy (dd/MM/yy pour le CSV)");
JLabel label4 = new JLabel(" - Journal");
JLabel label5 = new JLabel(" - N° de compte");
JLabel label6 = new JLabel(" - Nom de la pièce");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/GrandLivrePanel.java
28,7 → 28,7
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.TableSorter;
203,7 → 203,7
Where w = new Where(compteTable.getField("NUMERO"), function, match);
Where w2 = new Where(ecritureTable.getField("ID_COMPTE_PCE"), "=", compteTable.getKey());
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(ecritureTable.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
229,7 → 229,8
 
Object[] objTmp = (Object[]) myList.get(i);
 
final Compte compteTmp = new Compte(((Number) objTmp[0]).intValue(), objTmp[1].toString(), objTmp[2].toString(), "", ((Number) objTmp[3]).longValue(), ((Number) objTmp[4]).longValue());
final Compte compteTmp = new Compte(((Number) objTmp[0]).intValue(), objTmp[1].toString(), objTmp[2].toString(), "", ((Number) objTmp[3]).longValue(),
((Number) objTmp[4]).longValue());
 
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/LettragePanel.java
30,7 → 30,7
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
623,7 → 623,7
// filtre de selection
Where w = new Where(this.tableEcr.getField("ID_COMPTE_PCE"), "=", this.tableComptePCE.getKey());
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(this.tableEcr.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
641,6 → 641,10
w = w.and(new Where(this.tableComptePCE.getKey(), "=", idCpt));
}
 
if (this.tableEcr.getFields().contains("HIDE_LETTRAGE")) {
w = w.and(new Where(this.tableEcr.getField("HIDE_LETTRAGE"), "=", Boolean.FALSE));
}
 
// final Calendar cal = Calendar.getInstance();
// cal.setTimeInMillis(this.rangeSlide.getValue(0));
//
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PointagePanel.java
27,7 → 27,7
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
581,7 → 581,7
 
Where w = new Where(this.tableEcr.getField("ID_COMPTE_PCE"), "=", idCpt);
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(this.tableEcr.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListeEcritureParClassePanel.java
23,7 → 23,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
117,13 → 117,13
String function = "REGEXP";
String match = ccTmp.getTypeNumeroCompte();
if (elementEcriture.getTable().getServer().getSQLSystem() == SQLSystem.POSTGRESQL) {
// function = "SIMILAR TO";
// function = "SIMILAR TO";
function = "~";
// match = ccTmp.getTypeNumeroCompte().replace(".*", "%");
// match = ccTmp.getTypeNumeroCompte().replace(".*", "%");
}
 
Where w = new Where(sel.getAlias(elementEcriture.getTable().getField("COMPTE_NUMERO")), function, match);
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI + Voir avec pour fonction LIKE -->
// differents par BD??
w = w.and(new Where(elementEcriture.getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/model/Currency.java
110,6 → 110,7
mapSymbol.put("MYR", "RM");
mapSymbol.put("MUR", "₨");
mapSymbol.put("MXN", "$");
mapSymbol.put("MRO", "UM");
mapSymbol.put("MNT", "₮");
mapSymbol.put("MZN", "MT");
mapSymbol.put("NAD", "$");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/ComptePCESQLElement.java
23,9 → 23,9
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
47,7 → 47,9
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
 
import javax.swing.AbstractAction;
60,6 → 62,75
 
public class ComptePCESQLElement extends ComptaSQLConfElement {
 
private static Map<String, String> mapCompteDefault = new HashMap<String, String>();
 
static {
// "Fournisseurs"
// "Achats"
// "Clients"
// "VentesProduits"
// "VentesServices"
// "TVACollectee"
// "TVADeductible"
// "PayeAcompte"
// "PayeReglementAcompte"
// "PayeRemunerationPersonnel"
// "PayeReglement"
// "AchatCheque"
// "AchatCB"
// "AchatTraite"
// "AchatEspece"
// "VenteCheque"
// "VenteCB"
// "VenteTraite"
// "VenteEspece"
// "TVAIntraComm"
// "TVAImmo"
// "BilanOuverture"
// "BilanFermeture"
// "Resultat"
// "AchatsIntra"
// "ResultatPerte"
// "Factor"
// "PortVenteSoumisTVA"
// "PortVenteNonSoumisTVA"
// "AvanceClients"
// "ValeurEncaissement"
 
mapCompteDefault.put("FOURNISSEURS", "40");
mapCompteDefault.put("ACHATS", "60");
mapCompteDefault.put("CLIENTS", "41");
mapCompteDefault.put("VENTESPRODUITS", "701");
mapCompteDefault.put("VENTESSERVICES", "706");
mapCompteDefault.put("TVACOLLECTEE", "4457");
mapCompteDefault.put("TVADEDUCTIBLE", "4456");
mapCompteDefault.put("PAYEACOMPTE", "425");
mapCompteDefault.put("PAYEREGLEMENTACOMPTE", "511");
mapCompteDefault.put("PAYEREMUNERATIONPERSONNEL", "641");
mapCompteDefault.put("PAYEREGLEMENT", "421");
mapCompteDefault.put("ACHATCHEQUE", "512");
mapCompteDefault.put("ACHATCB", "512");
mapCompteDefault.put("ACHATTRAITE", "512");
mapCompteDefault.put("ACHATESPECE", "53");
mapCompteDefault.put("VENTECHEQUE", "512");
mapCompteDefault.put("VENTECB", "512");
mapCompteDefault.put("VENTETRAITE", "512");
mapCompteDefault.put("VENTEESPECE", "53");
mapCompteDefault.put("TVAINTRACOMM", "4452");
mapCompteDefault.put("TVAIMMO", "445620");
mapCompteDefault.put("BILANOUVERTURE", "890");
mapCompteDefault.put("BILANFERMETURE", "891");
mapCompteDefault.put("RESULTAT", "120");
mapCompteDefault.put("ACHATSINTRA", "607120");
mapCompteDefault.put("RESULTATPERTE", "129");
mapCompteDefault.put("FACTOR", "467000");
mapCompteDefault.put("PORTVENTESOUMISTVA", "708510");
mapCompteDefault.put("PORTVENTENONSOUMISTVA", "708520");
mapCompteDefault.put("AVANCECLIENTS", "4191");
mapCompteDefault.put("VALEURENCAISSEMENT", "511");
 
}
 
public ComptePCESQLElement() {
super("COMPTE_PCE", "un compte", "comptes");
 
257,13 → 328,20
SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
SQLTable compteTable = base.getTable("COMPTE_PCE");
 
SQLSelect selCompte = new SQLSelect();
selCompte.addSelectStar(compteTable);
selCompte.setWhere(new Where(compteTable.getField("NUMERO"), "=", numero.trim()));
final SQLBackgroundTableCacheItem cacheForTable = SQLBackgroundTableCache.getInstance().getCacheForTable(compteTable);
if (numero == null) {
throw new IllegalArgumentException("null numero");
}
 
List<SQLRow> myListCompte = SQLRowListRSH.execute(selCompte);
if (myListCompte.size() != 0) {
return myListCompte.get(0);
final SQLField field = compteTable.getField("NUMERO");
if (field == null) {
throw new IllegalArgumentException("no field NUMERO in table " + compteTable.getName());
}
 
SQLRow res = cacheForTable.getFirstRowContains(numero.trim(), field);
 
if (res != null) {
return res;
} else {
 
SQLRowValues rowVals = new SQLRowValues(compteTable);
309,14 → 387,17
* @throws IllegalArgumentException
*/
public static String getComptePceDefault(final String name) throws IllegalArgumentException {
final SQLBase base = Configuration.getInstance().getBase();
final SQLTable tableDefault = base.getTable("COMPTE_PCE_DEFAULT");
final SQLSelect sel = new SQLSelect();
sel.addSelect(tableDefault.getField("NUMERO_DEFAULT"));
// final SQLBase base = Configuration.getInstance().getBase();
// final SQLTable tableDefault = base.getTable("COMPTE_PCE_DEFAULT");
// final SQLSelect sel = new SQLSelect();
// sel.addSelect(tableDefault.getField("NUMERO_DEFAULT"));
//
// sel.setWhere(Where.quote("UPPER(%n) = %s", tableDefault.getField("NOM"),
// name.toUpperCase()));
//
// String numero = (String) base.getDataSource().executeScalar(sel.asString());
 
sel.setWhere(Where.quote("UPPER(%n) = %s", tableDefault.getField("NOM"), name.toUpperCase()));
 
String numero = (String) base.getDataSource().executeScalar(sel.asString());
String numero = mapCompteDefault.get(name.toUpperCase());
if (numero == null) {
throw new IllegalArgumentException("Impossible de trouver le compte PCE par défaut " + name);
} else {
324,12 → 405,16
}
}
 
public static int getIdComptePceDefault(final String name) throws Exception {
public static void setComptePceDefault(final String name, final String numero) {
mapCompteDefault.put(name, numero);
}
 
public static int getIdComptePceDefault(final String name) throws IllegalArgumentException {
final String numeroDefault = getComptePceDefault(name);
return getId(numeroDefault);
}
 
public static SQLRow getRowComptePceDefault(final String name) throws Exception {
public static SQLRow getRowComptePceDefault(final String name) throws IllegalArgumentException {
final String numeroDefault = getComptePceDefault(name);
return getRow(numeroDefault, "création automatique");
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/tax/action/ReportingTaxeComplementairePanel.java
Nouveau fichier
0,0 → 1,106
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 23 avr. 2012
*/
package org.openconcerto.erp.core.finance.tax.action;
 
import org.openconcerto.erp.generationDoc.gestcomm.ReportingTaxeComplementaireSheetXML;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Calendar;
import java.util.concurrent.ExecutionException;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class ReportingTaxeComplementairePanel extends JPanel {
 
public ReportingTaxeComplementairePanel() {
super(new GridBagLayout());
 
JLabel labelCom = new JLabel("Période du ");
 
GridBagConstraints c = new DefaultGridBagConstraints();
this.add(labelCom, c);
c.gridx++;
final JDate dateDeb = new JDate();
this.add(dateDeb, c);
c.gridx++;
JLabel labelYear = new JLabel("au");
final JDate dateFin = new JDate();
 
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
dateDeb.setValue(cal.getTime());
 
this.add(labelYear, c);
c.gridx++;
this.add(dateFin, c);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
dateFin.setValue(cal.getTime());
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
new Thread() {
public void run() {
ReportingTaxeComplementaireSheetXML sheet = new ReportingTaxeComplementaireSheetXML(dateDeb.getValue(), dateFin.getValue());
try {
sheet.createDocument();
} catch (InterruptedException exn) {
exn.printStackTrace();
} catch (ExecutionException exn) {
exn.printStackTrace();
}
sheet.showPrintAndExport(true, false, false);
 
};
}.start();
 
}
 
});
c.gridx++;
// buttonValid.setEnabled(false);
this.add(buttonValid, c);
dateDeb.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
dateFin.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/tax/model/TaxeCache.java
38,9 → 38,7
final DBRoot root = ((ComptaPropsConfiguration) Configuration.getInstance()).getRootSociete();
final SQLTable table = root.getTable("TAXE");
final SQLSelect sel = new SQLSelect();
sel.addSelect(table.getField("ID_TAXE"));
sel.addSelect(table.getField("TAUX"));
sel.addSelect(table.getField("DEFAULT"));
sel.addSelectStar(table);
return sel;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAEncaisserSQLElement.java
85,8 → 85,8
}
 
@Override
public void handle(SQLRowAccessor rowCheque, Date d, String label) throws Exception {
GenerationMvtReglementChequeClient gen = new GenerationMvtReglementChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID(), label);
public void handle(SQLRowAccessor rowBanque, SQLRowAccessor rowCheque, Date d, String label) throws Exception {
GenerationMvtReglementChequeClient gen = new GenerationMvtReglementChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID(), label, rowBanque);
gen.genere();
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAvoirClientSQLElement.java
108,7 → 108,7
}
 
@Override
public void handle(final SQLRowAccessor rowCheque, final Date d, String label) throws Exception {
public void handle(final SQLRowAccessor rowBanque, final SQLRowAccessor rowCheque, final Date d, String label) throws Exception {
GenerationMvtReglementAvoirChequeClient gen = new GenerationMvtReglementAvoirChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID());
gen.genere();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeFournisseurSQLElement.java
85,7 → 85,7
}
 
@Override
public void handle(SQLRowAccessor rowCheque, Date d, String label) throws Exception {
public void handle(final SQLRowAccessor rowBanque, SQLRowAccessor rowCheque, Date d, String label) throws Exception {
new GenerationMvtReglementChequeFourn(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), rowCheque.getID(), d);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeType.java
30,5 → 30,5
 
public void print(final List<Integer> rows, final boolean preview, final Date d);
 
public void handle(final SQLRowAccessor rowCheque, final Date d, String label) throws Exception;
public void handle(final SQLRowAccessor rowBanque, final SQLRowAccessor rowCheque, final Date d, String label) throws Exception;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/TypeReglementSQLElement.java
30,13 → 30,15
 
public class TypeReglementSQLElement extends ComptaSQLConfElement {
 
public static final int INVALID = -1;
public static final int CHEQUE = 2;
public static final int CB = 3;
public static final int ESPECE = 4;
public static final int TRAITE = 5;
public static final int INDEFINI = 6;
public static final int VIREMENT = 7;
public static final int CESU = 8;
public static final int MULTIPLE = 6;
public static final int INDEFINI = 7;
public static final int VIREMENT = 8;
public static final int CESU = 9;
 
public TypeReglementSQLElement() {
super("TYPE_REGLEMENT", "Type de règlement", "Type de règlement");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ChequeListPanel.java
18,6 → 18,7
import org.openconcerto.erp.model.GestionChequesModel;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
93,6 → 94,18
this.labelMontant = new JLabel("");
res.add(this.labelMontant, c);
 
final SQLRequestComboBox banqueSelect;
if (element.getTable().getName().equalsIgnoreCase("CHEQUE_A_ENCAISSER")) {
banqueSelect = new SQLRequestComboBox();
c.gridx++;
res.add(new JLabel(", sur la banque"), c);
c.gridx++;
banqueSelect.uiInit(element.getDirectory().getElement("BANQUE").getComboRequest());
res.add(banqueSelect, c);
} else {
banqueSelect = null;
}
 
final JButton printPreview = createPreviewBtn();
c.gridx++;
if (printPreview != null) {
136,7 → 149,7
 
c.weightx = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = 2;
c.gridwidth = 4;
res.add(text, c);
c.gridx += c.gridwidth;
c.weightx = 0;
146,7 → 159,7
}
 
// Bouton valider
this.boutonValide = createSubmitBtn(dateDepot, this.checkImpression, text);
this.boutonValide = createSubmitBtn(banqueSelect, dateDepot, this.checkImpression, text);
 
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
170,7 → 183,7
return null;
}
 
protected abstract JButton createSubmitBtn(final JDate dateDepot, JCheckBox checkImpression, final JTextComponent text);
protected abstract JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, JCheckBox checkImpression, final JTextComponent text);
 
@Override
protected final void addComponents(Container container, GridBagConstraints c) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAEncaisserPanel.java
19,7 → 19,8
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.JDate;
import org.openconcerto.utils.GestionDevise;
52,13 → 53,13
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le dépôt");
res.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String s = text.getText();
getModel().valideDepot(dateDepot.getDate(), checkImpression.isSelected(), s);
getModel().valideDepot(banqueSelect.getSelectedRow(), dateDepot.getDate(), checkImpression.isSelected(), s);
text.setText("");
}
});
68,7 → 69,7
@Override
protected void actionDroitTable() {
super.actionDroitTable();
if (UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaTotalUserRight.MENU)) {
if (UserRightsManager.getCurrentUserRights().haveRight(ComptaTotalUserRight.MENU)) {
 
getListe().addRowAction(new AbstractAction("Régularisation en comptabilité") {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesADecaisserPanel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.payment.ui;
 
import org.openconcerto.erp.core.finance.payment.element.ChequeFournisseurSQLElement;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.JDate;
 
import java.awt.event.ActionEvent;
30,7 → 31,7
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le décaissement");
res.addActionListener(new ActionListener() {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAvoirADecaisserPanel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.payment.ui;
 
import org.openconcerto.erp.core.finance.payment.element.ChequeAvoirClientSQLElement;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.JDate;
 
import java.awt.event.ActionEvent;
35,7 → 36,7
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le décaissement");
res.addActionListener(new ActionListener() {
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/RubriqueCotisationSQLElement.java
17,11 → 17,15
import org.openconcerto.erp.core.humanresources.payroll.component.FormuleTreeNode;
import org.openconcerto.erp.core.humanresources.payroll.component.RubriqueSQLComponent;
import org.openconcerto.erp.core.humanresources.payroll.component.VariableTree;
import org.openconcerto.erp.core.humanresources.payroll.report.LignePayeSimplifieeComboBox;
import org.openconcerto.erp.core.humanresources.payroll.report.LignePayeSimplifieeRowItemView;
import org.openconcerto.erp.core.humanresources.payroll.report.LigneSimplifieeCellRenderer;
import org.openconcerto.sql.element.ConfSQLElement;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.NoneSelectedButtonGroup;
57,10 → 61,18
super("RUBRIQUE_COTISATION", "une rubrique de cotisation", "rubriques de cotisation");
}
 
@Override
protected synchronized void _initTableSource(SQLTableModelSource res) {
res.init();
res.getColumn(getTable().getField("LIGNE_PAYE_SIMPLIFIEE")).setRenderer(new LigneSimplifieeCellRenderer());
super._initTableSource(res);
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("CODE");
l.add("NOM");
l.add("LIGNE_PAYE_SIMPLIFIEE");
l.add("ID_CAISSE_COTISATION");
l.add("BASE");
l.add("TX_PAT");
230,6 → 242,20
cPanel.weightx = 1;
panelProp.add(comboSelTypeImpression, cPanel);
 
// Ligne simplifiée
final JLabel labelEtat = new JLabel(getLabelFor("LIGNE_PAYE_SIMPLIFIEE"), SwingConstants.RIGHT);
cPanel.gridy++;
cPanel.gridx = 1;
cPanel.weightx = 0;
cPanel.fill = GridBagConstraints.HORIZONTAL;
panelProp.add(labelEtat, cPanel);
final LignePayeSimplifieeComboBox comboEtat = new LignePayeSimplifieeComboBox();
cPanel.gridx++;
cPanel.fill = GridBagConstraints.NONE;
cPanel.weightx = 1;
panelProp.add(comboEtat, cPanel);
addView(new LignePayeSimplifieeRowItemView(comboEtat), "LIGNE_PAYE_SIMPLIFIEE", REQ);
 
// Imposable
cPanel.gridx = 1;
cPanel.weightx = 0;
237,6 → 263,14
JCheckBox checkImpo = new JCheckBox(getLabelFor("IMPOSABLE"));
panelProp.add(checkImpo, cPanel);
 
// Imposable
cPanel.gridx = 1;
cPanel.weightx = 0;
cPanel.gridy++;
JCheckBox checkalle = new JCheckBox(getLabelFor("ALLEGEMENT_COTISATION"));
panelProp.add(checkalle, cPanel);
addView(checkalle, "ALLEGEMENT_COTISATION", REQ);
 
JLabel labelSelTypePersonnel = new JLabel("Code Type Personnel URSSAF (S21.G00.23)");
cPanel.gridy++;
cPanel.gridx = 1;
284,9 → 318,7
cPanel.weightx = 1;
panelProp.add(comboSelCodeInd, cPanel);
this.addView(comboSelCodeInd, "ID_CODE_COTISATION_INDIVIDUELLE");
 
JLabel labelSelCodeEta = new JLabel("Code cotisation établissement (S21.G00.82.002)");
cPanel.gridy++;
cPanel.gridx = 1;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/CumulsPayeSQLElement.java
113,7 → 113,7
cPanel.gridx++;
this.add(textNetAPayer, cPanel);
 
// net imposable
// heure
cPanel.gridx = 0;
cPanel.gridy++;
JLabel labelH = new JLabel(getLabelFor("HEURE_TRAV_C"));
122,6 → 122,32
cPanel.gridx++;
this.add(textH, cPanel);
 
cPanel.gridx++;
JLabel labelCice = new JLabel(getLabelFor("CICE_C"));
this.add(labelCice, cPanel);
JTextField textCice = new JTextField(10);
cPanel.gridx++;
this.add(textCice, cPanel);
 
// Allegement
cPanel.gridx = 0;
cPanel.gridy++;
JLabel labelA = new JLabel(getLabelFor("ALLEGEMENT_COTISATION_C"));
this.add(labelA, cPanel);
JTextField textA = new JTextField(10);
cPanel.gridx++;
this.add(textA, cPanel);
 
cPanel.gridx++;
JLabel labelAv = new JLabel(getLabelFor("AVANTAGE_NATURE_C"));
this.add(labelAv, cPanel);
JTextField textAv = new JTextField(10);
cPanel.gridx++;
this.add(textAv, cPanel);
 
this.addSQLObject(textAv, "AVANTAGE_NATURE_C");
this.addSQLObject(textA, "ALLEGEMENT_COTISATION_C");
 
this.addSQLObject(textCSG, "CSG_C");
this.addSQLObject(textCotPat, "COT_PAT_C");
this.addSQLObject(textCotSal, "COT_SAL_C");
129,6 → 155,7
this.addSQLObject(textNetImp, "NET_IMP_C");
this.addSQLObject(textH, "HEURE_TRAV_C");
this.addSQLObject(textSalBrut, "SAL_BRUT_C");
this.addSQLObject(textCice, "CICE_C");
}
};
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/FichePayeSQLElement.java
13,35 → 13,6
package org.openconcerto.erp.core.humanresources.payroll.element;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.JNiceButton;
54,9 → 25,9
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
71,10 → 42,39
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
 
public class FichePayeSQLElement extends ComptaSQLConfElement {
 
public FichePayeSQLElement() {
264,7 → 264,20
panelTotal.setLayout(new GridBagLayout());
GridBagConstraints cPanel = new DefaultGridBagConstraints();
 
JLabel labelInfosConges = new JLabel(getLabelFor("DETAILS_CONGES"));
panelTotal.add(labelInfosConges, cPanel);
ITextArea textConges = new ITextArea();
cPanel.gridx++;
cPanel.weightx = 1;
cPanel.gridwidth = GridBagConstraints.REMAINDER;
panelTotal.add(textConges, cPanel);
addView(textConges, "DETAILS_CONGES");
 
// Salaire brut
cPanel.weightx = 0;
cPanel.gridwidth = 1;
cPanel.gridy++;
cPanel.gridx=0;
JLabel labelBrut = new JLabel(getLabelFor("SAL_BRUT"));
panelTotal.add(labelBrut, cPanel);
JTextField textSalBrut = new JTextField(10);
342,6 → 355,16
textNetAPayer.setEditable(false);
textNetAPayer.setEnabled(false);
 
cPanel.gridx++;
JLabel labelCice = new JLabel(getLabelFor("CICE"));
panelTotal.add(labelCice, cPanel);
JTextField textCice = new JTextField(10);
cPanel.gridx++;
panelTotal.add(textCice, cPanel);
textCice.setEditable(false);
textCice.setEnabled(false);
this.addSQLObject(textCice, "CICE");
 
c.gridx = 1;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
560,24 → 583,26
});
}
 
private boolean isDateValid() {
// private boolean isDateValid() {
//
// String yearS = this.textAnnee.getText().trim();
// int annee = (yearS.length() == 0) ? 0 : Integer.parseInt(yearS);
//
// int mois = this.selMois.getSelectedId();
// // System.err.println("année " + annee + " dernAnnee " + this.dernAnnee + " mois " +
// // mois + " dernMois " + this.dernMois);
//
// return ((this.dernAnnee == 0) ? true : annee > this.dernAnnee) || ((this.dernMois ==
// 0 || this.dernMois == 13) ? true : mois > this.dernMois);
// }
//
// @Override
// public synchronized ValidState getValidState() {
// // FIXME add fireValidChange()
// return super.getValidState().and(ValidState.createCached(isDateValid(), "Date
// invalide"));
// }
 
String yearS = this.textAnnee.getText().trim();
int annee = (yearS.length() == 0) ? 0 : Integer.parseInt(yearS);
 
int mois = this.selMois.getSelectedId();
// System.err.println("année " + annee + " dernAnnee " + this.dernAnnee + " mois " +
// mois + " dernMois " + this.dernMois);
 
return ((this.dernAnnee == 0) ? true : annee > this.dernAnnee) || ((this.dernMois == 0 || this.dernMois == 13) ? true : mois > this.dernMois);
}
 
@Override
public synchronized ValidState getValidState() {
// FIXME add fireValidChange()
return super.getValidState().and(ValidState.createCached(isDateValid(), "Date invalide"));
}
 
public int insert(SQLRow order) {
 
int id = super.insert(order);
656,6 → 681,9
};
}
 
private static List<String> cumulFields = Arrays.asList("SAL_BRUT", "CSG", "COT_SAL", "COT_PAT", "NET_IMP", "HEURE_TRAV", "CICE", "AVANTAGE_NATURE", "ALLEGEMENT_COTISATION", "SAL_BASE_BRUT",
"TAXE_CM_SAL", "TAXE_CM_PAT", "SAL_BRUT_COTISABLE", "SAL_BRUT_TAXABLE");
 
@Override
protected void archive(TreesOfSQLRows trees, boolean cutLinks) throws SQLException {
super.archive(trees, cutLinks);
670,23 → 698,16
 
SQLRow rowCumuls = rowSal.getForeignRow("ID_CUMULS_PAYE");
 
float salBrut = rowCumuls.getFloat("SAL_BRUT_C") - row.getFloat("SAL_BRUT");
float cgs = rowCumuls.getFloat("CSG_C") - row.getFloat("CSG");
float cotSal = rowCumuls.getFloat("COT_SAL_C") - row.getFloat("COT_SAL");
float cotPat = rowCumuls.getFloat("COT_PAT_C") - row.getFloat("COT_PAT");
float netImp = rowCumuls.getFloat("NET_IMP_C") - row.getFloat("NET_IMP");
SQLRowValues rowValsCumul = rowCumuls.createEmptyUpdateRow();
for (String string : cumulFields) {
float cumul = rowCumuls.getFloat(string + "_C") - row.getFloat(string);
rowValsCumul.put(string + "_C", new Float(cumul));
}
// TODO stocker les heures travaillées du mois pour faire déduction
// float heure = rowCumuls.getFloat("HEURE_TRAV_C") -
// row.getFloat("HEURE_TRAV");
float netAPayer = rowCumuls.getFloat("NET_A_PAYER_C") - row.getFloat("NET_A_PAYER") - row.getFloat("ACOMPTE");
 
SQLRowValues rowValsCumul = rowCumuls.createEmptyUpdateRow();
rowValsCumul.put("SAL_BRUT_C", new Float(salBrut));
rowValsCumul.put("COT_SAL_C", new Float(cotSal));
rowValsCumul.put("COT_PAT_C", new Float(cotPat));
rowValsCumul.put("NET_IMP_C", new Float(netImp));
rowValsCumul.put("NET_A_PAYER_C", new Float(netAPayer));
rowValsCumul.put("CSG_C", new Float(cgs));
// rowValsCumul.put("HEURE_TRAV_C", new Float(heure));
 
try {
772,8 → 793,12
int annee = rowFiche.getInt("ANNEE");
rowValsNewFiche.put("ID_MOIS", mois);
rowValsNewFiche.put("ANNEE", annee);
rowValsNewFiche.put("DU", rowFiche.getObject("DU"));
rowValsNewFiche.put("AU", rowFiche.getObject("AU"));
final Calendar calDu = rowFiche.getDate("DU");
calDu.add(Calendar.MONTH, 1);
calDu.set(Calendar.DAY_OF_MONTH, 1);
rowValsNewFiche.put("DU", calDu.getTime());
calDu.set(Calendar.DAY_OF_MONTH, calDu.getActualMaximum(Calendar.DAY_OF_MONTH));
rowValsNewFiche.put("AU", calDu.getTime());
rowValsNewFiche.put("ID_PROFIL_PAYE", rowFiche.getInt("ID_PROFIL_PAYE"));
 
/*
834,22 → 859,13
int idCumuls = rowSal.getInt("ID_CUMULS_PAYE");
SQLRow rowCumuls = tableCumuls.getRow(idCumuls);
 
float salBrut = rowCumuls.getFloat("SAL_BRUT_C") + rowFiche.getFloat("SAL_BRUT");
float cgs = rowCumuls.getFloat("CSG_C") + rowFiche.getFloat("CSG");
float cotSal = rowCumuls.getFloat("COT_SAL_C") + rowFiche.getFloat("COT_SAL");
float cotPat = rowCumuls.getFloat("COT_PAT_C") + rowFiche.getFloat("COT_PAT");
float netImp = rowCumuls.getFloat("NET_IMP_C") + rowFiche.getFloat("NET_IMP");
float hTrav = rowCumuls.getFloat("HEURE_TRAV_C") + rowVarSal.getFloat("HEURE_TRAV");
SQLRowValues rowValsCumul = new SQLRowValues(tableCumuls);
for (String string : cumulFields) {
float cumul = rowCumuls.getFloat(string + "_C") + rowFiche.getFloat(string);
rowValsCumul.put(string + "_C", new Float(cumul));
}
float netAPayer = rowCumuls.getFloat("NET_A_PAYER_C") + rowFiche.getFloat("NET_A_PAYER") + rowFiche.getFloat("ACOMPTE");
 
SQLRowValues rowValsCumul = new SQLRowValues(tableCumuls);
rowValsCumul.put("SAL_BRUT_C", new Float(salBrut));
rowValsCumul.put("HEURE_TRAV_C", new Float(hTrav));
rowValsCumul.put("COT_SAL_C", new Float(cotSal));
rowValsCumul.put("COT_PAT_C", new Float(cotPat));
rowValsCumul.put("NET_IMP_C", new Float(netImp));
rowValsCumul.put("NET_A_PAYER_C", new Float(netAPayer));
rowValsCumul.put("CSG_C", new Float(cgs));
 
SQLRow r = rowValsCumul.insert();
rowValsCumul.put("ID", r.getID());
918,10 → 934,16
// Remise à 0 des variables sal
final SQLRowValues rowVals = new SQLRowValues(tableVariableSal);
for (final SQLField field : tableVariableSal.getContentFields()) {
if (field.getType().getJavaType() == Integer.class) {
rowVals.put(field.getName(), 0);
} else {
rowVals.put(field.getName(), Float.valueOf(0));
if (!field.getName().endsWith("_DEFAULT_VAL")) {
if (tableVariableSal.contains(field.getName() + "_DEFAULT_VAL")) {
rowVals.put(field.getName(), rowVarSal.getObject(field.getName() + "_DEFAULT_VAL"));
} else {
if (field.getType().getJavaType() == Integer.class) {
rowVals.put(field.getName(), 0);
} else {
rowVals.put(field.getName(), Float.valueOf(0));
}
}
}
}
rowVals.put("HEURE_TRAV", rowSalInfosPaye.getObject("DUREE_MOIS"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/VariableSalarieSQLElement.java
14,13 → 14,17
package org.openconcerto.erp.core.humanresources.payroll.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import javax.swing.JLabel;
import javax.swing.JTextField;
 
public class VariableSalarieSQLElement extends ComptaSQLConfElement {
37,7 → 41,7
 
String field = sqlField.getName();
if (!field.equalsIgnoreCase("ID_USER_COMMON_CREATE") && !field.equalsIgnoreCase("ID_USER_COMMON_MODIFY") && !field.equalsIgnoreCase("MODIFICATION_DATE")
&& !field.equalsIgnoreCase("CREATION_DATE")) {
&& !field.equalsIgnoreCase("CREATION_DATE") && !field.endsWith("_DEFAULT_VAL")) {
l.add(field);
}
}
62,20 → 66,39
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
return new BaseSQLComponent(this) {
public void addViews() {
 
int pos = 0;
this.setLayout(new GridBagLayout());
 
GridBagConstraints c = new DefaultGridBagConstraints();
c.gridx = GridBagConstraints.RELATIVE;
this.add(new JLabel("Nom de la variable"), c);
this.add(new JLabel("Valeur période courante"), c);
this.add(new JLabel("Valeur d'initialisation par défaut(prochain bulletin)"), c);
 
final List<String> listFields = getListFields();
 
for (String i : listFields) {
for (String fieldName : listFields) {
 
if (pos % 2 == 0) {
this.addSQLObject(new JTextField(15), i, "left");
} else {
this.addSQLObject(new JTextField(15), i, "right");
c.gridy++;
this.add(new JLabel(getLabelFor(fieldName)), c);
final JTextField textFieldVal = new JTextField(15);
this.add(textFieldVal, c);
this.addView(textFieldVal, fieldName);
if (getTable().contains(fieldName + "_DEFAULT_VAL")) {
final JTextField textFieldValDef = new JTextField(15);
this.add(textFieldValDef, c);
this.addView(textFieldValDef, fieldName + "_DEFAULT_VAL");
 
}
 
// if (pos % 2 == 0) {
// this.addSQLObject(new JTextField(15), i, "left");
// } else {
// this.addSQLObject(new JTextField(15), i, "right");
// }
 
}
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/VariablePayeSQLElement.java
175,9 → 175,12
l.add("HEURE_150");
l.add("HEURE_200");
l.add("SAL_BRUT_C");
l.add("HEURE_TRAV_C");
l.add("NET_A_PAYER_C");
l.add("NET_IMP_C");
 
l.add("ANCIENNETE_JOUR");
 
l.add("COEFF");
l.add("ECHELON");
l.add("NIVEAU");
233,7 → 236,6
l.add(tableInfos.getField("PRIME_PANIER"));
l.add(tableInfos.getField("PRIME_TRANSPORT"));
}
 
mapTree.put("Contrat salarié", l);
 
List<SQLField> l2 = new ArrayList<SQLField>();
241,6 → 243,11
l2.add(tableFichePaye.getField("CONGES_ACQUIS"));
l2.add(tableFichePaye.getField("ACOMPTE"));
l2.add(tableFichePaye.getField("SAL_BRUT"));
l2.add(tableFichePaye.getField("SAL_BRUT_TAXABLE"));
l2.add(tableFichePaye.getField("SAL_BASE_BRUT"));
l2.add(tableFichePaye.getField("TAXE_CM_SAL"));
l2.add(tableFichePaye.getField("TAXE_CM_PAT"));
l2.add(tableFichePaye.getField("SAL_BRUT_COTISABLE"));
l2.add(tableFichePaye.getField("COT_PAT"));
l2.add(tableFichePaye.getField("COT_SAL"));
l2.add(tableFichePaye.getField("NET_IMP"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/CodePenibiliteContratSQLElement.java
16,10 → 16,10
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.utils.ListMap;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;
30,6 → 30,14
super("CODE_PENIBILITE_CONTRAT_SALARIE", "un rattachement code pénibilité contrat salarié", "rattachements code pénibilité contrat salarié");
}
 
@Override
protected void setupLinks(SQLElementLinksSetup links) {
super.setupLinks(links);
if (getTable().contains("ID_INFOS_SALARIE_PAYE")) {
links.get("ID_INFOS_SALARIE_PAYE").setType(LinkType.ASSOCIATION);
}
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_CODE_PENIBILITE");
49,11 → 57,6
}
 
@Override
protected String getParentFFName() {
return "ID_INFOS_SALARIE_PAYE";
}
 
@Override
protected String createCode() {
return "humanresources.payroll.penibilite.contrat";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/SalarieSQLElement.java
15,6 → 15,7
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLComponent;
61,6 → 62,10
public SalarieSQLElement() {
super("SALARIE", "un salarié", "salariés");
 
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
 
PredicateRowAction actionNewContrat = new PredicateRowAction(new AbstractAction("Créer un nouveau contrat") {
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LigneSimplifieeCellRenderer.java
Nouveau fichier
0,0 → 1,32
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import java.awt.Component;
 
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
public class LigneSimplifieeCellRenderer extends DefaultTableCellRenderer {
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
String result = "";
if (value != null && value.toString().length() > 0) {
String i = (String) value;
result = LignePayeSimplifiee.fromID(i).getTranslation();
}
return super.getTableCellRendererComponent(table, result, isSelected, hasFocus, row, column);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LignePayeSimplifieeComboBox.java
Nouveau fichier
0,0 → 1,123
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.sql.request.SQLRowItemView;
import org.openconcerto.sql.sqlobject.itemview.RowItemViewComponent;
import org.openconcerto.ui.valuewrapper.ValueChangeSupport;
import org.openconcerto.ui.valuewrapper.ValueWrapper;
import org.openconcerto.utils.checks.ValidListener;
import org.openconcerto.utils.checks.ValidState;
import org.openconcerto.utils.doc.Documented;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
 
import javax.swing.JComboBox;
import javax.swing.JComponent;
 
public class LignePayeSimplifieeComboBox extends JComboBox implements ValueWrapper<LignePayeSimplifiee>, Documented, RowItemViewComponent {
private final ValueChangeSupport<LignePayeSimplifiee> supp;
 
public LignePayeSimplifieeComboBox() {
 
this.supp = new ValueChangeSupport<LignePayeSimplifiee>(this);
this.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
supp.fireValueChange();
}
});
 
for (LignePayeSimplifiee etat : LignePayeSimplifiee.values()) {
addItem(etat);
}
}
 
@Override
public ValidState getValidState() {
return ValidState.getTrueInstance();
}
 
@Override
public void addValidListener(ValidListener l) {
this.supp.addValidListener(l);
}
 
@Override
public void removeValidListener(ValidListener l) {
this.supp.removeValidListener(l);
}
 
@Override
public void setValue(LignePayeSimplifiee val) {
this.setSelectedItem(val);
}
 
@Override
public void resetValue() {
// TODO Auto-generated method stub
 
}
 
@Override
public LignePayeSimplifiee getValue() {
return (LignePayeSimplifiee) this.getSelectedItem();
}
 
@Override
public void addValueListener(PropertyChangeListener l) {
this.supp.addValueListener(l);
}
 
@Override
public void rmValueListener(PropertyChangeListener l) {
this.supp.addValueListener(l);
}
 
@Override
public void init(SQLRowItemView v) {
// TODO Auto-generated method stub
 
}
 
@Override
public String getGenericDoc() {
return "";
}
 
@Override
public String getDocId() {
 
return "LignePayeSimplifiee";
}
 
@Override
public boolean onScreen() {
return true;
}
 
@Override
public boolean isDocTransversable() {
return false;
}
 
@Override
public JComponent getComp() {
return this;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LignePayeSimplifiee.java
Nouveau fichier
0,0 → 1,62
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.util.HashMap;
import java.util.Map;
 
public enum LignePayeSimplifiee {
 
SANTE_SECURITE("sante.securite"), SANTE_COMPLEMENAIRE_DECES("sante.complementaire.deces"), SANTE_COMPLEMENAIRE_SANTE("sante.complementaire.sante"), ACCIDENTS_TRAVAIL(
"accident.accident"), RETRAITE_SECURITE_PLAF("retraite.securite.plaf"), RETRAITE_SECURITE_NON_PLAF("retraite.securite.non.plaf"), RETRAITE_COMPLEMENTAIRE_T1(
"retraite.tranche1"), RETRAITE_COMPLEMENTAIRE_T2("retraite.tranche2"), RETRAITE_COMPLEMENTAIRE_TA("retraite.trancheA"), RETRAITE_COMPLEMENTAIRE_GMP(
"retraite.GMP"), RETRAITE_COMPLEMENTAIRE_TB("retraite.trancheB"), RETRAITE_COMPLEMENTAIRE_TC("retraite.trancheC"), RETRAITE_SUPPLEMENTAIRE(
"retraite.supplementaire"), FAMILLE_ALLOCATIONS("famille.famille.allocations"), ASSURANCE_CHOMAGE_CHOMAGE("chomage.chomage"), ASSURANCE_CHOMAGE_APEC(
"chomage.apec"), COTISATIONS_STATUAIRES("cotisations.statuaires.ligne"), AUTRES_CONTRIBUTIONS("autres.contributions.ligne"), CSG_NON_IMP(
"csg.nonimp.ligne"), CSG_IMP("csg.imp.ligne"), ALLEGEMENT_COTISATIONS("allegement.cotisations.ligne"), IGNORE("paye.simplifie.ignore");
 
private final String id;
 
private LignePayeSimplifiee(String id) {
this.id = id;
}
 
public String getId() {
return id;
}