@featurevisor/sdk 0.37.0 → 0.38.0

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.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">50% </span>
26
+ <span class="strong">50.9% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>165/330</span>
28
+ <span class='fraction'>197/387</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">33.72% </span>
33
+ <span class="strong">37.43% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>57/169</span>
35
+ <span class='fraction'>76/203</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">43.39% </span>
40
+ <span class="strong">49.01% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>23/53</span>
42
+ <span class='fraction'>25/51</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">50.77% </span>
47
+ <span class="strong">51.44% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>164/323</span>
49
+ <span class='fraction'>196/381</span>
50
50
  </div>
51
51
 
52
52
 
@@ -1100,7 +1100,199 @@
1100
1100
  <a name='L1035'></a><a href='#L1035'>1035</a>
1101
1101
  <a name='L1036'></a><a href='#L1036'>1036</a>
1102
1102
  <a name='L1037'></a><a href='#L1037'>1037</a>
1103
- <a name='L1038'></a><a href='#L1038'>1038</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a>
1141
+ <a name='L1076'></a><a href='#L1076'>1076</a>
1142
+ <a name='L1077'></a><a href='#L1077'>1077</a>
1143
+ <a name='L1078'></a><a href='#L1078'>1078</a>
1144
+ <a name='L1079'></a><a href='#L1079'>1079</a>
1145
+ <a name='L1080'></a><a href='#L1080'>1080</a>
1146
+ <a name='L1081'></a><a href='#L1081'>1081</a>
1147
+ <a name='L1082'></a><a href='#L1082'>1082</a>
1148
+ <a name='L1083'></a><a href='#L1083'>1083</a>
1149
+ <a name='L1084'></a><a href='#L1084'>1084</a>
1150
+ <a name='L1085'></a><a href='#L1085'>1085</a>
1151
+ <a name='L1086'></a><a href='#L1086'>1086</a>
1152
+ <a name='L1087'></a><a href='#L1087'>1087</a>
1153
+ <a name='L1088'></a><a href='#L1088'>1088</a>
1154
+ <a name='L1089'></a><a href='#L1089'>1089</a>
1155
+ <a name='L1090'></a><a href='#L1090'>1090</a>
1156
+ <a name='L1091'></a><a href='#L1091'>1091</a>
1157
+ <a name='L1092'></a><a href='#L1092'>1092</a>
1158
+ <a name='L1093'></a><a href='#L1093'>1093</a>
1159
+ <a name='L1094'></a><a href='#L1094'>1094</a>
1160
+ <a name='L1095'></a><a href='#L1095'>1095</a>
1161
+ <a name='L1096'></a><a href='#L1096'>1096</a>
1162
+ <a name='L1097'></a><a href='#L1097'>1097</a>
1163
+ <a name='L1098'></a><a href='#L1098'>1098</a>
1164
+ <a name='L1099'></a><a href='#L1099'>1099</a>
1165
+ <a name='L1100'></a><a href='#L1100'>1100</a>
1166
+ <a name='L1101'></a><a href='#L1101'>1101</a>
1167
+ <a name='L1102'></a><a href='#L1102'>1102</a>
1168
+ <a name='L1103'></a><a href='#L1103'>1103</a>
1169
+ <a name='L1104'></a><a href='#L1104'>1104</a>
1170
+ <a name='L1105'></a><a href='#L1105'>1105</a>
1171
+ <a name='L1106'></a><a href='#L1106'>1106</a>
1172
+ <a name='L1107'></a><a href='#L1107'>1107</a>
1173
+ <a name='L1108'></a><a href='#L1108'>1108</a>
1174
+ <a name='L1109'></a><a href='#L1109'>1109</a>
1175
+ <a name='L1110'></a><a href='#L1110'>1110</a>
1176
+ <a name='L1111'></a><a href='#L1111'>1111</a>
1177
+ <a name='L1112'></a><a href='#L1112'>1112</a>
1178
+ <a name='L1113'></a><a href='#L1113'>1113</a>
1179
+ <a name='L1114'></a><a href='#L1114'>1114</a>
1180
+ <a name='L1115'></a><a href='#L1115'>1115</a>
1181
+ <a name='L1116'></a><a href='#L1116'>1116</a>
1182
+ <a name='L1117'></a><a href='#L1117'>1117</a>
1183
+ <a name='L1118'></a><a href='#L1118'>1118</a>
1184
+ <a name='L1119'></a><a href='#L1119'>1119</a>
1185
+ <a name='L1120'></a><a href='#L1120'>1120</a>
1186
+ <a name='L1121'></a><a href='#L1121'>1121</a>
1187
+ <a name='L1122'></a><a href='#L1122'>1122</a>
1188
+ <a name='L1123'></a><a href='#L1123'>1123</a>
1189
+ <a name='L1124'></a><a href='#L1124'>1124</a>
1190
+ <a name='L1125'></a><a href='#L1125'>1125</a>
1191
+ <a name='L1126'></a><a href='#L1126'>1126</a>
1192
+ <a name='L1127'></a><a href='#L1127'>1127</a>
1193
+ <a name='L1128'></a><a href='#L1128'>1128</a>
1194
+ <a name='L1129'></a><a href='#L1129'>1129</a>
1195
+ <a name='L1130'></a><a href='#L1130'>1130</a>
1196
+ <a name='L1131'></a><a href='#L1131'>1131</a>
1197
+ <a name='L1132'></a><a href='#L1132'>1132</a>
1198
+ <a name='L1133'></a><a href='#L1133'>1133</a>
1199
+ <a name='L1134'></a><a href='#L1134'>1134</a>
1200
+ <a name='L1135'></a><a href='#L1135'>1135</a>
1201
+ <a name='L1136'></a><a href='#L1136'>1136</a>
1202
+ <a name='L1137'></a><a href='#L1137'>1137</a>
1203
+ <a name='L1138'></a><a href='#L1138'>1138</a>
1204
+ <a name='L1139'></a><a href='#L1139'>1139</a>
1205
+ <a name='L1140'></a><a href='#L1140'>1140</a>
1206
+ <a name='L1141'></a><a href='#L1141'>1141</a>
1207
+ <a name='L1142'></a><a href='#L1142'>1142</a>
1208
+ <a name='L1143'></a><a href='#L1143'>1143</a>
1209
+ <a name='L1144'></a><a href='#L1144'>1144</a>
1210
+ <a name='L1145'></a><a href='#L1145'>1145</a>
1211
+ <a name='L1146'></a><a href='#L1146'>1146</a>
1212
+ <a name='L1147'></a><a href='#L1147'>1147</a>
1213
+ <a name='L1148'></a><a href='#L1148'>1148</a>
1214
+ <a name='L1149'></a><a href='#L1149'>1149</a>
1215
+ <a name='L1150'></a><a href='#L1150'>1150</a>
1216
+ <a name='L1151'></a><a href='#L1151'>1151</a>
1217
+ <a name='L1152'></a><a href='#L1152'>1152</a>
1218
+ <a name='L1153'></a><a href='#L1153'>1153</a>
1219
+ <a name='L1154'></a><a href='#L1154'>1154</a>
1220
+ <a name='L1155'></a><a href='#L1155'>1155</a>
1221
+ <a name='L1156'></a><a href='#L1156'>1156</a>
1222
+ <a name='L1157'></a><a href='#L1157'>1157</a>
1223
+ <a name='L1158'></a><a href='#L1158'>1158</a>
1224
+ <a name='L1159'></a><a href='#L1159'>1159</a>
1225
+ <a name='L1160'></a><a href='#L1160'>1160</a>
1226
+ <a name='L1161'></a><a href='#L1161'>1161</a>
1227
+ <a name='L1162'></a><a href='#L1162'>1162</a>
1228
+ <a name='L1163'></a><a href='#L1163'>1163</a>
1229
+ <a name='L1164'></a><a href='#L1164'>1164</a>
1230
+ <a name='L1165'></a><a href='#L1165'>1165</a>
1231
+ <a name='L1166'></a><a href='#L1166'>1166</a>
1232
+ <a name='L1167'></a><a href='#L1167'>1167</a>
1233
+ <a name='L1168'></a><a href='#L1168'>1168</a>
1234
+ <a name='L1169'></a><a href='#L1169'>1169</a>
1235
+ <a name='L1170'></a><a href='#L1170'>1170</a>
1236
+ <a name='L1171'></a><a href='#L1171'>1171</a>
1237
+ <a name='L1172'></a><a href='#L1172'>1172</a>
1238
+ <a name='L1173'></a><a href='#L1173'>1173</a>
1239
+ <a name='L1174'></a><a href='#L1174'>1174</a>
1240
+ <a name='L1175'></a><a href='#L1175'>1175</a>
1241
+ <a name='L1176'></a><a href='#L1176'>1176</a>
1242
+ <a name='L1177'></a><a href='#L1177'>1177</a>
1243
+ <a name='L1178'></a><a href='#L1178'>1178</a>
1244
+ <a name='L1179'></a><a href='#L1179'>1179</a>
1245
+ <a name='L1180'></a><a href='#L1180'>1180</a>
1246
+ <a name='L1181'></a><a href='#L1181'>1181</a>
1247
+ <a name='L1182'></a><a href='#L1182'>1182</a>
1248
+ <a name='L1183'></a><a href='#L1183'>1183</a>
1249
+ <a name='L1184'></a><a href='#L1184'>1184</a>
1250
+ <a name='L1185'></a><a href='#L1185'>1185</a>
1251
+ <a name='L1186'></a><a href='#L1186'>1186</a>
1252
+ <a name='L1187'></a><a href='#L1187'>1187</a>
1253
+ <a name='L1188'></a><a href='#L1188'>1188</a>
1254
+ <a name='L1189'></a><a href='#L1189'>1189</a>
1255
+ <a name='L1190'></a><a href='#L1190'>1190</a>
1256
+ <a name='L1191'></a><a href='#L1191'>1191</a>
1257
+ <a name='L1192'></a><a href='#L1192'>1192</a>
1258
+ <a name='L1193'></a><a href='#L1193'>1193</a>
1259
+ <a name='L1194'></a><a href='#L1194'>1194</a>
1260
+ <a name='L1195'></a><a href='#L1195'>1195</a>
1261
+ <a name='L1196'></a><a href='#L1196'>1196</a>
1262
+ <a name='L1197'></a><a href='#L1197'>1197</a>
1263
+ <a name='L1198'></a><a href='#L1198'>1198</a>
1264
+ <a name='L1199'></a><a href='#L1199'>1199</a>
1265
+ <a name='L1200'></a><a href='#L1200'>1200</a>
1266
+ <a name='L1201'></a><a href='#L1201'>1201</a>
1267
+ <a name='L1202'></a><a href='#L1202'>1202</a>
1268
+ <a name='L1203'></a><a href='#L1203'>1203</a>
1269
+ <a name='L1204'></a><a href='#L1204'>1204</a>
1270
+ <a name='L1205'></a><a href='#L1205'>1205</a>
1271
+ <a name='L1206'></a><a href='#L1206'>1206</a>
1272
+ <a name='L1207'></a><a href='#L1207'>1207</a>
1273
+ <a name='L1208'></a><a href='#L1208'>1208</a>
1274
+ <a name='L1209'></a><a href='#L1209'>1209</a>
1275
+ <a name='L1210'></a><a href='#L1210'>1210</a>
1276
+ <a name='L1211'></a><a href='#L1211'>1211</a>
1277
+ <a name='L1212'></a><a href='#L1212'>1212</a>
1278
+ <a name='L1213'></a><a href='#L1213'>1213</a>
1279
+ <a name='L1214'></a><a href='#L1214'>1214</a>
1280
+ <a name='L1215'></a><a href='#L1215'>1215</a>
1281
+ <a name='L1216'></a><a href='#L1216'>1216</a>
1282
+ <a name='L1217'></a><a href='#L1217'>1217</a>
1283
+ <a name='L1218'></a><a href='#L1218'>1218</a>
1284
+ <a name='L1219'></a><a href='#L1219'>1219</a>
1285
+ <a name='L1220'></a><a href='#L1220'>1220</a>
1286
+ <a name='L1221'></a><a href='#L1221'>1221</a>
1287
+ <a name='L1222'></a><a href='#L1222'>1222</a>
1288
+ <a name='L1223'></a><a href='#L1223'>1223</a>
1289
+ <a name='L1224'></a><a href='#L1224'>1224</a>
1290
+ <a name='L1225'></a><a href='#L1225'>1225</a>
1291
+ <a name='L1226'></a><a href='#L1226'>1226</a>
1292
+ <a name='L1227'></a><a href='#L1227'>1227</a>
1293
+ <a name='L1228'></a><a href='#L1228'>1228</a>
1294
+ <a name='L1229'></a><a href='#L1229'>1229</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
1296
  <span class="cline-any cline-neutral">&nbsp;</span>
1105
1297
  <span class="cline-any cline-neutral">&nbsp;</span>
1106
1298
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1188,6 +1380,13 @@
1188
1380
  <span class="cline-any cline-yes">1x</span>
1189
1381
  <span class="cline-any cline-yes">1x</span>
1190
1382
  <span class="cline-any cline-yes">1x</span>
1383
+ <span class="cline-any cline-yes">1x</span>
1384
+ <span class="cline-any cline-yes">1x</span>
1385
+ <span class="cline-any cline-yes">1x</span>
1386
+ <span class="cline-any cline-neutral">&nbsp;</span>
1387
+ <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
1390
  <span class="cline-any cline-neutral">&nbsp;</span>
1192
1391
  <span class="cline-any cline-neutral">&nbsp;</span>
1193
1392
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1377,7 +1576,7 @@
1377
1576
  <span class="cline-any cline-neutral">&nbsp;</span>
1378
1577
  <span class="cline-any cline-neutral">&nbsp;</span>
1379
1578
  <span class="cline-any cline-neutral">&nbsp;</span>
1380
- <span class="cline-any cline-yes">9x</span>
1579
+ <span class="cline-any cline-yes">20x</span>
1381
1580
  <span class="cline-any cline-neutral">&nbsp;</span>
1382
1581
  <span class="cline-any cline-neutral">&nbsp;</span>
1383
1582
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1386,66 +1585,66 @@
1386
1585
  <span class="cline-any cline-neutral">&nbsp;</span>
1387
1586
  <span class="cline-any cline-neutral">&nbsp;</span>
1388
1587
  <span class="cline-any cline-neutral">&nbsp;</span>
1389
- <span class="cline-any cline-yes">9x</span>
1588
+ <span class="cline-any cline-yes">20x</span>
1390
1589
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
1590
  <span class="cline-any cline-neutral">&nbsp;</span>
1392
1591
  <span class="cline-any cline-neutral">&nbsp;</span>
1393
1592
  <span class="cline-any cline-neutral">&nbsp;</span>
1394
- <span class="cline-any cline-yes">9x</span>
1395
- <span class="cline-any cline-yes">6x</span>
1396
- <span class="cline-any cline-yes">6x</span>
1397
- <span class="cline-any cline-yes">3x</span>
1398
- <span class="cline-any cline-yes">1x</span>
1399
- <span class="cline-any cline-yes">1x</span>
1400
- <span class="cline-any cline-yes">2x</span>
1593
+ <span class="cline-any cline-yes">20x</span>
1594
+ <span class="cline-any cline-yes">13x</span>
1595
+ <span class="cline-any cline-yes">13x</span>
1596
+ <span class="cline-any cline-yes">7x</span>
1401
1597
  <span class="cline-any cline-yes">2x</span>
1402
1598
  <span class="cline-any cline-yes">2x</span>
1599
+ <span class="cline-any cline-yes">5x</span>
1600
+ <span class="cline-any cline-yes">5x</span>
1601
+ <span class="cline-any cline-yes">5x</span>
1403
1602
  <span class="cline-any cline-neutral">&nbsp;</span>
1404
1603
  <span class="cline-any cline-no">&nbsp;</span>
1405
1604
  <span class="cline-any cline-neutral">&nbsp;</span>
1406
1605
  <span class="cline-any cline-no">&nbsp;</span>
1407
1606
  <span class="cline-any cline-neutral">&nbsp;</span>
1408
1607
  <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-yes">9x</span>
1608
+ <span class="cline-any cline-yes">20x</span>
1410
1609
  <span class="cline-any cline-neutral">&nbsp;</span>
1411
- <span class="cline-any cline-yes">9x</span>
1412
- <span class="cline-any cline-yes">12x</span>
1610
+ <span class="cline-any cline-yes">20x</span>
1611
+ <span class="cline-any cline-yes">27x</span>
1413
1612
  <span class="cline-any cline-neutral">&nbsp;</span>
1414
- <span class="cline-any cline-yes">12x</span>
1415
- <span class="cline-any cline-yes">1x</span>
1613
+ <span class="cline-any cline-yes">27x</span>
1614
+ <span class="cline-any cline-yes">2x</span>
1416
1615
  <span class="cline-any cline-neutral">&nbsp;</span>
1417
1616
  <span class="cline-any cline-neutral">&nbsp;</span>
1418
- <span class="cline-any cline-yes">11x</span>
1419
- <span class="cline-any cline-yes">8x</span>
1617
+ <span class="cline-any cline-yes">25x</span>
1618
+ <span class="cline-any cline-yes">17x</span>
1420
1619
  <span class="cline-any cline-neutral">&nbsp;</span>
1421
1620
  <span class="cline-any cline-neutral">&nbsp;</span>
1422
- <span class="cline-any cline-yes">3x</span>
1423
- <span class="cline-any cline-yes">2x</span>
1621
+ <span class="cline-any cline-yes">8x</span>
1622
+ <span class="cline-any cline-yes">5x</span>
1424
1623
  <span class="cline-any cline-neutral">&nbsp;</span>
1425
1624
  <span class="cline-any cline-neutral">&nbsp;</span>
1426
1625
  <span class="cline-any cline-neutral">&nbsp;</span>
1427
1626
  <span class="cline-any cline-neutral">&nbsp;</span>
1428
- <span class="cline-any cline-yes">9x</span>
1627
+ <span class="cline-any cline-yes">20x</span>
1429
1628
  <span class="cline-any cline-neutral">&nbsp;</span>
1430
- <span class="cline-any cline-yes">9x</span>
1629
+ <span class="cline-any cline-yes">20x</span>
1431
1630
  <span class="cline-any cline-neutral">&nbsp;</span>
1432
- <span class="cline-any cline-yes">9x</span>
1433
- <span class="cline-any cline-yes">4x</span>
1631
+ <span class="cline-any cline-yes">20x</span>
1632
+ <span class="cline-any cline-yes">10x</span>
1434
1633
  <span class="cline-any cline-neutral">&nbsp;</span>
1435
1634
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
- <span class="cline-any cline-yes">5x</span>
1635
+ <span class="cline-any cline-yes">10x</span>
1437
1636
  <span class="cline-any cline-neutral">&nbsp;</span>
1438
1637
  <span class="cline-any cline-neutral">&nbsp;</span>
1439
1638
  <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-yes">9x</span>
1639
+ <span class="cline-any cline-yes">20x</span>
1441
1640
  <span class="cline-any cline-neutral">&nbsp;</span>
1442
- <span class="cline-any cline-yes">9x</span>
1641
+ <span class="cline-any cline-yes">20x</span>
1443
1642
  <span class="cline-any cline-neutral">&nbsp;</span>
1444
- <span class="cline-any cline-yes">9x</span>
1643
+ <span class="cline-any cline-yes">20x</span>
1445
1644
  <span class="cline-any cline-no">&nbsp;</span>
1446
1645
  <span class="cline-any cline-neutral">&nbsp;</span>
1447
1646
  <span class="cline-any cline-neutral">&nbsp;</span>
1448
- <span class="cline-any cline-yes">9x</span>
1647
+ <span class="cline-any cline-yes">20x</span>
1449
1648
  <span class="cline-any cline-neutral">&nbsp;</span>
1450
1649
  <span class="cline-any cline-neutral">&nbsp;</span>
1451
1650
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1526,28 +1725,29 @@
1526
1725
  <span class="cline-any cline-neutral">&nbsp;</span>
1527
1726
  <span class="cline-any cline-neutral">&nbsp;</span>
1528
1727
  <span class="cline-any cline-neutral">&nbsp;</span>
1529
- <span class="cline-any cline-yes">12x</span>
1530
- <span class="cline-any cline-yes">12x</span>
1728
+ <span class="cline-any cline-yes">14x</span>
1729
+ <span class="cline-any cline-yes">14x</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-yes">14x</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1531
1734
  <span class="cline-any cline-neutral">&nbsp;</span>
1532
1735
  <span class="cline-any cline-neutral">&nbsp;</span>
1533
- <span class="cline-any cline-yes">12x</span>
1534
- <span class="cline-any cline-yes">2x</span>
1535
1736
  <span class="cline-any cline-neutral">&nbsp;</span>
1536
- <span class="cline-any cline-yes">2x</span>
1537
1737
  <span class="cline-any cline-yes">2x</span>
1538
1738
  <span class="cline-any cline-neutral">&nbsp;</span>
1539
1739
  <span class="cline-any cline-neutral">&nbsp;</span>
1540
1740
  <span class="cline-any cline-neutral">&nbsp;</span>
1541
1741
  <span class="cline-any cline-neutral">&nbsp;</span>
1542
1742
  <span class="cline-any cline-neutral">&nbsp;</span>
1543
- <span class="cline-any cline-yes">2x</span>
1544
1743
  <span class="cline-any cline-neutral">&nbsp;</span>
1545
1744
  <span class="cline-any cline-yes">2x</span>
1546
1745
  <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-yes">2x</span>
1547
1747
  <span class="cline-any cline-neutral">&nbsp;</span>
1548
1748
  <span class="cline-any cline-neutral">&nbsp;</span>
1549
1749
  <span class="cline-any cline-neutral">&nbsp;</span>
1550
- <span class="cline-any cline-yes">10x</span>
1750
+ <span class="cline-any cline-yes">12x</span>
1551
1751
  <span class="cline-any cline-neutral">&nbsp;</span>
1552
1752
  <span class="cline-any cline-neutral">&nbsp;</span>
1553
1753
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1556,7 +1756,6 @@
1556
1756
  <span class="cline-any cline-neutral">&nbsp;</span>
1557
1757
  <span class="cline-any cline-yes">1x</span>
1558
1758
  <span class="cline-any cline-neutral">&nbsp;</span>
1559
- <span class="cline-any cline-yes">1x</span>
1560
1759
  <span class="cline-any cline-neutral">&nbsp;</span>
1561
1760
  <span class="cline-any cline-neutral">&nbsp;</span>
1562
1761
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1567,10 +1766,10 @@
1567
1766
  <span class="cline-any cline-yes">1x</span>
1568
1767
  <span class="cline-any cline-neutral">&nbsp;</span>
1569
1768
  <span class="cline-any cline-neutral">&nbsp;</span>
1570
- <span class="cline-any cline-yes">9x</span>
1769
+ <span class="cline-any cline-yes">11x</span>
1571
1770
  <span class="cline-any cline-neutral">&nbsp;</span>
1572
1771
  <span class="cline-any cline-neutral">&nbsp;</span>
1573
- <span class="cline-any cline-yes">9x</span>
1772
+ <span class="cline-any cline-yes">11x</span>
1574
1773
  <span class="cline-any cline-no">&nbsp;</span>
1575
1774
  <span class="cline-any cline-neutral">&nbsp;</span>
1576
1775
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1581,44 +1780,63 @@
1581
1780
  <span class="cline-any cline-no">&nbsp;</span>
1582
1781
  <span class="cline-any cline-neutral">&nbsp;</span>
1583
1782
  <span class="cline-any cline-neutral">&nbsp;</span>
1584
- <span class="cline-any cline-yes">9x</span>
1783
+ <span class="cline-any cline-yes">11x</span>
1585
1784
  <span class="cline-any cline-neutral">&nbsp;</span>
1586
1785
  <span class="cline-any cline-neutral">&nbsp;</span>
1587
- <span class="cline-any cline-yes">9x</span>
1786
+ <span class="cline-any cline-yes">11x</span>
1588
1787
  <span class="cline-any cline-neutral">&nbsp;</span>
1589
- <span class="cline-any cline-yes">9x</span>
1788
+ <span class="cline-any cline-yes">11x</span>
1590
1789
  <span class="cline-any cline-no">&nbsp;</span>
1591
1790
  <span class="cline-any cline-neutral">&nbsp;</span>
1791
+ <span class="cline-any cline-neutral">&nbsp;</span>
1792
+ <span class="cline-any cline-neutral">&nbsp;</span>
1793
+ <span class="cline-any cline-neutral">&nbsp;</span>
1794
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
1795
  <span class="cline-any cline-no">&nbsp;</span>
1796
+ <span class="cline-any cline-neutral">&nbsp;</span>
1593
1797
  <span class="cline-any cline-no">&nbsp;</span>
1594
1798
  <span class="cline-any cline-neutral">&nbsp;</span>
1595
1799
  <span class="cline-any cline-neutral">&nbsp;</span>
1596
1800
  <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-yes">11x</span>
1802
+ <span class="cline-any cline-neutral">&nbsp;</span>
1803
+ <span class="cline-any cline-yes">11x</span>
1597
1804
  <span class="cline-any cline-neutral">&nbsp;</span>
1805
+ <span class="cline-any cline-yes">11x</span>
1598
1806
  <span class="cline-any cline-neutral">&nbsp;</span>
1807
+ <span class="cline-any cline-yes">11x</span>
1808
+ <span class="cline-any cline-no">&nbsp;</span>
1599
1809
  <span class="cline-any cline-no">&nbsp;</span>
1600
1810
  <span class="cline-any cline-neutral">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-no">&nbsp;</span>
1601
1814
  <span class="cline-any cline-no">&nbsp;</span>
1602
1815
  <span class="cline-any cline-neutral">&nbsp;</span>
1603
1816
  <span class="cline-any cline-neutral">&nbsp;</span>
1604
1817
  <span class="cline-any cline-neutral">&nbsp;</span>
1605
1818
  <span class="cline-any cline-neutral">&nbsp;</span>
1606
- <span class="cline-any cline-yes">9x</span>
1607
1819
  <span class="cline-any cline-neutral">&nbsp;</span>
1608
- <span class="cline-any cline-yes">9x</span>
1609
1820
  <span class="cline-any cline-neutral">&nbsp;</span>
1610
1821
  <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-no">&nbsp;</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-no">&nbsp;</span>
1611
1827
  <span class="cline-any cline-neutral">&nbsp;</span>
1612
1828
  <span class="cline-any cline-neutral">&nbsp;</span>
1613
1829
  <span class="cline-any cline-neutral">&nbsp;</span>
1614
1830
  <span class="cline-any cline-neutral">&nbsp;</span>
1615
1831
  <span class="cline-any cline-neutral">&nbsp;</span>
1616
- <span class="cline-any cline-yes">9x</span>
1617
1832
  <span class="cline-any cline-neutral">&nbsp;</span>
1618
- <span class="cline-any cline-yes">9x</span>
1619
1833
  <span class="cline-any cline-no">&nbsp;</span>
1620
1834
  <span class="cline-any cline-neutral">&nbsp;</span>
1621
1835
  <span class="cline-any cline-no">&nbsp;</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-neutral">&nbsp;</span>
1839
+ <span class="cline-any cline-yes">11x</span>
1622
1840
  <span class="cline-any cline-no">&nbsp;</span>
1623
1841
  <span class="cline-any cline-neutral">&nbsp;</span>
1624
1842
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1627,27 +1845,31 @@
1627
1845
  <span class="cline-any cline-neutral">&nbsp;</span>
1628
1846
  <span class="cline-any cline-neutral">&nbsp;</span>
1629
1847
  <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-neutral">&nbsp;</span>
1630
1849
  <span class="cline-any cline-no">&nbsp;</span>
1631
1850
  <span class="cline-any cline-neutral">&nbsp;</span>
1632
1851
  <span class="cline-any cline-no">&nbsp;</span>
1633
1852
  <span class="cline-any cline-neutral">&nbsp;</span>
1634
1853
  <span class="cline-any cline-neutral">&nbsp;</span>
1635
1854
  <span class="cline-any cline-neutral">&nbsp;</span>
1855
+ <span class="cline-any cline-yes">11x</span>
1636
1856
  <span class="cline-any cline-neutral">&nbsp;</span>
1637
- <span class="cline-any cline-yes">9x</span>
1638
- <span class="cline-any cline-yes">9x</span>
1857
+ <span class="cline-any cline-yes">11x</span>
1639
1858
  <span class="cline-any cline-neutral">&nbsp;</span>
1640
- <span class="cline-any cline-yes">9x</span>
1641
- <span class="cline-any cline-yes">9x</span>
1642
1859
  <span class="cline-any cline-neutral">&nbsp;</span>
1643
1860
  <span class="cline-any cline-neutral">&nbsp;</span>
1644
1861
  <span class="cline-any cline-neutral">&nbsp;</span>
1645
1862
  <span class="cline-any cline-neutral">&nbsp;</span>
1646
1863
  <span class="cline-any cline-neutral">&nbsp;</span>
1647
1864
  <span class="cline-any cline-neutral">&nbsp;</span>
1648
- <span class="cline-any cline-yes">9x</span>
1649
1865
  <span class="cline-any cline-neutral">&nbsp;</span>
1650
- <span class="cline-any cline-yes">9x</span>
1866
+ <span class="cline-any cline-yes">11x</span>
1867
+ <span class="cline-any cline-neutral">&nbsp;</span>
1868
+ <span class="cline-any cline-neutral">&nbsp;</span>
1869
+ <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1871
+ <span class="cline-any cline-no">&nbsp;</span>
1872
+ <span class="cline-any cline-neutral">&nbsp;</span>
1651
1873
  <span class="cline-any cline-neutral">&nbsp;</span>
1652
1874
  <span class="cline-any cline-neutral">&nbsp;</span>
1653
1875
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1656,12 +1878,20 @@
1656
1878
  <span class="cline-any cline-no">&nbsp;</span>
1657
1879
  <span class="cline-any cline-neutral">&nbsp;</span>
1658
1880
  <span class="cline-any cline-no">&nbsp;</span>
1881
+ <span class="cline-any cline-neutral">&nbsp;</span>
1882
+ <span class="cline-any cline-neutral">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-neutral">&nbsp;</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
1886
  <span class="cline-any cline-no">&nbsp;</span>
1660
1887
  <span class="cline-any cline-neutral">&nbsp;</span>
1661
1888
  <span class="cline-any cline-neutral">&nbsp;</span>
1662
1889
  <span class="cline-any cline-neutral">&nbsp;</span>
1663
1890
  <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-yes">2x</span>
1892
+ <span class="cline-any cline-yes">2x</span>
1664
1893
  <span class="cline-any cline-neutral">&nbsp;</span>
1894
+ <span class="cline-any cline-yes">2x</span>
1665
1895
  <span class="cline-any cline-neutral">&nbsp;</span>
1666
1896
  <span class="cline-any cline-no">&nbsp;</span>
1667
1897
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1669,42 +1899,106 @@
1669
1899
  <span class="cline-any cline-neutral">&nbsp;</span>
1670
1900
  <span class="cline-any cline-neutral">&nbsp;</span>
1671
1901
  <span class="cline-any cline-neutral">&nbsp;</span>
1672
- <span class="cline-any cline-no">&nbsp;</span>
1673
1902
  <span class="cline-any cline-neutral">&nbsp;</span>
1674
1903
  <span class="cline-any cline-neutral">&nbsp;</span>
1675
1904
  <span class="cline-any cline-neutral">&nbsp;</span>
1676
1905
  <span class="cline-any cline-neutral">&nbsp;</span>
1677
1906
  <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-yes">12x</span>
1909
+ <span class="cline-any cline-yes">12x</span>
1910
+ <span class="cline-any cline-neutral">&nbsp;</span>
1911
+ <span class="cline-any cline-yes">12x</span>
1912
+ <span class="cline-any cline-neutral">&nbsp;</span>
1913
+ <span class="cline-any cline-yes">12x</span>
1914
+ <span class="cline-any cline-no">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-neutral">&nbsp;</span>
1917
+ <span class="cline-any cline-neutral">&nbsp;</span>
1918
+ <span class="cline-any cline-neutral">&nbsp;</span>
1678
1919
  <span class="cline-any cline-no">&nbsp;</span>
1679
1920
  <span class="cline-any cline-neutral">&nbsp;</span>
1680
1921
  <span class="cline-any cline-no">&nbsp;</span>
1681
1922
  <span class="cline-any cline-neutral">&nbsp;</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-neutral">&nbsp;</span>
1925
+ <span class="cline-any cline-yes">12x</span>
1926
+ <span class="cline-any cline-yes">2x</span>
1927
+ <span class="cline-any cline-neutral">&nbsp;</span>
1928
+ <span class="cline-any cline-yes">2x</span>
1929
+ <span class="cline-any cline-yes">2x</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-neutral">&nbsp;</span>
1932
+ <span class="cline-any cline-neutral">&nbsp;</span>
1933
+ <span class="cline-any cline-neutral">&nbsp;</span>
1934
+ <span class="cline-any cline-neutral">&nbsp;</span>
1935
+ <span class="cline-any cline-yes">2x</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-yes">2x</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</span>
1939
+ <span class="cline-any cline-neutral">&nbsp;</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-yes">10x</span>
1943
+ <span class="cline-any cline-neutral">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-yes">1x</span>
1950
+ <span class="cline-any cline-neutral">&nbsp;</span>
1951
+ <span class="cline-any cline-yes">1x</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-neutral">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-neutral">&nbsp;</span>
1956
+ <span class="cline-any cline-neutral">&nbsp;</span>
1957
+ <span class="cline-any cline-yes">1x</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-yes">1x</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-yes">9x</span>
1963
+ <span class="cline-any cline-neutral">&nbsp;</span>
1964
+ <span class="cline-any cline-neutral">&nbsp;</span>
1965
+ <span class="cline-any cline-yes">9x</span>
1682
1966
  <span class="cline-any cline-no">&nbsp;</span>
1683
1967
  <span class="cline-any cline-neutral">&nbsp;</span>
1684
1968
  <span class="cline-any cline-neutral">&nbsp;</span>
1685
1969
  <span class="cline-any cline-neutral">&nbsp;</span>
1686
1970
  <span class="cline-any cline-neutral">&nbsp;</span>
1971
+ <span class="cline-any cline-no">&nbsp;</span>
1687
1972
  <span class="cline-any cline-neutral">&nbsp;</span>
1688
1973
  <span class="cline-any cline-no">&nbsp;</span>
1689
1974
  <span class="cline-any cline-neutral">&nbsp;</span>
1690
1975
  <span class="cline-any cline-neutral">&nbsp;</span>
1691
1976
  <span class="cline-any cline-neutral">&nbsp;</span>
1977
+ <span class="cline-any cline-yes">9x</span>
1978
+ <span class="cline-any cline-no">&nbsp;</span>
1692
1979
  <span class="cline-any cline-neutral">&nbsp;</span>
1693
1980
  <span class="cline-any cline-neutral">&nbsp;</span>
1694
1981
  <span class="cline-any cline-neutral">&nbsp;</span>
1695
1982
  <span class="cline-any cline-neutral">&nbsp;</span>
1696
- <span class="cline-any cline-yes">11x</span>
1697
- <span class="cline-any cline-yes">11x</span>
1983
+ <span class="cline-any cline-no">&nbsp;</span>
1698
1984
  <span class="cline-any cline-neutral">&nbsp;</span>
1699
- <span class="cline-any cline-yes">11x</span>
1700
- <span class="cline-any cline-yes">3x</span>
1985
+ <span class="cline-any cline-no">&nbsp;</span>
1701
1986
  <span class="cline-any cline-neutral">&nbsp;</span>
1702
1987
  <span class="cline-any cline-neutral">&nbsp;</span>
1703
- <span class="cline-any cline-yes">8x</span>
1704
- <span class="cline-any cline-yes">8x</span>
1988
+ <span class="cline-any cline-yes">9x</span>
1705
1989
  <span class="cline-any cline-neutral">&nbsp;</span>
1706
1990
  <span class="cline-any cline-neutral">&nbsp;</span>
1991
+ <span class="cline-any cline-yes">9x</span>
1992
+ <span class="cline-any cline-neutral">&nbsp;</span>
1993
+ <span class="cline-any cline-yes">9x</span>
1994
+ <span class="cline-any cline-no">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1707
1996
  <span class="cline-any cline-no">&nbsp;</span>
1997
+ <span class="cline-any cline-no">&nbsp;</span>
1998
+ <span class="cline-any cline-neutral">&nbsp;</span>
1999
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
+ <span class="cline-any cline-neutral">&nbsp;</span>
2001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
2002
  <span class="cline-any cline-neutral">&nbsp;</span>
1709
2003
  <span class="cline-any cline-no">&nbsp;</span>
1710
2004
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1713,12 +2007,27 @@
1713
2007
  <span class="cline-any cline-neutral">&nbsp;</span>
1714
2008
  <span class="cline-any cline-neutral">&nbsp;</span>
1715
2009
  <span class="cline-any cline-neutral">&nbsp;</span>
2010
+ <span class="cline-any cline-yes">9x</span>
2011
+ <span class="cline-any cline-neutral">&nbsp;</span>
2012
+ <span class="cline-any cline-yes">9x</span>
2013
+ <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
2017
  <span class="cline-any cline-neutral">&nbsp;</span>
1717
2018
  <span class="cline-any cline-neutral">&nbsp;</span>
1718
2019
  <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-yes">9x</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
2022
+ <span class="cline-any cline-yes">9x</span>
1719
2023
  <span class="cline-any cline-no">&nbsp;</span>
1720
2024
  <span class="cline-any cline-neutral">&nbsp;</span>
1721
2025
  <span class="cline-any cline-no">&nbsp;</span>
2026
+ <span class="cline-any cline-no">&nbsp;</span>
2027
+ <span class="cline-any cline-neutral">&nbsp;</span>
2028
+ <span class="cline-any cline-neutral">&nbsp;</span>
2029
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
2031
  <span class="cline-any cline-neutral">&nbsp;</span>
1723
2032
  <span class="cline-any cline-neutral">&nbsp;</span>
1724
2033
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1728,12 +2037,63 @@
1728
2037
  <span class="cline-any cline-neutral">&nbsp;</span>
1729
2038
  <span class="cline-any cline-neutral">&nbsp;</span>
1730
2039
  <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-yes">9x</span>
2042
+ <span class="cline-any cline-yes">11x</span>
2043
+ <span class="cline-any cline-neutral">&nbsp;</span>
2044
+ <span class="cline-any cline-yes">9x</span>
2045
+ <span class="cline-any cline-yes">9x</span>
2046
+ <span class="cline-any cline-neutral">&nbsp;</span>
2047
+ <span class="cline-any cline-neutral">&nbsp;</span>
2048
+ <span class="cline-any cline-neutral">&nbsp;</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
2050
+ <span class="cline-any cline-neutral">&nbsp;</span>
2051
+ <span class="cline-any cline-neutral">&nbsp;</span>
2052
+ <span class="cline-any cline-yes">9x</span>
2053
+ <span class="cline-any cline-neutral">&nbsp;</span>
2054
+ <span class="cline-any cline-yes">9x</span>
2055
+ <span class="cline-any cline-neutral">&nbsp;</span>
2056
+ <span class="cline-any cline-neutral">&nbsp;</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
2058
+ <span class="cline-any cline-neutral">&nbsp;</span>
2059
+ <span class="cline-any cline-neutral">&nbsp;</span>
2060
+ <span class="cline-any cline-no">&nbsp;</span>
2061
+ <span class="cline-any cline-neutral">&nbsp;</span>
2062
+ <span class="cline-any cline-neutral">&nbsp;</span>
2063
+ <span class="cline-any cline-neutral">&nbsp;</span>
2064
+ <span class="cline-any cline-neutral">&nbsp;</span>
2065
+ <span class="cline-any cline-neutral">&nbsp;</span>
2066
+ <span class="cline-any cline-no">&nbsp;</span>
2067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
2068
  <span class="cline-any cline-no">&nbsp;</span>
1732
2069
  <span class="cline-any cline-neutral">&nbsp;</span>
1733
2070
  <span class="cline-any cline-no">&nbsp;</span>
1734
2071
  <span class="cline-any cline-neutral">&nbsp;</span>
1735
2072
  <span class="cline-any cline-neutral">&nbsp;</span>
1736
2073
  <span class="cline-any cline-neutral">&nbsp;</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
2075
+ <span class="cline-any cline-neutral">&nbsp;</span>
2076
+ <span class="cline-any cline-no">&nbsp;</span>
2077
+ <span class="cline-any cline-neutral">&nbsp;</span>
2078
+ <span class="cline-any cline-neutral">&nbsp;</span>
2079
+ <span class="cline-any cline-neutral">&nbsp;</span>
2080
+ <span class="cline-any cline-neutral">&nbsp;</span>
2081
+ <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-neutral">&nbsp;</span>
2083
+ <span class="cline-any cline-neutral">&nbsp;</span>
2084
+ <span class="cline-any cline-yes">11x</span>
2085
+ <span class="cline-any cline-yes">11x</span>
2086
+ <span class="cline-any cline-neutral">&nbsp;</span>
2087
+ <span class="cline-any cline-yes">11x</span>
2088
+ <span class="cline-any cline-yes">3x</span>
2089
+ <span class="cline-any cline-neutral">&nbsp;</span>
2090
+ <span class="cline-any cline-neutral">&nbsp;</span>
2091
+ <span class="cline-any cline-yes">8x</span>
2092
+ <span class="cline-any cline-yes">8x</span>
2093
+ <span class="cline-any cline-neutral">&nbsp;</span>
2094
+ <span class="cline-any cline-neutral">&nbsp;</span>
2095
+ <span class="cline-any cline-no">&nbsp;</span>
2096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
2097
  <span class="cline-any cline-no">&nbsp;</span>
1738
2098
  <span class="cline-any cline-neutral">&nbsp;</span>
1739
2099
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1743,6 +2103,7 @@
1743
2103
  <span class="cline-any cline-neutral">&nbsp;</span>
1744
2104
  <span class="cline-any cline-neutral">&nbsp;</span>
1745
2105
  <span class="cline-any cline-neutral">&nbsp;</span>
2106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
2107
  <span class="cline-any cline-yes">1x</span>
1747
2108
  <span class="cline-any cline-yes">1x</span>
1748
2109
  <span class="cline-any cline-yes">1x</span>
@@ -1821,6 +2182,22 @@
1821
2182
  <span class="cline-any cline-no">&nbsp;</span>
1822
2183
  <span class="cline-any cline-no">&nbsp;</span>
1823
2184
  <span class="cline-any cline-neutral">&nbsp;</span>
2185
+ <span class="cline-any cline-no">&nbsp;</span>
2186
+ <span class="cline-any cline-neutral">&nbsp;</span>
2187
+ <span class="cline-any cline-no">&nbsp;</span>
2188
+ <span class="cline-any cline-no">&nbsp;</span>
2189
+ <span class="cline-any cline-neutral">&nbsp;</span>
2190
+ <span class="cline-any cline-neutral">&nbsp;</span>
2191
+ <span class="cline-any cline-neutral">&nbsp;</span>
2192
+ <span class="cline-any cline-neutral">&nbsp;</span>
2193
+ <span class="cline-any cline-no">&nbsp;</span>
2194
+ <span class="cline-any cline-neutral">&nbsp;</span>
2195
+ <span class="cline-any cline-no">&nbsp;</span>
2196
+ <span class="cline-any cline-neutral">&nbsp;</span>
2197
+ <span class="cline-any cline-neutral">&nbsp;</span>
2198
+ <span class="cline-any cline-neutral">&nbsp;</span>
2199
+ <span class="cline-any cline-no">&nbsp;</span>
2200
+ <span class="cline-any cline-no">&nbsp;</span>
1824
2201
  <span class="cline-any cline-neutral">&nbsp;</span>
1825
2202
  <span class="cline-any cline-no">&nbsp;</span>
1826
2203
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1840,15 +2217,18 @@
1840
2217
  <span class="cline-any cline-neutral">&nbsp;</span>
1841
2218
  <span class="cline-any cline-neutral">&nbsp;</span>
1842
2219
  <span class="cline-any cline-neutral">&nbsp;</span>
1843
- <span class="cline-any cline-no">&nbsp;</span>
1844
2220
  <span class="cline-any cline-neutral">&nbsp;</span>
2221
+ <span class="cline-any cline-no">&nbsp;</span>
1845
2222
  <span class="cline-any cline-neutral">&nbsp;</span>
1846
2223
  <span class="cline-any cline-neutral">&nbsp;</span>
1847
2224
  <span class="cline-any cline-neutral">&nbsp;</span>
1848
2225
  <span class="cline-any cline-neutral">&nbsp;</span>
1849
2226
  <span class="cline-any cline-neutral">&nbsp;</span>
2227
+ <span class="cline-any cline-no">&nbsp;</span>
1850
2228
  <span class="cline-any cline-neutral">&nbsp;</span>
1851
2229
  <span class="cline-any cline-no">&nbsp;</span>
2230
+ <span class="cline-any cline-no">&nbsp;</span>
2231
+ <span class="cline-any cline-no">&nbsp;</span>
1852
2232
  <span class="cline-any cline-neutral">&nbsp;</span>
1853
2233
  <span class="cline-any cline-neutral">&nbsp;</span>
1854
2234
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1860,6 +2240,8 @@
1860
2240
  <span class="cline-any cline-no">&nbsp;</span>
1861
2241
  <span class="cline-any cline-neutral">&nbsp;</span>
1862
2242
  <span class="cline-any cline-neutral">&nbsp;</span>
2243
+ <span class="cline-any cline-neutral">&nbsp;</span>
2244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
2245
  <span class="cline-any cline-no">&nbsp;</span>
1864
2246
  <span class="cline-any cline-neutral">&nbsp;</span>
1865
2247
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2146,10 +2528,11 @@
2146
2528
  Feature,
2147
2529
  FeatureKey,
2148
2530
  InitialFeatures,
2531
+ OverrideFeature,
2149
2532
  StickyFeatures,
2533
+ Traffic,
2150
2534
  VariableType,
2151
2535
  VariableValue,
2152
- VariationType,
2153
2536
  VariationValue,
2154
2537
  Variation,
2155
2538
  RuleKey,
@@ -2161,7 +2544,7 @@ import { createLogger, Logger } from "./logger";
2161
2544
  import { DatafileReader } from "./datafileReader";
2162
2545
  import { Emitter } from "./emitter";
2163
2546
  import { getBucketedNumber } from "./bucket";
2164
- import { findForceFromFeature, getMatchedTrafficAndAllocation } from "./feature";
2547
+ import { findForceFromFeature, getMatchedTraffic, getMatchedTrafficAndAllocation } from "./feature";
2165
2548
  import { allConditionsAreMatched } from "./conditions";
2166
2549
  import { allGroupSegmentsAreMatched } from "./segments";
2167
2550
  &nbsp;
@@ -2217,6 +2600,9 @@ export type DatafileFetchHandler = (datafileUrl: string) =&gt; Promise&lt;Datafi
2217
2600
  &nbsp;
2218
2601
  export enum EvaluationReason {
2219
2602
  NOT_FOUND = "not_found",
2603
+ NO_VARIATIONS = "no_variations",
2604
+ DISABLED = "disabled",
2605
+ OUT_OF_RANGE = "out_of_range",
2220
2606
  FORCED = "forced",
2221
2607
  INITIAL = "initial",
2222
2608
  STICKY = "sticky",
@@ -2236,6 +2622,10 @@ export interface Evaluation {
2236
2622
  bucketValue?: BucketValue;
2237
2623
  ruleKey?: RuleKey;
2238
2624
  error?: Error;
2625
+ enabled?: boolean;
2626
+ traffic?: Traffic;
2627
+ sticky?: OverrideFeature;
2628
+ initial?: OverrideFeature;
2239
2629
  &nbsp;
2240
2630
  // variation
2241
2631
  variation?: Variation;
@@ -2258,7 +2648,7 @@ function fetchDatafileContent(
2258
2648
  <span class="cstat-no" title="statement not covered" > return fetch(datafileUrl).then(<span class="fstat-no" title="function not covered" >(r</span>es) =&gt; <span class="cstat-no" title="statement not covered" >res.json())</span>;</span>
2259
2649
  }
2260
2650
  &nbsp;
2261
- type FieldType = VariationType | VariableType;
2651
+ type FieldType = string | VariableType;
2262
2652
  type ValueType = VariableValue;
2263
2653
  &nbsp;
2264
2654
  export function <span class="fstat-no" title="function not covered" >getValueByType(</span>value: ValueType, fieldType: FieldType): ValueType {
@@ -2556,6 +2946,186 @@ export class FeaturevisorInstance {
2556
2946
  &nbsp;
2557
2947
  clearInterval(this.intervalId);
2558
2948
  }
2949
+ &nbsp;
2950
+ /**
2951
+ * Flag
2952
+ */
2953
+ evaluateFlag(featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: Evaluation {
2954
+ let evaluation: Evaluation;
2955
+ &nbsp;
2956
+ try {
2957
+ const key = typeof featureKey === "string" ? featureKey : <span class="branch-1 cbranch-no" title="branch not covered" >featureKey.key;</span>
2958
+ &nbsp;
2959
+ // sticky
2960
+ if (
2961
+ this.stickyFeatures &amp;&amp;
2962
+ this.stickyFeatures[key] &amp;&amp;
2963
+ typeof this.stickyFeatures[key].enabled !== "undefined"
2964
+ ) {
2965
+ evaluation = {
2966
+ featureKey: key,
2967
+ reason: EvaluationReason.STICKY,
2968
+ enabled: this.stickyFeatures[key].enabled,
2969
+ sticky: this.stickyFeatures[key],
2970
+ };
2971
+ &nbsp;
2972
+ this.logger.debug("using sticky enabled", evaluation);
2973
+ &nbsp;
2974
+ return evaluation;
2975
+ }
2976
+ &nbsp;
2977
+ // initial
2978
+ if (
2979
+ this.statuses &amp;&amp;
2980
+ !this.statuses.ready &amp;&amp;
2981
+ this.initialFeatures &amp;&amp;
2982
+ this.initialFeatures[key] &amp;&amp;
2983
+ typeof this.initialFeatures[key].enabled !== "undefined"
2984
+ ) {
2985
+ evaluation = {
2986
+ featureKey: key,
2987
+ reason: EvaluationReason.INITIAL,
2988
+ enabled: this.initialFeatures[key].enabled,
2989
+ initial: this.initialFeatures[key],
2990
+ };
2991
+ &nbsp;
2992
+ this.logger.debug("using initial enabled", evaluation);
2993
+ &nbsp;
2994
+ return evaluation;
2995
+ }
2996
+ &nbsp;
2997
+ const feature = this.getFeature(featureKey);
2998
+ &nbsp;
2999
+ // not found
3000
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature) {
3001
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3002
+ featureKey: key,
3003
+ reason: EvaluationReason.NOT_FOUND,
3004
+ };
3005
+ &nbsp;
3006
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found", evaluation);</span>
3007
+ &nbsp;
3008
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3009
+ }
3010
+ &nbsp;
3011
+ const finalContext = this.interceptContext ? this.interceptContext(context) : context;
3012
+ &nbsp;
3013
+ // forced
3014
+ const force = findForceFromFeature(feature, context, this.datafileReader);
3015
+ &nbsp;
3016
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (force &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >typeof force.enabled !== "undefined")</span> {
3017
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3018
+ featureKey: feature.key,
3019
+ reason: EvaluationReason.FORCED,
3020
+ enabled: force.enabled,
3021
+ };
3022
+ &nbsp;
3023
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("forced enabled found", evaluation);</span>
3024
+ &nbsp;
3025
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3026
+ }
3027
+ &nbsp;
3028
+ // bucketing
3029
+ const bucketValue = this.getBucketValue(feature, finalContext);
3030
+ &nbsp;
3031
+ const matchedTraffic = getMatchedTraffic(feature.traffic, finalContext, this.datafileReader);
3032
+ &nbsp;
3033
+ if (matchedTraffic) {
3034
+ // check if mutually exclusive
3035
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (feature.ranges &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >feature.ranges.length &gt; 0)</span> {
3036
+ const matchedRange = <span class="cstat-no" title="statement not covered" >feature.ranges.find(<span class="fstat-no" title="function not covered" >(r</span>ange) =&gt; {</span>
3037
+ <span class="cstat-no" title="statement not covered" > return bucketValue &gt;= range[0] &amp;&amp; bucketValue &lt; range[1];</span>
3038
+ });
3039
+ &nbsp;
3040
+ // matched
3041
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedRange) {</span>
3042
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3043
+ featureKey: feature.key,
3044
+ reason: EvaluationReason.ALLOCATED,
3045
+ enabled:
3046
+ typeof matchedTraffic.enabled === "undefined" ? true : matchedTraffic.enabled,
3047
+ bucketValue,
3048
+ };
3049
+ &nbsp;
3050
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3051
+ }
3052
+ &nbsp;
3053
+ // no match
3054
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3055
+ featureKey: feature.key,
3056
+ reason: EvaluationReason.OUT_OF_RANGE,
3057
+ enabled: false,
3058
+ bucketValue,
3059
+ };
3060
+ &nbsp;
3061
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("not matched", evaluation);</span>
3062
+ &nbsp;
3063
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3064
+ }
3065
+ &nbsp;
3066
+ // override from rule
3067
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof matchedTraffic.enabled !== "undefined") {
3068
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3069
+ featureKey: feature.key,
3070
+ reason: EvaluationReason.OVERRIDE,
3071
+ enabled: matchedTraffic.enabled,
3072
+ bucketValue,
3073
+ ruleKey: matchedTraffic.key,
3074
+ traffic: matchedTraffic,
3075
+ };
3076
+ &nbsp;
3077
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("override from rule", evaluation);</span>
3078
+ &nbsp;
3079
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3080
+ }
3081
+ &nbsp;
3082
+ // treated as enabled because of matched traffic
3083
+ if (bucketValue &lt; matchedTraffic.percentage) {
3084
+ // @TODO: verify if range check should be inclusive or not
3085
+ evaluation = {
3086
+ featureKey: feature.key,
3087
+ reason: EvaluationReason.RULE,
3088
+ enabled: true,
3089
+ bucketValue,
3090
+ ruleKey: matchedTraffic.key,
3091
+ traffic: matchedTraffic,
3092
+ };
3093
+ &nbsp;
3094
+ return evaluation;
3095
+ }
3096
+ }
3097
+ &nbsp;
3098
+ // nothing matched
3099
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3100
+ featureKey: feature.key,
3101
+ reason: EvaluationReason.ERROR,
3102
+ enabled: false,
3103
+ bucketValue,
3104
+ };
3105
+ &nbsp;
3106
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3107
+ } catch (e) {
3108
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3109
+ featureKey: typeof featureKey === "string" ? featureKey : featureKey.key,
3110
+ reason: EvaluationReason.ERROR,
3111
+ error: e,
3112
+ };
3113
+ &nbsp;
3114
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3115
+ }
3116
+ }
3117
+ &nbsp;
3118
+ isEnabled(featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: boolean {
3119
+ try {
3120
+ const evaluation = this.evaluateFlag(featureKey, context);
3121
+ &nbsp;
3122
+ return evaluation.enabled === true;
3123
+ } catch (e) {
3124
+ <span class="cstat-no" title="statement not covered" > this.logger.error("isEnabled", { featureKey, error: e });</span>
3125
+ &nbsp;
3126
+ <span class="cstat-no" title="statement not covered" > return false;</span>
3127
+ }
3128
+ }
2559
3129
  &nbsp;
2560
3130
  /**
2561
3131
  * Variation
@@ -2565,6 +3135,19 @@ export class FeaturevisorInstance {
2565
3135
  &nbsp;
2566
3136
  try {
2567
3137
  const key = typeof featureKey === "string" ? featureKey : <span class="branch-1 cbranch-no" title="branch not covered" >featureKey.key;</span>
3138
+ &nbsp;
3139
+ const flag = this.evaluateFlag(featureKey, context);
3140
+ &nbsp;
3141
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (flag.enabled === false) {
3142
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3143
+ featureKey: key,
3144
+ reason: EvaluationReason.DISABLED,
3145
+ };
3146
+ &nbsp;
3147
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("feature is disabled", evaluation);</span>
3148
+ &nbsp;
3149
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3150
+ }
2568
3151
  &nbsp;
2569
3152
  // sticky
2570
3153
  if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key]) {
@@ -2613,7 +3196,19 @@ export class FeaturevisorInstance {
2613
3196
  reason: EvaluationReason.NOT_FOUND,
2614
3197
  };
2615
3198
  &nbsp;
2616
- <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found in datafile", evaluation);</span>
3199
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("feature not found", evaluation);</span>
3200
+ &nbsp;
3201
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3202
+ }
3203
+ &nbsp;
3204
+ // no variations
3205
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!feature.variations || feature.variations.length === 0) {
3206
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3207
+ featureKey: key,
3208
+ reason: EvaluationReason.NO_VARIATIONS,
3209
+ };
3210
+ &nbsp;
3211
+ <span class="cstat-no" title="statement not covered" > this.logger.warn("no variations", evaluation);</span>
2617
3212
  &nbsp;
2618
3213
  <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2619
3214
  }
@@ -2689,30 +3284,14 @@ export class FeaturevisorInstance {
2689
3284
  }
2690
3285
  }
2691
3286
  &nbsp;
2692
- // fall back to default
2693
- const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) =&gt; <span class="cstat-no" title="statement not covered" >v.value === feature.defaultVariation)</span>;</span>
2694
- &nbsp;
2695
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation) {</span>
2696
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2697
- featureKey: feature.key,
2698
- reason: EvaluationReason.DEFAULTED,
2699
- bucketValue,
2700
- variation,
2701
- };
2702
- &nbsp;
2703
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using default variation", evaluation);</span>
2704
- &nbsp;
2705
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2706
- }
2707
- &nbsp;
2708
- // nothing matched (this should never happen)
3287
+ // nothing matched
2709
3288
  <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2710
3289
  featureKey: feature.key,
2711
3290
  reason: EvaluationReason.ERROR,
2712
3291
  bucketValue,
2713
3292
  };
2714
3293
  &nbsp;
2715
- <span class="cstat-no" title="statement not covered" > this.logger.error("no matched variation", evaluation);</span>
3294
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("no matched variation", evaluation);</span>
2716
3295
  &nbsp;
2717
3296
  <span class="cstat-no" title="statement not covered" > return evaluation;</span>
2718
3297
  } catch (e) {
@@ -2748,33 +3327,6 @@ export class FeaturevisorInstance {
2748
3327
  <span class="cstat-no" title="statement not covered" > return undefined;</span>
2749
3328
  }
2750
3329
  }
2751
- &nbsp;
2752
- <span class="fstat-no" title="function not covered" > getVariationBoolean(</span>
2753
- featureKey: FeatureKey | Feature,
2754
- context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{},</span>
2755
- ): boolean | undefined {
2756
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2757
- &nbsp;
2758
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "boolean") as boolean | undefined;</span>
2759
- }
2760
- &nbsp;
2761
- <span class="fstat-no" title="function not covered" > getVariationString(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: string | undefined {
2762
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2763
- &nbsp;
2764
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "string") as string | undefined;</span>
2765
- }
2766
- &nbsp;
2767
- <span class="fstat-no" title="function not covered" > getVariationInteger(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2768
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2769
- &nbsp;
2770
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "integer") as number | undefined;</span>
2771
- }
2772
- &nbsp;
2773
- <span class="fstat-no" title="function not covered" > getVariationDouble(</span>featureKey: FeatureKey | Feature, context: Context = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span>: number | undefined {
2774
- const variationValue = <span class="cstat-no" title="statement not covered" >this.getVariation(featureKey, context);</span>
2775
- &nbsp;
2776
- <span class="cstat-no" title="statement not covered" > return getValueByType(variationValue, "double") as number | undefined;</span>
2777
- }
2778
3330
  &nbsp;
2779
3331
  /**
2780
3332
  * Activate
@@ -2857,22 +3409,39 @@ export class FeaturevisorInstance {
2857
3409
  &nbsp;
2858
3410
  <span class="cstat-no" title="statement not covered" > try {</span>
2859
3411
  const key = <span class="cstat-no" title="statement not covered" >typeof featureKey === "string" ? featureKey : featureKey.key;</span>
3412
+ &nbsp;
3413
+ const flag = <span class="cstat-no" title="statement not covered" >this.evaluateFlag(featureKey, context);</span>
3414
+ &nbsp;
3415
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (flag.enabled === false) {</span>
3416
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3417
+ featureKey: key,
3418
+ reason: EvaluationReason.DISABLED,
3419
+ };
3420
+ &nbsp;
3421
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("feature is disabled", evaluation);</span>
3422
+ &nbsp;
3423
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3424
+ }
2860
3425
  &nbsp;
2861
3426
  // sticky
2862
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key] &amp;&amp; this.stickyFeatures[key].variables) {</span>
2863
- const result = <span class="cstat-no" title="statement not covered" >this.stickyFeatures[key].variables[variableKey];</span>
3427
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (this.stickyFeatures &amp;&amp; this.stickyFeatures[key]) {</span>
3428
+ const variables = <span class="cstat-no" title="statement not covered" >this.stickyFeatures[key].variables;</span>
2864
3429
  &nbsp;
2865
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof result !== "undefined") {</span>
2866
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2867
- featureKey: key,
2868
- reason: EvaluationReason.STICKY,
2869
- variableKey,
2870
- variableValue: result,
2871
- };
3430
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variables) {</span>
3431
+ const result = <span class="cstat-no" title="statement not covered" >variables[variableKey];</span>
2872
3432
  &nbsp;
2873
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using sticky variable", evaluation);</span>
3433
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof result !== "undefined") {</span>
3434
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3435
+ featureKey: key,
3436
+ reason: EvaluationReason.STICKY,
3437
+ variableKey,
3438
+ variableValue: result,
3439
+ };
2874
3440
  &nbsp;
2875
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3441
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("using sticky variable", evaluation);</span>
3442
+ &nbsp;
3443
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3444
+ }
2876
3445
  }
2877
3446
  }
2878
3447
  &nbsp;
@@ -2881,20 +3450,24 @@ export class FeaturevisorInstance {
2881
3450
  this.statuses &amp;&amp;
2882
3451
  !this.statuses.ready &amp;&amp;
2883
3452
  this.initialFeatures &amp;&amp;
2884
- this.initialFeatures[key] &amp;&amp;
2885
- this.initialFeatures[key].variables &amp;&amp;
2886
- typeof this.initialFeatures[key].variables[variableKey] !== "undefined"
3453
+ this.initialFeatures[key]
2887
3454
  ) {
2888
- <span class="cstat-no" title="statement not covered" > evaluation = {</span>
2889
- featureKey: key,
2890
- reason: EvaluationReason.INITIAL,
2891
- variableKey,
2892
- variableValue: this.initialFeatures[key].variables[variableKey],
2893
- };
3455
+ const variables = <span class="cstat-no" title="statement not covered" >this.initialFeatures[key].variables;</span>
2894
3456
  &nbsp;
2895
- <span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", evaluation);</span>
3457
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variables) {</span>
3458
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof variables[variableKey] !== "undefined") {</span>
3459
+ <span class="cstat-no" title="statement not covered" > evaluation = {</span>
3460
+ featureKey: key,
3461
+ reason: EvaluationReason.INITIAL,
3462
+ variableKey,
3463
+ variableValue: variables[variableKey],
3464
+ };
2896
3465
  &nbsp;
2897
- <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3466
+ <span class="cstat-no" title="statement not covered" > this.logger.debug("using initial variable", evaluation);</span>
3467
+ &nbsp;
3468
+ <span class="cstat-no" title="statement not covered" > return evaluation;</span>
3469
+ }
3470
+ }
2898
3471
  }
2899
3472
  &nbsp;
2900
3473
  const feature = <span class="cstat-no" title="statement not covered" >this.getFeature(featureKey);</span>
@@ -2981,7 +3554,7 @@ export class FeaturevisorInstance {
2981
3554
  }
2982
3555
  &nbsp;
2983
3556
  // regular allocation
2984
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedAllocation &amp;&amp; matchedAllocation.variation) {</span>
3557
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (matchedAllocation &amp;&amp; matchedAllocation.variation &amp;&amp; Array.isArray(feature.variations)) {</span>
2985
3558
  const variation = <span class="cstat-no" title="statement not covered" >feature.variations.find(<span class="fstat-no" title="function not covered" >(v</span>) =&gt; <span class="cstat-no" title="statement not covered" >v.value === matchedAllocation.variation)</span>;</span>
2986
3559
  &nbsp;
2987
3560
  <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (variation &amp;&amp; variation.variables) {</span>
@@ -3181,7 +3754,7 @@ export function createInstance(options: InstanceOptions): FeaturevisorInstance {
3181
3754
  <div class='footer quiet pad2 space-top1 center small'>
3182
3755
  Code coverage generated by
3183
3756
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3184
- at 2023-07-14T17:03:15.956Z
3757
+ at 2023-07-16T19:53:34.344Z
3185
3758
  </div>
3186
3759
  <script src="prettify.js"></script>
3187
3760
  <script>