Ajout : doc/
authorJulien Moutinho <julm+tool+hledger@autogeree.net>
Tue, 29 Jul 2014 19:50:46 +0000 (21:50 +0200)
committerJulien Moutinho <julm+tool+hledger@autogeree.net>
Tue, 29 Jul 2014 19:51:42 +0000 (21:51 +0200)
17 files changed:
.gitmodules [new file with mode: 0644]
doc/... [new symlink]
doc/.gitignore [new file with mode: 0644]
doc/GNUmakefile [new file with mode: 0644]
doc/data/Cyclofficine.Plan_comptable.hledger [new file with mode: 0644]
doc/data/gvimdiff-cumulative-historical.png [new file with mode: 0644]
doc/data/hledger.splash.png [new file with mode: 0644]
doc/hledger.fr.slidy.ad [new file with mode: 0644]
doc/hledger.fr.slidy.css [new file with mode: 0644]
doc/hledger.fr.slidy.d [new file with mode: 0644]
doc/hledger.fr.slidy.html [new file with mode: 0644]
doc/icons [new symlink]
doc/javascripts/LaTeXMathML.js [new symlink]
doc/javascripts/asciidoc.js [new symlink]
doc/make [new file with mode: 0644]
doc/slidy2-install [new symlink]
lib/tool/asciidoc [new submodule]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..0310995
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "lib/tool/asciidoc"]
+       path = lib/tool/asciidoc
+       url = ./asciidoc
diff --git a/doc/... b/doc/...
new file mode 120000 (symlink)
index 0000000..a96aa0e
--- /dev/null
+++ b/doc/...
@@ -0,0 +1 @@
+..
\ No newline at end of file
diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644 (file)
index 0000000..7dcbd51
--- /dev/null
@@ -0,0 +1,3 @@
+old
+*.zip
+test.*
diff --git a/doc/GNUmakefile b/doc/GNUmakefile
new file mode 100644 (file)
index 0000000..fc5343d
--- /dev/null
@@ -0,0 +1,38 @@
+tool:=$(dir $(lastword $(MAKEFILE_LIST)))
+
+all: $(HOME)/.asciidoc/backends/slidy2
+
+$(HOME)/.asciidoc/backends/slidy2: tool:=$(tool)
+$(HOME)/.asciidoc/backends/slidy2: \
+ $(tool)/.../lib/tool/asciidoc/backend/slidy2/install
+       $<
+
+tool/asciidoc := $(tool)/.../lib/tool/asciidoc
+include $(tool/asciidoc)/GNUmakefile
+
+export VERSION:=$(patsubst v%,%,$(shell which git >/dev/null && \
+       git describe --tags --match 'v[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]' --always || \
+       TZ=UTC date +'v%Y.%m.%d'))
+
+### lib
+tool/lib/targets:=$(addprefix .../,$(shell cd ... && git config -f .gitmodules \
+ --get-regexp submodule'\.lib/.*\.'path | \
+ cut -d ' ' -f 2))
+.PHONY: $(tool/lib/targets) $(tool)/lib/all $(tool)/lib
+$(tool/lib/targets):
+       cd "$(tool)"/... && git submodule update --init -- $(patsubst .../%,%,$@)
+       cd "$(tool)"/$@ && git checkout -f HEAD && git clean -dfx
+$(tool)/.../lib: $(tool)/lib/all
+$(tool)/.../lib/all: $(tool/lib/targets)
+$(tool)/.../lib/tool/asciidoc/GNUmakefile: \
+ $(if $(wildcard .../lib/tool/asciidoc/.git),,.../lib/tool/asciidoc)
+       
+
+### slidy
+%.slidy.html: export ASCIIDOC_FLAGS+=-arevnumber="$(VERSION)"
+%.slidy.html: export ASCIIDOC_FLAGS+=-atabsize=0
+%.slidy.html: export ASCIIDOC_FLAGS+=-alatexmath=0
+
+$(patsubst %.ad,%.html,$(wildcard *.slidy.ad)): \
+ $(tool/asciidoc)/conf/latexmath.conf \
+ $(tool/asciidoc)/conf/vim.conf
diff --git a/doc/data/Cyclofficine.Plan_comptable.hledger b/doc/data/Cyclofficine.Plan_comptable.hledger
new file mode 100644 (file)
index 0000000..a40fb83
--- /dev/null
@@ -0,0 +1,379 @@
+01/01 Initialisation des comptes
+       1.Capital                                                                                  0  ; 1. COMPTES DE CAPITAUX
+       1.Capital:0.Fonds                                                                          0  ; 10. Fonds associatifs et reserves
+       1.Capital:0.Fonds:2.SDR                                                                    0  ; 102. Fonds associatifs sans droit de reprise (SDR)
+       1.Capital:0.Fonds:2.SDR:4.Apport                                                           0  ; 1024. Apports SDR
+       1.Capital:0.Fonds:2.SDR:6.Sub_invest_BR                                                    0  ; 1026. Subventions d’investissement (biens renouvelables) SDR
+       1.Capital:0.Fonds:3.ADR                                                                    0  ; 103. Fonds associatifs avec droit de reprise (ADR)
+       1.Capital:0.Fonds:3.ADR:4.Apport                                                           0  ; 1034. Apports ADR
+       1.Capital:0.Fonds:3.ADR:6.Sub_invest_BR                                                    0  ; 1036. Subventions d’investissement (biens renouvelables) ADR
+       1.Capital:0.Fonds:6.Réserve                                                                0  ; 106. Réserves
+       1.Capital:0.Fonds:6.Réserve:3.Statutaire                                                   0  ; 1063. Réserves statutaires ou contractuelles
+       1.Capital:0.Fonds:6.Réserve:8.Autre                                                        0  ; 1068. Autres réserves (dont réserves pour projet associatif)
+       1.Capital:1.Report                                                                         0  ; 11. Report à nouveau
+       1.Capital:1.Report:0.Bénéfice                                                              0  ; 110. Report à nouveau (solde créditeur/bénéfice)
+       1.Capital:1.Report:5.Financeur                                                             0  ; 115. Résultats sous contrôle de tiers financeurs
+       1.Capital:1.Report:9.Déficit                                                               0  ; 119. Report à nouveau (solde débiteur/perte)
+       1.Capital:2.Résultat                                                                       0  ; 12. Résultat net de l’exercice
+       1.Capital:2.Résultat:0.Bénéfice                                                            0  ; 120. Résultat de l’exercice (excédent/bénéfice)
+       1.Capital:2.Résultat:9.Déficit                                                             0  ; 129. Résultat de l’exercice (déficit/perte)
+       1.Capital:3.Sub_invest_BNR                                                                 0  ; 13. Subventions d’investissements (biens non renouvelables) ADR
+       1.Capital:3.Sub_invest_BNR:1.Equipement                                                    0  ; 131. Subventions d’équipement
+       1.Capital:3.Sub_invest_BNR:1.Equipement:1.État                                             0  ; 1311. État
+       1.Capital:3.Sub_invest_BNR:1.Equipement:2.Région                                           0  ; 1312. Région
+       1.Capital:3.Sub_invest_BNR:1.Equipement:3.Département                                      0  ; 1313. Département
+       1.Capital:3.Sub_invest_BNR:1.Equipement:4.Commune                                          0  ; 1314. Commune
+       1.Capital:3.Sub_invest_BNR:1.Equipement:5.Collectivité_publique                            0  ; 1315. Collectivités publiques
+       1.Capital:3.Sub_invest_BNR:1.Equipement:6.Entreprise_publique                              0  ; 1316. Entreprises publiques
+       1.Capital:3.Sub_invest_BNR:1.Equipement:7.Organisme_privé                                  0  ; 1317. Entreprises et organismes privés
+       1.Capital:3.Sub_invest_BNR:1.Equipement:8.Autre                                            0  ; 1318. Autres
+       1.Capital:3.Sub_invest_BNR:8.Autre                                                         0  ; 138. Autres subventions d’investissement
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat                                               0  ; 139. Subventions d’investissements inscrites au compte de résultat
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement                                  0  ; 1391. Subvention d'équipement
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:1.État                           0  ; 13911. État
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:2.Région                         0  ; 13912. Région
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:3.Département                    0  ; 13913. Département
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:4.Commune                        0  ; 13914. Commune
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:5.Collectivité_publique          0  ; 13915. Collectivités publiques
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:6.Entreprise_publique            0  ; 13916. Entreprises publiques
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:7.Organisme_privé                0  ; 13917. Entreprises et organismes privés
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:1.Equipement:8.Autre                          0  ; 13918. Autres
+       1.Capital:3.Sub_invest_BNR:9.Compte_résultat:2.Autre                                       0  ; 1392. Autres subventions d'investissement
+       1.Capital:5.Provision_risque&charge                                                        0  ; 15. Provisions pour risques et charges
+       1.Capital:5.Provision_risque&charge:1.Risque                                               0  ; 151. Provisions pour risques
+       1.Capital:5.Provision_risque&charge:5.Impôt                                                0  ; 155. Provisions pour impôts
+       1.Capital:5.Provision_risque&charge:8.Autre                                                0  ; 158. Autres provisions pour charges
+       1.Capital:5.Provision_risque&charge:8.Autre:2.Congés_à_payer                               0  ; 1582. Provisions pour congés à payer
+       1.Capital:6.Emprunt,Dette                                                                  0  ; 16. Emprunts et dettes assimilees
+       1.Capital:6.Emprunt,Dette:4.Etablissement_crédit                                           0  ; 164. Emprunts auprès des établissements de crédit
+       1.Capital:6.Emprunt,Dette:5.Dépôt,Caution                                                  0  ; 165. Dépôts et cautionnements reçus
+       1.Capital:6.Emprunt,Dette:8.Autre                                                          0  ; 168. Autres emprunts et dettes assimilées
+       1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt                                                0  ; 1681. Autres emprunts
+       1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:1.Bénévole                                     0  ; 16811. Bénévoles
+       1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:2.Salarié-e                                    0  ; 16812. Salarié-e-s
+       1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:3.Cyclofficine                                 0  ; 16813. Cyclofficine
+       1.Capital:6.Emprunt,Dette:8.Autre:1.Emprunt:4.Autre                                        0  ; 16814. Autre
+       1.Capital:6.Emprunt,Dette:8.Autre:7.Dette                                                  0  ; 1687. Autres dettes
+       1.Capital:9.Fonds_dédiés                                                                   0  ; 19. Fonds dédiés
+       1.Capital:9.Fonds_dédiés:4.Sub_exploit                                                     0  ; 194. Fonds dédiés sur subventions de fonctionnement
+       1.Capital:9.Fonds_dédiés:5.Don_affecté                                                     0  ; 195. Fonds dédiés sur dons manuels affectés
+       2.Immobilisation                                                                           0  ; 2. COMPTES D'IMMOBILISATIONS
+       2.Immobilisation:1.Corporelle                                                              0  ; 21. Immobilisations corporelles
+       2.Immobilisation:1.Corporelle:5.Equipement                                                 0  ; 215. Installations techniques, matériel et outillage industriels
+       2.Immobilisation:1.Corporelle:8.Autre                                                      0  ; 218. Autres immobilisations corporelles
+       2.Immobilisation:1.Corporelle:8.Autre:1.Travaux                                            0  ; 2181. Installation générale, agencement, aménagement divers
+       2.Immobilisation:1.Corporelle:8.Autre:2.Transport                                          0  ; 2182. Matériel de transport
+       2.Immobilisation:1.Corporelle:8.Autre:3.Matériel_bureau&info                               0  ; 2183. Matériel de bureau et matériel informatique
+       2.Immobilisation:1.Corporelle:8.Autre:4.Mobilier                                           0  ; 2184. Mobilier
+       2.Immobilisation:2.Concession                                                              0  ; 22. Immobilisations mises en concession
+       2.Immobilisation:2.Concession:8.Immo_grévées_droits                                        0  ; 228. Immobilisations grevées de droits
+       2.Immobilisation:2.Concession:9.Droits_propriétaire                                        0  ; 229. Droits des propriétaires
+       2.Immobilisation:6.Participation                                                           0  ; 26.Participations et créances rattachées à des participations
+       2.Immobilisation:6.Participation:1.Titre                                                   0  ; 261. Titres de participation
+       2.Immobilisation:6.Participation:1.Titre:8.Autre                                           0  ; 2618. Autres titres
+       2.Immobilisation:7.Financière                                                              0  ; 27. Autres immobilisations financières
+       2.Immobilisation:7.Financière:4.Prêt                                                       0  ; 274. Prêts
+       2.Immobilisation:7.Financière:4.Prêt:3.Au_personnel                                        0  ; 2743. Prêts au personnel
+       2.Immobilisation:7.Financière:4.Prêt:8.Autre                                               0  ; 2748. Autres prêts
+       2.Immobilisation:7.Financière:5.Dépôt,Caution                                              0  ; 275. Dépôts et cautionnements versés
+       2.Immobilisation:8.Amortissement                                                           0  ; 28. Amortissements des immobilisations
+       2.Immobilisation:8.Amortissement:1.Immo_corp                                               0  ; 281. Amortissements des immobilisations corporelles
+       2.Immobilisation:8.Amortissement:1.Immo_corp:5.Equipement                                  0  ; 2815. Installations techniques, matériel et outillage industriels (même ventilation que celle du_compte_215)
+       2.Immobilisation:8.Amortissement:1.Immo_corp:8.Autre                                       0  ; 2818. Autres immobilisations corporelles
+       4.Tiers                                                                                    0  ; 4. COMPTES TIERS
+       4.Tiers:0.Fournisseur                                                                      0  ; 40. Fournisseurs et comptes rattachés
+       4.Tiers:0.Fournisseur:1.Fournisseur                                                        0  ; 401. Fournisseurs
+       4.Tiers:0.Fournisseur:1.Fournisseur:1.Bien,Prestation                                      0  ; 4011. Fournisseurs - achats de biens ou de prestations de services
+       4.Tiers:0.Fournisseur:1.Fournisseur:7.Retenue_garantie                                     0  ; 4017. Fournisseurs - Retenue de garantie
+       4.Tiers:0.Fournisseur:3.Effets_à_payer                                                     0  ; 403. Fournisseurs - effets à payer
+       4.Tiers:0.Fournisseur:4.Immobilisation                                                     0  ; 404. Fournisseurs d’immobilisations
+       4.Tiers:0.Fournisseur:4.Immobilisation:1.Achat                                             0  ; 4041. Fournisseurs - Achats d'immobilisations
+       4.Tiers:0.Fournisseur:4.Immobilisation:7.Retenue_garantie                                  0  ; 4047. Fournisseurs d'immobilisations - Retenue de garantie
+       4.Tiers:0.Fournisseur:5.Immo_effets_à_payer                                                0  ; 405. Fournisseurs d’immobilisations - Effets à payer
+       4.Tiers:0.Fournisseur:8.Facture_non_parvenue                                               0  ; 408. Fournisseurs - Factures non parvenues
+       4.Tiers:0.Fournisseur:8.Facture_non_parvenue:1.Bien,Prestation                             0  ; 4081. Fournisseurs - Achats de biens ou prestations de service
+       4.Tiers:0.Fournisseur:8.Facture_non_parvenue:4.Immobilisation                              0  ; 4084. Fournisseurs - Achats d'immobilisations
+       4.Tiers:0.Fournisseur:9.Débiteur                                                           0  ; 409. Fournisseurs débiteurs
+       4.Tiers:0.Fournisseur:9.Débiteur:1.Accompte                                                0  ; 4091. Fournisseurs - Avances et accomptes versés sur commandes
+       4.Tiers:0.Fournisseur:9.Débiteur:7.Autre_avoir                                             0  ; 4097. Autres avoirs
+       4.Tiers:1.Client                                                                           0  ; 41. Usagers et comptes rattachés
+       4.Tiers:1.Client:1.Client                                                                  0  ; 411. Clients
+       4.Tiers:1.Client:1.Client:1.Bien,Prestation                                                0  ; 4111. Clients - Vente de biens et prestations de service
+       4.Tiers:1.Client:1.Client:7.Retenue_garantie                                               0  ; 4117. Clients - Retenue de garantie
+       4.Tiers:1.Client:3.Effets_à_recevoir                                                       0  ; 413. Clients - Effets à recevoir
+       4.Tiers:1.Client:8.Produit_non_facturé                                                     0  ; 418. Clients - Produits non encore facturés
+       4.Tiers:1.Client:9.Créditeur                                                               0  ; 419. Clients créditeurs
+       4.Tiers:1.Client:9.Créditeur:1.Accompte                                                    0  ; 4191. Clients - Avances et accomptes versés sur commandes
+       4.Tiers:1.Client:9.Créditeur:7.Autre_avoir                                                 0  ; 4197. Clients - Autres avoirs
+       4.Tiers:2.Personnel                                                                        0  ; 42. Personnel et comptes rattachés
+       4.Tiers:2.Personnel:1.Rémunération                                                         0  ; 421. Rémunérations dues
+       4.Tiers:2.Personnel:1.Rémunération:011801.S_Arca                                           0  ; 421011801. S. Arca
+       4.Tiers:2.Personnel:1.Rémunération:030101.G_Caprarelli                                     0  ; 421030101. G. Caprarelli
+       4.Tiers:2.Personnel:1.Rémunération:060101.T_Favier                                         0  ; 421060101. T.Favier
+       4.Tiers:2.Personnel:1.Rémunération:131501.A_Morin                                          0  ; 421131501. A. Morin
+       4.Tiers:2.Personnel:1.Rémunération:161501.S_Popek                                          0  ; 421161501. S. Popek
+       4.Tiers:2.Personnel:5.Avances                                                              0  ; 425. Personnel - Avances et accomptes
+       4.Tiers:2.Personnel:8.CP&PR                                                                0  ; 428. Personnel - Charges à payer et produits à recevoir
+       4.Tiers:2.Personnel:8.CP&PR:2.Congés_à_payer                                               0  ; 4282. Dettes provisionnées pour congés à payer
+       4.Tiers:2.Personnel:8.CP&PR:6.Autre_charge_à_payer                                         0  ; 4286. Autres charges à payer
+       4.Tiers:2.Personnel:8.CP&PR:7.Produit_à_recevoir                                           0  ; 4287. Produits à recevoir
+       4.Tiers:3.Caisse_sociale                                                                   0  ; 43. Securite sociale et autres organismes sociaux
+       4.Tiers:3.Caisse_sociale:1.URSSAF                                                          0  ; 431. URSSAF
+       4.Tiers:3.Caisse_sociale:7.Autre                                                           0  ; 437. Autres organismes sociaux
+       4.Tiers:3.Caisse_sociale:7.Autre:3.B2V                                                     0  ; 4373. Caisse de retraite
+       4.Tiers:3.Caisse_sociale:7.Autre:8.Autre                                                   0  ; 4378. Autres organismes sociaux
+       4.Tiers:3.Caisse_sociale:7.Autre:8.Autre:1.AG2R                                            0  ; 43781. Prévoyance
+       4.Tiers:3.Caisse_sociale:8.CP&PR                                                           0  ; 438. Charges à payer et produits à recevoir
+       4.Tiers:3.Caisse_sociale:8.CP&PR:2.Cotisation_congé_à_payer                                0  ; 4382. Cotisations sociales sur congés à payer
+       4.Tiers:3.Caisse_sociale:8.CP&PR:6.Autre_charge_à_payer                                    0  ; 4386. Autres charges à payer
+       4.Tiers:3.Caisse_sociale:8.CP&PR:7.Produit_à_recevoir                                      0  ; 4387. Produits à recevoir
+       4.Tiers:4.État,collectivité                                                                0  ; 44. État et autres collectivites publiques
+       4.Tiers:4.État,collectivité:1.Sub_à_recevoir                                               0  ; 441. Subventions à recevoir
+       4.Tiers:4.État,collectivité:1.Sub_à_recevoir:1.Investissement                              0  ; 4411. Subventions d'investissement
+       4.Tiers:4.État,collectivité:1.Sub_à_recevoir:7.Exploitation                                0  ; 4417. Subventions d'exploitation
+       4.Tiers:4.État,collectivité:1.Sub_à_recevoir:8.Equilibre                                   0  ; 4418. Subvention d'équilibre
+       4.Tiers:4.État,collectivité:1.Sub_à_recevoir:9.Avance_sur_sub                              0  ; 4419. Avances sur subventions
+       4.Tiers:4.État,collectivité:3.Opération_particulière                                       0  ; 443. Opérations particulières avec l’État, les collectivités publiques, les organismes internationaux
+       4.Tiers:4.État,collectivité:4.Impôt_sur_bénéfice                                           0  ; 444. État- Impôts sur les bénéfices
+       4.Tiers:4.État,collectivité:4.Impôt_sur_bénéfice:5.Sur_société                             0  ; 4445. État - Impôt sur les sociétés
+       4.Tiers:4.État,collectivité:7.Autre_impôt                                                  0  ; 447.Autres impôts, taxes et versements assimilés
+       4.Tiers:4.État,collectivité:7.Autre_impôt:1.Sur_rémunération_(État)                        0  ; 4471. Impôts, taxes et versements assimilés sur rémunérations (administration des impôts)
+       4.Tiers:4.État,collectivité:7.Autre_impôt:1.Sur_rémunération_(État):1.Taxe_salaire         0  ; 44711. Taxe sur les salaires
+       4.Tiers:4.État,collectivité:7.Autre_impôt:1.Sur_rémunération_(État):2.Formation_pro        0  ; 44712. Participation des employeurs à la formation professionnelle continue
+       4.Tiers:4.État,collectivité:7.Autre_impôt:1.Sur_rémunération_(État):8.Autre                0  ; 44718. Autres impôts, taxes et versements assimilés
+       4.Tiers:4.État,collectivité:7.Autre_impôt:3.Sur_rémunération_(Organisme)                   0  ; 4473. Impôts, taxes et versements sur rémunérations (autres organismes)
+       4.Tiers:4.État,collectivité:7.Autre_impôt:3.Sur_rémunération_(Organisme):3.Formation_pro   0  ; 44733. Participation des employeurs à la formation professionnelle continue
+       4.Tiers:4.État,collectivité:7.Autre_impôt:5.Autre_(État)                                   0  ; 4475. Autres impôts, taxes et versements assimilés (administration des impôts)
+       4.Tiers:4.État,collectivité:7.Autre_impôt:7.Autre_(Organisme)                              0  ; 4477. Autres impôts, taxes et versements assimilés (autres organismes)
+       4.Tiers:4.État,collectivité:8.CP&PR                                                        0  ; 448. État - Charges à payer et produits à recevoir
+       4.Tiers:4.État,collectivité:8.CP&PR:2.Charge_fiscale_sur_congés_à_payer                    0  ; 4482. Charges fiscales sur congés à payer
+       4.Tiers:4.État,collectivité:8.CP&PR:6.Charge_à_payer                                       0  ; 4486. Autres charges à payer
+       4.Tiers:4.État,collectivité:8.CP&PR:7.Produit_à_recevoir                                   0  ; 4487. Produits à recevoir
+       4.Tiers:6.Divers_créditeur_débiteur                                                        0  ; 46. Débiteurs divers et créditeurs divers
+       4.Tiers:6.Divers_créditeur_débiteur:7.Autre                                                0  ; 467. Autres comptes débiteurs ou créditeurs
+       4.Tiers:6.Divers_créditeur_débiteur:7.Autre:001.Bénévole                                   0  ; 467001. Bénévoles
+       4.Tiers:6.Divers_créditeur_débiteur:7.Autre:002.Salarié-e                                  0  ; 647002. Salariés
+       4.Tiers:6.Divers_créditeur_débiteur:8.CP&PR                                                0  ; 468. Divers - Charges à payer et produits à recevoir
+       4.Tiers:6.Divers_créditeur_débiteur:8.CP&PR:6.Charge_à_payer                               0  ; 4686.Charges à payer
+       4.Tiers:6.Divers_créditeur_débiteur:8.CP&PR:7.Produit_à_recevoir                           0  ; 4687. Produits à recevoir
+       4.Tiers:8.Régularisation                                                                   0  ; 48. Comptes de régularisation
+       4.Tiers:8.Régularisation:6.Charge_constatée_d'avance                                       0  ; 486. Charges constatées d’avance
+       4.Tiers:8.Régularisation:7.Produit_constaté_d'avance                                       0  ; 487. Produits constatés d’avance
+       5.Finance                                                                                  0  ; 5. COMPTES FINANCIERS
+       5.Finance:1.Etablissement                                                                  0  ; 51. Banques, établissements financiers et assimilés
+       5.Finance:1.Etablissement:1.Valeur                                                         0  ; 511. Valeurs à l’encaissement
+       5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser                                    0  ; 5112. Chèques à encaisser
+       5.Finance:1.Etablissement:2.Banque:001.Courant                                             0  ; 512001. Crédit Coopératif - Compte courant
+       5.Finance:1.Etablissement:2.Banque:002.Livret                                              0  ; 512002. Crédit coopératif - Livret
+       5.Finance:3.Caisse                                                                         0  ; 53. Caisse
+       5.Finance:3.Caisse:1.Siège                                                                 0  ; 531. Caisse du siège
+       5.Finance:3.Caisse:2.Atelier                                                               0  ; 532. Caisse des lieux d’activités
+       5.Finance:8.Virement                                                                       0  ; 58. Virements internes
+       5.Finance:8.Virement:0.Interne                                                             0  ; 580. Virements internes
+       5.Finance:8.Virement:1.Fonds                                                               0  ; 581. Virements de fonds
+       6.Charge                                                                                   0  ; 6. COMPTES D'ACHATS
+       6.Charge:0.Achat                                                                           0  ; 60. Achats (sauf 603)
+       6.Charge:0.Achat:1.Stocké-Matière_Prem,Fourniture                                          0  ; 601. Achats stockés - Matières premières et fournitures
+       6.Charge:0.Achat:1.Stocké-Matière_Prem,Fourniture:1.Matière                                0  ; 6011. Matières
+       6.Charge:0.Achat:1.Stocké-Matière_Prem,Fourniture:2.Fourniture                             0  ; 6012. Fournitures
+       6.Charge:0.Achat:2.Stocké-Autre                                                            0  ; 602. Achats stockés - Autres approvisionnements
+       6.Charge:0.Achat:2.Stocké-Autre:1.Matière_consommable                                      0  ; 6021. Matières consommables
+       6.Charge:0.Achat:2.Stocké-Autre:2.Fourniture_consommable                                   0  ; 6022. Fournitures consommables
+       6.Charge:0.Achat:2.Stocké-Autre:2.Fourniture_consommable:1.Combustible                     0  ; 60221. Combustibles
+       6.Charge:0.Achat:2.Stocké-Autre:2.Fourniture_consommable:2.Nettoyage                       0  ; 60222. Produits d’entretien
+       6.Charge:0.Achat:2.Stocké-Autre:2.Fourniture_consommable:3.Atelier                         0  ; 60223. Fournitures d’atelier
+       6.Charge:0.Achat:2.Stocké-Autre:2.Fourniture_consommable:5.Bureau                          0  ; 60225. Fournitures de bureau
+       6.Charge:0.Achat:3.Variation_stocks                                                        0  ; 603. Variation des stocks (approvisionnements et marchandises)
+       6.Charge:0.Achat:4.Etude,Prestation                                                        0  ; 604. Achats d’études et prestations de services
+       6.Charge:0.Achat:5.Matériel,Equipement,Travaux                                             0  ; 605. Achats de matériels, équipements et travaux
+       6.Charge:0.Achat:6.Non_stocké                                                              0  ; 606. Achats non stockés de matières et fournitures
+       6.Charge:0.Achat:6.Non_stocké:1.Non_stockable                                              0  ; 6061. Fournitures non stockables (eau, énergie..)
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture                                                 0  ; 6063. Fournitures d’entretien et de petit équipement
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:1.Produit_entretien                             0  ; 60631. Produits d'entretien
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:2.Travaux                                       0  ; 60632. Fournitures pour travaux
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:3.Equipement_atelier                            0  ; 60633. Equipement d'atelier
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:4.Outillage                                     0  ; 60634. Outillage
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:5.Mobilier                                      0  ; 60635. Mobilier
+       6.Charge:0.Achat:6.Non_stocké:3.Fourniture:6.Matériel_informatique                         0  ; 60636. Matériel informatique
+       6.Charge:0.Achat:6.Non_stocké:4.Consommable_bureau                                         0  ; 6064. Fournitures de bureau
+       6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture                                   0  ; 6068. Autres matières et fournitures
+       6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:1.Atelier                         0  ; 60681. Consommables, fournitures atelier et vélos
+       6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:8.Autre                           0  ; 60688. Autre matières et fournitures
+       6.Charge:0.Achat:7.Marchandise                                                             0  ; 607. Achats de marchandises
+       6.Charge:0.Achat:8.Frais_accessoire                                                        0  ; 608. Frais accessoires d’achats
+       6.Charge:0.Achat:9.Remise                                                                  0  ; 609. Rabais, remises et ristournes obtenus sur achats
+       6.Charge:1.Service                                                                         0  ; 61. Services extérieurs
+       6.Charge:1.Service:1.Sous-traitance                                                        0  ; 611. Sous-traitance générale
+       6.Charge:1.Service:3.Location                                                              0  ; 613. Locations
+       6.Charge:1.Service:3.Location:2.Immobilière                                                0  ; 6132. Locations immobilières
+       6.Charge:1.Service:3.Location:5.Mobilière                                                  0  ; 6135. Locations mobilières
+       6.Charge:1.Service:4.Charge_locative                                                       0  ; 614. Charges locatives et de copropriété
+       6.Charge:1.Service:5.Entretien_Réparation                                                  0  ; 615. Entretien et réparations
+       6.Charge:1.Service:5.Entretien_Réparation:2.Bien_immobilier                                0  ; 6152. Sur biens immobiliers
+       6.Charge:1.Service:5.Entretien_Réparation:5.Bien_mobilier                                  0  ; 6155. Sur biens mobiliers
+       6.Charge:1.Service:5.Entretien_Réparation:6.Maintenance                                    0  ; 6156. Maintenance
+       6.Charge:1.Service:6.Assurance                                                             0  ; 616. Primes d’assurance
+       6.Charge:1.Service:8.Divers                                                                0  ; 618. Divers
+       6.Charge:1.Service:9:Remise                                                                0  ; 619. Rabais, remises et ristournes obtenus sur services extérieurs
+       6.Charge:2.Autre_service                                                                   0  ; 62. Autres services extérieurs
+       6.Charge:2.Autre_service:1.Personnel_extérieur                                             0  ; 621. Personnel extérieur à l’association
+       6.Charge:2.Autre_service:1.Personnel_extérieur:4.Mise_à_dispo                              0  ; 6214. Personnel détaché ou prêté à l’association
+       6.Charge:2.Autre_service:2.Intermédiaire                                                   0  ; 622. Rémunérations d’intermédiaires et honoraires
+       6.Charge:2.Autre_service:2.Intermédiaire:6.Honoraire                                       0  ; 6226. Honoraires
+       6.Charge:2.Autre_service:2.Intermédiaire:7.Frais_d'acte                                    0  ; 6227. Frais d’actes et de contentieux
+       6.Charge:2.Autre_service:2.Intermédiaire:8.Divers                                          0  ; 6228. Divers
+       6.Charge:2.Autre_service:3.Communication                                                   0  ; 623. Publicité, publications, relations publiques
+       6.Charge:2.Autre_service:3.Communication:1.Annonce                                         0  ; 6231. Annonces et insertions
+       6.Charge:2.Autre_service:3.Communication:3.Foire,Expo                                      0  ; 6233. Foires et expositions
+       6.Charge:2.Autre_service:3.Communication:4:Cadeau                                          0  ; 6234. Cadeaux
+       6.Charge:2.Autre_service:3.Communication:6.Catalogue,Imprimé                               0  ; 6236. Catalogues et imprimés
+       6.Charge:2.Autre_service:3.Communication:7.Publication                                     0  ; 6237. Publications
+       6.Charge:2.Autre_service:3.Communication:8.Divers(pourboire,dons_courants)                 0  ; 6238. Divers (pourboires, dons courants..)
+       6.Charge:2.Autre_service:5.Frais                                                           0  ; 625. Déplacements, missions et réceptions
+       6.Charge:2.Autre_service:5.Frais:1.Déplacement                                             0  ; 6251. Voyages et déplacements
+       6.Charge:2.Autre_service:5.Frais:6.Mission                                                 0  ; 6256. Missions
+       6.Charge:2.Autre_service:5.Frais:7.Réception                                               0  ; 6257. Réceptions
+       6.Charge:2.Autre_service:6.Poste,Télécommunication                                         0  ; 626. Frais postaux et frais de télécommunications
+       6.Charge:2.Autre_service:6.Poste,Télécommunication:1.Internet                              0  ; 6261. Liaisons informatiques ou spécialisées
+       6.Charge:2.Autre_service:6.Poste,Télécommunication:3.Timbre                                0  ; 6263. Affranchissements
+       6.Charge:2.Autre_service:7.Service_bancaire                                                0  ; 627. Services bancaires et assimilés
+       6.Charge:2.Autre_service:8.Divers                                                          0  ; 628. Divers
+       6.Charge:2.Autre_service:8.Divers:1.Cotisation_(activité_économique)                       0  ; 6281. Cotisations (liées à l’activité économique)
+       6.Charge:2.Autre_service:8.Divers:4.Frais_recrutement_personnel                            0  ; 6284. Frais de recrutement du personnel
+       6.Charge:2.Autre_service:9.Remise                                                          0  ; 629. Rabais, remises et ristournes obtenus sur autres services extérieurs
+       6.Charge:3.Impôt                                                                           0  ; 63. Impôts, taxes et versements assimilés
+       6.Charge:3.Impôt:1.Sur_rémunération_(État)                                                 0  ; 631. Impôts, taxes et versements assimilés sur rémunérations (administration des impôts)
+       6.Charge:3.Impôt:1.Sur_rémunération_(État):1.Taxe_salaire                                  0  ; 6311. Taxe sur les salaires
+       6.Charge:3.Impôt:1.Sur_rémunération_(État):3.Formation_pro                                 0  ; 6313. Participation des employeurs à la formation professionnelle continue
+       6.Charge:3.Impôt:1.Sur_rémunération_(État):8.Autre                                         0  ; 6318. Autres
+       6.Charge:3.Impôt:3.Sur_rémunération_(Organisme)                                            0  ; 633. Impôts, taxes et versements assimilés sur rémunérations (autres organismes)
+       6.Charge:3.Impôt:3.Sur_rémunération_(Organisme):3.Formation                                0  ; 6333. Participation des employeurs à la formation professionnelle continue
+       6.Charge:3.Impôt:3.Sur_rémunération_(Organisme):8.Autre                                    0  ; 6338. Autres
+       6.Charge:3.Impôt:5.Autre_(État)                                                            0  ; 635. Autres impôts, taxes et versements assimilés (administration des impôts)
+       6.Charge:3.Impôt:5.Autre_(État):1.Direct_(sauf_bénéfice)                                   0  ; 6351. Impôts directs (sauf impôts sur les bénéfices)
+       6.Charge:3.Impôt:5.Autre_(État):1.Direct_(sauf_bénéfice):2.Taxe_foncière                   0  ; 63512. Taxes foncières
+       6.Charge:3.Impôt:5.Autre_(État):1.Direct_(sauf_bénéfice):3.Autre_impôts_locaux             0  ; 63513. Autres impôts locaux
+       6.Charge:3.Impôt:5.Autre_(État):1.Direct_(sauf_bénéfice):8.Autre                           0  ; 63518. Autres impôts directs
+       6.Charge:3.Impôt:5.Autre_(État):3.Indirect                                                 0  ; 6353. Impôts indirects
+       6.Charge:3.Impôt:7.Autre_(Organisme)                                                       0  ; 637. Autres impôts, taxes et versements assimilés (autres organismes)
+       6.Charge:4.Personnel                                                                       0  ; 64. Charges de personnel
+       6.Charge:4.Personnel:1.Rémunération                                                        0  ; 641. Rémunérations du personnel
+       6.Charge:4.Personnel:1.Rémunération:1.Salaire                                              0  ; 6411. Salaires, appointements
+       6.Charge:4.Personnel:1.Rémunération:2.Congés                                               0  ; 6412. Congés payés
+       6.Charge:4.Personnel:1.Rémunération:3.Prime                                                0  ; 6413. Primes et gratifications
+       6.Charge:4.Personnel:1.Rémunération:4.Indémnité                                            0  ; 6414. Indemnités et avantages divers
+       6.Charge:4.Personnel:1.Rémunération:6.Remb_transport                                       0  ; 6416. Remboursement transport
+       6.Charge:4.Personnel:5.Cotisation                                                          0  ; 645. Cotisations de sécurité sociale et de prévoyance
+       6.Charge:4.Personnel:5.Cotisation:1.URSSAF                                                 0  ; 6451. Cotisations à l’URSSAF
+       6.Charge:4.Personnel:5.Cotisation:2.Mutuelle                                               0  ; 6452. Cotisations aux mutuelles
+       6.Charge:4.Personnel:5.Cotisation:3.Retraite                                               0  ; 6453. Cotisations aux caisses de retraite
+       6.Charge:4.Personnel:5.Cotisation:4.Pôle_emploi                                            0  ; 6454. Cotisations aux ASSEDIC
+       6.Charge:4.Personnel:5.Cotisation:8.Autre_organisme                                        0  ; 6458. Cotisations aux autres organismes sociaux
+       6.Charge:4.Personnel:5.Cotisation:8.Autre_organisme:1.Prévoyance                           0  ; 64581. Caisse de Prévoyance
+       6.Charge:4.Personnel:7.Autre_cotisation                                                    0  ; 647. Autres charges sociales
+       6.Charge:4.Personnel:7.Autre_cotisation:5.Médecine_travail                                 0  ; 6475. Médecine de travail, pharmacie
+       6.Charge:4.Personnel:8.Autre_charge_personnel                                              0  ; 648. Autres charges de personnel
+       6.Charge:4.Personnel:8.Autre_charge_personnel:8.Cotisation_sur_rémunération_à_payer        0  ; 6488. Cotisations sur rémunérations à payer
+       6.Charge:5.Gestion                                                                         0  ; 65. Autres charges de gestion courantes
+       6.Charge:5.Gestion:1.Redevance_pour_concession,brevet,licence,procédé,droit                0  ; 651. Redevances pour concessions, brevets, licences, procédés, logiciels, droits et valeurs similaires
+       6.Charge:5.Gestion:7.Subvention_versée                                                     0  ; 657. Subventions versées par l’organisme
+       6.Charge:5.Gestion:8.Divers                                                                0  ; 658. Charges diverses de gestion courante
+       6.Charge:5.Gestion:8.Divers:6.Cotisation_(vie_statutaire)                                  0  ; 6586. Cotisations (liées à la vie statutaire)
+       6.Charge:6.Financière                                                                      0  ; 66. Charges financières
+       6.Charge:6.Financière:1.Intérêt                                                            0  ; 661. Charges d’intérêts
+       6.Charge:6.Financière:1.Intérêt:1.Emprunt,Dette                                            0  ; 6611. Intérêts des emprunts et dettes
+       6.Charge:6.Financière:1.Intérêt:6.Bancaire                                                 0  ; 6616. Intérêts bancaires
+       6.Charge:6.Financière:1.Intérêt:8.Autre_dette                                              0  ; 6618. Intérêts des autres dettes
+       6.Charge:6.Financière:8.Autre                                                              0  ; 668. Autres charges financières
+       6.Charge:7.Exceptionnelle                                                                  0  ; 67. Charges exceptionnelles
+       6.Charge:7.Exceptionnelle:1.Sur_gestion                                                    0  ; 671. Charges exceptionnelles sur opérations de gestion
+       6.Charge:7.Exceptionnelle:1.Sur_gestion:1.Pénalité_sur_marché                              0  ; 6711. Pénalités sur marchés (et dédits payés sur achats et ventes)
+       6.Charge:7.Exceptionnelle:1.Sur_gestion:2.Pénalité,Amende                                  0  ; 6712. Pénalités, amendes fiscales ou pénales
+       6.Charge:7.Exceptionnelle:1.Sur_gestion:3.Don,Libéralité                                   0  ; 6713. Dons, libéralités
+       6.Charge:7.Exceptionnelle:1.Sur_gestion:7.Rappel_impôt_(sauf_bénéfice)                     0  ; 6717. Rappels d’impôts (autres qu’impôts sur les bénéfices)
+       6.Charge:7.Exceptionnelle:1.Sur_gestion:8.Autre                                            0  ; 6718. Autres charges exceptionnelles sur opérations de gestion
+       6.Charge:7.Exceptionnelle:8.Autre                                                          0  ; 678. Autres charges exceptionnelles
+       6.Charge:7.Exceptionnelle:8.Autre:8.Diverse                                                0  ; 6788. Charges exceptionnelles diverses
+       6.Charge:8.Dotation                                                                        0  ; 68. Dotations aux amortissements, dépréciations, provisions et engagements
+       6.Charge:8.Dotation:1.Charge_d'exploitation                                                0  ; 681. Dotations aux amortissements et aux provisions - Charges d'exploitation
+       6.Charge:8.Dotation:1.Charge_d'exploitation:1.Amortissement_immobilisation                 0  ; 6811. Dotations aux amortissements des immobilisations incorporelles et corporelles
+       6.Charge:8.Dotation:1.Charge_d'exploitation:1.Amortissement_immobilisation:1.Incorporelle  0  ; 68111. Immobilisations incorporelles
+       6.Charge:8.Dotation:1.Charge_d'exploitation:1.Amortissement_immobilisation:2.Corporelle    0  ; 68112. Immobilisations corporelles
+       6.Charge:8.Dotation:1.Charge_d'exploitation:5.Provision_d'exploitation                     0  ; 6815. Dotations aux provisions pour risques et charges d’exploitation
+       6.Charge:8.Dotation:1.Charge_d'exploitation:7.Dépréciation_actif                           0  ; 6817. Dotations aux provisions pour dépréciation des actifs circulants
+       6.Charge:8.Dotation:1.Charge_d'exploitation:7.Dépréciation_actif:3.Stocks,En-cours         0  ; 68173. Stocks et en-cours
+       6.Charge:8.Dotation:1.Charge_d'exploitation:7.Dépréciation_actif:4.Créance                 0  ; 68174. Créances
+       6.Charge:8.Dotation:6.Charge_financière                                                    0  ; 686. Dotations aux amortissements et aux provisions - Charges financières
+       6.Charge:8.Dotation:6.Charge_financière:5.Provision_financière                             0  ; 6865. Dotations aux provisions pour risques et charges financiers
+       6.Charge:8.Dotation:6.Charge_financière:6.Dépréciation_élément_financier                   0  ; 6866. Dotations aux provisions pour dépréciation des éléments financiers
+       6.Charge:8.Dotation:6.Charge_financière:8.Autre                                            0  ; 6868. Autres dotations
+       6.Charge:8.Dotation:7.Charge_exceptionnelle                                                0  ; 687. Dotations aux amortissements et aux provisions - Charges exceptionnelles
+       6.Charge:8.Dotation:9.Engagement_à_réaliser                                                0  ; 689. Engagements à réaliser sur ressources affectées
+       6.Charge:8.Dotation:9.Engagement_à_réaliser:4.Sur_subvention_attribuée                     0  ; 6894. Engagements à réaliser sur subventions attribuées
+       6.Charge:8.Dotation:9.Engagement_à_réaliser:5.Sur_don_affecté                              0  ; 6895. Engagements à réaliser sur dons manuels affectés
+       6.Charge:9.Impôt_sur_bénéfice                                                              0  ; 69. Impôts sur les bénéfices
+       6.Charge:9.Impôt_sur_bénéfice:5.Impôt_sur_société                                          0  ; 695.Impôts sur les sociétés
+       7.Produit                                                                                  0  ; 7. COMPTES DE PRODUITS
+       7.Produit:0.Vente                                                                          0  ; 70. ventes de produits finis, prestations de services, marchandises
+       7.Produit:0.Vente:1.Produit_fini                                                           0  ; 701. Ventes de produits finis
+       7.Produit:0.Vente:1.Produit_fini:1.Vélo                                                    0  ; 7011. Vélos
+       7.Produit:0.Vente:1.Produit_fini:2.Autre                                                   0  ; 7012. Autres
+       7.Produit:0.Vente:6.Prest'action                                                           0  ; 706. Prestations de services
+       7.Produit:0.Vente:7.Marchandise                                                            0  ; 707. Ventes de marchandises
+       7.Produit:0.Vente:8.Activité_annexe                                                        0  ; 708. Produits des activités annexes
+       7.Produit:0.Vente:8.Activité_annexe:3.Location                                             0  ; 7083. Locations diverses
+       7.Produit:0.Vente:8.Activité_annexe:4.Mise_à_dispo                                         0  ; 7084. Mise à disposition de personnel facturée
+       7.Produit:0.Vente:8.Activité_annexe:8.Autre                                                0  ; 7088. Autres produits d’activités annexes
+       7.Produit:1.Production_stockée                                                             0  ; 71. Production stockée (ou déstockage)
+       7.Produit:2.Production_immobilisée                                                         0  ; 72. Production immobilisée
+       7.Produit:4.Subvention_d'exploitation                                                      0  ; 74. Subventions d’exploitation
+       7.Produit:4.Subvention_d'exploitation:1.État                                               0  ; 741. État
+       7.Produit:4.Subvention_d'exploitation:2.Région                                             0  ; 742. Région
+       7.Produit:4.Subvention_d'exploitation:3.Département                                        0  ; 743. Département
+       7.Produit:4.Subvention_d'exploitation:4.Commune                                            0  ; 744. Commune
+       7.Produit:4.Subvention_d'exploitation:5.Collectivité_publique                              0  ; 745. Collectivités publiques
+       7.Produit:4.Subvention_d'exploitation:6.Entreprise_publique                                0  ; 746. Entreprises publiques
+       7.Produit:4.Subvention_d'exploitation:7.Organisme_privé                                    0  ; 747. Entreprises et organismes privés
+       7.Produit:4.Subvention_d'exploitation:8.Autre                                              0  ; 748. Autres
+       7.Produit:5.Autre_gestion_courante                                                         0  ; 75. Autres produits de gestion courante
+       7.Produit:5.Autre_gestion_courante:4.Collecte                                              0  ; 754. Collectes
+       7.Produit:5.Autre_gestion_courante:6.Cotisation                                            0  ; 756. Cotisations
+       7.Produit:5.Autre_gestion_courante:8.Divers                                                0  ; 758. Produits divers de gestion courante
+       7.Produit:5.Autre_gestion_courante:8.Divers:1.Don                                          0  ; 7581. Dons manuels
+       7.Produit.6.Financier                                                                      0  ; 76. Produits financiers
+       7.Produit.6.Financier:1.Participation                                                      0  ; 761. Produits des participations
+       7.Produit.6.Financier:1.Participation:1.Titre                                              0  ; 7611. Revenus des titres de participations
+       7.Produit.6.Financier:2.Autre_immobilisation_financière                                    0  ; 762. Produits des autres immobilisations financières
+       7.Produit.6.Financier:2.Autre_immobilisation_financière:4.Prêt                             0  ; 7624. Revenus des prêts
+       7.Produit.6.Financier:3.Autre_créance                                                      0  ; 763. Revenus des autres créances
+       7.Produit.6.Financier:8.Autre                                                              0  ; 768. Autres produits financiers
+       7.Produit.7.Exceptionnel                                                                   0  ; 77. Produits exceptionnels
+       7.Produit.7.Exceptionnel:1.Sur_gestion                                                     0  ; 771. Produits exceptionnels sur opérations de gestion
+       7.Produit.7.Exceptionnel:1.Sur_gestion:3.Libéralité_reçue                                  0  ; 7713. Libéralités perçues
+       7.Produit.7.Exceptionnel:1.Sur_gestion:5.Subvention_d'équilibre                            0  ; 7715. Subvention d’équilibre
+       7.Produit.7.Exceptionnel:1.Sur_gestion:8.Autre                                             0  ; 7718. Autres produits exceptionnels sur opérations de gestion
+       7.Produit.7.Exceptionnel:2.Sur_exercice_antérieur                                          0  ; 772. Produits sur exercices antérieurs (à reclasser)
+       7.Produit.7.Exceptionnel:7.Quote-part_subvention_investissement_virée_au_résultat          0  ; 777. Quote-part des subventions d’investissement virée au résultat de l’exercice
+       7.Produit.7.Exceptionnel:8.Autre                                                           0  ; 778. Autres produits exceptionnels
+       7.Produit:8.Reprise                                                                        0  ; 78. Reprises sur amortissements et provisions
+       7.Produit:8.Reprise:1.Amortissement,Provision_(exploitation)                               0  ; 781. Reprises sur amortissements et provisions (à inscrire dans les produits d’exploitation)
+       7.Produit:8.Reprise:1.Amortissement,Provision_(exploitation):1.Amort_immo_incorp&corpl     0  ; 7811. Reprises sur amortissements des immobilisations incorporelles et corporelles
+       7.Produit:8.Reprise:1.Amortissement,Provision_(exploitation):5.Provision_risque&charge     0  ; 7815. Reprises sur provisions pour risques et charges d’exploitation
+       7.Produit:8.Reprise:6.Provision_(financier)                                                0  ; 786. Reprises sur provisions (à inscrire dans les produits financiers)
+       7.Produit:8.Reprise:7.Provision_(exceptionnel)                                             0  ; 787. Reprises sur provisions (à inscrire dans les produits exceptionnels)
+       7.Produit:8.Reprise:9.Report_ressource_N-1                                                 0  ; 789. Report des ressources non utilisées des exercices antérieurs
+       7.Produit:8.Reprise:9.Report_ressource_N-1:4.Sur_subvention_attribuée                      0  ; 7894. Sur subventions attribués
+       7.Produit:8.Reprise:9.Report_ressource_N-1:5.Sur_don_reçus                                 0  ; 7895. Sur dons manuels reçus
+       7.Produit:9.Transfert_charge                                                               0  ; 79. Transferts de charges
+       7.Produit:9.Transfert_charge:1.Exploitation                                                0  ; 791. Transferts de charges d’exploitation
+       7.Produit:9.Transfert_charge:6.Financière                                                  0  ; 796. Transferts de charges financières
+       7.Produit:9.Transfert_charge:7.Exceptionnelle                                              0  ; 797. Transferts de charges exceptionnelles
+       8.Spécial                                                                                  0  ; 8. COMPTES SPÉCIAUX
+       8.Spécial:6.Emploi_contribution_volontaire                                                 0  ; 86. Emplois des contributions volontaires en nature
+       8.Spécial:6.Emploi_contribution_volontaire:1.Mise_à_dispo_bien                             0  ; 861. Mise à disposition gratuite de biens
+       8.Spécial:6.Emploi_contribution_volontaire:2.Prestation                                    0  ; 862. Prestations
+       8.Spécial:6.Emploi_contribution_volontaire:4.Bénévolat                                     0  ; 864. Personnel bénévole
+       8.Spécial:7.Contribution_volontaire                                                        0  ; 87. Contributions volontaires en nature
+       8.Spécial:7.Contribution_volontaire:0.Bénévolat                                            0  ; 870. Bénévolat
+       8.Spécial:7.Contribution_volontaire:1.Prestation_en_nature                                 0  ; 871. Prestations en nature
+       8.Spécial:7.Contribution_volontaire:5.Don_en_nature                                        0  ; 875. Dons en nature
diff --git a/doc/data/gvimdiff-cumulative-historical.png b/doc/data/gvimdiff-cumulative-historical.png
new file mode 100644 (file)
index 0000000..d80069e
Binary files /dev/null and b/doc/data/gvimdiff-cumulative-historical.png differ
diff --git a/doc/data/hledger.splash.png b/doc/data/hledger.splash.png
new file mode 100644 (file)
index 0000000..0d54fd9
Binary files /dev/null and b/doc/data/hledger.splash.png differ
diff --git a/doc/hledger.fr.slidy.ad b/doc/hledger.fr.slidy.ad
new file mode 100644 (file)
index 0000000..27d0628
--- /dev/null
@@ -0,0 +1,614 @@
+= Informatiser une comptabilité avec confiance
+:author:  git://git.autogeree.net/tool/hledger
+:copyright: © 2014 (CC) BY Julien Moutinho &lt;julm+hledger@autogeree.net&gt;
+:icons:
+:iconsdir: ./icons
+:numbered:
+:toc:
+:slidebackground: hledgersplash
+:slidefontsizeadjust: -3
+:incremental:
+:revremark: 
+//:max-width: 45em
+:scriptsdir: $PWD/javascripts
+ifdef::backend-slidy2[:data-uri:]
+
+ifdef::backend-slidy2[:slidebackground!:]
+
+// a2x: --xsltproc-opts "--stringparam ulink.show 1"
+// a2x: --xsltproc-opts "--stringparam ulink.footnotes 1"
+// :source-highlighter: vim
+
+
+== Le ++.ledger++ : un format de __Grand Livre__ ouvert.. et simple
+
+[source,hledger]
+----
+2014/05/01 Stand manif
+       Don:Anonyme   -42
+       Caisse:Grève   42
+
+2014/05/08 Propagande
+       Caisse:Grève             -7
+       Achat:Impression:Tracts   7
+
+; Répéter ad nauseam
+----
+
+ifdef::backend-slidy2[>>>]
+=== Les plus
+[horizontal]
+Transparent:: Visibilité de _toutes_ les informations.
+Pérenne:: Compréhensible sans peine.
+Modifiable:: Pas d’interface protectrice.
+Accès:: Pas de changement d’interface non-consenti.
+Versionnable:: Suivi et fusion simples des modifications.
+Écrit:: Langage pour s’exprimer clairement, par exemple pour discuter dans un courriel.
+Hors-ligne:: Pas besoin de réseau.
+Interopérable::
+Pas spécifique à un éditeur logiciel particulier
+(sauf fonctionnalité expérimentale).
+* http://ledger-cli.org/[]
+* http://hledger.org/[]
+* http://furius.ca/beancount/[]
+* https://massysett.github.io/penny/[]
+* https://github.com/hrj/abandon/[]
+
+=== Les moins
+[horizontal]
+Modifiable::
+Mais pas moins que les autres logiciels
+et à nuancer si couplé à un gestionnaires de versions,
+et/ou avec signature cryptographiques.
++
+[source,sh]
+----
+% git tag --sign   v2011 -m "Clôture de la comptabilité 2011"
+% git tag --verify v2011
+----
++
+[source,sh]
+----
+% gpg --sign         $fichier.hledger
+% gpg --verify-files $fichier.hledger.gpg
+----
+
+Textuel:: Préférable de bien savoir utiliser
+un éditeur de texte structuré.
+Peu contraint::
++
+[source,hledger]
+----
+2102/03/21 Remise chq (1101804)
+       5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser  -145,00
+       5.Finance:1.Etablissement:2.Banque:001.Courant            145,00
+----
+
+NOTE: KISS
+
+
+== ++hledger++ : un outil libre.. et convivial
+[source,sh]
+----
+% hledger balance '^6' '^7' --depth 2 -f Paris.2011.hledger
+             770,58€  6.Charge
+             248,87€    0.Achat
+             441,46€    1.Service
+              55,25€    2.Autre_service
+              25,00€    5.Gestion
+            -726,00€  7.Produit
+            -700,00€    0.Vente
+             -26,00€    5.Autre_gestion_courante
+‑-------------------
+              44,58€
+----
+
+ifdef::backend-slidy2[>>>]
+=== Les plus
+
+Utilisation::
+Étude::
+Modification::
+Duplication::
+Permises techniquement et légalement +
+(« logiciel libre » sous ++GNU/GPLv3++)
+
+Certification::
+Programmé en http://fr.wikipedia.org/wiki/Haskell[Haskell]
+[horizontal]
+Fonctionnel pur;; Aucune mutation de données externes à une fonction (effet de bord).
+Typage statique;; Vérification des erreurs de type avant l’exécution du programme.
+Typage fort;; Aucune conversion implicite de types de données.
+
+Portable:: GNU/Linux, Apple/MacOS, Microsoft/Windows
+
+Support:: ~1 développeur à mi-temps
++
+* Simon Michael <simon@joyful.com>
+
+[horizontal]
+Ligne de commande::
++
+[source,sh]
+----
+       % hledger balance -f $fichier.hledger
+----
+Interface Web::
++
+[source,sh]
+----
+       % hledger-web --server -f $fichier.hledger
+       % firefox "http://localhost:5000"
+----
+Extensible::
++
+[source,sh]
+----
+       % ghc hledger-fait-ce-que-je-veux.hs
+       % ./hledger-fait-ce-que-je-veux -f $fichier.hledger
+----
+
+ifdef::backend-slidy2[>>>]
+=== Les moins
+Ligne de commande::
++
+...
+
+== Installer `hledger`
+
+* http://hledger.org/installing[]
+
+[source,sh]
+.Debian/jessie
+----
+% sudo apt-get install hledger hledger-web
+----
+
+ifdef::backend-slidy2[>>>]
+=== Via `cabal`
+* http://www.haskell.org/cabal/[]
+
+[source,sh]
+.Debian/wheezy
+----
+% echo 'PATH="$HOME/.cabal/bin:$PATH"' >>~/.profile
+  # NOTE: rajoute dans le chemins des exécutables
+  # les exécutables installés par cabal
+% exit # NOTE: recharge ~/.profile
+
+% sudo apt-get install ghc cabal-install \
+               libncurses5-dev libtinfo-dev zlib1g-dev
+% cabal update
+% cabal install cabal # NOTE: met à jour cabal
+% cabal install happy # NOTE: anticipe une dépendance exécutable
+% cabal install hledger
+% cabal install alex # NOTE: anticipe une dépendance exécutable
+% cabal install warp-2.0.3.4 hledger-web
+  # NOTE: aide cabal à sélectionner un warp qui fonctionne
+----
+
+[source,sh]
+.Mise-à-jour
+----
+% cabal install --reinstall hledger hledger-web
+----
+
+ifdef::backend-slidy2[>>>]
+==== Version de développement
+
+[source,sh]
+----
+% git clone http://github.com/simonmichael/hledger.git ~/src/hledger
+% cd ~/src/hledger
+% cabal install --reinstall --force-reinstalls \
+                ./hledger-lib ./hledger ./hledger-web
+----
+
+== Écrire en +.ledger+
+Un +.ledger+ est un fichier de texte brut respectant une syntaxe préçise
+qui forme une succession d’écritures comptables, ordonnées librement.
+
+ifdef::backend-slidy2[>>>]
+=== Exemple
+[source,hledger]
+----
+; Ceci est un exemple de livre comptable « ledger »
+; NOTE: fantaisiste comptablement parlant, mais syntaxiquement correct
+
+2014/01/01 Libellé de l’écriture ; UN_TAG:, Autre_tag:Avec_Valeur
+       Compte:Sous-Compte                         -42 ; flux créditant
+       Autre_Compte:Sous-Compte:Sous-Sous-Compte   42 ; flux débitant
+
+2014/01/01 Deuxième écriture le même jour
+       Vente:Âme  -666 ; (tag de flux) Arnaque:
+       Kapital     666
+
+2014/01/02 Troisième écriture le jour suivant avec ventilation des flux
+       Compte:Crédité:A  -1
+       Compte:Crédité:B  -2
+       Compte:Débité:Z    1
+       Compte:Débité:Y    1
+       Compte:Débité:X:x  1
+
+2014/04/12
+       Compte:Crédité  -1234,56
+       Compte:Débité ;  1234,56 (montant inféré)
+
+2014/02/01 Écriture non ordonnée par date ; Ok, mais déconseillé
+       Compte:Débité    1
+       Compte:Crédité  -1 ; Flux non ordonné par crédit/débit
+        ; c'est juste moins lisible...
+
+; Répéter ad nauseam
+----
+
+=== Langage
+
+[cols="a,a",options="header"]
+|==================================
+^|Syntaxe (grammaire https://fr.wikipedia.org/wiki/Forme_de_Backus-Naur[BNF])
+^|Structure (signatures fonctionnelles)
+|
+[source,conf]
+-----------------------------------
+livre ::= (écriture \| commentaire \| "⏎" \| "␣")*
+-----------------------------------
+|
+[horizontal]
+:role: math
+**livre**:: latexmath:[$
+       :\>f:\textcolor{#D2691E}{\textbf{fichier}} →
+       \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack$]
+|
+[source,conf]
+----
+écriture ::= date "␣" "␣"* libellé commentaire "⏎"
+             ("␣" flux "⏎")*
+date ::= (année "/")? mois "/" jour
+libellé ::= (· - (";"\|"⏎"))*
+----
+|
+[horizontal]
+:role: math
+**date**:: latexmath:[$
+       :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
+       (\textcolor{#083194}{\textbf{ann\acute{e}e}}:\textcolor{#D2691E}{\textbf{ℕ}},~
+       \textcolor{#083194}{\textbf{mois}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{12}}\},~
+       \textcolor{#083194}{\textbf{jour}}:\{\textcolor{#D2691E}{\textbf{01}},...,\textcolor{#D2691E}{\textbf{31}}\})$]
+**libellé**:: latexmath:[$
+       :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
+       \textcolor{#D2691E}{\textbf{texte}}$]
+**commentaire**:: latexmath:[$
+       :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
+       \textcolor{#D2691E}{\textbf{texte}}$]
+**tags**:: latexmath:[$
+       :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
+       \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack
+       \ =\ \textbf{tags}~(\textbf{commentaire}~e)$]
+**flux**:: latexmath:[$
+       :\>e:\textcolor{#D2691E}{\textbf{\acute{e}criture}} →
+       \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$]
+|
+[source,conf]
+----
+flux ::= compte "␣␣" "␣"* ("-" crédit \| débit) ("␣"\|"⏎")* commentaire
+compte ::= nom ( ":" nom )*
+nom ::= (· - (":"\|"⏎")) (· - (":"\|"⏎"))*
+crédit ::= quantité
+débit  ::= quantité
+----
+|
+[horizontal]
+:role: math
+**compte**:: latexmath:[$
+       :\>f:\textcolor{#D2691E}{\textbf{flux}} →
+       \lbrack\textcolor{#D2691E}{\textbf{nom}}\rbrack$]
+**montant**::
+latexmath:[$
+       :\>f:\textcolor{#D2691E}{\textbf{flux}} → \textcolor{#D2691E}{ℚ} = \displaystyle{
+       \left\{\begin{array}{ll} -~(\textbf{cr\acute{e}dit}~f) & \mathit{\mbox{si défini}} \\
+               (\textbf{d\acute{e}bit}~f) & \mathit{\mbox{sinon}}
+       \end{array}\right}$]
+**tags**:: latexmath:[$
+       :\>f:\textcolor{#D2691E}{\textbf{flux}} →
+       \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack
+       \ =\ \textbf{tags}~(\textbf{commentaire}~f)$]
+|
+[source,conf]
+----
+commentaire ::= ( ";" (tag ":" valeur? \| ·)* )
+     ( ("⏎"\|"␣")* ";" (tag ":" valeur? \| ·)* )*
+----
+|
+[horizontal]
+:role: math
+**tags**:: latexmath:[$
+       :\>m:\textcolor{#D2691E}{\textbf{commentaire}} →
+       \lbrack\textcolor{#D2691E}{\textbf{tag}}\rbrack$]
+**tag**:: latexmath:[$
+       :\>(\textcolor{#083194}{\textbf{tag}}:\textcolor{#D2691E}{\textbf{texte}},%
+       ~\textcolor{#083194}{\textbf{valeur}}:\textcolor{#D2691E}{\textbf{\mbox{texte}}\>?})$]
+|==================================
+
+NOTE: RTFM @ http://hledger.org/manual/[].
+
+
+=== Calculs
+
+[horizontal]
+**compte_parent**::
+ latexmath:[$:\>c : \textcolor{#D2691E}{\textbf{compte}} → \textcolor{#D2691E}{\textbf{compte}}\>?$] +
+ latexmath:[$=\>c_{\lbrack0,\cdots,|c|-2\rbrack}\ \mbox{si}\ |c| \ge 2$]
+**hiérarchie_de_compte**::
+ latexmath:[$:\>\mathbb c : \textcolor{#D2691E}{\textbf{compte}} → \lbrack\textcolor{#D2691E}{\textbf{compte}}\rbrack$] +
+ latexmath:[$=\>\lbrack{\ c\ :\ \lbrack{\ c\ |\ c ← (\mathbf{compte\mbox{_}parent}\>{c})}\ \rbrack}\ \rbrack$]
+**comptes**::
+ latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → \{\textcolor{#D2691E}{\textbf{compte}}\}$] +
+ latexmath:[$\{\ (\textbf{compte}\>f)\ |\ f ← (\textbf{flux}\>e)\ |\ e ← \mathbb E\ \}$]
+**balance**::
+ latexmath:[$:\>\mathbb F : \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack → ℚ$] +
+ latexmath:[$=\>{(\ m\ |\ m ← m + (\textbf{montant}\>f)\ |\ f ← \mathbb F\ |\ m ← 0\ )$] +
+**solde_de_compte**::
+ latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack → c : \textcolor{#D2691E}{\textbf{compte}} → ℚ$] +
+ latexmath:[$=\>{\textbf{balance}\>\lbrack{\ f\ |\ f ← (\textbf{flux}\>e),\ c\>≼\>(\textbf{compte}\>f)\ |\ e ← \mathbb E\ }\rbrack$] +
+// latexmath:[$=\>{\displaystyle{\sum_{e ← \mathbb E}}\left(\sum_{\stackrel{f ← (\textbf{flux}\>e),}{c\ ≼\ (\textbf{compte}\>f)}}(\textbf{montant}\>f})\right)$]
+**solde**::
+ latexmath:[$:\>\mathbb E : \lbrack\textcolor{#D2691E}{\textbf{\acute{e}criture}}\rbrack →
+       \lbrack\textcolor{#D2691E}{\textbf{flux}}\rbrack$] +
+ latexmath:[$=\>\displaystyle{\left\lbrack
+       \begin{array}{l}
+       (\textcolor{#083194}{\textbf{compte}}=c´, \textcolor{#083194}{\textbf{montant}}=m) \\
+       |\ m ← (\mathbf{\mbox{solde_de_compte}}\,\mathbb E\,c´) \\
+       |\ c´ ← (\mathbf{hi\acute{e}rarchie\mbox{_}de\mbox{_}compte}\,c) \\
+       |\ c ← (\mathbf{comptes}\,\mathbb E)
+       \end{array}}\right\rbrack$]
+
+
+=== Utiliser un éditeur de texte structuré (`vim`)
+
+Coloration syntaxique sur mesure::
+* ++hledger.vim++
++
+[source,vim]
+.~/.vimrc
+----
+autocmd BufNewFile,BufRead *.hledger,*.ledger setfiletype hledger
+----
+Complètement automatique des comptes (`<Tab>`)::
++
+* https://github.com/Shougo/neocomplete.vim[]
+* https://github.com/Shougo/neocomplcache.vim[]
++
+[source,vim]
+.~/.vimrc
+----
+autocmd Filetype hledger set iskeyword+=.,38,39,40,41,44,45,58 "
+----
+Alignement automatique des montants::
++
+* https://github.com/junegunn/vim-easy-align[]
++
+[source,vim]
+.~/.vimrc
+----
+       let g:easy_align_ignore_groups = ['Comment', 'String', 'hledgerTransaction']
+----
+
+ifdef::backend-slidy2[>>>]
+==== Suivre les modifications à plusieurs et/ou à distance (`git`)
+TODO
+
+== Commandes `hledger`
+
+ifdef::backend-slidy2[>>>]
+=== Calculer des soldes (`balance`)
+[source,sh]
+----
+% hledger balance -f $fichier.ledger $filtre
+----
+
+[source,sh]
+.Suivi des comptes
+----
+% hledger balance -b 2012/02/01 -e 2012/04/30              --monthly -f $fichier.ledger >/tmp/bal.flow
+% hledger balance -b 2012/02/01 -e 2012/04/30 --cumulative --monthly -f $fichier.ledger >/tmp/bal.cumulative
+% hledger balance -b 2012/02/01 -e 2012/04/30 --historical --monthly -f $fichier.ledger >/tmp/bal.historical
+% gvimdiff -o /tmp/bal.{cumulative,historical}
+----
+image::data/gvimdiff-cumulative-historical.png[]
+
+ifdef::backend-slidy2[>>>]
+=== Filtrer des écritures (`print`)
+TODO
+
+ifdef::backend-slidy2[>>>]
+=== Suivre un compte (`register`)
+TODO
+
+ifdef::backend-slidy2[>>>]
+=== Observer des statistiques (`stats`, `activity`)
+TODO
+
+
+== Exercice comptable
+
+ifdef::backend-slidy2[>>>]
+=== Plan comptable d’une association
+
+* DOC : https://wiki.cyclocoop.org/Comptabilité/Document/Plan_comptable/[]
+
+[source,hledger]
+----
+#include::data/Cyclofficine.Plan_comptable.hledger[]
+----
+
+=== Comptabiliser en partie double
+
+Solde nul de toute écriture::
++
+Pour toute écriture;;
+Tout ce qui est _débité_ (+++++) dans ses comptes +
+est forcément _crédité_ (++-++) dans ses autres comptes.
++
+* latexmath:[$\forall e : \textcolor{#D2691E}{\textbf{\acute{e}criture}},
+       \ \textbf{balance}\>(\textbf{flux}\>{e}) = 0$]
+
+Relation de Chasles par écritures d’engagement et de paiement::
++
+[source,hledger]
+----
+01/01 Écriture d’engagement
+       7.Produit:0.Vente:1.Produit_fini:1.Vélo                  -80
+       5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser   80
+
+01/02 Écriture de paiement
+       5.Finance:1.Etablissement:1.Valeur:2.Chèque_à_encaisser  -80
+       5.Finance:1.Etablissement:2.Banque:001.Courant            80
+----
++
+NOTE: pour des espèces, transiter par : ++5.Finance:3.Caisse:1.Siège++
+
+==== Soldes nuls souhaitables
+
+- Écritures des recettes
++
+1. latexmath:[$\sum{\mbox{ventes}} + \sum{\mbox{dons}} = \sum{\mbox{espèces entrées en caisse}} + \sum{\mbox{Chèques à encaisser}}$] +
+(Total des ventes + dons == Total d’espèces entrée en caisse + Chèques à encaisser (5112))
+2. Total chèques à encaisser (5112) == Total remises de chèques à la banque (512) (+/- argent non déposé en banque)
+3. Solde du compte caisse (531) == Total entrées espèces en caisse - Total des sorties (remises d’espèces en banque - sorties d’achats - erreur de caisse)
+4. Solde compte caisse (531) == Total entrées en caisse - Dépôt espèce en banque - Achat en espèce
+
+
+- Écritures de paye
++
+TODO
+
+
+=== Journaux (filtres)
+[horizontal]
+**Banque**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger '^5.Finance:1.Etablissement:2.Banque:'
+----
+**Achats**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger '^(2.Immobilisation:1.Corporelle:|6.Charge:(0.Achat|1.Service|2.Autre_service):)'
+----
+**Vente**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger '^7.Produit:0.Vente:'
+----
+**Caisse**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger '^5.Finance:3.Caisse:'
+----
+**Paye**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger '6.Charge:(3.Impôt:(1.|3.):|4.Personnel:)'
+----
+**À NouVeaux**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger tag:ANV
+----
+**Opération_Diverses**::
++
+[source,sh]
+----
+hledger print -f $fichier.ledger tag:OD
+----
+
+=== Clôture / Ouverture (`equity`)
+++hledger-equity++ calcule une balance de comptes
+et en fait deux écritures, respectivement :
+[horizontal]
+de clôture:: pour les solder à zéro en fin d’exercice ;
+d’ouverture:: pour les réinitialiser à leur solde du précédent exercice.
+
+[source,sh]
+----
+% hledger-equity -f $fichier.ledger $filtre
+----
+
+[source,hledger]
+.Solde des compte de gestion
+----
+% hledger-equity '^6' '^7' -f Paris.2011.hledger
+2014/07/29
+    6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:1.Atelier      -248,87€
+    6.Charge:1.Service:3.Location:2.Immobilière                             -441,46€
+    6.Charge:2.Autre_service:3.Communication:6.Catalogue,Imprimé             -24,00€
+    6.Charge:2.Autre_service:7.Service_bancaire                              -31,25€
+    6.Charge:5.Gestion:8.Divers:6.Cotisation_(vie_statutaire)                -25,00€
+    7.Produit:0.Vente:6.Prest'action                                         700,00€
+    7.Produit:5.Autre_gestion_courante:6.Cotisation                           20,00€
+    7.Produit:5.Autre_gestion_courante:8.Divers                                6,00€
+    equity:closing balances                                                   44,58€
+
+2014/07/29
+    6.Charge:0.Achat:6.Non_stocké:8.Autre_Matière,Fourniture:1.Atelier       248,87€
+    6.Charge:1.Service:3.Location:2.Immobilière                              441,46€
+    6.Charge:2.Autre_service:3.Communication:6.Catalogue,Imprimé              24,00€
+    6.Charge:2.Autre_service:7.Service_bancaire                               31,25€
+    6.Charge:5.Gestion:8.Divers:6.Cotisation_(vie_statutaire)                 25,00€
+    7.Produit:0.Vente:6.Prest'action                                        -700,00€
+    7.Produit:5.Autre_gestion_courante:6.Cotisation                          -20,00€
+    7.Produit:5.Autre_gestion_courante:8.Divers                               -6,00€
+    equity:opening balances                                                  -44,58€
+----
+
+== Import et export avec `hledger`
+
+* https://github.com/eval/total_recall[]
+* https://github.com/quentinsf/icsv2ledger[]
+
+=== Feuilles de calculs des documents comptables
+
+ifdef::backend-slidy2[>>>]
+==== Bilan financier
+TODO
+
+ifdef::backend-slidy2[>>>]
+==== Comptes de résultats
+TODO
+
+== `hledger-web`
+TODO
+
+== (bonus) Scripter ++hledger++
+TODO
+
+ifdef::backend-slidy2[>>>]
+=== Installer un script ++hledger++
+[source,sh]
+----
+% echo 'PATH="$HOME/src/hledger/extra:$PATH"' >>~/.profile
+% exit # NOTE: recharge ~/.profile
+% ghc ~/src/hledger/extra/hledger-SCRIPT.hs
+----
+
+== Communauté
+
+[horizontal]
+Chat:: <irc://irc.freenode.net#ledger>
+Liste:: <hledger+subscribe@googlegroups.com>
+
+
+
+ifdef::backend-slidy2[]
+[hledgersplash,position: absolute; left: 50%; top: 10%;]
+&&&&
+image::data/hledger.splash.png[hledgersplash]
+&&&&
+endif::backend-slidy2[]
diff --git a/doc/hledger.fr.slidy.css b/doc/hledger.fr.slidy.css
new file mode 100644 (file)
index 0000000..e8128ee
--- /dev/null
@@ -0,0 +1,467 @@
+html body {
+       color:#343434;
+       font-family:serif;
+       font-size:10px;
+       margin:0 0;
+       padding:0 0 0 0;
+ }
+/* titres */
+       h1, h2, h3, h4, h5, h6 {
+               font-family: serif;
+        }
+       div.slide h1 {
+               margin: 0 0 0 0 !important;
+        }
+       #revnumber {
+               font-family: serif;
+               font-size:inherit;
+               font-weight:bold;
+        }
+/* sections */
+       .article {
+        }
+       .article > .sect1,
+       .article > .sect2,
+       .article > .sect3 {
+               -moz-box-sizing:border-box;
+               -webkit-box-sizing:border-box;
+               box-sizing:border-box;
+               clear:both;
+               display:table;
+               float:left;
+               margin:0 auto 0 auto;
+               padding:0 1em 0 1em;
+               width:100%;
+        }
+       .article > .sect1:last-child {
+               margin-bottom:2ex;
+        }
+       .article > .sect1 * {
+               clear:both;
+        }
+       .article > .refnamediv > *,
+       .article > .sect1 > *,
+       .article > .refsynopsisdiv > * {
+        }
+       .article > .sect1 > .sect2 > * {
+               margin-left:1em;
+        }
+       .article > .sect1 > .sect2 > .sect3 > * {
+               margin-left:2em;
+        }
+/* text */
+       a:empty {
+               margin:0 0 0 0;
+               padding:0 0 0 0;
+        }
+       .article em {
+               color:#000080;
+        }
+       .article .emphasis {
+               text-decoration:underline;
+        }
+       .article p {
+               margin:0 0 0 0;
+               max-width:34em;
+               padding:1ex 0 0 0;
+               text-align:justify;
+        }
+       .article h2 + p {
+               margin-top:0;
+               padding-top:0.25ex;
+        }
+       .article h3 + p,
+       .article h3 + p[title] {
+               margin-top:0;
+               padding-top:0;
+        }
+/* citations */
+       .article code,
+       .article code.literal {
+               background-color:#EEEEEE;
+               color:inherit !important;
+               font-family:monospace,Courier;
+               white-space:pre;
+               font-size:90%;
+        }
+       .article pre {
+               /*background-color: #ffffff;*/
+               font-family:monospace,Courier;
+               line-height:1.3; /* TODO: 1.2 ? */
+               color: #000000;
+               font-family: monospace;
+               line-height: 1.13;
+               overflow: auto;
+               white-space: pre;
+        }
+       .article pre.literallayout {
+               border-left:1ex solid navy;
+               margin-left:0;
+               padding-left:1ex;
+        }
+       .article .screen {
+               border-width:0px 0px 0px 5px;
+               color:black;
+               display:inline-block;
+               margin:0.5ex 0 0.5ex 0;
+        }
+       .article .programlisting {
+               color:black;
+               margin-left:2em;
+               margin-right:2em;
+        }
+       .article .listitem > .simpara {
+               display:inline;
+               margin-bottom:0;
+        }
+/* titles */
+       .article > .sect1 > h2 {
+               border-bottom:2px solid black;
+               /*box-shadow:0px 1px 00px #888888;*/
+               color:green;
+               font-family:monospace,Arial,sans-serif;
+               font-size:120%;
+               /*font-variant:small-caps;*/
+               line-height:1.2;
+               margin:1ex 0 0.5ex 0;
+               padding:0 0 0.5ex 0;
+        }
+       .article > .refnamediv     > h2,
+       .article > .refsynopsisdiv > h2 {
+               font-variant:small-caps;
+        }
+       .article > .sect1 > .sect2 > h3 {
+               color:DarkGreen;
+               font-family:monospace,Arial,sans-serif;
+               font-size:100%;
+               padding:1.5ex 0 0.5ex 0;
+               margin:0 0 0 0;
+        }
+       .article > .sect1 > h2 + .sect2 > h3 {
+               padding-top:0;
+        }
+       .article > .sect1 > .sect2 > h3:before,
+       .article .toc .sect2:before {
+               color:black;
+               content:"► ";
+               font-family:monospace,Arial,sans-serif;
+               float:left;
+        }
+       .article > .sect1 > .sect2 > .sect3 > h4 {
+               color:DarkGreen;
+               font-family:monospace,Arial,sans-serif;
+               font-size:100%;
+               padding:1em 0 0 0;
+               margin:0 0 0 0;
+        }
+       .article > .sect1 > .sect2 > .sect3 > h4:before,
+       .article .toc .sect3:before {
+               color:black;
+               content:"►► ";
+               font-family:monospace,Arial,sans-serif;
+               float:left;
+        }
+       .article li.listitem > p.simpara:first-child {
+               margin-top:0;
+        }
+       .article p .formalpara-title {
+               /* XXX: there is a docbook-xsl bug here:
+                * https://lists.oasis-open.org/archives/docbook-apps/201107/msg00003.html
+                */
+               color:black;
+               font-weight:bold;
+               line-height:1.4;
+               margin:0 0 0 0;
+               padding:0 0 0 0;
+               text-align:left;
+        }
+       .article p[title] {
+               margin:1ex 0 0 0;
+               max-width:none;
+               padding:0 0 0 0;
+        }
+       .article span.citerefentry > span.articletitle {
+               white-space:nowrap;
+        }
+/* lists */
+       .article .hdlist p {
+               padding:0 0 0 0;
+        }
+       .article .hdlist td.hdlist1 {
+               text-align:right;
+               vertical-align:top;
+        }
+       .article .hdlist td.hdlist1,
+       .article .hdlist td.hdlist1 {
+               text-align:right;
+        }
+       .article .hdlist td.hdlist2 {
+               text-align:left;
+               padding:0 0 0 0;
+               vertical-align:middle;
+        }
+       .article .hdlist td.hdlist2 > .listingblock {
+               margin-top: 0;
+        }
+       .article .hdlist.math td.hdlist1,
+       .article .hdlist.math td.hdlist2 {
+               vertical-align:middle !important;
+        }
+       .article .calloutlist p {
+               padding:0 0 0 0;
+        }
+       .article .calloutlist td {
+               padding:0 0 0 0;
+        }
+       .article .calloutlist td p {
+        }
+       .article .calloutlist td:first-child {
+               padding-right:1em;
+        }
+       .article .calloutlist td:first-child p {
+               text-align:right;
+        }
+       .article .itemizedlist,
+       .article .orderedlist {
+               padding:0 0 0 0;
+               margin:0 0 0 0;
+        }
+       .article .itemizedlist ul,
+       .article .orderedlist  ol {
+               padding:0 0 0 0;
+               margin:0 0 0 1.5em;
+               list-style-position:outside;
+        }
+       .article .itemizedlist ul li,
+       .article .orderedlist  ol li {
+               margin:0 0 0 0;
+               max-width:51em;
+               padding:0 0 0 0;
+        }
+       .article .dlist {
+               padding:0 0 0 0;
+               margin:0 0 0 0;
+        }
+       .article .dlist dl {
+               list-style-position:outside;
+               margin:0 0 0 0;
+               padding:0.5ex 0 0 0;
+        }
+       .article .dlist dl dt {
+               margin:0 0 0 0;
+               padding-left:1px;
+        }
+       .article .dlist dl dd {
+               border-left:1px dotted black;
+               margin:0.5ex 0 0.5ex 0.9ex;
+               max-width:51em;
+               padding-left:1.1ex;
+               text-align:justify;
+        }
+       .article .dlist dl dd > p:first-child {
+               padding-top:0;
+        }
+       .article .dlist dl dd > p:last-child {
+               padding-bottom:0;
+        }
+       .article .dlist dt:before,
+       .article .toc dt:before {
+               color:black;
+               content:"▪ ";
+               font-family:monospace,Arial,sans-serif;
+               float:left;
+        }
+       .article h2 + .itemizedlist ul,
+       .article h2 + .orderedlist  ol,
+       .article h2 + .dlist dl {
+               padding-top:0;
+        }
+/* fhs */
+       .article a[href^="#fhs:"] {
+               white-space:pre;
+        }
+       .article .toc a[href^="#fhs:"] {
+               white-space:normal;
+        }
+/* sidebar */
+       .article .sidebar {
+               -moz-box-sizing:border-box;
+               -webkit-box-sizing:border-box;
+               background:none repeat scroll 0 0 #FFFFEE;
+               border:1px solid #C0C0C0;
+               box-sizing:border-box;
+               clear:both;
+               float:left;
+               height:96%;
+               left:0;
+               margin:1em 0 0 1em;
+               overflow:auto;
+               padding:1ex 1em 1ex 1em;
+               position:fixed;
+               top:0;
+               width:30em;
+        }
+       .article .sidebar .refnamediv {
+               margin:0 0 1ex 0;
+        }
+       .article .sidebar .refnamediv h2 {
+               border-bottom:2px solid black;
+               color:green;
+               font-family:monospace,Arial,sans-serif;
+               font-size:120%;
+               font-variant:small-caps;
+               border-bottom:0 solid black;
+               margin:0 0 0.5ex 0;
+               padding:0 0 0 0;
+        }
+       .article .sidebar .refnamediv p {
+               margin:0 0 0 0;
+               padding:0 0 0 0;
+               text-align:justify;
+        }
+/* location */
+       .article .location {
+               margin:0 0 0 0;
+        }
+       .article .location .location-title {
+               display:inline-block;
+        }
+       .article .location .location-path {
+               display:inline-block;
+               margin-left:1em;
+               margin-bottom:0.5ex;
+        }
+       .article .location .location-path a {
+               display:inline-block;
+        }
+       .article .location .location-path .dir {
+               color:blue;
+               font-weight:bold;
+        }
+       .article .location .location-path .dir .slash {
+               color:black;
+        }
+       .article .location .location-path .file {
+               font-weight:bold;
+        }
+/* language */
+       .article .language {
+               margin:0 0 0 0;
+        }
+       .article .language .language-title {
+               display:inline-block;
+        }
+       .article .language .language-list {
+               display:inline-block;
+               font-weight:bold;
+               margin-left:1em;
+        }
+       .article .language .language-list .lang-available {
+               color:blue;
+        }
+       .article .language .language-list .lang-current {
+               color:black;
+        }
+/* toc */
+       .article .toc {
+        }
+       .article .toc dl {
+               clear:left;
+               margin-left:0;
+               padding-left:0;
+        }
+       .article .toc dl dd {
+               border-left:1px dotted #333;
+               margin-bottom:1px;
+               margin-left:0.1ex;
+               padding-left:1.9ex;
+        }
+       .article .toc dl dt span.refsynopsisdiv {
+        }
+       .article .toc .sect1:before {
+               color:black;
+               content:"§ ";
+               font-family:monospace,Arial,sans-serif;
+               float:left;
+        }
+       .article .toc .toc-title,
+       .article .language .language-title,
+       .article .location .location-title {
+               border-bottom:0 solid black;
+               color:green;
+               font-size:120%;
+               font-variant:small-caps;
+               font-weight:bold;
+               margin-bottom:0.5ex;
+        }
+       div.slidy_toc,
+       body > div.slidy_toc,
+       .article div.slidy_toc {
+               background: none repeat scroll 0 0 #F0F0F0;
+               border-style: solid;
+               border-width: 2px;
+               font-size: 100%;
+               height: 80%;
+               left: auto !important;
+               bottom:    auto !important;
+               right:     0    !important;
+               max-width: none !important;
+               width: 50% !important;
+               overflow: auto;
+               padding: 1em;
+               position: absolute;
+               top: 0;
+               z-index: 300;
+        }
+       .article div.toc-heading {
+               border-bottom: 1px solid #B4B4B4;
+               font-weight: bold;
+               margin-bottom: 1em;
+               text-align: center;
+               width: 100%;
+        }
+/* incremental preview */
+       body.single_slide .invisible {
+               opacity: 0.15;
+               visibility: visible;
+        }
+       img.invisible {
+               visibility: hidden !important;
+        }
+/* image */
+       .imageblock img {
+               border:1px solid black;
+               display:block;
+               margin:0 auto 0 auto;
+        }
+/* splash */
+       div.hledgersplash > div.imageblock {
+               /*border:black solid 1px;*/
+               left:-50%;
+               position:relative;
+        }
+/* vim syntax */
+       pre .Error { color: #8080ff; background-color: #ffffff; }
+       pre .PreProc { color: #ff6060; text-decoration: underline; font-weight: bold; }
+       pre .Special { color: #8080ff; font-weight: bold; }
+       pre .Constant { color: #ff40ff; text-decoration: none; }
+       pre .Statement { color: #B8860B; font-weight: bold; }
+       pre .Identifier { color: #ffff00; text-decoration: underline; }
+       pre .Comment { color: #4169e1; font-weight: bold; }
+/* vim syntax: hledger */
+       pre .hledgerNumberOdd { color: #0000ff; background-color: #e5e5e5; font-weight: bold; }
+       pre .hledgerPostingAmountOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }
+       pre .hledgerAccountSeparatorOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }
+       pre .hledgerPostingAccountOdd { color: #4d4d4d; background-color: #e5e5e5; }
+       pre .hledgerNumber { color: #0000ff; background-color: #90ee90; font-weight: bold; }
+       pre .hledgerPostingAmount { color: #eead0e; background-color: #90ee90; font-weight: bold; }
+       pre .hledgerAccountSeparator { color: #eead0e; background-color: #90ee90; font-weight: bold; }
+       pre .hledgerPostingAccount { color: #4d4d4d; background-color: #90ee90; }
+       pre .hledgerTagValue { color: #ff0000; }
+       pre .hledgerTag { color: #ffa500; font-weight: bold; }
+       pre .hledgerTransactionComment { color: #4169e1; font-weight: bold; }
+       pre .hledgerTransaction { font-weight: bold; }
+       pre .hledgerTransactionDate { background-color: #eedd82; font-weight: bold; }
+       pre .hledgerDirective { font-weight: bold; }
+       pre .hledgerInclude { font-weight: bold; }
+       pre .hledgerComment { color: #4169e1; font-weight: bold; }
diff --git a/doc/hledger.fr.slidy.d b/doc/hledger.fr.slidy.d
new file mode 100644 (file)
index 0000000..35e97e4
--- /dev/null
@@ -0,0 +1,2 @@
+hledger.fr.slidy.ad \
+hledger.fr.slidy.d: \
diff --git a/doc/hledger.fr.slidy.html b/doc/hledger.fr.slidy.html
new file mode 100644 (file)
index 0000000..a5c4fca
--- /dev/null
@@ -0,0 +1,8273 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">\r
+<head>\r
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
+<meta name="copyright" content="© 2014 (CC) BY Julien Moutinho &amp;lt;julm+hledger@autogeree.net&amp;gt;" />\r
+<meta name="generator" content="AsciiDoc 8.6.9 / slidy2 backend 1.0.3" />\r
+<meta name="font-size-adjustment" content="-3" />\r
+<title>Informatiser une comptabilité avec confiance</title>\r
+<style type="text/css">\r
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
+\r
+/* Default font. */\r
+body {\r
+  font-family: Georgia,serif;\r
+}\r
+\r
+/* Title font. */\r
+h1, h2, h3, h4, h5, h6,\r
+div.title, caption.title,\r
+thead, p.table.header,\r
+#toctitle,\r
+#author, #revnumber, #revdate, #revremark,\r
+#footer {\r
+  font-family: Arial,Helvetica,sans-serif;\r
+}\r
+\r
+body {\r
+  margin: 1em 5% 1em 5%;\r
+}\r
+\r
+a {\r
+  color: blue;\r
+  text-decoration: underline;\r
+}\r
+a:visited {\r
+  color: fuchsia;\r
+}\r
+\r
+em {\r
+  font-style: italic;\r
+  color: navy;\r
+}\r
+\r
+strong {\r
+  font-weight: bold;\r
+  color: #083194;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+  color: #527bbd;\r
+  margin-top: 1.2em;\r
+  margin-bottom: 0.5em;\r
+  line-height: 1.3;\r
+}\r
+\r
+h1, h2, h3 {\r
+  border-bottom: 2px solid silver;\r
+}\r
+h2 {\r
+  padding-top: 0.5em;\r
+}\r
+h3 {\r
+  float: left;\r
+}\r
+h3 + * {\r
+  clear: left;\r
+}\r
+h5 {\r
+  font-size: 1.0em;\r
+}\r
+\r
+div.sectionbody {\r
+  margin-left: 0;\r
+}\r
+\r
+hr {\r
+  border: 1px solid silver;\r
+}\r
+\r
+p {\r
+  margin-top: 0.5em;\r
+  margin-bottom: 0.5em;\r
+}\r
+\r
+ul, ol, li > p {\r
+  margin-top: 0;\r
+}\r
+ul > li     { color: #aaa; }\r
+ul > li > * { color: black; }\r
+\r
+.monospaced, code, pre {\r
+  font-family: "Courier New", Courier, monospace;\r
+  font-size: inherit;\r
+  color: navy;\r
+  padding: 0;\r
+  margin: 0;\r
+}\r
+pre {\r
+  white-space: pre-wrap;\r
+}\r
+\r
+#author {\r
+  color: #527bbd;\r
+  font-weight: bold;\r
+  font-size: 1.1em;\r
+}\r
+#email {\r
+}\r
+#revnumber, #revdate, #revremark {\r
+}\r
+\r
+#footer {\r
+  font-size: small;\r
+  border-top: 2px solid silver;\r
+  padding-top: 0.5em;\r
+  margin-top: 4.0em;\r
+}\r
+#footer-text {\r
+  float: left;\r
+  padding-bottom: 0.5em;\r
+}\r
+#footer-badges {\r
+  float: right;\r
+  padding-bottom: 0.5em;\r
+}\r
+\r
+#preamble {\r
+  margin-top: 1.5em;\r
+  margin-bottom: 1.5em;\r
+}\r
+div.imageblock, div.exampleblock, div.verseblock,\r
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,\r
+div.admonitionblock {\r
+  margin-top: 1.0em;\r
+  margin-bottom: 1.5em;\r
+}\r
+div.admonitionblock {\r
+  margin-top: 2.0em;\r
+  margin-bottom: 2.0em;\r
+  margin-right: 10%;\r
+  color: #606060;\r
+}\r
+\r
+div.content { /* Block element content. */\r
+  padding: 0;\r
+}\r
+\r
+/* Block element titles. */\r
+div.title, caption.title {\r
+  color: #527bbd;\r
+  font-weight: bold;\r
+  text-align: left;\r
+  margin-top: 1.0em;\r
+  margin-bottom: 0.5em;\r
+}\r
+div.title + * {\r
+  margin-top: 0;\r
+}\r
+\r
+td div.title:first-child {\r
+  margin-top: 0.0em;\r
+}\r
+div.content div.title:first-child {\r
+  margin-top: 0.0em;\r
+}\r
+div.content + div.title {\r
+  margin-top: 0.0em;\r
+}\r
+\r
+div.sidebarblock > div.content {\r
+  background: #ffffee;\r
+  border: 1px solid #dddddd;\r
+  border-left: 4px solid #f0f0f0;\r
+  padding: 0.5em;\r
+}\r
+\r
+div.listingblock > div.content {\r
+  border: 1px solid #dddddd;\r
+  border-left: 5px solid #f0f0f0;\r
+  background: #f8f8f8;\r
+  padding: 0.5em;\r
+}\r
+\r
+div.quoteblock, div.verseblock {\r
+  padding-left: 1.0em;\r
+  margin-left: 1.0em;\r
+  margin-right: 10%;\r
+  border-left: 5px solid #f0f0f0;\r
+  color: #888;\r
+}\r
+\r
+div.quoteblock > div.attribution {\r
+  padding-top: 0.5em;\r
+  text-align: right;\r
+}\r
+\r
+div.verseblock > pre.content {\r
+  font-family: inherit;\r
+  font-size: inherit;\r
+}\r
+div.verseblock > div.attribution {\r
+  padding-top: 0.75em;\r
+  text-align: left;\r
+}\r
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */\r
+div.verseblock + div.attribution {\r
+  text-align: left;\r
+}\r
+\r
+div.admonitionblock .icon {\r
+  vertical-align: top;\r
+  font-size: 1.1em;\r
+  font-weight: bold;\r
+  text-decoration: underline;\r
+  color: #527bbd;\r
+  padding-right: 0.5em;\r
+}\r
+div.admonitionblock td.content {\r
+  padding-left: 0.5em;\r
+  border-left: 3px solid #dddddd;\r
+}\r
+\r
+div.exampleblock > div.content {\r
+  border-left: 3px solid #dddddd;\r
+  padding-left: 0.5em;\r
+}\r
+\r
+div.imageblock div.content { padding-left: 0; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
+a.image:visited { color: white; }\r
+\r
+dl {\r
+  margin-top: 0.8em;\r
+  margin-bottom: 0.8em;\r
+}\r
+dt {\r
+  margin-top: 0.5em;\r
+  margin-bottom: 0;\r
+  font-style: normal;\r
+  color: navy;\r
+}\r
+dd > *:first-child {\r
+  margin-top: 0.1em;\r
+}\r
+\r
+ul, ol {\r
+    list-style-position: outside;\r
+}\r
+ol.arabic {\r
+  list-style-type: decimal;\r
+}\r
+ol.loweralpha {\r
+  list-style-type: lower-alpha;\r
+}\r
+ol.upperalpha {\r
+  list-style-type: upper-alpha;\r
+}\r
+ol.lowerroman {\r
+  list-style-type: lower-roman;\r
+}\r
+ol.upperroman {\r
+  list-style-type: upper-roman;\r
+}\r
+\r
+div.compact ul, div.compact ol,\r
+div.compact p, div.compact p,\r
+div.compact div, div.compact div {\r
+  margin-top: 0.1em;\r
+  margin-bottom: 0.1em;\r
+}\r
+\r
+tfoot {\r
+  font-weight: bold;\r
+}\r
+td > div.verse {\r
+  white-space: pre;\r
+}\r
+\r
+div.hdlist {\r
+  margin-top: 0.8em;\r
+  margin-bottom: 0.8em;\r
+}\r
+div.hdlist tr {\r
+  padding-bottom: 15px;\r
+}\r
+dt.hdlist1.strong, td.hdlist1.strong {\r
+  font-weight: bold;\r
+}\r
+td.hdlist1 {\r
+  vertical-align: top;\r
+  font-style: normal;\r
+  padding-right: 0.8em;\r
+  color: navy;\r
+}\r
+td.hdlist2 {\r
+  vertical-align: top;\r
+}\r
+div.hdlist.compact tr {\r
+  margin: 0;\r
+  padding-bottom: 0;\r
+}\r
+\r
+.comment {\r
+  background: yellow;\r
+}\r
+\r
+.footnote, .footnoteref {\r
+  font-size: 0.8em;\r
+}\r
+\r
+span.footnote, span.footnoteref {\r
+  vertical-align: super;\r
+}\r
+\r
+#footnotes {\r
+  margin: 20px 0 20px 0;\r
+  padding: 7px 0 0 0;\r
+}\r
+\r
+#footnotes div.footnote {\r
+  margin: 0 0 5px 0;\r
+}\r
+\r
+#footnotes hr {\r
+  border: none;\r
+  border-top: 1px solid silver;\r
+  height: 1px;\r
+  text-align: left;\r
+  margin-left: 0;\r
+  width: 20%;\r
+  min-width: 100px;\r
+}\r
+\r
+div.colist td {\r
+  padding-right: 0.5em;\r
+  padding-bottom: 0.3em;\r
+  vertical-align: top;\r
+}\r
+div.colist td img {\r
+  margin-top: 0.3em;\r
+}\r
+\r
+@media print {\r
+  #footer-badges { display: none; }\r
+}\r
+\r
+#toc {\r
+  margin-bottom: 2.5em;\r
+}\r
+\r
+#toctitle {\r
+  color: #527bbd;\r
+  font-size: 1.1em;\r
+  font-weight: bold;\r
+  margin-top: 1.0em;\r
+  margin-bottom: 0.1em;\r
+}\r
+\r
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {\r
+  margin-top: 0;\r
+  margin-bottom: 0;\r
+}\r
+div.toclevel2 {\r
+  margin-left: 2em;\r
+  font-size: 0.9em;\r
+}\r
+div.toclevel3 {\r
+  margin-left: 4em;\r
+  font-size: 0.9em;\r
+}\r
+div.toclevel4 {\r
+  margin-left: 6em;\r
+  font-size: 0.9em;\r
+}\r
+\r
+span.aqua { color: aqua; }\r
+span.black { color: black; }\r
+span.blue { color: blue; }\r
+span.fuchsia { color: fuchsia; }\r
+span.gray { color: gray; }\r
+span.green { color: green; }\r
+span.lime { color: lime; }\r
+span.maroon { color: maroon; }\r
+span.navy { color: navy; }\r
+span.olive { color: olive; }\r
+span.purple { color: purple; }\r
+span.red { color: red; }\r
+span.silver { color: silver; }\r
+span.teal { color: teal; }\r
+span.white { color: white; }\r
+span.yellow { color: yellow; }\r
+\r
+span.aqua-background { background: aqua; }\r
+span.black-background { background: black; }\r
+span.blue-background { background: blue; }\r
+span.fuchsia-background { background: fuchsia; }\r
+span.gray-background { background: gray; }\r
+span.green-background { background: green; }\r
+span.lime-background { background: lime; }\r
+span.maroon-background { background: maroon; }\r
+span.navy-background { background: navy; }\r
+span.olive-background { background: olive; }\r
+span.purple-background { background: purple; }\r
+span.red-background { background: red; }\r
+span.silver-background { background: silver; }\r
+span.teal-background { background: teal; }\r
+span.white-background { background: white; }\r
+span.yellow-background { background: yellow; }\r
+\r
+span.big { font-size: 2em; }\r
+span.small { font-size: 0.6em; }\r
+\r
+span.underline { text-decoration: underline; }\r
+span.overline { text-decoration: overline; }\r
+span.line-through { text-decoration: line-through; }\r
+\r
+div.unbreakable { page-break-inside: avoid; }\r
+\r
+\r
+/*\r
+ * xhtml11 specific\r
+ *\r
+ * */\r
+\r
+div.tableblock {\r
+  margin-top: 1.0em;\r
+  margin-bottom: 1.5em;\r
+}\r
+div.tableblock > table {\r
+  border: 3px solid #527bbd;\r
+}\r
+thead, p.table.header {\r
+  font-weight: bold;\r
+  color: #527bbd;\r
+}\r
+p.table {\r
+  margin-top: 0;\r
+}\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
+div.tableblock > table[frame="void"] {\r
+  border-style: none;\r
+}\r
+div.tableblock > table[frame="hsides"] {\r
+  border-left-style: none;\r
+  border-right-style: none;\r
+}\r
+div.tableblock > table[frame="vsides"] {\r
+  border-top-style: none;\r
+  border-bottom-style: none;\r
+}\r
+\r
+\r
+/*\r
+ * html5 specific\r
+ *\r
+ * */\r
+\r
+table.tableblock {\r
+  margin-top: 1.0em;\r
+  margin-bottom: 1.5em;\r
+}\r
+thead, p.tableblock.header {\r
+  font-weight: bold;\r
+  color: #527bbd;\r
+}\r
+p.tableblock {\r
+  margin-top: 0;\r
+}\r
+table.tableblock {\r
+  border-width: 3px;\r
+  border-spacing: 0px;\r
+  border-style: solid;\r
+  border-color: #527bbd;\r
+  border-collapse: collapse;\r
+}\r
+th.tableblock, td.tableblock {\r
+  border-width: 1px;\r
+  padding: 4px;\r
+  border-style: solid;\r
+  border-color: #527bbd;\r
+}\r
+\r
+table.tableblock.frame-topbot {\r
+  border-left-style: hidden;\r
+  border-right-style: hidden;\r
+}\r
+table.tableblock.frame-sides {\r
+  border-top-style: hidden;\r
+  border-bottom-style: hidden;\r
+}\r
+table.tableblock.frame-none {\r
+  border-style: hidden;\r
+}\r
+\r
+th.tableblock.halign-left, td.tableblock.halign-left {\r
+  text-align: left;\r
+}\r
+th.tableblock.halign-center, td.tableblock.halign-center {\r
+  text-align: center;\r
+}\r
+th.tableblock.halign-right, td.tableblock.halign-right {\r
+  text-align: right;\r
+}\r
+\r
+th.tableblock.valign-top, td.tableblock.valign-top {\r
+  vertical-align: top;\r
+}\r
+th.tableblock.valign-middle, td.tableblock.valign-middle {\r
+  vertical-align: middle;\r
+}\r
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {\r
+  vertical-align: bottom;\r
+}\r
+\r
+\r
+/*\r
+ * manpage specific\r
+ *\r
+ * */\r
+\r
+body.manpage h1 {\r
+  padding-top: 0.5em;\r
+  padding-bottom: 0.5em;\r
+  border-top: 2px solid silver;\r
+  border-bottom: 2px solid silver;\r
+}\r
+body.manpage h2 {\r
+  border-style: none;\r
+}\r
+body.manpage div.sectionbody {\r
+  margin-left: 3em;\r
+}\r
+\r
+@media print {\r
+  body.manpage div#toc { display: none; }\r
+}\r
+</style>\r
+<style type="text/css">\r
+/* slidy.css\r
+\r
+   Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.\r
+   W3C liability, trademark, document use and software licensing\r
+   rules apply, see:\r
+\r
+   http://www.w3.org/Consortium/Legal/copyright-documents\r
+   http://www.w3.org/Consortium/Legal/copyright-software\r
+*/\r
+\r
+/*\r
+   SJR: 2010-09-29: Modified for AsciiDoc slidy backend.\r
+   Mostly just commented out stuff that is handled by AsciiDoc's CSS files.\r
+*/\r
+\r
+body\r
+{\r
+  margin: 0 0 0 0;\r
+  padding: 0 0 0 0;\r
+  width: 100%;\r
+  height: 100%;\r
+  color: black;\r
+  background-color: white;\r
+/*\r
+  font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;\r
+*/\r
+  font-size: 14pt;\r
+}\r
+\r
+div.toolbar {\r
+  position: fixed; z-index: 200;\r
+  top: auto; bottom: 0; left: 0; right: 0;\r
+  height: 1.2em; text-align: right;\r
+  padding-left: 1em;\r
+  padding-right: 1em;\r
+  font-size: 60%;\r
+  color: red;\r
+  background-color: rgb(240,240,240);\r
+  border-top: solid 1px rgb(180,180,180);\r
+}\r
+\r
+div.toolbar span.copyright {\r
+  color: black;\r
+  margin-left: 0.5em;\r
+}\r
+\r
+div.initial_prompt {\r
+  position: absolute;\r
+  z-index: 1000;\r
+  bottom: 1.2em;\r
+  width: 90%;\r
+  background-color: rgb(200,200,200);\r
+  opacity: 0.35;\r
+  cursor: pointer;\r
+}\r
+\r
+div.initial_prompt p.help {\r
+  text-align: center;\r
+}\r
+\r
+div.initial_prompt p.close {\r
+  text-align: right;\r
+  font-style: italic;\r
+}\r
+\r
+div.slidy_toc {\r
+  position: absolute;\r
+  z-index: 300;\r
+  width: 60%;\r
+  max-width: 30em;\r
+  height: 30em;\r
+  overflow: auto;\r
+  top: auto;\r
+  right: auto;\r
+  left: 4em;\r
+  bottom: 4em;\r
+  padding: 1em;\r
+  background: rgb(240,240,240);\r
+  border-style: solid;\r
+  border-width: 2px;\r
+  font-size: 60%;\r
+}\r
+\r
+div.slidy_toc .toc_heading {\r
+  text-align: center;\r
+  width: 100%;\r
+  margin: 0;\r
+  margin-bottom: 1em;\r
+  border-bottom-style: solid;\r
+  border-bottom-color: rgb(180,180,180);\r
+  border-bottom-width: 1px;\r
+}\r
+\r
+div.slide {\r
+  z-index: 20;\r
+  margin: 0 0 0 0;\r
+  padding-top: 0;\r
+  padding-bottom: 0;\r
+  padding-left: 20px;\r
+  padding-right: 20px;\r
+  border-width: 0;\r
+  clear: both;\r
+  top: 0;\r
+  bottom: 0;\r
+  left: 0;\r
+  right: 0;\r
+  line-height: 120%;\r
+  background-color: transparent;\r
+}\r
+\r
+div.background {\r
+  display: none;\r
+}\r
+\r
+div.handout {\r
+  margin-left: 20px;\r
+  margin-right: 20px;\r
+}\r
+\r
+div.slide.titlepage {\r
+  text-align: center;\r
+}\r
+\r
+div.slide.titlepage.h1 {\r
+  padding-top: 10%;\r
+}\r
+\r
+div.slide h1 {\r
+  padding-left: 0;\r
+  padding-right: 20pt;\r
+  padding-top: 4pt;\r
+  padding-bottom: 4pt;\r
+  margin-top: 0;\r
+  margin-left: 0;\r
+  margin-right: 60pt;\r
+  margin-bottom: 0.5em;\r
+  display: block;\r
+  font-size: 160%;\r
+  line-height: 1.2em;\r
+  background: transparent;\r
+}\r
+\r
+div.toc {\r
+  position: absolute;\r
+  top: auto;\r
+  bottom: 4em;\r
+  left: 4em;\r
+  right: auto;\r
+  width: 60%;\r
+  max-width: 30em;\r
+  height: 30em;\r
+  border: solid thin black;\r
+  padding: 1em;\r
+  background: rgb(240,240,240);\r
+  color: black;\r
+  z-index: 300;\r
+  overflow: auto;\r
+  display: block;\r
+  visibility: visible;\r
+}\r
+\r
+div.toc-heading {\r
+  width: 100%;\r
+  border-bottom: solid 1px rgb(180,180,180);\r
+  margin-bottom: 1em;\r
+  text-align: center;\r
+}\r
+\r
+/*\r
+pre {\r
+ font-size: 80%;\r
+ font-weight: bold;\r
+ line-height: 120%;\r
+ padding-top: 0.2em;\r
+ padding-bottom: 0.2em;\r
+ padding-left: 1em;\r
+ padding-right: 1em;\r
+ border-style: solid;\r
+ border-left-width: 1em;\r
+ border-top-width: thin;\r
+ border-right-width: thin;\r
+ border-bottom-width: thin;\r
+ border-color: #95ABD0;\r
+ color: #00428C;\r
+ background-color: #E4E5E7;\r
+}\r
+*/\r
+\r
+/*\r
+li pre { margin-left: 0; }\r
+\r
+blockquote { font-style: italic }\r
+\r
+img { background-color: transparent }\r
+\r
+p.copyright { font-size: smaller }\r
+*/\r
+\r
+.center { text-align: center }\r
+.footnote { font-size: smaller; margin-left: 2em; }\r
+\r
+/*\r
+a img { border-width: 0; border-style: none }\r
+*/\r
+\r
+a:visited { color: navy }\r
+a:link { color: navy }\r
+a:hover { color: red; text-decoration: underline }\r
+a:active { color: red; text-decoration: underline }\r
+\r
+a {text-decoration: none}\r
+.navbar a:link {color: white}\r
+.navbar a:visited {color: yellow}\r
+.navbar a:active {color: red}\r
+.navbar a:hover {color: red}\r
+\r
+/*\r
+ul { list-style-type: square; }\r
+ul ul { list-style-type: disc; }\r
+ul ul ul { list-style-type: circle; }\r
+ul ul ul ul { list-style-type: disc; }\r
+li { margin-left: 0.5em; margin-top: 0.5em; }\r
+li li { font-size: 85%; font-style: italic }\r
+li li li { font-size: 85%; font-style: normal }\r
+*/\r
+\r
+div dt\r
+{\r
+  margin-left: 0;\r
+  margin-top: 1em;\r
+  margin-bottom: 0.5em;\r
+  font-weight: bold;\r
+}\r
+div dd\r
+{\r
+  margin-left: 2em;\r
+  margin-bottom: 0.5em;\r
+}\r
+\r
+\r
+/*\r
+p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {\r
+  margin-left: 1em;\r
+  margin-right: 1em;\r
+}\r
+*/\r
+\r
+p.subhead { font-weight: bold; margin-top: 2em; }\r
+\r
+.smaller { font-size: smaller }\r
+.bigger { font-size: 130% }\r
+\r
+/*\r
+td,th { padding: 0.2em }\r
+*/\r
+\r
+ul {\r
+  margin: 0.5em 1.5em 0.5em 1.5em;\r
+  padding: 0;\r
+}\r
+\r
+ol {\r
+  margin: 0.5em 1.5em 0.5em 1.5em;\r
+  padding: 0;\r
+}\r
+\r
+ul { list-style-type: square; }\r
+ul ul { list-style-type: disc; }\r
+ul ul ul { list-style-type: circle; }\r
+ul ul ul ul { list-style-type: disc; }\r
+\r
+/*\r
+ul li {\r
+  list-style: square;\r
+  margin: 0.1em 0em 0.6em 0;\r
+  padding: 0 0 0 0;\r
+  line-height: 140%;\r
+}\r
+\r
+ol li {\r
+  margin: 0.1em 0em 0.6em 1.5em;\r
+  padding: 0 0 0 0px;\r
+  line-height: 140%;\r
+  list-style-type: decimal;\r
+}\r
+\r
+li ul li {\r
+  font-size: 85%;\r
+  font-style: italic;\r
+  list-style-type: disc;\r
+  background: transparent;\r
+  padding: 0 0 0 0;\r
+}\r
+li li ul li {\r
+  font-size: 85%;\r
+  font-style: normal;\r
+  list-style-type: circle;\r
+  background: transparent;\r
+  padding: 0 0 0 0;\r
+}\r
+li li li ul li {\r
+  list-style-type: disc;\r
+  background: transparent;\r
+  padding: 0 0 0 0;\r
+}\r
+\r
+li ol li {\r
+  list-style-type: decimal;\r
+}\r
+\r
+\r
+li li ol li {\r
+  list-style-type: decimal;\r
+}\r
+*/\r
+\r
+/*\r
+ setting class="outline" on ol or ul makes it behave as an\r
+ ouline list where blocklevel content in li elements is\r
+ hidden by default and can be expanded or collapsed with\r
+ mouse click. Set class="expand" on li to override default\r
+*/\r
+\r
+ol.outline li:hover { cursor: pointer }\r
+ol.outline li.nofold:hover { cursor: default }\r
+\r
+ul.outline li:hover { cursor: pointer }\r
+ul.outline li.nofold:hover { cursor: default }\r
+\r
+ol.outline { list-style:decimal; }\r
+ol.outline ol { list-style-type:lower-alpha }\r
+\r
+ol.outline li.nofold {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.unfolded {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.folded {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.unfolded:hover {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;\r
+}\r
+ol.outline li.folded:hover {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;\r
+}\r
+\r
+ul.outline li.nofold {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.unfolded {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.folded {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.unfolded:hover {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;\r
+}\r
+ul.outline li.folded:hover {\r
+  padding: 0 0 0 20px;\r
+  background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;\r
+}\r
+\r
+/* for slides with class "title" in table of contents */\r
+a.titleslide { font-weight: bold; font-style: italic }\r
+\r
+/*\r
+ hide images for work around for save as bug\r
+ where browsers fail to save images used by CSS\r
+*/\r
+img.hidden { display: none; visibility: hidden }\r
+div.initial_prompt { display: none; visibility: hidden }\r
+\r
+  div.slide {\r
+     visibility: visible;\r
+     position: inherit;\r
+  }\r
+  div.handout {\r
+     border-top-style: solid;\r
+     border-top-width: thin;\r
+     border-top-color: black;\r
+  }\r
+\r
+@media screen {\r
+  .hidden { display: none; visibility: visible }\r
+\r
+  div.slide.hidden { display: block; visibility: visible }\r
+  div.handout.hidden { display: block; visibility: visible }\r
+  div.background { display: none; visibility: hidden }\r
+  body.single_slide div.initial_prompt { display: block; visibility: visible }\r
+  body.single_slide div.background { display: block; visibility: visible }\r
+  body.single_slide div.background.hidden { display: none; visibility: hidden }\r
+  body.single_slide .invisible { visibility: hidden }\r
+  body.single_slide .hidden { display: none; visibility: hidden }\r
+  body.single_slide div.slide { position: absolute }\r
+  body.single_slide div.handout { display: none; visibility: hidden }\r
+}\r
+\r
+@media print {\r
+  .hidden { display: block; visibility: visible }\r
+\r
+/*\r
+  div.slide pre { font-size: 60%; padding-left: 0.5em; }\r
+*/\r
+  div.toolbar { display: none; visibility: hidden; }\r
+  div.slidy_toc { display: none; visibility: hidden; }\r
+  div.background { display: none; visibility: hidden; }\r
+  div.slide { page-break-before: always }\r
+  /* :first-child isn't reliable for print media */\r
+  div.slide.first-slide { page-break-before: avoid }\r
+}\r
+\r
+\r
+/* SJR: AsciiDoc slidy backend tweaks */\r
+\r
+ol, ul {\r
+  margin: 0.8em 1.5em 0.8em 1.8em;\r
+}\r
+li > ul, li > ol {\r
+  margin-top: 0.5em;\r
+}\r
+\r
+.outline > li.folded,\r
+.outline > li.unfolded {\r
+  color: #527bbd;\r
+}\r
+ul > li{ color: #aaa; }\r
+ul > li > *, ol > li > * { color: black; }\r
+\r
+li {\r
+  margin-top: 0.5em;\r
+  margin-bottom: 0.5em;\r
+}\r
+\r
+/* jmi hack */\r
+@media screen {\r
+  body.single_slide .invisible { opacity: 0.15; visibility: visible; }\r
+  /*img.invisible { opacity: 0.1; visibility: visible; } */\r
+  img.invisible { visibility: hidden !important }\r
+}\r
+a {text-decoration: underline;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_none">\r
+/* empty color set styles */\r
+</style>\r
+<style type="text/css" title="slidy_color_set_yellow">\r
+/* rainbow color styles */\r
+body { background-color: #ffffaa;}\r
+a:link, a:visited, a:hover, a:active { color: blue; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: black;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: orange;}\r
+em { color: green;}\r
+tt { color: green;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: red;}\r
+div.quoteblock, div.verseblock {  color: black; }\r
+div.admonitionblock { color: red;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_green">\r
+/* blue color styles */\r
+body { background-color: #449900;}\r
+a:link, a:visited, a:hover, a:active { color: fuchsia; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: yellow;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: lime;}\r
+em { color: orange;}\r
+tt { color: orange;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: #44ff00;}\r
+div.quoteblock, div.verseblock {  color: black; }\r
+div.admonitionblock { color: #88ff55;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_blue">\r
+/* blue color styles */\r
+body { background-color: navy;}\r
+a:link, a:visited, a:hover, a:active { color: yellow; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { background-color: navy; color: aqua;}\r
+div.slide h1,h2,h3,h4,h5,h6 { color: aqua;}\r
+em { color: blue;}\r
+tt { color: blue;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: teal;}\r
+div.admonitionblock { color: teal;}\r
+</style>\r
+<style type="text/css" title="slidy_color_set_black">\r
+/* black color set styles */\r
+body { background-color: black !important; }\r
+a:link, a:visited, a:hover, a:active { color: gray; text-decoration: underline }\r
+a:hover { color: red; text-decoration: underline }\r
+div.slide { color: silver !important; }\r
+span, caption, th { color: silver !important; }\r
+div.slide h1,h2,h3,h4,h5,h6 { color: white;}\r
+em, strong { color: #999999;}\r
+tt { color: blue;}\r
+div.sidebarblock, div.literalblock, div.listingblock, div.exampleblock, div.title { color: black; }\r
+div.admonitionblock, div.quoteblock, div.verseblock {  color: white; }\r
+div.cover.slide, div.cover.slide h1 { background-color: black; }\r
+</style>\r
+<style type="text/css">\r
+html body {\r
+       color:#343434;\r
+       font-family:serif;\r
+       font-size:10px;\r
+       margin:0 0;\r
+       padding:0 0 0 0;\r
+ }\r
+/* titres */\r
+       h1, h2, h3, h4, h5, h6 {\r
+               font-family: serif;\r
+        }\r
+       div.slide h1 {\r
+               margin: 0 0 0 0 !important;\r
+        }\r
+       #revnumber {\r
+               font-family: serif;\r
+               font-size:inherit;\r
+               font-weight:bold;\r
+        }\r
+/* sections */\r
+       .article {\r
+        }\r
+       .article > .sect1,\r
+       .article > .sect2,\r
+       .article > .sect3 {\r
+               -moz-box-sizing:border-box;\r
+               -webkit-box-sizing:border-box;\r
+               box-sizing:border-box;\r
+               clear:both;\r
+               display:table;\r
+               float:left;\r
+               margin:0 auto 0 auto;\r
+               padding:0 1em 0 1em;\r
+               width:100%;\r
+        }\r
+       .article > .sect1:last-child {\r
+               margin-bottom:2ex;\r
+        }\r
+       .article > .sect1 * {\r
+               clear:both;\r
+        }\r
+       .article > .refnamediv > *,\r
+       .article > .sect1 > *,\r
+       .article > .refsynopsisdiv > * {\r
+        }\r
+       .article > .sect1 > .sect2 > * {\r
+               margin-left:1em;\r
+        }\r
+       .article > .sect1 > .sect2 > .sect3 > * {\r
+               margin-left:2em;\r
+        }\r
+/* text */\r
+       a:empty {\r
+               margin:0 0 0 0;\r
+               padding:0 0 0 0;\r
+        }\r
+       .article em {\r
+               color:#000080;\r
+        }\r
+       .article .emphasis {\r
+               text-decoration:underline;\r
+        }\r
+       .article p {\r
+               margin:0 0 0 0;\r
+               max-width:34em;\r
+               padding:1ex 0 0 0;\r
+               text-align:justify;\r
+        }\r
+       .article h2 + p {\r
+               margin-top:0;\r
+               padding-top:0.25ex;\r
+        }\r
+       .article h3 + p,\r
+       .article h3 + p[title] {\r
+               margin-top:0;\r
+               padding-top:0;\r
+        }\r
+/* citations */\r
+       .article code,\r
+       .article code.literal {\r
+               background-color:#EEEEEE;\r
+               color:inherit !important;\r
+               font-family:monospace,Courier;\r
+               white-space:pre;\r
+               font-size:90%;\r
+        }\r
+       .article pre {\r
+               /*background-color: #ffffff;*/\r
+               font-family:monospace,Courier;\r
+               line-height:1.3; /* TODO: 1.2 ? */\r
+               color: #000000;\r
+               font-family: monospace;\r
+               line-height: 1.13;\r
+               overflow: auto;\r
+               white-space: pre;\r
+        }\r
+       .article pre.literallayout {\r
+               border-left:1ex solid navy;\r
+               margin-left:0;\r
+               padding-left:1ex;\r
+        }\r
+       .article .screen {\r
+               border-width:0px 0px 0px 5px;\r
+               color:black;\r
+               display:inline-block;\r
+               margin:0.5ex 0 0.5ex 0;\r
+        }\r
+       .article .programlisting {\r
+               color:black;\r
+               margin-left:2em;\r
+               margin-right:2em;\r
+        }\r
+       .article .listitem > .simpara {\r
+               display:inline;\r
+               margin-bottom:0;\r
+        }\r
+/* titles */\r
+       .article > .sect1 > h2 {\r
+               border-bottom:2px solid black;\r
+               /*box-shadow:0px 1px 00px #888888;*/\r
+               color:green;\r
+               font-family:monospace,Arial,sans-serif;\r
+               font-size:120%;\r
+               /*font-variant:small-caps;*/\r
+               line-height:1.2;\r
+               margin:1ex 0 0.5ex 0;\r
+               padding:0 0 0.5ex 0;\r
+        }\r
+       .article > .refnamediv     > h2,\r
+       .article > .refsynopsisdiv > h2 {\r
+               font-variant:small-caps;\r
+        }\r
+       .article > .sect1 > .sect2 > h3 {\r
+               color:DarkGreen;\r
+               font-family:monospace,Arial,sans-serif;\r
+               font-size:100%;\r
+               padding:1.5ex 0 0.5ex 0;\r
+               margin:0 0 0 0;\r
+        }\r
+       .article > .sect1 > h2 + .sect2 > h3 {\r
+               padding-top:0;\r
+        }\r
+       .article > .sect1 > .sect2 > h3:before,\r
+       .article .toc .sect2:before {\r
+               color:black;\r
+               content:"► ";\r
+               font-family:monospace,Arial,sans-serif;\r
+               float:left;\r
+        }\r
+       .article > .sect1 > .sect2 > .sect3 > h4 {\r
+               color:DarkGreen;\r
+               font-family:monospace,Arial,sans-serif;\r
+               font-size:100%;\r
+               padding:1em 0 0 0;\r
+               margin:0 0 0 0;\r
+        }\r
+       .article > .sect1 > .sect2 > .sect3 > h4:before,\r
+       .article .toc .sect3:before {\r
+               color:black;\r
+               content:"►► ";\r
+               font-family:monospace,Arial,sans-serif;\r
+               float:left;\r
+        }\r
+       .article li.listitem > p.simpara:first-child {\r
+               margin-top:0;\r
+        }\r
+       .article p .formalpara-title {\r
+               /* XXX: there is a docbook-xsl bug here:\r
+                * https://lists.oasis-open.org/archives/docbook-apps/201107/msg00003.html\r
+                */\r
+               color:black;\r
+               font-weight:bold;\r
+               line-height:1.4;\r
+               margin:0 0 0 0;\r
+               padding:0 0 0 0;\r
+               text-align:left;\r
+        }\r
+       .article p[title] {\r
+               margin:1ex 0 0 0;\r
+               max-width:none;\r
+               padding:0 0 0 0;\r
+        }\r
+       .article span.citerefentry > span.articletitle {\r
+               white-space:nowrap;\r
+        }\r
+/* lists */\r
+       .article .hdlist p {\r
+               padding:0 0 0 0;\r
+        }\r
+       .article .hdlist td.hdlist1 {\r
+               text-align:right;\r
+               vertical-align:top;\r
+        }\r
+       .article .hdlist td.hdlist1,\r
+       .article .hdlist td.hdlist1 {\r
+               text-align:right;\r
+        }\r
+       .article .hdlist td.hdlist2 {\r
+               text-align:left;\r
+               padding:0 0 0 0;\r
+               vertical-align:middle;\r
+        }\r
+       .article .hdlist td.hdlist2 > .listingblock {\r
+               margin-top: 0;\r
+        }\r
+       .article .hdlist.math td.hdlist1,\r
+       .article .hdlist.math td.hdlist2 {\r
+               vertical-align:middle !important;\r
+        }\r
+       .article .calloutlist p {\r
+               padding:0 0 0 0;\r
+        }\r
+       .article .calloutlist td {\r
+               padding:0 0 0 0;\r
+        }\r
+       .article .calloutlist td p {\r
+        }\r
+       .article .calloutlist td:first-child {\r
+               padding-right:1em;\r
+        }\r
+       .article .calloutlist td:first-child p {\r
+               text-align:right;\r
+        }\r
+       .article .itemizedlist,\r
+       .article .orderedlist {\r
+               padding:0 0 0 0;\r
+               margin:0 0 0 0;\r
+        }\r
+       .article .itemizedlist ul,\r
+       .article .orderedlist  ol {\r
+               padding:0 0 0 0;\r
+               margin:0 0 0 1.5em;\r
+               list-style-position:outside;\r
+        }\r
+       .article .itemizedlist ul li,\r
+       .article .orderedlist  ol li {\r
+               margin:0 0 0 0;\r
+               max-width:51em;\r
+               padding:0 0 0 0;\r
+        }\r
+       .article .dlist {\r
+               padding:0 0 0 0;\r
+               margin:0 0 0 0;\r
+        }\r
+       .article .dlist dl {\r
+               list-style-position:outside;\r
+               margin:0 0 0 0;\r
+               padding:0.5ex 0 0 0;\r
+        }\r
+       .article .dlist dl dt {\r
+               margin:0 0 0 0;\r
+               padding-left:1px;\r
+        }\r
+       .article .dlist dl dd {\r
+               border-left:1px dotted black;\r
+               margin:0.5ex 0 0.5ex 0.9ex;\r
+               max-width:51em;\r
+               padding-left:1.1ex;\r
+               text-align:justify;\r
+        }\r
+       .article .dlist dl dd > p:first-child {\r
+               padding-top:0;\r
+        }\r
+       .article .dlist dl dd > p:last-child {\r
+               padding-bottom:0;\r
+        }\r
+       .article .dlist dt:before,\r
+       .article .toc dt:before {\r
+               color:black;\r
+               content:"▪ ";\r
+               font-family:monospace,Arial,sans-serif;\r
+               float:left;\r
+        }\r
+       .article h2 + .itemizedlist ul,\r
+       .article h2 + .orderedlist  ol,\r
+       .article h2 + .dlist dl {\r
+               padding-top:0;\r
+        }\r
+/* fhs */\r
+       .article a[href^="#fhs:"] {\r
+               white-space:pre;\r
+        }\r
+       .article .toc a[href^="#fhs:"] {\r
+               white-space:normal;\r
+        }\r
+/* sidebar */\r
+       .article .sidebar {\r
+               -moz-box-sizing:border-box;\r
+               -webkit-box-sizing:border-box;\r
+               background:none repeat scroll 0 0 #FFFFEE;\r
+               border:1px solid #C0C0C0;\r
+               box-sizing:border-box;\r
+               clear:both;\r
+               float:left;\r
+               height:96%;\r
+               left:0;\r
+               margin:1em 0 0 1em;\r
+               overflow:auto;\r
+               padding:1ex 1em 1ex 1em;\r
+               position:fixed;\r
+               top:0;\r
+               width:30em;\r
+        }\r
+       .article .sidebar .refnamediv {\r
+               margin:0 0 1ex 0;\r
+        }\r
+       .article .sidebar .refnamediv h2 {\r
+               border-bottom:2px solid black;\r
+               color:green;\r
+               font-family:monospace,Arial,sans-serif;\r
+               font-size:120%;\r
+               font-variant:small-caps;\r
+               border-bottom:0 solid black;\r
+               margin:0 0 0.5ex 0;\r
+               padding:0 0 0 0;\r
+        }\r
+       .article .sidebar .refnamediv p {\r
+               margin:0 0 0 0;\r
+               padding:0 0 0 0;\r
+               text-align:justify;\r
+        }\r
+/* location */\r
+       .article .location {\r
+               margin:0 0 0 0;\r
+        }\r
+       .article .location .location-title {\r
+               display:inline-block;\r
+        }\r
+       .article .location .location-path {\r
+               display:inline-block;\r
+               margin-left:1em;\r
+               margin-bottom:0.5ex;\r
+        }\r
+       .article .location .location-path a {\r
+               display:inline-block;\r
+        }\r
+       .article .location .location-path .dir {\r
+               color:blue;\r
+               font-weight:bold;\r
+        }\r
+       .article .location .location-path .dir .slash {\r
+               color:black;\r
+        }\r
+       .article .location .location-path .file {\r
+               font-weight:bold;\r
+        }\r
+/* language */\r
+       .article .language {\r
+               margin:0 0 0 0;\r
+        }\r
+       .article .language .language-title {\r
+               display:inline-block;\r
+        }\r
+       .article .language .language-list {\r
+               display:inline-block;\r
+               font-weight:bold;\r
+               margin-left:1em;\r
+        }\r
+       .article .language .language-list .lang-available {\r
+               color:blue;\r
+        }\r
+       .article .language .language-list .lang-current {\r
+               color:black;\r
+        }\r
+/* toc */\r
+       .article .toc {\r
+        }\r
+       .article .toc dl {\r
+               clear:left;\r
+               margin-left:0;\r
+               padding-left:0;\r
+        }\r
+       .article .toc dl dd {\r
+               border-left:1px dotted #333;\r
+               margin-bottom:1px;\r
+               margin-left:0.1ex;\r
+               padding-left:1.9ex;\r
+        }\r
+       .article .toc dl dt span.refsynopsisdiv {\r
+        }\r
+       .article .toc .sect1:before {\r
+               color:black;\r
+               content:"§ ";\r
+               font-family:monospace,Arial,sans-serif;\r
+               float:left;\r
+        }\r
+       .article .toc .toc-title,\r
+       .article .language .language-title,\r
+       .article .location .location-title {\r
+               border-bottom:0 solid black;\r
+               color:green;\r
+               font-size:120%;\r
+               font-variant:small-caps;\r
+               font-weight:bold;\r
+               margin-bottom:0.5ex;\r
+        }\r
+       div.slidy_toc,\r
+       body > div.slidy_toc,\r
+       .article div.slidy_toc {\r
+               background: none repeat scroll 0 0 #F0F0F0;\r
+               border-style: solid;\r
+               border-width: 2px;\r
+               font-size: 100%;\r
+               height: 80%;\r
+               left: auto !important;\r
+               bottom:    auto !important;\r
+               right:     0    !important;\r
+               max-width: none !important;\r
+               width: 50% !important;\r
+               overflow: auto;\r
+               padding: 1em;\r
+               position: absolute;\r
+               top: 0;\r
+               z-index: 300;\r
+        }\r
+       .article div.toc-heading {\r
+               border-bottom: 1px solid #B4B4B4;\r
+               font-weight: bold;\r
+               margin-bottom: 1em;\r
+               text-align: center;\r
+               width: 100%;\r
+        }\r
+/* incremental preview */\r
+       body.single_slide .invisible {\r
+               opacity: 0.15;\r
+               visibility: visible;\r
+        }\r
+       img.invisible {\r
+               visibility: hidden !important;\r
+        }\r
+/* image */\r
+       .imageblock img {\r
+               border:1px solid black;\r
+               display:block;\r
+               margin:0 auto 0 auto;\r
+        }\r
+/* splash */\r
+       div.hledgersplash > div.imageblock {\r
+               /*border:black solid 1px;*/\r
+               left:-50%;\r
+               position:relative;\r
+        }\r
+/* vim syntax */\r
+       pre .Error { color: #8080ff; background-color: #ffffff; }\r
+       pre .PreProc { color: #ff6060; text-decoration: underline; font-weight: bold; }\r
+       pre .Special { color: #8080ff; font-weight: bold; }\r
+       pre .Constant { color: #ff40ff; text-decoration: none; }\r
+       pre .Statement { color: #B8860B; font-weight: bold; }\r
+       pre .Identifier { color: #ffff00; text-decoration: underline; }\r
+       pre .Comment { color: #4169e1; font-weight: bold; }\r
+/* vim syntax: hledger */\r
+       pre .hledgerNumberOdd { color: #0000ff; background-color: #e5e5e5; font-weight: bold; }\r
+       pre .hledgerPostingAmountOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }\r
+       pre .hledgerAccountSeparatorOdd { color: #eead0e; background-color: #e5e5e5; font-weight: bold; }\r
+       pre .hledgerPostingAccountOdd { color: #4d4d4d; background-color: #e5e5e5; }\r
+       pre .hledgerNumber { color: #0000ff; background-color: #90ee90; font-weight: bold; }\r
+       pre .hledgerPostingAmount { color: #eead0e; background-color: #90ee90; font-weight: bold; }\r
+       pre .hledgerAccountSeparator { color: #eead0e; background-color: #90ee90; font-weight: bold; }\r
+       pre .hledgerPostingAccount { color: #4d4d4d; background-color: #90ee90; }\r
+       pre .hledgerTagValue { color: #ff0000; }\r
+       pre .hledgerTag { color: #ffa500; font-weight: bold; }\r
+       pre .hledgerTransactionComment { color: #4169e1; font-weight: bold; }\r
+       pre .hledgerTransaction { font-weight: bold; }\r
+       pre .hledgerTransactionDate { background-color: #eedd82; font-weight: bold; }\r
+       pre .hledgerDirective { font-weight: bold; }\r
+       pre .hledgerInclude { font-weight: bold; }\r
+       pre .hledgerComment { color: #4169e1; font-weight: bold; }\r
+</style>\r
+<script type="text/javascript">\r
+/*<![CDATA[*/\r
+/* slidy.js\r
+\r
+   Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.\r
+   W3C liability, trademark, document use and software licensing\r
+   rules apply, see:\r
+\r
+   http://www.w3.org/Consortium/Legal/copyright-documents\r
+   http://www.w3.org/Consortium/Legal/copyright-software\r
+\r
+   Defines single name "w3c_slidy" in global namespace\r
+   Adds event handlers without trampling on any others\r
+\r
+   JMI: Dynamic features added\r
+*/\r
+\r
+// the slidy object implementation\r
+var w3c_slidy = {\r
+  // classify which kind of browser we're running under\r
+  ns_pos: (typeof window.pageYOffset!='undefined'),\r
+  khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false),\r
+  opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false),\r
+  ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false),\r
+  iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false),\r
+  ie: (typeof document.all != "undefined" && !this.opera),\r
+  ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1),\r
+  ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1),\r
+  ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1),\r
+  ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1),\r
+  keyboardless: (this.ipad || this.iphone),\r
+\r
+  // are we running as XHTML? (doesn't work on Opera)\r
+  is_xhtml: /xml/.test(document.contentType),\r
+\r
+  slide_number: 0, // integer slide count: 0, 1, 2, ...\r
+  slide_number_element: null, // element containing slide number\r
+  slides: [], // set to array of slide div's\r
+  notes: [], // set to array of handout div's\r
+  backgrounds: [], // set to array of background div's\r
+  toolbar: null, // element containing toolbar\r
+  title: null, // document title\r
+  last_shown: null, // last incrementally shown item\r
+  eos: null,  // span element for end of slide indicator\r
+  toc: null, // table of contents\r
+  outline: null, // outline element with the focus\r
+  selected_text_len: 0, // length of drag selection on document\r
+  view_all: 0,  // 1 to view all slides + handouts\r
+  want_toolbar: true,  // user preference to show/hide toolbar\r
+  mouse_click_enabled: true, // enables left click for next slide\r
+  scroll_hack: 0, // IE work around for position: fixed\r
+  disable_slide_click: false,  // used by clicked anchors\r
+\r
+  lang: "en", // updated to language specified by html file\r
+\r
+  help_anchor: null, // used for keyboard focus hack in showToolbar()\r
+  help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html",\r
+  help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " +\r
+             "or Pg Up and Pg Dn. Use S and B to change font size.",\r
+// jmi\r
+  help_keymap:\r
+    "PGDN\t: nextSlide\n" +\r
+     "PGUP\t: previousSlide\n" +\r
+     "HOME\t: firstSlide\n" +\r
+     "END  \t: lastSlide\n" +\r
+     "SPACE\t: nextContent\n" +\r
+     "->  \t: nextContent\n" +\r
+     "<-  \t: previousContent\n" +\r
+     "A   \t: toggleAllSlides\n" +\r
+     "F   \t: toggleFooter\n" +\r
+     "K   \t: toggleMouseClick\n" +\r
+     "I   \t: toggleIncremental\n" +\r
+     "L   \t: toggleColorSet\n" +\r
+     "T, C\t: tableOfContents\n" +\r
+     "B   \t: biggerFontSize\n" +\r
+     "S   \t: smallerFontSize\n" +\r
+     "M   \t: key mapping\n",\r
+\r
+  size_index: 0,\r
+  size_adjustment: 0,\r
+  sizes:  new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt",\r
+                    "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"),\r
+\r
+  // needed for efficient resizing\r
+  last_width: 0,\r
+  last_height: 0,\r
+\r
+\r
+  // Needed for cross browser support for relative width/height on\r
+  // object elements. The work around is to save width/height attributes\r
+  // and then to recompute absolute width/height dimensions on resizing\r
+   objects: [],\r
+\r
+//jmi\r
+incremental_display: true,\r
+\r
+  // attach initialiation event handlers\r
+  set_up: function () {\r
+    var init = function() { w3c_slidy.init(); };\r
+    if (typeof window.addEventListener != "undefined")\r
+      window.addEventListener("load", init, false);\r
+    else\r
+      window.attachEvent("onload", init);\r
+  },\r
+\r
+  hide_slides: function () {\r
+    if (document.body && !w3c_slidy.initialized)\r
+      document.body.style.visibility = "hidden";\r
+    else\r
+      setTimeout(w3c_slidy.hide_slides, 50);\r
+  },\r
+\r
+  // hack to persuade IE to compute correct document height\r
+  // as needed for simulating fixed positioning of toolbar\r
+  ie_hack: function () {\r
+    window.resizeBy(0,-1);\r
+    window.resizeBy(0, 1);\r
+  },\r
+\r
+  init: function () {\r
+    //alert("slidy starting test 10");\r
+    document.body.style.visibility = "visible";\r
+    this.init_localization();\r
+    this.add_toolbar();\r
+    this.wrap_implicit_slides();\r
+    this.collect_slides();\r
+    this.collect_notes();\r
+    this.collect_backgrounds();\r
+    this.objects = document.body.getElementsByTagName("object");\r
+    this.patch_anchors();\r
+    this.slide_number = this.find_slide_number(location.href);\r
+    window.offscreenbuffering = true;\r
+    this.size_adjustment = this.find_size_adjust();\r
+    this.time_left = this.find_duration();\r
+    this.hide_image_toolbar();  // suppress IE image toolbar popup\r
+    this.init_outliner();  // activate fold/unfold support\r
+    this.title = document.title;\r
+    // jmi\r
+    this.color_sets = new Array();\r
+    this.init_color_sets();\r
+\r
+    // work around for opera bug\r
+    this.is_xhtml = (document.body.tagName == "BODY" ? false : true);\r
+\r
+    if (this.slides.length > 0)\r
+    {\r
+      var slide = this.slides[this.slide_number];\r
+\r
+      if (this.slide_number > 0)\r
+      {\r
+        this.set_visibility_all_incremental("visible");\r
+        this.last_shown = this.previous_incremental_item(null);\r
+        this.set_eos_status(true);\r
+      }\r
+      else\r
+      {\r
+        this.last_shown = null;\r
+        this.set_visibility_all_incremental("hidden");\r
+        this.set_eos_status(!this.next_incremental_item(this.last_shown));\r
+      }\r
+\r
+      this.set_location();\r
+      this.add_class(this.slides[0], "first-slide");\r
+      w3c_slidy.show_slide(slide);\r
+    }\r
+\r
+    this.toc = this.table_of_contents();\r
+\r
+    this.add_initial_prompt();\r
+\r
+    // bind event handlers without interfering with custom page scripts\r
+    // Tap events behave too weirdly to support clicks reliably on\r
+    // iPhone and iPad, so exclude these from click handler\r
+\r
+    if (!this.keyboardless)\r
+      this.add_listener(document.body, "click", this.mouse_button_click);\r
+\r
+    this.add_listener(document, "keydown", this.key_down);\r
+    this.add_listener(document, "keypress", this.key_press);\r
+    this.add_listener(window, "resize", this.resized);\r
+    this.add_listener(window, "scroll", this.scrolled);\r
+    this.add_listener(window, "unload", this.unloaded);\r
+\r
+    // this seems to be a debugging hack\r
+    //if (!document.body.onclick)\r
+    //  document.body.onclick = function () { };\r
+\r
+    this.single_slide_view();\r
+\r
+    //this.set_location();\r
+\r
+    this.resized();\r
+\r
+    if (this.ie7)\r
+      setTimeout(w3c_slidy.ie_hack, 100);\r
+\r
+    this.show_toolbar();\r
+\r
+    // for back button detection\r
+    setInterval(function () { w3c_slidy.check_location(); }, 200);\r
+    w3c_slidy.initialized = true;\r
+  },\r
+\r
+  // create div element with links to each slide\r
+  table_of_contents: function () {\r
+    var toc = this.create_element("div");\r
+    this.add_class(toc, "slidy_toc hidden");\r
+    //toc.setAttribute("tabindex", "0");\r
+\r
+    var heading = this.create_element("div");\r
+    this.add_class(heading, "toc-heading");\r
+    heading.innerHTML = this.localize("Table of Contents");\r
+\r
+    toc.appendChild(heading);\r
+    var previous = null;\r
+\r
+    for (var i = 0; i < this.slides.length; ++i)\r
+    {\r
+      var title = this.has_class(this.slides[i], "title");\r
+      var num = document.createTextNode((i + 1) + ". ");\r
+\r
+      toc.appendChild(num);\r
+\r
+      var a = this.create_element("a");\r
+      a.setAttribute("href", "#(" + (i+1) + ")");\r
+\r
+      if (title)\r
+        this.add_class(a, "titleslide");\r
+\r
+      var name = document.createTextNode(this.slide_name(i));\r
+      a.appendChild(name);\r
+      a.onclick = w3c_slidy.toc_click;\r
+      a.onkeydown = w3c_slidy.toc_key_down;\r
+      a.previous = previous;\r
+\r
+      if (previous)\r
+        previous.next = a;\r
+\r
+      toc.appendChild(a);\r
+\r
+      if (i == 0)\r
+        toc.first = a;\r
+\r
+      if (i < this.slides.length - 1)\r
+      {\r
+        var br = this.create_element("br");\r
+        toc.appendChild(br);\r
+      }\r
+\r
+      previous = a;\r
+    }\r
+\r
+    toc.focus = function () {\r
+      if (this.first)\r
+        this.first.focus();\r
+    }\r
+\r
+    toc.onmouseup = w3c_slidy.mouse_button_up;\r
+\r
+    toc.onclick = function (e) {\r
+      e||(e=window.event);\r
+\r
+      if (w3c_slidy.selected_text_len <= 0)\r
+         w3c_slidy.hide_table_of_contents(true);\r
+\r
+      w3c_slidy.stop_propagation(e);\r
+\r
+      if (e.cancel != undefined)\r
+        e.cancel = true;\r
+\r
+      if (e.returnValue != undefined)\r
+        e.returnValue = false;\r
+\r
+      return false;\r
+    };\r
+\r
+    document.body.insertBefore(toc, document.body.firstChild);\r
+    return toc;\r
+  },\r
+\r
+  is_shown_toc: function () {\r
+    return !w3c_slidy.has_class(w3c_slidy.toc, "hidden");\r
+  },\r
+\r
+  show_table_of_contents: function () {\r
+    w3c_slidy.remove_class(w3c_slidy.toc, "hidden");\r
+    var toc = w3c_slidy.toc;\r
+    toc.focus();\r
+\r
+    if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0)\r
+      setTimeout(w3c_slidy.ie_hack, 100);\r
+  },\r
+\r
+  hide_table_of_contents: function (focus) {\r
+    w3c_slidy.add_class(w3c_slidy.toc, "hidden");\r
+\r
+    if (focus && !w3c_slidy.opera)\r
+      w3c_slidy.help_anchor.focus();\r
+  },\r
+\r
+  toggle_table_of_contents: function () {\r
+    if (w3c_slidy.is_shown_toc())\r
+      w3c_slidy.hide_table_of_contents(true);\r
+    else\r
+      w3c_slidy.show_table_of_contents();\r
+  },\r
+\r
+  // called on clicking toc entry\r
+  toc_click: function (e) {\r
+    if (!e)\r
+      e = window.event;\r
+\r
+    var target = w3c_slidy.get_target(e);\r
+\r
+    if (target && target.nodeType == 1)\r
+    {\r
+      var uri = target.getAttribute("href");\r
+\r
+      if (uri)\r
+      {\r
+        //alert("going to " + uri);\r
+        var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.hide_slide(slide);\r
+        w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);\r
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.last_shown = null;\r
+        w3c_slidy.set_location();\r
+        w3c_slidy.set_visibility_all_incremental("hidden");\r
+        w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+        w3c_slidy.show_slide(slide);\r
+        //target.focus();\r
+\r
+        try\r
+        {\r
+          if (!w3c_slidy.opera)\r
+            w3c_slidy.help_anchor.focus();\r
+        }\r
+        catch (e)\r
+        {\r
+        }\r
+      }\r
+    }\r
+\r
+    w3c_slidy.hide_table_of_contents(true);\r
+    if (w3c_slidy.ie7) w3c_slidy.ie_hack();\r
+    w3c_slidy.stop_propagation(e);\r
+    return w3c_slidy.cancel(e);\r
+  },\r
+\r
+  // called onkeydown for toc entry\r
+  toc_key_down: function (event) {\r
+    var key;\r
+\r
+    if (!event)\r
+      var event = window.event;\r
+\r
+    // kludge around NS/IE differences\r
+    if (window.event)\r
+      key = window.event.keyCode;\r
+    else if (event.which)\r
+      key = event.which;\r
+    else\r
+      return true; // Yikes! unknown browser\r
+\r
+    // ignore event if key value is zero\r
+    // as for alt on Opera and Konqueror\r
+    if (!key)\r
+      return true;\r
+\r
+    // check for concurrent control/command/alt key\r
+    // but are these only present on mouse events?\r
+\r
+    if (event.ctrlKey || event.altKey)\r
+      return true;\r
+\r
+    if (key == 13)\r
+    {\r
+      var uri = this.getAttribute("href");\r
+\r
+      if (uri)\r
+      {\r
+        //alert("going to " + uri);\r
+       var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.hide_slide(slide);\r
+        w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);\r
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.last_shown = null;\r
+        w3c_slidy.set_location();\r
+        w3c_slidy.set_visibility_all_incremental("hidden");\r
+        w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+        w3c_slidy.show_slide(slide);\r
+        //target.focus();\r
+\r
+        try\r
+        {\r
+          if (!w3c_slidy.opera)\r
+            w3c_slidy.help_anchor.focus();\r
+        }\r
+        catch (e)\r
+        {\r
+        }\r
+      }\r
+\r
+      w3c_slidy.hide_table_of_contents(true);\r
+\r
+      if (self.ie7)\r
+       w3c_slidy.ie_hack();\r
+\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+\r
+    if (key == 40 && this.next)\r
+    {\r
+      this.next.focus();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+\r
+    if (key == 38 && this.previous)\r
+    {\r
+      this.previous.focus();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+\r
+    return true;\r
+  },\r
+\r
+\r
+  // ### OBSOLETE ###\r
+  before_print: function () {\r
+    this.show_all_slides();\r
+    this.hide_toolbar();\r
+    alert("before print");\r
+  },\r
+\r
+  // ### OBSOLETE ###\r
+  after_print: function () {\r
+    if (!this.view_all)\r
+    {\r
+      this.single_slide_view();\r
+      this.show_toolbar();\r
+    }\r
+    alert("after print");\r
+  },\r
+\r
+  // ### OBSOLETE ###\r
+  print_slides: function () {\r
+    this.before_print();\r
+    window.print();\r
+    this.after_print();\r
+  },\r
+\r
+  // ### OBSOLETE ?? ###\r
+  toggle_view: function () {\r
+    if (this.view_all)\r
+    {\r
+      this.single_slide_view();\r
+      this.show_toolbar();\r
+      this.view_all = 0;\r
+    }\r
+    else\r
+    {\r
+      this.show_all_slides();\r
+      this.hide_toolbar();\r
+      this.view_all = 1;\r
+    }\r
+  },\r
+\r
+  // prepare for printing  ### OBSOLETE ###\r
+  show_all_slides: function () {\r
+    this.remove_class(document.body, "single_slide");\r
+    this.set_visibility_all_incremental("visible");\r
+  },\r
+\r
+  // restore after printing  ### OBSOLETE ###\r
+  single_slide_view: function () {\r
+    this.add_class(document.body, "single_slide");\r
+    this.set_visibility_all_incremental("visible");\r
+    this.last_shown = this.previous_incremental_item(null);\r
+  },\r
+\r
+  // suppress IE's image toolbar pop up\r
+  hide_image_toolbar: function () {\r
+    if (!this.ns_pos)\r
+    {\r
+      var images = document.getElementsByTagName("IMG");\r
+\r
+      for (var i = 0; i < images.length; ++i)\r
+        images[i].setAttribute("galleryimg", "no");\r
+    }\r
+  },\r
+\r
+  unloaded: function (e) {\r
+    //alert("unloaded");\r
+  },\r
+\r
+  // Safari and Konqueror don't yet support getComputedStyle()\r
+  // and they always reload page when location.href is updated\r
+  is_KHTML: function () {\r
+    var agent = navigator.userAgent;\r
+    return (agent.indexOf("KHTML") >= 0 ? true : false);\r
+  },\r
+\r
+  // find slide name from first h1 element\r
+  // default to document title + slide number\r
+  slide_name: function (index) {\r
+    var name = null;\r
+    var slide = this.slides[index];\r
+\r
+    var heading = this.find_heading(slide);\r
+\r
+    if (heading)\r
+      name = this.extract_text(heading);\r
+\r
+    if (!name)\r
+      name = this.title + "(" + (index + 1) + ")";\r
+\r
+    name.replace(/\&/g, "&amp;");\r
+    name.replace(/\</g, "&lt;");\r
+    name.replace(/\>/g, "&gt;");\r
+\r
+    return name;\r
+  },\r
+\r
+  // find first h1 element in DOM tree\r
+  find_heading: function (node) {\r
+    if (!node || node.nodeType != 1)\r
+      return null;\r
+\r
+    if (node.nodeName == "H1" || node.nodeName == "h1")\r
+      return node;\r
+\r
+    var child = node.firstChild;\r
+\r
+    while (child)\r
+    {\r
+      node = this.find_heading(child);\r
+\r
+      if (node)\r
+        return node;\r
+\r
+      child = child.nextSibling;\r
+    }\r
+\r
+    return null;\r
+  },\r
+\r
+  // recursively extract text from DOM tree\r
+  extract_text: function (node) {\r
+    if (!node)\r
+      return "";\r
+\r
+    // text nodes\r
+    if (node.nodeType == 3)\r
+      return node.nodeValue;\r
+\r
+    // elements\r
+    if (node.nodeType == 1)\r
+    {\r
+      node = node.firstChild;\r
+      var text = "";\r
+\r
+      while (node)\r
+      {\r
+        text = text + this.extract_text(node);\r
+        node = node.nextSibling;\r
+      }\r
+\r
+      return text;\r
+    }\r
+\r
+    return "";\r
+  },\r
+\r
+  // find copyright text from meta element\r
+  find_copyright: function () {\r
+    var name, content;\r
+    var meta = document.getElementsByTagName("meta");\r
+\r
+    for (var i = 0; i < meta.length; ++i)\r
+    {\r
+      name = meta[i].getAttribute("name");\r
+      content = meta[i].getAttribute("content");\r
+\r
+      if (name == "copyright")\r
+        return content;\r
+    }\r
+\r
+    return null;\r
+  },\r
+\r
+  find_size_adjust: function () {\r
+    var name, content, offset;\r
+    var meta = document.getElementsByTagName("meta");\r
+\r
+    for (var i = 0; i < meta.length; ++i)\r
+    {\r
+      name = meta[i].getAttribute("name");\r
+      content = meta[i].getAttribute("content");\r
+\r
+      if (name == "font-size-adjustment")\r
+        return 1 * content;\r
+    }\r
+\r
+    return 1;\r
+  },\r
+\r
+  // <meta name="duration" content="20" />  for 20 minutes\r
+  find_duration: function () {\r
+    var name, content, offset;\r
+    var meta = document.getElementsByTagName("meta");\r
+\r
+    for (var i = 0; i < meta.length; ++i)\r
+    {\r
+      name = meta[i].getAttribute("name");\r
+      content = meta[i].getAttribute("content");\r
+\r
+      if (name == "duration")\r
+        return 60000 * content;\r
+    }\r
+\r
+    return null;\r
+  },\r
+\r
+  replace_by_non_breaking_space: function (str) {\r
+    for (var i = 0; i < str.length; ++i)\r
+      str[i] = 160;\r
+  },\r
+\r
+  // ### CHECK ME ### is use of "li" okay for text/html?\r
+  // for XHTML do we also need to specify namespace?\r
+  init_outliner: function () {\r
+    var items = document.getElementsByTagName("li");\r
+\r
+    for (var i = 0; i < items.length; ++i)\r
+    {\r
+      var target = items[i];\r
+\r
+      if (!this.has_class(target.parentNode, "outline"))\r
+        continue;\r
+\r
+      target.onclick = this.outline_click;\r
+/* ### more work needed for IE6\r
+      if (!this.ns_pos)\r
+      {\r
+        target.onmouseover = this.hover_outline;\r
+        target.onmouseout = this.unhover_outline;\r
+      }\r
+*/\r
+      if (this.foldable(target))\r
+      {\r
+        target.foldable = true;\r
+        target.onfocus = function () {w3c_slidy.outline = this;};\r
+        target.onblur = function () {w3c_slidy.outline = null;};\r
+\r
+        if (!target.getAttribute("tabindex"))\r
+          target.setAttribute("tabindex", "0");\r
+\r
+        if (this.has_class(target, "expand"))\r
+          this.unfold(target);\r
+        else\r
+          this.fold(target);\r
+      }\r
+      else\r
+      {\r
+        this.add_class(target, "nofold");\r
+        target.visible = true;\r
+        target.foldable = false;\r
+      }\r
+    }\r
+  },\r
+\r
+  foldable: function (item) {\r
+    if (!item || item.nodeType != 1)\r
+      return false;\r
+\r
+    var node = item.firstChild;\r
+\r
+    while (node)\r
+    {\r
+      if (node.nodeType == 1 && this.is_block(node))\r
+        return true;\r
+\r
+      node = node.nextSibling;\r
+    }\r
+\r
+    return false;\r
+  },\r
+\r
+  // ### CHECK ME ### switch to add/remove "hidden" class\r
+  fold: function (item) {\r
+    if (item)\r
+    {\r
+      this.remove_class(item, "unfolded");\r
+      this.add_class(item, "folded");\r
+    }\r
+\r
+    var node = item ? item.firstChild : null;\r
+\r
+    while (node)\r
+    {\r
+      if (node.nodeType == 1 && this.is_block(node)) // element\r
+      {\r
+         w3c_slidy.add_class(node, "hidden");\r
+      }\r
+\r
+      node = node.nextSibling;\r
+    }\r
+\r
+    item.visible = false;\r
+  },\r
+\r
+  // ### CHECK ME ### switch to add/remove "hidden" class\r
+  unfold: function (item) {\r
+    if (item)\r
+    {\r
+      this.add_class(item, "unfolded");\r
+      this.remove_class(item, "folded");\r
+    }\r
+\r
+    var node = item ? item.firstChild : null;\r
+\r
+    while (node)\r
+    {\r
+      if (node.nodeType == 1 && this.is_block(node)) // element\r
+      {\r
+        w3c_slidy.remove_class(node, "hidden");\r
+      }\r
+\r
+      node = node.nextSibling;\r
+    }\r
+\r
+    item.visible = true;\r
+  },\r
+\r
+  outline_click: function (e) {\r
+    if (!e)\r
+      e = window.event;\r
+\r
+    var rightclick = false;\r
+    var target = w3c_slidy.get_target(e);\r
+\r
+    while (target && target.visible == undefined)\r
+      target = target.parentNode;\r
+\r
+    if (!target)\r
+      return true;\r
+\r
+    if (e.which)\r
+      rightclick = (e.which == 3);\r
+    else if (e.button)\r
+      rightclick = (e.button == 2);\r
+\r
+    if (!rightclick && target.visible != undefined)\r
+    {\r
+      if (target.foldable)\r
+      {\r
+        if (target.visible)\r
+          w3c_slidy.fold(target);\r
+        else\r
+          w3c_slidy.unfold(target);\r
+      }\r
+\r
+      w3c_slidy.stop_propagation(e);\r
+      e.cancel = true;\r
+      e.returnValue = false;\r
+    }\r
+\r
+    return false;\r
+  },\r
+\r
+  add_initial_prompt: function () {\r
+    var prompt = this.create_element("div");\r
+    prompt.setAttribute("class", "initial_prompt");\r
+\r
+    var p1 = this.create_element("p");\r
+    prompt.appendChild(p1);\r
+    p1.setAttribute("class", "help");\r
+\r
+    if (this.keyboardless)\r
+      p1.innerHTML = "Tap footer to move to next slide";\r
+    else\r
+      p1.innerHTML = "Space or Right Arrow to move to next " +\r
+                     "slide, M to see keys mapping, click help below for more details";\r
+\r
+    this.add_listener(prompt, "click", function (e) {\r
+      document.body.removeChild(prompt);\r
+      w3c_slidy.stop_propagation(e);\r
+\r
+      if (e.cancel != undefined)\r
+        e.cancel = true;\r
+\r
+      if (e.returnValue != undefined)\r
+        e.returnValue = false;\r
+\r
+      return false;\r
+    });\r
+\r
+    document.body.appendChild(prompt);\r
+    this.initial_prompt = prompt;\r
+    setTimeout(function() {document.body.removeChild(prompt);}, 5000);\r
+  },\r
+\r
+  add_toolbar: function () {\r
+    var counter, page;\r
+\r
+     this.toolbar = this.create_element("div");\r
+     this.toolbar.setAttribute("class", "toolbar");\r
+\r
+     // a reasonably behaved browser\r
+     if (this.ns_pos || !this.ie6)\r
+     {\r
+       var right = this.create_element("div");\r
+       right.setAttribute("style", "float: right; text-align: right");\r
+\r
+       counter = this.create_element("span")\r
+       counter.innerHTML = this.localize("slide") + " n/m";\r
+       right.appendChild(counter);\r
+       this.toolbar.appendChild(right);\r
+\r
+       var left = this.create_element("div");\r
+       left.setAttribute("style", "text-align: left");\r
+\r
+       // global end of slide indicator\r
+       this.eos = this.create_element("span");\r
+       this.eos.innerHTML = "* ";\r
+       left.appendChild(this.eos);\r
+\r
+       var help = this.create_element("a");\r
+       help.setAttribute("href", this.help_page);\r
+       help.setAttribute("title", this.localize(this.help_text));\r
+       help.innerHTML = this.localize("help?");\r
+       left.appendChild(help);\r
+       this.help_anchor = help;  // save for focus hack\r
+\r
+       var gap1 = document.createTextNode(" ");\r
+       left.appendChild(gap1);\r
+\r
+       var contents = this.create_element("a");\r
+       contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()");\r
+       contents.setAttribute("title", this.localize("table of contents"));\r
+       contents.innerHTML = this.localize("contents?");\r
+       left.appendChild(contents);\r
+\r
+       var gap2 = document.createTextNode(" ");\r
+       left.appendChild(gap2);\r
+\r
+       var copyright = this.find_copyright();\r
+\r
+       if (copyright)\r
+       {\r
+         var span = this.create_element("span");\r
+         span.className = "copyright";\r
+         span.innerHTML = copyright;\r
+         left.appendChild(span);\r
+       }\r
+\r
+       this.toolbar.setAttribute("tabindex", "0");\r
+       this.toolbar.appendChild(left);\r
+     }\r
+     else // IE6 so need to work around its poor CSS support\r
+     {\r
+       this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute");\r
+       this.toolbar.style.zIndex = "200";\r
+       this.toolbar.style.width = "99.9%";\r
+       this.toolbar.style.height = "1.2em";\r
+       this.toolbar.style.top = "auto";\r
+       this.toolbar.style.bottom = "0";\r
+       this.toolbar.style.left = "0";\r
+       this.toolbar.style.right = "0";\r
+       this.toolbar.style.textAlign = "left";\r
+       this.toolbar.style.fontSize = "60%";\r
+       this.toolbar.style.color = "red";\r
+       this.toolbar.borderWidth = 0;\r
+       this.toolbar.className = "toolbar";\r
+       this.toolbar.style.background = "rgb(240,240,240)";\r
+\r
+       // would like to have help text left aligned\r
+       // and page counter right aligned, floating\r
+       // div's don't work, so instead use nested\r
+       // absolutely positioned div's.\r
+\r
+       var sp = this.create_element("span");\r
+       sp.innerHTML = "&nbsp;&nbsp;*&nbsp;";\r
+       this.toolbar.appendChild(sp);\r
+       this.eos = sp;  // end of slide indicator\r
+\r
+       var help = this.create_element("a");\r
+       help.setAttribute("href", this.help_page);\r
+       help.setAttribute("title", this.localize(this.help_text));\r
+       help.innerHTML = this.localize("help?");\r
+       this.toolbar.appendChild(help);\r
+       this.help_anchor = help;  // save for focus hack\r
+\r
+       var gap1 = document.createTextNode(" ");\r
+       this.toolbar.appendChild(gap1);\r
+\r
+       var contents = this.create_element("a");\r
+       contents.setAttribute("href", "javascript:toggleTableOfContents()");\r
+       contents.setAttribute("title", this.localize("table of contents".localize));\r
+       contents.innerHTML = this.localize("contents?");\r
+       this.toolbar.appendChild(contents);\r
+\r
+       var gap2 = document.createTextNode(" ");\r
+       this.toolbar.appendChild(gap2);\r
+\r
+       var copyright = this.find_copyright();\r
+\r
+       if (copyright)\r
+       {\r
+         var span = this.create_element("span");\r
+         span.innerHTML = copyright;\r
+         span.style.color = "black";\r
+         span.style.marginLeft = "0.5em";\r
+         this.toolbar.appendChild(span);\r
+       }\r
+\r
+       counter = this.create_element("div")\r
+       counter.style.position = "absolute";\r
+       counter.style.width = "auto"; //"20%";\r
+       counter.style.height = "1.2em";\r
+       counter.style.top = "auto";\r
+       counter.style.bottom = 0;\r
+       counter.style.right = "0";\r
+       counter.style.textAlign = "right";\r
+       counter.style.color = "red";\r
+       counter.style.background = "rgb(240,240,240)";\r
+\r
+       counter.innerHTML = this.localize("slide") + " n/m";\r
+       this.toolbar.appendChild(counter);\r
+     }\r
+\r
+     // ensure that click isn't passed through to the page\r
+     this.toolbar.onclick =\r
+         function (e) {\r
+           if (!e)\r
+             e = window.event;\r
+\r
+           var target = e.target;\r
+\r
+           if (!target && e.srcElement)\r
+             target = e.srcElement;\r
+\r
+           // work around Safari bug\r
+           if (target && target.nodeType == 3)\r
+             target = target.parentNode;\r
+\r
+           w3c_slidy.stop_propagation(e);\r
+\r
+           if (target && target.nodeName.toLowerCase() != "a")\r
+             w3c_slidy.mouse_button_click(e);\r
+         };\r
+\r
+     this.slide_number_element = counter;\r
+     this.set_eos_status(false);\r
+     document.body.appendChild(this.toolbar);\r
+  },\r
+\r
+  // wysiwyg editors make it hard to use div elements\r
+  // e.g. amaya loses the div when you copy and paste\r
+  // this function wraps div elements around implicit\r
+  // slides which start with an h1 element and continue\r
+  // up to the next heading or div element\r
+  wrap_implicit_slides: function () {\r
+    var i, heading, node, next, div;\r
+    var headings = document.getElementsByTagName("h1");\r
+\r
+    if (!headings)\r
+      return;\r
+\r
+    for (i = 0; i < headings.length; ++i)\r
+    {\r
+      heading = headings[i];\r
+\r
+      if (heading.parentNode != document.body)\r
+        continue;\r
+\r
+      node = heading.nextSibling;\r
+\r
+      div = document.createElement("div");\r
+      this.add_class(div, "slide");\r
+      document.body.replaceChild(div, heading);\r
+      div.appendChild(heading);\r
+\r
+      while (node)\r
+      {\r
+        if (node.nodeType == 1 &&    // an element\r
+             (node.nodeName == "H1" ||\r
+              node.nodeName == "h1" ||\r
+              node.nodeName == "DIV" ||\r
+              node.nodeName == "div"))\r
+          break;\r
+\r
+        next = node.nextSibling;\r
+        node = document.body.removeChild(node);\r
+        div.appendChild(node);\r
+        node = next;\r
+      }\r
+    }\r
+  },\r
+\r
+// return new array of all slides\r
+  collect_slides: function () {\r
+    var slides = new Array();\r
+    var divs = document.body.getElementsByTagName("div");\r
+\r
+    for (var i = 0; i < divs.length; ++i)\r
+    {\r
+      div = divs.item(i);\r
+\r
+      if (this.has_class(div, "slide"))\r
+      {\r
+        // add slide to collection\r
+        slides[slides.length] = div;\r
+\r
+        // hide each slide as it is found\r
+        this.add_class(div, "hidden");\r
+\r
+        // add dummy <br/> at end for scrolling hack\r
+        var node1 = document.createElement("br");\r
+        div.appendChild(node1);\r
+        var node2 = document.createElement("br");\r
+        div.appendChild(node2);\r
+      }\r
+      else if (this.has_class(div, "background"))\r
+      {  // work around for Firefox SVG reload bug\r
+        // which otherwise replaces 1st SVG graphic with 2nd\r
+        div.style.display = "block";\r
+      }\r
+    }\r
+\r
+    this.slides = slides;\r
+  },\r
+\r
+  // return new array of all <div class="handout">\r
+  collect_notes: function () {\r
+    var notes = new Array();\r
+    var divs = document.body.getElementsByTagName("div");\r
+\r
+    for (var i = 0; i < divs.length; ++i)\r
+    {\r
+      div = divs.item(i);\r
+\r
+      if (this.has_class(div, "handout"))\r
+      {\r
+        // add note to collection\r
+        notes[notes.length] = div;\r
+\r
+        // and hide it\r
+        this.add_class(div, "hidden");\r
+      }\r
+    }\r
+\r
+    this.notes = notes;\r
+  },\r
+\r
+  // return new array of all <div class="background">\r
+  // including named backgrounds e.g. class="background titlepage"\r
+  collect_backgrounds: function () {\r
+    var backgrounds = new Array();\r
+    var divs = document.body.getElementsByTagName("div");\r
+\r
+    for (var i = 0; i < divs.length; ++i)\r
+    {\r
+      div = divs.item(i);\r
+\r
+      if (this.has_class(div, "background"))\r
+      {\r
+        // add background to collection\r
+        backgrounds[backgrounds.length] = div;\r
+\r
+        // and hide it\r
+        this.add_class(div, "hidden");\r
+      }\r
+    }\r
+\r
+    this.backgrounds = backgrounds;\r
+  },\r
+\r
+  // set click handlers on all anchors\r
+  patch_anchors: function () {\r
+    var self = w3c_slidy;\r
+    var handler = function (event) {\r
+      // compare this.href with location.href\r
+      // for link to another slide in this doc\r
+\r
+      if (self.page_address(this.href) == self.page_address(location.href))\r
+      {\r
+        // yes, so find new slide number\r
+        var newslidenum = self.find_slide_number(this.href);\r
+\r
+        if (newslidenum != self.slide_number)\r
+        {\r
+          var slide = self.slides[self.slide_number];\r
+          self.hide_slide(slide);\r
+          self.slide_number = newslidenum;\r
+          slide = self.slides[self.slide_number];\r
+          self.show_slide(slide);\r
+          self.set_location();\r
+        }\r
+      }\r
+      else\r
+        w3c_slidy.stop_propagation(event);\r
+\r
+//      else if (this.target == null)\r
+//        location.href = this.href;\r
+\r
+      this.blur();\r
+      self.disable_slide_click = true;\r
+    };\r
+\r
+    var anchors = document.body.getElementsByTagName("a");\r
+\r
+    for (var i = 0; i < anchors.length; ++i)\r
+    {\r
+      if (window.addEventListener)\r
+        anchors[i].addEventListener("click", handler, false);\r
+      else\r
+        anchors[i].attachEvent("onclick", handler);\r
+    }\r
+  },\r
+\r
+  // ### CHECK ME ### see which functions are invoked via setTimeout\r
+  // either directly or indirectly for use of w3c_slidy vs this\r
+  show_slide_number: function () {\r
+    var timer = w3c_slidy.get_timer();\r
+    w3c_slidy.slide_number_element.innerHTML = timer + w3c_slidy.localize("slide") + " " +\r
+           (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length;\r
+  },\r
+\r
+  // every 200mS check if the location has been changed as a\r
+  // result of the user activating the Back button/menu item\r
+  // doesn't work for Opera < 9.5\r
+  check_location: function () {\r
+    var hash = location.hash;\r
+\r
+    if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#"))\r
+      w3c_slidy.goto_slide(0);\r
+    else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")")\r
+    {\r
+      var num = parseInt(location.hash.substr(2));\r
+\r
+      if (!isNaN(num))\r
+        w3c_slidy.goto_slide(num-1);\r
+    }\r
+\r
+    if (w3c_slidy.time_left && w3c_slidy.slide_number > 0)\r
+    {\r
+      w3c_slidy.show_slide_number();\r
+\r
+      if (w3c_slidy.time_left > 0)\r
+        w3c_slidy.time_left -= 200;\r
+    }\r
+  },\r
+\r
+  get_timer: function () {\r
+    var timer = "";\r
+    if (w3c_slidy.time_left)\r
+    {\r
+      var mins, secs;\r
+      secs = Math.floor(w3c_slidy.time_left/1000);\r
+      mins = Math.floor(secs / 60);\r
+      secs = secs % 60;\r
+      timer = (mins ? mins+"m" : "") + secs + "s ";\r
+    }\r
+\r
+    return timer;\r
+  },\r
+\r
+  // this doesn't push location onto history stack for IE\r
+  // for which a hidden iframe hack is needed: load page into\r
+  // the iframe with script that set's parent's location.hash\r
+  // but that won't work for standalone use unless we can\r
+  // create the page dynamically via a javascript: URL\r
+  set_location: function () {\r
+     var uri = w3c_slidy.page_address(location.href);\r
+     var hash = "#(" + (w3c_slidy.slide_number+1) + ")";\r
+\r
+     if (w3c_slidy.slide_number >= 0)\r
+       uri = uri + hash;\r
+\r
+     if (w3c_slidy.ie && !w3c_slidy.ie8)\r
+       w3c_slidy.push_hash(hash);\r
+\r
+     if (uri != location.href) // && !khtml\r
+        location.href = uri;\r
+\r
+     if (this.khtml)\r
+        hash = "(" + (w3c_slidy.slide_number+1) + ")";\r
+\r
+     if (!this.ie && location.hash != hash && location.hash != "")\r
+       location.hash = hash;\r
+\r
+     document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";\r
+     w3c_slidy.show_slide_number();\r
+  },\r
+\r
+  page_address: function (uri) {\r
+    var i = uri.indexOf("#");\r
+\r
+    if (i < 0)\r
+      i = uri.indexOf("%23");\r
+\r
+    // check if anchor is entire page\r
+\r
+    if (i < 0)\r
+      return uri;  // yes\r
+\r
+    return uri.substr(0, i);\r
+  },\r
+\r
+  // only used for IE6 and IE7\r
+  on_frame_loaded: function (hash) {\r
+    location.hash = hash;\r
+    var uri = w3c_slidy.page_address(location.href);\r
+    location.href = uri + hash;\r
+  },\r
+\r
+  // history hack with thanks to Bertrand Le Roy\r
+  push_hash: function (hash) {\r
+    if (hash == "") hash = "#(1)";\r
+      window.location.hash = hash;\r
+\r
+    var doc = document.getElementById("historyFrame").contentWindow.document;\r
+  },\r
+\r
+  // find current slide based upon location\r
+  // first find target anchor and then look\r
+  // for associated div element enclosing it\r
+  // finally map that to slide number\r
+  find_slide_number: function (uri) {\r
+    // first get anchor from page location\r
+\r
+    var i = uri.indexOf("#");\r
+\r
+    // check if anchor is entire page\r
+    if (i < 0)\r
+      return 0;  // yes\r
+\r
+    var anchor = unescape(uri.substr(i+1));\r
+\r
+    // now use anchor as XML ID to find target\r
+    var target = document.getElementById(anchor);\r
+\r
+    if (!target)\r
+    {\r
+      // does anchor look like "(2)" for slide 2 ??\r
+      // where first slide is (1)\r
+      var re = /\((\d)+\)/;\r
+\r
+      if (anchor.match(re))\r
+      {\r
+        var num = parseInt(anchor.substring(1, anchor.length-1));\r
+\r
+        if (num > this.slides.length)\r
+          num = 1;\r
+\r
+        if (--num < 0)\r
+          num = 0;\r
+\r
+        return num;\r
+      }\r
+\r
+      // accept [2] for backwards compatibility\r
+      re = /\[(\d)+\]/;\r
+\r
+      if (anchor.match(re))\r
+      {\r
+         var num = parseInt(anchor.substring(1, anchor.length-1));\r
+\r
+         if (num > this.slides.length)\r
+            num = 1;\r
+\r
+         if (--num < 0)\r
+            num = 0;\r
+\r
+         return num;\r
+      }\r
+\r
+      // oh dear unknown anchor\r
+      return 0;\r
+    }\r
+\r
+    // search for enclosing slide\r
+\r
+    while (true)\r
+    {\r
+      // browser coerces html elements to uppercase!\r
+      if (target.nodeName.toLowerCase() == "div" &&\r
+            this.has_class(target, "slide"))\r
+      {\r
+        // found the slide element\r
+        break;\r
+      }\r
+\r
+      // otherwise try parent element if any\r
+\r
+      target = target.parentNode;\r
+\r
+      if (!target)\r
+      {\r
+        return 0;   // no luck!\r
+      }\r
+    };\r
+\r
+    for (i = 0; i < slides.length; ++i)\r
+    {\r
+      if (slides[i] == target)\r
+        return i;  // success\r
+    }\r
+\r
+    // oh dear still no luck\r
+    return 0;\r
+  },\r
+\r
+  previous_slide: function (incremental) {\r
+    if (!w3c_slidy.view_all)\r
+    {\r
+      var slide;\r
+\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {incremental = false;}\r
+\r
+      if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null)\r
+      {\r
+        w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown);\r
+        w3c_slidy.set_eos_status(false);\r
+      }\r
+      else if (w3c_slidy.slide_number > 0)\r
+      {\r
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.hide_slide(slide);\r
+\r
+        w3c_slidy.slide_number = w3c_slidy.slide_number - 1;\r
+        slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+        w3c_slidy.set_visibility_all_incremental("visible");\r
+        w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+        w3c_slidy.set_eos_status(true);\r
+        w3c_slidy.show_slide(slide);\r
+      }\r
+\r
+      w3c_slidy.set_location();\r
+\r
+      if (!w3c_slidy.ns_pos)\r
+        w3c_slidy.refresh_toolbar(200);\r
+    }\r
+  },\r
+\r
+  next_slide: function (incremental) {\r
+    if (!w3c_slidy.view_all)\r
+    {\r
+      var slide, last = w3c_slidy.last_shown;\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {incremental = false;}\r
+\r
+      if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1)\r
+         w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown);\r
+\r
+      if ((!incremental || w3c_slidy.last_shown == null) &&\r
+             w3c_slidy.slide_number < w3c_slidy.slides.length - 1)\r
+      {\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.hide_slide(slide);\r
+\r
+         w3c_slidy.slide_number = w3c_slidy.slide_number + 1;\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.last_shown = null;\r
+         w3c_slidy.set_visibility_all_incremental("hidden");\r
+         w3c_slidy.show_slide(slide);\r
+      }\r
+      else if (!w3c_slidy.last_shown)\r
+      {\r
+         if (last && incremental)\r
+           w3c_slidy.last_shown = last;\r
+      }\r
+\r
+      w3c_slidy.set_location();\r
+\r
+      w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+\r
+      if (!w3c_slidy.ns_pos)\r
+         w3c_slidy.refresh_toolbar(200);\r
+     }\r
+  },\r
+\r
+  // to first slide with nothing revealed\r
+  // i.e. state at start of presentation\r
+  first_slide: function () {\r
+     if (!w3c_slidy.view_all)\r
+     {\r
+       var slide;\r
+\r
+       if (w3c_slidy.slide_number != 0)\r
+       {\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.hide_slide(slide);\r
+\r
+         w3c_slidy.slide_number = 0;\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.last_shown = null;\r
+         w3c_slidy.set_visibility_all_incremental("hidden");\r
+         w3c_slidy.show_slide(slide);\r
+       }\r
+\r
+       w3c_slidy.set_eos_status(\r
+         !w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+       w3c_slidy.set_location();\r
+     }\r
+  },\r
+\r
+  // goto last slide with everything revealed\r
+  // i.e. state at end of presentation\r
+  last_slide: function () {\r
+    if (!w3c_slidy.view_all)\r
+    {\r
+      var slide;\r
+\r
+      w3c_slidy.last_shown = null; //revealNextItem(lastShown);\r
+\r
+      if (w3c_slidy.last_shown == null &&\r
+          w3c_slidy.slide_number < w3c_slidy.slides.length - 1)\r
+      {\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.hide_slide(slide);\r
+         w3c_slidy.slide_number = w3c_slidy.slides.length - 1;\r
+         slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.set_visibility_all_incremental("visible");\r
+         w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+\r
+         w3c_slidy.show_slide(slide);\r
+      }\r
+      else\r
+      {\r
+         w3c_slidy.set_visibility_all_incremental("visible");\r
+         w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);\r
+      }\r
+\r
+      w3c_slidy.set_eos_status(true);\r
+      w3c_slidy.set_location();\r
+    }\r
+  },\r
+\r
+\r
+  // ### check this and consider add/remove class\r
+  set_eos_status: function (state) {\r
+    if (this.eos)\r
+      this.eos.style.color = (state ? "rgb(240,240,240)" : "red");\r
+  },\r
+\r
+  // first slide is 0\r
+  goto_slide: function (num) {\r
+    //alert("going to slide " + (num+1));\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+    w3c_slidy.hide_slide(slide);\r
+    w3c_slidy.slide_number = num;\r
+    slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+    w3c_slidy.last_shown = null;\r
+    w3c_slidy.set_visibility_all_incremental("hidden");\r
+    w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));\r
+    document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";\r
+    w3c_slidy.show_slide(slide);\r
+    w3c_slidy.show_slide_number();\r
+  },\r
+\r
+\r
+  show_slide: function (slide) {\r
+    this.sync_background(slide);\r
+    window.scrollTo(0,0);\r
+    this.remove_class(slide, "hidden");\r
+  },\r
+\r
+  hide_slide: function (slide) {\r
+    this.add_class(slide, "hidden");\r
+  },\r
+\r
+  // show just the backgrounds pertinent to this slide\r
+  // when slide background-color is transparent\r
+  // this should now work with rgba color values\r
+  sync_background: function (slide) {\r
+    var background;\r
+    var bgColor;\r
+\r
+    if (slide.currentStyle)\r
+      bgColor = slide.currentStyle["backgroundColor"];\r
+    else if (document.defaultView)\r
+    {\r
+      var styles = document.defaultView.getComputedStyle(slide,null);\r
+\r
+      if (styles)\r
+        bgColor = styles.getPropertyValue("background-color");\r
+      else // broken implementation probably due Safari or Konqueror\r
+      {\r
+        //alert("defective implementation of getComputedStyle()");\r
+        bgColor = "transparent";\r
+      }\r
+    }\r
+    else\r
+      bgColor == "transparent";\r
+\r
+    if (bgColor == "transparent" ||\r
+        bgColor.indexOf("rgba") >= 0 ||\r
+        bgColor.indexOf("opacity") >= 0)\r
+    {\r
+      var slideClass = this.get_class_list(slide);\r
+\r
+      for (var i = 0; i < this.backgrounds.length; i++)\r
+      {\r
+        background = this.backgrounds[i];\r
+\r
+        var bgClass = this.get_class_list(background);\r
+\r
+        if (this.matching_background(slideClass, bgClass))\r
+          this.remove_class(background, "hidden");\r
+        else\r
+          this.add_class(background, "hidden");\r
+      }\r
+    }\r
+    else // forcibly hide all backgrounds\r
+      this.hide_backgrounds();\r
+  },\r
+\r
+  hide_backgrounds: function () {\r
+    for (var i = 0; i < this.backgrounds.length; i++)\r
+    {\r
+      background = this.backgrounds[i];\r
+      this.add_class(background, "hidden");\r
+    }\r
+  },\r
+\r
+  // compare classes for slide and background\r
+  matching_background: function (slideClass, bgClass) {\r
+    var i, count, pattern, result;\r
+\r
+    // define pattern as regular expression\r
+    pattern = /\w+/g;\r
+\r
+    // check background class names\r
+    result = bgClass.match(pattern);\r
+\r
+    for (i = count = 0; i < result.length; i++)\r
+    {\r
+      if (result[i] == "hidden")\r
+        continue;\r
+\r
+      if (result[i] == "background")\r
+       continue;\r
+\r
+      ++count;\r
+    }\r
+\r
+    if (count == 0)  // default match\r
+      return true;\r
+\r
+    // check for matches and place result in array\r
+    result = slideClass.match(pattern);\r
+\r
+    // now check if desired name is present for background\r
+    for (i = count = 0; i < result.length; i++)\r
+    {\r
+      if (result[i] == "hidden")\r
+        continue;\r
+\r
+      if (this.has_token(bgClass, result[i]))\r
+        return true;\r
+    }\r
+\r
+    return false;\r
+  },\r
+\r
+  resized: function () {\r
+     var width = 0;\r
+\r
+     if ( typeof( window.innerWidth ) == 'number' )\r
+       width = window.innerWidth;  // Non IE browser\r
+     else if (document.documentElement && document.documentElement.clientWidth)\r
+       width = document.documentElement.clientWidth;  // IE6\r
+     else if (document.body && document.body.clientWidth)\r
+       width = document.body.clientWidth; // IE4\r
+\r
+     var height = 0;\r
+\r
+     if ( typeof( window.innerHeight ) == 'number' )\r
+       height = window.innerHeight;  // Non IE browser\r
+     else if (document.documentElement && document.documentElement.clientHeight)\r
+       height = document.documentElement.clientHeight;  // IE6\r
+     else if (document.body && document.body.clientHeight)\r
+       height = document.body.clientHeight; // IE4\r
+\r
+     if (height && (width/height > 1.05*1024/768))\r
+     {\r
+       width = height * 1024.0/768;\r
+     }\r
+\r
+     // IE fires onresize even when only font size is changed!\r
+     // so we do a check to avoid blocking < and > actions\r
+     if (width != w3c_slidy.last_width || height != w3c_slidy.last_height)\r
+     {\r
+       if (width >= 1100)\r
+         w3c_slidy.size_index = 5;    // 4\r
+       else if (width >= 1000)\r
+         w3c_slidy.size_index = 4;    // 3\r
+       else if (width >= 800)\r
+         w3c_slidy.size_index = 3;    // 2\r
+       else if (width >= 600)\r
+         w3c_slidy.size_index = 2;    // 1\r
+       else if (width)\r
+         w3c_slidy.size_index = 0;\r
+\r
+       // add in font size adjustment from meta element e.g.\r
+       // <meta name="font-size-adjustment" content="-2" />\r
+       // useful when slides have too much content ;-)\r
+\r
+       if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment &&\r
+             w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length)\r
+         w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment;\r
+\r
+       // enables cross browser use of relative width/height\r
+       // on object elements for use with SVG and Flash media\r
+       w3c_slidy.adjust_object_dimensions(width, height);\r
+\r
+       if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index])\r
+       {\r
+         document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+       }\r
+\r
+       w3c_slidy.last_width = width;\r
+       w3c_slidy.last_height = height;\r
+\r
+       // force reflow to work around Mozilla bug\r
+       if (w3c_slidy.ns_pos)\r
+       {\r
+         var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+         w3c_slidy.hide_slide(slide);\r
+         w3c_slidy.show_slide(slide);\r
+       }\r
+\r
+       // force correct positioning of toolbar\r
+       w3c_slidy.refresh_toolbar(200);\r
+     }\r
+  },\r
+\r
+  scrolled: function () {\r
+    if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7)\r
+    {\r
+      w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset();\r
+      // hide toolbar\r
+      w3c_slidy.toolbar.style.display = "none";\r
+\r
+      // make it reappear later\r
+      if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all)\r
+      {\r
+        setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000);\r
+        w3c_slidy.scrollhack = 1;\r
+      }\r
+    }\r
+  },\r
+\r
+  hide_toolbar: function () {\r
+    w3c_slidy.add_class(w3c_slidy.toolbar, "hidden");\r
+    window.focus();\r
+  },\r
+\r
+  // used to ensure IE refreshes toolbar in correct position\r
+  refresh_toolbar: function (interval) {\r
+    if (!w3c_slidy.ns_pos && !w3c_slidy.ie7)\r
+    {\r
+      w3c_slidy.hide_toolbar();\r
+      setTimeout(function () {w3c_slidy.show_toolbar(); }, interval);\r
+    }\r
+  },\r
+\r
+  // restores toolbar after short delay\r
+  show_toolbar: function () {\r
+    if (w3c_slidy.want_toolbar)\r
+    {\r
+      w3c_slidy.toolbar.style.display = "block";\r
+\r
+      if (!w3c_slidy.ns_pos)\r
+      {\r
+        // adjust position to allow for scrolling\r
+        var xoffset = w3c_slidy.scroll_x_offset();\r
+        w3c_slidy.toolbar.style.left = xoffset;\r
+        w3c_slidy.toolbar.style.right = xoffset;\r
+\r
+        // determine vertical scroll offset\r
+        //var yoffset = scrollYOffset();\r
+\r
+        // bottom is doc height - window height - scroll offset\r
+        //var bottom = documentHeight() - lastHeight - yoffset\r
+\r
+        //if (yoffset > 0 || documentHeight() > lastHeight)\r
+        //   bottom += 16;  // allow for height of scrollbar\r
+\r
+        w3c_slidy.toolbar.style.bottom = 0; //bottom;\r
+      }\r
+\r
+      w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden");\r
+    }\r
+\r
+    w3c_slidy.scrollhack = 0;\r
+\r
+\r
+    // set the keyboard focus to the help link on the\r
+    // toolbar to ensure that document has the focus\r
+    // IE doesn't always work with window.focus()\r
+    // and this hack has benefit of Enter for help\r
+\r
+    try\r
+    {\r
+      if (!w3c_slidy.opera)\r
+        w3c_slidy.help_anchor.focus();\r
+    }\r
+    catch (e)\r
+    {\r
+    }\r
+  },\r
+\r
+// invoked via F key\r
+  toggle_toolbar: function () {\r
+    if (!w3c_slidy.view_all)\r
+    {\r
+      if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden"))\r
+      {\r
+        w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")\r
+        w3c_slidy.want_toolbar = 1;\r
+      }\r
+      else\r
+      {\r
+        w3c_slidy.add_class(w3c_slidy.toolbar, "hidden")\r
+        w3c_slidy.want_toolbar = 0;\r
+      }\r
+    }\r
+  },\r
+\r
+  scroll_x_offset: function () {\r
+    if (window.pageXOffset)\r
+      return self.pageXOffset;\r
+\r
+    if (document.documentElement &&\r
+             document.documentElement.scrollLeft)\r
+      return document.documentElement.scrollLeft;\r
+\r
+    if (document.body)\r
+      return document.body.scrollLeft;\r
+\r
+    return 0;\r
+  },\r
+\r
+  scroll_y_offset: function () {\r
+    if (window.pageYOffset)\r
+      return self.pageYOffset;\r
+\r
+    if (document.documentElement &&\r
+             document.documentElement.scrollTop)\r
+      return document.documentElement.scrollTop;\r
+\r
+    if (document.body)\r
+      return document.body.scrollTop;\r
+\r
+    return 0;\r
+  },\r
+\r
+  // looking for a way to determine height of slide content\r
+  // the slide itself is set to the height of the window\r
+  optimize_font_size: function () {\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+    //var dh = documentHeight(); //getDocHeight(document);\r
+    var dh = slide.scrollHeight;\r
+    var wh = getWindowHeight();\r
+    var u = 100 * dh / wh;\r
+\r
+    alert("window utilization = " + u + "% (doc "\r
+      + dh + " win " + wh + ")");\r
+  },\r
+\r
+  // from document object\r
+  get_doc_height: function (doc) {\r
+    if (!doc)\r
+      doc = document;\r
+\r
+    if (doc && doc.body && doc.body.offsetHeight)\r
+      return doc.body.offsetHeight;  // ns/gecko syntax\r
+\r
+    if (doc && doc.body && doc.body.scrollHeight)\r
+      return doc.body.scrollHeight;\r
+\r
+    alert("couldn't determine document height");\r
+  },\r
+\r
+  get_window_height: function () {\r
+    if ( typeof( window.innerHeight ) == 'number' )\r
+      return window.innerHeight;  // Non IE browser\r
+\r
+    if (document.documentElement && document.documentElement.clientHeight)\r
+      return document.documentElement.clientHeight;  // IE6\r
+\r
+    if (document.body && document.body.clientHeight)\r
+      return document.body.clientHeight; // IE4\r
+  },\r
+\r
+  document_height: function () {\r
+    var sh, oh;\r
+\r
+    sh = document.body.scrollHeight;\r
+    oh = document.body.offsetHeight;\r
+\r
+    if (sh && oh)\r
+    {\r
+      return (sh > oh ? sh : oh);\r
+    }\r
+\r
+    // no idea!\r
+    return 0;\r
+  },\r
+\r
+  smaller: function () {\r
+    if (w3c_slidy.size_index > 0)\r
+    {\r
+      --w3c_slidy.size_index;\r
+    }\r
+\r
+    w3c_slidy.toolbar.style.display = "none";\r
+    document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+    w3c_slidy.hide_slide(slide);\r
+    w3c_slidy.show_slide(slide);\r
+    setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);\r
+  },\r
+\r
+  bigger: function () {\r
+    if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1)\r
+    {\r
+      ++w3c_slidy.size_index;\r
+    }\r
+\r
+    w3c_slidy.toolbar.style.display = "none";\r
+    document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+    w3c_slidy.hide_slide(slide);\r
+    w3c_slidy.show_slide(slide);\r
+    setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);\r
+  },\r
+\r
+  // enables cross browser use of relative width/height\r
+  // on object elements for use with SVG and Flash media\r
+  // with thanks to Ivan Herman for the suggestion\r
+  adjust_object_dimensions: function (width, height) {\r
+    for( var i = 0; i < w3c_slidy.objects.length; i++ )\r
+    {\r
+      var obj = this.objects[i];\r
+      var mimeType = obj.getAttribute("type");\r
+\r
+      if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash")\r
+      {\r
+        if ( !obj.initialWidth )\r
+          obj.initialWidth = obj.getAttribute("width");\r
+\r
+        if ( !obj.initialHeight )\r
+          obj.initialHeight = obj.getAttribute("height");\r
+\r
+        if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" )\r
+        {\r
+          var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));\r
+          var newW = width * (w/100.0);\r
+          obj.setAttribute("width",newW);\r
+        }\r
+\r
+        if ( obj.initialHeight &&\r
+             obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )\r
+        {\r
+          var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));\r
+          var newH = height * (h/100.0);\r
+          obj.setAttribute("height", newH);\r
+        }\r
+      }\r
+    }\r
+  },\r
+\r
+  // needed for Opera to inhibit default behavior\r
+  // since Opera delivers keyPress even if keyDown\r
+  // was cancelled\r
+  key_press: function (event) {\r
+    if (!event)\r
+      event = window.event;\r
+\r
+    if (!w3c_slidy.key_wanted)\r
+      return w3c_slidy.cancel(event);\r
+\r
+    return true;\r
+  },\r
+\r
+  //  See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes\r
+  key_down: function (event) {\r
+    var key, target, tag;\r
+\r
+    w3c_slidy.key_wanted = true;\r
+\r
+    if (!event)\r
+      event = window.event;\r
+\r
+    // kludge around NS/IE differences\r
+    if (window.event)\r
+    {\r
+      key = window.event.keyCode;\r
+      target = window.event.srcElement;\r
+    }\r
+    else if (event.which)\r
+    {\r
+      key = event.which;\r
+      target = event.target;\r
+    }\r
+    else\r
+      return true; // Yikes! unknown browser\r
+\r
+    // ignore event if key value is zero\r
+    // as for alt on Opera and Konqueror\r
+    if (!key)\r
+       return true;\r
+\r
+    // avoid interfering with keystroke\r
+    // behavior for non-slidy chrome elements\r
+    if (!w3c_slidy.slidy_chrome(target) &&\r
+        w3c_slidy.special_element(target))\r
+      return true;\r
+\r
+    // check for concurrent control/command/alt key\r
+    // but are these only present on mouse events?\r
+\r
+    if (event.ctrlKey || event.altKey || event.metaKey)\r
+       return true;\r
+\r
+    // dismiss table of contents if visible\r
+    if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40)\r
+    {\r
+      w3c_slidy.hide_table_of_contents(true);\r
+\r
+      if (key == 27 || key == 84 || key == 67)\r
+        return w3c_slidy.cancel(event);\r
+    }\r
+\r
+    if (key == 34) // Page Down\r
+    {\r
+      if (w3c_slidy.view_all)\r
+        return true;\r
+\r
+      w3c_slidy.next_slide(false);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 33) // Page Up\r
+    {\r
+      if (w3c_slidy.view_all)\r
+        return true;\r
+\r
+      w3c_slidy.previous_slide(false);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 32) // space bar\r
+    {\r
+      w3c_slidy.next_slide(true);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 37) // Left arrow\r
+    {\r
+      w3c_slidy.previous_slide(!event.shiftKey);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 36) // Home\r
+    {\r
+      w3c_slidy.first_slide();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 35) // End\r
+    {\r
+      w3c_slidy.last_slide();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 39) // Right arrow\r
+    {\r
+      w3c_slidy.next_slide(!event.shiftKey);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 13) // Enter\r
+    {\r
+      if (w3c_slidy.outline)\r
+      {\r
+        if (w3c_slidy.outline.visible)\r
+          w3c_slidy.fold(w3c_slidy.outline);\r
+        else\r
+          w3c_slidy.unfold(w3c_slidy.outline);\r
+\r
+       return w3c_slidy.cancel(event);\r
+      }\r
+    }\r
+    else if (key == 188)  // < for smaller fonts\r
+    {\r
+      w3c_slidy.smaller();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 190)  // > for larger fonts\r
+    {\r
+      w3c_slidy.bigger();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 189 || key == 109)  // - for smaller fonts\r
+    {\r
+      w3c_slidy.smaller();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 187 || key == 191 || key == 107)  // = +  for larger fonts\r
+    {\r
+      w3c_slidy.bigger();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 83)  // S for smaller fonts\r
+    {\r
+      w3c_slidy.smaller();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 66)  // B for larger fonts\r
+    {\r
+      w3c_slidy.bigger();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 90)  // Z for last slide\r
+    {\r
+      w3c_slidy.last_slide();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 70)  // F for toggle toolbar\r
+    {\r
+      w3c_slidy.toggle_toolbar();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 65)  // A for toggle view single/all slides\r
+    {\r
+      w3c_slidy.toggle_view();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 75)  // toggle action of left click for next page\r
+    {\r
+      w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled;\r
+      var alert_msg = (w3c_slidy.mouse_click_enabled ?\r
+                "enabled" : "disabled") +  " mouse click advance";\r
+\r
+      alert(w3c_slidy.localize(alert_msg));\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 84 || key == 67)  // T or C for table of contents\r
+    {\r
+      if (w3c_slidy.toc)\r
+        w3c_slidy.toggle_table_of_contents();\r
+\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 72) // H for help\r
+    {\r
+      window.location = w3c_slidy.help_page;\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+//jmi\r
+    else if (key == 73) // I to toggle incremental display\r
+    {\r
+      var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+      w3c_slidy.hide_slide(slide);\r
+      if (w3c_slidy.incremental_display) { w3c_slidy.set_visibility_all_incremental("visible"); }\r
+      w3c_slidy.incremental_display = !w3c_slidy.incremental_display ;\r
+      w3c_slidy.last_shown = null ;\r
+      w3c_slidy.set_visibility_all_incremental("hidden");\r
+      //this.set_eos_status(true);\r
+      w3c_slidy.show_slide(slide);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 76) // L to toggle color-set\r
+    {\r
+      w3c_slidy.toggle_color_set();\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+    else if (key == 77) // display help_keymap\r
+    {\r
+      alert(w3c_slidy.help_keymap);\r
+      return w3c_slidy.cancel(event);\r
+    }\r
+//jmi end\r
+     //else alert("key code is "+ key);\r
+    return true;\r
+  },\r
+\r
+  // safe for both text/html and application/xhtml+xml\r
+  create_element: function (name) {\r
+    if (this.xhtml && (typeof document.createElementNS != 'undefined'))\r
+      return document.createElementNS("http://www.w3.org/1999/xhtml", name)\r
+\r
+    return document.createElement(name);\r
+  },\r
+\r
+  get_element_style: function (elem, IEStyleProp, CSSStyleProp) {\r
+    if (elem.currentStyle)\r
+    {\r
+      return elem.currentStyle[IEStyleProp];\r
+    }\r
+    else if (window.getComputedStyle)\r
+    {\r
+      var compStyle = window.getComputedStyle(elem, "");\r
+      return compStyle.getPropertyValue(CSSStyleProp);\r
+    }\r
+    return "";\r
+  },\r
+\r
+  // the string str is a whitespace separated list of tokens\r
+  // test if str contains a particular token, e.g. "slide"\r
+  has_token: function (str, token) {\r
+    if (str)\r
+    {\r
+      // define pattern as regular expression\r
+      var pattern = /\w+/g;\r
+\r
+      // check for matches\r
+      // place result in array\r
+      var result = str.match(pattern);\r
+\r
+      // now check if desired token is present\r
+      for (var i = 0; i < result.length; i++)\r
+      {\r
+        if (result[i] == token)\r
+          return true;\r
+      }\r
+    }\r
+\r
+    return false;\r
+  },\r
+\r
+  get_class_list: function (element) {\r
+    if (typeof element.className != 'undefined')\r
+      return element.className;\r
+\r
+    return element.getAttribute("class");\r
+  },\r
+\r
+  has_class: function (element, name) {\r
+    if (element.nodeType != 1)\r
+      return false;\r
+\r
+    var regexp = new RegExp("(^| )" + name + "\W*");\r
+\r
+    if (typeof element.className != 'undefined')\r
+      return regexp.test(element.className);\r
+\r
+    return regexp.test(element.getAttribute("class"));\r
+  },\r
+\r
+  remove_class: function (element, name) {\r
+    var regexp = new RegExp("(^| )" + name + "\W*");\r
+    var clsval = "";\r
+\r
+    if (typeof element.className != 'undefined')\r
+    {\r
+      clsval = element.className;\r
+\r
+      if (clsval)\r
+      {\r
+        clsval = clsval.replace(regexp, "");\r
+        element.className = clsval;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      clsval = element.getAttribute("class");\r
+\r
+      if (clsval)\r
+      {\r
+        clsval = clsval.replace(regexp, "");\r
+        element.setAttribute("class", clsval);\r
+      }\r
+    }\r
+  },\r
+\r
+  add_class: function (element, name) {\r
+    if (!this.has_class(element, name))\r
+    {\r
+      if (typeof element.className != 'undefined')\r
+        element.className += " " + name;\r
+      else\r
+      {\r
+        var clsval = element.getAttribute("class");\r
+        clsval = clsval ? clsval + " " + name : name;\r
+        element.setAttribute("class", clsval);\r
+      }\r
+    }\r
+  },\r
+\r
+  // HTML elements that can be used with class="incremental"\r
+  // note that you can also put the class on containers like\r
+  // up, ol, dl, and div to make their contents appear\r
+  // incrementally. Upper case is used since this is what\r
+  // browsers report for HTML node names (text/html).\r
+  incremental_elements: null,\r
+  okay_for_incremental: function (name) {\r
+    if (!this.incremental_elements)\r
+    {\r
+      var inclist = new Array();\r
+      inclist["p"] = true;\r
+      inclist["pre"] = true;\r
+      inclist["li"] = true;\r
+      inclist["blockquote"] = true;\r
+      inclist["dt"] = true;\r
+      inclist["dd"] = true;\r
+      inclist["h2"] = true;\r
+      inclist["h3"] = true;\r
+      inclist["h4"] = true;\r
+      inclist["h5"] = true;\r
+      inclist["h6"] = true;\r
+      inclist["span"] = true;\r
+      inclist["address"] = true;\r
+      inclist["table"] = true;\r
+      inclist["tr"] = true;\r
+      inclist["th"] = true;\r
+      inclist["td"] = true;\r
+      inclist["img"] = true;\r
+      inclist["object"] = true;\r
+      this.incremental_elements = inclist;\r
+    }\r
+    return this.incremental_elements[name.toLowerCase()];\r
+  },\r
+\r
+  next_incremental_item: function (node) {\r
+    var br = this.is_xhtml ? "br" : "BR";\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+    for (;;)\r
+    {\r
+      node = w3c_slidy.next_node(slide, node);\r
+\r
+      if (node == null || node.parentNode == null)\r
+        break;\r
+\r
+      if (node.nodeType == 1)  // ELEMENT\r
+      {\r
+        if (node.nodeName == br)\r
+          continue;\r
+\r
+        if (w3c_slidy.has_class(node, "incremental")\r
+             && w3c_slidy.okay_for_incremental(node.nodeName))\r
+          return node;\r
+\r
+        if (w3c_slidy.has_class(node.parentNode, "incremental")\r
+             && !w3c_slidy.has_class(node, "non-incremental"))\r
+          return node;\r
+      }\r
+    }\r
+\r
+    return node;\r
+  },\r
+\r
+  previous_incremental_item: function (node) {\r
+    var br = this.is_xhtml ? "br" : "BR";\r
+    var slide = w3c_slidy.slides[w3c_slidy.slide_number];\r
+\r
+    for (;;)\r
+    {\r
+      node = w3c_slidy.previous_node(slide, node);\r
+\r
+      if (node == null || node.parentNode == null)\r
+        break;\r
+\r
+      if (node.nodeType == 1)\r
+      {\r
+        if (node.nodeName == br)\r
+          continue;\r
+\r
+        if (w3c_slidy.has_class(node, "incremental")\r
+             && w3c_slidy.okay_for_incremental(node.nodeName))\r
+          return node;\r
+\r
+        if (w3c_slidy.has_class(node.parentNode, "incremental")\r
+             && !w3c_slidy.has_class(node, "non-incremental"))\r
+          return node;\r
+      }\r
+    }\r
+\r
+    return node;\r
+  },\r
+\r
+  // set visibility for all elements on current slide with\r
+  // a parent element with attribute class="incremental"\r
+  set_visibility_all_incremental: function (value) {\r
+    var node = this.next_incremental_item(null);\r
+\r
+//jmi\r
+if (!w3c_slidy.incremental_display) {value = "visible";}\r
+\r
+    if (value == "hidden")\r
+    {\r
+      while (node)\r
+      {\r
+        w3c_slidy.add_class(node, "invisible");\r
+        node = w3c_slidy.next_incremental_item(node);\r
+      }\r
+    }\r
+    else // value == "visible"\r
+    {\r
+      while (node)\r
+      {\r
+        w3c_slidy.remove_class(node, "invisible");\r
+        node = w3c_slidy.next_incremental_item(node);\r
+      }\r
+    }\r
+  },\r
+\r
+  // reveal the next hidden item on the slide\r
+  // node is null or the node that was last revealed\r
+  reveal_next_item: function (node) {\r
+    node = w3c_slidy.next_incremental_item(node);\r
+\r
+    if (node && node.nodeType == 1)  // an element\r
+      w3c_slidy.remove_class(node, "invisible");\r
+\r
+    return node;\r
+  },\r
+\r
+  // exact inverse of revealNextItem(node)\r
+  hide_previous_item: function (node) {\r
+    if (node && node.nodeType == 1)  // an element\r
+      w3c_slidy.add_class(node, "invisible");\r
+\r
+    return this.previous_incremental_item(node);\r
+  },\r
+\r
+  // left to right traversal of root's content\r
+  next_node: function (root, node) {\r
+    if (node == null)\r
+      return root.firstChild;\r
+\r
+    if (node.firstChild)\r
+      return node.firstChild;\r
+\r
+    if (node.nextSibling)\r
+      return node.nextSibling;\r
+\r
+    for (;;)\r
+    {\r
+      node = node.parentNode;\r
+\r
+      if (!node || node == root)\r
+        break;\r
+\r
+      if (node && node.nextSibling)\r
+        return node.nextSibling;\r
+    }\r
+\r
+    return null;\r
+  },\r
+\r
+  // right to left traversal of root's content\r
+  previous_node: function (root, node) {\r
+    if (node == null)\r
+    {\r
+      node = root.lastChild;\r
+\r
+      if (node)\r
+      {\r
+        while (node.lastChild)\r
+          node = node.lastChild;\r
+      }\r
+\r
+      return node;\r
+    }\r
+\r
+    if (node.previousSibling)\r
+    {\r
+      node = node.previousSibling;\r
+\r
+      while (node.lastChild)\r
+        node = node.lastChild;\r
+\r
+      return node;\r
+    }\r
+\r
+    if (node.parentNode != root)\r
+      return node.parentNode;\r
+\r
+    return null;\r
+  },\r
+\r
+  previous_sibling_element: function (el) {\r
+    el = el.previousSibling;\r
+\r
+    while (el && el.nodeType != 1)\r
+      el = el.previousSibling;\r
+\r
+    return el;\r
+  },\r
+\r
+  next_sibling_element: function (el) {\r
+    el = el.nextSibling;\r
+\r
+    while (el && el.nodeType != 1)\r
+      el = el.nextSibling;\r
+\r
+    return el;\r
+  },\r
+\r
+  first_child_element: function (el) {\r
+    var node;\r
+\r
+    for (node = el.firstChild; node; node = node.nextSibling)\r
+    {\r
+      if (node.nodeType == 1)\r
+        break;\r
+    }\r
+\r
+    return node;\r
+  },\r
+\r
+  first_tag: function (element, tag) {\r
+    var node;\r
+\r
+    if (!this.is_xhtml)\r
+      tag = tag.toUpperCase();\r
+\r
+    for (node = element.firstChild; node; node = node.nextSibling)\r
+    {\r
+      if (node.nodeType == 1 && node.nodeName == tag)\r
+        break;\r
+    }\r
+\r
+    return node;\r
+  },\r
+\r
+  hide_selection: function () {\r
+    if (window.getSelection) // Firefox, Chromium, Safari, Opera\r
+    {\r
+      var selection = window.getSelection();\r
+\r
+      if (selection.rangeCount > 0)\r
+      {\r
+        var range = selection.getRangeAt(0);\r
+        range.collapse (false);\r
+      }\r
+    }\r
+    else // Internet Explorer\r
+    {\r
+      var textRange = document.selection.createRange ();\r
+      textRange.collapse (false);\r
+    }\r
+  },\r
+\r
+  get_selected_text: function () {\r
+    try\r
+    {\r
+      if (window.getSelection)\r
+        return window.getSelection().toString();\r
+\r
+      if (document.getSelection)\r
+        return document.getSelection().toString();\r
+\r
+      if (document.selection)\r
+        return document.selection.createRange().text;\r
+    }\r
+    catch (e)\r
+    {\r
+    }\r
+\r
+    return "";\r
+  },\r
+\r
+  // make note of length of selected text\r
+  // as this evaluates to zero in click event\r
+  mouse_button_up: function (e) {\r
+    w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length;\r
+  },\r
+\r
+  // right mouse button click is reserved for context menus\r
+  // it is more reliable to detect rightclick than leftclick\r
+  mouse_button_click: function (e) {\r
+    var rightclick = false;\r
+    var leftclick = false;\r
+    var middleclick = false;\r
+    var target;\r
+\r
+    if (!e)\r
+      var e = window.event;\r
+\r
+    if (e.target)\r
+      target = e.target;\r
+    else if (e.srcElement)\r
+      target = e.srcElement;\r
+\r
+    // work around Safari bug\r
+    if (target.nodeType == 3)\r
+      target = target.parentNode;\r
+\r
+    if (e.which) // all browsers except IE\r
+    {\r
+      leftclick = (e.which == 1);\r
+      middleclick = (e.which == 2);\r
+      rightclick = (e.which == 3);\r
+    }\r
+    else if (e.button)\r
+    {\r
+      // Konqueror gives 1 for left, 4 for middle\r
+      // IE6 gives 0 for left and not 1 as I expected\r
+\r
+      if (e.button == 4)\r
+        middleclick = true;\r
+\r
+      // all browsers agree on 2 for right button\r
+      rightclick = (e.button == 2);\r
+    }\r
+    else\r
+      leftclick = true;\r
+\r
+    if (w3c_slidy.selected_text_len > 0)\r
+    {\r
+      w3c_slidy.stop_propagation(e);\r
+      e.cancel = true;\r
+      e.returnValue = false;\r
+      return false;\r
+    }\r
+\r
+    // dismiss table of contents\r
+    w3c_slidy.hide_table_of_contents(false);\r
+\r
+    // check if target is something that probably want's clicks\r
+    // e.g. a, embed, object, input, textarea, select, option\r
+    var tag = target.nodeName.toLowerCase();\r
+\r
+    if (w3c_slidy.mouse_click_enabled && leftclick &&\r
+        !w3c_slidy.special_element(target) &&\r
+        !target.onclick)\r
+    {\r
+      w3c_slidy.next_slide(true);\r
+      w3c_slidy.stop_propagation(e);\r
+      e.cancel = true;\r
+      e.returnValue = false;\r
+      return false;\r
+    }\r
+\r
+    return true;\r
+  },\r
+\r
+  special_element: function (e) {\r
+    var tag = e.nodeName.toLowerCase();\r
+\r
+    return e.onkeydown ||\r
+      e.onclick ||\r
+      tag == "a" ||\r
+      tag == "embed" ||\r
+      tag == "object" ||\r
+      tag == "video" ||\r
+      tag == "audio" ||\r
+      tag == "input" ||\r
+      tag == "textarea" ||\r
+      tag == "select" ||\r
+      tag == "option";\r
+  },\r
+\r
+  slidy_chrome: function (el) {\r
+    while (el)\r
+    {\r
+      if (el == w3c_slidy.toc ||\r
+          el == w3c_slidy.toolbar ||\r
+          w3c_slidy.has_class(el, "outline"))\r
+        return true;\r
+\r
+      el = el.parentNode;\r
+    }\r
+\r
+    return false;\r
+  },\r
+\r
+  get_key: function (e)\r
+  {\r
+    var key;\r
+\r
+    // kludge around NS/IE differences\r
+    if (typeof window.event != "undefined")\r
+      key = window.event.keyCode;\r
+    else if (e.which)\r
+      key = e.which;\r
+\r
+    return key;\r
+  },\r
+\r
+  get_target: function (e) {\r
+    var target;\r
+\r
+    if (!e)\r
+      e = window.event;\r
+\r
+    if (e.target)\r
+      target = e.target;\r
+    else if (e.srcElement)\r
+      target = e.srcElement;\r
+\r
+    if (target.nodeType != 1)\r
+      target = target.parentNode;\r
+\r
+    return target;\r
+  },\r
+\r
+  // does display property provide correct defaults?\r
+  is_block: function (elem) {\r
+    var tag = elem.nodeName.toLowerCase();\r
+\r
+    return tag == "ol" || tag == "ul" || tag == "p" ||\r
+           tag == "li" || tag == "table" || tag == "pre" ||\r
+           tag == "h1" || tag == "h2" || tag == "h3" ||\r
+           tag == "h4" || tag == "h5" || tag == "h6" ||\r
+           tag == "blockquote" || tag == "address";\r
+  },\r
+\r
+  add_listener: function (element, event, handler) {\r
+    if (window.addEventListener)\r
+      element.addEventListener(event, handler, false);\r
+    else\r
+      element.attachEvent("on"+event, handler);\r
+  },\r
+\r
+  // used to prevent event propagation from field controls\r
+  stop_propagation: function (event) {\r
+    event = event ? event : window.event;\r
+    event.cancelBubble = true;  // for IE\r
+\r
+    if (event.stopPropagation)\r
+      event.stopPropagation();\r
+\r
+    return true;\r
+  },\r
+\r
+  cancel: function (event) {\r
+    if (event)\r
+    {\r
+       event.cancel = true;\r
+       event.returnValue = false;\r
+\r
+      if (event.preventDefault)\r
+        event.preventDefault();\r
+    }\r
+\r
+    w3c_slidy.key_wanted = false;\r
+    return false;\r
+  },\r
+// jmi\r
+  init_color_sets: function(){\r
+   if (this.color_sets.length == 0){\r
+     // initialize color_sets array\r
+     var tmp = document.styleSheets;\r
+     var j = 0;\r
+     for (var i=0;i<tmp.length;i++) {\r
+       var css_name = null ;\r
+       if (tmp[i].title) {\r
+       css_name = tmp[i].title ;\r
+       }\r
+       if ((tmp[i].href) && (tmp[i].href.indexOf('.css') != -1)) {\r
+       css_name = tmp[i].href.substring(tmp[i].href.lastIndexOf('/')+1,tmp[i].href.indexOf('.css')) ;\r
+       }\r
+       if ((css_name) && (css_name.indexOf('color_set') > 0)) {\r
+         this.color_sets[j] = tmp[i];\r
+         this.color_sets[j++].disabled = true;\r
+       }\r
+     }\r
+     if (this.color_sets.length > 0){ this.color_sets[0].disabled = false; }\r
+   }\r
+  },\r
+  toggle_color_set: function(){\r
+   // toggle to the next color_set\r
+   if (this.color_sets.length > 0){\r
+    var i = 0;\r
+    while ((i < this.color_sets.length) && (this.color_sets[i].disabled == true)) { i = i + 1 ; }\r
+    if (i == this.color_sets.length) { i = i - 1; }\r
+    this.color_sets[i].disabled = true ;\r
+    this.color_sets[(i + 1) % (this.color_sets.length)].disabled = false ;\r
+   }\r
+  },\r
+\r
+// for each language define an associative array\r
+// and also the help text which is longer\r
+\r
+  strings_es: {\r
+    "slide":"pág.",\r
+    "help?":"Ayuda",\r
+    "contents?":"Índice",\r
+    "table of contents":"tabla de contenidos",\r
+    "Table of Contents":"Tabla de Contenidos",\r
+    "restart presentation":"Reiniciar presentación",\r
+    "restart?":"Inicio"\r
+  },\r
+  help_es:\r
+    "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " +\r
+    "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.",\r
+\r
+  strings_ca: {\r
+    "slide":"pàg..",\r
+    "help?":"Ajuda",\r
+    "contents?":"Índex",\r
+    "table of contents":"taula de continguts",\r
+    "Table of Contents":"Taula de Continguts",\r
+    "restart presentation":"Reiniciar presentació",\r
+    "restart?":"Inici"\r
+  },\r
+  help_ca:\r
+    "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " +\r
+    "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.",\r
+\r
+  strings_cs: {\r
+    "slide":"snímek",\r
+    "help?":"nápověda",\r
+    "contents?":"obsah",\r
+    "table of contents":"obsah prezentace",\r
+    "Table of Contents":"Obsah prezentace",\r
+    "restart presentation":"znovu spustit prezentaci",\r
+    "restart?":"restart"\r
+  },\r
+  help_cs:\r
+    "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " +\r
+    "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " +\r
+    "dá zvětšit a zmenšit pomocí kláves B a S.",\r
+\r
+  strings_nl: {\r
+    "slide":"pagina",\r
+    "help?":"Help?",\r
+    "contents?":"Inhoud?",\r
+    "table of contents":"inhoudsopgave",\r
+    "Table of Contents":"Inhoudsopgave",\r
+    "restart presentation":"herstart presentatie",\r
+    "restart?":"Herstart?"\r
+  },\r
+  help_nl:\r
+     "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " +\r
+     "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.",\r
+\r
+  strings_de: {\r
+    "slide":"Seite",\r
+    "help?":"Hilfe",\r
+    "contents?":"Übersicht",\r
+    "table of contents":"Inhaltsverzeichnis",\r
+    "Table of Contents":"Inhaltsverzeichnis",\r
+    "restart presentation":"Präsentation neu starten",\r
+    "restart?":"Neustart"\r
+  },\r
+  help_de:\r
+    "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " +\r
+    "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.",\r
+\r
+  strings_pl: {\r
+    "slide":"slajd",\r
+    "help?":"pomoc?",\r
+    "contents?":"spis treści?",\r
+    "table of contents":"spis treści",\r
+    "Table of Contents":"Spis Treści",\r
+    "restart presentation":"Restartuj prezentację",\r
+    "restart?":"restart?"\r
+  },\r
+  help_pl:\r
+    "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" +\r
+    "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.",\r
+\r
+  strings_fr: {\r
+    "slide":"page",\r
+    "help?":"Aide",\r
+    "contents?":"Index",\r
+    "table of contents":"table des matières",\r
+    "Table of Contents":"Table des matières",\r
+    "restart presentation":"Recommencer l'exposé",\r
+    "restart?":"Début"\r
+  },\r
+  help_fr:\r
+    "Naviguez avec la souris, la barre d'espace, les flèches " +\r
+    "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " +\r
+    "les touches S et B pour modifier la taille de la police, M pour l'association des touches.",\r
+\r
+  strings_hu: {\r
+    "slide":"oldal",\r
+    "help?":"segítség",\r
+    "contents?":"tartalom",\r
+    "table of contents":"tartalomjegyzék",\r
+    "Table of Contents":"Tartalomjegyzék",\r
+    "restart presentation":"bemutató újraindítása",\r
+    "restart?":"újraindítás"\r
+  },\r
+  help_hu:\r
+    "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " +\r
+    "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " +\r
+    "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " +\r
+    "a szöveg méretét.",\r
+\r
+  strings_it: {\r
+    "slide":"pag.",\r
+    "help?":"Aiuto",\r
+    "contents?":"Indice",\r
+    "table of contents":"indice",\r
+    "Table of Contents":"Indice",\r
+    "restart presentation":"Ricominciare la presentazione",\r
+    "restart?":"Inizio"\r
+  },\r
+  help_it:\r
+    "Navigare con mouse, barra spazio, frecce sinistra/destra o " +\r
+    "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.",\r
+\r
+  strings_el: {\r
+    "slide":"σελίδα",\r
+    "help?":"βοήθεια;",\r
+    "contents?":"περιεχόμενα;",\r
+    "table of contents":"πίνακας περιεχομένων",\r
+    "Table of Contents":"Πίνακας Περιεχομένων",\r
+    "restart presentation":"επανεκκίνηση παρουσίασης",\r
+    "restart?":"επανεκκίνηση;"\r
+  },\r
+  help_el:\r
+    "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " +\r
+    "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " +\r
+    "το μέγεθος της γραμματοσειράς.",\r
+\r
+  strings_ja: {\r
+    "slide":"スライド",\r
+    "help?":"ヘルプ",\r
+    "contents?":"目次",\r
+    "table of contents":"目次を表示",\r
+    "Table of Contents":"目次",\r
+    "restart presentation":"最初から再生",\r
+    "restart?":"最初から"\r
+  },\r
+  help_ja:\r
+     "マウス左クリック ・ スペース ・ 左右キー " +\r
+     "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更",\r
+\r
+  strings_zh: {\r
+    "slide":"幻灯片",\r
+    "help?":"帮助?",\r
+    "contents?":"内容?",\r
+    "table of contents":"目录",\r
+    "Table of Contents":"目录",\r
+    "restart presentation":"重新启动展示",\r
+    "restart?":"重新启动?"\r
+  },\r
+  help_zh:\r
+    "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " +\r
+    "用 S, B 改变字体大小.",\r
+\r
+  strings_ru: {\r
+    "slide":"слайд",\r
+    "help?":"помощь?",\r
+    "contents?":"содержание?",\r
+    "table of contents":"оглавление",\r
+    "Table of Contents":"Оглавление",\r
+    "restart presentation":"перезапустить презентацию",\r
+    "restart?":"перезапуск?"\r
+  },\r
+  help_ru:\r
+    "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" +\r
+    "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.",\r
+\r
+  strings_sv: {\r
+    "slide":"sida",\r
+    "help?":"hjälp",\r
+    "contents?":"innehåll",\r
+    "table of contents":"innehållsförteckning",\r
+    "Table of Contents":"Innehållsförteckning",\r
+    "restart presentation":"visa presentationen från början",\r
+    "restart?":"börja om"\r
+  },\r
+  help_sv:\r
+    "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " +\r
+    "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " +\r
+    "Använd tangenterna S och B för att ändra textens storlek.",\r
+\r
+  strings: { },\r
+\r
+  localize: function (src) {\r
+    if (src == "")\r
+      return src;\r
+\r
+     // try full language code, e.g. en-US\r
+     var s, lookup = w3c_slidy.strings[w3c_slidy.lang];\r
+\r
+     if (lookup)\r
+     {\r
+       s = lookup[src];\r
+\r
+       if (s)\r
+        return s;\r
+     }\r
+\r
+     // strip country code suffix, e.g.\r
+     // try en if undefined for en-US\r
+     var lg = w3c_slidy.lang.split("-");\r
+\r
+     if (lg.length > 1)\r
+     {\r
+       lookup = w3c_slidy.strings[lg[0]];\r
+\r
+       if (lookup)\r
+       {\r
+         s = lookup[src];\r
+\r
+         if (s)\r
+          return s;\r
+       }\r
+     }\r
+\r
+     // otherwise string as is\r
+     return src;\r
+  },\r
+\r
+  init_localization: function () {\r
+    var i18n = w3c_slidy;\r
+    var help_text = w3c_slidy.help_text;\r
+\r
+    // each such language array is declared in the localize array\r
+    // this is used as in  w3c_slidy.localize("foo");\r
+    this.strings = {\r
+      "es":this.strings_es,\r
+      "ca":this.strings_ca,\r
+      "cs":this.strings_cs,\r
+      "nl":this.strings_nl,\r
+      "de":this.strings_de,\r
+      "pl":this.strings_pl,\r
+      "fr":this.strings_fr,\r
+      "hu":this.strings_hu,\r
+      "it":this.strings_it,\r
+      "el":this.strings_el,\r
+      "jp":this.strings_ja,\r
+      "zh":this.strings_zh,\r
+      "ru":this.strings_ru,\r
+      "sv":this.strings_sv\r
+    },\r
+\r
+    i18n.strings_es[help_text] = i18n.help_es;\r
+    i18n.strings_ca[help_text] = i18n.help_ca;\r
+    i18n.strings_cs[help_text] = i18n.help_cs;\r
+    i18n.strings_nl[help_text] = i18n.help_nl;\r
+    i18n.strings_de[help_text] = i18n.help_de;\r
+    i18n.strings_pl[help_text] = i18n.help_pl;\r
+    i18n.strings_fr[help_text] = i18n.help_fr;\r
+    i18n.strings_hu[help_text] = i18n.help_hu;\r
+    i18n.strings_it[help_text] = i18n.help_it;\r
+    i18n.strings_el[help_text] = i18n.help_el;\r
+    i18n.strings_ja[help_text] = i18n.help_ja;\r
+    i18n.strings_zh[help_text] = i18n.help_zh;\r
+    i18n.strings_ru[help_text] = i18n.help_ru;\r
+    i18n.strings_sv[help_text] = i18n.help_sv;\r
+\r
+    w3c_slidy.lang = document.body.parentNode.getAttribute("lang");\r
+\r
+    if (!w3c_slidy.lang)\r
+      w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang");\r
+\r
+    if (!w3c_slidy.lang)\r
+      w3c_slidy.lang = "en";\r
+  }\r
+};\r
+\r
+// hack for back button behavior\r
+if (w3c_slidy.ie6 || w3c_slidy.ie7)\r
+{\r
+  document.write("<iframe id='historyFrame' " +\r
+  "src='javascript:\"<html"+"></"+"html>\"' " +\r
+  "height='1' width='1' " +\r
+  "style='position:absolute;left:-800px'></iframe>");\r
+}\r
+\r
+// attach event listeners for initialization\r
+w3c_slidy.set_up();\r
+\r
+// hide the slides as soon as body element is available\r
+// to reduce annoying screen mess before the onload event\r
+setTimeout(w3c_slidy.hide_slides, 50);\r
+\r
+/*]]>*/\r
+</script>\r
+<script type="text/javascript">\r
+/*<![CDATA[*/\r
+/*\r
+LaTeXMathML.js\r
+==============\r
+\r
+This file, in this form, is due to Douglas Woodall, June 2006.\r
+It contains JavaScript functions to convert (most simple) LaTeX\r
+math notation to Presentation MathML.  It was obtained by\r
+downloading the file ASCIIMathML.js from\r
+       http://www1.chapman.edu/~jipsen/mathml/asciimathdownload/\r
+and modifying it so that it carries out ONLY those conversions\r
+that would be carried out in LaTeX.  A description of the original\r
+file, with examples, can be found at\r
+       www1.chapman.edu/~jipsen/mathml/asciimath.html\r
+       ASCIIMathML: Math on the web for everyone\r
+\r
+Here is the header notice from the original file:\r
+\r
+ASCIIMathML.js\r
+==============\r
+This file contains JavaScript functions to convert ASCII math notation\r
+to Presentation MathML. The conversion is done while the (X)HTML page\r
+loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet\r
+Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).\r
+Just add the next line to your (X)HTML page with this file in the same folder:\r
+(script type="text/javascript" src="ASCIIMathML.js")(/script)\r
+This is a convenient and inexpensive solution for authoring MathML.\r
+\r
+Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen\r
+Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js\r
+For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt\r
+If you use it on a webpage, please send the URL to jipsen@chapman.edu\r
+\r
+This program is free software; you can redistribute it and/or modify\r
+it under the terms of the GNU General Public License as published by\r
+the Free Software Foundation; either version 2 of the License, or (at\r
+your option) any later version.\r
+\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+General Public License (at http://www.gnu.org/copyleft/gpl.html)\r
+for more details.\r
+\r
+LaTeXMathML.js (ctd)\r
+==============\r
+\r
+The instructions for use are the same as for the original\r
+ASCIIMathML.js, except that of course the line you add to your\r
+file should be\r
+(script type="text/javascript" src="LaTeXMathML.js")(/script)\r
+Or use absolute path names if the file is not in the same folder\r
+as your (X)HTML page.\r
+*/\r
+\r
+var checkForMathML = true;   // check if browser can display MathML\r
+var notifyIfNoMathML = true; // display note if no MathML capability\r
+var alertIfNoMathML = false;  // show alert box if no MathML capability\r
+// was "red":\r
+var mathcolor = "";         // change it to "" (to inherit) or any other color\r
+// was "serif":\r
+var mathfontfamily = "";      // change to "" to inherit (works in IE)\r
+                              // or another family (e.g. "arial")\r
+var showasciiformulaonhover = true; // helps students learn ASCIIMath\r
+/*\r
+// Commented out by DRW -- not now used -- see DELIMITERS (twice) near the end\r
+var displaystyle = false;     // puts limits above and below large operators\r
+var decimalsign = ".";        // change to "," if you like, beware of `(1,2)`!\r
+var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters\r
+var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";\r
+var doubleblankmathdelimiter = false; // if true,  x+1  is equal to `x+1`\r
+                                      // for IE this works only in <!--   -->\r
+//var separatetokens;// has been removed (email me if this is a problem)\r
+*/\r
+var isIE = document.createElementNS==null;\r
+\r
+if (document.getElementById==null)\r
+  alert("This webpage requires a recent browser such as \nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")\r
+\r
+// all further global variables start with "AM"\r
+\r
+function AMcreateElementXHTML(t) {\r
+  if (isIE) return document.createElement(t);\r
+  else return document.createElementNS("http://www.w3.org/1999/xhtml",t);\r
+}\r
+\r
+function AMnoMathMLNote() {\r
+  var nd = AMcreateElementXHTML("h3");\r
+  nd.setAttribute("align","center")\r
+  nd.appendChild(AMcreateElementXHTML("p"));\r
+  nd.appendChild(document.createTextNode("To view the "));\r
+  var an = AMcreateElementXHTML("a");\r
+  an.appendChild(document.createTextNode("LaTeXMathML"));\r
+  an.setAttribute("href","http://www.maths.nott.ac.uk/personal/drw/lm.html");\r
+  nd.appendChild(an);\r
+  nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+"));\r
+  an = AMcreateElementXHTML("a");\r
+  an.appendChild(document.createTextNode("MathPlayer"));\r
+  an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");\r
+  nd.appendChild(an);\r
+  nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));\r
+  nd.appendChild(AMcreateElementXHTML("p"));\r
+  return nd;\r
+}\r
+\r
+function AMisMathMLavailable() {\r
+  if (navigator.appName.slice(0,8)=="Netscape")\r
+    if (navigator.appVersion.slice(0,1)>="5") return null;\r
+    else return AMnoMathMLNote();\r
+  else if (navigator.appName.slice(0,9)=="Microsoft")\r
+    try {\r
+        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");\r
+        return null;\r
+    } catch (e) {\r
+        return AMnoMathMLNote();\r
+    }\r
+  else return AMnoMathMLNote();\r
+}\r
+\r
+// character lists for Mozilla/Netscape fonts\r
+var AMcal = ["\uD835\uDC9C", "\uD835\uDC9D", "\uD835\uDC9E", "\uD835\uDC9F", "\uD835\uDCA0", "\uD835\uDCA1", "\uD835\uDCA2", "\uD835\uDCA3", "\uD835\uDCA4", "\uD835\uDCA5", "\uD835\uDCA6", "\uD835\uDCA7", "\uD835\uDCA8", "\uD835\uDCA9", "\uD835\uDCAA", "\uD835\uDCAB", "\uD835\uDCAC", "\uD835\uDCAD", "\uD835\uDCAE", "\uD835\uDCAF", "\uD835\uDCB0", "\uD835\uDCB1", "\uD835\uDCB2", "\uD835\uDCB3", "\uD835\uDCB4", "\uD835\uDCB5"];\r
+var AMfrk = ["\uD835\uDD04", "\uD835\uDD05", "\uD835\uDD06", "\uD835\uDD07", "\uD835\uDD08", "\uD835\uDD09", "\uD835\uDD0A", "\uD835\uDD0B", "\uD835\uDD0C", "\uD835\uDD0D", "\uD835\uDD0E", "\uD835\uDD0F", "\uD835\uDD10", "\uD835\uDD11", "\uD835\uDD12", "\uD835\uDD13", "\uD835\uDD14", "\uD835\uDD15", "\uD835\uDD16", "\uD835\uDD17", "\uD835\uDD18", "\uD835\uDD19", "\uD835\uDD1A", "\uD835\uDD1B", "\uD835\uDD1C", "\uD835\uDD1D"];\r
+var AMbbb = ["\uD835\uDD38", "\uD835\uDD39", "\uD835\uDD3A", "\uD835\uDD3B", "\uD835\uDD3C", "\uD835\uDD3D", "\uD835\uDD3E", "\uD835\uDD3F", "\uD835\uDD40", "\uD835\uDD41", "\uD835\uDD42", "\uD835\uDD43", "\uD835\uDD44", "\uD835\uDD45", "\uD835\uDD46", "\uD835\uDD47", "\uD835\uDD48", "\uD835\uDD49", "\uD835\uDD4A", "\uD835\uDD4B", "\uD835\uDD4C", "\uD835\uDD4D", "\uD835\uDD4E", "\uD835\uDD4F", "\uD835\uDD50", "\uD835\uDD51"];\r
+\r
+var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,\r
+    RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,\r
+    TEXT = 9, BIG = 10, LONG = 11, STRETCHY = 12, MATRIX = 13; // token types\r
+\r
+var AMsqrt = {input:"\\sqrt",  tag:"msqrt", output:"sqrt",     ttype:UNARY},\r
+  AMnot = {input:"\\not",      tag:"mnot", output:"not",       ttype:UNARY},\r
+  AMroot = {input:"\\root",    tag:"mroot", output:"root",     ttype:BINARY},\r
+  AMfrac = {input:"\\frac",    tag:"mfrac", output:"/",        ttype:BINARY},\r
+  AMover = {input:"\\stackrel", tag:"mover", output:"stackrel", ttype:BINARY},\r
+  AMatop = {input:"\\atop",    tag:"mfrac", output:"",         ttype:INFIX},\r
+  AMchoose = {input:"\\choose", tag:"mfrac", output:"",                ttype:INFIX},\r
+  AMsub  = {input:"_",         tag:"msub",  output:"_",        ttype:INFIX},\r
+  AMsup  = {input:"^",         tag:"msup",  output:"^",        ttype:INFIX},\r
+  AMtext = {input:"\\mathrm",  tag:"mtext", output:"text",     ttype:TEXT},\r
+  AMmbox = {input:"\\mbox",    tag:"mtext", output:"mbox",     ttype:TEXT};\r
+\r
+// Commented out by DRW to prevent 1/2 turning into a 2-line fraction\r
+// AMdiv   = {input:"/",        tag:"mfrac", output:"/",    ttype:INFIX},\r
+// Commented out by DRW so that " prints literally in equations\r
+// AMquote = {input:"\"",       tag:"mtext", output:"mbox", ttype:TEXT};\r
+\r
+// List of negations obtained from http://frodo.elon.edu/tutorial/tutorial.pdf\r
+var AMRelationNegations = {\r
+  "\u003C":"\u226E", "\u003E":"\u226F", "\u2264":"\u2270", "\u2265":"\u2271",\r
+  "\u003D":"\u2260", "\u2261":"\u2262", "\u227A":"\u2280", "\u227B":"\u2281",\r
+  "\u227C":"\u22E0", "\u227D":"\u22E1", "\u223C":"\u2241", "\u2243":"\u2244",\r
+  "\u2282":"\u2284", "\u2283":"\u2285", "\u2286":"\u2288", "\u2287":"\u2289",\r
+  "\u2248":"\u2249", "\u2245":"\u2247", "\u2291":"\u22E2", "\u2292":"\u22E3",\r
+  "\u224D":"\u226D"\r
+}\r
+\r
+var AMsymbols = [\r
+//Greek letters\r
+{input:"\\alpha",      tag:"mi", output:"\u03B1", ttype:CONST},\r
+{input:"\\beta",       tag:"mi", output:"\u03B2", ttype:CONST},\r
+{input:"\\gamma",      tag:"mi", output:"\u03B3", ttype:CONST},\r
+{input:"\\delta",      tag:"mi", output:"\u03B4", ttype:CONST},\r
+{input:"\\epsilon",    tag:"mi", output:"\u03B5", ttype:CONST},\r
+{input:"\\varepsilon",  tag:"mi", output:"\u025B", ttype:CONST},\r
+{input:"\\zeta",       tag:"mi", output:"\u03B6", ttype:CONST},\r
+{input:"\\eta",                tag:"mi", output:"\u03B7", ttype:CONST},\r
+{input:"\\theta",      tag:"mi", output:"\u03B8", ttype:CONST},\r
+{input:"\\vartheta",   tag:"mi", output:"\u03D1", ttype:CONST},\r
+{input:"\\iota",       tag:"mi", output:"\u03B9", ttype:CONST},\r
+{input:"\\kappa",      tag:"mi", output:"\u03BA", ttype:CONST},\r
+{input:"\\lambda",     tag:"mi", output:"\u03BB", ttype:CONST},\r
+{input:"\\mu",         tag:"mi", output:"\u03BC", ttype:CONST},\r
+{input:"\\nu",         tag:"mi", output:"\u03BD", ttype:CONST},\r
+{input:"\\xi",         tag:"mi", output:"\u03BE", ttype:CONST},\r
+{input:"\\pi",         tag:"mi", output:"\u03C0", ttype:CONST},\r
+{input:"\\varpi",      tag:"mi", output:"\u03D6", ttype:CONST},\r
+{input:"\\rho",                tag:"mi", output:"\u03C1", ttype:CONST},\r
+{input:"\\varrho",     tag:"mi", output:"\u03F1", ttype:CONST},\r
+{input:"\\varsigma",   tag:"mi", output:"\u03C2", ttype:CONST},\r
+{input:"\\sigma",      tag:"mi", output:"\u03C3", ttype:CONST},\r
+{input:"\\tau",                tag:"mi", output:"\u03C4", ttype:CONST},\r
+{input:"\\upsilon",    tag:"mi", output:"\u03C5", ttype:CONST},\r
+{input:"\\phi",                tag:"mi", output:"\u03C6", ttype:CONST},\r
+{input:"\\varphi",     tag:"mi", output:"\u03D5", ttype:CONST},\r
+{input:"\\chi",                tag:"mi", output:"\u03C7", ttype:CONST},\r
+{input:"\\psi",                tag:"mi", output:"\u03C8", ttype:CONST},\r
+{input:"\\omega",      tag:"mi", output:"\u03C9", ttype:CONST},\r
+{input:"\\Gamma",      tag:"mo", output:"\u0393", ttype:CONST},\r
+{input:"\\Delta",      tag:"mo", output:"\u0394", ttype:CONST},\r
+{input:"\\Theta",      tag:"mo", output:"\u0398", ttype:CONST},\r
+{input:"\\Lambda",     tag:"mo", output:"\u039B", ttype:CONST},\r
+{input:"\\Xi",         tag:"mo", output:"\u039E", ttype:CONST},\r
+{input:"\\Pi",         tag:"mo", output:"\u03A0", ttype:CONST},\r
+{input:"\\Sigma",      tag:"mo", output:"\u03A3", ttype:CONST},\r
+{input:"\\Upsilon",    tag:"mo", output:"\u03A5", ttype:CONST},\r
+{input:"\\Phi",                tag:"mo", output:"\u03A6", ttype:CONST},\r
+{input:"\\Psi",                tag:"mo", output:"\u03A8", ttype:CONST},\r
+{input:"\\Omega",      tag:"mo", output:"\u03A9", ttype:CONST},\r
+\r
+//fractions\r
+{input:"\\frac12",     tag:"mo", output:"\u00BD", ttype:CONST},\r
+{input:"\\frac14",     tag:"mo", output:"\u00BC", ttype:CONST},\r
+{input:"\\frac34",     tag:"mo", output:"\u00BE", ttype:CONST},\r
+{input:"\\frac13",     tag:"mo", output:"\u2153", ttype:CONST},\r
+{input:"\\frac23",     tag:"mo", output:"\u2154", ttype:CONST},\r
+{input:"\\frac15",     tag:"mo", output:"\u2155", ttype:CONST},\r
+{input:"\\frac25",     tag:"mo", output:"\u2156", ttype:CONST},\r
+{input:"\\frac35",     tag:"mo", output:"\u2157", ttype:CONST},\r
+{input:"\\frac45",     tag:"mo", output:"\u2158", ttype:CONST},\r
+{input:"\\frac16",     tag:"mo", output:"\u2159", ttype:CONST},\r
+{input:"\\frac56",     tag:"mo", output:"\u215A", ttype:CONST},\r
+{input:"\\frac18",     tag:"mo", output:"\u215B", ttype:CONST},\r
+{input:"\\frac38",     tag:"mo", output:"\u215C", ttype:CONST},\r
+{input:"\\frac58",     tag:"mo", output:"\u215D", ttype:CONST},\r
+{input:"\\frac78",     tag:"mo", output:"\u215E", ttype:CONST},\r
+\r
+//binary operation symbols\r
+{input:"\\pm",         tag:"mo", output:"\u00B1", ttype:CONST},\r
+{input:"\\mp",         tag:"mo", output:"\u2213", ttype:CONST},\r
+{input:"\\triangleleft",tag:"mo", output:"\u22B2", ttype:CONST},\r
+{input:"\\triangleright",tag:"mo",output:"\u22B3", ttype:CONST},\r
+{input:"\\cdot",       tag:"mo", output:"\u22C5", ttype:CONST},\r
+{input:"\\star",       tag:"mo", output:"\u22C6", ttype:CONST},\r
+{input:"\\ast",                tag:"mo", output:"\u002A", ttype:CONST},\r
+{input:"\\times",      tag:"mo", output:"\u00D7", ttype:CONST},\r
+{input:"\\div",                tag:"mo", output:"\u00F7", ttype:CONST},\r
+{input:"\\circ",       tag:"mo", output:"\u2218", ttype:CONST},\r
+//{input:"\\bullet",     tag:"mo", output:"\u2219", ttype:CONST},\r
+{input:"\\bullet",     tag:"mo", output:"\u2022", ttype:CONST},\r
+{input:"\\oplus",      tag:"mo", output:"\u2295", ttype:CONST},\r
+{input:"\\ominus",     tag:"mo", output:"\u2296", ttype:CONST},\r
+{input:"\\otimes",     tag:"mo", output:"\u2297", ttype:CONST},\r
+{input:"\\bigcirc",    tag:"mo", output:"\u25CB", ttype:CONST},\r
+{input:"\\oslash",     tag:"mo", output:"\u2298", ttype:CONST},\r
+{input:"\\odot",       tag:"mo", output:"\u2299", ttype:CONST},\r
+{input:"\\land",       tag:"mo", output:"\u2227", ttype:CONST},\r
+{input:"\\wedge",      tag:"mo", output:"\u2227", ttype:CONST},\r
+{input:"\\lor",                tag:"mo", output:"\u2228", ttype:CONST},\r
+{input:"\\vee",                tag:"mo", output:"\u2228", ttype:CONST},\r
+{input:"\\cap",                tag:"mo", output:"\u2229", ttype:CONST},\r
+{input:"\\cup",                tag:"mo", output:"\u222A", ttype:CONST},\r
+{input:"\\sqcap",      tag:"mo", output:"\u2293", ttype:CONST},\r
+{input:"\\sqcup",      tag:"mo", output:"\u2294", ttype:CONST},\r
+{input:"\\uplus",      tag:"mo", output:"\u228E", ttype:CONST},\r
+{input:"\\amalg",      tag:"mo", output:"\u2210", ttype:CONST},\r
+{input:"\\bigtriangleup",tag:"mo",output:"\u25B3", ttype:CONST},\r
+{input:"\\bigtriangledown",tag:"mo",output:"\u25BD", ttype:CONST},\r
+{input:"\\dag",                tag:"mo", output:"\u2020", ttype:CONST},\r
+{input:"\\dagger",     tag:"mo", output:"\u2020", ttype:CONST},\r
+{input:"\\ddag",       tag:"mo", output:"\u2021", ttype:CONST},\r
+{input:"\\ddagger",    tag:"mo", output:"\u2021", ttype:CONST},\r
+{input:"\\lhd",                tag:"mo", output:"\u22B2", ttype:CONST},\r
+{input:"\\rhd",                tag:"mo", output:"\u22B3", ttype:CONST},\r
+{input:"\\unlhd",      tag:"mo", output:"\u22B4", ttype:CONST},\r
+{input:"\\unrhd",      tag:"mo", output:"\u22B5", ttype:CONST},\r
+\r
+\r
+//BIG Operators\r
+{input:"\\sum",                tag:"mo", output:"\u2211", ttype:UNDEROVER},\r
+{input:"\\prod",       tag:"mo", output:"\u220F", ttype:UNDEROVER},\r
+{input:"\\bigcap",     tag:"mo", output:"\u22C2", ttype:UNDEROVER},\r
+{input:"\\bigcup",     tag:"mo", output:"\u22C3", ttype:UNDEROVER},\r
+{input:"\\bigwedge",   tag:"mo", output:"\u22C0", ttype:UNDEROVER},\r
+{input:"\\bigvee",     tag:"mo", output:"\u22C1", ttype:UNDEROVER},\r
+{input:"\\bigsqcap",   tag:"mo", output:"\u2A05", ttype:UNDEROVER},\r
+{input:"\\bigsqcup",   tag:"mo", output:"\u2A06", ttype:UNDEROVER},\r
+{input:"\\coprod",     tag:"mo", output:"\u2210", ttype:UNDEROVER},\r
+{input:"\\bigoplus",   tag:"mo", output:"\u2A01", ttype:UNDEROVER},\r
+{input:"\\bigotimes",  tag:"mo", output:"\u2A02", ttype:UNDEROVER},\r
+{input:"\\bigodot",    tag:"mo", output:"\u2A00", ttype:UNDEROVER},\r
+{input:"\\biguplus",   tag:"mo", output:"\u2A04", ttype:UNDEROVER},\r
+{input:"\\int",                tag:"mo", output:"\u222B", ttype:CONST},\r
+{input:"\\oint",       tag:"mo", output:"\u222E", ttype:CONST},\r
+\r
+//binary relation symbols\r
+{input:":=",           tag:"mo", output:":=",     ttype:CONST},\r
+{input:"\\lt",         tag:"mo", output:"<",      ttype:CONST},\r
+{input:"\\gt",         tag:"mo", output:">",      ttype:CONST},\r
+{input:"\\ne",         tag:"mo", output:"\u2260", ttype:CONST},\r
+{input:"\\neq",                tag:"mo", output:"\u2260", ttype:CONST},\r
+{input:"\\le",         tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\leq",                tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\leqslant",   tag:"mo", output:"\u2264", ttype:CONST},\r
+{input:"\\ge",         tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\geq",                tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\geqslant",   tag:"mo", output:"\u2265", ttype:CONST},\r
+{input:"\\equiv",      tag:"mo", output:"\u2261", ttype:CONST},\r
+{input:"\\ll",         tag:"mo", output:"\u226A", ttype:CONST},\r
+{input:"\\gg",         tag:"mo", output:"\u226B", ttype:CONST},\r
+{input:"\\doteq",      tag:"mo", output:"\u2250", ttype:CONST},\r
+{input:"\\prec",       tag:"mo", output:"\u227A", ttype:CONST},\r
+{input:"\\succ",       tag:"mo", output:"\u227B", ttype:CONST},\r
+{input:"\\preceq",     tag:"mo", output:"\u227C", ttype:CONST},\r
+{input:"\\succeq",     tag:"mo", output:"\u227D", ttype:CONST},\r
+{input:"\\subset",     tag:"mo", output:"\u2282", ttype:CONST},\r
+{input:"\\supset",     tag:"mo", output:"\u2283", ttype:CONST},\r
+{input:"\\subseteq",   tag:"mo", output:"\u2286", ttype:CONST},\r
+{input:"\\supseteq",   tag:"mo", output:"\u2287", ttype:CONST},\r
+{input:"\\subsetneq",  tag:"mo", output:"\u228A", ttype:CONST},\r
+{input:"\\supsetneq",  tag:"mo", output:"\u228B", ttype:CONST},\r
+{input:"\\sqsubset",   tag:"mo", output:"\u228F", ttype:CONST},\r
+{input:"\\sqsupset",   tag:"mo", output:"\u2290", ttype:CONST},\r
+{input:"\\sqsubseteq",  tag:"mo", output:"\u2291", ttype:CONST},\r
+{input:"\\sqsupseteq",  tag:"mo", output:"\u2292", ttype:CONST},\r
+{input:"\\sim",                tag:"mo", output:"\u223C", ttype:CONST},\r
+{input:"\\simeq",      tag:"mo", output:"\u2243", ttype:CONST},\r
+{input:"\\approx",     tag:"mo", output:"\u2248", ttype:CONST},\r
+{input:"\\cong",       tag:"mo", output:"\u2245", ttype:CONST},\r
+{input:"\\Join",       tag:"mo", output:"\u22C8", ttype:CONST},\r
+{input:"\\bowtie",     tag:"mo", output:"\u22C8", ttype:CONST},\r
+{input:"\\in",         tag:"mo", output:"\u2208", ttype:CONST},\r
+{input:"\\ni",         tag:"mo", output:"\u220B", ttype:CONST},\r
+{input:"\\owns",       tag:"mo", output:"\u220B", ttype:CONST},\r
+{input:"\\propto",     tag:"mo", output:"\u221D", ttype:CONST},\r
+{input:"\\vdash",      tag:"mo", output:"\u22A2", ttype:CONST},\r
+{input:"\\dashv",      tag:"mo", output:"\u22A3", ttype:CONST},\r
+{input:"\\models",     tag:"mo", output:"\u22A8", ttype:CONST},\r
+{input:"\\perp",       tag:"mo", output:"\u22A5", ttype:CONST},\r
+{input:"\\smile",      tag:"mo", output:"\u2323", ttype:CONST},\r
+{input:"\\frown",      tag:"mo", output:"\u2322", ttype:CONST},\r
+{input:"\\asymp",      tag:"mo", output:"\u224D", ttype:CONST},\r
+{input:"\\notin",      tag:"mo", output:"\u2209", ttype:CONST},\r
+\r
+//matrices\r
+{input:"\\begin{eqnarray}",    output:"X",     ttype:MATRIX, invisible:true},\r
+{input:"\\begin{array}",       output:"X",     ttype:MATRIX, invisible:true},\r
+{input:"\\\\",                 output:"}&{",   ttype:DEFINITION},\r
+{input:"\\end{eqnarray}",      output:"}}",    ttype:DEFINITION},\r
+{input:"\\end{array}",         output:"}}",    ttype:DEFINITION},\r
+\r
+//grouping and literal brackets -- ieval is for IE\r
+{input:"\\big",           tag:"mo", output:"X", atval:"1.2", ieval:"2.2", ttype:BIG},\r
+{input:"\\Big",           tag:"mo", output:"X", atval:"1.6", ieval:"2.6", ttype:BIG},\r
+{input:"\\bigg",   tag:"mo", output:"X", atval:"2.2", ieval:"3.2", ttype:BIG},\r
+{input:"\\Bigg",   tag:"mo", output:"X", atval:"2.9", ieval:"3.9", ttype:BIG},\r
+{input:"\\left",   tag:"mo", output:"X", ttype:LEFTBRACKET},\r
+{input:"\\right",  tag:"mo", output:"X", ttype:RIGHTBRACKET},\r
+{input:"{",       output:"{", ttype:LEFTBRACKET,  invisible:true},\r
+{input:"}",       output:"}", ttype:RIGHTBRACKET, invisible:true},\r
+\r
+{input:"(",       tag:"mo", output:"(",      atval:"1", ttype:STRETCHY},\r
+{input:"[",       tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},\r
+{input:"\\lbrack", tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},\r
+{input:"\\{",     tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},\r
+{input:"\\lbrace", tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},\r
+{input:"\\langle", tag:"mo", output:"\u2329", atval:"1", ttype:STRETCHY},\r
+{input:"\\lfloor", tag:"mo", output:"\u230A", atval:"1", ttype:STRETCHY},\r
+{input:"\\lceil",  tag:"mo", output:"\u2308", atval:"1", ttype:STRETCHY},\r
+\r
+// rtag:"mi" causes space to be inserted before a following sin, cos, etc.\r
+// (see function AMparseExpr() )\r
+{input:")",      tag:"mo",output:")",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"]",      tag:"mo",output:"]",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rbrack",tag:"mo",output:"]",     rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\}",    tag:"mo",output:"}",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rbrace",tag:"mo",output:"}",     rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rangle",tag:"mo",output:"\u232A", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rfloor",tag:"mo",output:"\u230B", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+{input:"\\rceil", tag:"mo",output:"\u2309", rtag:"mi",atval:"1",ttype:STRETCHY},\r
+\r
+// "|", "\\|", "\\vert" and "\\Vert" modified later: lspace = rspace = 0em\r
+{input:"|",            tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\|",          tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"\\vert",       tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\Vert",       tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"\\mid",                tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
+{input:"\\parallel",   tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
+{input:"/",            tag:"mo", output:"/",   atval:"1.01", ttype:STRETCHY},\r
+{input:"\\backslash",  tag:"mo", output:"\u2216", atval:"1", ttype:STRETCHY},\r
+{input:"\\setminus",   tag:"mo", output:"\\",     ttype:CONST},\r
+\r
+//miscellaneous symbols\r
+{input:"\\!",    tag:"mspace", atname:"width", atval:"-0.167em", ttype:SPACE},\r
+{input:"\\,",    tag:"mspace", atname:"width", atval:"0.167em", ttype:SPACE},\r
+{input:"\\>",    tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
+{input:"\\:",    tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
+{input:"\\;",    tag:"mspace", atname:"width", atval:"0.278em", ttype:SPACE},\r
+{input:"~",      tag:"mspace", atname:"width", atval:"0.333em", ttype:SPACE},\r
+{input:"\\quad",  tag:"mspace", atname:"width", atval:"1em", ttype:SPACE},\r
+{input:"\\qquad", tag:"mspace", atname:"width", atval:"2em", ttype:SPACE},\r
+//{input:"{}",           tag:"mo", output:"\u200B", ttype:CONST}, // zero-width\r
+{input:"\\prime",      tag:"mo", output:"\u2032", ttype:CONST},\r
+{input:"'",            tag:"mo", output:"\u02B9", ttype:CONST},\r
+{input:"''",           tag:"mo", output:"\u02BA", ttype:CONST},\r
+{input:"'''",          tag:"mo", output:"\u2034", ttype:CONST},\r
+{input:"''''",         tag:"mo", output:"\u2057", ttype:CONST},\r
+{input:"\\ldots",      tag:"mo", output:"\u2026", ttype:CONST},\r
+{input:"\\cdots",      tag:"mo", output:"\u22EF", ttype:CONST},\r
+{input:"\\vdots",      tag:"mo", output:"\u22EE", ttype:CONST},\r
+{input:"\\ddots",      tag:"mo", output:"\u22F1", ttype:CONST},\r
+{input:"\\forall",     tag:"mo", output:"\u2200", ttype:CONST},\r
+{input:"\\exists",     tag:"mo", output:"\u2203", ttype:CONST},\r
+{input:"\\Re",         tag:"mo", output:"\u211C", ttype:CONST},\r
+{input:"\\Im",         tag:"mo", output:"\u2111", ttype:CONST},\r
+{input:"\\aleph",      tag:"mo", output:"\u2135", ttype:CONST},\r
+{input:"\\hbar",       tag:"mo", output:"\u210F", ttype:CONST},\r
+{input:"\\ell",                tag:"mo", output:"\u2113", ttype:CONST},\r
+{input:"\\wp",         tag:"mo", output:"\u2118", ttype:CONST},\r
+{input:"\\emptyset",   tag:"mo", output:"\u2205", ttype:CONST},\r
+{input:"\\infty",      tag:"mo", output:"\u221E", ttype:CONST},\r
+{input:"\\surd",       tag:"mo", output:"\\sqrt{}", ttype:DEFINITION},\r
+{input:"\\partial",    tag:"mo", output:"\u2202", ttype:CONST},\r
+{input:"\\nabla",      tag:"mo", output:"\u2207", ttype:CONST},\r
+{input:"\\triangle",   tag:"mo", output:"\u25B3", ttype:CONST},\r
+{input:"\\therefore",  tag:"mo", output:"\u2234", ttype:CONST},\r
+{input:"\\angle",      tag:"mo", output:"\u2220", ttype:CONST},\r
+//{input:"\\\\ ",        tag:"mo", output:"\u00A0", ttype:CONST},\r
+{input:"\\diamond",    tag:"mo", output:"\u22C4", ttype:CONST},\r
+//{input:"\\Diamond",    tag:"mo", output:"\u25CA", ttype:CONST},\r
+{input:"\\Diamond",    tag:"mo", output:"\u25C7", ttype:CONST},\r
+{input:"\\neg",                tag:"mo", output:"\u00AC", ttype:CONST},\r
+{input:"\\lnot",       tag:"mo", output:"\u00AC", ttype:CONST},\r
+{input:"\\bot",                tag:"mo", output:"\u22A5", ttype:CONST},\r
+{input:"\\top",                tag:"mo", output:"\u22A4", ttype:CONST},\r
+{input:"\\square",     tag:"mo", output:"\u25AB", ttype:CONST},\r
+{input:"\\Box",                tag:"mo", output:"\u25A1", ttype:CONST},\r
+{input:"\\wr",         tag:"mo", output:"\u2240", ttype:CONST},\r
+\r
+//standard functions\r
+//Note UNDEROVER *must* have tag:"mo" to work properly\r
+{input:"\\arccos", tag:"mi", output:"arccos", ttype:UNARY, func:true},\r
+{input:"\\arcsin", tag:"mi", output:"arcsin", ttype:UNARY, func:true},\r
+{input:"\\arctan", tag:"mi", output:"arctan", ttype:UNARY, func:true},\r
+{input:"\\arg",           tag:"mi", output:"arg",    ttype:UNARY, func:true},\r
+{input:"\\cos",           tag:"mi", output:"cos",    ttype:UNARY, func:true},\r
+{input:"\\cosh",   tag:"mi", output:"cosh",   ttype:UNARY, func:true},\r
+{input:"\\cot",           tag:"mi", output:"cot",    ttype:UNARY, func:true},\r
+{input:"\\coth",   tag:"mi", output:"coth",   ttype:UNARY, func:true},\r
+{input:"\\csc",           tag:"mi", output:"csc",    ttype:UNARY, func:true},\r
+{input:"\\deg",           tag:"mi", output:"deg",    ttype:UNARY, func:true},\r
+{input:"\\det",           tag:"mi", output:"det",    ttype:UNARY, func:true},\r
+{input:"\\dim",           tag:"mi", output:"dim",    ttype:UNARY, func:true}, //CONST?\r
+{input:"\\exp",           tag:"mi", output:"exp",    ttype:UNARY, func:true},\r
+{input:"\\gcd",           tag:"mi", output:"gcd",    ttype:UNARY, func:true}, //CONST?\r
+{input:"\\hom",           tag:"mi", output:"hom",    ttype:UNARY, func:true},\r
+{input:"\\inf",              tag:"mo", output:"inf",    ttype:UNDEROVER},\r
+{input:"\\ker",           tag:"mi", output:"ker",    ttype:UNARY, func:true},\r
+{input:"\\lg",    tag:"mi", output:"lg",     ttype:UNARY, func:true},\r
+{input:"\\lim",              tag:"mo", output:"lim",    ttype:UNDEROVER},\r
+{input:"\\liminf",    tag:"mo", output:"liminf", ttype:UNDEROVER},\r
+{input:"\\limsup",    tag:"mo", output:"limsup", ttype:UNDEROVER},\r
+{input:"\\ln",    tag:"mi", output:"ln",     ttype:UNARY, func:true},\r
+{input:"\\log",           tag:"mi", output:"log",    ttype:UNARY, func:true},\r
+{input:"\\max",              tag:"mo", output:"max",    ttype:UNDEROVER},\r
+{input:"\\min",              tag:"mo", output:"min",    ttype:UNDEROVER},\r
+{input:"\\Pr",    tag:"mi", output:"Pr",     ttype:UNARY, func:true},\r
+{input:"\\sec",           tag:"mi", output:"sec",    ttype:UNARY, func:true},\r
+{input:"\\sin",           tag:"mi", output:"sin",    ttype:UNARY, func:true},\r
+{input:"\\sinh",   tag:"mi", output:"sinh",   ttype:UNARY, func:true},\r
+{input:"\\sup",              tag:"mo", output:"sup",    ttype:UNDEROVER},\r
+{input:"\\tan",           tag:"mi", output:"tan",    ttype:UNARY, func:true},\r
+{input:"\\tanh",   tag:"mi", output:"tanh",   ttype:UNARY, func:true},\r
+\r
+//arrows\r
+{input:"\\gets",               tag:"mo", output:"\u2190", ttype:CONST},\r
+{input:"\\leftarrow",          tag:"mo", output:"\u2190", ttype:CONST},\r
+{input:"\\to",                 tag:"mo", output:"\u2192", ttype:CONST},\r
+{input:"\\rightarrow",         tag:"mo", output:"\u2192", ttype:CONST},\r
+{input:"\\leftrightarrow",     tag:"mo", output:"\u2194", ttype:CONST},\r
+{input:"\\uparrow",            tag:"mo", output:"\u2191", ttype:CONST},\r
+{input:"\\downarrow",          tag:"mo", output:"\u2193", ttype:CONST},\r
+{input:"\\updownarrow",                tag:"mo", output:"\u2195", ttype:CONST},\r
+{input:"\\Leftarrow",          tag:"mo", output:"\u21D0", ttype:CONST},\r
+{input:"\\Rightarrow",         tag:"mo", output:"\u21D2", ttype:CONST},\r
+{input:"\\Leftrightarrow",     tag:"mo", output:"\u21D4", ttype:CONST},\r
+{input:"\\iff", tag:"mo", output:"~\\Longleftrightarrow~", ttype:DEFINITION},\r
+{input:"\\Uparrow",            tag:"mo", output:"\u21D1", ttype:CONST},\r
+{input:"\\Downarrow",          tag:"mo", output:"\u21D3", ttype:CONST},\r
+{input:"\\Updownarrow",                tag:"mo", output:"\u21D5", ttype:CONST},\r
+{input:"\\mapsto",             tag:"mo", output:"\u21A6", ttype:CONST},\r
+{input:"\\longleftarrow",      tag:"mo", output:"\u2190", ttype:LONG},\r
+{input:"\\longrightarrow",     tag:"mo", output:"\u2192", ttype:LONG},\r
+{input:"\\longleftrightarrow", tag:"mo", output:"\u2194", ttype:LONG},\r
+{input:"\\Longleftarrow",      tag:"mo", output:"\u21D0", ttype:LONG},\r
+{input:"\\Longrightarrow",     tag:"mo", output:"\u21D2", ttype:LONG},\r
+{input:"\\Longleftrightarrow",  tag:"mo", output:"\u21D4", ttype:LONG},\r
+{input:"\\longmapsto",         tag:"mo", output:"\u21A6", ttype:CONST},\r
+                                                       // disaster if LONG\r
+\r
+//commands with argument\r
+AMsqrt, AMnot, AMroot, AMfrac, AMover, AMsub, AMsup, AMtext, AMmbox, AMatop, AMchoose,\r
+\r
+//AMdiv, AMquote,\r
+\r
+//diacritical marks\r
+{input:"\\acute",      tag:"mover",  output:"\u00B4", ttype:UNARY, acc:true},\r
+//{input:"\\acute",      tag:"mover",  output:"\u0317", ttype:UNARY, acc:true},\r
+//{input:"\\acute",      tag:"mover",  output:"\u0301", ttype:UNARY, acc:true},\r
+//{input:"\\grave",      tag:"mover",  output:"\u0300", ttype:UNARY, acc:true},\r
+//{input:"\\grave",      tag:"mover",  output:"\u0316", ttype:UNARY, acc:true},\r
+{input:"\\grave",      tag:"mover",  output:"\u0060", ttype:UNARY, acc:true},\r
+{input:"\\breve",      tag:"mover",  output:"\u02D8", ttype:UNARY, acc:true},\r
+{input:"\\check",      tag:"mover",  output:"\u02C7", ttype:UNARY, acc:true},\r
+{input:"\\dot",                tag:"mover",  output:".",      ttype:UNARY, acc:true},\r
+{input:"\\ddot",       tag:"mover",  output:"..",     ttype:UNARY, acc:true},\r
+//{input:"\\ddot",       tag:"mover",  output:"\u00A8", ttype:UNARY, acc:true},\r
+{input:"\\mathring",   tag:"mover",  output:"\u00B0", ttype:UNARY, acc:true},\r
+{input:"\\vec",                tag:"mover",  output:"\u20D7", ttype:UNARY, acc:true},\r
+{input:"\\overrightarrow",tag:"mover",output:"\u20D7", ttype:UNARY, acc:true},\r
+{input:"\\overleftarrow",tag:"mover", output:"\u20D6", ttype:UNARY, acc:true},\r
+{input:"\\hat",                tag:"mover",  output:"\u005E", ttype:UNARY, acc:true},\r
+{input:"\\widehat",    tag:"mover",  output:"\u0302", ttype:UNARY, acc:true},\r
+{input:"\\tilde",      tag:"mover",  output:"~",      ttype:UNARY, acc:true},\r
+//{input:"\\tilde",      tag:"mover",  output:"\u0303", ttype:UNARY, acc:true},\r
+{input:"\\widetilde",  tag:"mover",  output:"\u02DC", ttype:UNARY, acc:true},\r
+{input:"\\bar",                tag:"mover",  output:"\u203E", ttype:UNARY, acc:true},\r
+{input:"\\overbrace",  tag:"mover",  output:"\uFE37", ttype:UNARY, acc:true}, //Changed unicode overbrace\r
+{input:"\\overbracket", tag:"mover",  output:"\u23B4", ttype:UNARY, acc:true}, //old overbrace = overbracket\r
+{input:"\\overline",   tag:"mover",  output:"\u00AF", ttype:UNARY, acc:true},\r
+{input:"\\underbrace",  tag:"munder", output:"\uFE38", ttype:UNARY, acc:true}, //Changed unicode underbrace\r
+{input:"\\underbracket",tag:"munder", output:"\u23B5", ttype:UNARY, acc:true}, //old underbrace = underbracket\r
+{input:"\\underline",  tag:"munder", output:"\u00AF", ttype:UNARY, acc:true},\r
+//{input:"underline",  tag:"munder", output:"\u0332", ttype:UNARY, acc:true},\r
+\r
+//typestyles and fonts\r
+{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true", ttype:UNARY},\r
+{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false", ttype:UNARY},\r
+{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1", ttype:UNARY},\r
+{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2", ttype:UNARY},\r
+{input:"\\textrm", tag:"mstyle", output:"\\mathrm", ttype: DEFINITION},\r
+{input:"\\mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
+{input:"\\textbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
+{input:"\\mathit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
+{input:"\\textit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
+{input:"\\mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
+{input:"\\texttt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
+{input:"\\mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", ttype:UNARY},\r
+{input:"\\mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", ttype:UNARY, codes:AMbbb},\r
+{input:"\\mathcal",tag:"mstyle", atname:"mathvariant", atval:"script", ttype:UNARY, codes:AMcal},\r
+{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant", atval:"fraktur",ttype:UNARY, codes:AMfrk},\r
+{input:"\\textcolor",tag:"mstyle",atname:"mathvariant", atval:"mathcolor", ttype:BINARY},\r
+{input:"\\colorbox",tag:"mstyle",atname:"mathvariant", atval:"background", ttype:BINARY}\r
+];\r
+\r
+function compareNames(s1,s2) {\r
+  if (s1.input > s2.input) return 1\r
+  else return -1;\r
+}\r
+\r
+var AMnames = []; //list of input symbols\r
+\r
+function AMinitSymbols() {\r
+  AMsymbols.sort(compareNames);\r
+  for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;\r
+}\r
+\r
+var AMmathml = "http://www.w3.org/1998/Math/MathML";\r
+\r
+function AMcreateElementMathML(t) {\r
+  if (isIE) return document.createElement("m:"+t);\r
+  else return document.createElementNS(AMmathml,t);\r
+}\r
+\r
+function AMcreateMmlNode(t,frag) {\r
+//  var node = AMcreateElementMathML(name);\r
+  if (isIE) var node = document.createElement("m:"+t);\r
+  else var node = document.createElementNS(AMmathml,t);\r
+  node.appendChild(frag);\r
+  return node;\r
+}\r
+\r
+function newcommand(oldstr,newstr) {\r
+  AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,\r
+                                 ttype:DEFINITION}]);\r
+}\r
+\r
+function AMremoveCharsAndBlanks(str,n) {\r
+//remove n characters and any following blanks\r
+  var st;\r
+  st = str.slice(n);\r
+  for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);\r
+  return st.slice(i);\r
+}\r
+\r
+function AMposition(arr, str, n) {\r
+// return position >=n where str appears or would be inserted\r
+// assumes arr is sorted\r
+  if (n==0) {\r
+    var h,m;\r
+    n = -1;\r
+    h = arr.length;\r
+    while (n+1<h) {\r
+      m = (n+h) >> 1;\r
+      if (arr[m]<str) n = m; else h = m;\r
+    }\r
+    return h;\r
+  } else\r
+    for (var i=n; i<arr.length && arr[i]<str; i++);\r
+  return i; // i=arr.length || arr[i]>=str\r
+}\r
+\r
+function AMgetSymbol(str) {\r
+//return maximal initial substring of str that appears in names\r
+//return null if there is none\r
+  var k = 0; //new pos\r
+  var j = 0; //old pos\r
+  var mk; //match pos\r
+  var st;\r
+  var tagst;\r
+  var match = "";\r
+  var more = true;\r
+  for (var i=1; i<=str.length && more; i++) {\r
+    st = str.slice(0,i); //initial substring of length i\r
+    j = k;\r
+    k = AMposition(AMnames, st, j);\r
+    if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){\r
+      match = AMnames[k];\r
+      mk = k;\r
+      i = match.length;\r
+    }\r
+    more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];\r
+  }\r
+  AMpreviousSymbol=AMcurrentSymbol;\r
+  if (match!=""){\r
+    AMcurrentSymbol=AMsymbols[mk].ttype;\r
+    return AMsymbols[mk];\r
+  }\r
+  AMcurrentSymbol=CONST;\r
+  k = 1;\r
+  st = str.slice(0,1); //take 1 character\r
+  if ("0"<=st && st<="9") tagst = "mn";\r
+  else tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");\r
+/*\r
+// Commented out by DRW (not fully understood, but probably to do with\r
+// use of "/" as an INFIX version of "\\frac", which we don't want):\r
+//}\r
+//if (st=="-" && AMpreviousSymbol==INFIX) {\r
+//  AMcurrentSymbol = INFIX;  //trick "/" into recognizing "-" on second parse\r
+//  return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};\r
+//}\r
+*/\r
+  return {input:st, tag:tagst, output:st, ttype:CONST};\r
+}\r
+\r
+\r
+/*Parsing ASCII math expressions with the following grammar\r
+v ::= [A-Za-z] | greek letters | numbers | other constant symbols\r
+u ::= sqrt | text | bb | other unary symbols for font commands\r
+b ::= frac | root | stackrel   binary symbols\r
+l ::= { | \left                        left brackets\r
+r ::= } | \right               right brackets\r
+S ::= v | lEr | uS | bSS       Simple expression\r
+I ::= S_S | S^S | S_S^S | S    Intermediate expression\r
+E ::= IE | I/I                 Expression\r
+Each terminal symbol is translated into a corresponding mathml node.*/\r
+\r
+var AMpreviousSymbol,AMcurrentSymbol;\r
+\r
+function AMparseSexpr(str) { //parses str and returns [node,tailstr,(node)tag]\r
+  var symbol, node, result, result2, i, st,// rightvert = false,\r
+    newFrag = document.createDocumentFragment();\r
+  str = AMremoveCharsAndBlanks(str,0);\r
+  symbol = AMgetSymbol(str);             //either a token or a bracket or empty\r
+  if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
+    return [null,str,null];\r
+  if (symbol.ttype == DEFINITION) {\r
+    str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);\r
+    symbol = AMgetSymbol(str);\r
+    if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
+      return [null,str,null];\r
+  }\r
+  str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+  switch (symbol.ttype) {\r
+  case SPACE:\r
+    node = AMcreateElementMathML(symbol.tag);\r
+    node.setAttribute(symbol.atname,symbol.atval);\r
+    return [node,str,symbol.tag];\r
+  case UNDEROVER:\r
+    if (isIE) {\r
+      if (symbol.input.substr(0,4) == "\\big") {   // botch for missing symbols\r
+       str = "\\"+symbol.input.substr(4)+str;     // make \bigcup = \cup etc.\r
+       symbol = AMgetSymbol(str);\r
+       symbol.ttype = UNDEROVER;\r
+       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+      }\r
+    }\r
+    return [AMcreateMmlNode(symbol.tag,\r
+                       document.createTextNode(symbol.output)),str,symbol.tag];\r
+  case CONST:\r
+    var output = symbol.output;\r
+    if (isIE) {\r
+      if (symbol.input == "'")\r
+       output = "\u2032";\r
+      else if (symbol.input == "''")\r
+       output = "\u2033";\r
+      else if (symbol.input == "'''")\r
+       output = "\u2033\u2032";\r
+      else if (symbol.input == "''''")\r
+       output = "\u2033\u2033";\r
+      else if (symbol.input == "\\square")\r
+       output = "\u25A1";      // same as \Box\r
+      else if (symbol.input.substr(0,5) == "\\frac") {\r
+                                               // botch for missing fractions\r
+       var denom = symbol.input.substr(6,1);\r
+       if (denom == "5" || denom == "6") {\r
+         str = symbol.input.replace(/\\frac/,"\\frac ")+str;\r
+         return [node,str,symbol.tag];\r
+       }\r
+      }\r
+    }\r
+    node = AMcreateMmlNode(symbol.tag,document.createTextNode(output));\r
+    return [node,str,symbol.tag];\r
+  case LONG:  // added by DRW\r
+    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+    node.setAttribute("minsize","1.5");\r
+    node.setAttribute("maxsize","1.5");\r
+    node = AMcreateMmlNode("mover",node);\r
+    node.appendChild(AMcreateElementMathML("mspace"));\r
+    return [node,str,symbol.tag];\r
+  case STRETCHY:  // added by DRW\r
+    if (isIE && symbol.input == "\\backslash")\r
+       symbol.output = "\\";   // doesn't expand, but then nor does "\u2216"\r
+    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+    if (symbol.input == "|" || symbol.input == "\\vert" ||\r
+       symbol.input == "\\|" || symbol.input == "\\Vert") {\r
+         node.setAttribute("lspace","0em");\r
+         node.setAttribute("rspace","0em");\r
+    }\r
+    node.setAttribute("maxsize",symbol.atval);  // don't allow to stretch here\r
+    if (symbol.rtag != null)\r
+      return [node,str,symbol.rtag];\r
+    else\r
+      return [node,str,symbol.tag];\r
+  case BIG:  // added by DRW\r
+    var atval = symbol.atval;\r
+    if (isIE)\r
+      atval = symbol.ieval;\r
+    symbol = AMgetSymbol(str);\r
+    if (symbol == null)\r
+       return [null,str,null];\r
+    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
+    if (isIE) {                // to get brackets to expand\r
+      var space = AMcreateElementMathML("mspace");\r
+      space.setAttribute("height",atval+"ex");\r
+      node = AMcreateMmlNode("mrow",node);\r
+      node.appendChild(space);\r
+    } else {           // ignored in IE\r
+      node.setAttribute("minsize",atval);\r
+      node.setAttribute("maxsize",atval);\r
+    }\r
+    return [node,str,symbol.tag];\r
+  case LEFTBRACKET:   //read (expr+)\r
+    if (symbol.input == "\\left") { // left what?\r
+      symbol = AMgetSymbol(str);\r
+      if (symbol != null) {\r
+       if (symbol.input == ".")\r
+         symbol.invisible = true;\r
+       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+      }\r
+    }\r
+    result = AMparseExpr(str,true,false);\r
+    if (symbol==null ||\r
+       (typeof symbol.invisible == "boolean" && symbol.invisible))\r
+      node = AMcreateMmlNode("mrow",result[0]);\r
+    else {\r
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
+      node = AMcreateMmlNode("mrow",node);\r
+      node.appendChild(result[0]);\r
+    }\r
+    return [node,result[1],result[2]];\r
+  case MATRIX:  //read (expr+)\r
+    if (symbol.input == "\\begin{array}") {\r
+      var mask = "";\r
+      symbol = AMgetSymbol(str);\r
+      str = AMremoveCharsAndBlanks(str,0);\r
+      if (symbol == null)\r
+       mask = "l";\r
+      else {\r
+       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+       if (symbol.input != "{")\r
+         mask = "l";\r
+       else do {\r
+         symbol = AMgetSymbol(str);\r
+         if (symbol != null) {\r
+           str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+           if (symbol.input != "}")\r
+             mask = mask+symbol.input;\r
+         }\r
+       } while (symbol != null && symbol.input != "" && symbol.input != "}");\r
+      }\r
+      result = AMparseExpr("{"+str,true,true);\r
+//    if (result[0]==null) return [AMcreateMmlNode("mo",\r
+//                        document.createTextNode(symbol.input)),str];\r
+      node = AMcreateMmlNode("mtable",result[0]);\r
+      mask = mask.replace(/l/g,"left ");\r
+      mask = mask.replace(/r/g,"right ");\r
+      mask = mask.replace(/c/g,"center ");\r
+      node.setAttribute("columnalign",mask);\r
+      node.setAttribute("displaystyle","false");\r
+      if (isIE)\r
+       return [node,result[1],null];\r
+// trying to get a *little* bit of space around the array\r
+// (IE already includes it)\r
+      var lspace = AMcreateElementMathML("mspace");\r
+      lspace.setAttribute("width","0.167em");\r
+      var rspace = AMcreateElementMathML("mspace");\r
+      rspace.setAttribute("width","0.167em");\r
+      var node1 = AMcreateMmlNode("mrow",lspace);\r
+      node1.appendChild(node);\r
+      node1.appendChild(rspace);\r
+      return [node1,result[1],null];\r
+    } else {   // eqnarray\r
+      result = AMparseExpr("{"+str,true,true);\r
+      node = AMcreateMmlNode("mtable",result[0]);\r
+      if (isIE)\r
+       node.setAttribute("columnspacing","0.25em"); // best in practice?\r
+      else\r
+       node.setAttribute("columnspacing","0.167em"); // correct (but ignored?)\r
+      node.setAttribute("columnalign","right center left");\r
+      node.setAttribute("displaystyle","true");\r
+      node = AMcreateMmlNode("mrow",node);\r
+      return [node,result[1],null];\r
+    }\r
+  case TEXT:\r
+      if (str.charAt(0)=="{") i=str.indexOf("}");\r
+      else i = 0;\r
+      if (i==-1)\r
+                i = str.length;\r
+      st = str.slice(1,i);\r
+      if (st.charAt(0) == " ") {\r
+       node = AMcreateElementMathML("mspace");\r
+       node.setAttribute("width","0.33em");    // was 1ex\r
+       newFrag.appendChild(node);\r
+      }\r
+      newFrag.appendChild(\r
+        AMcreateMmlNode(symbol.tag,document.createTextNode(st)));\r
+      if (st.charAt(st.length-1) == " ") {\r
+       node = AMcreateElementMathML("mspace");\r
+       node.setAttribute("width","0.33em");    // was 1ex\r
+       newFrag.appendChild(node);\r
+      }\r
+      str = AMremoveCharsAndBlanks(str,i+1);\r
+      return [AMcreateMmlNode("mrow",newFrag),str,null];\r
+  case UNARY:\r
+      result = AMparseSexpr(str);\r
+      if (result[0]==null) return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str];\r
+      if (typeof symbol.func == "boolean" && symbol.func) { // functions hack\r
+               st = str.charAt(0);\r
+//             if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {\r
+               if (st=="^" || st=="_" || st==",") {\r
+                 return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag];\r
+        } else {\r
+                 node = AMcreateMmlNode("mrow",AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));\r
+                 if (isIE) {\r
+               var space = AMcreateElementMathML("mspace");\r
+               space.setAttribute("width","0.167em");\r
+               node.appendChild(space);\r
+                 }\r
+                 node.appendChild(result[0]);\r
+                 return [node,result[1],symbol.tag];\r
+        }\r
+      }\r
+      if (symbol.input == "\\sqrt") {          // sqrt\r
+            if (isIE) {        // set minsize, for \surd\r
+               var space = AMcreateElementMathML("mspace");\r
+               space.setAttribute("height","1.2ex");\r
+               space.setAttribute("width","0em");      // probably no effect\r
+               node = AMcreateMmlNode(symbol.tag,result[0])\r
+//             node.setAttribute("minsize","1");       // ignored\r
+//             node = AMcreateMmlNode("mrow",node);  // hopefully unnecessary\r
+                       node.appendChild(space);\r
+                       return [node,result[1],symbol.tag];\r
+               } else\r
+                 return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
+      } else if (typeof symbol.acc == "boolean" && symbol.acc) {   // accent\r
+             node = AMcreateMmlNode(symbol.tag,result[0]);\r
+             var output = symbol.output;\r
+                 if (isIE) {\r
+                       if (symbol.input == "\\hat")\r
+                               output = "\u0302";\r
+                       else if (symbol.input == "\\widehat")\r
+                               output = "\u005E";\r
+                       else if (symbol.input == "\\bar")\r
+                               output = "\u00AF";\r
+                       else if (symbol.input == "\\grave")\r
+                               output = "\u0300";\r
+                       else if (symbol.input == "\\tilde")\r
+                               output = "\u0303";\r
+               }\r
+               var node1 = AMcreateMmlNode("mo",document.createTextNode(output));\r
+               if (symbol.input == "\\vec" || symbol.input == "\\check")\r
+                                               // don't allow to stretch\r
+                   node1.setAttribute("maxsize","1.2");\r
+                // why doesn't "1" work?  \vec nearly disappears in firefox\r
+               if (isIE && symbol.input == "\\bar")\r
+           node1.setAttribute("maxsize","0.5");\r
+               if (symbol.input == "\\underbrace" || symbol.input == "\\underline")\r
+                 node1.setAttribute("accentunder","true");\r
+               else\r
+                 node1.setAttribute("accent","true");\r
+               node.appendChild(node1);\r
+               if (symbol.input == "\\overbrace" || symbol.input == "\\underbrace")\r
+                 node.ttype = UNDEROVER;\r
+               return [node,result[1],symbol.tag];\r
+          } else if (symbol.input == "\\not") {                // not\r
+        // added by infinity0 on 2009-12-15 to implement \not command\r
+        text = result[0].childNodes[0].nodeValue;\r
+        if (typeof text == "string" && text.length == 1 && text in AMRelationNegations) {\r
+          result[0].childNodes[0].nodeValue = AMRelationNegations[text];\r
+          return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
+        }\r
+        return [AMcreateMmlNode("mo",document.createTextNode("\\")),"not " + str,symbol.tag];\r
+      } else {                       // font change or displaystyle command\r
+        if (!isIE && typeof symbol.codes != "undefined") {\r
+          for (i=0; i<result[0].childNodes.length; i++)\r
+            if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {\r
+              st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:\r
+                              result[0].childNodes[i].firstChild.nodeValue);\r
+              var newst = [];\r
+              for (var j=0; j<st.length; j++)\r
+                if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91)\r
+                               {  newst = newst + symbol.codes[st.charCodeAt(j)-65] }\r
+                   // String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]); alert(newst); }\r
+                else newst = newst + st.charAt(j);\r
+              if (result[0].nodeName=="mi")\r
+                result[0]=AMcreateElementMathML("mo").\r
+                          appendChild(document.createTextNode(newst));\r
+              else result[0].replaceChild(AMcreateElementMathML("mo").\r
+          appendChild(document.createTextNode(newst)),result[0].childNodes[i]);\r
+            }\r
+        }\r
+        node = AMcreateMmlNode(symbol.tag,result[0]);\r
+        node.setAttribute(symbol.atname,symbol.atval);\r
+       if (symbol.input == "\\scriptstyle" ||\r
+           symbol.input == "\\scriptscriptstyle")\r
+               node.setAttribute("displaystyle","false");\r
+       return [node,result[1],symbol.tag];\r
+      }\r
+  case BINARY:\r
+    result = AMparseSexpr(str);\r
+    if (result[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
+    result2 = AMparseSexpr(result[1]);\r
+    if (result2[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
+    //added by J. Knisley to allow \textcolor and \colorbox within equations\r
+    if (symbol.input=="\\textcolor" || symbol.input=="\\colorbox") {\r
+      var tclr = str.match(/\{s*([#\w]+)\s*\}/); //get's color from beginning of str\r
+      str = str.replace(/\{s*[#\w]+\s*\}/,"");\r
+      if(tclr!=null) {\r
+         if(IsColorName.test(tclr[1].toLowerCase())) {\r
+              tclr=LaTeXColor[tclr[1].toLowerCase()];\r
+         } else {\r
+           tclr=tclr[1]; // no checking for valid color!!\r
+         }\r
+         node = AMcreateElementMathML("mstyle");\r
+         node.setAttribute(symbol.atval,tclr);\r
+         node.appendChild(result2[0]);\r
+         return [node,result2[1],symbol.tag];\r
+      }\r
+    }\r
+    if (symbol.input=="\\root" || symbol.input=="\\stackrel") newFrag.appendChild(result2[0]);\r
+    newFrag.appendChild(result[0]);\r
+    if (symbol.input=="\\frac") newFrag.appendChild(result2[0]);\r
+    return [AMcreateMmlNode(symbol.tag,newFrag),result2[1],symbol.tag];\r
+  case INFIX:\r
+    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+    return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),\r
+       str,symbol.tag];\r
+  default:\r
+    return [AMcreateMmlNode(symbol.tag,        //its a constant\r
+       document.createTextNode(symbol.output)),str,symbol.tag];\r
+  }\r
+}\r
+\r
+function AMparseIexpr(str) {\r
+  var symbol, sym1, sym2, node, result, tag, underover;\r
+  str = AMremoveCharsAndBlanks(str,0);\r
+  sym1 = AMgetSymbol(str);\r
+  result = AMparseSexpr(str);\r
+  node = result[0];\r
+  str = result[1];\r
+  tag = result[2];\r
+  symbol = AMgetSymbol(str);\r
+  if (symbol.ttype == INFIX) {\r
+    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+    result = AMparseSexpr(str);\r
+    if (result[0] == null) // show box in place of missing argument\r
+      result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));\r
+    str = result[1];\r
+    tag = result[2];\r
+    if (symbol.input == "_" || symbol.input == "^") {\r
+      sym2 = AMgetSymbol(str);\r
+      tag = null;      // no space between x^2 and a following sin, cos, etc.\r
+// This is for \underbrace and \overbrace\r
+      underover = ((sym1.ttype == UNDEROVER) || (node.ttype == UNDEROVER));\r
+//    underover = (sym1.ttype == UNDEROVER);\r
+      if (symbol.input == "_" && sym2.input == "^") {\r
+        str = AMremoveCharsAndBlanks(str,sym2.input.length);\r
+        var res2 = AMparseSexpr(str);\r
+       str = res2[1];\r
+       tag = res2[2];  // leave space between x_1^2 and a following sin etc.\r
+        node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);\r
+        node.appendChild(result[0]);\r
+        node.appendChild(res2[0]);\r
+      } else if (symbol.input == "_") {\r
+       node = AMcreateMmlNode((underover?"munder":"msub"),node);\r
+        node.appendChild(result[0]);\r
+      } else {\r
+       node = AMcreateMmlNode((underover?"mover":"msup"),node);\r
+        node.appendChild(result[0]);\r
+      }\r
+      node = AMcreateMmlNode("mrow",node); // so sum does not stretch\r
+    } else {\r
+      node = AMcreateMmlNode(symbol.tag,node);\r
+      if (symbol.input == "\\atop" || symbol.input == "\\choose")\r
+       node.setAttribute("linethickness","0ex");\r
+      node.appendChild(result[0]);\r
+      if (symbol.input == "\\choose")\r
+       node = AMcreateMmlNode("mfenced",node);\r
+    }\r
+  }\r
+  return [node,str,tag];\r
+}\r
+\r
+function AMparseExpr(str,rightbracket,matrix) {\r
+  var symbol, node, result, i, tag,\r
+  newFrag = document.createDocumentFragment();\r
+  do {\r
+    str = AMremoveCharsAndBlanks(str,0);\r
+    result = AMparseIexpr(str);\r
+    node = result[0];\r
+    str = result[1];\r
+    tag = result[2];\r
+    symbol = AMgetSymbol(str);\r
+    if (node!=undefined) {\r
+      if ((tag == "mn" || tag == "mi") && symbol!=null &&\r
+       typeof symbol.func == "boolean" && symbol.func) {\r
+                       // Add space before \sin in 2\sin x or x\sin x\r
+         var space = AMcreateElementMathML("mspace");\r
+         space.setAttribute("width","0.167em");\r
+         node = AMcreateMmlNode("mrow",node);\r
+         node.appendChild(space);\r
+      }\r
+      newFrag.appendChild(node);\r
+    }\r
+  } while ((symbol.ttype != RIGHTBRACKET)\r
+        && symbol!=null && symbol.output!="");\r
+  tag = null;\r
+  if (symbol.ttype == RIGHTBRACKET) {\r
+    if (symbol.input == "\\right") { // right what?\r
+      str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
+      symbol = AMgetSymbol(str);\r
+      if (symbol != null && symbol.input == ".")\r
+       symbol.invisible = true;\r
+      if (symbol != null)\r
+       tag = symbol.rtag;\r
+    }\r
+    if (symbol!=null)\r
+      str = AMremoveCharsAndBlanks(str,symbol.input.length); // ready to return\r
+    var len = newFrag.childNodes.length;\r
+    if (matrix &&\r
+      len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&\r
+      newFrag.childNodes[len-2].nodeName == "mo" &&\r
+      newFrag.childNodes[len-2].firstChild.nodeValue == "&") { //matrix\r
+       var pos = []; // positions of ampersands\r
+        var m = newFrag.childNodes.length;\r
+        for (i=0; matrix && i<m; i=i+2) {\r
+          pos[i] = [];\r
+          node = newFrag.childNodes[i];\r
+         for (var j=0; j<node.childNodes.length; j++)\r
+           if (node.childNodes[j].firstChild.nodeValue=="&")\r
+             pos[i][pos[i].length]=j;\r
+        }\r
+       var row, frag, n, k, table = document.createDocumentFragment();\r
+       for (i=0; i<m; i=i+2) {\r
+         row = document.createDocumentFragment();\r
+         frag = document.createDocumentFragment();\r
+         node = newFrag.firstChild; // <mrow> -&-&...&-&- </mrow>\r
+         n = node.childNodes.length;\r
+         k = 0;\r
+         for (j=0; j<n; j++) {\r
+           if (typeof pos[i][k] != "undefined" && j==pos[i][k]){\r
+             node.removeChild(node.firstChild); //remove &\r
+             row.appendChild(AMcreateMmlNode("mtd",frag));\r
+             k++;\r
+           } else frag.appendChild(node.firstChild);\r
+         }\r
+         row.appendChild(AMcreateMmlNode("mtd",frag));\r
+         if (newFrag.childNodes.length>2) {\r
+           newFrag.removeChild(newFrag.firstChild); //remove <mrow> </mrow>\r
+           newFrag.removeChild(newFrag.firstChild); //remove <mo>&</mo>\r
+         }\r
+         table.appendChild(AMcreateMmlNode("mtr",row));\r
+       }\r
+       return [table,str];\r
+    }\r
+    if (typeof symbol.invisible != "boolean" || !symbol.invisible) {\r
+      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
+      newFrag.appendChild(node);\r
+    }\r
+  }\r
+  return [newFrag,str,tag];\r
+}\r
+\r
+function AMparseMath(str) {\r
+  var result, node = AMcreateElementMathML("mstyle");\r
+  //added by J. Knisley to allow limited implementation of \color\r
+  var cclr = str.match(/\\color\s*\{s*([#\w]+)\s*\}/);\r
+  str = str.replace(/\\color\s*\{s*[#\w]+\s*\}/g,"");\r
+  if(cclr!=null) {\r
+     if(IsColorName.test(cclr[1].toLowerCase())) {\r
+           cclr=LaTeXColor[cclr[1].toLowerCase()];\r
+     } else {\r
+        cclr=cclr[1]; // no checking for valid color!!\r
+     }\r
+     node.setAttribute("mathcolor",cclr);\r
+  } else {\r
+    if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);\r
+  };\r
+  if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);\r
+  node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false,false)[0]);\r
+  node = AMcreateMmlNode("math",node);\r
+  if (showasciiformulaonhover)                      //fixed by djhsu so newline\r
+    node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko\r
+  if (false ) { //&& mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {\r
+    var fnode = AMcreateElementXHTML("font");\r
+    fnode.setAttribute("face",mathfontfamily);\r
+    fnode.appendChild(node);\r
+    return fnode;\r
+  }\r
+  return node;\r
+}\r
+\r
+function AMstrarr2docFrag(arr, linebreaks) {\r
+  var newFrag=document.createDocumentFragment();\r
+  var expr = false;\r
+  for (var i=0; i<arr.length; i++) {\r
+    if (expr) newFrag.appendChild(AMparseMath(arr[i]));\r
+    else {\r
+      var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);\r
+      newFrag.appendChild(AMcreateElementXHTML("span").\r
+      appendChild(document.createTextNode(arri[0])));\r
+      for (var j=1; j<arri.length; j++) {\r
+        newFrag.appendChild(AMcreateElementXHTML("p"));\r
+        newFrag.appendChild(AMcreateElementXHTML("span").\r
+        appendChild(document.createTextNode(arri[j])));\r
+      }\r
+    }\r
+    expr = !expr;\r
+  }\r
+  return newFrag;\r
+}\r
+\r
+function AMprocessNodeR(n, linebreaks) {\r
+  var mtch, str, arr, frg, i;\r
+  if (n.childNodes.length == 0) {\r
+   if ((n.nodeType!=8 || linebreaks) &&\r
+    n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&\r
+    n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&\r
+    n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {\r
+    str = n.nodeValue;\r
+    if (!(str == null)) {\r
+      str = str.replace(/\r\n\r\n/g,"\n\n");\r
+      str = str.replace(/\x20+/g," ");\r
+      str = str.replace(/\s*\r\n/g," ");\r
+// DELIMITERS:\r
+      mtch = (str.indexOf("\$")==-1 ? false : true);\r
+      str = str.replace(/([^\\])\$/g,"$1 \$");\r
+      str = str.replace(/^\$/," \$");  // in case \$ at start of string\r
+      arr = str.split(" \$");\r
+      for (i=0; i<arr.length; i++)\r
+         arr[i]=arr[i].replace(/\\\$/g,"\$");\r
+         if (arr.length>1 || mtch) {\r
+           if (checkForMathML) {\r
+             checkForMathML = false;\r
+             var nd = AMisMathMLavailable();\r
+             AMnoMathML = nd != null;\r
+                if (AMnoMathML && notifyIfNoMathML)\r
+                   if (alertIfNoMathML)\r
+                       alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\\r
+                              or Firefox/Mozilla/Netscape");\r
+            else AMbody.insertBefore(nd,AMbody.childNodes[0]);\r
+        }\r
+        if (!AMnoMathML) {\r
+          frg = AMstrarr2docFrag(arr,n.nodeType==8);\r
+          var len = frg.childNodes.length;\r
+          n.parentNode.replaceChild(frg,n);\r
+          return len-1;\r
+        } else return 0;\r
+      }\r
+    }\r
+   } else return 0;\r
+  } else if (n.nodeName!="math") {\r
+    for (i=0; i<n.childNodes.length; i++)\r
+      i += AMprocessNodeR(n.childNodes[i], linebreaks);\r
+  }\r
+  return 0;\r
+}\r
+\r
+function AMprocessNode(n, linebreaks, spanclassAM) {\r
+  var frag,st;\r
+  if (spanclassAM!=null) {\r
+    frag = document.getElementsByTagName("span")\r
+    for (var i=0;i<frag.length;i++)\r
+      if (frag[i].className == "AM")\r
+        AMprocessNodeR(frag[i],linebreaks);\r
+  } else {\r
+    try {\r
+      st = n.innerHTML;\r
+    } catch(err) {}\r
+// DELIMITERS:\r
+    if (st==null || st.indexOf("\$")!=-1)\r
+      AMprocessNodeR(n,linebreaks);\r
+  }\r
+  if (isIE) { //needed to match size and font of formula to surrounding text\r
+    frag = document.getElementsByTagName('math');\r
+    for (var i=0;i<frag.length;i++) frag[i].update()\r
+  }\r
+}\r
+\r
+/* Below is LaTeX pre-processing to produce CSS supported */\r
+/* standard latex structures*/\r
+/* Jeff Knisley (knisleyj@etsu.edu)\r
+/* Supported in part by the Howard Hughes Medical Institute */\r
+/* as part of the Symbiosis Project: HHMI #52005872 */\r
+\r
+var inAppendix = false;\r
+var sectionCntr = 0;\r
+var IEcommentWarning = true;\r
+var biblist = [];\r
+var bibcntr = 0;\r
+\r
+var LaTeXCounter = [];\r
+LaTeXCounter["definition"] = 0;\r
+LaTeXCounter["proposition"] = 0;\r
+LaTeXCounter["lemma"] = 0;\r
+LaTeXCounter["theorem"] = 0;\r
+LaTeXCounter["corollary"] = 0;\r
+LaTeXCounter["example"] = 0;\r
+LaTeXCounter["exercise"] = 0;\r
+LaTeXCounter["subsection"] = 0;\r
+LaTeXCounter["subsubsection"] = 0;\r
+LaTeXCounter["figure"] = 0;\r
+LaTeXCounter["equation"] = 0;\r
+LaTeXCounter["table"] = 0;\r
+LaTeXCounter["label"] = 0;\r
+\r
+var LaTeXColor = [];\r
+LaTeXColor["greenyellow"]    = "#D9FF4F";\r
+LaTeXColor["yellow"]         = "#FFFF00";\r
+LaTeXColor["goldenrod"]      = "#FFE529";\r
+LaTeXColor["dandelion"]      = "#FFB529";\r
+LaTeXColor["apricot"]        = "#FFAD7A";\r
+LaTeXColor["peach"]          = "#FF804D";\r
+LaTeXColor["melon"]          = "#FF8A80";\r
+LaTeXColor["yelloworange"]   = "#FF9400";\r
+LaTeXColor["orange"]         = "#FF6321";\r
+LaTeXColor["burntorange"]    = "#FF7D00";\r
+LaTeXColor["bittersweet"]    = "#C20300";\r
+LaTeXColor["redorange"]      = "#FF3B21";\r
+LaTeXColor["mahogany"]       = "#A60000";\r
+LaTeXColor["maroon"]         = "#AD0000";\r
+LaTeXColor["brickred"]       = "#B80000";\r
+LaTeXColor["red"]            = "#FF0000";\r
+LaTeXColor["orangered"]      = "#FF0080";\r
+LaTeXColor["rubinered"]      = "#FF00DE";\r
+LaTeXColor["wildstrawberry"] = "#FF0A9C";\r
+LaTeXColor["salmon"]         = "#FF789E";\r
+LaTeXColor["carnationpink"]  = "#FF5EFF";\r
+LaTeXColor["magenta"]        = "#FF00FF";\r
+LaTeXColor["violetred"]      = "#FF30FF";\r
+LaTeXColor["rhodamine"]      = "#FF2EFF";\r
+LaTeXColor["mulberry"]       = "#A314FA";\r
+LaTeXColor["redviolet"]      = "#9600A8";\r
+LaTeXColor["fuchsia"]        = "#7303EB";\r
+LaTeXColor["lavender"]       = "#FF85FF";\r
+LaTeXColor["thistle"]        = "#E069FF";\r
+LaTeXColor["orchid"]         = "#AD5CFF";\r
+LaTeXColor["darkorchid"]     = "#9933CC";\r
+LaTeXColor["purple"]         = "#8C24FF";\r
+LaTeXColor["plum"]           = "#8000FF";\r
+LaTeXColor["violet"]         = "#361FFF";\r
+LaTeXColor["royalpurple"]    = "#401AFF";\r
+LaTeXColor["blueviolet"]     = "#1A0DF5";\r
+LaTeXColor["periwinkle"]     = "#6E73FF";\r
+LaTeXColor["cadetblue"]      = "#616EC4";\r
+LaTeXColor["cornflowerblue"] = "#59DEFF";\r
+LaTeXColor["midnightblue"]   = "#007091";\r
+LaTeXColor["navyblue"]       = "#0F75FF";\r
+LaTeXColor["royalblue"]      = "#0080FF";\r
+LaTeXColor["blue"]           = "#0000FF";\r
+LaTeXColor["cerulean"]       = "#0FE3FF";\r
+LaTeXColor["cyan"]           = "#00FFFF";\r
+LaTeXColor["processblue"]    = "#0AFFFF";\r
+LaTeXColor["skyblue"]        = "#61FFE0";\r
+LaTeXColor["turquoise"]      = "#26FFCC";\r
+LaTeXColor["tealblue"]       = "#1FFAA3";\r
+LaTeXColor["aquamarine"]     = "#2EFFB2";\r
+LaTeXColor["bluegreen"]      = "#26FFAB";\r
+LaTeXColor["emerald"]        = "#00FF80";\r
+LaTeXColor["junglegreen"]    = "#03FF7A";\r
+LaTeXColor["seagreen"]       = "#4FFF80";\r
+LaTeXColor["green"]          = "#00FF00";\r
+LaTeXColor["forestgreen"]    = "#00E000";\r
+LaTeXColor["pinegreen"]      = "#00BF29";\r
+LaTeXColor["limegreen"]      = "#80FF00";\r
+LaTeXColor["yellowgreen"]    = "#8FFF42";\r
+LaTeXColor["springgreen"]    = "#BDFF3D";\r
+LaTeXColor["olivegreen"]     = "#009900";\r
+LaTeXColor["rawsienna"]      = "#8C0000";\r
+LaTeXColor["sepia"]          = "#4D0000";\r
+LaTeXColor["brown"]          = "#660000";\r
+LaTeXColor["tan"]            = "#DB9470";\r
+LaTeXColor["gray"]           = "#808080";\r
+LaTeXColor["grey"]           = "#808080";\r
+LaTeXColor["black"]          = "#000000";\r
+LaTeXColor["white"]          = "#FFFFFF";\r
+\r
+var IsColorName = /^(?:greenyellow|yellow|goldenrod|dandelion|apricot|peach|melon|yelloworange|orange|burntorange|bittersweet|redorange|mahogany|maroon|brickred|red|orangered|rubinered|wildstrawberry|salmon|carnationpink|magenta|violetred|rhodamine|mulberry|redviolet|fuchsia|lavender|thistle|orchid|darkorchid|purple|plum|violet|royalpurple|blueviolet|periwinkle|cadetblue|cornflowerblue|midnightblue|navyblue|royalblue|blue|cerulean|cyan|processblue|skyblue|turquoise|tealblue|aquamarine|bluegreen|emerald|junglegreen|seagreen|green|forestgreen|pinegreen|limegreen|yellowgreen|springgreen|olivegreen|rawsienna|sepia|brown|tan|gray|grey|black|white)$/;\r
+var IsCounter =  /^(?:definition|proposition|lemma|theorem|corollary|example|exercise|subsection|subsubsection|figure|equation|table)$/ ;\r
+var IsLaTeXElement = /^(?:displayequation|title|author|address|date|abstract|keyword|section|subsection|subsubsection|ref|cite|thebibliography|definition|proposition|lemma|theorem|corollary|example|exercise|itemize|enumerate|enddefinition|endproposition|endlemma|endtheorem|endcorollary|endexample|endexercise|enditemize|endenumerate|