diff --git a/server.R b/server.R
new file mode 100644
index 0000000000000000000000000000000000000000..98ef58f9b4ac3da5dcc25a7c787a74a3daf03201
--- /dev/null
+++ b/server.R
@@ -0,0 +1,319 @@
+##########################################################################
+## ic Shiny/R app server.R                                              ##
+##                                                                      ##
+## Author Grégoire Vincke http://www.uclouvain.be/gregoire.vincke       ##
+## For Statistical eLearning Tools http://sites.uclouvain.be/selt/      ##
+##                                                                      ##
+## Licences : CC-BY for http://sites.uclouvain.be/selt/shiny/ic         ##
+##            GPL for source code on http://github.com                  ##
+##########################################################################
+
+Sys.setlocale("LC_ALL", "fr_FR.UTF-8")#to be sure that accents in text will be allowed in plots
+
+#initiate global counters
+  SP<-list()
+  SP$n.ic<-0
+  SP$n.ic.z.inc.mu<-0
+  SP$n.ic.z.noninc.mu<-0
+  SP$pc.ic.z.inc.mu<-0
+  SP$n.ic.t.inc.mu<-0
+  SP$n.ic.t.noninc.mu<-0
+  SP$pc.ic.t.inc.mu<-0
+  SP$l.n.ic<-list()
+  SP$l.pc.ic.z.inc.mu<-list()
+  SP$l.pc.ic.t.inc.mu<-list()
+
+
+shinyServer(function(input, output) {
+
+  # Create a reactiveValues object, to let us use settable reactive values
+  rv <- reactiveValues()
+  # To start out, lastAction == NULL, meaning nothing clicked yet
+  rv$lastAction <- 'none'
+  # An observe block for each button, to record that the action happened
+  observe({
+    if (input$takeech != 0) {
+      rv$lastAction <- 'takeech'
+    }
+  })
+  observe({
+    if (input$reset != 0) {
+      rv$lastAction <- 'reset'
+    }
+  })
+  
+  getech<-reactive({#créee n valeurs aléatoires N(0;1) quand input$takeech est implémenté (quand le bouton takeech est pressé)
+    #don't do anything until after the first button is pushed
+    if(input$takeech == 0)
+      return(NULL)
+      return(isolate({
+	#Now do the expensive stuff
+	rnorm(input$n)#créee n valeurs aléatoires N(0;1)
+      }))
+  })
+
+  getInputValues<-reactive({
+    v<-list()
+    v<-input #collect all inputs
+    return(v)
+  })
+  
+  getComputedValues<-reactive({
+    cv<-list()#created empty computed values list
+    v<-getInputValues() # get all values of input list
+    
+    
+    cv$sx.dech<-v$sx/sqrt(v$n)#ecart-type de la distribution d'échantillonnage
+    cv$vx<-v$sx^2
+    cv$vx.dech<-cv$sx.dech^2
+    
+    #Calcul de la densité maximale entre la distribution d'origine et celle d'échantillonnage
+    cv$dmx<-dnorm(v$mx,mean=v$mx,sd=v$sx)
+    cv$dmx.dech<-dnorm(v$mx,mean=v$mx,sd=cv$sx.dech)
+    if(v$seedech){
+      cv$maxdmx<-max(cv$dmx,cv$dmx.dech)
+    } else {
+      cv$maxdmx<-cv$dmx
+    }    
+    cv$yaxislim<-cv$maxdmx+(cv$maxdmx*0.2)
+    
+    # Calcul des valeurs des X pour tracer les polygones des distributions
+    z<-seq(-5,5,length=100)
+    cv$xr<-(z*v$sx)+v$mx #x pour tracer la distribution "réalité"
+    cv$xr.dech<-(z*cv$sx.dech)+v$mx #x pour tracer la distribution d'échantillonnage
+
+    cv$yr<-dnorm(cv$xr,mean=v$mx,sd=v$sx)
+    cv$yr.dech<-dnorm(cv$xr.dech,mean=v$mx,sd=cv$sx.dech)
+    
+    # Tout ce qui est relatif à l'échantillon aléatoire prélevé dans la réalité
+    cv$ech.z<-getech()#créee n valeurs aléatoires N(0;1) quand input$takeech est implémenté (quand le bouton takeech est pressé)
+    if (rv$lastAction=='reset') {
+      cv$ech.z<-NULL
+      SP$n.ic<<-0
+      SP$n.ic.z.inc.mu<<-0
+      SP$n.ic.z.noninc.mu<<-0
+      SP$pc.ic.z.inc.mu<<-0
+      SP$n.ic.t.inc.mu<<-0
+      SP$n.ic.t.noninc.mu<<-0
+      SP$pc.ic.t.inc.mu<<-0
+      SP$l.n.ic<<-list()
+      SP$l.pc.ic.z.inc.mu<<-list()
+      SP$l.pc.ic.t.inc.mu<<-list()
+
+    }
+    cv$ech.exist<-length(cv$ech.z)#ne pas prendre n mais calculer le nombre de valeurs dans l'échantillon juste pour s'assurer qu'un échantillon a été créé = le bouton action a été poussé
+    cv$ech.x<-(cv$ech.z*v$sx)+v$mx
+    if(cv$ech.exist){
+      cv$ech.m<-mean(cv$ech.x)
+      cv$ech.sd<-sd(cv$ech.x)
+      cv$ech.m.z<-(cv$ech.m-v$mx)/v$sx
+      cv$ech.m.z.dech<-(cv$ech.m-v$mx)/cv$sx.dech
+      cv$ech.m.pvalue<-signif(1-pnorm(cv$ech.m.z),2)
+      cv$ech.m.pvalue.dech<-signif(1-pnorm(cv$ech.m.z.dech),2)
+      
+      if(cv$ech.m.pvalue<0.001){
+	cv$ech.m.pvalue.text<-" <0.001"
+      } else {
+	cv$ech.m.pvalue.text<-cv$ech.m.pvalue
+      }
+      if(cv$ech.m.pvalue.dech<0.001){
+	cv$ech.m.pvalue.dech.text<-" <0.001"
+      } else {
+	cv$ech.m.pvalue.dech.text<-cv$ech.m.pvalue.dech
+      }
+      cv$ech.y.value<-0.30
+      cv$ech.y<-seq(cv$ech.y.value,cv$ech.y.value,length=cv$ech.exist)#liste des coordonnées y des points de l'échantillon
+          
+      # Tout ce qui est relatif à la puissance, confiance, alpha, et beta
+      cv$alpha<-round(1-v$confidence,3)
+      cv$alpha.z<-round(qnorm(v$confidence),3)
+      cv$alpha.x<-(cv$alpha.z*v$sx)+v$mx
+      cv$alpha.y<-dnorm(cv$alpha.x, mean=v$mx, sd=v$sx)
+      
+      cv$alpha.z.polygon<-seq(cv$alpha.z,5,length=100)
+      cv$alpha.x.polygon<-(cv$alpha.z.polygon*v$sx)+v$mx
+      cv$alpha.y.polygon<-dnorm(cv$alpha.x.polygon,mean=v$mx,sd=v$sx)
+      
+      cv$confidence.z.polygon<-seq(-5,cv$alpha.z,length=100)
+      cv$confidence.x.polygon<-(cv$confidence.z.polygon*v$sx)+v$mx
+      cv$confidence.y.polygon<-dnorm(cv$confidence.x.polygon,mean=v$mx,sd=v$sx)
+      
+      #Tout ce qui est relatif à l'IC àa la moyennes    
+      cv$ic.z<-qnorm(1-cv$alpha/2)
+      cv$ic.t<-qt(1-cv$alpha/2,v$n-1)
+      cv$ic.z.limit.inf<-mean(cv$ech.x)-cv$ic.z*cv$sx.dech
+      cv$ic.z.limit.sup<-mean(cv$ech.x)+cv$ic.z*cv$sx.dech
+      cv$ic.t.limit.inf<-mean(cv$ech.x)-cv$ic.t*(cv$ech.sd/sqrt(v$n))
+      cv$ic.t.limit.sup<-mean(cv$ech.x)+cv$ic.t*(cv$ech.sd/sqrt(v$n))
+      
+      SP$n.ic<<-SP$n.ic+1
+      if(v$mx >= cv$ic.z.limit.inf && v$mx <= cv$ic.z.limit.sup){
+	SP$n.ic.z.inc.mu<<-SP$n.ic.z.inc.mu+1
+	cv$ic.z.color<-rgb(0,0.7,0,0.5)#'lightgreen'
+	cv$ic.z.density<-10
+      } else {
+	SP$n.ic.z.noninc.mu<<-SP$n.ic.z.noninc.mu+1
+	cv$ic.z.color<-rgb(1,0,0,0.5)#'indianred1'
+	cv$ic.z.density<-25
+      }
+      if(v$mx >= cv$ic.t.limit.inf && v$mx <= cv$ic.t.limit.sup){
+	SP$n.ic.t.inc.mu<<-SP$n.ic.t.inc.mu+1
+	cv$ic.t.color<-rgb(0,0.7,0,0.5)#'lightgreen'
+	cv$ic.t.density<-10
+      } else {
+	SP$n.ic.t.noninc.mu<<-SP$n.ic.t.noninc.mu+1
+	cv$ic.t.color<-rgb(1,0,0,0.5)#'indianred1'
+	cv$ic.t.density<-25
+      }
+      SP$pc.ic.z.inc.mu<<-round(SP$n.ic.z.inc.mu/SP$n.ic,4)
+      SP$pc.ic.t.inc.mu<<-round(SP$n.ic.t.inc.mu/SP$n.ic,4)
+      SP$l.n.ic<<-c(SP$l.n.ic,list(SP$n.ic))
+      SP$l.pc.ic.z.inc.mu<<-c(SP$l.pc.ic.z.inc.mu,list(SP$pc.ic.z.inc.mu))
+      SP$l.pc.ic.t.inc.mu<<-c(SP$l.pc.ic.t.inc.mu,list(SP$pc.ic.t.inc.mu))
+
+    }
+    
+    return(cv)
+    })
+    
+  output$plotReality <- renderPlot({
+    v<-getInputValues()
+    cv<-getComputedValues()
+    #par(mfrow=c(3,1))
+    ##################
+    ## Plot Reality ##
+    ##################
+    par(mai=c(0.5,1,0.2,1))
+    plot(c(0),c(0),type="l",lty=1,lwd=1,col="black",yaxt="n",bty="n",las=1,xaxs="i",yaxs="i",cex.lab=1,cex.axis=1,xlim=c(0,100),ylim=c(0,cv$yaxislim),ylab="density",xlab="",xaxp=c(0,100,20)) #trace une courbe a partir de tous les couples x;y, et la colore en rouge. bty : A character string which determined the type of box which is drawn about plots. If bty is one of "o" (the default), "l", "7", "c", "u", or "]" the resulting box resembles the corresponding upper case letter. A value of "n" suppresses the box. xaxt="n" = pas dessiner axe des x
+    
+    if(v$seedor){
+      polygon(cv$xr,cv$yr)
+      text(0,signif(cv$maxdmx,1)*0.9,labels=bquote(paste("Distribution d'origine :" ,sep='')),cex=1, pos=4)
+      lines(x<-c(1,3),y <- c(signif(cv$maxdmx,1)*0.825,signif(cv$maxdmx,1)*0.825),lty=1,type="l",col="black")
+      text(3,signif(cv$maxdmx,1)*0.8,labels=bquote(paste(N *"~"* ( mu *","* sigma^2 ) ," ", N *"~"* (.(v$mx)*","*.(cv$vx)) ,sep='')),cex=1, pos=4)
+    }
+    if(v$seedech){
+      polygon(c(-5,cv$xr.dech),c(0,cv$yr.dech),lty=3)
+      text(0,signif(cv$maxdmx,1)*0.5,labels=bquote(paste("Distribution d'échantillonnage : ",sep='')),cex=1, pos=4)
+      lines(x<-c(1,3),y <- c(signif(cv$maxdmx,1)*0.375,signif(cv$maxdmx,1)*0.375),lty=3,type="l",col="black")
+      text(3,signif(cv$maxdmx,1)*0.35,labels=bquote(paste(N *"~"* ( mu *","* frac(sigma^2,n) ) ," ", N *"~"* (.(v$mx)*","*.(signif(cv$vx/v$n,2))) ,sep='')),cex=1, pos=4)
+    }
+    axis(2,las=2,yaxp=c(0,signif(cv$maxdmx,1),4))
+
+    if(v$seemu){
+      lines(x<-c(v$mx,v$mx),y <- c(0,cv$maxdmx),lty=1,lwd=1)
+      text(v$mx,cv$maxdmx*1.05,labels=bquote(mu),cex=1)
+    }
+
+    if(cv$ech.exist){
+      #points(cv$ech.x,cv$ech.y)
+      m.ech.z.y.delta<-0.7#1.05
+      m.ech.t.y.delta<-0.35#1.05
+      rug(cv$ech.x,lwd=2)
+      text(cv$ech.m,cv$maxdmx*1.05,labels=bquote(bar(x)),cex=1)#,pos=2
+      lines(x<-c(cv$ech.m,cv$ech.m),y <- c(0,cv$maxdmx),lty=2,lwd=1)
+      
+      if(v$seeicvarknown){
+	text(99,cv$maxdmx*m.ech.z.y.delta,labels=bquote(paste("IC",.(v$confidence*100)," pour ",sigma^2," connue : [",.(round(cv$ic.z.limit.inf,2)),";",.(round(cv$ic.z.limit.sup,2)),"]",sep="")),cex=1,pos=2)
+	text(99,cv$maxdmx*m.ech.z.y.delta*0.75,labels=bquote(paste("%IC couvrant ",mu," = ",frac(.(SP$n.ic.z.inc.mu),.(SP$n.ic))," = ",.(SP$pc.ic.z.inc.mu*100),"%",sep="")),cex=1,pos=2)
+	polygon(c(cv$ic.z.limit.inf,cv$ic.z.limit.inf,cv$ic.z.limit.sup,cv$ic.z.limit.sup),c(cv$maxdmx*m.ech.z.y.delta+cv$maxdmx*m.ech.z.y.delta*-0.1,cv$maxdmx*m.ech.z.y.delta+cv$maxdmx*m.ech.z.y.delta*0.1,cv$maxdmx*m.ech.z.y.delta+cv$maxdmx*m.ech.z.y.delta*0.1,cv$maxdmx*m.ech.z.y.delta+cv$maxdmx*m.ech.z.y.delta*-0.1),col=cv$ic.z.color)#,density=cv$ic.z.density
+	text(cv$ech.m,cv$maxdmx*m.ech.z.y.delta,labels=bquote(bar(x)),cex=1)#,pos=2
+	lines(x<-c(cv$ech.m,cv$ech.m),y <- c(0,cv$maxdmx*m.ech.z.y.delta),lty=2,lwd=1)
+	if(v$seeiconx){
+	  lines(x<-c(cv$ic.z.limit.inf,cv$ic.z.limit.inf),y <- c(0,cv$maxdmx*m.ech.z.y.delta),lty=4,lwd=1)
+	  lines(x<-c(cv$ic.z.limit.sup,cv$ic.z.limit.sup),y <- c(0,cv$maxdmx*m.ech.z.y.delta),lty=4,lwd=1)
+	}
+	text(cv$ic.z.limit.inf,cv$maxdmx*m.ech.z.y.delta,labels="[",cex=2)#col=cv$ic.z.color
+	text(cv$ic.z.limit.sup,cv$maxdmx*m.ech.z.y.delta,labels="]",cex=2)#,col=cv$ic.z.color2
+	lines(x<-c(cv$ic.z.limit.inf,cv$ech.m-1),y <- c(cv$maxdmx*m.ech.z.y.delta,cv$maxdmx*m.ech.z.y.delta),lwd=2,lty=2)
+	lines(x<-c(cv$ech.m+1,cv$ic.z.limit.sup),y <- c(cv$maxdmx*m.ech.z.y.delta,cv$maxdmx*m.ech.z.y.delta),lwd=2,lty=2)
+	
+      }
+      if(v$seeicvarunknown){
+	text(99,cv$maxdmx*m.ech.t.y.delta,labels=bquote(paste("IC",.(v$confidence*100)," pour ",sigma^2," inconnue : [",.(round(cv$ic.t.limit.inf,2)),";",.(round(cv$ic.t.limit.sup,2)),"]",sep="")),cex=1,pos=2)
+	text(99,cv$maxdmx*m.ech.t.y.delta*0.5,labels=bquote(paste("%IC couvrant ",mu," = ",frac(.(SP$n.ic.t.inc.mu),.(SP$n.ic))," = ",.(SP$pc.ic.t.inc.mu*100),"%",sep="")),cex=1,pos=2)
+	polygon(c(cv$ic.t.limit.inf,cv$ic.t.limit.inf,cv$ic.t.limit.sup,cv$ic.t.limit.sup),c(cv$maxdmx*m.ech.t.y.delta+cv$maxdmx*m.ech.z.y.delta*-0.1,cv$maxdmx*m.ech.t.y.delta+cv$maxdmx*m.ech.z.y.delta*0.1,cv$maxdmx*m.ech.t.y.delta+cv$maxdmx*m.ech.z.y.delta*0.1,cv$maxdmx*m.ech.t.y.delta+cv$maxdmx*m.ech.z.y.delta*-0.1),col=cv$ic.t.color)#,density=cv$ic.t.density
+	text(cv$ech.m,cv$maxdmx*m.ech.t.y.delta,labels=bquote(bar(x)),cex=1)#,pos=2
+	lines(x<-c(cv$ech.m,cv$ech.m),y <- c(0,cv$maxdmx*m.ech.t.y.delta),lty=2,lwd=1)
+	if(v$seeiconx){
+	  lines(x<-c(cv$ic.t.limit.inf,cv$ic.t.limit.inf),y <- c(0,cv$maxdmx*m.ech.t.y.delta),lty=4,lwd=1)
+	  lines(x<-c(cv$ic.t.limit.sup,cv$ic.t.limit.sup),y <- c(0,cv$maxdmx*m.ech.t.y.delta),lty=4,lwd=1)
+	}
+	text(cv$ic.t.limit.inf,cv$maxdmx*m.ech.t.y.delta,labels="[",cex=2)#,pos=2,col=cv$ic.z.color
+	text(cv$ic.t.limit.sup,cv$maxdmx*m.ech.t.y.delta,labels="]",cex=2)#,pos=2,col=cv$ic.z.color
+	lines(x<-c(cv$ic.t.limit.inf,cv$ech.m-1),y <- c(cv$maxdmx*m.ech.t.y.delta,cv$maxdmx*m.ech.t.y.delta),lwd=2,lty=2)
+	lines(x<-c(cv$ech.m+1,cv$ic.t.limit.sup),y <- c(cv$maxdmx*m.ech.t.y.delta,cv$maxdmx*m.ech.t.y.delta),lwd=2,lty=2)
+	
+      }
+     } 
+
+    }, height = 250)
+
+
+  output$plotSample <- renderPlot({
+    v<-getInputValues()
+    cv<-getComputedValues()
+    #par(mfrow=c(3,1))
+    #par(mai=c(0.2,1,0.2,1))
+ 
+     if(cv$ech.exist){
+      ########################
+      ## Plot sample values ##
+      ########################
+      values.labels.y<-0.55
+      values.lines.y<-0.625
+      par(mai=c(0,1,0,1),bty="n")#,pin=c(11,0.3)
+      plot(cv$ech.x,cv$ech.y,pch=23,cex=1,lty=2,lwd=1,col="black",bty="n",las=1,xaxs="i",yaxs="i",cex.lab=1,cex.axis=1,xlim=c(0,100),ylim=c(0,0.50),ylab="",xlab="",xaxp=c(0,100,20), xaxt="n", yaxt="n") #trace une courbe a partir de tous les couples 
+      #axis(2,las=2,yaxp=c(0,0.40,4))
+      text(1,cv$ech.y.value,labels="Echantillon",cex=1,pos=4)
+      text(99,cv$ech.y.value,labels=bquote(bar(x) == .(round(cv$ech.m,2))),cex=1.25,pos=2)
+#      text(cv$ech.m,cv$ech.y.value+0.10,labels=bquote(bar(x)),cex=1)#,pos=2
+#      text(cv$ic.z.limit.inf,cv$ech.y.value+0.10,labels="[",cex=1)#,pos=2
+#      text(cv$ic.z.limit.sup,cv$ech.y.value+0.10,labels="]",cex=1)#,pos=2
+#      lines(x<-c(cv$ic.z.limit.inf,cv$ech.m-1),y <- c(cv$ech.y.value+0.10,cv$ech.y.value+0.10),lwd=0.5)#lty=4,
+#      lines(x<-c(cv$ech.m+1,cv$ic.z.limit.sup),y <- c(cv$ech.y.value+0.10,cv$ech.y.value+0.10),lwd=0.5)#lty=4,
+      #lines(x<-c(cv$ic.z.limit.sup,cv$ic.z.limit.sup),y <- c(cv$ech.y+0.15,0.5),lty=4,lwd=1)
+      boxplot(cv$ech.x,horizontal = TRUE,add = TRUE,at = 0.1, boxwex = 0.3, xaxt="n", yaxt="n")#, xaxt="n", yaxt="n"
+    }
+    }, height = 50)
+    
+  output$plotPercent<- renderPlot({
+    v<-getInputValues()
+    cv<-getComputedValues()
+    if(v$seeicpcevolution){
+      ###########################
+      ## Plot % IC including µ ##
+      ###########################
+      if(cv$ech.exist){
+	if(SP$n.ic<20){
+	  SP$n.ic.lim<-20
+	} else {
+	  SP$n.ic.lim<-SP$n.ic
+	}
+      } else {
+	SP$l.n.ic<-c(0)
+	SP$n.ic.lim<-20
+	SP$l.pc.ic.z.inc.mu<-c(0)
+	SP$l.pc.ic.t.inc.mu<-c(0)
+      }
+     
+      par(mai=c(0.5,1,0.2,1))
+      plot(SP$l.n.ic,SP$l.pc.ic.z.inc.mu,type="l",lwd=1,col="black",yaxt="n",bty="n",las=1,xaxs="i",yaxs="i",cex.lab=1,cex.axis=1,ylim=c(0,1),ylab=bquote(paste("%IC couvrant ",mu,sep="")),xlab="",xaxp=c(0,SP$n.ic.lim,SP$n.ic.lim),xlim=c(0,SP$n.ic.lim))#xlim=c(0,100),xaxp=c(0,100,20),type="l",
+      axis(2,las=2,yaxp=c(0,1,2))
+      
+      lines(x<-c(0,SP$n.ic.lim),y <- c(v$confidence,v$confidence),lty=3)
+      text(SP$n.ic.lim*0.01,v$confidence*0.95,expression(1-alpha),pos=4)
+      #legend(1,0.25,c(bquote(paste("%IC couvrant ",mu," quand ",sigma^2," est connue ",sep="")),bquote(paste("%IC couvrant ",mu," quand ",sigma^2," est inconnue ",sep=""))))
+      text(SP$n.ic.lim*0.05,0.20,labels=bquote(paste(sigma^2," connue ",sep="")),cex=1,pos=4)#"%IC couvrant ",mu," quand ",
+      lines(x<-c(SP$n.ic.lim*0.01,SP$n.ic.lim*0.04),y <- c(0.20,0.20),lty=1,type="l",col="black",lwd=1,las=1)
+      if(v$seeicvarunknown){
+	lines(SP$l.n.ic,SP$l.pc.ic.t.inc.mu,type="l", lwd=1,lty=2)
+
+	text(SP$n.ic.lim*0.05,0.10,labels=bquote(paste(sigma^2," inconnue ",sep="")),cex=1,pos=4)#"%IC couvrant ",mu," quand ",
+	lines(x<-c(SP$n.ic.lim*0.01,SP$n.ic.lim*0.04),y <- c(0.10,0.10),lty=2,type="l",col="black",lwd=1)
+      }
+    }
+  }, height = 250)
+
+})
+