Avec l’évolution de la technologie et la complexité croissante des
expériences en laboratoire, liées notamment au grand nombre de variables
mises en jeu dans les procédés industriels (comme la mise en place des
machines ou des outils), il devient nécessaire de recourir à des
méthodes permettant d’obtenir des résultats fiables et de qualité pour
faire des expériences.
La méthode des plans d’expériences consiste à « obtenir un
maximum d’informations avec un minimum d’expériences ». En effet,
réduire le nombre d’essais permet de gagner du temps et d’améliorer la
productivité.
Quelques définitions utiles :
Réponse : variable à expliquer.
Facteur : variable explicative qui peut être
modifiée sans difficulté.Les facteurs peuvent être quantitatifs ou
qualitatifs (ces derniers pouvant être transformés à l’aide d’un codage
approprié).
Niveaux : modalités prises par une variable
qualitative.
Domaine expérimental : c’est un sous-ensemble
dans lequel il est possible de réaliser une expérience. Pour le définir,
il faut croiser les différentes plages de variation des facteurs.
Exemple : si l’on considère la pression, la température, le domaine
expériementale c’est l’air du rectangle.
plot(c(30, 70), c(1, 10), type = "n", xlab = "Pression", ylab = "Température",main = "Domaine expérimental" )
# Puis ajouter le rectangle
rect(xleft=40, xright=60, ytop=2,ybottom = 8, border = "black",col = "pink")
points(c(40,40,60,60), c(8,2,2,8), pch=21, bg="black", cex=1.5)

Notion de plan d’expérience Si l’on souhaite
étudier un problème qui dépend de 4 facteurs, chacun ayant 4 niveaux,
une approche naïve consisterait à tester toutes les combinaisons
possibles, soit
4^4
expériences. Économiquement, cette option est rarement
envisageable.
Une autre technique est celle dite u>« un facteur à la
fois », qui consiste à faire varier chaque facteur
séparément en lui attribuant toutes ses modalités possibles. Cependant,
cette méthode présente plusieurs inconvénients:
elle masque les éventuels effets d’interaction entre plusieurs
facteurs,
le choix des niveaux des facteurs maintenus constants est arbitraire,
ce qui peut influencer la qualité des résultats obtenus,
le plan d’expérience risque d’être déséquilibré, certains niveaux
étant plus représentés que d’autres.
Technique d’un sous-ensemble quelconque
d’expériences»
Elle consiste à déterminer de manière aléatoire un sous-ensemble
d’expériences.
Inconvénients de cette méthode :
Risque de sélectionner des expériences qui ne permettent pas
d’estimer tous les paramètres inconnus du modèle.
Même si tous les paramètres inconnus sont estimés, la qualité du
modèle peut être loin d’être optimale.
Bon astuce:
la configuration doit être équilibrée,c’est à dire que chaque niveau
doit apparaître le même nombre de fois pour chaque facteur,
les facteurs doivent être linéairement indépendants (c’est-à-dire non
liés entre eux).
Codage des facteurs
Le codage des facteurs est important car il permet de :
comparer plus facilement la variation de chaque facteur en les
ramenant dans un même intervalle,
simplifier les calculs.
On effectue alors un changement de variable pour ramener les valeurs
dans l’intervalle [−1,+1]. Pour un facteur x défini sur l’intervalle
[a,b], le codage est : (2*x+(a+b))/(b-a)
Exemple Lien vers l’énoncé.
Réponses aux questions:
On peut proposé codage suivant
# Exemple : vecteur de valeurs
valeurs <- c(22,28,29,30)
# Définition de la fonction
codage <- function(X) {
res <- round((2*X - (max(X) + min(X))) / (max(X) - min(X)),2)
res
}
codage(valeurs)
[1] -1.00 0.50 0.75 1.00
Nous allons appliquer la fonction de codage définie précédemment sur
deux stratégies de températures (stratégie 1 et stratégie 2).
#stratégie1
s1 <- c(22,28,29,30)
#stratégie2
s2 <- c(20,24,26,30)
#on va cooder ces températeur en dégre
ss1 <- codage(s1)
ss2 <- codage(s2)
ss1
[1] -1.00 0.50 0.75 1.00
ss2
[1] -1.0 -0.2 0.2 1.0
La question est de justifier la meilleur strategie.
Pour cela, posons les matrices du modèle, avec pour X1 et X2 les deux
stratégies respectives
#on fait les deux matrices
X1 <- matrix(c(rep(1, length(s1)), ss1), nrow = length(ss1), ncol = 2)
colnames(X1) <- c("col1", "col2")
X2 <- matrix(c(rep(1,length(s2)),ss2),nrow = length(ss2),ncol = 2)
X1
col1 col2
[1,] 1 -1.00
[2,] 1 0.50
[3,] 1 0.75
[4,] 1 1.00
X2
[,1] [,2]
[1,] 1 -1.0
[2,] 1 -0.2
[3,] 1 0.2
[4,] 1 1.0
Nous allons essayer d’estimer les paramètres du modèle, même si nous
n’avons pas la réponse
#on calcul l'inverse de (tX1 * X1)
invX1 <- solve(t(X1) %*% X1)
# pour le segon
invX2 <- solve(t(X2) %*% X2)
round( invX1, 4)
col1 col2
col1 0.2903 -0.1290
col2 -0.1290 0.4129
round(invX2, 4)
[,1] [,2]
[1,] 0.25 0.0000
[2,] 0.00 0.4808
# pour afficher proprement (arrondir pour affichage seulement)
Nous devons trouver la qualité de l’ajustement. Dans notre cas ici,
sigma_2 n’est pas intéressant pour juger stratégie, car c’est le même
pour l’échantillon.
Qualité de la réponse moyenne prédite, Y^ =
sigma2.tg(x).(tX.X)-1.g(x) , avec g(x) le vecteur de
regresssion
#la variance y_ est une fonction du 2 degreee
x <- runif(20,min=-4,max = 4)
ma_fonction1 <- function(x){
0.29 -0.260*x +0.41*x^2
}
ma_fonction2 <- function(x){
0.25 +0.481*x^2
}
curve(ma_fonction1, from = -4, to = 4,
col = "blue", lwd = 2,
main = "Comparaison des deux fonctions",
xlab = "x", ylab = "y")#,labels="Première strategie"
# Ajouter la deuxième fonction
curve(ma_fonction2, from = -4, to = 4,
col = "red", lwd = 2, add = TRUE)
# Polygone pour colorier l'aire sous la courbe
x_fill <- seq(-1, 1, length.out = 200)
y_fill <- ma_fonction1(x_fill)
polygon(c(-1, x_fill, 1), c(0, y_fill, 0),
col = rgb(1, 0, 0, 0.3), border = NA)
# Ajouter les bornes
abline(v = c(-1, 1), lty = 2)

NA
NA
NA
NA
On va s’intéresser à la variance moyenne de production sur [-1,+1] il
s’agit de trouver l’air sous la courbe pour chaque fonction
I1 <- integrate(ma_fonction1, lower = -1, upper = 1)
I2 <- integrate(ma_fonction2, lower = -1, upper = 1)
La variance moyenne predite sur [-1,1] de la deuxième stratégie est
plus petite que celle de la première stratégie car:
I2$value-I1$value
[1] -0.03266667
En conclusion, l’analyse comparative basée sur la modélisation
linéaire des données normalisées démontre que la stratégie 2 est
significativement plus efficace que la stratégie 1
LS0tDQp0aXRsZTogPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+I0xlcyBwbGFucyBkJ2V4cMOpcmllbmNlPC9zcGFuPg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiAgDQpBdmVjIGzigJnDqXZvbHV0aW9uIGRlIGxhIHRlY2hub2xvZ2llIGV0IGxhIGNvbXBsZXhpdMOpIGNyb2lzc2FudGUgZGVzIGV4cMOpcmllbmNlcyBlbiBsYWJvcmF0b2lyZSwgbGnDqWVzIG5vdGFtbWVudCBhdSBncmFuZCBub21icmUgZGUgdmFyaWFibGVzIG1pc2VzIGVuIGpldSBkYW5zIGxlcyBwcm9jw6lkw6lzIGluZHVzdHJpZWxzIChjb21tZSBsYSBtaXNlIGVuIHBsYWNlIGRlcyBtYWNoaW5lcyBvdSBkZXMgb3V0aWxzKSwgaWwgZGV2aWVudCBuw6ljZXNzYWlyZSBkZSByZWNvdXJpciDDoCBkZXMgbcOpdGhvZGVzIHBlcm1ldHRhbnQgZOKAmW9idGVuaXIgZGVzIHLDqXN1bHRhdHMgZmlhYmxlcyBldCBkZSBxdWFsaXTDqSBwb3VyIGZhaXJlIGRlcyBleHDDqXJpZW5jZXMuDQoNCkxhIG3DqXRob2RlIGRlcyBwbGFucyBk4oCZZXhww6lyaWVuY2VzIGNvbnNpc3RlIMOgICrCqyBvYnRlbmlyIHVuIG1heGltdW0gZOKAmWluZm9ybWF0aW9ucyBhdmVjIHVuIG1pbmltdW0gZOKAmWV4cMOpcmllbmNlcyDCuyouIA0KRW4gZWZmZXQsIHLDqWR1aXJlIGxlIG5vbWJyZSBk4oCZZXNzYWlzIHBlcm1ldCBkZSBnYWduZXIgZHUgdGVtcHMgZXQgZOKAmWFtw6lsaW9yZXIgbGEgcHJvZHVjdGl2aXTDqS4NCg0KPHU+KipRdWVscXVlcyBkw6lmaW5pdGlvbnMgdXRpbGVzKio8L3U+IDoNCg0KKipSw6lwb25zZSoqIDogdmFyaWFibGUgw6AgZXhwbGlxdWVyLg0KDQoqKkZhY3RldXIqKiA6IHZhcmlhYmxlIGV4cGxpY2F0aXZlIHF1aSBwZXV0IMOqdHJlIG1vZGlmacOpZSBzYW5zIGRpZmZpY3VsdMOpLkxlcyBmYWN0ZXVycyBwZXV2ZW50IMOqdHJlIHF1YW50aXRhdGlmcyBvdSBxdWFsaXRhdGlmcyAoY2VzIGRlcm5pZXJzIHBvdXZhbnQgw6p0cmUgdHJhbnNmb3Jtw6lzIMOgIGzigJlhaWRlIGTigJl1biBjb2RhZ2UgYXBwcm9wcmnDqSkuDQoNCioqTml2ZWF1eCoqIDogbW9kYWxpdMOpcyBwcmlzZXMgcGFyIHVuZSB2YXJpYWJsZSBxdWFsaXRhdGl2ZS4NCg0KPHU+KipEb21haW5lIGV4cMOpcmltZW50YWwqKjwvdT4gOiBj4oCZZXN0IHVuIHNvdXMtZW5zZW1ibGUgZGFucyBsZXF1ZWwgaWwgZXN0IHBvc3NpYmxlIGRlIHLDqWFsaXNlciB1bmUgZXhww6lyaWVuY2UuIFBvdXIgbGUgZMOpZmluaXIsIGlsIGZhdXQgY3JvaXNlciBsZXMgZGlmZsOpcmVudGVzIHBsYWdlcyBkZSB2YXJpYXRpb24gZGVzIGZhY3RldXJzLg0KRXhlbXBsZSA6IHNpIGzigJlvbiBjb25zaWTDqHJlIGxhIHByZXNzaW9uLCBsYSB0ZW1ww6lyYXR1cmUsIGxlIGRvbWFpbmUgZXhww6lyaWVtZW50YWxlIGMnZXN0IGwnYWlyIGR1IHJlY3RhbmdsZS4gDQpgYGB7cn0NCnBsb3QoYygzMCwgNzApLCBjKDEsIDEwKSwgdHlwZSA9ICJuIiwgeGxhYiA9ICJQcmVzc2lvbiIsIHlsYWIgPSAiVGVtcMOpcmF0dXJlIixtYWluID0gIkRvbWFpbmUgZXhww6lyaW1lbnRhbCIgKQ0KIyBQdWlzIGFqb3V0ZXIgbGUgcmVjdGFuZ2xlDQpyZWN0KHhsZWZ0PTQwLCB4cmlnaHQ9NjAsIHl0b3A9Mix5Ym90dG9tID0gIDgsIGJvcmRlciA9ICJibGFjayIsY29sID0gInBpbmsiKQ0KcG9pbnRzKGMoNDAsNDAsNjAsNjApLCBjKDgsMiwyLDgpLCBwY2g9MjEsIGJnPSJibGFjayIsIGNleD0xLjUpDQoNCmBgYA0KPHU+KipOb3Rpb24gZGUgcGxhbiBk4oCZZXhww6lyaWVuY2UqKjwvdT4NClNpIGzigJlvbiBzb3VoYWl0ZSDDqXR1ZGllciB1biBwcm9ibMOobWUgcXVpIGTDqXBlbmQgZGUgNCBmYWN0ZXVycywgY2hhY3VuIGF5YW50IDQgbml2ZWF1eCwgdW5lIGFwcHJvY2hlIG5hw692ZSBjb25zaXN0ZXJhaXQgw6AgdGVzdGVyIHRvdXRlcyBsZXMgY29tYmluYWlzb25zIHBvc3NpYmxlcywgc29pdCANCmBgYHtyfQ0KNF40DQpgYGANCmV4cMOpcmllbmNlcy4gw4ljb25vbWlxdWVtZW50LCBjZXR0ZSBvcHRpb24gZXN0IHJhcmVtZW50IGVudmlzYWdlYWJsZS4NCg0KVW5lIGF1dHJlIHRlY2huaXF1ZSBlc3QgY2VsbGUgZGl0ZSB1PioqwqsgdW4gZmFjdGV1ciDDoCBsYSBmb2lzIMK7Kio8L3U+LCBxdWkgY29uc2lzdGUgw6AgZmFpcmUgdmFyaWVyIGNoYXF1ZSBmYWN0ZXVyIHPDqXBhcsOpbWVudCBlbiBsdWkgYXR0cmlidWFudCB0b3V0ZXMgc2VzIG1vZGFsaXTDqXMgcG9zc2libGVzLg0KQ2VwZW5kYW50LCBjZXR0ZSBtw6l0aG9kZSBwcsOpc2VudGUgcGx1c2lldXJzIGluY29udsOpbmllbnRzOg0KDQplbGxlIG1hc3F1ZSBsZXMgw6l2ZW50dWVscyBlZmZldHMgZOKAmWludGVyYWN0aW9uIGVudHJlIHBsdXNpZXVycyBmYWN0ZXVycywNCg0KbGUgY2hvaXggZGVzIG5pdmVhdXggZGVzIGZhY3RldXJzIG1haW50ZW51cyBjb25zdGFudHMgZXN0IGFyYml0cmFpcmUsIGNlIHF1aSBwZXV0IGluZmx1ZW5jZXIgbGEgcXVhbGl0w6kgZGVzIHLDqXN1bHRhdHMgb2J0ZW51cywNCg0KbGUgcGxhbiBk4oCZZXhww6lyaWVuY2UgcmlzcXVlIGTigJnDqnRyZSBkw6lzw6lxdWlsaWJyw6ksIGNlcnRhaW5zIG5pdmVhdXggw6l0YW50IHBsdXMgcmVwcsOpc2VudMOpcyBxdWUgZOKAmWF1dHJlcy4NCg0KDQo8dT4qKlRlY2huaXF1ZSBk4oCZdW4gc291cy1lbnNlbWJsZSBxdWVsY29ucXVlIGTigJlleHDDqXJpZW5jZXPCuyoqPC91Pg0KDQpFbGxlIGNvbnNpc3RlIMOgIGTDqXRlcm1pbmVyIGRlIG1hbmnDqHJlIGFsw6lhdG9pcmUgdW4gc291cy1lbnNlbWJsZSBk4oCZZXhww6lyaWVuY2VzLg0KDQpJbmNvbnbDqW5pZW50cyBkZSBjZXR0ZSBtw6l0aG9kZSA6DQoNClJpc3F1ZSBkZSBzw6lsZWN0aW9ubmVyIGRlcyBleHDDqXJpZW5jZXMgcXVpIG5lIHBlcm1ldHRlbnQgcGFzIGTigJllc3RpbWVyIHRvdXMgbGVzIHBhcmFtw6h0cmVzIGluY29ubnVzIGR1IG1vZMOobGUuDQoNCk3Dqm1lIHNpIHRvdXMgbGVzIHBhcmFtw6h0cmVzIGluY29ubnVzIHNvbnQgZXN0aW3DqXMsIGxhIHF1YWxpdMOpIGR1IG1vZMOobGUgcGV1dCDDqnRyZSBsb2luIGTigJnDqnRyZSBvcHRpbWFsZS4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+Qm9uIGFzdHVjZTo8L3NwYW4+DQoNCmxhIGNvbmZpZ3VyYXRpb24gZG9pdCDDqnRyZSDDqXF1aWxpYnLDqWUsYydlc3Qgw6AgZGlyZSBxdWUgY2hhcXVlIG5pdmVhdSBkb2l0IGFwcGFyYcOudHJlIGxlIG3Dqm1lIG5vbWJyZSBkZSBmb2lzIHBvdXIgY2hhcXVlIGZhY3RldXIsDQoNCmxlcyBmYWN0ZXVycyBkb2l2ZW50IMOqdHJlIGxpbsOpYWlyZW1lbnQgaW5kw6lwZW5kYW50cyAoY+KAmWVzdC3DoC1kaXJlIG5vbiBsacOpcyBlbnRyZSBldXgpLg0KDQoNCjx1PioqQ29kYWdlIGRlcyBmYWN0ZXVycyoqPC91Pg0KDQpMZSBjb2RhZ2UgZGVzIGZhY3RldXJzIGVzdCBpbXBvcnRhbnQgY2FyIGlsIHBlcm1ldCBkZSA6DQoNCmNvbXBhcmVyIHBsdXMgZmFjaWxlbWVudCBsYSB2YXJpYXRpb24gZGUgY2hhcXVlIGZhY3RldXIgZW4gbGVzIHJhbWVuYW50IGRhbnMgdW4gbcOqbWUgaW50ZXJ2YWxsZSwNCg0Kc2ltcGxpZmllciBsZXMgY2FsY3Vscy4NCg0KT24gZWZmZWN0dWUgYWxvcnMgdW4gY2hhbmdlbWVudCBkZSB2YXJpYWJsZSBwb3VyIHJhbWVuZXIgbGVzIHZhbGV1cnMgZGFucyBs4oCZaW50ZXJ2YWxsZSBb4oiSMSwrMV0uDQpQb3VyIHVuIGZhY3RldXIgDQp4IGTDqWZpbmkgc3VyIGzigJlpbnRlcnZhbGxlIA0KW2EsYl0sIGxlIGNvZGFnZSBlc3QgOiAoMip4KyhhK2IpKS8oYi1hKQ0KDQo8dT5FeGVtcGxlPC91Pg0KTGllbiB2ZXJzIGwnw6lub25jw6kuDQoNClLDqXBvbnNlcyBhdXggcXVlc3Rpb25zOg0KDQpPbiBwZXV0IHByb3Bvc8OpICBjb2RhZ2Ugc3VpdmFudA0KYGBge3J9DQojIEV4ZW1wbGUgOiB2ZWN0ZXVyIGRlIHZhbGV1cnMNCnZhbGV1cnMgPC0gYygyMiwyOCwyOSwzMCkNCg0KIyBEw6lmaW5pdGlvbiBkZSBsYSBmb25jdGlvbg0KY29kYWdlIDwtIGZ1bmN0aW9uKFgpIHsNCiAgcmVzIDwtIHJvdW5kKCgyKlggLSAobWF4KFgpICsgbWluKFgpKSkgLyAobWF4KFgpIC0gbWluKFgpKSwyKQ0KICByZXMNCn0NCmNvZGFnZSh2YWxldXJzKQ0KYGBgDQpOb3VzIGFsbG9ucyBhcHBsaXF1ZXIgbGEgZm9uY3Rpb24gZGUgY29kYWdlIGTDqWZpbmllIHByw6ljw6lkZW1tZW50IHN1ciBkZXV4IHN0cmF0w6lnaWVzIA0KZGUgdGVtcMOpcmF0dXJlcyAoc3RyYXTDqWdpZSAxIGV0IHN0cmF0w6lnaWUgMikuIA0KYGBge3J9DQojc3RyYXTDqWdpZTEgDQpzMSA8LSBjKDIyLDI4LDI5LDMwKQ0KI3N0cmF0w6lnaWUyDQpzMiA8LSBjKDIwLDI0LDI2LDMwKQ0KIyBOb3JtYWxpc2F0aW9uIGRlcyB0ZW1ww6lyYXR1cmVzIGRlcyBkZXV4IHN0cmF0w6lnaWVzIHN1ciBsJ2ludGVydmFsbGUgWy0xLCAxXQ0Kc3MxIDwtIGNvZGFnZShzMSkNCnNzMiA8LSBjb2RhZ2UoczIpDQpzczENCnNzMg0KYGBgDQpMYSBxdWVzdGlvbiBlc3QgZGUganVzdGlmaWVyIGxhIG1laWxsZXVyIHN0cmF0ZWdpZS4NCg0KUG91ciBjZWxhLCBwb3NvbnMgbGVzIG1hdHJpY2VzIGR1IG1vZMOobGUsIGF2ZWMgcG91ciBYMSBldCBYMiBsZXMgZGV1eCBzdHJhdMOpZ2llcyByZXNwZWN0aXZlcw0KYGBge3J9DQojb24gY29uc3RydWl0IGxlcyBkZXV4IG1hdHJpY2VzDQpYMSA8LSBtYXRyaXgoYyhyZXAoMSwgbGVuZ3RoKHMxKSksIHNzMSksIG5yb3cgPSBsZW5ndGgoc3MxKSwgbmNvbCA9IDIpDQpjb2xuYW1lcyhYMSkgPC0gYygiY29sMSIsICJjb2wyIikNCiNNYXRyaWNlIDINClgyIDwtIG1hdHJpeChjKHJlcCgxLGxlbmd0aChzMikpLHNzMiksbnJvdyA9IGxlbmd0aChzczIpLG5jb2wgPSAyKQ0KWDENClgyDQojIENlcyBtYXRyaWNlcyBzZXJ2aXJvbnQgw6AgYWp1c3RlciB1biBtb2TDqGxlIGxpbsOpYWlyZQ0KDQpgYGANCk5vdXMgYWxsb25zIGVzc2F5ZXIgZCdlc3RpbWVyIGxlcyBwYXJhbcOodHJlcyBkdSBtb2TDqGxlLCBtw6ptZSBzaSBub3VzIG4nYXZvbnMgcGFzIGxhIHLDqXBvbnNlDQpgYGB7cn0NCiMgY2FsY3VsIGRlICBsJ2ludmVyc2UgZGUgKHRYMSAqIFgxKQ0KaW52WDEgPC0gc29sdmUodChYMSkgJSolIFgxKQ0KIyBwb3VyIGxhIHNlZ29uZGUgbWF0cmljZQ0KaW52WDIgPC0gc29sdmUodChYMikgJSolIFgyKQ0Kcm91bmQoIGludlgxLCA0KQ0Kcm91bmQoaW52WDIsIDQpDQoNCmBgYA0KTm91cyBkZXZvbnMgdHJvdXZlciBsYSBxdWFsaXTDqSBkZSBsJ2FqdXN0ZW1lbnQuDQpEYW5zIG5vdHJlIGNhcyBpY2ksIHNpZ21hXzIgbidlc3QgcGFzIGludMOpcmVzc2FudCBwb3VyIGp1Z2VyIHN0cmF0w6lnaWUsIGNhciBjJ2VzdCBsZSBtw6ptZSBwb3VyIGwnw6ljaGFudGlsbG9uLg0KDQpRdWFsaXTDqSBkZSBsYSByw6lwb25zZSBtb3llbm5lIHByw6lkaXRlLDx1PiBZXiA9ICBzaWdtYV4yLnRnKHgpLih0WC5YKV4tMS5nKHgpIDwvdT4gLCBhdmVjIGcoeCkgbGUgdmVjdGV1ciBkZSByZWdyZXNzc2lvbg0KDQpgYGB7cn0NCiNMYSB2YXJpYW5jZSB5XyBlc3QgdW5lIGZvbmN0aW9uIGR1IDIgZMOpZ3LDqcOpLg0KeCA8LSBydW5pZigyMCxtaW49LTQsbWF4ID0gNCkNCiBtYV9mb25jdGlvbjEgPC0gZnVuY3Rpb24oeCl7DQogIDAuMjkgLTAuMjYwKnggKzAuNDEqeF4yDQp9DQptYV9mb25jdGlvbjIgPC0gZnVuY3Rpb24oeCl7DQogIDAuMjUgKzAuNDgxKnheMg0KfQ0KY3VydmUobWFfZm9uY3Rpb24xLCBmcm9tID0gLTQsIHRvID0gNCwgDQogICAgICBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIsIA0KICAgICAgbWFpbiA9ICJDb21wYXJhaXNvbiBkZXMgZGV1eCBmb25jdGlvbnMiLA0KICAgICAgeGxhYiA9ICJ4IiwgeWxhYiA9ICJ5IikjLGxhYmVscz0iUHJlbWnDqHJlIHN0cmF0ZWdpZSINCiMgQWpvdXRlciBsYSBkZXV4acOobWUgZm9uY3Rpb24NCmN1cnZlKG1hX2ZvbmN0aW9uMiwgZnJvbSA9IC00LCB0byA9IDQsIA0KICAgICAgY29sID0gInJlZCIsIGx3ZCA9IDIsIGFkZCA9IFRSVUUpDQojIFBvbHlnb25lIHBvdXIgY29sb3JpZXIgbCdhaXJlIHNvdXMgbGEgY291cmJlDQp4X2ZpbGwgPC0gc2VxKC0xLCAxLCBsZW5ndGgub3V0ID0gMjAwKQ0KeV9maWxsIDwtIG1hX2ZvbmN0aW9uMSh4X2ZpbGwpDQpwb2x5Z29uKGMoLTEsIHhfZmlsbCwgMSksIGMoMCwgeV9maWxsLCAwKSwNCiAgICAgICAgY29sID0gcmdiKDEsIDAsIDAsIDAuMyksIGJvcmRlciA9IE5BKQ0KDQojIEFqb3V0ZXIgbGVzIGJvcm5lcw0KYWJsaW5lKHYgPSBjKC0xLCAxKSwgbHR5ID0gMikNCmBgYA0KT24gdmEgcydpbnTDqXJlc3NlciDDoCBsYSB2YXJpYW5jZSBtb3llbm5lIGRlIHByb2R1Y3Rpb24gc3VyIFstMSwrMV0NCmlsIHMnYWdpdCBkZSB0cm91dmVyIGwnYWlyIHNvdXMgbGEgY291cmJlIHBvdXIgY2hhcXVlIGZvbmN0aW9uDQpgYGB7cn0NCkkxIDwtIGludGVncmF0ZShtYV9mb25jdGlvbjEsIGxvd2VyID0gLTEsIHVwcGVyID0gMSkNCkkyIDwtIGludGVncmF0ZShtYV9mb25jdGlvbjIsIGxvd2VyID0gLTEsIHVwcGVyID0gMSkNCmBgYA0KTGEgdmFyaWFuY2UgbW95ZW5uZSBwcmVkaXRlIHN1ciBbLTEsMV0gZGUgbGEgZGV1eGnDqG1lIHN0cmF0w6lnaWUgZXN0IHBsdXMgcGV0aXRlIHF1ZSBjZWxsZSBkZSBsYSBwcmVtacOocmUgc3RyYXTDqWdpZSBjYXI6DQpgYGB7cn0NCkkyJHZhbHVlLUkxJHZhbHVlDQpgYGANCkVuIGNvbmNsdXNpb24sIGwnYW5hbHlzZSBjb21wYXJhdGl2ZSBiYXPDqWUgc3VyIGxhIG1vZMOpbGlzYXRpb24gbGluw6lhaXJlIGRlcyBkb25uw6llcyBub3JtYWxpc8OpZXMgZMOpbW9udHJlIHF1ZSBsYSBzdHJhdMOpZ2llIDIgZXN0IHNpZ25pZmljYXRpdmVtZW50IHBsdXMgZWZmaWNhY2UgcXVlIGxhIHN0cmF0w6lnaWUgMQ0K