math-exercises 3.0.191 → 3.0.192
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/exercises/math/dataRepresentations/barChart/barChartInterpreting.d.ts +53 -0
- package/lib/exercises/math/dataRepresentations/barChart/barChartInterpreting.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/barChart/barChartInterpreting.js +543 -0
- package/lib/exercises/math/dataRepresentations/barChart/barChartReading.d.ts +94 -0
- package/lib/exercises/math/dataRepresentations/barChart/barChartReading.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/barChart/barChartReading.js +280 -0
- package/lib/exercises/math/dataRepresentations/barChart/index.d.ts +3 -0
- package/lib/exercises/math/dataRepresentations/barChart/index.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/barChart/index.js +2 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotInterpreting.d.ts +7 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotInterpreting.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotInterpreting.js +223 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReading.d.ts +9 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReading.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReading.js +133 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReadingPercentages.d.ts +11 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReadingPercentages.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/boxPlotReadingPercentages.js +198 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/compareBoxPlot.d.ts +13 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/compareBoxPlot.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/compareBoxPlot.js +192 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/index.d.ts +5 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/index.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/boxPlot/index.js +4 -0
- package/lib/exercises/math/dataRepresentations/index.d.ts +4 -7
- package/lib/exercises/math/dataRepresentations/index.d.ts.map +1 -1
- package/lib/exercises/math/dataRepresentations/index.js +4 -11
- package/lib/exercises/math/dataRepresentations/tables/buildDoubleTableFromContext.d.ts +7 -0
- package/lib/exercises/math/dataRepresentations/tables/buildDoubleTableFromContext.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/tables/buildDoubleTableFromContext.js +222 -0
- package/lib/exercises/math/dataRepresentations/tables/fillDoubleTable.d.ts +7 -0
- package/lib/exercises/math/dataRepresentations/tables/fillDoubleTable.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/tables/fillDoubleTable.js +187 -0
- package/lib/exercises/math/dataRepresentations/tables/index.d.ts +4 -0
- package/lib/exercises/math/dataRepresentations/tables/index.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/tables/index.js +3 -0
- package/lib/exercises/math/dataRepresentations/tables/tableReading.d.ts +8 -0
- package/lib/exercises/math/dataRepresentations/tables/tableReading.d.ts.map +1 -0
- package/lib/exercises/math/dataRepresentations/tables/tableReading.js +109 -0
- package/lib/exercises/math/derivation/applications/findYearForDecreasingPopulation.d.ts +8 -0
- package/lib/exercises/math/derivation/applications/findYearForDecreasingPopulation.d.ts.map +1 -0
- package/lib/exercises/math/derivation/applications/findYearForDecreasingPopulation.js +145 -0
- package/lib/exercises/math/derivation/applications/index.d.ts +1 -0
- package/lib/exercises/math/derivation/applications/index.d.ts.map +1 -1
- package/lib/exercises/math/derivation/applications/index.js +1 -0
- package/lib/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.js +7 -2
- package/lib/exercises/math/probaStat/stats1var/marginalAndConditionalFrequency.d.ts.map +1 -1
- package/lib/exercises/math/probaStat/stats1var/marginalAndConditionalFrequency.js +131 -61
- package/lib/index.d.ts +32 -25
- package/lib/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { addValidProp, shuffleProps, propWhile, tryToAddWrongProp, } from "../../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { numberVEA } from "../../../../exercises/vea/numberVEA.js";
|
|
4
|
+
import { Affine } from "../../../../math/polynomials/affine.js";
|
|
5
|
+
import { TrinomConstructor } from "../../../../math/polynomials/trinom.js";
|
|
6
|
+
import { randfloat } from "../../../../math/utils/random/randfloat.js";
|
|
7
|
+
import { randint } from "../../../../math/utils/random/randint.js";
|
|
8
|
+
import { round } from "../../../../math/utils/round.js";
|
|
9
|
+
import { firstDegreeInequationResolutionTex } from "../../../../tree/nodes/inequations/inequationNode.js";
|
|
10
|
+
import { frac } from "../../../../tree/nodes/operators/fractionNode.js";
|
|
11
|
+
import { coinFlip } from "../../../../utils/alea/coinFlip.js";
|
|
12
|
+
import { handleVEAError } from "../../../../utils/errors/handleVEAError.js";
|
|
13
|
+
const getPropositions = (n, { answer, coeffs, isAskingX }) => {
|
|
14
|
+
const propositions = [];
|
|
15
|
+
addValidProp(propositions, answer);
|
|
16
|
+
const trinom = TrinomConstructor.fromCoeffs(coeffs);
|
|
17
|
+
propWhile(propositions, n, () => {
|
|
18
|
+
if (isAskingX)
|
|
19
|
+
tryToAddWrongProp(propositions, (2013 + randint(1, 20)).frenchify());
|
|
20
|
+
else
|
|
21
|
+
tryToAddWrongProp(propositions, trinom
|
|
22
|
+
.toTree()
|
|
23
|
+
.toDetailedEvaluation({
|
|
24
|
+
x: randint(1, 20).toTree(),
|
|
25
|
+
})
|
|
26
|
+
.simplify()
|
|
27
|
+
.toTex());
|
|
28
|
+
});
|
|
29
|
+
return shuffleProps(propositions, n);
|
|
30
|
+
};
|
|
31
|
+
const getAnswer = (identifiers) => {
|
|
32
|
+
const { coeffs, isAskingX } = identifiers;
|
|
33
|
+
const trinom = TrinomConstructor.fromCoeffs(coeffs);
|
|
34
|
+
const a = round(2 * coeffs[2], 4);
|
|
35
|
+
const b = coeffs[1];
|
|
36
|
+
const root = frac(-b, a).simplify();
|
|
37
|
+
if (isAskingX) {
|
|
38
|
+
return round(2013 + root.evaluate(), 4).frenchify();
|
|
39
|
+
}
|
|
40
|
+
return trinom
|
|
41
|
+
.toTree()
|
|
42
|
+
.toDetailedEvaluation({
|
|
43
|
+
x: root,
|
|
44
|
+
})
|
|
45
|
+
.simplify()
|
|
46
|
+
.toTex();
|
|
47
|
+
};
|
|
48
|
+
const getInstruction = (identifiers) => {
|
|
49
|
+
const { coeffs, isAskingX } = identifiers;
|
|
50
|
+
const trinom = TrinomConstructor.fromCoeffs(coeffs);
|
|
51
|
+
return `On estime que la population d'une ville, exprimée en milliers d'habitants, peut être modélisée par la fonction $f$ définie sur $[0; +\\infty[$ par :
|
|
52
|
+
|
|
53
|
+
$$
|
|
54
|
+
f(x) = ${trinom.toTree().toTex()}
|
|
55
|
+
$$
|
|
56
|
+
|
|
57
|
+
où $x$ est la durée, en année, écoulée depuis $2013$.
|
|
58
|
+
|
|
59
|
+
${isAskingX
|
|
60
|
+
? `En quelle année la population de la ville est-elle maximale ?`
|
|
61
|
+
: `Quelle est la population maximale de la ville ?`}`;
|
|
62
|
+
};
|
|
63
|
+
const getHint = () => {
|
|
64
|
+
return `Calcule la dérivée $f'$ de $f$, puis étudie son signe. Le maximum de $f$ est atteint pour la valeur de $x$ telle que $f'(x) = 0$ et telle que $f'$ change de signe en $x$.`;
|
|
65
|
+
};
|
|
66
|
+
const getCorrection = (identifiers) => {
|
|
67
|
+
const { coeffs } = identifiers;
|
|
68
|
+
const trinom = TrinomConstructor.fromCoeffs(coeffs);
|
|
69
|
+
const a = round(2 * coeffs[2], 4);
|
|
70
|
+
const b = coeffs[1];
|
|
71
|
+
const affine = new Affine(a, b);
|
|
72
|
+
const root = frac(-b, a).simplify();
|
|
73
|
+
const froot = trinom.toTree().toDetailedEvaluation({ x: root }).simplify();
|
|
74
|
+
return `On calcule $f'(x)$ :
|
|
75
|
+
|
|
76
|
+
$$
|
|
77
|
+
f'(x) = ${trinom.derivate().toTree().toTex()}
|
|
78
|
+
$$
|
|
79
|
+
|
|
80
|
+
On étudie ensuite le signe de $f'(x)$ :
|
|
81
|
+
|
|
82
|
+
$$
|
|
83
|
+
${firstDegreeInequationResolutionTex(affine, "\\ge", (0).toTree())}
|
|
84
|
+
$$
|
|
85
|
+
|
|
86
|
+
On en déduit donc que $f$ atteint son maximum pour $x = ${root.toTex()}$, et on a alors :
|
|
87
|
+
|
|
88
|
+
$$
|
|
89
|
+
f(${root.toTex()}) = ${froot.toTex()}
|
|
90
|
+
$$
|
|
91
|
+
|
|
92
|
+
La population de la ville est donc maximale à l'année $${round(2013 + root.evaluate(), 4)}$, et elle est alors de $${froot.toTex()}$ milliers d'habitants.`;
|
|
93
|
+
};
|
|
94
|
+
const getKeys = () => {
|
|
95
|
+
return [];
|
|
96
|
+
};
|
|
97
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
98
|
+
try {
|
|
99
|
+
return numberVEA(ans, answer);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return handleVEAError(err);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const getFindYearForDecreasingPopulationQuestion = () => {
|
|
106
|
+
const alpha = randint(1, 20);
|
|
107
|
+
const beta = randfloat(10, 100, 2);
|
|
108
|
+
const a = randfloat(-0.9, -0.1, 2);
|
|
109
|
+
const b = round(-2 * a * alpha, 4);
|
|
110
|
+
const c = round((beta + a * alpha) ^ 2, 4);
|
|
111
|
+
const identifiers = {
|
|
112
|
+
isAskingX: coinFlip(),
|
|
113
|
+
coeffs: [c, b, a],
|
|
114
|
+
};
|
|
115
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
116
|
+
};
|
|
117
|
+
const getQuestionFromIdentifiers = (identifiers) => {
|
|
118
|
+
return {
|
|
119
|
+
answer: getAnswer(identifiers),
|
|
120
|
+
instruction: getInstruction(identifiers),
|
|
121
|
+
keys: getKeys(identifiers),
|
|
122
|
+
answerFormat: "tex",
|
|
123
|
+
identifiers,
|
|
124
|
+
hint: getHint(identifiers),
|
|
125
|
+
correction: getCorrection(identifiers),
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export const findYearForDecreasingPopulation = {
|
|
129
|
+
id: "findYearForDecreasingPopulation",
|
|
130
|
+
connector: "=",
|
|
131
|
+
label: "Déterminer le maximum d'une population (dérivation)",
|
|
132
|
+
isSingleStep: true,
|
|
133
|
+
generator: (nb, opts) => getDistinctQuestions(() => getFindYearForDecreasingPopulationQuestion(opts), nb),
|
|
134
|
+
qcmTimer: 60,
|
|
135
|
+
freeTimer: 60,
|
|
136
|
+
getPropositions,
|
|
137
|
+
isAnswerValid,
|
|
138
|
+
subject: "Mathématiques",
|
|
139
|
+
getInstruction,
|
|
140
|
+
getHint,
|
|
141
|
+
getCorrection,
|
|
142
|
+
getAnswer,
|
|
143
|
+
getQuestionFromIdentifiers,
|
|
144
|
+
hasHintAndCorrection: true,
|
|
145
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/derivation/applications/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/derivation/applications/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sCAAsC,CAAC"}
|
package/lib/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fillTableConditionalProbabilitySituation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAST,MAAM,6BAA6B,CAAC;AAUrC,OAAO,EAGL,wBAAwB,EACzB,MAAM,iCAAiC,CAAC;AAEzC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,wBAAwB,CAAC;CAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"fillTableConditionalProbabilitySituation.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAST,MAAM,6BAA6B,CAAC;AAUrC,OAAO,EAGL,wBAAwB,EACzB,MAAM,iCAAiC,CAAC;AAEzC,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,wBAAwB,CAAC;CAClC,CAAC;AA2OF,eAAO,MAAM,wCAAwC,EAAE,QAAQ,CAAC,WAAW,CAqB1E,CAAC"}
|
package/lib/exercises/math/probaStat/conditional/fillTableConditionalProbabilitySituation.js
CHANGED
|
@@ -37,7 +37,12 @@ const getAnswerTable = (identifiers) => {
|
|
|
37
37
|
.toTex()}`,
|
|
38
38
|
`${substract(1, mainEventProbaDec).simplify().toTex()}`,
|
|
39
39
|
],
|
|
40
|
-
[
|
|
40
|
+
[
|
|
41
|
+
"\\text{Total}",
|
|
42
|
+
`${pb.toTex()}`,
|
|
43
|
+
`${substract(1, pb).simplify().toTex()}`,
|
|
44
|
+
"1",
|
|
45
|
+
],
|
|
41
46
|
];
|
|
42
47
|
};
|
|
43
48
|
const getInstruction = (identifiers) => {
|
|
@@ -199,7 +204,7 @@ const getQuestionFromIdentifiers = (identifiers) => {
|
|
|
199
204
|
],
|
|
200
205
|
[`$${situation.mainEvent}$`, "", "", ""],
|
|
201
206
|
[`$\\overline{${situation.mainEvent}}$`, "", "", ""],
|
|
202
|
-
["Total", "", "", "1"],
|
|
207
|
+
["\\text{Total}", "", "", "1"],
|
|
203
208
|
],
|
|
204
209
|
};
|
|
205
210
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marginalAndConditionalFrequency.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/marginalAndConditionalFrequency.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,
|
|
1
|
+
{"version":3,"file":"marginalAndConditionalFrequency.d.ts","sourceRoot":"","sources":["../../../../../src/exercises/math/probaStat/stats1var/marginalAndConditionalFrequency.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,QAAQ,EAcT,MAAM,sBAAsB,CAAC;AAG9B,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAyPF,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CAAC,WAAW,CAcjE,CAAC"}
|
|
@@ -1,131 +1,194 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { rationalVEA } from "../../../../exercises/vea/rationalVEA.js";
|
|
2
2
|
import { randint } from "../../../../math/utils/random/randint.js";
|
|
3
|
+
import { frac } from "../../../../tree/nodes/operators/fractionNode.js";
|
|
3
4
|
import { random } from "../../../../utils/alea/random.js";
|
|
4
5
|
import { shuffle } from "../../../../utils/alea/shuffle.js";
|
|
5
6
|
import { dollarize } from "../../../../utils/latex/dollarize.js";
|
|
6
7
|
import { mdTable } from "../../../../utils/markdown/mdTable.js";
|
|
7
8
|
import { addValidProp, propWhile, tryToAddWrongProp, } from "../../../exercise.js";
|
|
8
9
|
import { getDistinctQuestions } from "../../../utils/getDistinctQuestions.js";
|
|
9
|
-
const getFreqStrings = (
|
|
10
|
+
const getFreqStrings = (identifiers) => {
|
|
11
|
+
const { rand, x1, x2, x3, x4 } = identifiers;
|
|
12
|
+
const total = x1 + x2 + x3 + x4;
|
|
10
13
|
let freqString = "";
|
|
11
14
|
let frequence = "";
|
|
15
|
+
let mainEvent = "";
|
|
16
|
+
let subEvent = "";
|
|
17
|
+
let num = 0;
|
|
18
|
+
let denum = 0;
|
|
12
19
|
switch (rand) {
|
|
13
20
|
case 0:
|
|
14
21
|
freqString = "marginale de $A$";
|
|
15
22
|
frequence = "f(A)";
|
|
23
|
+
mainEvent = "A";
|
|
24
|
+
num = x1 + x3;
|
|
25
|
+
denum = total;
|
|
16
26
|
break;
|
|
17
27
|
case 1:
|
|
18
28
|
freqString = "marginale de $B$";
|
|
19
29
|
frequence = "f(B)";
|
|
30
|
+
mainEvent = "B";
|
|
31
|
+
num = x2 + x4;
|
|
32
|
+
denum = total;
|
|
20
33
|
break;
|
|
21
34
|
case 2:
|
|
22
35
|
freqString = "marginale de $C$";
|
|
23
36
|
frequence = "f(C)";
|
|
37
|
+
mainEvent = "C";
|
|
38
|
+
num = x1 + x2;
|
|
39
|
+
denum = total;
|
|
24
40
|
break;
|
|
25
41
|
case 3:
|
|
26
42
|
freqString = "marginale de $D$";
|
|
27
43
|
frequence = "f(D)";
|
|
44
|
+
mainEvent = "D";
|
|
45
|
+
num = x3 + x4;
|
|
46
|
+
denum = total;
|
|
28
47
|
break;
|
|
29
48
|
case 4:
|
|
30
49
|
freqString = "conditionnelle de $A$ parmi $C$";
|
|
31
50
|
frequence = "f_C(A)";
|
|
51
|
+
mainEvent = "A";
|
|
52
|
+
subEvent = "C";
|
|
53
|
+
num = x1;
|
|
54
|
+
denum = x1 + x2;
|
|
32
55
|
break;
|
|
33
56
|
case 5:
|
|
34
57
|
freqString = "conditionnelle de $A$ parmi $D$";
|
|
35
58
|
frequence = "f_D(A)";
|
|
59
|
+
mainEvent = "A";
|
|
60
|
+
subEvent = "D";
|
|
61
|
+
num = x3;
|
|
62
|
+
denum = x3 + x4;
|
|
36
63
|
break;
|
|
37
64
|
case 6:
|
|
38
65
|
freqString = "conditionnelle de $B$ parmi $C$";
|
|
39
66
|
frequence = "f_C(B)";
|
|
67
|
+
mainEvent = "B";
|
|
68
|
+
subEvent = "C";
|
|
69
|
+
num = x2;
|
|
70
|
+
denum = x1 + x2;
|
|
40
71
|
break;
|
|
41
72
|
case 7:
|
|
42
73
|
freqString = "conditionnelle de $B$ parmi $D$";
|
|
43
74
|
frequence = "f_D(B)";
|
|
75
|
+
mainEvent = "B";
|
|
76
|
+
subEvent = "D";
|
|
77
|
+
num = x4;
|
|
78
|
+
denum = x3 + x4;
|
|
44
79
|
break;
|
|
45
80
|
case 8:
|
|
46
81
|
freqString = "conditionnelle de $C$ parmi $A$";
|
|
47
82
|
frequence = "f_A(C)";
|
|
83
|
+
mainEvent = "C";
|
|
84
|
+
subEvent = "A";
|
|
85
|
+
num = x1;
|
|
86
|
+
denum = x1 + x3;
|
|
48
87
|
break;
|
|
49
88
|
case 9:
|
|
50
89
|
freqString = "conditionnelle de $C$ parmi $B$";
|
|
51
90
|
frequence = "f_B(C)";
|
|
91
|
+
mainEvent = "C";
|
|
92
|
+
subEvent = "B";
|
|
93
|
+
num = x2;
|
|
94
|
+
denum = x2 + x4;
|
|
52
95
|
break;
|
|
53
96
|
case 10:
|
|
54
97
|
freqString = "conditionnelle de $D$ parmi $A$";
|
|
55
98
|
frequence = "f_A(D)";
|
|
99
|
+
mainEvent = "D";
|
|
100
|
+
subEvent = "A";
|
|
101
|
+
num = x3;
|
|
102
|
+
denum = x1 + x3;
|
|
56
103
|
break;
|
|
57
104
|
case 11:
|
|
58
105
|
freqString = "conditionnelle de $D$ parmi $B$";
|
|
59
106
|
frequence = "f_B(D)";
|
|
107
|
+
mainEvent = "D";
|
|
108
|
+
subEvent = "B";
|
|
109
|
+
num = x4;
|
|
110
|
+
denum = x2 + x4;
|
|
60
111
|
break;
|
|
61
112
|
default:
|
|
62
113
|
throw Error("error");
|
|
63
114
|
}
|
|
64
|
-
return { freqString, frequence };
|
|
115
|
+
return { freqString, frequence, mainEvent, subEvent, num, denum };
|
|
65
116
|
};
|
|
66
|
-
const getInstruction = (
|
|
67
|
-
const {
|
|
117
|
+
const getInstruction = (identifiers) => {
|
|
118
|
+
const { x1, x2, x3, x4 } = identifiers;
|
|
119
|
+
const { freqString } = getFreqStrings(identifiers);
|
|
68
120
|
return `On considère le tableau d'effectifs suivant :
|
|
69
121
|
|
|
70
122
|
${mdTable([
|
|
71
|
-
[" ", "$A$", "$B$"],
|
|
72
|
-
["$C$", dollarize(x1), dollarize(x2)],
|
|
73
|
-
["$D$", dollarize(x3), dollarize(x4)],
|
|
123
|
+
[" ", "$A$", "$B$", "Total"],
|
|
124
|
+
["$C$", dollarize(x1), dollarize(x2), dollarize(x1 + x2)],
|
|
125
|
+
["$D$", dollarize(x3), dollarize(x4), dollarize(x3 + x4)],
|
|
126
|
+
[
|
|
127
|
+
"Total",
|
|
128
|
+
dollarize(x1 + x3),
|
|
129
|
+
dollarize(x2 + x4),
|
|
130
|
+
dollarize(x1 + x2 + x3 + x4),
|
|
131
|
+
],
|
|
74
132
|
])}
|
|
75
133
|
|
|
76
|
-
Calculer la fréquence ${freqString}.`;
|
|
134
|
+
Calculer la fréquence ${freqString} (donner la valeur exacte ou une valeur arrondie au centième).`;
|
|
77
135
|
};
|
|
78
|
-
const getAnswerNode = (
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
switch (rand) {
|
|
82
|
-
case 0:
|
|
83
|
-
answer = new Rational(x1 + x3, x).simplify().toTree();
|
|
84
|
-
break;
|
|
85
|
-
case 1:
|
|
86
|
-
answer = new Rational(x2 + x4, x).simplify().toTree();
|
|
87
|
-
break;
|
|
88
|
-
case 2:
|
|
89
|
-
answer = new Rational(x1 + x2, x).simplify().toTree();
|
|
90
|
-
break;
|
|
91
|
-
case 3:
|
|
92
|
-
answer = new Rational(x3 + x4, x).simplify().toTree();
|
|
93
|
-
break;
|
|
94
|
-
case 4:
|
|
95
|
-
answer = new Rational(x1, x1 + x2).simplify().toTree();
|
|
96
|
-
break;
|
|
97
|
-
case 5:
|
|
98
|
-
answer = new Rational(x3, x3 + x4).simplify().toTree();
|
|
99
|
-
break;
|
|
100
|
-
case 6:
|
|
101
|
-
answer = new Rational(x2, x1 + x2).simplify().toTree();
|
|
102
|
-
break;
|
|
103
|
-
case 7:
|
|
104
|
-
answer = new Rational(x4, x3 + x4).simplify().toTree();
|
|
105
|
-
break;
|
|
106
|
-
case 8:
|
|
107
|
-
answer = new Rational(x1, x1 + x3).simplify().toTree();
|
|
108
|
-
break;
|
|
109
|
-
case 9:
|
|
110
|
-
answer = new Rational(x2, x2 + x4).simplify().toTree();
|
|
111
|
-
break;
|
|
112
|
-
case 10:
|
|
113
|
-
answer = new Rational(x3, x1 + x3).simplify().toTree();
|
|
114
|
-
break;
|
|
115
|
-
case 11:
|
|
116
|
-
answer = new Rational(x4, x2 + x4).simplify().toTree();
|
|
117
|
-
break;
|
|
118
|
-
default:
|
|
119
|
-
throw Error("error");
|
|
120
|
-
}
|
|
121
|
-
return answer;
|
|
136
|
+
const getAnswerNode = (identifiers) => {
|
|
137
|
+
const { num, denum } = getFreqStrings(identifiers);
|
|
138
|
+
return frac(num, denum).simplify();
|
|
122
139
|
};
|
|
123
140
|
const getAnswer = (identifiers) => {
|
|
124
|
-
const
|
|
125
|
-
const answerNode = getAnswerNode(rand, x1, x2, x3, x4);
|
|
141
|
+
const answerNode = getAnswerNode(identifiers);
|
|
126
142
|
const answer = answerNode.toTex();
|
|
127
143
|
return answer;
|
|
128
144
|
};
|
|
145
|
+
const getHint = (identifiers) => {
|
|
146
|
+
const { rand } = identifiers;
|
|
147
|
+
if (rand < 4) {
|
|
148
|
+
return `La fréquence marginale de $M$ s'obtient par le calcul :
|
|
149
|
+
|
|
150
|
+
$$
|
|
151
|
+
f(M) = \\frac{\\text{effectif total de } M}{\\text{effectif total}}
|
|
152
|
+
$$`;
|
|
153
|
+
}
|
|
154
|
+
return `La fréquence conditionnelle de $M$ parmi $N$ s'obtient par le calcul :
|
|
155
|
+
|
|
156
|
+
$$
|
|
157
|
+
f_N(M) = \\frac{\\text{effectif vérifiant à la fois } M \\text{ et } N}{\\text{effectif marginal de } N}
|
|
158
|
+
$$`;
|
|
159
|
+
};
|
|
160
|
+
const getCorrection = (identifiers) => {
|
|
161
|
+
const { rand } = identifiers;
|
|
162
|
+
const { freqString, frequence, mainEvent, subEvent, num, denum } = getFreqStrings(identifiers);
|
|
163
|
+
if (rand < 4) {
|
|
164
|
+
return `La fréquence ${freqString} s'obtient par le calcul :
|
|
165
|
+
|
|
166
|
+
$$
|
|
167
|
+
${frequence} = \\frac{\\text{effectif total de } ${mainEvent}}{\\text{effectif total}}
|
|
168
|
+
$$
|
|
169
|
+
|
|
170
|
+
Ici, l'effectif total est $${denum.frenchify()}$, et l'effectif total de $${mainEvent}$ est $${num}$.
|
|
171
|
+
|
|
172
|
+
On a donc :
|
|
173
|
+
|
|
174
|
+
$$
|
|
175
|
+
${frequence} = ${frac(num, denum).toSimplificationTex()}
|
|
176
|
+
$$`;
|
|
177
|
+
}
|
|
178
|
+
return `La fréquence ${freqString} s'obtient par le calcul :
|
|
179
|
+
|
|
180
|
+
$$
|
|
181
|
+
${frequence} = \\frac{\\text{effectif vérifiant à la fois } ${mainEvent} \\text{ et } ${subEvent}}{\\text{effectif marginal de } ${subEvent}}
|
|
182
|
+
$$
|
|
183
|
+
|
|
184
|
+
Ici, l'effectif vérifiant à la fois $${mainEvent}$ et $${subEvent}$ est $${num}$, et l'effectif marginal de $${subEvent}$ est $${denum}$.
|
|
185
|
+
|
|
186
|
+
On a donc :
|
|
187
|
+
|
|
188
|
+
$$
|
|
189
|
+
${frequence} = ${frac(num, denum).toSimplificationTex()}
|
|
190
|
+
$$`;
|
|
191
|
+
};
|
|
129
192
|
const getMarginalAndConditionalFrequency = () => {
|
|
130
193
|
const [x1, x2, x3, x4] = [1, 2, 3, 4].map((_el) => randint(1, 100));
|
|
131
194
|
const rand = randint(0, 12);
|
|
@@ -135,7 +198,7 @@ const getMarginalAndConditionalFrequency = () => {
|
|
|
135
198
|
const getQuestionFromIdentifiers = (identifiers) => {
|
|
136
199
|
const question = {
|
|
137
200
|
instruction: getInstruction(identifiers),
|
|
138
|
-
startStatement: `${getFreqStrings(identifiers
|
|
201
|
+
startStatement: `${getFreqStrings(identifiers).frequence}`,
|
|
139
202
|
answer: getAnswer(identifiers),
|
|
140
203
|
keys: ["f", "cap", "underscore"],
|
|
141
204
|
answerFormat: "tex",
|
|
@@ -147,6 +210,8 @@ const getQuestionFromIdentifiers = (identifiers) => {
|
|
|
147
210
|
firstRowIsHeader: true,
|
|
148
211
|
},
|
|
149
212
|
},
|
|
213
|
+
hint: getHint(identifiers),
|
|
214
|
+
correction: getCorrection(identifiers),
|
|
150
215
|
};
|
|
151
216
|
return question;
|
|
152
217
|
};
|
|
@@ -155,15 +220,19 @@ const getPropositions = (n, { answer, x1, x2, x3, x4 }) => {
|
|
|
155
220
|
addValidProp(propositions, answer);
|
|
156
221
|
propWhile(propositions, n, () => {
|
|
157
222
|
const fakeRand = randint(0, 12);
|
|
158
|
-
const answerTree = getAnswerNode(
|
|
223
|
+
const answerTree = getAnswerNode({
|
|
224
|
+
rand: fakeRand,
|
|
225
|
+
x1: x1 + random([0, 1]),
|
|
226
|
+
x2: x2 + random([0, 1]),
|
|
227
|
+
x3: x3 + random([0, 1]),
|
|
228
|
+
x4: x4 + random([0, 1]),
|
|
229
|
+
});
|
|
159
230
|
tryToAddWrongProp(propositions, answerTree.toTex());
|
|
160
231
|
});
|
|
161
232
|
return shuffle(propositions);
|
|
162
233
|
};
|
|
163
|
-
const isAnswerValid = (ans, {
|
|
164
|
-
|
|
165
|
-
const texs = answerTree.toAllValidTexs({ allowFractionToDecimal: true });
|
|
166
|
-
return texs.includes(ans);
|
|
234
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
235
|
+
return rationalVEA(ans, answer);
|
|
167
236
|
};
|
|
168
237
|
export const marginalAndConditionalFrequency = {
|
|
169
238
|
id: "marginalAndConditionalFrequency",
|
|
@@ -177,4 +246,5 @@ export const marginalAndConditionalFrequency = {
|
|
|
177
246
|
isAnswerValid,
|
|
178
247
|
subject: "Mathématiques",
|
|
179
248
|
getQuestionFromIdentifiers,
|
|
249
|
+
hasHintAndCorrection: true,
|
|
180
250
|
};
|
package/lib/index.d.ts
CHANGED
|
@@ -1257,6 +1257,9 @@ declare const mathExercises: (Exercise<{
|
|
|
1257
1257
|
}, {
|
|
1258
1258
|
method: string;
|
|
1259
1259
|
}> | Exercise<{
|
|
1260
|
+
coeffs: number[];
|
|
1261
|
+
isAskingX: boolean;
|
|
1262
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
1260
1263
|
a: number;
|
|
1261
1264
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
1262
1265
|
a: number;
|
|
@@ -4385,32 +4388,9 @@ declare const mathExercises: (Exercise<{
|
|
|
4385
4388
|
values: number[][];
|
|
4386
4389
|
caseAsked: number;
|
|
4387
4390
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4388
|
-
|
|
4389
|
-
data: number[];
|
|
4390
|
-
itemAsked: number;
|
|
4391
|
-
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4392
|
-
isAskingX: boolean;
|
|
4393
|
-
xValue?: number;
|
|
4394
|
-
yValue?: number;
|
|
4395
|
-
a: number;
|
|
4396
|
-
b: number;
|
|
4397
|
-
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4398
|
-
points: number[][];
|
|
4399
|
-
labels: string[];
|
|
4400
|
-
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4401
|
-
quartiles: number[];
|
|
4402
|
-
arrQuartileIndex: (0 | 1 | 2 | 3 | 4)[];
|
|
4403
|
-
typeQ: "below" | "between" | "above";
|
|
4404
|
-
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4405
|
-
quartileIndex: 0 | 1 | 2 | 3 | 4;
|
|
4406
|
-
quartiles: number[];
|
|
4391
|
+
coeffs: (number | undefined)[][];
|
|
4407
4392
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4408
|
-
|
|
4409
|
-
isLess: boolean;
|
|
4410
|
-
arrDistrib: {
|
|
4411
|
-
name: string;
|
|
4412
|
-
indicators: number[];
|
|
4413
|
-
}[];
|
|
4393
|
+
coeffs: (number | undefined)[][];
|
|
4414
4394
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4415
4395
|
barChart: {
|
|
4416
4396
|
description: string;
|
|
@@ -4450,6 +4430,19 @@ declare const mathExercises: (Exercise<{
|
|
|
4450
4430
|
}, {
|
|
4451
4431
|
displayType: string;
|
|
4452
4432
|
}> | Exercise<{
|
|
4433
|
+
labels: string[];
|
|
4434
|
+
data: number[];
|
|
4435
|
+
itemAsked: number;
|
|
4436
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4437
|
+
isAskingX: boolean;
|
|
4438
|
+
xValue?: number;
|
|
4439
|
+
yValue?: number;
|
|
4440
|
+
a: number;
|
|
4441
|
+
b: number;
|
|
4442
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4443
|
+
points: number[][];
|
|
4444
|
+
labels: string[];
|
|
4445
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4453
4446
|
indexSituation: number;
|
|
4454
4447
|
bigNumber: number;
|
|
4455
4448
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
@@ -4462,6 +4455,20 @@ declare const mathExercises: (Exercise<{
|
|
|
4462
4455
|
evolutionType: string;
|
|
4463
4456
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4464
4457
|
quartiles: number[];
|
|
4458
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4459
|
+
quartileIndex: 0 | 1 | 2 | 3 | 4;
|
|
4460
|
+
quartiles: number[];
|
|
4461
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4462
|
+
quartiles: number[];
|
|
4463
|
+
arrQuartileIndex: (0 | 1 | 2 | 3 | 4)[];
|
|
4464
|
+
typeQ: "below" | "between" | "above";
|
|
4465
|
+
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4466
|
+
indexTopic: number;
|
|
4467
|
+
isLess: boolean;
|
|
4468
|
+
arrDistrib: {
|
|
4469
|
+
name: string;
|
|
4470
|
+
indicators: number[];
|
|
4471
|
+
}[];
|
|
4465
4472
|
}, Record<string, string | boolean | string[]>> | Exercise<{
|
|
4466
4473
|
indexSituation: number;
|
|
4467
4474
|
maxOrScam: number;
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,QAAA,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDAA+B,CAAC;AACnD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDAA6B,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC"}
|