@featurevisor/core 2.20.0 → 2.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/coverage/clover.xml +1286 -515
- package/coverage/coverage-final.json +17 -16
- package/coverage/lcov-report/builder/allocator.ts.html +1 -1
- package/coverage/lcov-report/builder/buildDatafile.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
- package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
- package/coverage/lcov-report/builder/convertToV1.ts.html +1 -1
- package/coverage/lcov-report/builder/getFeatureRanges.ts.html +1 -1
- package/coverage/lcov-report/builder/hashes.ts.html +1 -1
- package/coverage/lcov-report/builder/index.html +1 -1
- package/coverage/lcov-report/builder/mutateVariables.ts.html +1 -1
- package/coverage/lcov-report/builder/mutator.ts.html +1 -1
- package/coverage/lcov-report/builder/revision.ts.html +1 -1
- package/coverage/lcov-report/builder/traffic.ts.html +1 -1
- package/coverage/lcov-report/config/index.html +1 -1
- package/coverage/lcov-report/config/index.ts.html +1 -1
- package/coverage/lcov-report/config/projectConfig.ts.html +42 -42
- package/coverage/lcov-report/datasource/adapter.ts.html +2 -2
- package/coverage/lcov-report/datasource/datasource.ts.html +43 -43
- package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +48 -48
- package/coverage/lcov-report/datasource/index.html +19 -19
- package/coverage/lcov-report/datasource/index.ts.html +4 -4
- package/coverage/lcov-report/generate-code/index.html +116 -0
- package/coverage/lcov-report/generate-code/typescript.ts.html +3004 -0
- package/coverage/lcov-report/index.html +44 -29
- package/coverage/lcov-report/linter/attributeSchema.ts.html +1815 -30
- package/coverage/lcov-report/linter/checkCircularDependency.ts.html +1 -1
- package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +1 -1
- package/coverage/lcov-report/linter/conditionSchema.ts.html +1606 -157
- package/coverage/lcov-report/linter/featureSchema.ts.html +56 -56
- package/coverage/lcov-report/linter/groupSchema.ts.html +1 -1
- package/coverage/lcov-report/linter/index.html +39 -39
- package/coverage/lcov-report/linter/lintProject.ts.html +189 -78
- package/coverage/lcov-report/linter/mutationNotation.ts.html +1 -1
- package/coverage/lcov-report/linter/printError.ts.html +1 -1
- package/coverage/lcov-report/linter/schema.ts.html +59 -59
- package/coverage/lcov-report/linter/segmentSchema.ts.html +3 -3
- package/coverage/lcov-report/linter/testSchema.ts.html +6 -6
- package/coverage/lcov-report/list/index.html +1 -1
- package/coverage/lcov-report/list/matrix.ts.html +1 -1
- package/coverage/lcov-report/parsers/index.html +1 -1
- package/coverage/lcov-report/parsers/index.ts.html +4 -4
- package/coverage/lcov-report/parsers/json.ts.html +2 -2
- package/coverage/lcov-report/parsers/yml.ts.html +6 -6
- package/coverage/lcov-report/tester/cliFormat.ts.html +1 -1
- package/coverage/lcov-report/tester/helpers.ts.html +1 -1
- package/coverage/lcov-report/tester/index.html +1 -1
- package/coverage/lcov-report/utils/extractKeys.ts.html +1 -1
- package/coverage/lcov-report/utils/git.ts.html +3 -3
- package/coverage/lcov-report/utils/index.html +1 -1
- package/coverage/lcov-report/utils/index.ts.html +1 -1
- package/coverage/lcov-report/utils/pretty.ts.html +1 -1
- package/coverage/lcov.info +2624 -926
- package/lib/generate-code/typescript.js +57 -29
- package/lib/generate-code/typescript.js.map +1 -1
- package/lib/generate-code/typescript.spec.d.ts +1 -0
- package/lib/generate-code/typescript.spec.js +78 -0
- package/lib/generate-code/typescript.spec.js.map +1 -0
- package/lib/linter/attributeSchema.d.ts +352 -20
- package/lib/linter/attributeSchema.js +426 -16
- package/lib/linter/attributeSchema.js.map +1 -1
- package/lib/linter/attributeSchema.spec.d.ts +1 -0
- package/lib/linter/attributeSchema.spec.js +266 -0
- package/lib/linter/attributeSchema.spec.js.map +1 -0
- package/lib/linter/conditionSchema.d.ts +2 -1
- package/lib/linter/conditionSchema.js +370 -100
- package/lib/linter/conditionSchema.js.map +1 -1
- package/lib/linter/conditionSchema.spec.js +200 -153
- package/lib/linter/conditionSchema.spec.js.map +1 -1
- package/lib/linter/featureSchema.spec.js +114 -3
- package/lib/linter/featureSchema.spec.js.map +1 -1
- package/lib/linter/lintProject.js +45 -14
- package/lib/linter/lintProject.js.map +1 -1
- package/lib/linter/segmentSchema.spec.js +71 -1
- package/lib/linter/segmentSchema.spec.js.map +1 -1
- package/package.json +5 -5
- package/src/generate-code/typescript.spec.ts +108 -0
- package/src/generate-code/typescript.ts +80 -34
- package/src/linter/attributeSchema.spec.ts +342 -0
- package/src/linter/attributeSchema.ts +613 -18
- package/src/linter/conditionSchema.spec.ts +231 -189
- package/src/linter/conditionSchema.ts +582 -99
- package/src/linter/featureSchema.spec.ts +129 -4
- package/src/linter/lintProject.ts +55 -18
- package/src/linter/segmentSchema.spec.ts +82 -1
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">86.63% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>162/187</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">86.34% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>177/205</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>38/38</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">88.82% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>159/179</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -93,17 +93,748 @@
|
|
|
93
93
|
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
94
|
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
95
|
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
692
|
+
<span class="cline-any cline-yes">2x</span>
|
|
693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
694
|
+
<span class="cline-any cline-yes">2x</span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-yes">2x</span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-yes">13x</span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-yes">192x</span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
732
|
+
<span class="cline-any cline-yes">70x</span>
|
|
733
|
+
<span class="cline-any cline-yes">2x</span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
736
|
+
<span class="cline-any cline-yes">68x</span>
|
|
737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
738
|
+
<span class="cline-any cline-yes">63x</span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-no"> </span>
|
|
745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-yes">5x</span>
|
|
749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-yes">192x</span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-yes">192x</span>
|
|
762
|
+
<span class="cline-any cline-yes">31x</span>
|
|
763
|
+
<span class="cline-any cline-yes">70x</span>
|
|
764
|
+
<span class="cline-any cline-yes">70x</span>
|
|
765
|
+
<span class="cline-any cline-yes">4x</span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-neutral"> </span>
|
|
97
773
|
<span class="cline-any cline-neutral"> </span>
|
|
774
|
+
<span class="cline-any cline-yes">192x</span>
|
|
775
|
+
<span class="cline-any cline-yes">11x</span>
|
|
776
|
+
<span class="cline-any cline-neutral"> </span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-yes">192x</span>
|
|
783
|
+
<span class="cline-any cline-yes">21x</span>
|
|
784
|
+
<span class="cline-any cline-yes">29x</span>
|
|
785
|
+
<span class="cline-any cline-neutral"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-neutral"> </span>
|
|
789
|
+
<span class="cline-any cline-neutral"> </span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-yes">192x</span>
|
|
793
|
+
<span class="cline-any cline-yes">2x</span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-yes">192x</span>
|
|
801
|
+
<span class="cline-any cline-yes">11x</span>
|
|
802
|
+
<span class="cline-any cline-yes">22x</span>
|
|
803
|
+
<span class="cline-any cline-yes">22x</span>
|
|
804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
818
|
+
<span class="cline-any cline-yes">192x</span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-yes">192x</span>
|
|
821
|
+
<span class="cline-any cline-yes">192x</span>
|
|
822
|
+
<span class="cline-any cline-yes">192x</span>
|
|
823
|
+
<span class="cline-any cline-yes">192x</span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
825
|
+
<span class="cline-any cline-yes">192x</span>
|
|
98
826
|
<span class="cline-any cline-yes">1x</span>
|
|
99
|
-
<span class="cline-any cline-yes">6x</span>
|
|
100
827
|
<span class="cline-any cline-neutral"> </span>
|
|
101
828
|
<span class="cline-any cline-neutral"> </span>
|
|
102
829
|
<span class="cline-any cline-neutral"> </span>
|
|
103
830
|
<span class="cline-any cline-neutral"> </span>
|
|
104
831
|
<span class="cline-any cline-neutral"> </span>
|
|
105
832
|
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-yes">192x</span>
|
|
834
|
+
<span class="cline-any cline-yes">5x</span>
|
|
835
|
+
<span class="cline-any cline-yes">5x</span>
|
|
106
836
|
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-yes">2x</span>
|
|
107
838
|
<span class="cline-any cline-neutral"> </span>
|
|
108
839
|
<span class="cline-any cline-neutral"> </span>
|
|
109
840
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -111,45 +842,1099 @@
|
|
|
111
842
|
<span class="cline-any cline-neutral"> </span>
|
|
112
843
|
<span class="cline-any cline-neutral"> </span>
|
|
113
844
|
<span class="cline-any cline-neutral"> </span>
|
|
845
|
+
<span class="cline-any cline-yes">192x</span>
|
|
846
|
+
<span class="cline-any cline-yes">62x</span>
|
|
847
|
+
<span class="cline-any cline-yes">62x</span>
|
|
848
|
+
<span class="cline-any cline-yes">62x</span>
|
|
849
|
+
<span class="cline-any cline-neutral"> </span>
|
|
850
|
+
<span class="cline-any cline-yes">62x</span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-neutral"> </span>
|
|
858
|
+
<span class="cline-any cline-yes">62x</span>
|
|
859
|
+
<span class="cline-any cline-neutral"> </span>
|
|
860
|
+
<span class="cline-any cline-neutral"> </span>
|
|
861
|
+
<span class="cline-any cline-yes">192x</span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-neutral"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-neutral"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-neutral"> </span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-neutral"> </span>
|
|
876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-neutral"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-neutral"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-yes">192x</span>
|
|
887
|
+
<span class="cline-any cline-yes">28x</span>
|
|
888
|
+
<span class="cline-any cline-yes">65x</span>
|
|
889
|
+
<span class="cline-any cline-yes">62x</span>
|
|
890
|
+
<span class="cline-any cline-yes">62x</span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
114
893
|
<span class="cline-any cline-neutral"> </span>
|
|
115
|
-
<span class="cline-any cline-yes">6x</span>
|
|
116
894
|
<span class="cline-any cline-neutral"> </span>
|
|
117
895
|
<span class="cline-any cline-neutral"> </span>
|
|
118
896
|
<span class="cline-any cline-neutral"> </span>
|
|
897
|
+
<span class="cline-any cline-yes">62x</span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
119
899
|
<span class="cline-any cline-neutral"> </span>
|
|
120
900
|
<span class="cline-any cline-neutral"> </span>
|
|
121
901
|
<span class="cline-any cline-neutral"> </span>
|
|
122
902
|
<span class="cline-any cline-neutral"> </span>
|
|
123
903
|
<span class="cline-any cline-neutral"> </span>
|
|
904
|
+
<span class="cline-any cline-yes">62x</span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-neutral"> </span>
|
|
907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-neutral"> </span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
914
|
+
<span class="cline-any cline-yes">192x</span>
|
|
915
|
+
<span class="cline-any cline-yes">11x</span>
|
|
916
|
+
<span class="cline-any cline-neutral"> </span>
|
|
917
|
+
<span class="cline-any cline-neutral"> </span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
922
|
+
<span class="cline-any cline-yes">192x</span>
|
|
923
|
+
<span class="cline-any cline-yes">21x</span>
|
|
924
|
+
<span class="cline-any cline-yes">29x</span>
|
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-yes">192x</span>
|
|
933
|
+
<span class="cline-any cline-yes">2x</span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-neutral"> </span>
|
|
936
|
+
<span class="cline-any cline-neutral"> </span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
940
|
+
<span class="cline-any cline-yes">192x</span>
|
|
941
|
+
<span class="cline-any cline-yes">11x</span>
|
|
942
|
+
<span class="cline-any cline-yes">22x</span>
|
|
943
|
+
<span class="cline-any cline-yes">22x</span>
|
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
953
|
+
<span class="cline-any cline-neutral"> </span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-yes">192x</span>
|
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
960
|
+
<span class="cline-any cline-yes">192x</span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
965
|
+
<span class="cline-any cline-neutral"> </span>
|
|
966
|
+
<span class="cline-any cline-yes">5x</span>
|
|
967
|
+
<span class="cline-any cline-yes">5x</span>
|
|
124
968
|
<span class="cline-any cline-yes">6x</span>
|
|
969
|
+
<span class="cline-any cline-yes">1x</span>
|
|
970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
971
|
+
<span class="cline-any cline-neutral"> </span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-yes">192x</span>
|
|
979
|
+
<span class="cline-any cline-yes">21x</span>
|
|
980
|
+
<span class="cline-any cline-yes">29x</span>
|
|
981
|
+
<span class="cline-any cline-neutral"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-yes">192x</span>
|
|
989
|
+
<span class="cline-any cline-yes">2x</span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
996
|
+
<span class="cline-any cline-yes">192x</span>
|
|
997
|
+
<span class="cline-any cline-yes">11x</span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1004
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1005
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1006
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1007
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1011
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1022
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1024
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-yes">35x</span>
|
|
1030
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-yes">31x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1062
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1063
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1064
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1066
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1068
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1069
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1070
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1077
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1078
|
+
<span class="cline-any cline-yes">29x</span>
|
|
125
1079
|
<span class="cline-any cline-neutral"> </span>
|
|
126
|
-
<span class="cline-any cline-neutral"> </span
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1086
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1087
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1094
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1095
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1096
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1097
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1112
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1115
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1117
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1118
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1126
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1127
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1135
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1136
|
+
<span class="cline-any cline-yes">5x</span>
|
|
1137
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1147
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1148
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1155
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1156
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1157
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1166
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-yes">192x</span>
|
|
1174
|
+
<span class="cline-any cline-yes">11x</span>
|
|
1175
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1176
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1187
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1188
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1213
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1220
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1223
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1229
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1230
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1231
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1237
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1238
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1239
|
+
<span class="cline-any cline-yes">53x</span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1242
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1243
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1246
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1247
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1248
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1261
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1262
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1266
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1267
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1268
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1275
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1277
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1280
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1285
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1290
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1292
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1293
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1294
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1295
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1296
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1301
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1302
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1303
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1304
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1307
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1308
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1310
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1311
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1312
|
+
<span class="cline-any cline-yes">75x</span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-yes">29x</span>
|
|
1315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1316
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { Attribute, AttributeProperty } from "@featurevisor/types";
|
|
1317
|
+
import { z } from "zod";
|
|
1318
|
+
|
|
1319
|
+
import { valueZodSchema, refineArrayItems, refineMinimumMaximum } from "./schema";
|
|
1320
|
+
|
|
1321
|
+
const attributeTypeEnum = z.enum([
|
|
1322
|
+
"boolean",
|
|
1323
|
+
"string",
|
|
1324
|
+
"integer",
|
|
1325
|
+
"double",
|
|
1326
|
+
"date",
|
|
1327
|
+
"semver",
|
|
1328
|
+
"object",
|
|
1329
|
+
"array",
|
|
1330
|
+
]);
|
|
1331
|
+
|
|
1332
|
+
type AttributeSchemaLike = {
|
|
1333
|
+
type?: Attribute["type"];
|
|
1334
|
+
enum?: unknown[];
|
|
1335
|
+
const?: unknown;
|
|
1336
|
+
minimum?: number;
|
|
1337
|
+
maximum?: number;
|
|
1338
|
+
minLength?: number;
|
|
1339
|
+
maxLength?: number;
|
|
1340
|
+
pattern?: string;
|
|
1341
|
+
items?: unknown;
|
|
1342
|
+
properties?: Record<string, unknown>;
|
|
1343
|
+
additionalProperties?: unknown;
|
|
1344
|
+
required?: string[];
|
|
1345
|
+
oneOf?: unknown[];
|
|
1346
|
+
};
|
|
1347
|
+
|
|
1348
|
+
function isArrayOfStrings(value: unknown): boolean {
|
|
1349
|
+
return Array.isArray(value) && value.every((entry) => typeof entry === "string");
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
function isStringLikeAttributeType(type?: Attribute["type"]): boolean {
|
|
1353
|
+
return type === "string" || type === "date" || type === "semver";
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
function valueMatchesAttributeType(value: unknown, type: Attribute["type"]): boolean {
|
|
1357
|
+
if (type === "date" || type === "semver") {
|
|
1358
|
+
return typeof value === "string";
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
switch (type) {
|
|
1362
|
+
case "string":
|
|
1363
|
+
return typeof value === "string";
|
|
1364
|
+
<span class="branch-1 cbranch-no" title="branch not covered" > case "boolean":</span>
|
|
1365
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "boolean";</span>
|
|
1366
|
+
<span class="branch-2 cbranch-no" title="branch not covered" > case "integer":</span>
|
|
1367
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "number" && Number.isInteger(value);</span>
|
|
1368
|
+
<span class="branch-3 cbranch-no" title="branch not covered" > case "double":</span>
|
|
1369
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "number";</span>
|
|
1370
|
+
<span class="branch-4 cbranch-no" title="branch not covered" > case "object":</span>
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" > return typeof value === "object" && value !== null && !Array.isArray(value);</span>
|
|
1372
|
+
case "array":
|
|
1373
|
+
return isArrayOfStrings(value);
|
|
1374
|
+
<span class="branch-6 cbranch-no" title="branch not covered" > default:</span>
|
|
1375
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
function refineAttributeEnumMatchesType(
|
|
1380
|
+
schema: AttributeSchemaLike,
|
|
1381
|
+
pathPrefix: (string | number)[],
|
|
1382
|
+
ctx: z.RefinementCtx,
|
|
1383
|
+
): void {
|
|
1384
|
+
<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>
|
|
1385
|
+
|
|
1386
|
+
if (schema.type && Array.isArray(schema.enum) && schema.enum.length > 0) {
|
|
1387
|
+
for (let i = 0; i < schema.enum.length; i++) {
|
|
1388
|
+
const value = schema.enum[i];
|
|
1389
|
+
if (!valueMatchesAttributeType(value, schema.type)) {
|
|
1390
|
+
ctx.addIssue({
|
|
1391
|
+
code: z.ZodIssueCode.custom,
|
|
1392
|
+
message: `Enum value at index ${i} (${JSON.stringify(value)}) does not match type "${schema.type}". All enum values must be of the same type as \`type\`.`,
|
|
1393
|
+
path: [...pathPrefix, "enum", i],
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1399
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1400
|
+
refineAttributeEnumMatchesType(
|
|
1401
|
+
schema.items as AttributeSchemaLike,
|
|
1402
|
+
[...pathPrefix, "items"],
|
|
1403
|
+
ctx,
|
|
1404
|
+
);
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
1408
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1409
|
+
refineAttributeEnumMatchesType(
|
|
1410
|
+
schema.properties[key] as AttributeSchemaLike,
|
|
1411
|
+
[...pathPrefix, "properties", key],
|
|
1412
|
+
ctx,
|
|
1413
|
+
);
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
1418
|
+
refineAttributeEnumMatchesType(
|
|
1419
|
+
schema.additionalProperties as AttributeSchemaLike,
|
|
1420
|
+
[...pathPrefix, "additionalProperties"],
|
|
1421
|
+
ctx,
|
|
1422
|
+
);
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
1426
|
+
schema.oneOf.forEach((branch, index) => {
|
|
1427
|
+
if (branch && typeof branch === "object") {
|
|
1428
|
+
refineAttributeEnumMatchesType(
|
|
1429
|
+
branch as AttributeSchemaLike,
|
|
1430
|
+
[...pathPrefix, "oneOf", index],
|
|
1431
|
+
ctx,
|
|
1432
|
+
);
|
|
1433
|
+
}
|
|
1434
|
+
});
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
function refineAttributeStringLengthPattern(
|
|
1439
|
+
schema: AttributeSchemaLike,
|
|
1440
|
+
pathPrefix: (string | number)[],
|
|
1441
|
+
ctx: z.RefinementCtx,
|
|
1442
|
+
): void {
|
|
1443
|
+
<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>
|
|
1444
|
+
|
|
1445
|
+
const minLength = schema.minLength;
|
|
1446
|
+
const maxLength = schema.maxLength;
|
|
1447
|
+
const pattern = schema.pattern;
|
|
1448
|
+
const isString = isStringLikeAttributeType(schema.type);
|
|
1449
|
+
|
|
1450
|
+
if (isString && minLength !== undefined && maxLength !== undefined && minLength > maxLength) {
|
|
1451
|
+
ctx.addIssue({
|
|
1452
|
+
code: z.ZodIssueCode.custom,
|
|
1453
|
+
message: `When \`type\` is "${schema.type}", \`minLength\` (${minLength}) must be less than or equal to \`maxLength\` (${maxLength}).`,
|
|
1454
|
+
path: [...pathPrefix, "minLength"],
|
|
1455
|
+
});
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
if (isString && pattern !== undefined) {
|
|
1459
|
+
try {
|
|
1460
|
+
new RegExp(pattern);
|
|
1461
|
+
} catch {
|
|
1462
|
+
ctx.addIssue({
|
|
1463
|
+
code: z.ZodIssueCode.custom,
|
|
1464
|
+
message: `\`pattern\` must be a valid ECMA-262 regular expression; "${pattern}" is invalid.`,
|
|
1465
|
+
path: [...pathPrefix, "pattern"],
|
|
1466
|
+
});
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
const testString = (value: string) => {
|
|
1471
|
+
const minOk = minLength === undefined || <span class="branch-1 cbranch-no" title="branch not covered" >value.length >= minLength;</span>
|
|
1472
|
+
const maxOk = maxLength === undefined || <span class="branch-1 cbranch-no" title="branch not covered" >value.length <= maxLength;</span>
|
|
1473
|
+
let patternOk = true;
|
|
1474
|
+
|
|
1475
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (pattern !== undefined) {
|
|
1476
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1477
|
+
<span class="cstat-no" title="statement not covered" > patternOk = new RegExp(pattern).test(value);</span>
|
|
1478
|
+
} catch {
|
|
1479
|
+
<span class="cstat-no" title="statement not covered" > patternOk = true;</span>
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
return { minOk, maxOk, patternOk };
|
|
1484
|
+
};
|
|
1485
|
+
|
|
1486
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (isString && typeof schema.const === "string") {
|
|
1487
|
+
const result = <span class="cstat-no" title="statement not covered" >testString(schema.const);</span>
|
|
1488
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!result.minOk) {</span>
|
|
1489
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1490
|
+
code: z.ZodIssueCode.custom,
|
|
1491
|
+
message: `\`const\` value length (${schema.const.length}) is less than \`minLength\` (${minLength}).`,
|
|
1492
|
+
path: [...pathPrefix, "const"],
|
|
1493
|
+
});
|
|
1494
|
+
}
|
|
1495
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!result.maxOk) {</span>
|
|
1496
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1497
|
+
code: z.ZodIssueCode.custom,
|
|
1498
|
+
message: `\`const\` value length (${schema.const.length}) is greater than \`maxLength\` (${maxLength}).`,
|
|
1499
|
+
path: [...pathPrefix, "const"],
|
|
1500
|
+
});
|
|
1501
|
+
}
|
|
1502
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!result.patternOk) {</span>
|
|
1503
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1504
|
+
code: z.ZodIssueCode.custom,
|
|
1505
|
+
message: `\`const\` value does not match \`pattern\`.`,
|
|
1506
|
+
path: [...pathPrefix, "const"],
|
|
1507
|
+
});
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
if (isString && Array.isArray(schema.enum)) {
|
|
1512
|
+
schema.enum.forEach((value, index) => {
|
|
1513
|
+
if (typeof value !== "string") return;
|
|
1514
|
+
const result = testString(value);
|
|
1515
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!result.minOk) {
|
|
1516
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1517
|
+
code: z.ZodIssueCode.custom,
|
|
1518
|
+
message: `Enum value at index ${index} length (${value.length}) is less than \`minLength\` (${minLength}).`,
|
|
1519
|
+
path: [...pathPrefix, "enum", index],
|
|
1520
|
+
});
|
|
1521
|
+
}
|
|
1522
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!result.maxOk) {
|
|
1523
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1524
|
+
code: z.ZodIssueCode.custom,
|
|
1525
|
+
message: `Enum value at index ${index} length (${value.length}) is greater than \`maxLength\` (${maxLength}).`,
|
|
1526
|
+
path: [...pathPrefix, "enum", index],
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!result.patternOk) {
|
|
1530
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1531
|
+
code: z.ZodIssueCode.custom,
|
|
1532
|
+
message: `Enum value at index ${index} does not match \`pattern\`.`,
|
|
1533
|
+
path: [...pathPrefix, "enum", index],
|
|
1534
|
+
});
|
|
1535
|
+
}
|
|
1536
|
+
});
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1540
|
+
refineAttributeStringLengthPattern(
|
|
1541
|
+
schema.items as AttributeSchemaLike,
|
|
1542
|
+
[...pathPrefix, "items"],
|
|
1543
|
+
ctx,
|
|
1544
|
+
);
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
1548
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1549
|
+
refineAttributeStringLengthPattern(
|
|
1550
|
+
schema.properties[key] as AttributeSchemaLike,
|
|
1551
|
+
[...pathPrefix, "properties", key],
|
|
1552
|
+
ctx,
|
|
1553
|
+
);
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
1558
|
+
refineAttributeStringLengthPattern(
|
|
1559
|
+
schema.additionalProperties as AttributeSchemaLike,
|
|
1560
|
+
[...pathPrefix, "additionalProperties"],
|
|
1561
|
+
ctx,
|
|
1562
|
+
);
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
1566
|
+
schema.oneOf.forEach((branch, index) => {
|
|
1567
|
+
if (branch && typeof branch === "object") {
|
|
1568
|
+
refineAttributeStringLengthPattern(
|
|
1569
|
+
branch as AttributeSchemaLike,
|
|
1570
|
+
[...pathPrefix, "oneOf", index],
|
|
1571
|
+
ctx,
|
|
1572
|
+
);
|
|
1573
|
+
}
|
|
1574
|
+
});
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1578
|
+
function refineRequiredKeysInAttributeSchema(
|
|
1579
|
+
schema: AttributeSchemaLike,
|
|
1580
|
+
pathPrefix: (string | number)[],
|
|
1581
|
+
ctx: z.RefinementCtx,
|
|
1582
|
+
): void {
|
|
1583
|
+
<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>
|
|
1584
|
+
|
|
1585
|
+
if (
|
|
1586
|
+
schema.type === "object" &&
|
|
1587
|
+
Array.isArray(schema.required) &&
|
|
1588
|
+
schema.properties &&
|
|
1589
|
+
typeof schema.properties === "object"
|
|
1590
|
+
) {
|
|
1591
|
+
const allowedKeys = Object.keys(schema.properties);
|
|
1592
|
+
schema.required.forEach((key, index) => {
|
|
1593
|
+
if (!allowedKeys.includes(key)) {
|
|
1594
|
+
ctx.addIssue({
|
|
1595
|
+
code: z.ZodIssueCode.custom,
|
|
1596
|
+
message: `Unknown required field "${key}". \`required\` must only contain property names defined in \`properties\`. Allowed: ${allowedKeys.length ? allowedKeys.join(", ") : <span class="branch-1 cbranch-no" title="branch not covered" >"(none)"}</span>.`,
|
|
1597
|
+
path: [...pathPrefix, "required", index],
|
|
1598
|
+
});
|
|
1599
|
+
}
|
|
1600
|
+
});
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
1604
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1605
|
+
refineRequiredKeysInAttributeSchema(
|
|
1606
|
+
schema.properties[key] as AttributeSchemaLike,
|
|
1607
|
+
[...pathPrefix, "properties", key],
|
|
1608
|
+
ctx,
|
|
1609
|
+
);
|
|
1610
|
+
}
|
|
1611
|
+
}
|
|
1612
|
+
|
|
1613
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
1614
|
+
refineRequiredKeysInAttributeSchema(
|
|
1615
|
+
schema.additionalProperties as AttributeSchemaLike,
|
|
1616
|
+
[...pathPrefix, "additionalProperties"],
|
|
1617
|
+
ctx,
|
|
1618
|
+
);
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1622
|
+
refineRequiredKeysInAttributeSchema(
|
|
1623
|
+
schema.items as AttributeSchemaLike,
|
|
1624
|
+
[...pathPrefix, "items"],
|
|
1625
|
+
ctx,
|
|
1626
|
+
);
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
1630
|
+
schema.oneOf.forEach((branch, index) => {
|
|
1631
|
+
if (branch && typeof branch === "object") {
|
|
1632
|
+
refineRequiredKeysInAttributeSchema(
|
|
1633
|
+
branch as AttributeSchemaLike,
|
|
1634
|
+
[...pathPrefix, "oneOf", index],
|
|
1635
|
+
ctx,
|
|
1636
|
+
);
|
|
1637
|
+
}
|
|
1638
|
+
});
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
function refineNoNestedObjectProperties(
|
|
1643
|
+
schema: AttributeSchemaLike,
|
|
1644
|
+
pathPrefix: (string | number)[],
|
|
1645
|
+
ctx: z.RefinementCtx,
|
|
1646
|
+
): void {
|
|
1647
|
+
<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>
|
|
1648
|
+
|
|
1649
|
+
const schemaAllowsObject = (candidate: AttributeSchemaLike | undefined): boolean => {
|
|
1650
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!candidate || typeof candidate !== "object") {
|
|
1651
|
+
<span class="cstat-no" title="statement not covered" > return false;</span>
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
if (candidate.type === "object") {
|
|
1655
|
+
return true;
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
if (candidate.oneOf && Array.isArray(candidate.oneOf)) {
|
|
1659
|
+
return candidate.oneOf.some((branch) =>
|
|
1660
|
+
schemaAllowsObject(branch as AttributeSchemaLike | undefined),
|
|
1661
|
+
);
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
return false;
|
|
1665
|
+
};
|
|
1666
|
+
|
|
1667
|
+
if (schema.type === "object" && schema.properties && typeof schema.properties === "object") {
|
|
1668
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1669
|
+
const property = schema.properties[key] as AttributeSchemaLike;
|
|
1670
|
+
if (schemaAllowsObject(property)) {
|
|
1671
|
+
ctx.addIssue({
|
|
1672
|
+
code: z.ZodIssueCode.custom,
|
|
1673
|
+
message: `Object attributes must stay flat. Property "${key}" cannot be of type "object".`,
|
|
1674
|
+
path: [...pathPrefix, "properties", key, "type"],
|
|
1675
|
+
});
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
if (
|
|
1681
|
+
schema.type === "object" &&
|
|
1682
|
+
schema.additionalProperties &&
|
|
1683
|
+
schemaAllowsObject(schema.additionalProperties as AttributeSchemaLike)
|
|
1684
|
+
) {
|
|
1685
|
+
ctx.addIssue({
|
|
1686
|
+
code: z.ZodIssueCode.custom,
|
|
1687
|
+
message:
|
|
1688
|
+
'Object attributes must stay flat. `additionalProperties` cannot allow values of type "object".',
|
|
1689
|
+
path: [...pathPrefix, "additionalProperties", "type"],
|
|
1690
|
+
});
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1694
|
+
refineNoNestedObjectProperties(
|
|
1695
|
+
schema.items as AttributeSchemaLike,
|
|
1696
|
+
[...pathPrefix, "items"],
|
|
1697
|
+
ctx,
|
|
1698
|
+
);
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
1702
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1703
|
+
refineNoNestedObjectProperties(
|
|
1704
|
+
schema.properties[key] as AttributeSchemaLike,
|
|
1705
|
+
[...pathPrefix, "properties", key],
|
|
1706
|
+
ctx,
|
|
1707
|
+
);
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
1712
|
+
refineNoNestedObjectProperties(
|
|
1713
|
+
schema.additionalProperties as AttributeSchemaLike,
|
|
1714
|
+
[...pathPrefix, "additionalProperties"],
|
|
1715
|
+
ctx,
|
|
1716
|
+
);
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
1720
|
+
schema.oneOf.forEach((branch, index) => {
|
|
1721
|
+
if (branch && typeof branch === "object") {
|
|
1722
|
+
refineNoNestedObjectProperties(
|
|
1723
|
+
branch as AttributeSchemaLike,
|
|
1724
|
+
[...pathPrefix, "oneOf", index],
|
|
1725
|
+
ctx,
|
|
1726
|
+
);
|
|
1727
|
+
}
|
|
1728
|
+
});
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
function refineArrayAttributesAreStringArrays(
|
|
1733
|
+
schema: AttributeSchemaLike,
|
|
1734
|
+
pathPrefix: (string | number)[],
|
|
1735
|
+
ctx: z.RefinementCtx,
|
|
1736
|
+
): void {
|
|
1737
|
+
<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>
|
|
1738
|
+
|
|
1739
|
+
if (schema.type === "array") {
|
|
1740
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1741
|
+
const itemSchema = schema.items as AttributeSchemaLike;
|
|
1742
|
+
if (itemSchema.type !== "string") {
|
|
1743
|
+
ctx.addIssue({
|
|
1744
|
+
code: z.ZodIssueCode.custom,
|
|
1745
|
+
message: `Attribute arrays must contain strings only. \`items.type\` must be "string".`,
|
|
1746
|
+
path: [...pathPrefix, "items", "type"],
|
|
1747
|
+
});
|
|
1748
|
+
}
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
if (schema.const !== undefined && !isArrayOfStrings(schema.const)) {
|
|
1752
|
+
ctx.addIssue({
|
|
1753
|
+
code: z.ZodIssueCode.custom,
|
|
1754
|
+
message: `Attribute arrays must contain strings only. \`const\` must be an array of strings.`,
|
|
1755
|
+
path: [...pathPrefix, "const"],
|
|
1756
|
+
});
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
if (Array.isArray(schema.enum)) {
|
|
1760
|
+
schema.enum.forEach((entry, index) => {
|
|
1761
|
+
if (!isArrayOfStrings(entry)) {
|
|
1762
|
+
ctx.addIssue({
|
|
1763
|
+
code: z.ZodIssueCode.custom,
|
|
1764
|
+
message: `Attribute arrays must contain strings only. Enum value at index ${index} must be an array of strings.`,
|
|
1765
|
+
path: [...pathPrefix, "enum", index],
|
|
1766
|
+
});
|
|
1767
|
+
}
|
|
1768
|
+
});
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
if (schema.items && typeof schema.items === "object") {
|
|
1773
|
+
refineArrayAttributesAreStringArrays(
|
|
1774
|
+
schema.items as AttributeSchemaLike,
|
|
1775
|
+
[...pathPrefix, "items"],
|
|
1776
|
+
ctx,
|
|
1777
|
+
);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
1781
|
+
for (const key of Object.keys(schema.properties)) {
|
|
1782
|
+
refineArrayAttributesAreStringArrays(
|
|
1783
|
+
schema.properties[key] as AttributeSchemaLike,
|
|
1784
|
+
[...pathPrefix, "properties", key],
|
|
1785
|
+
ctx,
|
|
1786
|
+
);
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
1791
|
+
refineArrayAttributesAreStringArrays(
|
|
1792
|
+
schema.additionalProperties as AttributeSchemaLike,
|
|
1793
|
+
[...pathPrefix, "additionalProperties"],
|
|
1794
|
+
ctx,
|
|
1795
|
+
);
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
1799
|
+
schema.oneOf.forEach((branch, index) => {
|
|
1800
|
+
if (branch && typeof branch === "object") {
|
|
1801
|
+
refineArrayAttributesAreStringArrays(
|
|
1802
|
+
branch as AttributeSchemaLike,
|
|
1803
|
+
[...pathPrefix, "oneOf", index],
|
|
1804
|
+
ctx,
|
|
1805
|
+
);
|
|
1806
|
+
}
|
|
1807
|
+
});
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
127
1810
|
|
|
128
1811
|
export function getAttributeZodSchema() {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
1812
|
+
const attributePropertySchema: z.ZodType<AttributeProperty> = z.lazy(() =>
|
|
1813
|
+
z
|
|
1814
|
+
.object({
|
|
1815
|
+
description: z.string().optional(),
|
|
1816
|
+
type: attributeTypeEnum.optional(),
|
|
1817
|
+
enum: z.array(valueZodSchema).optional(),
|
|
1818
|
+
const: valueZodSchema.optional(),
|
|
1819
|
+
minimum: z.number().optional(),
|
|
1820
|
+
maximum: z.number().optional(),
|
|
1821
|
+
minLength: z.number().optional(),
|
|
1822
|
+
maxLength: z.number().optional(),
|
|
1823
|
+
pattern: z.string().optional(),
|
|
1824
|
+
items: attributePropertySchema.optional(),
|
|
1825
|
+
minItems: z.number().optional(),
|
|
1826
|
+
maxItems: z.number().optional(),
|
|
1827
|
+
uniqueItems: z.boolean().optional(),
|
|
1828
|
+
required: z.array(z.string()).optional(),
|
|
1829
|
+
properties: z.record(z.string(), attributePropertySchema).optional(),
|
|
1830
|
+
additionalProperties: attributePropertySchema.optional(),
|
|
1831
|
+
schema: z.string().optional(),
|
|
1832
|
+
oneOf: z.array(attributePropertySchema).min(2).optional(),
|
|
1833
|
+
})
|
|
1834
|
+
.strict()
|
|
1835
|
+
.superRefine((data, ctx) => {
|
|
1836
|
+
const hasStructuredArrayDetails =
|
|
1837
|
+
data.items !== undefined ||
|
|
1838
|
+
data.minItems !== undefined ||
|
|
1839
|
+
data.maxItems !== undefined ||
|
|
1840
|
+
data.uniqueItems !== undefined ||
|
|
1841
|
+
data.oneOf !== undefined ||
|
|
1842
|
+
data.enum !== undefined ||
|
|
1843
|
+
data.const !== undefined;
|
|
1844
|
+
|
|
1845
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (data.type === "array" && hasStructuredArrayDetails && data.items === undefined) {
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > ctx.addIssue({</span>
|
|
1847
|
+
code: z.ZodIssueCode.custom,
|
|
1848
|
+
message:
|
|
1849
|
+
'When `type` is "array" and additional schema properties are provided, `items` is required.',
|
|
1850
|
+
path: ["items"],
|
|
1851
|
+
});
|
|
1852
|
+
}
|
|
1853
|
+
})
|
|
1854
|
+
.superRefine((data, ctx) => refineAttributeEnumMatchesType(data, [], ctx))
|
|
1855
|
+
.superRefine((data, ctx) =>
|
|
1856
|
+
refineMinimumMaximum(data as Parameters<typeof refineMinimumMaximum>[0], [], ctx),
|
|
1857
|
+
)
|
|
1858
|
+
.superRefine((data, ctx) => refineAttributeStringLengthPattern(data, [], ctx))
|
|
1859
|
+
.superRefine((data, ctx) =>
|
|
1860
|
+
refineArrayItems(data as Parameters<typeof refineArrayItems>[0], [], ctx),
|
|
1861
|
+
)
|
|
1862
|
+
.superRefine((data, ctx) => refineRequiredKeysInAttributeSchema(data, [], ctx))
|
|
1863
|
+
.superRefine((data, ctx) => refineNoNestedObjectProperties(data, [], ctx))
|
|
1864
|
+
.superRefine((data, ctx) => refineArrayAttributesAreStringArrays(data, [], ctx)),
|
|
1865
|
+
);
|
|
144
1866
|
|
|
145
1867
|
const attributeZodSchema = z
|
|
146
1868
|
.object({
|
|
147
1869
|
archived: z.boolean().optional(),
|
|
148
|
-
type:
|
|
1870
|
+
type: attributeTypeEnum.optional(),
|
|
149
1871
|
description: z.string(),
|
|
150
|
-
|
|
1872
|
+
enum: z.array(valueZodSchema).optional(),
|
|
1873
|
+
const: valueZodSchema.optional(),
|
|
1874
|
+
minimum: z.number().optional(),
|
|
1875
|
+
maximum: z.number().optional(),
|
|
1876
|
+
minLength: z.number().optional(),
|
|
1877
|
+
maxLength: z.number().optional(),
|
|
1878
|
+
pattern: z.string().optional(),
|
|
1879
|
+
items: attributePropertySchema.optional(),
|
|
1880
|
+
minItems: z.number().optional(),
|
|
1881
|
+
maxItems: z.number().optional(),
|
|
1882
|
+
uniqueItems: z.boolean().optional(),
|
|
1883
|
+
required: z.array(z.string()).optional(),
|
|
1884
|
+
properties: z.record(z.string(), attributePropertySchema).optional(),
|
|
1885
|
+
additionalProperties: attributePropertySchema.optional(),
|
|
1886
|
+
oneOf: z.array(attributePropertySchema).min(2).optional(),
|
|
1887
|
+
})
|
|
1888
|
+
.strict()
|
|
1889
|
+
.superRefine((data, ctx) => {
|
|
1890
|
+
const hasOneOf = data.oneOf !== undefined && data.oneOf.length > 0;
|
|
1891
|
+
|
|
1892
|
+
if (!data.type && !hasOneOf) {
|
|
1893
|
+
ctx.addIssue({
|
|
1894
|
+
code: z.ZodIssueCode.custom,
|
|
1895
|
+
message: "Attribute must have either `type` or `oneOf` at the top level.",
|
|
1896
|
+
path: ["type"],
|
|
1897
|
+
});
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
if (data.type && hasOneOf) {
|
|
1901
|
+
ctx.addIssue({
|
|
1902
|
+
code: z.ZodIssueCode.custom,
|
|
1903
|
+
message:
|
|
1904
|
+
"Attribute cannot have both `type` and `oneOf` at the top level. Use one or the other.",
|
|
1905
|
+
path: ["type"],
|
|
1906
|
+
});
|
|
1907
|
+
}
|
|
1908
|
+
|
|
1909
|
+
const hasStructuredArrayDetails =
|
|
1910
|
+
data.items !== undefined ||
|
|
1911
|
+
data.minItems !== undefined ||
|
|
1912
|
+
data.maxItems !== undefined ||
|
|
1913
|
+
data.uniqueItems !== undefined ||
|
|
1914
|
+
data.oneOf !== undefined ||
|
|
1915
|
+
data.enum !== undefined ||
|
|
1916
|
+
data.const !== undefined;
|
|
1917
|
+
|
|
1918
|
+
if (data.type === "array" && hasStructuredArrayDetails && data.items === undefined) {
|
|
1919
|
+
ctx.addIssue({
|
|
1920
|
+
code: z.ZodIssueCode.custom,
|
|
1921
|
+
message:
|
|
1922
|
+
'When `type` is "array" and additional schema properties are provided, `items` is required.',
|
|
1923
|
+
path: ["items"],
|
|
1924
|
+
});
|
|
1925
|
+
}
|
|
151
1926
|
})
|
|
152
|
-
.
|
|
1927
|
+
.superRefine((data, ctx) => refineAttributeEnumMatchesType(data, [], ctx))
|
|
1928
|
+
.superRefine((data, ctx) =>
|
|
1929
|
+
refineMinimumMaximum(data as Parameters<typeof refineMinimumMaximum>[0], [], ctx),
|
|
1930
|
+
)
|
|
1931
|
+
.superRefine((data, ctx) => refineAttributeStringLengthPattern(data, [], ctx))
|
|
1932
|
+
.superRefine((data, ctx) =>
|
|
1933
|
+
refineArrayItems(data as Parameters<typeof refineArrayItems>[0], [], ctx),
|
|
1934
|
+
)
|
|
1935
|
+
.superRefine((data, ctx) => refineRequiredKeysInAttributeSchema(data, [], ctx))
|
|
1936
|
+
.superRefine((data, ctx) => refineNoNestedObjectProperties(data, [], ctx))
|
|
1937
|
+
.superRefine((data, ctx) => refineArrayAttributesAreStringArrays(data, [], ctx));
|
|
153
1938
|
|
|
154
1939
|
return attributeZodSchema;
|
|
155
1940
|
}
|
|
@@ -160,7 +1945,7 @@ export function getAttributeZodSchema() {
|
|
|
160
1945
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
161
1946
|
Code coverage generated by
|
|
162
1947
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
163
|
-
at 2026-
|
|
1948
|
+
at 2026-04-08T20:42:08.360Z
|
|
164
1949
|
</div>
|
|
165
1950
|
<script src="../prettify.js"></script>
|
|
166
1951
|
<script>
|