@featurevisor/core 2.13.0 → 2.15.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.
Files changed (121) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/coverage/clover.xml +1499 -1028
  3. package/coverage/coverage-final.json +21 -17
  4. package/coverage/lcov-report/builder/allocator.ts.html +1 -1
  5. package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
  6. package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
  7. package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
  8. package/coverage/lcov-report/builder/index.html +38 -8
  9. package/coverage/lcov-report/builder/mutateVariables.ts.html +400 -0
  10. package/coverage/lcov-report/builder/mutator.ts.html +796 -0
  11. package/coverage/lcov-report/builder/revision.ts.html +1 -1
  12. package/coverage/lcov-report/builder/traffic.ts.html +1 -1
  13. package/coverage/lcov-report/config/index.html +30 -15
  14. package/coverage/lcov-report/config/index.ts.html +88 -0
  15. package/coverage/lcov-report/config/projectConfig.ts.html +79 -46
  16. package/coverage/lcov-report/datasource/adapter.ts.html +74 -11
  17. package/coverage/lcov-report/datasource/datasource.ts.html +77 -26
  18. package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +693 -69
  19. package/coverage/lcov-report/datasource/index.html +35 -35
  20. package/coverage/lcov-report/datasource/index.ts.html +1 -1
  21. package/coverage/lcov-report/index.html +53 -53
  22. package/coverage/lcov-report/linter/attributeSchema.ts.html +4 -4
  23. package/coverage/lcov-report/linter/checkCircularDependency.ts.html +1 -1
  24. package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +1 -1
  25. package/coverage/lcov-report/linter/conditionSchema.ts.html +7 -7
  26. package/coverage/lcov-report/linter/featureSchema.ts.html +848 -389
  27. package/coverage/lcov-report/linter/groupSchema.ts.html +3 -3
  28. package/coverage/lcov-report/linter/index.html +50 -35
  29. package/coverage/lcov-report/linter/lintProject.ts.html +437 -92
  30. package/coverage/lcov-report/linter/mutationNotation.ts.html +1309 -0
  31. package/coverage/lcov-report/linter/printError.ts.html +9 -9
  32. package/coverage/lcov-report/linter/schema.ts.html +69 -69
  33. package/coverage/lcov-report/linter/segmentSchema.ts.html +3 -3
  34. package/coverage/lcov-report/linter/testSchema.ts.html +10 -10
  35. package/coverage/lcov-report/list/index.html +1 -1
  36. package/coverage/lcov-report/list/matrix.ts.html +1 -1
  37. package/coverage/lcov-report/parsers/index.html +1 -1
  38. package/coverage/lcov-report/parsers/index.ts.html +4 -4
  39. package/coverage/lcov-report/parsers/json.ts.html +2 -2
  40. package/coverage/lcov-report/parsers/yml.ts.html +6 -6
  41. package/coverage/lcov-report/tester/cliFormat.ts.html +1 -1
  42. package/coverage/lcov-report/tester/helpers.ts.html +1 -1
  43. package/coverage/lcov-report/tester/index.html +1 -1
  44. package/coverage/lcov-report/utils/git.ts.html +118 -16
  45. package/coverage/lcov-report/utils/index.html +14 -14
  46. package/coverage/lcov.info +2918 -1932
  47. package/lib/builder/buildDatafile.js +8 -3
  48. package/lib/builder/buildDatafile.js.map +1 -1
  49. package/lib/builder/mutateVariables.d.ts +14 -0
  50. package/lib/builder/mutateVariables.js +90 -0
  51. package/lib/builder/mutateVariables.js.map +1 -0
  52. package/lib/builder/mutateVariables.spec.d.ts +1 -0
  53. package/lib/builder/mutateVariables.spec.js +1045 -0
  54. package/lib/builder/mutateVariables.spec.js.map +1 -0
  55. package/lib/builder/mutator.d.ts +20 -0
  56. package/lib/builder/mutator.js +223 -0
  57. package/lib/builder/mutator.js.map +1 -0
  58. package/lib/builder/mutator.spec.d.ts +1 -0
  59. package/lib/builder/mutator.spec.js +368 -0
  60. package/lib/builder/mutator.spec.js.map +1 -0
  61. package/lib/config/projectConfig.d.ts +3 -0
  62. package/lib/config/projectConfig.js +7 -1
  63. package/lib/config/projectConfig.js.map +1 -1
  64. package/lib/config/projectConfig.spec.d.ts +1 -0
  65. package/lib/config/projectConfig.spec.js +24 -0
  66. package/lib/config/projectConfig.spec.js.map +1 -0
  67. package/lib/datasource/adapter.d.ts +7 -0
  68. package/lib/datasource/adapter.js +7 -0
  69. package/lib/datasource/adapter.js.map +1 -1
  70. package/lib/datasource/datasource.d.ts +3 -1
  71. package/lib/datasource/datasource.js +6 -0
  72. package/lib/datasource/datasource.js.map +1 -1
  73. package/lib/datasource/filesystemAdapter.d.ts +8 -0
  74. package/lib/datasource/filesystemAdapter.js +134 -7
  75. package/lib/datasource/filesystemAdapter.js.map +1 -1
  76. package/lib/datasource/filesystemAdapter.spec.d.ts +1 -0
  77. package/lib/datasource/filesystemAdapter.spec.js +88 -0
  78. package/lib/datasource/filesystemAdapter.spec.js.map +1 -0
  79. package/lib/linter/conditionSchema.spec.js +2 -0
  80. package/lib/linter/conditionSchema.spec.js.map +1 -1
  81. package/lib/linter/featureSchema.d.ts +7 -7
  82. package/lib/linter/featureSchema.js +176 -103
  83. package/lib/linter/featureSchema.js.map +1 -1
  84. package/lib/linter/featureSchema.spec.js +167 -0
  85. package/lib/linter/featureSchema.spec.js.map +1 -1
  86. package/lib/linter/lintProject.d.ts +2 -0
  87. package/lib/linter/lintProject.js +85 -8
  88. package/lib/linter/lintProject.js.map +1 -1
  89. package/lib/linter/lintProject.spec.js +37 -0
  90. package/lib/linter/lintProject.spec.js.map +1 -1
  91. package/lib/linter/mutationNotation.d.ts +47 -0
  92. package/lib/linter/mutationNotation.js +381 -0
  93. package/lib/linter/mutationNotation.js.map +1 -0
  94. package/lib/linter/mutationNotation.spec.d.ts +1 -0
  95. package/lib/linter/mutationNotation.spec.js +549 -0
  96. package/lib/linter/mutationNotation.spec.js.map +1 -0
  97. package/lib/linter/segmentSchema.spec.js +2 -0
  98. package/lib/linter/segmentSchema.spec.js.map +1 -1
  99. package/lib/utils/git.js +32 -7
  100. package/lib/utils/git.js.map +1 -1
  101. package/package.json +2 -2
  102. package/src/builder/buildDatafile.ts +29 -3
  103. package/src/builder/mutateVariables.spec.ts +1134 -0
  104. package/src/builder/mutateVariables.ts +105 -0
  105. package/src/builder/mutator.spec.ts +413 -0
  106. package/src/builder/mutator.ts +237 -0
  107. package/src/config/projectConfig.spec.ts +31 -0
  108. package/src/config/projectConfig.ts +11 -0
  109. package/src/datasource/adapter.ts +21 -0
  110. package/src/datasource/datasource.ts +18 -1
  111. package/src/datasource/filesystemAdapter.spec.ts +153 -0
  112. package/src/datasource/filesystemAdapter.ts +216 -8
  113. package/src/linter/conditionSchema.spec.ts +2 -0
  114. package/src/linter/featureSchema.spec.ts +203 -0
  115. package/src/linter/featureSchema.ts +320 -167
  116. package/src/linter/lintProject.spec.ts +74 -0
  117. package/src/linter/lintProject.ts +123 -8
  118. package/src/linter/mutationNotation.spec.ts +642 -0
  119. package/src/linter/mutationNotation.ts +408 -0
  120. package/src/linter/segmentSchema.spec.ts +2 -0
  121. package/src/utils/git.ts +41 -7
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">69.79% </span>
26
+ <span class="strong">70.96% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>335/480</span>
28
+ <span class='fraction'>369/520</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">59.94% </span>
33
+ <span class="strong">61.49% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>202/337</span>
35
+ <span class='fraction'>222/361</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">74.64% </span>
40
+ <span class="strong">76.38% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>53/71</span>
42
+ <span class='fraction'>55/72</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">74.02% </span>
47
+ <span class="strong">75.1% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>322/435</span>
49
+ <span class='fraction'>356/474</span>
50
50
  </div>
51
51
 
52
52
 
@@ -1676,7 +1676,160 @@
1676
1676
  <a name='L1611'></a><a href='#L1611'>1611</a>
1677
1677
  <a name='L1612'></a><a href='#L1612'>1612</a>
1678
1678
  <a name='L1613'></a><a href='#L1613'>1613</a>
1679
- <a name='L1614'></a><a href='#L1614'>1614</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <a name='L1614'></a><a href='#L1614'>1614</a>
1680
+ <a name='L1615'></a><a href='#L1615'>1615</a>
1681
+ <a name='L1616'></a><a href='#L1616'>1616</a>
1682
+ <a name='L1617'></a><a href='#L1617'>1617</a>
1683
+ <a name='L1618'></a><a href='#L1618'>1618</a>
1684
+ <a name='L1619'></a><a href='#L1619'>1619</a>
1685
+ <a name='L1620'></a><a href='#L1620'>1620</a>
1686
+ <a name='L1621'></a><a href='#L1621'>1621</a>
1687
+ <a name='L1622'></a><a href='#L1622'>1622</a>
1688
+ <a name='L1623'></a><a href='#L1623'>1623</a>
1689
+ <a name='L1624'></a><a href='#L1624'>1624</a>
1690
+ <a name='L1625'></a><a href='#L1625'>1625</a>
1691
+ <a name='L1626'></a><a href='#L1626'>1626</a>
1692
+ <a name='L1627'></a><a href='#L1627'>1627</a>
1693
+ <a name='L1628'></a><a href='#L1628'>1628</a>
1694
+ <a name='L1629'></a><a href='#L1629'>1629</a>
1695
+ <a name='L1630'></a><a href='#L1630'>1630</a>
1696
+ <a name='L1631'></a><a href='#L1631'>1631</a>
1697
+ <a name='L1632'></a><a href='#L1632'>1632</a>
1698
+ <a name='L1633'></a><a href='#L1633'>1633</a>
1699
+ <a name='L1634'></a><a href='#L1634'>1634</a>
1700
+ <a name='L1635'></a><a href='#L1635'>1635</a>
1701
+ <a name='L1636'></a><a href='#L1636'>1636</a>
1702
+ <a name='L1637'></a><a href='#L1637'>1637</a>
1703
+ <a name='L1638'></a><a href='#L1638'>1638</a>
1704
+ <a name='L1639'></a><a href='#L1639'>1639</a>
1705
+ <a name='L1640'></a><a href='#L1640'>1640</a>
1706
+ <a name='L1641'></a><a href='#L1641'>1641</a>
1707
+ <a name='L1642'></a><a href='#L1642'>1642</a>
1708
+ <a name='L1643'></a><a href='#L1643'>1643</a>
1709
+ <a name='L1644'></a><a href='#L1644'>1644</a>
1710
+ <a name='L1645'></a><a href='#L1645'>1645</a>
1711
+ <a name='L1646'></a><a href='#L1646'>1646</a>
1712
+ <a name='L1647'></a><a href='#L1647'>1647</a>
1713
+ <a name='L1648'></a><a href='#L1648'>1648</a>
1714
+ <a name='L1649'></a><a href='#L1649'>1649</a>
1715
+ <a name='L1650'></a><a href='#L1650'>1650</a>
1716
+ <a name='L1651'></a><a href='#L1651'>1651</a>
1717
+ <a name='L1652'></a><a href='#L1652'>1652</a>
1718
+ <a name='L1653'></a><a href='#L1653'>1653</a>
1719
+ <a name='L1654'></a><a href='#L1654'>1654</a>
1720
+ <a name='L1655'></a><a href='#L1655'>1655</a>
1721
+ <a name='L1656'></a><a href='#L1656'>1656</a>
1722
+ <a name='L1657'></a><a href='#L1657'>1657</a>
1723
+ <a name='L1658'></a><a href='#L1658'>1658</a>
1724
+ <a name='L1659'></a><a href='#L1659'>1659</a>
1725
+ <a name='L1660'></a><a href='#L1660'>1660</a>
1726
+ <a name='L1661'></a><a href='#L1661'>1661</a>
1727
+ <a name='L1662'></a><a href='#L1662'>1662</a>
1728
+ <a name='L1663'></a><a href='#L1663'>1663</a>
1729
+ <a name='L1664'></a><a href='#L1664'>1664</a>
1730
+ <a name='L1665'></a><a href='#L1665'>1665</a>
1731
+ <a name='L1666'></a><a href='#L1666'>1666</a>
1732
+ <a name='L1667'></a><a href='#L1667'>1667</a>
1733
+ <a name='L1668'></a><a href='#L1668'>1668</a>
1734
+ <a name='L1669'></a><a href='#L1669'>1669</a>
1735
+ <a name='L1670'></a><a href='#L1670'>1670</a>
1736
+ <a name='L1671'></a><a href='#L1671'>1671</a>
1737
+ <a name='L1672'></a><a href='#L1672'>1672</a>
1738
+ <a name='L1673'></a><a href='#L1673'>1673</a>
1739
+ <a name='L1674'></a><a href='#L1674'>1674</a>
1740
+ <a name='L1675'></a><a href='#L1675'>1675</a>
1741
+ <a name='L1676'></a><a href='#L1676'>1676</a>
1742
+ <a name='L1677'></a><a href='#L1677'>1677</a>
1743
+ <a name='L1678'></a><a href='#L1678'>1678</a>
1744
+ <a name='L1679'></a><a href='#L1679'>1679</a>
1745
+ <a name='L1680'></a><a href='#L1680'>1680</a>
1746
+ <a name='L1681'></a><a href='#L1681'>1681</a>
1747
+ <a name='L1682'></a><a href='#L1682'>1682</a>
1748
+ <a name='L1683'></a><a href='#L1683'>1683</a>
1749
+ <a name='L1684'></a><a href='#L1684'>1684</a>
1750
+ <a name='L1685'></a><a href='#L1685'>1685</a>
1751
+ <a name='L1686'></a><a href='#L1686'>1686</a>
1752
+ <a name='L1687'></a><a href='#L1687'>1687</a>
1753
+ <a name='L1688'></a><a href='#L1688'>1688</a>
1754
+ <a name='L1689'></a><a href='#L1689'>1689</a>
1755
+ <a name='L1690'></a><a href='#L1690'>1690</a>
1756
+ <a name='L1691'></a><a href='#L1691'>1691</a>
1757
+ <a name='L1692'></a><a href='#L1692'>1692</a>
1758
+ <a name='L1693'></a><a href='#L1693'>1693</a>
1759
+ <a name='L1694'></a><a href='#L1694'>1694</a>
1760
+ <a name='L1695'></a><a href='#L1695'>1695</a>
1761
+ <a name='L1696'></a><a href='#L1696'>1696</a>
1762
+ <a name='L1697'></a><a href='#L1697'>1697</a>
1763
+ <a name='L1698'></a><a href='#L1698'>1698</a>
1764
+ <a name='L1699'></a><a href='#L1699'>1699</a>
1765
+ <a name='L1700'></a><a href='#L1700'>1700</a>
1766
+ <a name='L1701'></a><a href='#L1701'>1701</a>
1767
+ <a name='L1702'></a><a href='#L1702'>1702</a>
1768
+ <a name='L1703'></a><a href='#L1703'>1703</a>
1769
+ <a name='L1704'></a><a href='#L1704'>1704</a>
1770
+ <a name='L1705'></a><a href='#L1705'>1705</a>
1771
+ <a name='L1706'></a><a href='#L1706'>1706</a>
1772
+ <a name='L1707'></a><a href='#L1707'>1707</a>
1773
+ <a name='L1708'></a><a href='#L1708'>1708</a>
1774
+ <a name='L1709'></a><a href='#L1709'>1709</a>
1775
+ <a name='L1710'></a><a href='#L1710'>1710</a>
1776
+ <a name='L1711'></a><a href='#L1711'>1711</a>
1777
+ <a name='L1712'></a><a href='#L1712'>1712</a>
1778
+ <a name='L1713'></a><a href='#L1713'>1713</a>
1779
+ <a name='L1714'></a><a href='#L1714'>1714</a>
1780
+ <a name='L1715'></a><a href='#L1715'>1715</a>
1781
+ <a name='L1716'></a><a href='#L1716'>1716</a>
1782
+ <a name='L1717'></a><a href='#L1717'>1717</a>
1783
+ <a name='L1718'></a><a href='#L1718'>1718</a>
1784
+ <a name='L1719'></a><a href='#L1719'>1719</a>
1785
+ <a name='L1720'></a><a href='#L1720'>1720</a>
1786
+ <a name='L1721'></a><a href='#L1721'>1721</a>
1787
+ <a name='L1722'></a><a href='#L1722'>1722</a>
1788
+ <a name='L1723'></a><a href='#L1723'>1723</a>
1789
+ <a name='L1724'></a><a href='#L1724'>1724</a>
1790
+ <a name='L1725'></a><a href='#L1725'>1725</a>
1791
+ <a name='L1726'></a><a href='#L1726'>1726</a>
1792
+ <a name='L1727'></a><a href='#L1727'>1727</a>
1793
+ <a name='L1728'></a><a href='#L1728'>1728</a>
1794
+ <a name='L1729'></a><a href='#L1729'>1729</a>
1795
+ <a name='L1730'></a><a href='#L1730'>1730</a>
1796
+ <a name='L1731'></a><a href='#L1731'>1731</a>
1797
+ <a name='L1732'></a><a href='#L1732'>1732</a>
1798
+ <a name='L1733'></a><a href='#L1733'>1733</a>
1799
+ <a name='L1734'></a><a href='#L1734'>1734</a>
1800
+ <a name='L1735'></a><a href='#L1735'>1735</a>
1801
+ <a name='L1736'></a><a href='#L1736'>1736</a>
1802
+ <a name='L1737'></a><a href='#L1737'>1737</a>
1803
+ <a name='L1738'></a><a href='#L1738'>1738</a>
1804
+ <a name='L1739'></a><a href='#L1739'>1739</a>
1805
+ <a name='L1740'></a><a href='#L1740'>1740</a>
1806
+ <a name='L1741'></a><a href='#L1741'>1741</a>
1807
+ <a name='L1742'></a><a href='#L1742'>1742</a>
1808
+ <a name='L1743'></a><a href='#L1743'>1743</a>
1809
+ <a name='L1744'></a><a href='#L1744'>1744</a>
1810
+ <a name='L1745'></a><a href='#L1745'>1745</a>
1811
+ <a name='L1746'></a><a href='#L1746'>1746</a>
1812
+ <a name='L1747'></a><a href='#L1747'>1747</a>
1813
+ <a name='L1748'></a><a href='#L1748'>1748</a>
1814
+ <a name='L1749'></a><a href='#L1749'>1749</a>
1815
+ <a name='L1750'></a><a href='#L1750'>1750</a>
1816
+ <a name='L1751'></a><a href='#L1751'>1751</a>
1817
+ <a name='L1752'></a><a href='#L1752'>1752</a>
1818
+ <a name='L1753'></a><a href='#L1753'>1753</a>
1819
+ <a name='L1754'></a><a href='#L1754'>1754</a>
1820
+ <a name='L1755'></a><a href='#L1755'>1755</a>
1821
+ <a name='L1756'></a><a href='#L1756'>1756</a>
1822
+ <a name='L1757'></a><a href='#L1757'>1757</a>
1823
+ <a name='L1758'></a><a href='#L1758'>1758</a>
1824
+ <a name='L1759'></a><a href='#L1759'>1759</a>
1825
+ <a name='L1760'></a><a href='#L1760'>1760</a>
1826
+ <a name='L1761'></a><a href='#L1761'>1761</a>
1827
+ <a name='L1762'></a><a href='#L1762'>1762</a>
1828
+ <a name='L1763'></a><a href='#L1763'>1763</a>
1829
+ <a name='L1764'></a><a href='#L1764'>1764</a>
1830
+ <a name='L1765'></a><a href='#L1765'>1765</a>
1831
+ <a name='L1766'></a><a href='#L1766'>1766</a>
1832
+ <a name='L1767'></a><a href='#L1767'>1767</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1680
1833
  <span class="cline-any cline-yes">2x</span>
1681
1834
  <span class="cline-any cline-neutral">&nbsp;</span>
1682
1835
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1686,6 +1839,12 @@
1686
1839
  <span class="cline-any cline-neutral">&nbsp;</span>
1687
1840
  <span class="cline-any cline-neutral">&nbsp;</span>
1688
1841
  <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-yes">2x</span>
1843
+ <span class="cline-any cline-neutral">&nbsp;</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1689
1848
  <span class="cline-any cline-neutral">&nbsp;</span>
1690
1849
  <span class="cline-any cline-neutral">&nbsp;</span>
1691
1850
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1697,7 +1856,7 @@
1697
1856
  <span class="cline-any cline-neutral">&nbsp;</span>
1698
1857
  <span class="cline-any cline-neutral">&nbsp;</span>
1699
1858
  <span class="cline-any cline-neutral">&nbsp;</span>
1700
- <span class="cline-any cline-yes">18x</span>
1859
+ <span class="cline-any cline-yes">12x</span>
1701
1860
  <span class="cline-any cline-neutral">&nbsp;</span>
1702
1861
  <span class="cline-any cline-neutral">&nbsp;</span>
1703
1862
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1706,7 +1865,7 @@
1706
1865
  <span class="cline-any cline-neutral">&nbsp;</span>
1707
1866
  <span class="cline-any cline-neutral">&nbsp;</span>
1708
1867
  <span class="cline-any cline-neutral">&nbsp;</span>
1709
- <span class="cline-any cline-yes">1782x</span>
1868
+ <span class="cline-any cline-yes">2811x</span>
1710
1869
  <span class="cline-any cline-neutral">&nbsp;</span>
1711
1870
  <span class="cline-any cline-neutral">&nbsp;</span>
1712
1871
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1754,10 +1913,10 @@
1754
1913
  <span class="cline-any cline-neutral">&nbsp;</span>
1755
1914
  <span class="cline-any cline-neutral">&nbsp;</span>
1756
1915
  <span class="cline-any cline-neutral">&nbsp;</span>
1757
- <span class="cline-any cline-yes">1638x</span>
1758
- <span class="cline-any cline-yes">387x</span>
1916
+ <span class="cline-any cline-yes">2515x</span>
1917
+ <span class="cline-any cline-yes">503x</span>
1759
1918
  <span class="cline-any cline-neutral">&nbsp;</span>
1760
- <span class="cline-any cline-yes">1251x</span>
1919
+ <span class="cline-any cline-yes">2012x</span>
1761
1920
  <span class="cline-any cline-neutral">&nbsp;</span>
1762
1921
  <span class="cline-any cline-neutral">&nbsp;</span>
1763
1922
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1943,23 +2102,38 @@
1943
2102
  <span class="cline-any cline-neutral">&nbsp;</span>
1944
2103
  <span class="cline-any cline-neutral">&nbsp;</span>
1945
2104
  <span class="cline-any cline-neutral">&nbsp;</span>
1946
- <span class="cline-any cline-yes">295x</span>
1947
2105
  <span class="cline-any cline-neutral">&nbsp;</span>
1948
- <span class="cline-any cline-yes">295x</span>
1949
- <span class="cline-any cline-yes">295x</span>
1950
- <span class="cline-any cline-yes">295x</span>
1951
- <span class="cline-any cline-yes">295x</span>
1952
2106
  <span class="cline-any cline-neutral">&nbsp;</span>
1953
- <span class="cline-any cline-yes">295x</span>
1954
2107
  <span class="cline-any cline-neutral">&nbsp;</span>
1955
2108
  <span class="cline-any cline-neutral">&nbsp;</span>
1956
2109
  <span class="cline-any cline-neutral">&nbsp;</span>
1957
2110
  <span class="cline-any cline-neutral">&nbsp;</span>
1958
2111
  <span class="cline-any cline-neutral">&nbsp;</span>
2112
+ <span class="cline-any cline-yes">615x</span>
1959
2113
  <span class="cline-any cline-neutral">&nbsp;</span>
1960
- <span class="cline-any cline-yes">17x</span>
1961
- <span class="cline-any cline-yes">17x</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-yes">615x</span>
2116
+ <span class="cline-any cline-yes">615x</span>
2117
+ <span class="cline-any cline-yes">26x</span>
2118
+ <span class="cline-any cline-yes">26x</span>
1962
2119
  <span class="cline-any cline-yes">26x</span>
2120
+ <span class="cline-any cline-neutral">&nbsp;</span>
2121
+ <span class="cline-any cline-neutral">&nbsp;</span>
2122
+ <span class="cline-any cline-yes">589x</span>
2123
+ <span class="cline-any cline-yes">589x</span>
2124
+ <span class="cline-any cline-yes">589x</span>
2125
+ <span class="cline-any cline-yes">589x</span>
2126
+ <span class="cline-any cline-neutral">&nbsp;</span>
2127
+ <span class="cline-any cline-yes">589x</span>
2128
+ <span class="cline-any cline-neutral">&nbsp;</span>
2129
+ <span class="cline-any cline-neutral">&nbsp;</span>
2130
+ <span class="cline-any cline-neutral">&nbsp;</span>
2131
+ <span class="cline-any cline-neutral">&nbsp;</span>
2132
+ <span class="cline-any cline-neutral">&nbsp;</span>
2133
+ <span class="cline-any cline-neutral">&nbsp;</span>
2134
+ <span class="cline-any cline-yes">73x</span>
2135
+ <span class="cline-any cline-yes">73x</span>
2136
+ <span class="cline-any cline-yes">135x</span>
1963
2137
  <span class="cline-any cline-no">&nbsp;</span>
1964
2138
  <span class="cline-any cline-neutral">&nbsp;</span>
1965
2139
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1969,11 +2143,11 @@
1969
2143
  <span class="cline-any cline-neutral">&nbsp;</span>
1970
2144
  <span class="cline-any cline-neutral">&nbsp;</span>
1971
2145
  <span class="cline-any cline-neutral">&nbsp;</span>
1972
- <span class="cline-any cline-yes">295x</span>
1973
- <span class="cline-any cline-yes">42x</span>
1974
- <span class="cline-any cline-yes">80x</span>
1975
- <span class="cline-any cline-yes">80x</span>
1976
- <span class="cline-any cline-yes">80x</span>
2146
+ <span class="cline-any cline-yes">589x</span>
2147
+ <span class="cline-any cline-yes">129x</span>
2148
+ <span class="cline-any cline-yes">262x</span>
2149
+ <span class="cline-any cline-yes">262x</span>
2150
+ <span class="cline-any cline-yes">262x</span>
1977
2151
  <span class="cline-any cline-neutral">&nbsp;</span>
1978
2152
  <span class="cline-any cline-neutral">&nbsp;</span>
1979
2153
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1982,19 +2156,21 @@
1982
2156
  <span class="cline-any cline-neutral">&nbsp;</span>
1983
2157
  <span class="cline-any cline-neutral">&nbsp;</span>
1984
2158
  <span class="cline-any cline-neutral">&nbsp;</span>
1985
- <span class="cline-any cline-yes">295x</span>
1986
- <span class="cline-any cline-yes">27x</span>
1987
2159
  <span class="cline-any cline-neutral">&nbsp;</span>
2160
+ <span class="cline-any cline-yes">589x</span>
2161
+ <span class="cline-any cline-yes">42x</span>
1988
2162
  <span class="cline-any cline-neutral">&nbsp;</span>
1989
2163
  <span class="cline-any cline-neutral">&nbsp;</span>
1990
2164
  <span class="cline-any cline-neutral">&nbsp;</span>
1991
2165
  <span class="cline-any cline-neutral">&nbsp;</span>
1992
2166
  <span class="cline-any cline-neutral">&nbsp;</span>
1993
- <span class="cline-any cline-yes">295x</span>
1994
- <span class="cline-any cline-yes">295x</span>
1995
- <span class="cline-any cline-yes">6x</span>
1996
- <span class="cline-any cline-yes">12x</span>
2167
+ <span class="cline-any cline-neutral">&nbsp;</span>
2168
+ <span class="cline-any cline-neutral">&nbsp;</span>
2169
+ <span class="cline-any cline-yes">589x</span>
2170
+ <span class="cline-any cline-yes">589x</span>
1997
2171
  <span class="cline-any cline-yes">12x</span>
2172
+ <span class="cline-any cline-yes">24x</span>
2173
+ <span class="cline-any cline-yes">24x</span>
1998
2174
  <span class="cline-any cline-neutral">&nbsp;</span>
1999
2175
  <span class="cline-any cline-neutral">&nbsp;</span>
2000
2176
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2005,11 +2181,11 @@
2005
2181
  <span class="cline-any cline-neutral">&nbsp;</span>
2006
2182
  <span class="cline-any cline-neutral">&nbsp;</span>
2007
2183
  <span class="cline-any cline-neutral">&nbsp;</span>
2008
- <span class="cline-any cline-yes">1298x</span>
2009
- <span class="cline-any cline-yes">1298x</span>
2010
- <span class="cline-any cline-yes">1298x</span>
2011
- <span class="cline-any cline-yes">1141x</span>
2012
2184
  <span class="cline-any cline-neutral">&nbsp;</span>
2185
+ <span class="cline-any cline-yes">2071x</span>
2186
+ <span class="cline-any cline-yes">2071x</span>
2187
+ <span class="cline-any cline-yes">2071x</span>
2188
+ <span class="cline-any cline-yes">1879x</span>
2013
2189
  <span class="cline-any cline-neutral">&nbsp;</span>
2014
2190
  <span class="cline-any cline-neutral">&nbsp;</span>
2015
2191
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2031,25 +2207,26 @@
2031
2207
  <span class="cline-any cline-neutral">&nbsp;</span>
2032
2208
  <span class="cline-any cline-neutral">&nbsp;</span>
2033
2209
  <span class="cline-any cline-neutral">&nbsp;</span>
2034
- <span class="cline-any cline-yes">157x</span>
2035
- <span class="cline-any cline-yes">157x</span>
2036
- <span class="cline-any cline-yes">157x</span>
2037
- <span class="cline-any cline-yes">157x</span>
2038
- <span class="cline-any cline-yes">157x</span>
2210
+ <span class="cline-any cline-neutral">&nbsp;</span>
2211
+ <span class="cline-any cline-yes">192x</span>
2212
+ <span class="cline-any cline-yes">192x</span>
2213
+ <span class="cline-any cline-yes">192x</span>
2214
+ <span class="cline-any cline-yes">192x</span>
2215
+ <span class="cline-any cline-yes">192x</span>
2039
2216
  <span class="cline-any cline-yes">1x</span>
2040
2217
  <span class="cline-any cline-neutral">&nbsp;</span>
2041
2218
  <span class="cline-any cline-neutral">&nbsp;</span>
2042
2219
  <span class="cline-any cline-neutral">&nbsp;</span>
2043
2220
  <span class="cline-any cline-neutral">&nbsp;</span>
2044
2221
  <span class="cline-any cline-neutral">&nbsp;</span>
2045
- <span class="cline-any cline-yes">157x</span>
2222
+ <span class="cline-any cline-yes">192x</span>
2046
2223
  <span class="cline-any cline-yes">1x</span>
2047
2224
  <span class="cline-any cline-neutral">&nbsp;</span>
2048
2225
  <span class="cline-any cline-neutral">&nbsp;</span>
2049
2226
  <span class="cline-any cline-neutral">&nbsp;</span>
2050
2227
  <span class="cline-any cline-neutral">&nbsp;</span>
2051
2228
  <span class="cline-any cline-neutral">&nbsp;</span>
2052
- <span class="cline-any cline-yes">157x</span>
2229
+ <span class="cline-any cline-yes">192x</span>
2053
2230
  <span class="cline-any cline-yes">41x</span>
2054
2231
  <span class="cline-any cline-yes">58x</span>
2055
2232
  <span class="cline-any cline-yes">27x</span>
@@ -2063,11 +2240,11 @@
2063
2240
  <span class="cline-any cline-neutral">&nbsp;</span>
2064
2241
  <span class="cline-any cline-neutral">&nbsp;</span>
2065
2242
  <span class="cline-any cline-neutral">&nbsp;</span>
2066
- <span class="cline-any cline-yes">157x</span>
2243
+ <span class="cline-any cline-yes">192x</span>
2067
2244
  <span class="cline-any cline-neutral">&nbsp;</span>
2068
- <span class="cline-any cline-yes">157x</span>
2069
- <span class="cline-any cline-yes">139x</span>
2070
- <span class="cline-any cline-yes">241x</span>
2245
+ <span class="cline-any cline-yes">192x</span>
2246
+ <span class="cline-any cline-yes">174x</span>
2247
+ <span class="cline-any cline-yes">321x</span>
2071
2248
  <span class="cline-any cline-neutral">&nbsp;</span>
2072
2249
  <span class="cline-any cline-neutral">&nbsp;</span>
2073
2250
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2087,7 +2264,7 @@
2087
2264
  <span class="cline-any cline-neutral">&nbsp;</span>
2088
2265
  <span class="cline-any cline-neutral">&nbsp;</span>
2089
2266
  <span class="cline-any cline-neutral">&nbsp;</span>
2090
- <span class="cline-any cline-yes">157x</span>
2267
+ <span class="cline-any cline-yes">192x</span>
2091
2268
  <span class="cline-any cline-no">&nbsp;</span>
2092
2269
  <span class="cline-any cline-no">&nbsp;</span>
2093
2270
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2116,19 +2293,19 @@
2116
2293
  <span class="cline-any cline-neutral">&nbsp;</span>
2117
2294
  <span class="cline-any cline-neutral">&nbsp;</span>
2118
2295
  <span class="cline-any cline-neutral">&nbsp;</span>
2119
- <span class="cline-any cline-yes">214x</span>
2120
- <span class="cline-any cline-yes">214x</span>
2296
+ <span class="cline-any cline-yes">434x</span>
2297
+ <span class="cline-any cline-yes">434x</span>
2121
2298
  <span class="cline-any cline-neutral">&nbsp;</span>
2122
- <span class="cline-any cline-yes">214x</span>
2299
+ <span class="cline-any cline-yes">434x</span>
2123
2300
  <span class="cline-any cline-neutral">&nbsp;</span>
2124
- <span class="cline-any cline-yes">208x</span>
2301
+ <span class="cline-any cline-yes">430x</span>
2125
2302
  <span class="cline-any cline-neutral">&nbsp;</span>
2126
- <span class="cline-any cline-yes">326x</span>
2303
+ <span class="cline-any cline-yes">431x</span>
2127
2304
  <span class="cline-any cline-neutral">&nbsp;</span>
2128
2305
  <span class="cline-any cline-neutral">&nbsp;</span>
2129
2306
  <span class="cline-any cline-neutral">&nbsp;</span>
2130
- <span class="cline-any cline-yes">208x</span>
2131
- <span class="cline-any cline-yes">412x</span>
2307
+ <span class="cline-any cline-yes">430x</span>
2308
+ <span class="cline-any cline-yes">829x</span>
2132
2309
  <span class="cline-any cline-yes">5x</span>
2133
2310
  <span class="cline-any cline-neutral">&nbsp;</span>
2134
2311
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2137,16 +2314,16 @@
2137
2314
  <span class="cline-any cline-neutral">&nbsp;</span>
2138
2315
  <span class="cline-any cline-neutral">&nbsp;</span>
2139
2316
  <span class="cline-any cline-neutral">&nbsp;</span>
2140
- <span class="cline-any cline-yes">208x</span>
2141
- <span class="cline-any cline-yes">427x</span>
2142
- <span class="cline-any cline-yes">427x</span>
2317
+ <span class="cline-any cline-yes">430x</span>
2318
+ <span class="cline-any cline-yes">877x</span>
2319
+ <span class="cline-any cline-yes">877x</span>
2143
2320
  <span class="cline-any cline-no">&nbsp;</span>
2144
2321
  <span class="cline-any cline-neutral">&nbsp;</span>
2145
2322
  <span class="cline-any cline-neutral">&nbsp;</span>
2146
2323
  <span class="cline-any cline-neutral">&nbsp;</span>
2147
2324
  <span class="cline-any cline-neutral">&nbsp;</span>
2148
2325
  <span class="cline-any cline-neutral">&nbsp;</span>
2149
- <span class="cline-any cline-yes">427x</span>
2326
+ <span class="cline-any cline-yes">877x</span>
2150
2327
  <span class="cline-any cline-neutral">&nbsp;</span>
2151
2328
  <span class="cline-any cline-neutral">&nbsp;</span>
2152
2329
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2158,9 +2335,9 @@
2158
2335
  <span class="cline-any cline-neutral">&nbsp;</span>
2159
2336
  <span class="cline-any cline-neutral">&nbsp;</span>
2160
2337
  <span class="cline-any cline-neutral">&nbsp;</span>
2161
- <span class="cline-any cline-yes">6x</span>
2162
- <span class="cline-any cline-yes">18x</span>
2163
- <span class="cline-any cline-yes">18x</span>
2338
+ <span class="cline-any cline-yes">4x</span>
2339
+ <span class="cline-any cline-yes">12x</span>
2340
+ <span class="cline-any cline-yes">12x</span>
2164
2341
  <span class="cline-any cline-no">&nbsp;</span>
2165
2342
  <span class="cline-any cline-neutral">&nbsp;</span>
2166
2343
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2170,7 +2347,7 @@
2170
2347
  <span class="cline-any cline-neutral">&nbsp;</span>
2171
2348
  <span class="cline-any cline-neutral">&nbsp;</span>
2172
2349
  <span class="cline-any cline-neutral">&nbsp;</span>
2173
- <span class="cline-any cline-yes">214x</span>
2350
+ <span class="cline-any cline-yes">434x</span>
2174
2351
  <span class="cline-any cline-no">&nbsp;</span>
2175
2352
  <span class="cline-any cline-no">&nbsp;</span>
2176
2353
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2191,9 +2368,15 @@
2191
2368
  <span class="cline-any cline-neutral">&nbsp;</span>
2192
2369
  <span class="cline-any cline-neutral">&nbsp;</span>
2193
2370
  <span class="cline-any cline-neutral">&nbsp;</span>
2194
- <span class="cline-any cline-yes">1411x</span>
2195
2371
  <span class="cline-any cline-neutral">&nbsp;</span>
2196
- <span class="cline-any cline-yes">1411x</span>
2372
+ <span class="cline-any cline-neutral">&nbsp;</span>
2373
+ <span class="cline-any cline-neutral">&nbsp;</span>
2374
+ <span class="cline-any cline-neutral">&nbsp;</span>
2375
+ <span class="cline-any cline-neutral">&nbsp;</span>
2376
+ <span class="cline-any cline-neutral">&nbsp;</span>
2377
+ <span class="cline-any cline-yes">2185x</span>
2378
+ <span class="cline-any cline-neutral">&nbsp;</span>
2379
+ <span class="cline-any cline-yes">2185x</span>
2197
2380
  <span class="cline-any cline-neutral">&nbsp;</span>
2198
2381
  <span class="cline-any cline-no">&nbsp;</span>
2199
2382
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2209,22 +2392,22 @@
2209
2392
  <span class="cline-any cline-no">&nbsp;</span>
2210
2393
  <span class="cline-any cline-neutral">&nbsp;</span>
2211
2394
  <span class="cline-any cline-neutral">&nbsp;</span>
2212
- <span class="cline-any cline-yes">1411x</span>
2213
- <span class="cline-any cline-yes">1411x</span>
2214
- <span class="cline-any cline-yes">2x</span>
2395
+ <span class="cline-any cline-yes">2185x</span>
2396
+ <span class="cline-any cline-yes">2185x</span>
2397
+ <span class="cline-any cline-yes">3x</span>
2215
2398
  <span class="cline-any cline-neutral">&nbsp;</span>
2216
2399
  <span class="cline-any cline-neutral">&nbsp;</span>
2217
2400
  <span class="cline-any cline-neutral">&nbsp;</span>
2218
2401
  <span class="cline-any cline-neutral">&nbsp;</span>
2219
- <span class="cline-any cline-yes">2x</span>
2402
+ <span class="cline-any cline-yes">3x</span>
2220
2403
  <span class="cline-any cline-neutral">&nbsp;</span>
2221
2404
  <span class="cline-any cline-neutral">&nbsp;</span>
2222
- <span class="cline-any cline-yes">1409x</span>
2405
+ <span class="cline-any cline-yes">2182x</span>
2223
2406
  <span class="cline-any cline-no">&nbsp;</span>
2224
2407
  <span class="cline-any cline-neutral">&nbsp;</span>
2225
2408
  <span class="cline-any cline-neutral">&nbsp;</span>
2226
- <span class="cline-any cline-yes">1409x</span>
2227
- <span class="cline-any cline-yes">1409x</span>
2409
+ <span class="cline-any cline-yes">2182x</span>
2410
+ <span class="cline-any cline-yes">2182x</span>
2228
2411
  <span class="cline-any cline-yes">48x</span>
2229
2412
  <span class="cline-any cline-yes">96x</span>
2230
2413
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2244,8 +2427,8 @@
2244
2427
  <span class="cline-any cline-yes">48x</span>
2245
2428
  <span class="cline-any cline-neutral">&nbsp;</span>
2246
2429
  <span class="cline-any cline-neutral">&nbsp;</span>
2247
- <span class="cline-any cline-yes">1361x</span>
2248
- <span class="cline-any cline-yes">1361x</span>
2430
+ <span class="cline-any cline-yes">2134x</span>
2431
+ <span class="cline-any cline-yes">2134x</span>
2249
2432
  <span class="cline-any cline-yes">36x</span>
2250
2433
  <span class="cline-any cline-yes">3x</span>
2251
2434
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2256,8 +2439,8 @@
2256
2439
  <span class="cline-any cline-yes">36x</span>
2257
2440
  <span class="cline-any cline-neutral">&nbsp;</span>
2258
2441
  <span class="cline-any cline-neutral">&nbsp;</span>
2259
- <span class="cline-any cline-yes">1325x</span>
2260
- <span class="cline-any cline-yes">1325x</span>
2442
+ <span class="cline-any cline-yes">2098x</span>
2443
+ <span class="cline-any cline-yes">2098x</span>
2261
2444
  <span class="cline-any cline-yes">40x</span>
2262
2445
  <span class="cline-any cline-yes">27x</span>
2263
2446
  <span class="cline-any cline-yes">2x</span>
@@ -2270,7 +2453,7 @@
2270
2453
  <span class="cline-any cline-neutral">&nbsp;</span>
2271
2454
  <span class="cline-any cline-neutral">&nbsp;</span>
2272
2455
  <span class="cline-any cline-neutral">&nbsp;</span>
2273
- <span class="cline-any cline-yes">1298x</span>
2456
+ <span class="cline-any cline-yes">2071x</span>
2274
2457
  <span class="cline-any cline-no">&nbsp;</span>
2275
2458
  <span class="cline-any cline-neutral">&nbsp;</span>
2276
2459
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2279,12 +2462,12 @@
2279
2462
  <span class="cline-any cline-no">&nbsp;</span>
2280
2463
  <span class="cline-any cline-neutral">&nbsp;</span>
2281
2464
  <span class="cline-any cline-neutral">&nbsp;</span>
2282
- <span class="cline-any cline-yes">1298x</span>
2283
- <span class="cline-any cline-yes">1298x</span>
2465
+ <span class="cline-any cline-yes">2071x</span>
2466
+ <span class="cline-any cline-yes">2071x</span>
2284
2467
  <span class="cline-any cline-neutral">&nbsp;</span>
2285
2468
  <span class="cline-any cline-neutral">&nbsp;</span>
2286
- <span class="cline-any cline-yes">1298x</span>
2287
- <span class="cline-any cline-yes">672x</span>
2469
+ <span class="cline-any cline-yes">2071x</span>
2470
+ <span class="cline-any cline-yes">1017x</span>
2288
2471
  <span class="cline-any cline-no">&nbsp;</span>
2289
2472
  <span class="cline-any cline-neutral">&nbsp;</span>
2290
2473
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2293,24 +2476,24 @@
2293
2476
  <span class="cline-any cline-no">&nbsp;</span>
2294
2477
  <span class="cline-any cline-neutral">&nbsp;</span>
2295
2478
  <span class="cline-any cline-neutral">&nbsp;</span>
2296
- <span class="cline-any cline-yes">672x</span>
2297
- <span class="cline-any cline-yes">672x</span>
2298
- <span class="cline-any cline-yes">672x</span>
2299
- <span class="cline-any cline-yes">672x</span>
2479
+ <span class="cline-any cline-yes">1017x</span>
2480
+ <span class="cline-any cline-yes">1017x</span>
2481
+ <span class="cline-any cline-yes">1017x</span>
2482
+ <span class="cline-any cline-yes">1017x</span>
2300
2483
  <span class="cline-any cline-yes">1x</span>
2301
2484
  <span class="cline-any cline-neutral">&nbsp;</span>
2302
2485
  <span class="cline-any cline-neutral">&nbsp;</span>
2303
2486
  <span class="cline-any cline-neutral">&nbsp;</span>
2304
2487
  <span class="cline-any cline-neutral">&nbsp;</span>
2305
2488
  <span class="cline-any cline-neutral">&nbsp;</span>
2306
- <span class="cline-any cline-yes">672x</span>
2489
+ <span class="cline-any cline-yes">1017x</span>
2307
2490
  <span class="cline-any cline-yes">2x</span>
2308
2491
  <span class="cline-any cline-neutral">&nbsp;</span>
2309
2492
  <span class="cline-any cline-neutral">&nbsp;</span>
2310
2493
  <span class="cline-any cline-neutral">&nbsp;</span>
2311
2494
  <span class="cline-any cline-neutral">&nbsp;</span>
2312
2495
  <span class="cline-any cline-neutral">&nbsp;</span>
2313
- <span class="cline-any cline-yes">672x</span>
2496
+ <span class="cline-any cline-yes">1017x</span>
2314
2497
  <span class="cline-any cline-yes">73x</span>
2315
2498
  <span class="cline-any cline-yes">73x</span>
2316
2499
  <span class="cline-any cline-yes">4x</span>
@@ -2324,7 +2507,7 @@
2324
2507
  <span class="cline-any cline-neutral">&nbsp;</span>
2325
2508
  <span class="cline-any cline-neutral">&nbsp;</span>
2326
2509
  <span class="cline-any cline-neutral">&nbsp;</span>
2327
- <span class="cline-any cline-yes">672x</span>
2510
+ <span class="cline-any cline-yes">1017x</span>
2328
2511
  <span class="cline-any cline-neutral">&nbsp;</span>
2329
2512
  <span class="cline-any cline-neutral">&nbsp;</span>
2330
2513
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2335,12 +2518,12 @@
2335
2518
  <span class="cline-any cline-neutral">&nbsp;</span>
2336
2519
  <span class="cline-any cline-neutral">&nbsp;</span>
2337
2520
  <span class="cline-any cline-neutral">&nbsp;</span>
2338
- <span class="cline-any cline-yes">672x</span>
2521
+ <span class="cline-any cline-yes">1017x</span>
2339
2522
  <span class="cline-any cline-neutral">&nbsp;</span>
2340
2523
  <span class="cline-any cline-neutral">&nbsp;</span>
2341
2524
  <span class="cline-any cline-neutral">&nbsp;</span>
2342
- <span class="cline-any cline-yes">626x</span>
2343
- <span class="cline-any cline-yes">99x</span>
2525
+ <span class="cline-any cline-yes">1054x</span>
2526
+ <span class="cline-any cline-yes">179x</span>
2344
2527
  <span class="cline-any cline-no">&nbsp;</span>
2345
2528
  <span class="cline-any cline-neutral">&nbsp;</span>
2346
2529
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2348,7 +2531,7 @@
2348
2531
  <span class="cline-any cline-neutral">&nbsp;</span>
2349
2532
  <span class="cline-any cline-no">&nbsp;</span>
2350
2533
  <span class="cline-any cline-neutral">&nbsp;</span>
2351
- <span class="cline-any cline-yes">99x</span>
2534
+ <span class="cline-any cline-yes">179x</span>
2352
2535
  <span class="cline-any cline-no">&nbsp;</span>
2353
2536
  <span class="cline-any cline-neutral">&nbsp;</span>
2354
2537
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2356,7 +2539,7 @@
2356
2539
  <span class="cline-any cline-neutral">&nbsp;</span>
2357
2540
  <span class="cline-any cline-no">&nbsp;</span>
2358
2541
  <span class="cline-any cline-neutral">&nbsp;</span>
2359
- <span class="cline-any cline-yes">99x</span>
2542
+ <span class="cline-any cline-yes">179x</span>
2360
2543
  <span class="cline-any cline-no">&nbsp;</span>
2361
2544
  <span class="cline-any cline-neutral">&nbsp;</span>
2362
2545
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2364,28 +2547,28 @@
2364
2547
  <span class="cline-any cline-neutral">&nbsp;</span>
2365
2548
  <span class="cline-any cline-no">&nbsp;</span>
2366
2549
  <span class="cline-any cline-neutral">&nbsp;</span>
2367
- <span class="cline-any cline-yes">99x</span>
2368
- <span class="cline-any cline-yes">99x</span>
2369
- <span class="cline-any cline-yes">99x</span>
2550
+ <span class="cline-any cline-yes">179x</span>
2551
+ <span class="cline-any cline-yes">179x</span>
2552
+ <span class="cline-any cline-yes">179x</span>
2370
2553
  <span class="cline-any cline-yes">2x</span>
2371
2554
  <span class="cline-any cline-neutral">&nbsp;</span>
2372
2555
  <span class="cline-any cline-neutral">&nbsp;</span>
2373
2556
  <span class="cline-any cline-neutral">&nbsp;</span>
2374
2557
  <span class="cline-any cline-neutral">&nbsp;</span>
2375
2558
  <span class="cline-any cline-neutral">&nbsp;</span>
2376
- <span class="cline-any cline-yes">99x</span>
2559
+ <span class="cline-any cline-yes">179x</span>
2377
2560
  <span class="cline-any cline-yes">8x</span>
2378
2561
  <span class="cline-any cline-neutral">&nbsp;</span>
2379
2562
  <span class="cline-any cline-neutral">&nbsp;</span>
2380
2563
  <span class="cline-any cline-neutral">&nbsp;</span>
2381
2564
  <span class="cline-any cline-neutral">&nbsp;</span>
2382
2565
  <span class="cline-any cline-neutral">&nbsp;</span>
2383
- <span class="cline-any cline-yes">99x</span>
2566
+ <span class="cline-any cline-yes">179x</span>
2384
2567
  <span class="cline-any cline-neutral">&nbsp;</span>
2385
2568
  <span class="cline-any cline-neutral">&nbsp;</span>
2386
2569
  <span class="cline-any cline-neutral">&nbsp;</span>
2387
- <span class="cline-any cline-yes">527x</span>
2388
- <span class="cline-any cline-yes">74x</span>
2570
+ <span class="cline-any cline-yes">875x</span>
2571
+ <span class="cline-any cline-yes">126x</span>
2389
2572
  <span class="cline-any cline-no">&nbsp;</span>
2390
2573
  <span class="cline-any cline-neutral">&nbsp;</span>
2391
2574
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2393,7 +2576,7 @@
2393
2576
  <span class="cline-any cline-neutral">&nbsp;</span>
2394
2577
  <span class="cline-any cline-no">&nbsp;</span>
2395
2578
  <span class="cline-any cline-neutral">&nbsp;</span>
2396
- <span class="cline-any cline-yes">74x</span>
2579
+ <span class="cline-any cline-yes">126x</span>
2397
2580
  <span class="cline-any cline-no">&nbsp;</span>
2398
2581
  <span class="cline-any cline-neutral">&nbsp;</span>
2399
2582
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2401,40 +2584,40 @@
2401
2584
  <span class="cline-any cline-neutral">&nbsp;</span>
2402
2585
  <span class="cline-any cline-no">&nbsp;</span>
2403
2586
  <span class="cline-any cline-neutral">&nbsp;</span>
2404
- <span class="cline-any cline-yes">74x</span>
2405
- <span class="cline-any cline-yes">74x</span>
2406
- <span class="cline-any cline-yes">74x</span>
2587
+ <span class="cline-any cline-yes">126x</span>
2588
+ <span class="cline-any cline-yes">126x</span>
2589
+ <span class="cline-any cline-yes">126x</span>
2407
2590
  <span class="cline-any cline-no">&nbsp;</span>
2408
2591
  <span class="cline-any cline-neutral">&nbsp;</span>
2409
2592
  <span class="cline-any cline-neutral">&nbsp;</span>
2410
2593
  <span class="cline-any cline-neutral">&nbsp;</span>
2411
2594
  <span class="cline-any cline-neutral">&nbsp;</span>
2412
2595
  <span class="cline-any cline-neutral">&nbsp;</span>
2413
- <span class="cline-any cline-yes">74x</span>
2596
+ <span class="cline-any cline-yes">126x</span>
2414
2597
  <span class="cline-any cline-no">&nbsp;</span>
2415
2598
  <span class="cline-any cline-neutral">&nbsp;</span>
2416
2599
  <span class="cline-any cline-neutral">&nbsp;</span>
2417
2600
  <span class="cline-any cline-neutral">&nbsp;</span>
2418
2601
  <span class="cline-any cline-neutral">&nbsp;</span>
2419
2602
  <span class="cline-any cline-neutral">&nbsp;</span>
2420
- <span class="cline-any cline-yes">74x</span>
2603
+ <span class="cline-any cline-yes">126x</span>
2421
2604
  <span class="cline-any cline-neutral">&nbsp;</span>
2422
2605
  <span class="cline-any cline-neutral">&nbsp;</span>
2423
2606
  <span class="cline-any cline-neutral">&nbsp;</span>
2424
- <span class="cline-any cline-yes">453x</span>
2425
- <span class="cline-any cline-yes">78x</span>
2607
+ <span class="cline-any cline-yes">749x</span>
2608
+ <span class="cline-any cline-yes">119x</span>
2426
2609
  <span class="cline-any cline-no">&nbsp;</span>
2427
2610
  <span class="cline-any cline-neutral">&nbsp;</span>
2428
2611
  <span class="cline-any cline-neutral">&nbsp;</span>
2429
2612
  <span class="cline-any cline-neutral">&nbsp;</span>
2430
2613
  <span class="cline-any cline-neutral">&nbsp;</span>
2431
2614
  <span class="cline-any cline-neutral">&nbsp;</span>
2432
- <span class="cline-any cline-yes">78x</span>
2615
+ <span class="cline-any cline-yes">119x</span>
2433
2616
  <span class="cline-any cline-neutral">&nbsp;</span>
2434
2617
  <span class="cline-any cline-neutral">&nbsp;</span>
2435
2618
  <span class="cline-any cline-neutral">&nbsp;</span>
2436
- <span class="cline-any cline-yes">375x</span>
2437
- <span class="cline-any cline-yes">157x</span>
2619
+ <span class="cline-any cline-yes">630x</span>
2620
+ <span class="cline-any cline-yes">192x</span>
2438
2621
  <span class="cline-any cline-no">&nbsp;</span>
2439
2622
  <span class="cline-any cline-neutral">&nbsp;</span>
2440
2623
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2442,7 +2625,7 @@
2442
2625
  <span class="cline-any cline-neutral">&nbsp;</span>
2443
2626
  <span class="cline-any cline-no">&nbsp;</span>
2444
2627
  <span class="cline-any cline-neutral">&nbsp;</span>
2445
- <span class="cline-any cline-yes">157x</span>
2628
+ <span class="cline-any cline-yes">192x</span>
2446
2629
  <span class="cline-any cline-neutral">&nbsp;</span>
2447
2630
  <span class="cline-any cline-neutral">&nbsp;</span>
2448
2631
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2457,12 +2640,12 @@
2457
2640
  <span class="cline-any cline-neutral">&nbsp;</span>
2458
2641
  <span class="cline-any cline-neutral">&nbsp;</span>
2459
2642
  <span class="cline-any cline-neutral">&nbsp;</span>
2460
- <span class="cline-any cline-yes">157x</span>
2643
+ <span class="cline-any cline-yes">192x</span>
2461
2644
  <span class="cline-any cline-neutral">&nbsp;</span>
2462
2645
  <span class="cline-any cline-neutral">&nbsp;</span>
2463
2646
  <span class="cline-any cline-neutral">&nbsp;</span>
2464
- <span class="cline-any cline-yes">218x</span>
2465
- <span class="cline-any cline-yes">214x</span>
2647
+ <span class="cline-any cline-yes">438x</span>
2648
+ <span class="cline-any cline-yes">434x</span>
2466
2649
  <span class="cline-any cline-neutral">&nbsp;</span>
2467
2650
  <span class="cline-any cline-neutral">&nbsp;</span>
2468
2651
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2474,7 +2657,7 @@
2474
2657
  <span class="cline-any cline-neutral">&nbsp;</span>
2475
2658
  <span class="cline-any cline-no">&nbsp;</span>
2476
2659
  <span class="cline-any cline-neutral">&nbsp;</span>
2477
- <span class="cline-any cline-yes">214x</span>
2660
+ <span class="cline-any cline-yes">434x</span>
2478
2661
  <span class="cline-any cline-neutral">&nbsp;</span>
2479
2662
  <span class="cline-any cline-neutral">&nbsp;</span>
2480
2663
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2487,7 +2670,7 @@
2487
2670
  <span class="cline-any cline-neutral">&nbsp;</span>
2488
2671
  <span class="cline-any cline-neutral">&nbsp;</span>
2489
2672
  <span class="cline-any cline-neutral">&nbsp;</span>
2490
- <span class="cline-any cline-yes">214x</span>
2673
+ <span class="cline-any cline-yes">434x</span>
2491
2674
  <span class="cline-any cline-neutral">&nbsp;</span>
2492
2675
  <span class="cline-any cline-neutral">&nbsp;</span>
2493
2676
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2542,30 +2725,50 @@
2542
2725
  <span class="cline-any cline-neutral">&nbsp;</span>
2543
2726
  <span class="cline-any cline-neutral">&nbsp;</span>
2544
2727
  <span class="cline-any cline-neutral">&nbsp;</span>
2545
- <span class="cline-any cline-yes">14x</span>
2546
2728
  <span class="cline-any cline-neutral">&nbsp;</span>
2547
- <span class="cline-any cline-yes">10x</span>
2548
- <span class="cline-any cline-yes">10x</span>
2549
- <span class="cline-any cline-no">&nbsp;</span>
2550
2729
  <span class="cline-any cline-neutral">&nbsp;</span>
2551
2730
  <span class="cline-any cline-neutral">&nbsp;</span>
2731
+ <span class="cline-any cline-yes">669x</span>
2732
+ <span class="cline-any cline-yes">71x</span>
2552
2733
  <span class="cline-any cline-neutral">&nbsp;</span>
2553
2734
  <span class="cline-any cline-neutral">&nbsp;</span>
2554
2735
  <span class="cline-any cline-neutral">&nbsp;</span>
2555
2736
  <span class="cline-any cline-neutral">&nbsp;</span>
2737
+ <span class="cline-any cline-yes">71x</span>
2738
+ <span class="cline-any cline-yes">4x</span>
2556
2739
  <span class="cline-any cline-neutral">&nbsp;</span>
2557
2740
  <span class="cline-any cline-neutral">&nbsp;</span>
2558
- <span class="cline-any cline-yes">10x</span>
2559
- <span class="cline-any cline-yes">6x</span>
2741
+ <span class="cline-any cline-neutral">&nbsp;</span>
2742
+ <span class="cline-any cline-neutral">&nbsp;</span>
2743
+ <span class="cline-any cline-yes">4x</span>
2744
+ <span class="cline-any cline-neutral">&nbsp;</span>
2745
+ <span class="cline-any cline-yes">67x</span>
2746
+ <span class="cline-any cline-yes">65x</span>
2747
+ <span class="cline-any cline-neutral">&nbsp;</span>
2748
+ <span class="cline-any cline-neutral">&nbsp;</span>
2749
+ <span class="cline-any cline-neutral">&nbsp;</span>
2750
+ <span class="cline-any cline-neutral">&nbsp;</span>
2751
+ <span class="cline-any cline-neutral">&nbsp;</span>
2752
+ <span class="cline-any cline-neutral">&nbsp;</span>
2753
+ <span class="cline-any cline-neutral">&nbsp;</span>
2754
+ <span class="cline-any cline-neutral">&nbsp;</span>
2755
+ <span class="cline-any cline-neutral">&nbsp;</span>
2756
+ <span class="cline-any cline-yes">67x</span>
2757
+ <span class="cline-any cline-neutral">&nbsp;</span>
2758
+ <span class="cline-any cline-yes">598x</span>
2759
+ <span class="cline-any cline-yes">598x</span>
2560
2760
  <span class="cline-any cline-yes">6x</span>
2761
+ <span class="cline-any cline-neutral">&nbsp;</span>
2762
+ <span class="cline-any cline-neutral">&nbsp;</span>
2763
+ <span class="cline-any cline-neutral">&nbsp;</span>
2764
+ <span class="cline-any cline-neutral">&nbsp;</span>
2561
2765
  <span class="cline-any cline-yes">6x</span>
2562
- <span class="cline-any cline-yes">2x</span>
2563
2766
  <span class="cline-any cline-neutral">&nbsp;</span>
2767
+ <span class="cline-any cline-yes">592x</span>
2564
2768
  <span class="cline-any cline-neutral">&nbsp;</span>
2565
2769
  <span class="cline-any cline-neutral">&nbsp;</span>
2566
2770
  <span class="cline-any cline-neutral">&nbsp;</span>
2567
2771
  <span class="cline-any cline-neutral">&nbsp;</span>
2568
- <span class="cline-any cline-yes">4x</span>
2569
2772
  <span class="cline-any cline-neutral">&nbsp;</span>
2570
2773
  <span class="cline-any cline-neutral">&nbsp;</span>
2571
2774
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2582,7 +2785,22 @@
2582
2785
  <span class="cline-any cline-neutral">&nbsp;</span>
2583
2786
  <span class="cline-any cline-neutral">&nbsp;</span>
2584
2787
  <span class="cline-any cline-neutral">&nbsp;</span>
2788
+ <span class="cline-any cline-yes">18x</span>
2585
2789
  <span class="cline-any cline-neutral">&nbsp;</span>
2790
+ <span class="cline-any cline-yes">18x</span>
2791
+ <span class="cline-any cline-yes">10x</span>
2792
+ <span class="cline-any cline-no">&nbsp;</span>
2793
+ <span class="cline-any cline-neutral">&nbsp;</span>
2794
+ <span class="cline-any cline-neutral">&nbsp;</span>
2795
+ <span class="cline-any cline-neutral">&nbsp;</span>
2796
+ <span class="cline-any cline-neutral">&nbsp;</span>
2797
+ <span class="cline-any cline-neutral">&nbsp;</span>
2798
+ <span class="cline-any cline-neutral">&nbsp;</span>
2799
+ <span class="cline-any cline-neutral">&nbsp;</span>
2800
+ <span class="cline-any cline-neutral">&nbsp;</span>
2801
+ <span class="cline-any cline-yes">18x</span>
2802
+ <span class="cline-any cline-yes">6x</span>
2803
+ <span class="cline-any cline-yes">6x</span>
2586
2804
  <span class="cline-any cline-neutral">&nbsp;</span>
2587
2805
  <span class="cline-any cline-neutral">&nbsp;</span>
2588
2806
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2590,19 +2808,12 @@
2590
2808
  <span class="cline-any cline-neutral">&nbsp;</span>
2591
2809
  <span class="cline-any cline-neutral">&nbsp;</span>
2592
2810
  <span class="cline-any cline-neutral">&nbsp;</span>
2593
- <span class="cline-any cline-yes">166x</span>
2594
2811
  <span class="cline-any cline-neutral">&nbsp;</span>
2595
- <span class="cline-any cline-yes">197x</span>
2596
- <span class="cline-any cline-yes">30x</span>
2597
- <span class="cline-any cline-yes">306x</span>
2598
- <span class="cline-any cline-yes">306x</span>
2599
- <span class="cline-any cline-yes">1x</span>
2600
2812
  <span class="cline-any cline-neutral">&nbsp;</span>
2601
2813
  <span class="cline-any cline-neutral">&nbsp;</span>
2602
2814
  <span class="cline-any cline-neutral">&nbsp;</span>
2603
2815
  <span class="cline-any cline-neutral">&nbsp;</span>
2604
2816
  <span class="cline-any cline-neutral">&nbsp;</span>
2605
- <span class="cline-any cline-yes">305x</span>
2606
2817
  <span class="cline-any cline-neutral">&nbsp;</span>
2607
2818
  <span class="cline-any cline-neutral">&nbsp;</span>
2608
2819
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2613,10 +2824,24 @@
2613
2824
  <span class="cline-any cline-neutral">&nbsp;</span>
2614
2825
  <span class="cline-any cline-neutral">&nbsp;</span>
2615
2826
  <span class="cline-any cline-neutral">&nbsp;</span>
2827
+ <span class="cline-any cline-yes">230x</span>
2828
+ <span class="cline-any cline-neutral">&nbsp;</span>
2829
+ <span class="cline-any cline-yes">285x</span>
2830
+ <span class="cline-any cline-yes">47x</span>
2831
+ <span class="cline-any cline-yes">428x</span>
2832
+ <span class="cline-any cline-neutral">&nbsp;</span>
2833
+ <span class="cline-any cline-neutral">&nbsp;</span>
2834
+ <span class="cline-any cline-neutral">&nbsp;</span>
2835
+ <span class="cline-any cline-neutral">&nbsp;</span>
2836
+ <span class="cline-any cline-neutral">&nbsp;</span>
2616
2837
  <span class="cline-any cline-neutral">&nbsp;</span>
2617
2838
  <span class="cline-any cline-neutral">&nbsp;</span>
2618
2839
  <span class="cline-any cline-neutral">&nbsp;</span>
2619
- <span class="cline-any cline-yes">197x</span>
2840
+ <span class="cline-any cline-neutral">&nbsp;</span>
2841
+ <span class="cline-any cline-neutral">&nbsp;</span>
2842
+ <span class="cline-any cline-neutral">&nbsp;</span>
2843
+ <span class="cline-any cline-neutral">&nbsp;</span>
2844
+ <span class="cline-any cline-yes">285x</span>
2620
2845
  <span class="cline-any cline-yes">2x</span>
2621
2846
  <span class="cline-any cline-no">&nbsp;</span>
2622
2847
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2690,27 +2915,28 @@
2690
2915
  <span class="cline-any cline-neutral">&nbsp;</span>
2691
2916
  <span class="cline-any cline-neutral">&nbsp;</span>
2692
2917
  <span class="cline-any cline-neutral">&nbsp;</span>
2693
- <span class="cline-any cline-yes">63x</span>
2694
- <span class="cline-any cline-yes">63x</span>
2918
+ <span class="cline-any cline-yes">73x</span>
2919
+ <span class="cline-any cline-yes">73x</span>
2920
+ <span class="cline-any cline-yes">73x</span>
2695
2921
  <span class="cline-any cline-neutral">&nbsp;</span>
2696
- <span class="cline-any cline-yes">63x</span>
2922
+ <span class="cline-any cline-yes">73x</span>
2697
2923
  <span class="cline-any cline-neutral">&nbsp;</span>
2698
- <span class="cline-any cline-yes">63x</span>
2699
- <span class="cline-any cline-yes">311x</span>
2924
+ <span class="cline-any cline-yes">73x</span>
2925
+ <span class="cline-any cline-yes">367x</span>
2700
2926
  <span class="cline-any cline-no">&nbsp;</span>
2701
2927
  <span class="cline-any cline-neutral">&nbsp;</span>
2702
2928
  <span class="cline-any cline-neutral">&nbsp;</span>
2703
2929
  <span class="cline-any cline-neutral">&nbsp;</span>
2704
2930
  <span class="cline-any cline-neutral">&nbsp;</span>
2705
- <span class="cline-any cline-yes">63x</span>
2931
+ <span class="cline-any cline-yes">73x</span>
2706
2932
  <span class="cline-any cline-neutral">&nbsp;</span>
2707
2933
  <span class="cline-any cline-neutral">&nbsp;</span>
2708
- <span class="cline-any cline-yes">16x</span>
2934
+ <span class="cline-any cline-yes">20x</span>
2709
2935
  <span class="cline-any cline-neutral">&nbsp;</span>
2710
2936
  <span class="cline-any cline-neutral">&nbsp;</span>
2711
2937
  <span class="cline-any cline-neutral">&nbsp;</span>
2712
2938
  <span class="cline-any cline-neutral">&nbsp;</span>
2713
- <span class="cline-any cline-yes">24x</span>
2939
+ <span class="cline-any cline-yes">32x</span>
2714
2940
  <span class="cline-any cline-neutral">&nbsp;</span>
2715
2941
  <span class="cline-any cline-neutral">&nbsp;</span>
2716
2942
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2720,15 +2946,15 @@
2720
2946
  <span class="cline-any cline-neutral">&nbsp;</span>
2721
2947
  <span class="cline-any cline-neutral">&nbsp;</span>
2722
2948
  <span class="cline-any cline-neutral">&nbsp;</span>
2723
- <span class="cline-any cline-yes">63x</span>
2949
+ <span class="cline-any cline-yes">73x</span>
2724
2950
  <span class="cline-any cline-neutral">&nbsp;</span>
2725
- <span class="cline-any cline-yes">63x</span>
2951
+ <span class="cline-any cline-yes">73x</span>
2726
2952
  <span class="cline-any cline-neutral">&nbsp;</span>
2727
- <span class="cline-any cline-yes">63x</span>
2953
+ <span class="cline-any cline-yes">73x</span>
2728
2954
  <span class="cline-any cline-yes">4x</span>
2729
2955
  <span class="cline-any cline-neutral">&nbsp;</span>
2730
2956
  <span class="cline-any cline-neutral">&nbsp;</span>
2731
- <span class="cline-any cline-yes">63x</span>
2957
+ <span class="cline-any cline-yes">73x</span>
2732
2958
  <span class="cline-any cline-neutral">&nbsp;</span>
2733
2959
  <span class="cline-any cline-neutral">&nbsp;</span>
2734
2960
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2747,7 +2973,7 @@
2747
2973
  <span class="cline-any cline-neutral">&nbsp;</span>
2748
2974
  <span class="cline-any cline-neutral">&nbsp;</span>
2749
2975
  <span class="cline-any cline-neutral">&nbsp;</span>
2750
- <span class="cline-any cline-yes">210x</span>
2976
+ <span class="cline-any cline-yes">231x</span>
2751
2977
  <span class="cline-any cline-no">&nbsp;</span>
2752
2978
  <span class="cline-any cline-neutral">&nbsp;</span>
2753
2979
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2756,8 +2982,8 @@
2756
2982
  <span class="cline-any cline-neutral">&nbsp;</span>
2757
2983
  <span class="cline-any cline-neutral">&nbsp;</span>
2758
2984
  <span class="cline-any cline-neutral">&nbsp;</span>
2759
- <span class="cline-any cline-yes">255x</span>
2760
- <span class="cline-any cline-yes">210x</span>
2985
+ <span class="cline-any cline-yes">286x</span>
2986
+ <span class="cline-any cline-yes">231x</span>
2761
2987
  <span class="cline-any cline-neutral">&nbsp;</span>
2762
2988
  <span class="cline-any cline-no">&nbsp;</span>
2763
2989
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2767,8 +2993,8 @@
2767
2993
  <span class="cline-any cline-neutral">&nbsp;</span>
2768
2994
  <span class="cline-any cline-neutral">&nbsp;</span>
2769
2995
  <span class="cline-any cline-neutral">&nbsp;</span>
2770
- <span class="cline-any cline-yes">210x</span>
2771
- <span class="cline-any cline-yes">210x</span>
2996
+ <span class="cline-any cline-yes">231x</span>
2997
+ <span class="cline-any cline-yes">231x</span>
2772
2998
  <span class="cline-any cline-neutral">&nbsp;</span>
2773
2999
  <span class="cline-any cline-neutral">&nbsp;</span>
2774
3000
  <span class="cline-any cline-no">&nbsp;</span>
@@ -2779,7 +3005,7 @@
2779
3005
  <span class="cline-any cline-neutral">&nbsp;</span>
2780
3006
  <span class="cline-any cline-neutral">&nbsp;</span>
2781
3007
  <span class="cline-any cline-neutral">&nbsp;</span>
2782
- <span class="cline-any cline-yes">63x</span>
3008
+ <span class="cline-any cline-yes">73x</span>
2783
3009
  <span class="cline-any cline-neutral">&nbsp;</span>
2784
3010
  <span class="cline-any cline-neutral">&nbsp;</span>
2785
3011
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2802,23 +3028,23 @@
2802
3028
  <span class="cline-any cline-neutral">&nbsp;</span>
2803
3029
  <span class="cline-any cline-neutral">&nbsp;</span>
2804
3030
  <span class="cline-any cline-neutral">&nbsp;</span>
2805
- <span class="cline-any cline-yes">63x</span>
2806
- <span class="cline-any cline-yes">107x</span>
2807
- <span class="cline-any cline-no">&nbsp;</span>
3031
+ <span class="cline-any cline-yes">73x</span>
3032
+ <span class="cline-any cline-yes">118x</span>
3033
+ <span class="cline-any cline-yes">1x</span>
2808
3034
  <span class="cline-any cline-neutral">&nbsp;</span>
2809
3035
  <span class="cline-any cline-neutral">&nbsp;</span>
2810
3036
  <span class="cline-any cline-neutral">&nbsp;</span>
2811
3037
  <span class="cline-any cline-neutral">&nbsp;</span>
2812
- <span class="cline-any cline-yes">63x</span>
3038
+ <span class="cline-any cline-yes">73x</span>
2813
3039
  <span class="cline-any cline-yes">2x</span>
2814
3040
  <span class="cline-any cline-no">&nbsp;</span>
2815
3041
  <span class="cline-any cline-neutral">&nbsp;</span>
2816
3042
  <span class="cline-any cline-neutral">&nbsp;</span>
2817
3043
  <span class="cline-any cline-neutral">&nbsp;</span>
2818
3044
  <span class="cline-any cline-neutral">&nbsp;</span>
2819
- <span class="cline-any cline-yes">63x</span>
3045
+ <span class="cline-any cline-yes">73x</span>
2820
3046
  <span class="cline-any cline-neutral">&nbsp;</span>
2821
- <span class="cline-any cline-yes">63x</span>
3047
+ <span class="cline-any cline-yes">73x</span>
2822
3048
  <span class="cline-any cline-neutral">&nbsp;</span>
2823
3049
  <span class="cline-any cline-neutral">&nbsp;</span>
2824
3050
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2827,7 +3053,7 @@
2827
3053
  <span class="cline-any cline-neutral">&nbsp;</span>
2828
3054
  <span class="cline-any cline-neutral">&nbsp;</span>
2829
3055
  <span class="cline-any cline-neutral">&nbsp;</span>
2830
- <span class="cline-any cline-yes">115x</span>
3056
+ <span class="cline-any cline-yes">126x</span>
2831
3057
  <span class="cline-any cline-no">&nbsp;</span>
2832
3058
  <span class="cline-any cline-neutral">&nbsp;</span>
2833
3059
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2835,7 +3061,7 @@
2835
3061
  <span class="cline-any cline-neutral">&nbsp;</span>
2836
3062
  <span class="cline-any cline-neutral">&nbsp;</span>
2837
3063
  <span class="cline-any cline-neutral">&nbsp;</span>
2838
- <span class="cline-any cline-yes">105x</span>
3064
+ <span class="cline-any cline-yes">116x</span>
2839
3065
  <span class="cline-any cline-neutral">&nbsp;</span>
2840
3066
  <span class="cline-any cline-no">&nbsp;</span>
2841
3067
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2876,7 +3102,7 @@
2876
3102
  <span class="cline-any cline-neutral">&nbsp;</span>
2877
3103
  <span class="cline-any cline-neutral">&nbsp;</span>
2878
3104
  <span class="cline-any cline-neutral">&nbsp;</span>
2879
- <span class="cline-any cline-yes">51x</span>
3105
+ <span class="cline-any cline-yes">58x</span>
2880
3106
  <span class="cline-any cline-yes">2x</span>
2881
3107
  <span class="cline-any cline-neutral">&nbsp;</span>
2882
3108
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2907,16 +3133,16 @@
2907
3133
  <span class="cline-any cline-neutral">&nbsp;</span>
2908
3134
  <span class="cline-any cline-neutral">&nbsp;</span>
2909
3135
  <span class="cline-any cline-neutral">&nbsp;</span>
2910
- <span class="cline-any cline-yes">227x</span>
3136
+ <span class="cline-any cline-yes">264x</span>
2911
3137
  <span class="cline-any cline-neutral">&nbsp;</span>
2912
- <span class="cline-any cline-yes">227x</span>
3138
+ <span class="cline-any cline-yes">264x</span>
2913
3139
  <span class="cline-any cline-neutral">&nbsp;</span>
2914
3140
  <span class="cline-any cline-neutral">&nbsp;</span>
2915
3141
  <span class="cline-any cline-neutral">&nbsp;</span>
2916
- <span class="cline-any cline-yes">227x</span>
3142
+ <span class="cline-any cline-yes">264x</span>
2917
3143
  <span class="cline-any cline-neutral">&nbsp;</span>
2918
3144
  <span class="cline-any cline-neutral">&nbsp;</span>
2919
- <span class="cline-any cline-yes">227x</span>
3145
+ <span class="cline-any cline-yes">264x</span>
2920
3146
  <span class="cline-any cline-yes">1x</span>
2921
3147
  <span class="cline-any cline-neutral">&nbsp;</span>
2922
3148
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2925,15 +3151,15 @@
2925
3151
  <span class="cline-any cline-neutral">&nbsp;</span>
2926
3152
  <span class="cline-any cline-yes">1x</span>
2927
3153
  <span class="cline-any cline-neutral">&nbsp;</span>
2928
- <span class="cline-any cline-yes">226x</span>
3154
+ <span class="cline-any cline-yes">263x</span>
2929
3155
  <span class="cline-any cline-neutral">&nbsp;</span>
2930
- <span class="cline-any cline-yes">50x</span>
3156
+ <span class="cline-any cline-yes">57x</span>
2931
3157
  <span class="cline-any cline-neutral">&nbsp;</span>
2932
3158
  <span class="cline-any cline-neutral">&nbsp;</span>
2933
3159
  <span class="cline-any cline-neutral">&nbsp;</span>
2934
3160
  <span class="cline-any cline-neutral">&nbsp;</span>
2935
3161
  <span class="cline-any cline-neutral">&nbsp;</span>
2936
- <span class="cline-any cline-yes">50x</span>
3162
+ <span class="cline-any cline-yes">57x</span>
2937
3163
  <span class="cline-any cline-neutral">&nbsp;</span>
2938
3164
  <span class="cline-any cline-neutral">&nbsp;</span>
2939
3165
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2941,7 +3167,7 @@
2941
3167
  <span class="cline-any cline-neutral">&nbsp;</span>
2942
3168
  <span class="cline-any cline-neutral">&nbsp;</span>
2943
3169
  <span class="cline-any cline-neutral">&nbsp;</span>
2944
- <span class="cline-any cline-yes">50x</span>
3170
+ <span class="cline-any cline-yes">57x</span>
2945
3171
  <span class="cline-any cline-no">&nbsp;</span>
2946
3172
  <span class="cline-any cline-neutral">&nbsp;</span>
2947
3173
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2949,7 +3175,7 @@
2949
3175
  <span class="cline-any cline-neutral">&nbsp;</span>
2950
3176
  <span class="cline-any cline-neutral">&nbsp;</span>
2951
3177
  <span class="cline-any cline-neutral">&nbsp;</span>
2952
- <span class="cline-any cline-yes">50x</span>
3178
+ <span class="cline-any cline-yes">57x</span>
2953
3179
  <span class="cline-any cline-no">&nbsp;</span>
2954
3180
  <span class="cline-any cline-neutral">&nbsp;</span>
2955
3181
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2957,9 +3183,9 @@
2957
3183
  <span class="cline-any cline-neutral">&nbsp;</span>
2958
3184
  <span class="cline-any cline-neutral">&nbsp;</span>
2959
3185
  <span class="cline-any cline-neutral">&nbsp;</span>
2960
- <span class="cline-any cline-yes">50x</span>
3186
+ <span class="cline-any cline-yes">57x</span>
2961
3187
  <span class="cline-any cline-neutral">&nbsp;</span>
2962
- <span class="cline-any cline-yes">176x</span>
3188
+ <span class="cline-any cline-yes">206x</span>
2963
3189
  <span class="cline-any cline-no">&nbsp;</span>
2964
3190
  <span class="cline-any cline-neutral">&nbsp;</span>
2965
3191
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2968,7 +3194,7 @@
2968
3194
  <span class="cline-any cline-neutral">&nbsp;</span>
2969
3195
  <span class="cline-any cline-no">&nbsp;</span>
2970
3196
  <span class="cline-any cline-neutral">&nbsp;</span>
2971
- <span class="cline-any cline-yes">176x</span>
3197
+ <span class="cline-any cline-yes">206x</span>
2972
3198
  <span class="cline-any cline-no">&nbsp;</span>
2973
3199
  <span class="cline-any cline-neutral">&nbsp;</span>
2974
3200
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2978,7 +3204,7 @@
2978
3204
  <span class="cline-any cline-no">&nbsp;</span>
2979
3205
  <span class="cline-any cline-neutral">&nbsp;</span>
2980
3206
  <span class="cline-any cline-neutral">&nbsp;</span>
2981
- <span class="cline-any cline-yes">176x</span>
3207
+ <span class="cline-any cline-yes">206x</span>
2982
3208
  <span class="cline-any cline-neutral">&nbsp;</span>
2983
3209
  <span class="cline-any cline-neutral">&nbsp;</span>
2984
3210
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3022,8 +3248,9 @@
3022
3248
  <span class="cline-any cline-neutral">&nbsp;</span>
3023
3249
  <span class="cline-any cline-neutral">&nbsp;</span>
3024
3250
  <span class="cline-any cline-neutral">&nbsp;</span>
3025
- <span class="cline-any cline-yes">70x</span>
3026
- <span class="cline-any cline-yes">33x</span>
3251
+ <span class="cline-any cline-neutral">&nbsp;</span>
3252
+ <span class="cline-any cline-yes">74x</span>
3253
+ <span class="cline-any cline-yes">35x</span>
3027
3254
  <span class="cline-any cline-neutral">&nbsp;</span>
3028
3255
  <span class="cline-any cline-no">&nbsp;</span>
3029
3256
  <span class="cline-any cline-no">&nbsp;</span>
@@ -3049,7 +3276,7 @@
3049
3276
  <span class="cline-any cline-neutral">&nbsp;</span>
3050
3277
  <span class="cline-any cline-neutral">&nbsp;</span>
3051
3278
  <span class="cline-any cline-neutral">&nbsp;</span>
3052
- <span class="cline-any cline-yes">105x</span>
3279
+ <span class="cline-any cline-yes">115x</span>
3053
3280
  <span class="cline-any cline-yes">2x</span>
3054
3281
  <span class="cline-any cline-no">&nbsp;</span>
3055
3282
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3069,31 +3296,48 @@
3069
3296
  <span class="cline-any cline-neutral">&nbsp;</span>
3070
3297
  <span class="cline-any cline-neutral">&nbsp;</span>
3071
3298
  <span class="cline-any cline-neutral">&nbsp;</span>
3072
- <span class="cline-any cline-yes">105x</span>
3073
- <span class="cline-any cline-yes">22x</span>
3074
3299
  <span class="cline-any cline-neutral">&nbsp;</span>
3075
3300
  <span class="cline-any cline-neutral">&nbsp;</span>
3301
+ <span class="cline-any cline-yes">115x</span>
3302
+ <span class="cline-any cline-yes">115x</span>
3076
3303
  <span class="cline-any cline-neutral">&nbsp;</span>
3304
+ <span class="cline-any cline-yes">115x</span>
3305
+ <span class="cline-any cline-yes">35x</span>
3306
+ <span class="cline-any cline-yes">74x</span>
3077
3307
  <span class="cline-any cline-neutral">&nbsp;</span>
3078
3308
  <span class="cline-any cline-neutral">&nbsp;</span>
3079
3309
  <span class="cline-any cline-neutral">&nbsp;</span>
3080
- <span class="cline-any cline-yes">83x</span>
3081
- <span class="cline-any cline-yes">83x</span>
3082
3310
  <span class="cline-any cline-neutral">&nbsp;</span>
3083
- <span class="cline-any cline-yes">83x</span>
3084
- <span class="cline-any cline-yes">31x</span>
3085
- <span class="cline-any cline-yes">66x</span>
3311
+ <span class="cline-any cline-yes">115x</span>
3312
+ <span class="cline-any cline-yes">92x</span>
3313
+ <span class="cline-any cline-yes">92x</span>
3314
+ <span class="cline-any cline-yes">264x</span>
3315
+ <span class="cline-any cline-neutral">&nbsp;</span>
3316
+ <span class="cline-any cline-neutral">&nbsp;</span>
3317
+ <span class="cline-any cline-yes">264x</span>
3318
+ <span class="cline-any cline-yes">58x</span>
3319
+ <span class="cline-any cline-neutral">&nbsp;</span>
3320
+ <span class="cline-any cline-neutral">&nbsp;</span>
3321
+ <span class="cline-any cline-neutral">&nbsp;</span>
3322
+ <span class="cline-any cline-yes">58x</span>
3323
+ <span class="cline-any cline-yes">3x</span>
3324
+ <span class="cline-any cline-neutral">&nbsp;</span>
3086
3325
  <span class="cline-any cline-neutral">&nbsp;</span>
3087
3326
  <span class="cline-any cline-neutral">&nbsp;</span>
3088
3327
  <span class="cline-any cline-neutral">&nbsp;</span>
3089
3328
  <span class="cline-any cline-neutral">&nbsp;</span>
3090
- <span class="cline-any cline-yes">83x</span>
3091
- <span class="cline-any cline-yes">83x</span>
3092
- <span class="cline-any cline-yes">227x</span>
3329
+ <span class="cline-any cline-yes">55x</span>
3093
3330
  <span class="cline-any cline-neutral">&nbsp;</span>
3094
3331
  <span class="cline-any cline-neutral">&nbsp;</span>
3095
- <span class="cline-any cline-yes">227x</span>
3096
- <span class="cline-any cline-yes">227x</span>
3332
+ <span class="cline-any cline-neutral">&nbsp;</span>
3333
+ <span class="cline-any cline-neutral">&nbsp;</span>
3334
+ <span class="cline-any cline-neutral">&nbsp;</span>
3335
+ <span class="cline-any cline-neutral">&nbsp;</span>
3336
+ <span class="cline-any cline-neutral">&nbsp;</span>
3337
+ <span class="cline-any cline-neutral">&nbsp;</span>
3338
+ <span class="cline-any cline-neutral">&nbsp;</span>
3339
+ <span class="cline-any cline-yes">264x</span>
3340
+ <span class="cline-any cline-yes">264x</span>
3097
3341
  <span class="cline-any cline-neutral">&nbsp;</span>
3098
3342
  <span class="cline-any cline-neutral">&nbsp;</span>
3099
3343
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3107,26 +3351,26 @@
3107
3351
  <span class="cline-any cline-neutral">&nbsp;</span>
3108
3352
  <span class="cline-any cline-neutral">&nbsp;</span>
3109
3353
  <span class="cline-any cline-neutral">&nbsp;</span>
3110
- <span class="cline-any cline-yes">227x</span>
3111
- <span class="cline-any cline-yes">176x</span>
3112
- <span class="cline-any cline-yes">176x</span>
3354
+ <span class="cline-any cline-yes">264x</span>
3355
+ <span class="cline-any cline-yes">206x</span>
3356
+ <span class="cline-any cline-yes">206x</span>
3113
3357
  <span class="cline-any cline-neutral">&nbsp;</span>
3114
3358
  <span class="cline-any cline-neutral">&nbsp;</span>
3115
3359
  <span class="cline-any cline-neutral">&nbsp;</span>
3116
3360
  <span class="cline-any cline-neutral">&nbsp;</span>
3117
- <span class="cline-any cline-yes">176x</span>
3361
+ <span class="cline-any cline-yes">206x</span>
3118
3362
  <span class="cline-any cline-neutral">&nbsp;</span>
3119
3363
  <span class="cline-any cline-neutral">&nbsp;</span>
3120
3364
  <span class="cline-any cline-neutral">&nbsp;</span>
3121
3365
  <span class="cline-any cline-neutral">&nbsp;</span>
3122
- <span class="cline-any cline-yes">176x</span>
3366
+ <span class="cline-any cline-yes">206x</span>
3123
3367
  <span class="cline-any cline-neutral">&nbsp;</span>
3124
3368
  <span class="cline-any cline-neutral">&nbsp;</span>
3125
3369
  <span class="cline-any cline-neutral">&nbsp;</span>
3126
3370
  <span class="cline-any cline-neutral">&nbsp;</span>
3127
3371
  <span class="cline-any cline-neutral">&nbsp;</span>
3128
3372
  <span class="cline-any cline-neutral">&nbsp;</span>
3129
- <span class="cline-any cline-yes">227x</span>
3373
+ <span class="cline-any cline-yes">264x</span>
3130
3374
  <span class="cline-any cline-yes">2x</span>
3131
3375
  <span class="cline-any cline-neutral">&nbsp;</span>
3132
3376
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3135,7 +3379,7 @@
3135
3379
  <span class="cline-any cline-neutral">&nbsp;</span>
3136
3380
  <span class="cline-any cline-neutral">&nbsp;</span>
3137
3381
  <span class="cline-any cline-neutral">&nbsp;</span>
3138
- <span class="cline-any cline-yes">227x</span>
3382
+ <span class="cline-any cline-yes">264x</span>
3139
3383
  <span class="cline-any cline-neutral">&nbsp;</span>
3140
3384
  <span class="cline-any cline-neutral">&nbsp;</span>
3141
3385
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3146,7 +3390,7 @@
3146
3390
  <span class="cline-any cline-neutral">&nbsp;</span>
3147
3391
  <span class="cline-any cline-neutral">&nbsp;</span>
3148
3392
  <span class="cline-any cline-neutral">&nbsp;</span>
3149
- <span class="cline-any cline-yes">227x</span>
3393
+ <span class="cline-any cline-yes">264x</span>
3150
3394
  <span class="cline-any cline-yes">5x</span>
3151
3395
  <span class="cline-any cline-neutral">&nbsp;</span>
3152
3396
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3160,25 +3404,57 @@
3160
3404
  <span class="cline-any cline-neutral">&nbsp;</span>
3161
3405
  <span class="cline-any cline-neutral">&nbsp;</span>
3162
3406
  <span class="cline-any cline-neutral">&nbsp;</span>
3163
- <span class="cline-any cline-yes">83x</span>
3164
- <span class="cline-any cline-yes">31x</span>
3165
3407
  <span class="cline-any cline-neutral">&nbsp;</span>
3166
- <span class="cline-any cline-yes">66x</span>
3167
- <span class="cline-any cline-yes">25x</span>
3168
- <span class="cline-any cline-yes">175x</span>
3169
- <span class="cline-any cline-yes">175x</span>
3170
- <span class="cline-any cline-yes">175x</span>
3408
+ <span class="cline-any cline-yes">115x</span>
3409
+ <span class="cline-any cline-yes">35x</span>
3410
+ <span class="cline-any cline-neutral">&nbsp;</span>
3411
+ <span class="cline-any cline-yes">74x</span>
3412
+ <span class="cline-any cline-yes">29x</span>
3413
+ <span class="cline-any cline-yes">235x</span>
3414
+ <span class="cline-any cline-neutral">&nbsp;</span>
3415
+ <span class="cline-any cline-neutral">&nbsp;</span>
3416
+ <span class="cline-any cline-neutral">&nbsp;</span>
3417
+ <span class="cline-any cline-neutral">&nbsp;</span>
3418
+ <span class="cline-any cline-neutral">&nbsp;</span>
3419
+ <span class="cline-any cline-neutral">&nbsp;</span>
3420
+ <span class="cline-any cline-neutral">&nbsp;</span>
3421
+ <span class="cline-any cline-neutral">&nbsp;</span>
3422
+ <span class="cline-any cline-neutral">&nbsp;</span>
3423
+ <span class="cline-any cline-neutral">&nbsp;</span>
3424
+ <span class="cline-any cline-neutral">&nbsp;</span>
3425
+ <span class="cline-any cline-neutral">&nbsp;</span>
3426
+ <span class="cline-any cline-yes">74x</span>
3427
+ <span class="cline-any cline-yes">17x</span>
3428
+ <span class="cline-any cline-yes">35x</span>
3429
+ <span class="cline-any cline-yes">35x</span>
3430
+ <span class="cline-any cline-yes">1x</span>
3431
+ <span class="cline-any cline-neutral">&nbsp;</span>
3432
+ <span class="cline-any cline-neutral">&nbsp;</span>
3433
+ <span class="cline-any cline-neutral">&nbsp;</span>
3434
+ <span class="cline-any cline-neutral">&nbsp;</span>
3435
+ <span class="cline-any cline-yes">1x</span>
3436
+ <span class="cline-any cline-neutral">&nbsp;</span>
3437
+ <span class="cline-any cline-neutral">&nbsp;</span>
3438
+ <span class="cline-any cline-yes">34x</span>
3439
+ <span class="cline-any cline-yes">34x</span>
3171
3440
  <span class="cline-any cline-yes">2x</span>
3172
3441
  <span class="cline-any cline-neutral">&nbsp;</span>
3173
3442
  <span class="cline-any cline-neutral">&nbsp;</span>
3174
3443
  <span class="cline-any cline-neutral">&nbsp;</span>
3444
+ <span class="cline-any cline-yes">2x</span>
3445
+ <span class="cline-any cline-no">&nbsp;</span>
3175
3446
  <span class="cline-any cline-neutral">&nbsp;</span>
3176
3447
  <span class="cline-any cline-neutral">&nbsp;</span>
3177
- <span class="cline-any cline-yes">173x</span>
3178
3448
  <span class="cline-any cline-neutral">&nbsp;</span>
3179
3449
  <span class="cline-any cline-neutral">&nbsp;</span>
3450
+ <span class="cline-any cline-no">&nbsp;</span>
3180
3451
  <span class="cline-any cline-neutral">&nbsp;</span>
3181
3452
  <span class="cline-any cline-neutral">&nbsp;</span>
3453
+ <span class="cline-any cline-yes">34x</span>
3454
+ <span class="cline-any cline-yes">34x</span>
3455
+ <span class="cline-any cline-yes">34x</span>
3456
+ <span class="cline-any cline-yes">47x</span>
3457
+ <span class="cline-any cline-yes">47x</span>
3182
3458
  <span class="cline-any cline-neutral">&nbsp;</span>
3183
3459
  <span class="cline-any cline-neutral">&nbsp;</span>
3184
3460
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3186,51 +3462,59 @@
3186
3462
  <span class="cline-any cline-neutral">&nbsp;</span>
3187
3463
  <span class="cline-any cline-neutral">&nbsp;</span>
3188
3464
  <span class="cline-any cline-neutral">&nbsp;</span>
3465
+ <span class="cline-any cline-yes">47x</span>
3189
3466
  <span class="cline-any cline-neutral">&nbsp;</span>
3190
3467
  <span class="cline-any cline-neutral">&nbsp;</span>
3191
- <span class="cline-any cline-yes">66x</span>
3192
- <span class="cline-any cline-yes">15x</span>
3193
- <span class="cline-any cline-yes">23x</span>
3194
- <span class="cline-any cline-yes">23x</span>
3195
- <span class="cline-any cline-yes">23x</span>
3196
- <span class="cline-any cline-yes">1x</span>
3468
+ <span class="cline-any cline-neutral">&nbsp;</span>
3469
+ <span class="cline-any cline-neutral">&nbsp;</span>
3470
+ <span class="cline-any cline-yes">16x</span>
3471
+ <span class="cline-any cline-yes">16x</span>
3472
+ <span class="cline-any cline-yes">36x</span>
3473
+ <span class="cline-any cline-yes">36x</span>
3474
+ <span class="cline-any cline-no">&nbsp;</span>
3197
3475
  <span class="cline-any cline-neutral">&nbsp;</span>
3198
3476
  <span class="cline-any cline-neutral">&nbsp;</span>
3199
3477
  <span class="cline-any cline-neutral">&nbsp;</span>
3200
3478
  <span class="cline-any cline-neutral">&nbsp;</span>
3201
- <span class="cline-any cline-yes">22x</span>
3202
- <span class="cline-any cline-yes">22x</span>
3203
- <span class="cline-any cline-yes">29x</span>
3479
+ <span class="cline-any cline-no">&nbsp;</span>
3204
3480
  <span class="cline-any cline-neutral">&nbsp;</span>
3481
+ <span class="cline-any cline-yes">36x</span>
3205
3482
  <span class="cline-any cline-neutral">&nbsp;</span>
3206
3483
  <span class="cline-any cline-neutral">&nbsp;</span>
3207
3484
  <span class="cline-any cline-neutral">&nbsp;</span>
3208
3485
  <span class="cline-any cline-neutral">&nbsp;</span>
3486
+ <span class="cline-any cline-yes">36x</span>
3487
+ <span class="cline-any cline-yes">6x</span>
3209
3488
  <span class="cline-any cline-neutral">&nbsp;</span>
3210
3489
  <span class="cline-any cline-neutral">&nbsp;</span>
3211
3490
  <span class="cline-any cline-neutral">&nbsp;</span>
3212
3491
  <span class="cline-any cline-neutral">&nbsp;</span>
3492
+ <span class="cline-any cline-yes">6x</span>
3213
3493
  <span class="cline-any cline-neutral">&nbsp;</span>
3214
3494
  <span class="cline-any cline-neutral">&nbsp;</span>
3495
+ <span class="cline-any cline-yes">6x</span>
3496
+ <span class="cline-any cline-yes">6x</span>
3215
3497
  <span class="cline-any cline-neutral">&nbsp;</span>
3498
+ <span class="cline-any cline-no">&nbsp;</span>
3216
3499
  <span class="cline-any cline-neutral">&nbsp;</span>
3217
3500
  <span class="cline-any cline-neutral">&nbsp;</span>
3218
3501
  <span class="cline-any cline-neutral">&nbsp;</span>
3219
3502
  <span class="cline-any cline-neutral">&nbsp;</span>
3503
+ <span class="cline-any cline-no">&nbsp;</span>
3504
+ <span class="cline-any cline-neutral">&nbsp;</span>
3505
+ <span class="cline-any cline-yes">30x</span>
3220
3506
  <span class="cline-any cline-neutral">&nbsp;</span>
3221
3507
  <span class="cline-any cline-neutral">&nbsp;</span>
3222
3508
  <span class="cline-any cline-neutral">&nbsp;</span>
3223
3509
  <span class="cline-any cline-neutral">&nbsp;</span>
3224
3510
  <span class="cline-any cline-neutral">&nbsp;</span>
3225
3511
  <span class="cline-any cline-neutral">&nbsp;</span>
3226
- <span class="cline-any cline-yes">83x</span>
3227
3512
  <span class="cline-any cline-neutral">&nbsp;</span>
3228
- <span class="cline-any cline-yes">83x</span>
3229
3513
  <span class="cline-any cline-neutral">&nbsp;</span>
3230
- <span class="cline-any cline-yes">166x</span>
3231
- <span class="cline-any cline-yes">166x</span>
3232
3514
  <span class="cline-any cline-neutral">&nbsp;</span>
3233
3515
  <span class="cline-any cline-neutral">&nbsp;</span>
3516
+ <span class="cline-any cline-yes">31x</span>
3517
+ <span class="cline-any cline-neutral">&nbsp;</span>
3234
3518
  <span class="cline-any cline-neutral">&nbsp;</span>
3235
3519
  <span class="cline-any cline-neutral">&nbsp;</span>
3236
3520
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3241,8 +3525,30 @@
3241
3525
  <span class="cline-any cline-neutral">&nbsp;</span>
3242
3526
  <span class="cline-any cline-neutral">&nbsp;</span>
3243
3527
  <span class="cline-any cline-neutral">&nbsp;</span>
3244
- <span class="cline-any cline-yes">166x</span>
3245
- <span class="cline-any cline-yes">14x</span>
3528
+ <span class="cline-any cline-neutral">&nbsp;</span>
3529
+ <span class="cline-any cline-neutral">&nbsp;</span>
3530
+ <span class="cline-any cline-neutral">&nbsp;</span>
3531
+ <span class="cline-any cline-neutral">&nbsp;</span>
3532
+ <span class="cline-any cline-yes">115x</span>
3533
+ <span class="cline-any cline-neutral">&nbsp;</span>
3534
+ <span class="cline-any cline-yes">115x</span>
3535
+ <span class="cline-any cline-neutral">&nbsp;</span>
3536
+ <span class="cline-any cline-yes">230x</span>
3537
+ <span class="cline-any cline-yes">230x</span>
3538
+ <span class="cline-any cline-neutral">&nbsp;</span>
3539
+ <span class="cline-any cline-neutral">&nbsp;</span>
3540
+ <span class="cline-any cline-neutral">&nbsp;</span>
3541
+ <span class="cline-any cline-neutral">&nbsp;</span>
3542
+ <span class="cline-any cline-neutral">&nbsp;</span>
3543
+ <span class="cline-any cline-neutral">&nbsp;</span>
3544
+ <span class="cline-any cline-neutral">&nbsp;</span>
3545
+ <span class="cline-any cline-neutral">&nbsp;</span>
3546
+ <span class="cline-any cline-neutral">&nbsp;</span>
3547
+ <span class="cline-any cline-neutral">&nbsp;</span>
3548
+ <span class="cline-any cline-neutral">&nbsp;</span>
3549
+ <span class="cline-any cline-neutral">&nbsp;</span>
3550
+ <span class="cline-any cline-yes">230x</span>
3551
+ <span class="cline-any cline-yes">18x</span>
3246
3552
  <span class="cline-any cline-neutral">&nbsp;</span>
3247
3553
  <span class="cline-any cline-neutral">&nbsp;</span>
3248
3554
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3287,12 +3593,18 @@
3287
3593
  <span class="cline-any cline-neutral">&nbsp;</span>
3288
3594
  <span class="cline-any cline-neutral">&nbsp;</span>
3289
3595
  <span class="cline-any cline-neutral">&nbsp;</span>
3290
- <span class="cline-any cline-yes">63x</span>
3596
+ <span class="cline-any cline-yes">73x</span>
3291
3597
  <span class="cline-any cline-neutral">&nbsp;</span>
3292
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Schema } from "@featurevisor/types";
3598
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { Schema, SchemaType } from "@featurevisor/types";
3293
3599
  import { z } from "zod";
3294
3600
  &nbsp;
3295
3601
  import { ProjectConfig } from "../config";
3602
+ import {
3603
+ isMutationKey,
3604
+ validateMutationKey,
3605
+ parsePathMapKey,
3606
+ resolveSchemaAtPath,
3607
+ } from "./mutationNotation";
3296
3608
  import {
3297
3609
  valueZodSchema,
3298
3610
  propertyTypeEnum,
@@ -3541,27 +3853,42 @@ function valueDeepEqual(a: unknown, b: unknown): boolean {
3541
3853
  return false;
3542
3854
  }
3543
3855
  &nbsp;
3856
+ type SchemaLikeForRequired = {
3857
+ type?: string;
3858
+ properties?: Record&lt;string, unknown&gt;;
3859
+ required?: string[];
3860
+ items?: unknown;
3861
+ schema?: string;
3862
+ oneOf?: unknown[];
3863
+ };
3864
+ &nbsp;
3544
3865
  /**
3545
3866
  * Recursively validates that every `required` array (at this level and in nested
3546
3867
  * object/array schemas) only contains keys that exist in the same level's `properties`.
3547
3868
  * Adds Zod issues with the correct path for invalid required field names.
3869
+ * When schemasByKey is provided, resolves schema references (schema: key) so that
3870
+ * referenced and nested schemas are validated too.
3548
3871
  */
3549
3872
  function refineRequiredKeysInSchema(
3550
- schema: {
3551
- type?: string;
3552
- properties?: Record&lt;string, unknown&gt;;
3553
- required?: string[];
3554
- items?: unknown;
3555
- },
3873
+ schema: SchemaLikeForRequired,
3556
3874
  pathPrefix: (string | number)[],
3557
3875
  ctx: z.RefinementCtx,
3876
+ schemasByKey?: Record&lt;string, Schema&gt;,
3558
3877
  ): void {
3559
3878
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!schema || typeof schema !== "object") <span class="cstat-no" title="statement not covered" >return;</span>
3560
3879
  &nbsp;
3561
- const effectiveType = schema.type;
3562
- const properties = schema.properties;
3563
- const required = schema.required;
3564
- const items = schema.items;
3880
+ // Resolve schema reference so we validate the referenced schema (and can recurse into it)
3881
+ let current: SchemaLikeForRequired = schema;
3882
+ if (schema.schema &amp;&amp; schemasByKey?.[schema.schema]) {
3883
+ current = schemasByKey[schema.schema] as SchemaLikeForRequired;
3884
+ refineRequiredKeysInSchema(current, pathPrefix, ctx, schemasByKey);
3885
+ return;
3886
+ }
3887
+ &nbsp;
3888
+ const effectiveType = current.type;
3889
+ const properties = current.properties;
3890
+ const required = current.required;
3891
+ const items = current.items;
3565
3892
  &nbsp;
3566
3893
  if (
3567
3894
  effectiveType === "object" &amp;&amp;
@@ -3587,9 +3914,10 @@ function refineRequiredKeysInSchema(
3587
3914
  const nested = properties[key];
3588
3915
  if (nested &amp;&amp; typeof nested === "object") {
3589
3916
  refineRequiredKeysInSchema(
3590
- nested as Parameters&lt;typeof refineRequiredKeysInSchema&gt;[0],
3917
+ nested as SchemaLikeForRequired,
3591
3918
  [...pathPrefix, "properties", key],
3592
3919
  ctx,
3920
+ schemasByKey,
3593
3921
  );
3594
3922
  }
3595
3923
  }
@@ -3597,20 +3925,22 @@ function refineRequiredKeysInSchema(
3597
3925
  &nbsp;
3598
3926
  if (items &amp;&amp; typeof items === "object" &amp;&amp; !Array.isArray(items)) {
3599
3927
  refineRequiredKeysInSchema(
3600
- items as Parameters&lt;typeof refineRequiredKeysInSchema&gt;[0],
3928
+ items as SchemaLikeForRequired,
3601
3929
  [...pathPrefix, "items"],
3602
3930
  ctx,
3931
+ schemasByKey,
3603
3932
  );
3604
3933
  }
3605
3934
  &nbsp;
3606
- const oneOf = (schema as { oneOf?: unknown[] }).oneOf;
3935
+ const oneOf = (current as { oneOf?: unknown[] }).oneOf;
3607
3936
  if (oneOf &amp;&amp; Array.isArray(oneOf)) {
3608
3937
  oneOf.forEach((branch, i) =&gt; {
3609
3938
  if (branch &amp;&amp; typeof branch === "object") {
3610
3939
  refineRequiredKeysInSchema(
3611
- branch as Parameters&lt;typeof refineRequiredKeysInSchema&gt;[0],
3940
+ branch as SchemaLikeForRequired,
3612
3941
  [...pathPrefix, "oneOf", i],
3613
3942
  ctx,
3943
+ schemasByKey,
3614
3944
  );
3615
3945
  }
3616
3946
  });
@@ -3795,15 +4125,21 @@ function refineVariableValueObject(
3795
4125
  }
3796
4126
  }
3797
4127
  &nbsp;
4128
+ /** Schema or variable schema (e.g. type "json", defaultValue); used for value validation. */
4129
+ type VariableSchemaLike =
4130
+ | (Omit&lt;Schema, "type"&gt; &amp; { type?: SchemaType | "json" })
4131
+ | null
4132
+ | undefined;
4133
+ &nbsp;
3798
4134
  function superRefineVariableValue(
3799
4135
  projectConfig: ProjectConfig,
3800
- variableSchema,
3801
- variableValue,
3802
- path,
3803
- ctx,
4136
+ variableSchema: VariableSchemaLike,
4137
+ variableValue: unknown,
4138
+ path: (string | number)[],
4139
+ ctx: z.RefinementCtx,
3804
4140
  variableKey?: string,
3805
4141
  schemasByKey?: Record&lt;string, Schema&gt;,
3806
- ) {
4142
+ ): void {
3807
4143
  const label = getVariableLabel(variableSchema, variableKey, path);
3808
4144
  &nbsp;
3809
4145
  <span class="missing-if-branch" title="if path not taken" >I</span>if (!variableSchema) {
@@ -4145,6 +4481,66 @@ function superRefineVariableValue(
4145
4481
  });
4146
4482
  }
4147
4483
  &nbsp;
4484
+ /**
4485
+ * Validate a single variable entry (key + value) in variables map.
4486
+ * Key may be a root variable name or mutation notation (e.g. "config.width", "items[0].name").
4487
+ */
4488
+ function refineVariableEntry(
4489
+ projectConfig: ProjectConfig,
4490
+ variableSchemaByKey: Record&lt;string, unknown&gt;,
4491
+ variableKey: string,
4492
+ variableValue: unknown,
4493
+ path: (string | number)[],
4494
+ ctx: z.RefinementCtx,
4495
+ schemasByKey?: Record&lt;string, Schema&gt;,
4496
+ ): void {
4497
+ if (isMutationKey(variableKey)) {
4498
+ const validation = validateMutationKey(
4499
+ variableKey,
4500
+ variableSchemaByKey as Record&lt;string, Schema&gt;,
4501
+ schemasByKey,
4502
+ );
4503
+ if (!validation.valid &amp;&amp; validation.error) {
4504
+ ctx.addIssue({
4505
+ code: z.ZodIssueCode.custom,
4506
+ message: validation.error,
4507
+ path,
4508
+ });
4509
+ return;
4510
+ }
4511
+ if (validation.valueSchema) {
4512
+ superRefineVariableValue(
4513
+ projectConfig,
4514
+ validation.valueSchema,
4515
+ variableValue,
4516
+ path,
4517
+ ctx,
4518
+ variableKey,
4519
+ schemasByKey,
4520
+ );
4521
+ }
4522
+ return;
4523
+ }
4524
+ const variableSchema = variableSchemaByKey[variableKey];
4525
+ if (!variableSchema) {
4526
+ ctx.addIssue({
4527
+ code: z.ZodIssueCode.custom,
4528
+ message: `Variable "${variableKey}" is not defined in \`variablesSchema\`.`,
4529
+ path,
4530
+ });
4531
+ return;
4532
+ }
4533
+ superRefineVariableValue(
4534
+ projectConfig,
4535
+ variableSchema as Parameters&lt;typeof superRefineVariableValue&gt;[1],
4536
+ variableValue,
4537
+ path,
4538
+ ctx,
4539
+ variableKey,
4540
+ schemasByKey,
4541
+ );
4542
+ }
4543
+ &nbsp;
4148
4544
  function refineForce({
4149
4545
  ctx,
4150
4546
  parsedFeature, // eslint-disable-line
@@ -4170,24 +4566,15 @@ function refineForce({
4170
4566
  // force[n].variables[key]
4171
4567
  if (f.variables) {
4172
4568
  Object.keys(f.variables).forEach((variableKey) =&gt; {
4173
- const variableSchema = variableSchemaByKey[variableKey];
4174
- if (!variableSchema) {
4175
- ctx.addIssue({
4176
- code: z.ZodIssueCode.custom,
4177
- message: `Variable "${variableKey}" is not defined in \`variablesSchema\`.`,
4178
- path: pathPrefix.concat([fN, "variables", variableKey]),
4179
- });
4180
- } else {
4181
- superRefineVariableValue(
4182
- projectConfig,
4183
- variableSchema,
4184
- f.variables[variableKey],
4185
- pathPrefix.concat([fN, "variables", variableKey]),
4186
- ctx,
4187
- variableKey,
4188
- schemasByKey,
4189
- );
4190
- }
4569
+ refineVariableEntry(
4570
+ projectConfig,
4571
+ variableSchemaByKey,
4572
+ variableKey,
4573
+ f.variables[variableKey],
4574
+ pathPrefix.concat([fN, "variables", variableKey]),
4575
+ ctx,
4576
+ schemasByKey,
4577
+ );
4191
4578
  });
4192
4579
  }
4193
4580
  });
@@ -4207,24 +4594,15 @@ function refineRules({
4207
4594
  // rules[n].variables[key]
4208
4595
  if (rule.variables) {
4209
4596
  Object.keys(rule.variables).forEach((variableKey) =&gt; {
4210
- const variableSchema = variableSchemaByKey[variableKey];
4211
- if (!variableSchema) {
4212
- ctx.addIssue({
4213
- code: z.ZodIssueCode.custom,
4214
- message: `Variable "${variableKey}" is not defined in \`variablesSchema\`.`,
4215
- path: pathPrefix.concat([ruleN, "variables", variableKey]),
4216
- });
4217
- } else {
4218
- superRefineVariableValue(
4219
- projectConfig,
4220
- variableSchema,
4221
- rule.variables[variableKey],
4222
- pathPrefix.concat([ruleN, "variables", variableKey]),
4223
- ctx,
4224
- variableKey,
4225
- schemasByKey,
4226
- );
4227
- }
4597
+ refineVariableEntry(
4598
+ projectConfig,
4599
+ variableSchemaByKey,
4600
+ variableKey,
4601
+ rule.variables[variableKey],
4602
+ pathPrefix.concat([ruleN, "variables", variableKey]),
4603
+ ctx,
4604
+ schemasByKey,
4605
+ );
4228
4606
  });
4229
4607
  }
4230
4608
  &nbsp;
@@ -4305,6 +4683,7 @@ export function getFeatureZodSchema(
4305
4683
  ) {
4306
4684
  const schemaZodSchema = getSchemaZodSchema(availableSchemaKeys);
4307
4685
  const variableValueZodSchema = valueZodSchema;
4686
+ const variableValueOrNullZodSchema = z.union([valueZodSchema, z.null()]);
4308
4687
  &nbsp;
4309
4688
  const variationValueZodSchema = z.string().min(1);
4310
4689
  &nbsp;
@@ -4352,7 +4731,7 @@ export function getFeatureZodSchema(
4352
4731
  &nbsp;
4353
4732
  enabled: z.boolean().optional(),
4354
4733
  variation: variationValueZodSchema.optional(),
4355
- variables: z.record(variableValueZodSchema).optional(),
4734
+ variables: z.record(variableValueOrNullZodSchema).optional(),
4356
4735
  variationWeights: z.record(z.number().min(0).max(100)).optional(),
4357
4736
  })
4358
4737
  .strict(),
@@ -4400,7 +4779,7 @@ export function getFeatureZodSchema(
4400
4779
  segments: groupSegmentsZodSchema,
4401
4780
  enabled: z.boolean().optional(),
4402
4781
  variation: variationValueZodSchema.optional(),
4403
- variables: z.record(variableValueZodSchema).optional(),
4782
+ variables: z.record(variableValueOrNullZodSchema).optional(),
4404
4783
  })
4405
4784
  .strict(),
4406
4785
  z
@@ -4408,7 +4787,7 @@ export function getFeatureZodSchema(
4408
4787
  conditions: conditionsZodSchema,
4409
4788
  enabled: z.boolean().optional(),
4410
4789
  variation: variationValueZodSchema.optional(),
4411
- variables: z.record(variableValueZodSchema).optional(),
4790
+ variables: z.record(variableValueOrNullZodSchema).optional(),
4412
4791
  })
4413
4792
  .strict(),
4414
4793
  ]),
@@ -4417,7 +4796,7 @@ export function getFeatureZodSchema(
4417
4796
  &nbsp;
4418
4797
  const attributeKeyZodSchema = z.string().refine(
4419
4798
  (value) =&gt; value === "*" || availableAttributeKeys.includes(value),
4420
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
4799
+ (value) =&gt; ({
4421
4800
  message: `Unknown attribute "${value}"`,
4422
4801
  }),
4423
4802
  );
@@ -4590,11 +4969,12 @@ export function getFeatureZodSchema(
4590
4969
  });
4591
4970
  <span class="cstat-no" title="statement not covered" > return;</span>
4592
4971
  }
4593
- // Validate required ⊆ properties at this level and in all nested object schemas
4972
+ // Validate required ⊆ properties at this level and in all nested object schemas (resolve refs when schemasByKey provided)
4594
4973
  refineRequiredKeysInSchema(
4595
- variableSchema as Parameters&lt;typeof refineRequiredKeysInSchema&gt;[0],
4974
+ variableSchema as SchemaLikeForRequired,
4596
4975
  [],
4597
4976
  ctx,
4977
+ schemasByKey,
4598
4978
  );
4599
4979
  }),
4600
4980
  )
@@ -4609,7 +4989,7 @@ export function getFeatureZodSchema(
4609
4989
  description: z.string().optional(),
4610
4990
  value: variationValueZodSchema,
4611
4991
  weight: z.number().min(0).max(100),
4612
- variables: z.record(variableValueZodSchema).optional(),
4992
+ variables: z.record(variableValueOrNullZodSchema).optional(),
4613
4993
  variableOverrides: z
4614
4994
  .record(
4615
4995
  z.array(
@@ -4682,15 +5062,9 @@ export function getFeatureZodSchema(
4682
5062
  }
4683
5063
  }
4684
5064
  &nbsp;
4685
- if (!value.variablesSchema) {
4686
- return;
4687
- }
4688
- &nbsp;
4689
- // Every variable value is validated against its schema from variablesSchema. Sources covered:
4690
- // 1. variablesSchema[key].defaultValue 2. variablesSchema[key].disabledValue
4691
- // 3. variations[n].variables[key] 4. variations[n].variableOverrides[key][].value
4692
- // 5. rules[env][n].variables[key] 6. force[env][n].variables[key]
4693
- const variableSchemaByKey = value.variablesSchema;
5065
+ // When variablesSchema is absent, variableSchemaByKey is {} so any variable key used in
5066
+ // rules/force/variations will be reported as "not defined in variablesSchema".
5067
+ const variableSchemaByKey = value.variablesSchema ?? {};
4694
5068
  const variationValues: string[] = [];
4695
5069
  &nbsp;
4696
5070
  if (value.variations) {
@@ -4699,78 +5073,102 @@ export function getFeatureZodSchema(
4699
5073
  });
4700
5074
  }
4701
5075
  &nbsp;
4702
- // variablesSchema[key]
4703
- const variableKeys = Object.keys(variableSchemaByKey);
4704
- variableKeys.forEach((variableKey) =&gt; {
4705
- const variableSchema = variableSchemaByKey[variableKey];
5076
+ // variablesSchema[key] — only when feature defines variablesSchema
5077
+ if (value.variablesSchema) {
5078
+ const variableKeys = Object.keys(variableSchemaByKey);
5079
+ variableKeys.forEach((variableKey) =&gt; {
5080
+ const variableSchema = variableSchemaByKey[variableKey];
4706
5081
  &nbsp;
4707
- // When type and enum are both present, all enum values must match the type
4708
- const effectiveSchema = resolveVariableSchema(variableSchema, schemasByKey);
4709
- if (
4710
- effectiveSchema &amp;&amp;
4711
- effectiveSchema.type &amp;&amp;
4712
- Array.isArray(effectiveSchema.enum) &amp;&amp;
4713
- effectiveSchema.enum.length &gt; 0
4714
- ) {
4715
- refineEnumMatchesType(
4716
- effectiveSchema as Parameters&lt;typeof refineEnumMatchesType&gt;[0],
4717
- ["variablesSchema", variableKey],
4718
- ctx,
4719
- );
4720
- }
5082
+ // When variable references a schema by name, ensure it resolves and validate the referenced schema
5083
+ if ("schema" in variableSchema &amp;&amp; variableSchema.schema) {
5084
+ const resolvedSchema = resolveVariableSchema(
5085
+ variableSchema as Parameters&lt;typeof resolveVariableSchema&gt;[0],
5086
+ schemasByKey,
5087
+ );
5088
+ if (!resolvedSchema) {
5089
+ ctx.addIssue({
5090
+ code: z.ZodIssueCode.custom,
5091
+ message: `Schema "${variableSchema.schema}" could not be loaded for variable "${variableKey}".`,
5092
+ path: ["variablesSchema", variableKey],
5093
+ });
5094
+ } else {
5095
+ refineRequiredKeysInSchema(
5096
+ resolvedSchema as SchemaLikeForRequired,
5097
+ ["variablesSchema", variableKey],
5098
+ ctx,
5099
+ schemasByKey,
5100
+ );
5101
+ }
5102
+ }
4721
5103
  &nbsp;
4722
- // Inline variable schemas: validate minimum/maximum, minLength/maxLength/pattern, minItems/maxItems/uniqueItems
4723
- if (!("schema" in variableSchema) || !variableSchema.schema) {
4724
- const pathPrefix = ["variablesSchema", variableKey];
4725
- refineMinimumMaximum(
4726
- variableSchema as Parameters&lt;typeof refineMinimumMaximum&gt;[0],
4727
- pathPrefix,
4728
- ctx,
4729
- );
4730
- refineStringLengthPattern(
4731
- variableSchema as Parameters&lt;typeof refineStringLengthPattern&gt;[0],
4732
- pathPrefix,
4733
- ctx,
4734
- );
4735
- refineArrayItems(
4736
- variableSchema as Parameters&lt;typeof refineArrayItems&gt;[0],
4737
- pathPrefix,
4738
- ctx,
4739
- );
4740
- }
5104
+ // When type and enum are both present, all enum values must match the type
5105
+ const effectiveSchema = resolveVariableSchema(variableSchema, schemasByKey);
5106
+ if (
5107
+ effectiveSchema &amp;&amp;
5108
+ effectiveSchema.type &amp;&amp;
5109
+ Array.isArray(effectiveSchema.enum) &amp;&amp;
5110
+ effectiveSchema.enum.length &gt; 0
5111
+ ) {
5112
+ refineEnumMatchesType(
5113
+ effectiveSchema as Parameters&lt;typeof refineEnumMatchesType&gt;[0],
5114
+ ["variablesSchema", variableKey],
5115
+ ctx,
5116
+ );
5117
+ }
4741
5118
  &nbsp;
4742
- if (variableKey === "variation") {
4743
- ctx.addIssue({
4744
- code: z.ZodIssueCode.custom,
4745
- message: `Variable key "${variableKey}" is reserved and cannot be used.`,
4746
- path: ["variablesSchema", variableKey],
4747
- });
4748
- }
5119
+ // Inline variable schemas: validate minimum/maximum, minLength/maxLength/pattern, minItems/maxItems/uniqueItems
5120
+ if (!("schema" in variableSchema) || !variableSchema.schema) {
5121
+ const pathPrefix = ["variablesSchema", variableKey];
5122
+ refineMinimumMaximum(
5123
+ variableSchema as Parameters&lt;typeof refineMinimumMaximum&gt;[0],
5124
+ pathPrefix,
5125
+ ctx,
5126
+ );
5127
+ refineStringLengthPattern(
5128
+ variableSchema as Parameters&lt;typeof refineStringLengthPattern&gt;[0],
5129
+ pathPrefix,
5130
+ ctx,
5131
+ );
5132
+ refineArrayItems(
5133
+ variableSchema as Parameters&lt;typeof refineArrayItems&gt;[0],
5134
+ pathPrefix,
5135
+ ctx,
5136
+ );
5137
+ }
4749
5138
  &nbsp;
4750
- // defaultValue
4751
- superRefineVariableValue(
4752
- projectConfig,
4753
- variableSchema,
4754
- variableSchema.defaultValue,
4755
- ["variablesSchema", variableKey, "defaultValue"],
4756
- ctx,
4757
- variableKey,
4758
- schemasByKey,
4759
- );
5139
+ if (variableKey === "variation") {
5140
+ ctx.addIssue({
5141
+ code: z.ZodIssueCode.custom,
5142
+ message: `Variable key "${variableKey}" is reserved and cannot be used.`,
5143
+ path: ["variablesSchema", variableKey],
5144
+ });
5145
+ }
4760
5146
  &nbsp;
4761
- // disabledValue (only when present)
4762
- if (variableSchema.disabledValue !== undefined) {
5147
+ // defaultValue
4763
5148
  superRefineVariableValue(
4764
5149
  projectConfig,
4765
5150
  variableSchema,
4766
- variableSchema.disabledValue,
4767
- ["variablesSchema", variableKey, "disabledValue"],
5151
+ variableSchema.defaultValue,
5152
+ ["variablesSchema", variableKey, "defaultValue"],
4768
5153
  ctx,
4769
5154
  variableKey,
4770
5155
  schemasByKey,
4771
5156
  );
4772
- }
4773
- });
5157
+ &nbsp;
5158
+ // disabledValue (only when present)
5159
+ if (variableSchema.disabledValue !== undefined) {
5160
+ superRefineVariableValue(
5161
+ projectConfig,
5162
+ variableSchema,
5163
+ variableSchema.disabledValue,
5164
+ ["variablesSchema", variableKey, "disabledValue"],
5165
+ ctx,
5166
+ variableKey,
5167
+ schemasByKey,
5168
+ );
5169
+ }
5170
+ });
5171
+ }
4774
5172
  &nbsp;
4775
5173
  // variations: validate variation.variables and variation.variableOverrides (each value against its variable schema)
4776
5174
  if (value.variations) {
@@ -4778,32 +5176,21 @@ export function getFeatureZodSchema(
4778
5176
  // variations[n].variables[key]
4779
5177
  if (variation.variables) {
4780
5178
  for (const variableKey of Object.keys(variation.variables)) {
4781
- const variableValue = variation.variables[variableKey];
4782
- const variableSchema = variableSchemaByKey[variableKey];
4783
- if (!variableSchema) {
4784
- ctx.addIssue({
4785
- code: z.ZodIssueCode.custom,
4786
- message: `Variable "${variableKey}" is not defined in \`variablesSchema\`.`,
4787
- path: ["variations", variationN, "variables", variableKey],
4788
- });
4789
- } else {
4790
- superRefineVariableValue(
4791
- projectConfig,
4792
- variableSchema,
4793
- variableValue,
4794
- ["variations", variationN, "variables", variableKey],
4795
- ctx,
4796
- variableKey,
4797
- schemasByKey,
4798
- );
4799
- }
5179
+ refineVariableEntry(
5180
+ projectConfig,
5181
+ variableSchemaByKey,
5182
+ variableKey,
5183
+ variation.variables[variableKey],
5184
+ ["variations", variationN, "variables", variableKey],
5185
+ ctx,
5186
+ schemasByKey,
5187
+ );
4800
5188
  }
4801
5189
  }
4802
5190
  &nbsp;
4803
- // variations[n].variableOverrides[key][].value (validated even when variation.variables is absent)
5191
+ // variations[n].variableOverrides[key][].value (path-map or full value)
4804
5192
  if (variation.variableOverrides) {
4805
5193
  for (const variableKey of Object.keys(variation.variableOverrides)) {
4806
- const overrides = variation.variableOverrides[variableKey];
4807
5194
  const variableSchema = variableSchemaByKey[variableKey];
4808
5195
  if (!variableSchema) {
4809
5196
  ctx.addIssue({
@@ -4811,26 +5198,98 @@ export function getFeatureZodSchema(
4811
5198
  message: `Variable "${variableKey}" is not defined in \`variablesSchema\`.`,
4812
5199
  path: ["variations", variationN, "variableOverrides", variableKey],
4813
5200
  });
4814
- } else if (Array.isArray(overrides)) {
4815
- overrides.forEach((override, overrideN) =&gt; {
5201
+ continue;
5202
+ }
5203
+ // When variable references a schema by name, ensure it can be resolved
5204
+ const variableSchemaWithRef = variableSchema as { schema?: string };
5205
+ if (variableSchemaWithRef.schema) {
5206
+ const resolvedVarSchema = resolveVariableSchema(
5207
+ variableSchema as Parameters&lt;typeof resolveVariableSchema&gt;[0],
5208
+ schemasByKey,
5209
+ );
5210
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!resolvedVarSchema) {
5211
+ <span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
5212
+ code: z.ZodIssueCode.custom,
5213
+ message: `Schema "${variableSchemaWithRef.schema}" could not be loaded for variable "${variableKey}".`,
5214
+ path: ["variations", variationN, "variableOverrides", variableKey],
5215
+ });
5216
+ <span class="cstat-no" title="statement not covered" > continue;</span>
5217
+ }
5218
+ }
5219
+ const overrides = variation.variableOverrides[variableKey];
5220
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(overrides)) <span class="cstat-no" title="statement not covered" >continue;</span>
5221
+ overrides.forEach((override, overrideN) =&gt; {
5222
+ const overrideValue = override.value;
5223
+ const valuePath = [
5224
+ "variations",
5225
+ variationN,
5226
+ "variableOverrides",
5227
+ variableKey,
5228
+ overrideN,
5229
+ "value",
5230
+ ];
5231
+ if (
5232
+ typeof overrideValue === "object" &amp;&amp;
5233
+ overrideValue !== null &amp;&amp;
5234
+ !Array.isArray(overrideValue)
5235
+ ) {
5236
+ const pathMap = overrideValue as Record&lt;string, unknown&gt;;
5237
+ for (const pathKey of Object.keys(pathMap)) {
5238
+ const pathSegments = parsePathMapKey(pathKey);
5239
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!pathSegments || pathSegments.length === 0) {
5240
+ <span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
5241
+ code: z.ZodIssueCode.custom,
5242
+ message: `Invalid mutation path "${pathKey}" in variableOverride for "${variableKey}".`,
5243
+ path: [...valuePath, pathKey],
5244
+ });
5245
+ <span class="cstat-no" title="statement not covered" > continue;</span>
5246
+ }
5247
+ const atPathSchema = resolveSchemaAtPath(
5248
+ variableSchema as Schema,
5249
+ pathSegments,
5250
+ schemasByKey,
5251
+ );
5252
+ if (!atPathSchema) {
5253
+ const effectiveSchema = resolveVariableSchema(
5254
+ variableSchema as Parameters&lt;typeof resolveVariableSchema&gt;[0],
5255
+ schemasByKey,
5256
+ );
5257
+ const isFlatObject =
5258
+ effectiveSchema?.type === "object" &amp;&amp;
5259
+ (!effectiveSchema.properties ||
5260
+ <span class="branch-2 cbranch-no" title="branch not covered" > Object.keys(effectiveSchema.properties).length === 0)</span>;
5261
+ if (isFlatObject) {
5262
+ continue;
5263
+ }
5264
+ <span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
5265
+ code: z.ZodIssueCode.custom,
5266
+ message: `Path "${pathKey}" is invalid for variable "${variableKey}" (not in schema).`,
5267
+ path: [...valuePath, pathKey],
5268
+ });
5269
+ <span class="cstat-no" title="statement not covered" > continue;</span>
5270
+ }
5271
+ superRefineVariableValue(
5272
+ projectConfig,
5273
+ atPathSchema,
5274
+ pathMap[pathKey],
5275
+ [...valuePath, pathKey],
5276
+ ctx,
5277
+ pathKey,
5278
+ schemasByKey,
5279
+ );
5280
+ }
5281
+ } else {
4816
5282
  superRefineVariableValue(
4817
5283
  projectConfig,
4818
- variableSchema,
4819
- override.value,
4820
- [
4821
- "variations",
4822
- variationN,
4823
- "variableOverrides",
4824
- variableKey,
4825
- overrideN,
4826
- "value",
4827
- ],
5284
+ variableSchema as Parameters&lt;typeof superRefineVariableValue&gt;[1],
5285
+ overrideValue,
5286
+ valuePath,
4828
5287
  ctx,
4829
5288
  variableKey,
4830
5289
  schemasByKey,
4831
5290
  );
4832
- });
4833
- }
5291
+ }
5292
+ });
4834
5293
  }
4835
5294
  }
4836
5295
  });
@@ -4909,7 +5368,7 @@ export function getFeatureZodSchema(
4909
5368
  <div class='footer quiet pad2 space-top1 center small'>
4910
5369
  Code coverage generated by
4911
5370
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
4912
- at 2026-02-23T20:40:14.947Z
5371
+ at 2026-02-25T22:03:15.189Z
4913
5372
  </div>
4914
5373
  <script src="../prettify.js"></script>
4915
5374
  <script>