@flourish/sdk 5.2.2 → 5.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/.c8rc +4 -0
  2. package/RELEASE_NOTES.md +12 -0
  3. package/common/embed/credit.js +26 -11
  4. package/common/embed/embedding.js +1 -1
  5. package/common/embed/localizations.d.ts +46 -2
  6. package/common/embed/localizations.js +48 -37
  7. package/common/package.json +2 -2
  8. package/common/tsconfig.sdk.tsbuildinfo +1 -1
  9. package/common/utils/data.d.ts +2 -2
  10. package/common/utils/data.js +2 -1
  11. package/common/utils/types.d.ts +1 -2
  12. package/coverage-sdk/lcov-report/base.css +224 -0
  13. package/coverage-sdk/lcov-report/block-navigation.js +87 -0
  14. package/coverage-sdk/lcov-report/common/utils/columns.js.html +646 -0
  15. package/coverage-sdk/lcov-report/common/utils/index.html +131 -0
  16. package/coverage-sdk/lcov-report/common/utils/state.js.html +559 -0
  17. package/coverage-sdk/lcov-report/favicon.png +0 -0
  18. package/coverage-sdk/lcov-report/index.html +146 -0
  19. package/coverage-sdk/lcov-report/lib/common.js.html +181 -0
  20. package/coverage-sdk/lcov-report/lib/index.html +161 -0
  21. package/coverage-sdk/lcov-report/lib/log.js.html +178 -0
  22. package/coverage-sdk/lcov-report/lib/sdk.js.html +2008 -0
  23. package/coverage-sdk/lcov-report/lib/validate_config.js.html +1459 -0
  24. package/coverage-sdk/lcov-report/prettify.css +1 -0
  25. package/coverage-sdk/lcov-report/prettify.js +2 -0
  26. package/coverage-sdk/lcov-report/sort-arrow-sprite.png +0 -0
  27. package/coverage-sdk/lcov-report/sorter.js +210 -0
  28. package/coverage-sdk/lcov-report/test/lib/index.html +131 -0
  29. package/coverage-sdk/lcov-report/test/lib/sdk.js.html +532 -0
  30. package/coverage-sdk/lcov-report/test/lib/validate_config.js.html +3307 -0
  31. package/coverage-sdk/lcov.info +3556 -0
  32. package/coverage-sdk/tmp/coverage-36833-1757890375186-0.json +1 -0
  33. package/coverage-sdk/tmp/coverage-36834-1757890374890-0.json +1 -0
  34. package/lib/cmd/publish.js +1 -0
  35. package/lib/validate_config.js +31 -0
  36. package/package.json +7 -6
  37. package/server/columns.js +150 -0
  38. package/server/comms_js.js +13 -0
  39. package/server/data.js +132 -0
  40. package/server/json.js +40 -0
  41. package/server/views/index.html +13 -29
  42. package/site/embedded.js +2 -2
  43. package/site/images/embed_flourish_in_canva.png +0 -0
  44. package/site/images/flourish_app_icon.png +0 -0
  45. package/site/images/icon-arrow-down.svg +3 -0
  46. package/site/images/icon-arrow-left.svg +3 -0
  47. package/site/images/icon-close.svg +3 -0
  48. package/site/images/icon-login.svg +4 -0
  49. package/site/images/icon-sso.svg +4 -0
  50. package/site/images/share_image.jpg +0 -0
  51. package/site/images/upsell-presenter.jpg +0 -0
  52. package/site/images/upsell-publisher.jpg +0 -0
  53. package/site/script.js +3 -3
  54. package/site/sdk.css +1 -1
  55. package/test/lib/validate_config.js +126 -0
@@ -0,0 +1,3307 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for test/lib/validate_config.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">test/lib</a> validate_config.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">95.99% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>1031/1074</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">99.58% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>240/241</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>7/7</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">95.99% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>1031/1074</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</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>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a>
1127
+ <a name='L1062'></a><a href='#L1062'>1062</a>
1128
+ <a name='L1063'></a><a href='#L1063'>1063</a>
1129
+ <a name='L1064'></a><a href='#L1064'>1064</a>
1130
+ <a name='L1065'></a><a href='#L1065'>1065</a>
1131
+ <a name='L1066'></a><a href='#L1066'>1066</a>
1132
+ <a name='L1067'></a><a href='#L1067'>1067</a>
1133
+ <a name='L1068'></a><a href='#L1068'>1068</a>
1134
+ <a name='L1069'></a><a href='#L1069'>1069</a>
1135
+ <a name='L1070'></a><a href='#L1070'>1070</a>
1136
+ <a name='L1071'></a><a href='#L1071'>1071</a>
1137
+ <a name='L1072'></a><a href='#L1072'>1072</a>
1138
+ <a name='L1073'></a><a href='#L1073'>1073</a>
1139
+ <a name='L1074'></a><a href='#L1074'>1074</a>
1140
+ <a name='L1075'></a><a href='#L1075'>1075</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
1141
+ <span class="cline-any cline-yes">1x</span>
1142
+ <span class="cline-any cline-yes">1x</span>
1143
+ <span class="cline-any cline-yes">1x</span>
1144
+ <span class="cline-any cline-yes">1x</span>
1145
+ <span class="cline-any cline-yes">1x</span>
1146
+ <span class="cline-any cline-yes">1x</span>
1147
+ <span class="cline-any cline-yes">1x</span>
1148
+ <span class="cline-any cline-yes">1x</span>
1149
+ <span class="cline-any cline-yes">1x</span>
1150
+ <span class="cline-any cline-yes">1x</span>
1151
+ <span class="cline-any cline-yes">1x</span>
1152
+ <span class="cline-any cline-yes">1x</span>
1153
+ <span class="cline-any cline-yes">1x</span>
1154
+ <span class="cline-any cline-yes">1x</span>
1155
+ <span class="cline-any cline-yes">1x</span>
1156
+ <span class="cline-any cline-yes">1x</span>
1157
+ <span class="cline-any cline-yes">1x</span>
1158
+ <span class="cline-any cline-yes">167x</span>
1159
+ <span class="cline-any cline-yes">167x</span>
1160
+ <span class="cline-any cline-yes">167x</span>
1161
+ <span class="cline-any cline-yes">167x</span>
1162
+ <span class="cline-any cline-yes">167x</span>
1163
+ <span class="cline-any cline-yes">167x</span>
1164
+ <span class="cline-any cline-yes">167x</span>
1165
+ <span class="cline-any cline-no">&nbsp;</span>
1166
+ <span class="cline-any cline-yes">167x</span>
1167
+ <span class="cline-any cline-yes">1x</span>
1168
+ <span class="cline-any cline-yes">1x</span>
1169
+ <span class="cline-any cline-yes">59x</span>
1170
+ <span class="cline-any cline-yes">59x</span>
1171
+ <span class="cline-any cline-yes">1x</span>
1172
+ <span class="cline-any cline-yes">1x</span>
1173
+ <span class="cline-any cline-yes">1x</span>
1174
+ <span class="cline-any cline-yes">1x</span>
1175
+ <span class="cline-any cline-yes">1x</span>
1176
+ <span class="cline-any cline-yes">1x</span>
1177
+ <span class="cline-any cline-yes">1x</span>
1178
+ <span class="cline-any cline-yes">1x</span>
1179
+ <span class="cline-any cline-yes">1x</span>
1180
+ <span class="cline-any cline-yes">1x</span>
1181
+ <span class="cline-any cline-yes">1x</span>
1182
+ <span class="cline-any cline-yes">1x</span>
1183
+ <span class="cline-any cline-yes">215x</span>
1184
+ <span class="cline-any cline-yes">215x</span>
1185
+ <span class="cline-any cline-yes">1x</span>
1186
+ <span class="cline-any cline-yes">1x</span>
1187
+ <span class="cline-any cline-yes">25x</span>
1188
+ <span class="cline-any cline-yes">25x</span>
1189
+ <span class="cline-any cline-yes">1x</span>
1190
+ <span class="cline-any cline-yes">1x</span>
1191
+ <span class="cline-any cline-yes">85x</span>
1192
+ <span class="cline-any cline-yes">85x</span>
1193
+ <span class="cline-any cline-yes">1x</span>
1194
+ <span class="cline-any cline-yes">1x</span>
1195
+ <span class="cline-any cline-yes">3x</span>
1196
+ <span class="cline-any cline-yes">3x</span>
1197
+ <span class="cline-any cline-yes">3x</span>
1198
+ <span class="cline-any cline-yes">3x</span>
1199
+ <span class="cline-any cline-yes">3x</span>
1200
+ <span class="cline-any cline-yes">3x</span>
1201
+ <span class="cline-any cline-yes">3x</span>
1202
+ <span class="cline-any cline-yes">3x</span>
1203
+ <span class="cline-any cline-yes">3x</span>
1204
+ <span class="cline-any cline-yes">3x</span>
1205
+ <span class="cline-any cline-yes">3x</span>
1206
+ <span class="cline-any cline-yes">3x</span>
1207
+ <span class="cline-any cline-yes">3x</span>
1208
+ <span class="cline-any cline-yes">3x</span>
1209
+ <span class="cline-any cline-yes">3x</span>
1210
+ <span class="cline-any cline-yes">3x</span>
1211
+ <span class="cline-any cline-yes">3x</span>
1212
+ <span class="cline-any cline-yes">3x</span>
1213
+ <span class="cline-any cline-yes">3x</span>
1214
+ <span class="cline-any cline-yes">3x</span>
1215
+ <span class="cline-any cline-yes">3x</span>
1216
+ <span class="cline-any cline-yes">3x</span>
1217
+ <span class="cline-any cline-yes">3x</span>
1218
+ <span class="cline-any cline-yes">3x</span>
1219
+ <span class="cline-any cline-yes">3x</span>
1220
+ <span class="cline-any cline-yes">3x</span>
1221
+ <span class="cline-any cline-yes">3x</span>
1222
+ <span class="cline-any cline-yes">3x</span>
1223
+ <span class="cline-any cline-yes">3x</span>
1224
+ <span class="cline-any cline-yes">3x</span>
1225
+ <span class="cline-any cline-yes">3x</span>
1226
+ <span class="cline-any cline-yes">3x</span>
1227
+ <span class="cline-any cline-yes">3x</span>
1228
+ <span class="cline-any cline-yes">3x</span>
1229
+ <span class="cline-any cline-yes">3x</span>
1230
+ <span class="cline-any cline-yes">3x</span>
1231
+ <span class="cline-any cline-yes">3x</span>
1232
+ <span class="cline-any cline-yes">3x</span>
1233
+ <span class="cline-any cline-yes">3x</span>
1234
+ <span class="cline-any cline-yes">3x</span>
1235
+ <span class="cline-any cline-yes">3x</span>
1236
+ <span class="cline-any cline-yes">3x</span>
1237
+ <span class="cline-any cline-yes">3x</span>
1238
+ <span class="cline-any cline-yes">1x</span>
1239
+ <span class="cline-any cline-yes">1x</span>
1240
+ <span class="cline-any cline-yes">1x</span>
1241
+ <span class="cline-any cline-no">&nbsp;</span>
1242
+ <span class="cline-any cline-no">&nbsp;</span>
1243
+ <span class="cline-any cline-no">&nbsp;</span>
1244
+ <span class="cline-any cline-no">&nbsp;</span>
1245
+ <span class="cline-any cline-no">&nbsp;</span>
1246
+ <span class="cline-any cline-no">&nbsp;</span>
1247
+ <span class="cline-any cline-no">&nbsp;</span>
1248
+ <span class="cline-any cline-no">&nbsp;</span>
1249
+ <span class="cline-any cline-no">&nbsp;</span>
1250
+ <span class="cline-any cline-no">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-no">&nbsp;</span>
1253
+ <span class="cline-any cline-no">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-no">&nbsp;</span>
1256
+ <span class="cline-any cline-no">&nbsp;</span>
1257
+ <span class="cline-any cline-no">&nbsp;</span>
1258
+ <span class="cline-any cline-no">&nbsp;</span>
1259
+ <span class="cline-any cline-no">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-no">&nbsp;</span>
1262
+ <span class="cline-any cline-no">&nbsp;</span>
1263
+ <span class="cline-any cline-no">&nbsp;</span>
1264
+ <span class="cline-any cline-no">&nbsp;</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-no">&nbsp;</span>
1267
+ <span class="cline-any cline-no">&nbsp;</span>
1268
+ <span class="cline-any cline-no">&nbsp;</span>
1269
+ <span class="cline-any cline-no">&nbsp;</span>
1270
+ <span class="cline-any cline-no">&nbsp;</span>
1271
+ <span class="cline-any cline-no">&nbsp;</span>
1272
+ <span class="cline-any cline-no">&nbsp;</span>
1273
+ <span class="cline-any cline-no">&nbsp;</span>
1274
+ <span class="cline-any cline-no">&nbsp;</span>
1275
+ <span class="cline-any cline-no">&nbsp;</span>
1276
+ <span class="cline-any cline-no">&nbsp;</span>
1277
+ <span class="cline-any cline-no">&nbsp;</span>
1278
+ <span class="cline-any cline-no">&nbsp;</span>
1279
+ <span class="cline-any cline-no">&nbsp;</span>
1280
+ <span class="cline-any cline-no">&nbsp;</span>
1281
+ <span class="cline-any cline-no">&nbsp;</span>
1282
+ <span class="cline-any cline-yes">1x</span>
1283
+ <span class="cline-any cline-yes">1x</span>
1284
+ <span class="cline-any cline-yes">1x</span>
1285
+ <span class="cline-any cline-yes">1x</span>
1286
+ <span class="cline-any cline-yes">1x</span>
1287
+ <span class="cline-any cline-yes">1x</span>
1288
+ <span class="cline-any cline-yes">1x</span>
1289
+ <span class="cline-any cline-yes">1x</span>
1290
+ <span class="cline-any cline-yes">1x</span>
1291
+ <span class="cline-any cline-yes">1x</span>
1292
+ <span class="cline-any cline-yes">1x</span>
1293
+ <span class="cline-any cline-yes">1x</span>
1294
+ <span class="cline-any cline-yes">1x</span>
1295
+ <span class="cline-any cline-yes">1x</span>
1296
+ <span class="cline-any cline-yes">1x</span>
1297
+ <span class="cline-any cline-yes">1x</span>
1298
+ <span class="cline-any cline-yes">1x</span>
1299
+ <span class="cline-any cline-yes">1x</span>
1300
+ <span class="cline-any cline-yes">1x</span>
1301
+ <span class="cline-any cline-yes">1x</span>
1302
+ <span class="cline-any cline-yes">1x</span>
1303
+ <span class="cline-any cline-yes">1x</span>
1304
+ <span class="cline-any cline-yes">1x</span>
1305
+ <span class="cline-any cline-yes">1x</span>
1306
+ <span class="cline-any cline-yes">1x</span>
1307
+ <span class="cline-any cline-yes">1x</span>
1308
+ <span class="cline-any cline-yes">1x</span>
1309
+ <span class="cline-any cline-yes">1x</span>
1310
+ <span class="cline-any cline-yes">1x</span>
1311
+ <span class="cline-any cline-yes">1x</span>
1312
+ <span class="cline-any cline-yes">1x</span>
1313
+ <span class="cline-any cline-yes">1x</span>
1314
+ <span class="cline-any cline-yes">1x</span>
1315
+ <span class="cline-any cline-yes">1x</span>
1316
+ <span class="cline-any cline-yes">1x</span>
1317
+ <span class="cline-any cline-yes">1x</span>
1318
+ <span class="cline-any cline-yes">1x</span>
1319
+ <span class="cline-any cline-yes">1x</span>
1320
+ <span class="cline-any cline-yes">1x</span>
1321
+ <span class="cline-any cline-yes">1x</span>
1322
+ <span class="cline-any cline-yes">1x</span>
1323
+ <span class="cline-any cline-yes">1x</span>
1324
+ <span class="cline-any cline-yes">1x</span>
1325
+ <span class="cline-any cline-yes">1x</span>
1326
+ <span class="cline-any cline-yes">1x</span>
1327
+ <span class="cline-any cline-yes">1x</span>
1328
+ <span class="cline-any cline-yes">1x</span>
1329
+ <span class="cline-any cline-yes">1x</span>
1330
+ <span class="cline-any cline-yes">1x</span>
1331
+ <span class="cline-any cline-yes">1x</span>
1332
+ <span class="cline-any cline-yes">1x</span>
1333
+ <span class="cline-any cline-yes">1x</span>
1334
+ <span class="cline-any cline-yes">1x</span>
1335
+ <span class="cline-any cline-yes">1x</span>
1336
+ <span class="cline-any cline-yes">1x</span>
1337
+ <span class="cline-any cline-yes">1x</span>
1338
+ <span class="cline-any cline-yes">1x</span>
1339
+ <span class="cline-any cline-yes">1x</span>
1340
+ <span class="cline-any cline-yes">1x</span>
1341
+ <span class="cline-any cline-yes">1x</span>
1342
+ <span class="cline-any cline-yes">1x</span>
1343
+ <span class="cline-any cline-yes">1x</span>
1344
+ <span class="cline-any cline-yes">1x</span>
1345
+ <span class="cline-any cline-yes">1x</span>
1346
+ <span class="cline-any cline-yes">1x</span>
1347
+ <span class="cline-any cline-yes">1x</span>
1348
+ <span class="cline-any cline-yes">1x</span>
1349
+ <span class="cline-any cline-yes">1x</span>
1350
+ <span class="cline-any cline-yes">1x</span>
1351
+ <span class="cline-any cline-yes">1x</span>
1352
+ <span class="cline-any cline-yes">1x</span>
1353
+ <span class="cline-any cline-yes">1x</span>
1354
+ <span class="cline-any cline-yes">1x</span>
1355
+ <span class="cline-any cline-yes">1x</span>
1356
+ <span class="cline-any cline-yes">1x</span>
1357
+ <span class="cline-any cline-yes">1x</span>
1358
+ <span class="cline-any cline-yes">1x</span>
1359
+ <span class="cline-any cline-yes">1x</span>
1360
+ <span class="cline-any cline-yes">1x</span>
1361
+ <span class="cline-any cline-yes">1x</span>
1362
+ <span class="cline-any cline-yes">1x</span>
1363
+ <span class="cline-any cline-yes">1x</span>
1364
+ <span class="cline-any cline-yes">1x</span>
1365
+ <span class="cline-any cline-yes">1x</span>
1366
+ <span class="cline-any cline-yes">1x</span>
1367
+ <span class="cline-any cline-yes">1x</span>
1368
+ <span class="cline-any cline-yes">1x</span>
1369
+ <span class="cline-any cline-yes">1x</span>
1370
+ <span class="cline-any cline-yes">1x</span>
1371
+ <span class="cline-any cline-yes">1x</span>
1372
+ <span class="cline-any cline-yes">1x</span>
1373
+ <span class="cline-any cline-yes">1x</span>
1374
+ <span class="cline-any cline-yes">1x</span>
1375
+ <span class="cline-any cline-yes">1x</span>
1376
+ <span class="cline-any cline-yes">1x</span>
1377
+ <span class="cline-any cline-yes">1x</span>
1378
+ <span class="cline-any cline-yes">1x</span>
1379
+ <span class="cline-any cline-yes">1x</span>
1380
+ <span class="cline-any cline-yes">1x</span>
1381
+ <span class="cline-any cline-yes">1x</span>
1382
+ <span class="cline-any cline-yes">1x</span>
1383
+ <span class="cline-any cline-yes">1x</span>
1384
+ <span class="cline-any cline-yes">1x</span>
1385
+ <span class="cline-any cline-yes">1x</span>
1386
+ <span class="cline-any cline-yes">1x</span>
1387
+ <span class="cline-any cline-yes">1x</span>
1388
+ <span class="cline-any cline-yes">1x</span>
1389
+ <span class="cline-any cline-yes">1x</span>
1390
+ <span class="cline-any cline-yes">1x</span>
1391
+ <span class="cline-any cline-yes">1x</span>
1392
+ <span class="cline-any cline-yes">1x</span>
1393
+ <span class="cline-any cline-yes">1x</span>
1394
+ <span class="cline-any cline-yes">1x</span>
1395
+ <span class="cline-any cline-yes">1x</span>
1396
+ <span class="cline-any cline-yes">1x</span>
1397
+ <span class="cline-any cline-yes">1x</span>
1398
+ <span class="cline-any cline-yes">1x</span>
1399
+ <span class="cline-any cline-yes">1x</span>
1400
+ <span class="cline-any cline-yes">1x</span>
1401
+ <span class="cline-any cline-yes">1x</span>
1402
+ <span class="cline-any cline-yes">1x</span>
1403
+ <span class="cline-any cline-yes">1x</span>
1404
+ <span class="cline-any cline-yes">1x</span>
1405
+ <span class="cline-any cline-yes">1x</span>
1406
+ <span class="cline-any cline-yes">1x</span>
1407
+ <span class="cline-any cline-yes">1x</span>
1408
+ <span class="cline-any cline-yes">1x</span>
1409
+ <span class="cline-any cline-yes">1x</span>
1410
+ <span class="cline-any cline-yes">1x</span>
1411
+ <span class="cline-any cline-yes">1x</span>
1412
+ <span class="cline-any cline-yes">1x</span>
1413
+ <span class="cline-any cline-yes">1x</span>
1414
+ <span class="cline-any cline-yes">1x</span>
1415
+ <span class="cline-any cline-yes">1x</span>
1416
+ <span class="cline-any cline-yes">1x</span>
1417
+ <span class="cline-any cline-yes">1x</span>
1418
+ <span class="cline-any cline-yes">1x</span>
1419
+ <span class="cline-any cline-yes">1x</span>
1420
+ <span class="cline-any cline-yes">1x</span>
1421
+ <span class="cline-any cline-yes">1x</span>
1422
+ <span class="cline-any cline-yes">1x</span>
1423
+ <span class="cline-any cline-yes">1x</span>
1424
+ <span class="cline-any cline-yes">1x</span>
1425
+ <span class="cline-any cline-yes">1x</span>
1426
+ <span class="cline-any cline-yes">1x</span>
1427
+ <span class="cline-any cline-yes">1x</span>
1428
+ <span class="cline-any cline-yes">1x</span>
1429
+ <span class="cline-any cline-yes">1x</span>
1430
+ <span class="cline-any cline-yes">1x</span>
1431
+ <span class="cline-any cline-yes">1x</span>
1432
+ <span class="cline-any cline-yes">1x</span>
1433
+ <span class="cline-any cline-yes">1x</span>
1434
+ <span class="cline-any cline-yes">1x</span>
1435
+ <span class="cline-any cline-yes">1x</span>
1436
+ <span class="cline-any cline-yes">1x</span>
1437
+ <span class="cline-any cline-yes">1x</span>
1438
+ <span class="cline-any cline-yes">1x</span>
1439
+ <span class="cline-any cline-yes">1x</span>
1440
+ <span class="cline-any cline-yes">1x</span>
1441
+ <span class="cline-any cline-yes">1x</span>
1442
+ <span class="cline-any cline-yes">1x</span>
1443
+ <span class="cline-any cline-yes">1x</span>
1444
+ <span class="cline-any cline-yes">1x</span>
1445
+ <span class="cline-any cline-yes">1x</span>
1446
+ <span class="cline-any cline-yes">1x</span>
1447
+ <span class="cline-any cline-yes">1x</span>
1448
+ <span class="cline-any cline-yes">1x</span>
1449
+ <span class="cline-any cline-yes">1x</span>
1450
+ <span class="cline-any cline-yes">1x</span>
1451
+ <span class="cline-any cline-yes">1x</span>
1452
+ <span class="cline-any cline-yes">1x</span>
1453
+ <span class="cline-any cline-yes">1x</span>
1454
+ <span class="cline-any cline-yes">1x</span>
1455
+ <span class="cline-any cline-yes">1x</span>
1456
+ <span class="cline-any cline-yes">1x</span>
1457
+ <span class="cline-any cline-yes">1x</span>
1458
+ <span class="cline-any cline-yes">1x</span>
1459
+ <span class="cline-any cline-yes">1x</span>
1460
+ <span class="cline-any cline-yes">1x</span>
1461
+ <span class="cline-any cline-yes">1x</span>
1462
+ <span class="cline-any cline-yes">1x</span>
1463
+ <span class="cline-any cline-yes">1x</span>
1464
+ <span class="cline-any cline-yes">1x</span>
1465
+ <span class="cline-any cline-yes">1x</span>
1466
+ <span class="cline-any cline-yes">1x</span>
1467
+ <span class="cline-any cline-yes">1x</span>
1468
+ <span class="cline-any cline-yes">1x</span>
1469
+ <span class="cline-any cline-yes">1x</span>
1470
+ <span class="cline-any cline-yes">1x</span>
1471
+ <span class="cline-any cline-yes">1x</span>
1472
+ <span class="cline-any cline-yes">1x</span>
1473
+ <span class="cline-any cline-yes">1x</span>
1474
+ <span class="cline-any cline-yes">1x</span>
1475
+ <span class="cline-any cline-yes">1x</span>
1476
+ <span class="cline-any cline-yes">1x</span>
1477
+ <span class="cline-any cline-yes">1x</span>
1478
+ <span class="cline-any cline-yes">1x</span>
1479
+ <span class="cline-any cline-yes">1x</span>
1480
+ <span class="cline-any cline-yes">1x</span>
1481
+ <span class="cline-any cline-yes">1x</span>
1482
+ <span class="cline-any cline-yes">1x</span>
1483
+ <span class="cline-any cline-yes">1x</span>
1484
+ <span class="cline-any cline-yes">1x</span>
1485
+ <span class="cline-any cline-yes">1x</span>
1486
+ <span class="cline-any cline-yes">1x</span>
1487
+ <span class="cline-any cline-yes">1x</span>
1488
+ <span class="cline-any cline-yes">1x</span>
1489
+ <span class="cline-any cline-yes">1x</span>
1490
+ <span class="cline-any cline-yes">1x</span>
1491
+ <span class="cline-any cline-yes">1x</span>
1492
+ <span class="cline-any cline-yes">1x</span>
1493
+ <span class="cline-any cline-yes">1x</span>
1494
+ <span class="cline-any cline-yes">1x</span>
1495
+ <span class="cline-any cline-yes">1x</span>
1496
+ <span class="cline-any cline-yes">1x</span>
1497
+ <span class="cline-any cline-yes">1x</span>
1498
+ <span class="cline-any cline-yes">1x</span>
1499
+ <span class="cline-any cline-yes">1x</span>
1500
+ <span class="cline-any cline-yes">1x</span>
1501
+ <span class="cline-any cline-yes">1x</span>
1502
+ <span class="cline-any cline-yes">1x</span>
1503
+ <span class="cline-any cline-yes">1x</span>
1504
+ <span class="cline-any cline-yes">1x</span>
1505
+ <span class="cline-any cline-yes">1x</span>
1506
+ <span class="cline-any cline-yes">1x</span>
1507
+ <span class="cline-any cline-yes">1x</span>
1508
+ <span class="cline-any cline-yes">1x</span>
1509
+ <span class="cline-any cline-yes">1x</span>
1510
+ <span class="cline-any cline-yes">1x</span>
1511
+ <span class="cline-any cline-yes">1x</span>
1512
+ <span class="cline-any cline-yes">1x</span>
1513
+ <span class="cline-any cline-yes">1x</span>
1514
+ <span class="cline-any cline-yes">1x</span>
1515
+ <span class="cline-any cline-yes">1x</span>
1516
+ <span class="cline-any cline-yes">1x</span>
1517
+ <span class="cline-any cline-yes">1x</span>
1518
+ <span class="cline-any cline-yes">1x</span>
1519
+ <span class="cline-any cline-yes">1x</span>
1520
+ <span class="cline-any cline-yes">1x</span>
1521
+ <span class="cline-any cline-yes">1x</span>
1522
+ <span class="cline-any cline-yes">1x</span>
1523
+ <span class="cline-any cline-yes">1x</span>
1524
+ <span class="cline-any cline-yes">1x</span>
1525
+ <span class="cline-any cline-yes">1x</span>
1526
+ <span class="cline-any cline-yes">1x</span>
1527
+ <span class="cline-any cline-yes">1x</span>
1528
+ <span class="cline-any cline-yes">1x</span>
1529
+ <span class="cline-any cline-yes">1x</span>
1530
+ <span class="cline-any cline-yes">1x</span>
1531
+ <span class="cline-any cline-yes">1x</span>
1532
+ <span class="cline-any cline-yes">1x</span>
1533
+ <span class="cline-any cline-yes">1x</span>
1534
+ <span class="cline-any cline-yes">1x</span>
1535
+ <span class="cline-any cline-yes">1x</span>
1536
+ <span class="cline-any cline-yes">1x</span>
1537
+ <span class="cline-any cline-yes">1x</span>
1538
+ <span class="cline-any cline-yes">1x</span>
1539
+ <span class="cline-any cline-yes">1x</span>
1540
+ <span class="cline-any cline-yes">1x</span>
1541
+ <span class="cline-any cline-yes">1x</span>
1542
+ <span class="cline-any cline-yes">1x</span>
1543
+ <span class="cline-any cline-yes">1x</span>
1544
+ <span class="cline-any cline-yes">1x</span>
1545
+ <span class="cline-any cline-yes">1x</span>
1546
+ <span class="cline-any cline-yes">1x</span>
1547
+ <span class="cline-any cline-yes">1x</span>
1548
+ <span class="cline-any cline-yes">1x</span>
1549
+ <span class="cline-any cline-yes">1x</span>
1550
+ <span class="cline-any cline-yes">1x</span>
1551
+ <span class="cline-any cline-yes">1x</span>
1552
+ <span class="cline-any cline-yes">1x</span>
1553
+ <span class="cline-any cline-yes">1x</span>
1554
+ <span class="cline-any cline-yes">1x</span>
1555
+ <span class="cline-any cline-yes">1x</span>
1556
+ <span class="cline-any cline-yes">1x</span>
1557
+ <span class="cline-any cline-yes">1x</span>
1558
+ <span class="cline-any cline-yes">1x</span>
1559
+ <span class="cline-any cline-yes">1x</span>
1560
+ <span class="cline-any cline-yes">1x</span>
1561
+ <span class="cline-any cline-yes">1x</span>
1562
+ <span class="cline-any cline-yes">1x</span>
1563
+ <span class="cline-any cline-yes">1x</span>
1564
+ <span class="cline-any cline-yes">1x</span>
1565
+ <span class="cline-any cline-yes">1x</span>
1566
+ <span class="cline-any cline-yes">1x</span>
1567
+ <span class="cline-any cline-yes">1x</span>
1568
+ <span class="cline-any cline-yes">1x</span>
1569
+ <span class="cline-any cline-yes">1x</span>
1570
+ <span class="cline-any cline-yes">1x</span>
1571
+ <span class="cline-any cline-yes">1x</span>
1572
+ <span class="cline-any cline-yes">1x</span>
1573
+ <span class="cline-any cline-yes">1x</span>
1574
+ <span class="cline-any cline-yes">1x</span>
1575
+ <span class="cline-any cline-yes">1x</span>
1576
+ <span class="cline-any cline-yes">1x</span>
1577
+ <span class="cline-any cline-yes">1x</span>
1578
+ <span class="cline-any cline-yes">1x</span>
1579
+ <span class="cline-any cline-yes">1x</span>
1580
+ <span class="cline-any cline-yes">1x</span>
1581
+ <span class="cline-any cline-yes">1x</span>
1582
+ <span class="cline-any cline-yes">1x</span>
1583
+ <span class="cline-any cline-yes">1x</span>
1584
+ <span class="cline-any cline-yes">1x</span>
1585
+ <span class="cline-any cline-yes">1x</span>
1586
+ <span class="cline-any cline-yes">1x</span>
1587
+ <span class="cline-any cline-yes">1x</span>
1588
+ <span class="cline-any cline-yes">1x</span>
1589
+ <span class="cline-any cline-yes">1x</span>
1590
+ <span class="cline-any cline-yes">1x</span>
1591
+ <span class="cline-any cline-yes">1x</span>
1592
+ <span class="cline-any cline-yes">1x</span>
1593
+ <span class="cline-any cline-yes">1x</span>
1594
+ <span class="cline-any cline-yes">1x</span>
1595
+ <span class="cline-any cline-yes">1x</span>
1596
+ <span class="cline-any cline-yes">1x</span>
1597
+ <span class="cline-any cline-yes">1x</span>
1598
+ <span class="cline-any cline-yes">1x</span>
1599
+ <span class="cline-any cline-yes">1x</span>
1600
+ <span class="cline-any cline-yes">1x</span>
1601
+ <span class="cline-any cline-yes">1x</span>
1602
+ <span class="cline-any cline-yes">1x</span>
1603
+ <span class="cline-any cline-yes">1x</span>
1604
+ <span class="cline-any cline-yes">1x</span>
1605
+ <span class="cline-any cline-yes">1x</span>
1606
+ <span class="cline-any cline-yes">1x</span>
1607
+ <span class="cline-any cline-yes">1x</span>
1608
+ <span class="cline-any cline-yes">1x</span>
1609
+ <span class="cline-any cline-yes">1x</span>
1610
+ <span class="cline-any cline-yes">1x</span>
1611
+ <span class="cline-any cline-yes">1x</span>
1612
+ <span class="cline-any cline-yes">1x</span>
1613
+ <span class="cline-any cline-yes">1x</span>
1614
+ <span class="cline-any cline-yes">1x</span>
1615
+ <span class="cline-any cline-yes">1x</span>
1616
+ <span class="cline-any cline-yes">1x</span>
1617
+ <span class="cline-any cline-yes">1x</span>
1618
+ <span class="cline-any cline-yes">1x</span>
1619
+ <span class="cline-any cline-yes">1x</span>
1620
+ <span class="cline-any cline-yes">1x</span>
1621
+ <span class="cline-any cline-yes">1x</span>
1622
+ <span class="cline-any cline-yes">1x</span>
1623
+ <span class="cline-any cline-yes">1x</span>
1624
+ <span class="cline-any cline-yes">1x</span>
1625
+ <span class="cline-any cline-yes">1x</span>
1626
+ <span class="cline-any cline-yes">1x</span>
1627
+ <span class="cline-any cline-yes">1x</span>
1628
+ <span class="cline-any cline-yes">1x</span>
1629
+ <span class="cline-any cline-yes">1x</span>
1630
+ <span class="cline-any cline-yes">1x</span>
1631
+ <span class="cline-any cline-yes">1x</span>
1632
+ <span class="cline-any cline-yes">1x</span>
1633
+ <span class="cline-any cline-yes">1x</span>
1634
+ <span class="cline-any cline-yes">1x</span>
1635
+ <span class="cline-any cline-yes">1x</span>
1636
+ <span class="cline-any cline-yes">1x</span>
1637
+ <span class="cline-any cline-yes">1x</span>
1638
+ <span class="cline-any cline-yes">1x</span>
1639
+ <span class="cline-any cline-yes">1x</span>
1640
+ <span class="cline-any cline-yes">1x</span>
1641
+ <span class="cline-any cline-yes">1x</span>
1642
+ <span class="cline-any cline-yes">1x</span>
1643
+ <span class="cline-any cline-yes">1x</span>
1644
+ <span class="cline-any cline-yes">1x</span>
1645
+ <span class="cline-any cline-yes">1x</span>
1646
+ <span class="cline-any cline-yes">1x</span>
1647
+ <span class="cline-any cline-yes">1x</span>
1648
+ <span class="cline-any cline-yes">1x</span>
1649
+ <span class="cline-any cline-yes">1x</span>
1650
+ <span class="cline-any cline-yes">1x</span>
1651
+ <span class="cline-any cline-yes">1x</span>
1652
+ <span class="cline-any cline-yes">1x</span>
1653
+ <span class="cline-any cline-yes">1x</span>
1654
+ <span class="cline-any cline-yes">1x</span>
1655
+ <span class="cline-any cline-yes">1x</span>
1656
+ <span class="cline-any cline-yes">1x</span>
1657
+ <span class="cline-any cline-yes">1x</span>
1658
+ <span class="cline-any cline-yes">1x</span>
1659
+ <span class="cline-any cline-yes">1x</span>
1660
+ <span class="cline-any cline-yes">1x</span>
1661
+ <span class="cline-any cline-yes">1x</span>
1662
+ <span class="cline-any cline-yes">1x</span>
1663
+ <span class="cline-any cline-yes">1x</span>
1664
+ <span class="cline-any cline-yes">1x</span>
1665
+ <span class="cline-any cline-yes">1x</span>
1666
+ <span class="cline-any cline-yes">1x</span>
1667
+ <span class="cline-any cline-yes">1x</span>
1668
+ <span class="cline-any cline-yes">1x</span>
1669
+ <span class="cline-any cline-yes">1x</span>
1670
+ <span class="cline-any cline-yes">1x</span>
1671
+ <span class="cline-any cline-yes">1x</span>
1672
+ <span class="cline-any cline-yes">1x</span>
1673
+ <span class="cline-any cline-yes">1x</span>
1674
+ <span class="cline-any cline-yes">1x</span>
1675
+ <span class="cline-any cline-yes">1x</span>
1676
+ <span class="cline-any cline-yes">1x</span>
1677
+ <span class="cline-any cline-yes">1x</span>
1678
+ <span class="cline-any cline-yes">1x</span>
1679
+ <span class="cline-any cline-yes">1x</span>
1680
+ <span class="cline-any cline-yes">1x</span>
1681
+ <span class="cline-any cline-yes">1x</span>
1682
+ <span class="cline-any cline-yes">1x</span>
1683
+ <span class="cline-any cline-yes">1x</span>
1684
+ <span class="cline-any cline-yes">1x</span>
1685
+ <span class="cline-any cline-yes">1x</span>
1686
+ <span class="cline-any cline-yes">1x</span>
1687
+ <span class="cline-any cline-yes">1x</span>
1688
+ <span class="cline-any cline-yes">1x</span>
1689
+ <span class="cline-any cline-yes">1x</span>
1690
+ <span class="cline-any cline-yes">1x</span>
1691
+ <span class="cline-any cline-yes">1x</span>
1692
+ <span class="cline-any cline-yes">1x</span>
1693
+ <span class="cline-any cline-yes">1x</span>
1694
+ <span class="cline-any cline-yes">1x</span>
1695
+ <span class="cline-any cline-yes">1x</span>
1696
+ <span class="cline-any cline-yes">1x</span>
1697
+ <span class="cline-any cline-yes">1x</span>
1698
+ <span class="cline-any cline-yes">1x</span>
1699
+ <span class="cline-any cline-yes">1x</span>
1700
+ <span class="cline-any cline-yes">1x</span>
1701
+ <span class="cline-any cline-yes">1x</span>
1702
+ <span class="cline-any cline-yes">1x</span>
1703
+ <span class="cline-any cline-yes">1x</span>
1704
+ <span class="cline-any cline-yes">1x</span>
1705
+ <span class="cline-any cline-yes">1x</span>
1706
+ <span class="cline-any cline-yes">1x</span>
1707
+ <span class="cline-any cline-yes">1x</span>
1708
+ <span class="cline-any cline-yes">1x</span>
1709
+ <span class="cline-any cline-yes">1x</span>
1710
+ <span class="cline-any cline-yes">1x</span>
1711
+ <span class="cline-any cline-yes">1x</span>
1712
+ <span class="cline-any cline-yes">1x</span>
1713
+ <span class="cline-any cline-yes">1x</span>
1714
+ <span class="cline-any cline-yes">1x</span>
1715
+ <span class="cline-any cline-yes">1x</span>
1716
+ <span class="cline-any cline-yes">1x</span>
1717
+ <span class="cline-any cline-yes">1x</span>
1718
+ <span class="cline-any cline-yes">1x</span>
1719
+ <span class="cline-any cline-yes">1x</span>
1720
+ <span class="cline-any cline-yes">1x</span>
1721
+ <span class="cline-any cline-yes">1x</span>
1722
+ <span class="cline-any cline-yes">1x</span>
1723
+ <span class="cline-any cline-yes">1x</span>
1724
+ <span class="cline-any cline-yes">1x</span>
1725
+ <span class="cline-any cline-yes">1x</span>
1726
+ <span class="cline-any cline-yes">1x</span>
1727
+ <span class="cline-any cline-yes">1x</span>
1728
+ <span class="cline-any cline-yes">1x</span>
1729
+ <span class="cline-any cline-yes">1x</span>
1730
+ <span class="cline-any cline-yes">1x</span>
1731
+ <span class="cline-any cline-yes">1x</span>
1732
+ <span class="cline-any cline-yes">1x</span>
1733
+ <span class="cline-any cline-yes">1x</span>
1734
+ <span class="cline-any cline-yes">1x</span>
1735
+ <span class="cline-any cline-yes">1x</span>
1736
+ <span class="cline-any cline-yes">1x</span>
1737
+ <span class="cline-any cline-yes">1x</span>
1738
+ <span class="cline-any cline-yes">1x</span>
1739
+ <span class="cline-any cline-yes">1x</span>
1740
+ <span class="cline-any cline-yes">1x</span>
1741
+ <span class="cline-any cline-yes">1x</span>
1742
+ <span class="cline-any cline-yes">1x</span>
1743
+ <span class="cline-any cline-yes">1x</span>
1744
+ <span class="cline-any cline-yes">1x</span>
1745
+ <span class="cline-any cline-yes">1x</span>
1746
+ <span class="cline-any cline-yes">1x</span>
1747
+ <span class="cline-any cline-yes">1x</span>
1748
+ <span class="cline-any cline-yes">1x</span>
1749
+ <span class="cline-any cline-yes">1x</span>
1750
+ <span class="cline-any cline-yes">1x</span>
1751
+ <span class="cline-any cline-yes">1x</span>
1752
+ <span class="cline-any cline-yes">1x</span>
1753
+ <span class="cline-any cline-yes">1x</span>
1754
+ <span class="cline-any cline-yes">1x</span>
1755
+ <span class="cline-any cline-yes">1x</span>
1756
+ <span class="cline-any cline-yes">1x</span>
1757
+ <span class="cline-any cline-yes">1x</span>
1758
+ <span class="cline-any cline-yes">1x</span>
1759
+ <span class="cline-any cline-yes">1x</span>
1760
+ <span class="cline-any cline-yes">1x</span>
1761
+ <span class="cline-any cline-yes">1x</span>
1762
+ <span class="cline-any cline-yes">1x</span>
1763
+ <span class="cline-any cline-yes">1x</span>
1764
+ <span class="cline-any cline-yes">1x</span>
1765
+ <span class="cline-any cline-yes">1x</span>
1766
+ <span class="cline-any cline-yes">1x</span>
1767
+ <span class="cline-any cline-yes">1x</span>
1768
+ <span class="cline-any cline-yes">1x</span>
1769
+ <span class="cline-any cline-yes">1x</span>
1770
+ <span class="cline-any cline-yes">1x</span>
1771
+ <span class="cline-any cline-yes">1x</span>
1772
+ <span class="cline-any cline-yes">1x</span>
1773
+ <span class="cline-any cline-yes">1x</span>
1774
+ <span class="cline-any cline-yes">1x</span>
1775
+ <span class="cline-any cline-yes">1x</span>
1776
+ <span class="cline-any cline-yes">1x</span>
1777
+ <span class="cline-any cline-yes">1x</span>
1778
+ <span class="cline-any cline-yes">1x</span>
1779
+ <span class="cline-any cline-yes">1x</span>
1780
+ <span class="cline-any cline-yes">1x</span>
1781
+ <span class="cline-any cline-yes">1x</span>
1782
+ <span class="cline-any cline-yes">1x</span>
1783
+ <span class="cline-any cline-yes">1x</span>
1784
+ <span class="cline-any cline-yes">1x</span>
1785
+ <span class="cline-any cline-yes">1x</span>
1786
+ <span class="cline-any cline-yes">1x</span>
1787
+ <span class="cline-any cline-yes">1x</span>
1788
+ <span class="cline-any cline-yes">1x</span>
1789
+ <span class="cline-any cline-yes">1x</span>
1790
+ <span class="cline-any cline-yes">1x</span>
1791
+ <span class="cline-any cline-yes">1x</span>
1792
+ <span class="cline-any cline-yes">1x</span>
1793
+ <span class="cline-any cline-yes">1x</span>
1794
+ <span class="cline-any cline-yes">1x</span>
1795
+ <span class="cline-any cline-yes">1x</span>
1796
+ <span class="cline-any cline-yes">1x</span>
1797
+ <span class="cline-any cline-yes">1x</span>
1798
+ <span class="cline-any cline-yes">1x</span>
1799
+ <span class="cline-any cline-yes">1x</span>
1800
+ <span class="cline-any cline-yes">1x</span>
1801
+ <span class="cline-any cline-yes">1x</span>
1802
+ <span class="cline-any cline-yes">1x</span>
1803
+ <span class="cline-any cline-yes">1x</span>
1804
+ <span class="cline-any cline-yes">1x</span>
1805
+ <span class="cline-any cline-yes">1x</span>
1806
+ <span class="cline-any cline-yes">1x</span>
1807
+ <span class="cline-any cline-yes">1x</span>
1808
+ <span class="cline-any cline-yes">1x</span>
1809
+ <span class="cline-any cline-yes">1x</span>
1810
+ <span class="cline-any cline-yes">1x</span>
1811
+ <span class="cline-any cline-yes">1x</span>
1812
+ <span class="cline-any cline-yes">1x</span>
1813
+ <span class="cline-any cline-yes">1x</span>
1814
+ <span class="cline-any cline-yes">1x</span>
1815
+ <span class="cline-any cline-yes">1x</span>
1816
+ <span class="cline-any cline-yes">1x</span>
1817
+ <span class="cline-any cline-yes">1x</span>
1818
+ <span class="cline-any cline-yes">1x</span>
1819
+ <span class="cline-any cline-yes">1x</span>
1820
+ <span class="cline-any cline-yes">1x</span>
1821
+ <span class="cline-any cline-yes">1x</span>
1822
+ <span class="cline-any cline-yes">1x</span>
1823
+ <span class="cline-any cline-yes">1x</span>
1824
+ <span class="cline-any cline-yes">1x</span>
1825
+ <span class="cline-any cline-yes">1x</span>
1826
+ <span class="cline-any cline-yes">1x</span>
1827
+ <span class="cline-any cline-yes">1x</span>
1828
+ <span class="cline-any cline-yes">1x</span>
1829
+ <span class="cline-any cline-yes">1x</span>
1830
+ <span class="cline-any cline-yes">1x</span>
1831
+ <span class="cline-any cline-yes">1x</span>
1832
+ <span class="cline-any cline-yes">1x</span>
1833
+ <span class="cline-any cline-yes">1x</span>
1834
+ <span class="cline-any cline-yes">1x</span>
1835
+ <span class="cline-any cline-yes">1x</span>
1836
+ <span class="cline-any cline-yes">1x</span>
1837
+ <span class="cline-any cline-yes">1x</span>
1838
+ <span class="cline-any cline-yes">1x</span>
1839
+ <span class="cline-any cline-yes">1x</span>
1840
+ <span class="cline-any cline-yes">1x</span>
1841
+ <span class="cline-any cline-yes">1x</span>
1842
+ <span class="cline-any cline-yes">1x</span>
1843
+ <span class="cline-any cline-yes">1x</span>
1844
+ <span class="cline-any cline-yes">1x</span>
1845
+ <span class="cline-any cline-yes">1x</span>
1846
+ <span class="cline-any cline-yes">1x</span>
1847
+ <span class="cline-any cline-yes">1x</span>
1848
+ <span class="cline-any cline-yes">1x</span>
1849
+ <span class="cline-any cline-yes">1x</span>
1850
+ <span class="cline-any cline-yes">1x</span>
1851
+ <span class="cline-any cline-yes">1x</span>
1852
+ <span class="cline-any cline-yes">1x</span>
1853
+ <span class="cline-any cline-yes">1x</span>
1854
+ <span class="cline-any cline-yes">1x</span>
1855
+ <span class="cline-any cline-yes">1x</span>
1856
+ <span class="cline-any cline-yes">1x</span>
1857
+ <span class="cline-any cline-yes">1x</span>
1858
+ <span class="cline-any cline-yes">1x</span>
1859
+ <span class="cline-any cline-yes">1x</span>
1860
+ <span class="cline-any cline-yes">1x</span>
1861
+ <span class="cline-any cline-yes">1x</span>
1862
+ <span class="cline-any cline-yes">1x</span>
1863
+ <span class="cline-any cline-yes">1x</span>
1864
+ <span class="cline-any cline-yes">1x</span>
1865
+ <span class="cline-any cline-yes">1x</span>
1866
+ <span class="cline-any cline-yes">1x</span>
1867
+ <span class="cline-any cline-yes">1x</span>
1868
+ <span class="cline-any cline-yes">1x</span>
1869
+ <span class="cline-any cline-yes">1x</span>
1870
+ <span class="cline-any cline-yes">1x</span>
1871
+ <span class="cline-any cline-yes">1x</span>
1872
+ <span class="cline-any cline-yes">1x</span>
1873
+ <span class="cline-any cline-yes">1x</span>
1874
+ <span class="cline-any cline-yes">1x</span>
1875
+ <span class="cline-any cline-yes">1x</span>
1876
+ <span class="cline-any cline-yes">1x</span>
1877
+ <span class="cline-any cline-yes">1x</span>
1878
+ <span class="cline-any cline-yes">1x</span>
1879
+ <span class="cline-any cline-yes">1x</span>
1880
+ <span class="cline-any cline-yes">1x</span>
1881
+ <span class="cline-any cline-yes">1x</span>
1882
+ <span class="cline-any cline-yes">1x</span>
1883
+ <span class="cline-any cline-yes">1x</span>
1884
+ <span class="cline-any cline-yes">1x</span>
1885
+ <span class="cline-any cline-yes">1x</span>
1886
+ <span class="cline-any cline-yes">1x</span>
1887
+ <span class="cline-any cline-yes">1x</span>
1888
+ <span class="cline-any cline-yes">1x</span>
1889
+ <span class="cline-any cline-yes">1x</span>
1890
+ <span class="cline-any cline-yes">1x</span>
1891
+ <span class="cline-any cline-yes">1x</span>
1892
+ <span class="cline-any cline-yes">1x</span>
1893
+ <span class="cline-any cline-yes">1x</span>
1894
+ <span class="cline-any cline-yes">1x</span>
1895
+ <span class="cline-any cline-yes">1x</span>
1896
+ <span class="cline-any cline-yes">1x</span>
1897
+ <span class="cline-any cline-yes">1x</span>
1898
+ <span class="cline-any cline-yes">1x</span>
1899
+ <span class="cline-any cline-yes">1x</span>
1900
+ <span class="cline-any cline-yes">1x</span>
1901
+ <span class="cline-any cline-yes">1x</span>
1902
+ <span class="cline-any cline-yes">1x</span>
1903
+ <span class="cline-any cline-yes">1x</span>
1904
+ <span class="cline-any cline-yes">1x</span>
1905
+ <span class="cline-any cline-yes">1x</span>
1906
+ <span class="cline-any cline-yes">1x</span>
1907
+ <span class="cline-any cline-yes">1x</span>
1908
+ <span class="cline-any cline-yes">1x</span>
1909
+ <span class="cline-any cline-yes">1x</span>
1910
+ <span class="cline-any cline-yes">1x</span>
1911
+ <span class="cline-any cline-yes">1x</span>
1912
+ <span class="cline-any cline-yes">1x</span>
1913
+ <span class="cline-any cline-yes">1x</span>
1914
+ <span class="cline-any cline-yes">1x</span>
1915
+ <span class="cline-any cline-yes">1x</span>
1916
+ <span class="cline-any cline-yes">1x</span>
1917
+ <span class="cline-any cline-yes">1x</span>
1918
+ <span class="cline-any cline-yes">1x</span>
1919
+ <span class="cline-any cline-yes">1x</span>
1920
+ <span class="cline-any cline-yes">1x</span>
1921
+ <span class="cline-any cline-yes">1x</span>
1922
+ <span class="cline-any cline-yes">1x</span>
1923
+ <span class="cline-any cline-yes">1x</span>
1924
+ <span class="cline-any cline-yes">1x</span>
1925
+ <span class="cline-any cline-yes">1x</span>
1926
+ <span class="cline-any cline-yes">1x</span>
1927
+ <span class="cline-any cline-yes">1x</span>
1928
+ <span class="cline-any cline-yes">1x</span>
1929
+ <span class="cline-any cline-yes">1x</span>
1930
+ <span class="cline-any cline-yes">1x</span>
1931
+ <span class="cline-any cline-yes">1x</span>
1932
+ <span class="cline-any cline-yes">1x</span>
1933
+ <span class="cline-any cline-yes">1x</span>
1934
+ <span class="cline-any cline-yes">1x</span>
1935
+ <span class="cline-any cline-yes">1x</span>
1936
+ <span class="cline-any cline-yes">1x</span>
1937
+ <span class="cline-any cline-yes">1x</span>
1938
+ <span class="cline-any cline-yes">1x</span>
1939
+ <span class="cline-any cline-yes">1x</span>
1940
+ <span class="cline-any cline-yes">1x</span>
1941
+ <span class="cline-any cline-yes">1x</span>
1942
+ <span class="cline-any cline-yes">1x</span>
1943
+ <span class="cline-any cline-yes">1x</span>
1944
+ <span class="cline-any cline-yes">1x</span>
1945
+ <span class="cline-any cline-yes">1x</span>
1946
+ <span class="cline-any cline-yes">1x</span>
1947
+ <span class="cline-any cline-yes">1x</span>
1948
+ <span class="cline-any cline-yes">1x</span>
1949
+ <span class="cline-any cline-yes">1x</span>
1950
+ <span class="cline-any cline-yes">1x</span>
1951
+ <span class="cline-any cline-yes">1x</span>
1952
+ <span class="cline-any cline-yes">1x</span>
1953
+ <span class="cline-any cline-yes">1x</span>
1954
+ <span class="cline-any cline-yes">1x</span>
1955
+ <span class="cline-any cline-yes">1x</span>
1956
+ <span class="cline-any cline-yes">1x</span>
1957
+ <span class="cline-any cline-yes">1x</span>
1958
+ <span class="cline-any cline-yes">1x</span>
1959
+ <span class="cline-any cline-yes">1x</span>
1960
+ <span class="cline-any cline-yes">1x</span>
1961
+ <span class="cline-any cline-yes">1x</span>
1962
+ <span class="cline-any cline-yes">1x</span>
1963
+ <span class="cline-any cline-yes">1x</span>
1964
+ <span class="cline-any cline-yes">1x</span>
1965
+ <span class="cline-any cline-yes">1x</span>
1966
+ <span class="cline-any cline-yes">1x</span>
1967
+ <span class="cline-any cline-yes">1x</span>
1968
+ <span class="cline-any cline-yes">1x</span>
1969
+ <span class="cline-any cline-yes">1x</span>
1970
+ <span class="cline-any cline-yes">1x</span>
1971
+ <span class="cline-any cline-yes">1x</span>
1972
+ <span class="cline-any cline-yes">1x</span>
1973
+ <span class="cline-any cline-yes">1x</span>
1974
+ <span class="cline-any cline-yes">1x</span>
1975
+ <span class="cline-any cline-yes">1x</span>
1976
+ <span class="cline-any cline-yes">1x</span>
1977
+ <span class="cline-any cline-yes">1x</span>
1978
+ <span class="cline-any cline-yes">1x</span>
1979
+ <span class="cline-any cline-yes">1x</span>
1980
+ <span class="cline-any cline-yes">1x</span>
1981
+ <span class="cline-any cline-yes">1x</span>
1982
+ <span class="cline-any cline-yes">1x</span>
1983
+ <span class="cline-any cline-yes">1x</span>
1984
+ <span class="cline-any cline-yes">1x</span>
1985
+ <span class="cline-any cline-yes">1x</span>
1986
+ <span class="cline-any cline-yes">1x</span>
1987
+ <span class="cline-any cline-yes">1x</span>
1988
+ <span class="cline-any cline-yes">1x</span>
1989
+ <span class="cline-any cline-yes">1x</span>
1990
+ <span class="cline-any cline-yes">1x</span>
1991
+ <span class="cline-any cline-yes">1x</span>
1992
+ <span class="cline-any cline-yes">1x</span>
1993
+ <span class="cline-any cline-yes">1x</span>
1994
+ <span class="cline-any cline-yes">1x</span>
1995
+ <span class="cline-any cline-yes">1x</span>
1996
+ <span class="cline-any cline-yes">1x</span>
1997
+ <span class="cline-any cline-yes">1x</span>
1998
+ <span class="cline-any cline-yes">1x</span>
1999
+ <span class="cline-any cline-yes">1x</span>
2000
+ <span class="cline-any cline-yes">1x</span>
2001
+ <span class="cline-any cline-yes">1x</span>
2002
+ <span class="cline-any cline-yes">1x</span>
2003
+ <span class="cline-any cline-yes">1x</span>
2004
+ <span class="cline-any cline-yes">1x</span>
2005
+ <span class="cline-any cline-yes">1x</span>
2006
+ <span class="cline-any cline-yes">1x</span>
2007
+ <span class="cline-any cline-yes">1x</span>
2008
+ <span class="cline-any cline-yes">1x</span>
2009
+ <span class="cline-any cline-yes">1x</span>
2010
+ <span class="cline-any cline-yes">1x</span>
2011
+ <span class="cline-any cline-yes">1x</span>
2012
+ <span class="cline-any cline-yes">1x</span>
2013
+ <span class="cline-any cline-yes">1x</span>
2014
+ <span class="cline-any cline-yes">1x</span>
2015
+ <span class="cline-any cline-yes">1x</span>
2016
+ <span class="cline-any cline-yes">1x</span>
2017
+ <span class="cline-any cline-yes">1x</span>
2018
+ <span class="cline-any cline-yes">1x</span>
2019
+ <span class="cline-any cline-yes">1x</span>
2020
+ <span class="cline-any cline-yes">1x</span>
2021
+ <span class="cline-any cline-yes">1x</span>
2022
+ <span class="cline-any cline-yes">1x</span>
2023
+ <span class="cline-any cline-yes">1x</span>
2024
+ <span class="cline-any cline-yes">1x</span>
2025
+ <span class="cline-any cline-yes">1x</span>
2026
+ <span class="cline-any cline-yes">1x</span>
2027
+ <span class="cline-any cline-yes">1x</span>
2028
+ <span class="cline-any cline-yes">1x</span>
2029
+ <span class="cline-any cline-yes">1x</span>
2030
+ <span class="cline-any cline-yes">1x</span>
2031
+ <span class="cline-any cline-yes">1x</span>
2032
+ <span class="cline-any cline-yes">1x</span>
2033
+ <span class="cline-any cline-yes">1x</span>
2034
+ <span class="cline-any cline-yes">1x</span>
2035
+ <span class="cline-any cline-yes">1x</span>
2036
+ <span class="cline-any cline-yes">1x</span>
2037
+ <span class="cline-any cline-yes">1x</span>
2038
+ <span class="cline-any cline-yes">1x</span>
2039
+ <span class="cline-any cline-yes">1x</span>
2040
+ <span class="cline-any cline-yes">1x</span>
2041
+ <span class="cline-any cline-yes">1x</span>
2042
+ <span class="cline-any cline-yes">1x</span>
2043
+ <span class="cline-any cline-no">&nbsp;</span>
2044
+ <span class="cline-any cline-yes">1x</span>
2045
+ <span class="cline-any cline-yes">1x</span>
2046
+ <span class="cline-any cline-yes">1x</span>
2047
+ <span class="cline-any cline-yes">1x</span>
2048
+ <span class="cline-any cline-yes">1x</span>
2049
+ <span class="cline-any cline-yes">1x</span>
2050
+ <span class="cline-any cline-yes">1x</span>
2051
+ <span class="cline-any cline-yes">1x</span>
2052
+ <span class="cline-any cline-yes">1x</span>
2053
+ <span class="cline-any cline-yes">1x</span>
2054
+ <span class="cline-any cline-yes">1x</span>
2055
+ <span class="cline-any cline-yes">1x</span>
2056
+ <span class="cline-any cline-yes">1x</span>
2057
+ <span class="cline-any cline-yes">1x</span>
2058
+ <span class="cline-any cline-yes">1x</span>
2059
+ <span class="cline-any cline-yes">1x</span>
2060
+ <span class="cline-any cline-yes">1x</span>
2061
+ <span class="cline-any cline-yes">1x</span>
2062
+ <span class="cline-any cline-yes">1x</span>
2063
+ <span class="cline-any cline-yes">1x</span>
2064
+ <span class="cline-any cline-yes">1x</span>
2065
+ <span class="cline-any cline-yes">1x</span>
2066
+ <span class="cline-any cline-yes">1x</span>
2067
+ <span class="cline-any cline-yes">1x</span>
2068
+ <span class="cline-any cline-yes">1x</span>
2069
+ <span class="cline-any cline-yes">1x</span>
2070
+ <span class="cline-any cline-yes">1x</span>
2071
+ <span class="cline-any cline-yes">1x</span>
2072
+ <span class="cline-any cline-yes">1x</span>
2073
+ <span class="cline-any cline-yes">1x</span>
2074
+ <span class="cline-any cline-yes">1x</span>
2075
+ <span class="cline-any cline-yes">1x</span>
2076
+ <span class="cline-any cline-yes">1x</span>
2077
+ <span class="cline-any cline-yes">1x</span>
2078
+ <span class="cline-any cline-yes">1x</span>
2079
+ <span class="cline-any cline-yes">1x</span>
2080
+ <span class="cline-any cline-yes">1x</span>
2081
+ <span class="cline-any cline-yes">1x</span>
2082
+ <span class="cline-any cline-yes">1x</span>
2083
+ <span class="cline-any cline-yes">1x</span>
2084
+ <span class="cline-any cline-yes">1x</span>
2085
+ <span class="cline-any cline-yes">1x</span>
2086
+ <span class="cline-any cline-yes">1x</span>
2087
+ <span class="cline-any cline-yes">1x</span>
2088
+ <span class="cline-any cline-yes">1x</span>
2089
+ <span class="cline-any cline-yes">1x</span>
2090
+ <span class="cline-any cline-yes">1x</span>
2091
+ <span class="cline-any cline-yes">1x</span>
2092
+ <span class="cline-any cline-yes">1x</span>
2093
+ <span class="cline-any cline-yes">1x</span>
2094
+ <span class="cline-any cline-yes">1x</span>
2095
+ <span class="cline-any cline-yes">1x</span>
2096
+ <span class="cline-any cline-yes">1x</span>
2097
+ <span class="cline-any cline-yes">1x</span>
2098
+ <span class="cline-any cline-yes">1x</span>
2099
+ <span class="cline-any cline-yes">1x</span>
2100
+ <span class="cline-any cline-yes">1x</span>
2101
+ <span class="cline-any cline-yes">1x</span>
2102
+ <span class="cline-any cline-yes">1x</span>
2103
+ <span class="cline-any cline-yes">1x</span>
2104
+ <span class="cline-any cline-yes">1x</span>
2105
+ <span class="cline-any cline-yes">1x</span>
2106
+ <span class="cline-any cline-yes">1x</span>
2107
+ <span class="cline-any cline-yes">1x</span>
2108
+ <span class="cline-any cline-yes">1x</span>
2109
+ <span class="cline-any cline-yes">1x</span>
2110
+ <span class="cline-any cline-yes">1x</span>
2111
+ <span class="cline-any cline-yes">1x</span>
2112
+ <span class="cline-any cline-yes">1x</span>
2113
+ <span class="cline-any cline-yes">1x</span>
2114
+ <span class="cline-any cline-yes">1x</span>
2115
+ <span class="cline-any cline-yes">1x</span>
2116
+ <span class="cline-any cline-yes">1x</span>
2117
+ <span class="cline-any cline-yes">1x</span>
2118
+ <span class="cline-any cline-yes">1x</span>
2119
+ <span class="cline-any cline-yes">1x</span>
2120
+ <span class="cline-any cline-yes">1x</span>
2121
+ <span class="cline-any cline-yes">1x</span>
2122
+ <span class="cline-any cline-yes">1x</span>
2123
+ <span class="cline-any cline-yes">1x</span>
2124
+ <span class="cline-any cline-yes">1x</span>
2125
+ <span class="cline-any cline-yes">1x</span>
2126
+ <span class="cline-any cline-yes">1x</span>
2127
+ <span class="cline-any cline-yes">1x</span>
2128
+ <span class="cline-any cline-yes">1x</span>
2129
+ <span class="cline-any cline-yes">1x</span>
2130
+ <span class="cline-any cline-yes">1x</span>
2131
+ <span class="cline-any cline-yes">1x</span>
2132
+ <span class="cline-any cline-yes">1x</span>
2133
+ <span class="cline-any cline-yes">1x</span>
2134
+ <span class="cline-any cline-yes">1x</span>
2135
+ <span class="cline-any cline-yes">1x</span>
2136
+ <span class="cline-any cline-yes">1x</span>
2137
+ <span class="cline-any cline-yes">1x</span>
2138
+ <span class="cline-any cline-yes">1x</span>
2139
+ <span class="cline-any cline-yes">1x</span>
2140
+ <span class="cline-any cline-yes">1x</span>
2141
+ <span class="cline-any cline-yes">1x</span>
2142
+ <span class="cline-any cline-yes">1x</span>
2143
+ <span class="cline-any cline-yes">1x</span>
2144
+ <span class="cline-any cline-yes">1x</span>
2145
+ <span class="cline-any cline-yes">1x</span>
2146
+ <span class="cline-any cline-yes">1x</span>
2147
+ <span class="cline-any cline-yes">1x</span>
2148
+ <span class="cline-any cline-yes">1x</span>
2149
+ <span class="cline-any cline-yes">1x</span>
2150
+ <span class="cline-any cline-yes">1x</span>
2151
+ <span class="cline-any cline-yes">1x</span>
2152
+ <span class="cline-any cline-yes">1x</span>
2153
+ <span class="cline-any cline-yes">1x</span>
2154
+ <span class="cline-any cline-yes">1x</span>
2155
+ <span class="cline-any cline-yes">1x</span>
2156
+ <span class="cline-any cline-yes">1x</span>
2157
+ <span class="cline-any cline-yes">1x</span>
2158
+ <span class="cline-any cline-yes">1x</span>
2159
+ <span class="cline-any cline-yes">1x</span>
2160
+ <span class="cline-any cline-yes">1x</span>
2161
+ <span class="cline-any cline-yes">1x</span>
2162
+ <span class="cline-any cline-yes">1x</span>
2163
+ <span class="cline-any cline-yes">1x</span>
2164
+ <span class="cline-any cline-yes">1x</span>
2165
+ <span class="cline-any cline-yes">1x</span>
2166
+ <span class="cline-any cline-yes">1x</span>
2167
+ <span class="cline-any cline-yes">1x</span>
2168
+ <span class="cline-any cline-yes">1x</span>
2169
+ <span class="cline-any cline-yes">1x</span>
2170
+ <span class="cline-any cline-yes">1x</span>
2171
+ <span class="cline-any cline-yes">1x</span>
2172
+ <span class="cline-any cline-yes">1x</span>
2173
+ <span class="cline-any cline-yes">1x</span>
2174
+ <span class="cline-any cline-yes">1x</span>
2175
+ <span class="cline-any cline-yes">1x</span>
2176
+ <span class="cline-any cline-yes">1x</span>
2177
+ <span class="cline-any cline-yes">1x</span>
2178
+ <span class="cline-any cline-yes">1x</span>
2179
+ <span class="cline-any cline-yes">1x</span>
2180
+ <span class="cline-any cline-yes">1x</span>
2181
+ <span class="cline-any cline-yes">1x</span>
2182
+ <span class="cline-any cline-yes">1x</span>
2183
+ <span class="cline-any cline-yes">1x</span>
2184
+ <span class="cline-any cline-yes">1x</span>
2185
+ <span class="cline-any cline-yes">1x</span>
2186
+ <span class="cline-any cline-yes">1x</span>
2187
+ <span class="cline-any cline-yes">1x</span>
2188
+ <span class="cline-any cline-yes">1x</span>
2189
+ <span class="cline-any cline-yes">1x</span>
2190
+ <span class="cline-any cline-yes">1x</span>
2191
+ <span class="cline-any cline-yes">1x</span>
2192
+ <span class="cline-any cline-yes">1x</span>
2193
+ <span class="cline-any cline-yes">1x</span>
2194
+ <span class="cline-any cline-yes">1x</span>
2195
+ <span class="cline-any cline-yes">1x</span>
2196
+ <span class="cline-any cline-yes">1x</span>
2197
+ <span class="cline-any cline-yes">1x</span>
2198
+ <span class="cline-any cline-yes">1x</span>
2199
+ <span class="cline-any cline-yes">1x</span>
2200
+ <span class="cline-any cline-yes">1x</span>
2201
+ <span class="cline-any cline-yes">1x</span>
2202
+ <span class="cline-any cline-yes">1x</span>
2203
+ <span class="cline-any cline-yes">1x</span>
2204
+ <span class="cline-any cline-yes">1x</span>
2205
+ <span class="cline-any cline-yes">1x</span>
2206
+ <span class="cline-any cline-yes">1x</span>
2207
+ <span class="cline-any cline-yes">1x</span>
2208
+ <span class="cline-any cline-yes">1x</span>
2209
+ <span class="cline-any cline-yes">1x</span>
2210
+ <span class="cline-any cline-yes">1x</span>
2211
+ <span class="cline-any cline-yes">1x</span>
2212
+ <span class="cline-any cline-yes">1x</span>
2213
+ <span class="cline-any cline-yes">1x</span>
2214
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const assert = require("assert"),
2215
+ fs = require("fs"),
2216
+ nodeResolve = require("resolve"),
2217
+ path = require("path"),
2218
+ sinon = require("sinon");
2219
+ &nbsp;
2220
+ const validateConfig = require("../../lib/validate_config");
2221
+ &nbsp;
2222
+ describe("validate_config", function() {
2223
+ let temp_directory;
2224
+ before(async function() {
2225
+ const { temporaryDirectory } = await import("tempy");
2226
+ temp_directory = temporaryDirectory();
2227
+ fs.mkdirSync(path.join(temp_directory, "data"));
2228
+ fs.openSync(path.join(temp_directory, "data", "Foo.csv"), "w");
2229
+ });
2230
+ &nbsp;
2231
+ function expectFailure(config, expected_message) {
2232
+ try {
2233
+ validateConfig(config, temp_directory);
2234
+ }
2235
+ catch (e) {
2236
+ assert.equal(e.message, expected_message);
2237
+ return;
2238
+ }
2239
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > assert.fail(`Got no error; expected “${expected_message}”`);</span></span>
2240
+ }
2241
+ &nbsp;
2242
+ function expectSuccess(config) {
2243
+ validateConfig(config, temp_directory);
2244
+ }
2245
+ &nbsp;
2246
+ const id = "best-template",
2247
+ name = "Best template",
2248
+ author = "Robin Houston",
2249
+ sdk_version = 3;
2250
+ &nbsp;
2251
+ const metadata = { id, name, author, sdk_version };
2252
+ const binding = { name: "My binding", dataset: "dataset", key: "key", type: "column", column: "Foo::A" };
2253
+ const setting_foo = { name: "Foo", property: "foo", type: "string" };
2254
+ const setting_bar = { name: "Bar", property: "bar", type: "string" };
2255
+ &nbsp;
2256
+ function metadataPlus(o) {
2257
+ return Object.assign({}, metadata, o);
2258
+ }
2259
+ &nbsp;
2260
+ function bindingPlus(o) {
2261
+ return metadataPlus({ data: [Object.assign({}, binding, o)] });
2262
+ }
2263
+ &nbsp;
2264
+ function settingPlus(o, other, more_settings=[]) {
2265
+ return metadataPlus(Object.assign({ settings: [Object.assign({}, setting_foo, o), setting_bar].concat(more_settings) }, other));
2266
+ }
2267
+ &nbsp;
2268
+ function testBoolean(name) {
2269
+ return function() {
2270
+ it(`should accept ${name}=true`, function() {
2271
+ expectSuccess(
2272
+ metadataPlus({ [name]: true }),
2273
+ );
2274
+ });
2275
+ it(`should accept ${name}=false`, function() {
2276
+ expectSuccess(
2277
+ metadataPlus({ [name]: false }),
2278
+ );
2279
+ });
2280
+ it(`should reject ${name}=null`, function() {
2281
+ expectFailure(
2282
+ metadataPlus({ [name]: null }),
2283
+ `template.yml: Bad ${name} setting; must be either true or false`,
2284
+ );
2285
+ });
2286
+ it(`should reject ${name}=undefined`, function() {
2287
+ expectFailure(
2288
+ metadataPlus({ [name]: undefined }),
2289
+ `template.yml: Bad ${name} setting; must be either true or false`,
2290
+ );
2291
+ });
2292
+ it(`should reject strings for ${name}`, function() {
2293
+ expectFailure(
2294
+ metadataPlus({ [name]: "false" }),
2295
+ `template.yml: Bad ${name} setting; must be either true or false`,
2296
+ );
2297
+ });
2298
+ it(`should reject numbers for ${name}`, function() {
2299
+ expectFailure(
2300
+ metadataPlus({ [name]: 1 }),
2301
+ `template.yml: Bad ${name} setting; must be either true or false`,
2302
+ );
2303
+ });
2304
+ it(`should reject objects for ${name}`, function() {
2305
+ expectFailure(
2306
+ metadataPlus({ [name]: {} }),
2307
+ `template.yml: Bad ${name} setting; must be either true or false`,
2308
+ );
2309
+ });
2310
+ };
2311
+ }
2312
+ &nbsp;
2313
+ function testObject(name, expected_error_message) {
2314
+ return function() {
2315
+ <span class="cstat-no" title="statement not covered" > it(`should reject ${name}=true`, function() {</span>
2316
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2317
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: true }),</span>
2318
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2319
+ <span class="cstat-no" title="statement not covered" > );</span>
2320
+ <span class="cstat-no" title="statement not covered" > });</span>
2321
+ <span class="cstat-no" title="statement not covered" > it(`should reject ${name}=false`, function() {</span>
2322
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2323
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: false }),</span>
2324
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2325
+ <span class="cstat-no" title="statement not covered" > );</span>
2326
+ <span class="cstat-no" title="statement not covered" > });</span>
2327
+ <span class="cstat-no" title="statement not covered" > it(`should reject ${name}=null`, function() {</span>
2328
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2329
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: null }),</span>
2330
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2331
+ <span class="cstat-no" title="statement not covered" > );</span>
2332
+ <span class="cstat-no" title="statement not covered" > });</span>
2333
+ <span class="cstat-no" title="statement not covered" > it(`should reject ${name}=undefined`, function() {</span>
2334
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2335
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: undefined }),</span>
2336
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2337
+ <span class="cstat-no" title="statement not covered" > );</span>
2338
+ <span class="cstat-no" title="statement not covered" > });</span>
2339
+ <span class="cstat-no" title="statement not covered" > it(`should reject strings for ${name}`, function() {</span>
2340
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2341
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: "false" }),</span>
2342
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2343
+ <span class="cstat-no" title="statement not covered" > );</span>
2344
+ <span class="cstat-no" title="statement not covered" > });</span>
2345
+ <span class="cstat-no" title="statement not covered" > it(`should reject numbers for ${name}`, function() {</span>
2346
+ <span class="cstat-no" title="statement not covered" > expectFailure(</span>
2347
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: 1 }),</span>
2348
+ <span class="cstat-no" title="statement not covered" > expected_error_message,</span>
2349
+ <span class="cstat-no" title="statement not covered" > );</span>
2350
+ <span class="cstat-no" title="statement not covered" > });</span>
2351
+ <span class="cstat-no" title="statement not covered" > it(`should accept objects for ${name}`, function() {</span>
2352
+ <span class="cstat-no" title="statement not covered" > expectSuccess(</span>
2353
+ <span class="cstat-no" title="statement not covered" > metadataPlus({ [name]: {} }),</span>
2354
+ <span class="cstat-no" title="statement not covered" > );</span>
2355
+ <span class="cstat-no" title="statement not covered" > });</span>
2356
+ };
2357
+ }
2358
+ &nbsp;
2359
+ describe("top level", function() {
2360
+ it("should reject null", function() {
2361
+ expectFailure(null, "template.yml must define a mapping");
2362
+ });
2363
+ it("should reject undefined", function() {
2364
+ expectFailure(undefined, "template.yml must define a mapping");
2365
+ });
2366
+ it("should reject a number", function() {
2367
+ expectFailure(23, "template.yml must define a mapping");
2368
+ });
2369
+ it("should reject a string", function() {
2370
+ expectFailure("foo", "template.yml must define a mapping");
2371
+ });
2372
+ it("should reject an array", function() {
2373
+ expectFailure([], "template.yml must define a mapping");
2374
+ });
2375
+ it("should reject true", function() {
2376
+ expectFailure(true, "template.yml must define a mapping");
2377
+ });
2378
+ it("should reject false", function() {
2379
+ expectFailure(false, "template.yml must define a mapping");
2380
+ });
2381
+ });
2382
+ &nbsp;
2383
+ describe("metadata", function() {
2384
+ it("should require id", function() {
2385
+ expectFailure(
2386
+ { name, author, sdk_version },
2387
+ "template.yml must specify an id:",
2388
+ );
2389
+ });
2390
+ &nbsp;
2391
+ it("should require name", function() {
2392
+ expectFailure(
2393
+ { id, author, sdk_version },
2394
+ "template.yml must specify a name:",
2395
+ );
2396
+ });
2397
+ &nbsp;
2398
+ it("should require author", function() {
2399
+ expectFailure(
2400
+ { id, name, sdk_version },
2401
+ "template.yml must specify an author:",
2402
+ );
2403
+ });
2404
+ &nbsp;
2405
+ it("should require sdk_version", function() {
2406
+ expectFailure(
2407
+ { id, name, author },
2408
+ "template.yml must specify an sdk_version:",
2409
+ );
2410
+ });
2411
+ &nbsp;
2412
+ // The SDK version number is checked separately, by the checkTemplateVersion function
2413
+ // in lib/sdk.js, which is called on build.
2414
+ });
2415
+ &nbsp;
2416
+ describe("is_master_slide", testBoolean("is_master_slide"));
2417
+ &nbsp;
2418
+ describe("credits", function() {
2419
+ it("should accept string credits", function() {
2420
+ expectSuccess(metadataPlus({ credits: "" }));
2421
+ expectSuccess(metadataPlus({ credits: "Credits here" }));
2422
+ });
2423
+ it("should reject null credits", function() {
2424
+ expectFailure(metadataPlus({ credits: null }), "template.yml: Credits must be a string");
2425
+ });
2426
+ it("should reject undefined credits", function() {
2427
+ expectFailure(metadataPlus({ credits: undefined }), "template.yml: Credits must be a string");
2428
+ });
2429
+ it("should reject numeric credits", function() {
2430
+ expectFailure(metadataPlus({ credits: 23 }), "template.yml: Credits must be a string");
2431
+ });
2432
+ it("should reject a credits object", function() {
2433
+ expectFailure(metadataPlus({ credits: {} }), "template.yml: Credits must be a string");
2434
+ });
2435
+ it("should reject a credits array", function() {
2436
+ expectFailure(metadataPlus({ credits: [] }), "template.yml: Credits must be a string");
2437
+ });
2438
+ });
2439
+ &nbsp;
2440
+ describe("autoheight", function() {
2441
+ it("should reject autoheight", function() {
2442
+ expectFailure(metadataPlus({ autoheight: "*" }),
2443
+ "template.yml: autoheight is no longer supported. You can use `Flourish.setHeight()` to dynamically adjust the height, if needed.");
2444
+ });
2445
+ });
2446
+ &nbsp;
2447
+ describe("image_download", testBoolean("image_download"));
2448
+ &nbsp;
2449
+ describe("svg_download", testBoolean("svg_download"));
2450
+ &nbsp;
2451
+ describe("build rules", function() {
2452
+ testObject("build_rules", "template.yml “build” must be a mapping");
2453
+ it("should reject null", function() {
2454
+ expectFailure(metadataPlus({ build: { foo: null } }),
2455
+ "template.yml: build rule “foo” is null");
2456
+ });
2457
+ it("should reject undefined", function() {
2458
+ expectFailure(metadataPlus({ build: { foo: undefined } }),
2459
+ "template.yml: build rule “foo” is null");
2460
+ });
2461
+ it("should reject arrays", function() {
2462
+ expectFailure(metadataPlus({ build: { foo: [] } }),
2463
+ "template.yml: build rule “foo” must be a mapping");
2464
+ });
2465
+ it("should reject numbers", function() {
2466
+ expectFailure(metadataPlus({ build: { foo: 23 } }),
2467
+ "template.yml: build rule “foo” must be a mapping");
2468
+ });
2469
+ it("should reject true", function() {
2470
+ expectFailure(metadataPlus({ build: { foo: true } }),
2471
+ "template.yml: build rule “foo” must be a mapping");
2472
+ });
2473
+ it("should reject false", function() {
2474
+ expectFailure(metadataPlus({ build: { foo: false } }),
2475
+ "template.yml: build rule “foo” must be a mapping");
2476
+ });
2477
+ &nbsp;
2478
+ it("should expect a script", function() {
2479
+ expectFailure(metadataPlus({ build: { foo: { } } }),
2480
+ "template.yml: build rule “foo” has no “script”");
2481
+ });
2482
+ it("should reject a null script", function() {
2483
+ expectFailure(metadataPlus({ build: { foo: { script: null } } }),
2484
+ "template.yml: build.foo.script must be a string");
2485
+ });
2486
+ it("should reject a numeric script", function() {
2487
+ expectFailure(metadataPlus({ build: { foo: { script: 23 } } }),
2488
+ "template.yml: build.foo.script must be a string");
2489
+ });
2490
+ it("should reject a true script", function() {
2491
+ expectFailure(metadataPlus({ build: { foo: { script: true } } }),
2492
+ "template.yml: build.foo.script must be a string");
2493
+ });
2494
+ it("should reject a false script", function() {
2495
+ expectFailure(metadataPlus({ build: { foo: { script: false } } }),
2496
+ "template.yml: build.foo.script must be a string");
2497
+ });
2498
+ &nbsp;
2499
+ it("should expect directory, files or watch", function() {
2500
+ expectFailure(metadataPlus({ build: { foo: { script: "" } } }),
2501
+ "template.yml: build rule “foo” has no “directory”, “files” or “watch”");
2502
+ });
2503
+ it("should accept a directory alone", function() {
2504
+ expectSuccess(metadataPlus({ build: { foo: { script: "", directory: "." } } }));
2505
+ });
2506
+ it("should accept a files array alone", function() {
2507
+ expectSuccess(metadataPlus({ build: { foo: { script: "", files: [] } } }));
2508
+ });
2509
+ it("should accept a watch command alone", function() {
2510
+ expectSuccess(metadataPlus({ build: { foo: { script: "", watch: "" } } }));
2511
+ });
2512
+ it("should reject a watch command and a directory", function() {
2513
+ expectFailure(metadataPlus({ build: { foo: { script: "", watch: "", directory: "" } } }),
2514
+ "template.yml: build rule “foo” has both “watch” and “directory”");
2515
+ });
2516
+ it("should reject a watch command and a list of files", function() {
2517
+ expectFailure(metadataPlus({ build: { foo: { script: "", watch: "", files: [""] } } }),
2518
+ "template.yml: build rule “foo” has both “watch” and files");
2519
+ });
2520
+ it("should reject null files", function() {
2521
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: null } } }),
2522
+ "template.yml: “build.foo.files” must be an array");
2523
+ });
2524
+ it("should reject numeric files", function() {
2525
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: 23 } } }),
2526
+ "template.yml: “build.foo.files” must be an array");
2527
+ });
2528
+ it("should reject true files", function() {
2529
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: true } } }),
2530
+ "template.yml: “build.foo.files” must be an array");
2531
+ });
2532
+ it("should reject false files", function() {
2533
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: false } } }),
2534
+ "template.yml: “build.foo.files” must be an array");
2535
+ });
2536
+ it("should reject a files object", function() {
2537
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: {} } } }),
2538
+ "template.yml: “build.foo.files” must be an array");
2539
+ });
2540
+ it("should reject a null file", function() {
2541
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: [null] } } }),
2542
+ "template.yml: the entries of “build.foo.files” must be strings");
2543
+ });
2544
+ it("should reject an undefined file", function() {
2545
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: [undefined] } } }),
2546
+ "template.yml: the entries of “build.foo.files” must be strings");
2547
+ });
2548
+ it("should reject a numeric file", function() {
2549
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: [23] } } }),
2550
+ "template.yml: the entries of “build.foo.files” must be strings");
2551
+ });
2552
+ it("should reject a true file", function() {
2553
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: [true] } } }),
2554
+ "template.yml: the entries of “build.foo.files” must be strings");
2555
+ });
2556
+ it("should reject a false file", function() {
2557
+ expectFailure(metadataPlus({ build: { foo: { script: "", files: [false] } } }),
2558
+ "template.yml: the entries of “build.foo.files” must be strings");
2559
+ });
2560
+ it("should accept a string file", function() {
2561
+ expectSuccess(metadataPlus({ build: { foo: { script: "", files: [""] } } }));
2562
+ });
2563
+ it("should accept two strings", function() {
2564
+ expectSuccess(metadataPlus({ build: { foo: { script: "", files: ["one", "two"] } } }));
2565
+ });
2566
+ &nbsp;
2567
+ it("should reject a null directory", function() {
2568
+ expectFailure(metadataPlus({ build: { foo: { script: "", directory: null } } }),
2569
+ "template.yml: “build.foo.directory” must be a string");
2570
+ });
2571
+ it("should reject an undefined directory", function() {
2572
+ expectFailure(metadataPlus({ build: { foo: { script: "", directory: undefined } } }),
2573
+ "template.yml: “build.foo.directory” must be a string");
2574
+ });
2575
+ it("should reject a numeric directory", function() {
2576
+ expectFailure(metadataPlus({ build: { foo: { script: "", directory: 23 } } }),
2577
+ "template.yml: “build.foo.directory” must be a string");
2578
+ });
2579
+ it("should reject a true directory", function() {
2580
+ expectFailure(metadataPlus({ build: { foo: { script: "", directory: true } } }),
2581
+ "template.yml: “build.foo.directory” must be a string");
2582
+ });
2583
+ it("should reject a false directory", function() {
2584
+ expectFailure(metadataPlus({ build: { foo: { script: "", directory: false } } }),
2585
+ "template.yml: “build.foo.directory” must be a string");
2586
+ });
2587
+ it("should accept a string directory", function() {
2588
+ expectSuccess(metadataPlus({ build: { foo: { script: "", directory: "" } } }));
2589
+ });
2590
+ });
2591
+ &nbsp;
2592
+ describe("data bindings", function() {
2593
+ it("should accept null", function() {
2594
+ expectSuccess(metadataPlus({ data: null }));
2595
+ });
2596
+ it("should reject a number", function() {
2597
+ expectFailure(metadataPlus({ data: 23 }),
2598
+ "template.yml: “data” must be an array");
2599
+ });
2600
+ it("should reject a string", function() {
2601
+ expectFailure(metadataPlus({ data: "bar" }),
2602
+ "template.yml: “data” must be an array");
2603
+ });
2604
+ it("should reject true", function() {
2605
+ expectFailure(metadataPlus({ data: true }),
2606
+ "template.yml: “data” must be an array");
2607
+ });
2608
+ it("should reject false", function() {
2609
+ expectFailure(metadataPlus({ data: false }),
2610
+ "template.yml: “data” must be an array");
2611
+ });
2612
+ it("should reject an object", function() {
2613
+ expectFailure(metadataPlus({ data: {} }),
2614
+ "template.yml: “data” must be an array");
2615
+ });
2616
+ it("should accept an empty array", function() {
2617
+ expectSuccess(metadataPlus({ data: [] }));
2618
+ });
2619
+ &nbsp;
2620
+ const name = binding.name,
2621
+ dataset = binding.dataset,
2622
+ key = binding.key,
2623
+ type = binding.type;
2624
+ &nbsp;
2625
+ it("should require name", function() {
2626
+ expectFailure(metadataPlus({ data: [{ dataset, key, type }] }),
2627
+ "template.yml data binding must specify a name");
2628
+ });
2629
+ it("should require dataset", function() {
2630
+ expectFailure(metadataPlus({ data: [{ name, key, type }] }),
2631
+ "template.yml data binding “My binding” must specify a dataset");
2632
+ });
2633
+ it("should require key", function() {
2634
+ expectFailure(metadataPlus({ data: [{ name, dataset, type }] }),
2635
+ "template.yml data binding “My binding” must specify a key");
2636
+ });
2637
+ it("should require type", function() {
2638
+ expectFailure(metadataPlus({ data: [{ name, dataset, key }] }),
2639
+ "template.yml data binding “My binding” must specify a type");
2640
+ });
2641
+ it("should require column for non-optional column bindings", function() {
2642
+ expectFailure(metadataPlus({ data: [{ name, dataset, key, type }] }),
2643
+ "template.yml non-optional data binding “My binding” must specify column");
2644
+ });
2645
+ it("should accept name/dataset/key/type=column/column", function() {
2646
+ expectSuccess(bindingPlus());
2647
+ });
2648
+ it("should reject non-existent data tables", function() {
2649
+ expectFailure(bindingPlus({ column: "NoSuchTable::A" }),
2650
+ "template.yml: data binding refers to “NoSuchTable::A”, but data file does not exist");
2651
+ });
2652
+ it("should reject multiple columns", function() {
2653
+ expectFailure(bindingPlus({ column: "Foo::A,B" }),
2654
+ "You can only select one column");
2655
+ });
2656
+ it("should reject no columns if non-optional", function() {
2657
+ expectFailure(bindingPlus({ column: "Foo::" }), "Non-optional data binding must specify column");
2658
+ });
2659
+ it("should accept no columns if optional", function() {
2660
+ expectSuccess(bindingPlus({ column: "Foo::", optional: true }));
2661
+ });
2662
+ &nbsp;
2663
+ it("should reject a null column", function() {
2664
+ expectFailure(bindingPlus({ column: null }),
2665
+ "template.yml: “column” property of data binding “My binding” must be a string");
2666
+ });
2667
+ it("should reject an undefined column", function() {
2668
+ expectFailure(bindingPlus({ column: undefined }),
2669
+ "template.yml: “column” property of data binding “My binding” must be a string");
2670
+ });
2671
+ it("should reject a numeric column", function() {
2672
+ expectFailure(bindingPlus({ column: 23 }),
2673
+ "template.yml: “column” property of data binding “My binding” must be a string");
2674
+ });
2675
+ it("should reject an object column", function() {
2676
+ expectFailure(bindingPlus({ column: {} }),
2677
+ "template.yml: “column” property of data binding “My binding” must be a string");
2678
+ });
2679
+ it("should reject a true column", function() {
2680
+ expectFailure(bindingPlus({ column: true }),
2681
+ "template.yml: “column” property of data binding “My binding” must be a string");
2682
+ });
2683
+ it("should reject a false column", function() {
2684
+ expectFailure(bindingPlus({ column: false }),
2685
+ "template.yml: “column” property of data binding “My binding” must be a string");
2686
+ });
2687
+ &nbsp;
2688
+ it("should reject a null columns", function() {
2689
+ expectFailure(bindingPlus({ type: "columns", columns: null }),
2690
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2691
+ });
2692
+ it("should reject an undefined columns", function() {
2693
+ expectFailure(bindingPlus({ type: "columns", columns: undefined }),
2694
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2695
+ });
2696
+ it("should reject a numeric columns", function() {
2697
+ expectFailure(bindingPlus({ type: "columns", columns: 23 }),
2698
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2699
+ });
2700
+ it("should reject an object columns", function() {
2701
+ expectFailure(bindingPlus({ type: "columns", columns: {} }),
2702
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2703
+ });
2704
+ it("should reject a true columns", function() {
2705
+ expectFailure(bindingPlus({ type: "columns", columns: true }),
2706
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2707
+ });
2708
+ it("should reject a false columns", function() {
2709
+ expectFailure(bindingPlus({ type: "columns", columns: false }),
2710
+ "template.yml: “columns” property of data binding “My binding” must be a string");
2711
+ });
2712
+ &nbsp;
2713
+ it("should reject null for “optional”", function() {
2714
+ expectFailure(bindingPlus({ optional: null }),
2715
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2716
+ });
2717
+ it("should reject undefined for “optional”", function() {
2718
+ expectFailure(bindingPlus({ optional: undefined }),
2719
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2720
+ });
2721
+ it("should reject numbers for “optional”", function() {
2722
+ expectFailure(bindingPlus({ optional: 123 }),
2723
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2724
+ });
2725
+ it("should reject strings for “optional”", function() {
2726
+ expectFailure(bindingPlus({ optional: "bar" }),
2727
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2728
+ });
2729
+ it("should reject objects for “optional”", function() {
2730
+ expectFailure(bindingPlus({ optional: {} }),
2731
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2732
+ });
2733
+ it("should reject arrays for “optional”", function() {
2734
+ expectFailure(bindingPlus({ optional: [] }),
2735
+ "template.yml “optional” property of data binding “My binding” must be a boolean");
2736
+ });
2737
+ it("should accept true for “optional”", function() {
2738
+ expectSuccess(bindingPlus({ optional: true }));
2739
+ });
2740
+ it("should accept false for “optional”", function() {
2741
+ expectSuccess(bindingPlus({ optional: false }));
2742
+ });
2743
+ it("should require column if optional is false", function() {
2744
+ expectFailure(metadataPlus({ data: [{ name, dataset, key, type, optional: false }] }),
2745
+ "template.yml non-optional data binding “My binding” must specify column");
2746
+ });
2747
+ &nbsp;
2748
+ it("should reject duplicates", function() {
2749
+ expectFailure(metadataPlus({ data: [binding, binding] }),
2750
+ "template.yml: there is more than one data binding with dataset “dataset” and key “key”");
2751
+ });
2752
+ &nbsp;
2753
+ it("should ignore headings", function() {
2754
+ expectSuccess(metadataPlus({ data: ["Heading", binding] }));
2755
+ });
2756
+ });
2757
+ &nbsp;
2758
+ describe("settings", function() {
2759
+ it("should accept null", function() {
2760
+ expectSuccess(metadataPlus({ settings: null }));
2761
+ });
2762
+ it("should reject a number", function() {
2763
+ expectFailure(metadataPlus({ settings: 23 }),
2764
+ "template.yml: “settings” must be an array");
2765
+ });
2766
+ it("should reject a string", function() {
2767
+ expectFailure(metadataPlus({ settings: "bar" }),
2768
+ "template.yml: “settings” must be an array");
2769
+ });
2770
+ it("should reject true", function() {
2771
+ expectFailure(metadataPlus({ settings: true }),
2772
+ "template.yml: “settings” must be an array");
2773
+ });
2774
+ it("should reject false", function() {
2775
+ expectFailure(metadataPlus({ settings: false }),
2776
+ "template.yml: “settings” must be an array");
2777
+ });
2778
+ it("should reject an object", function() {
2779
+ expectFailure(metadataPlus({ settings: {} }),
2780
+ "template.yml: “settings” must be an array");
2781
+ });
2782
+ it("should accept an empty array", function() {
2783
+ expectSuccess(metadataPlus({ settings: [] }));
2784
+ });
2785
+ &nbsp;
2786
+ it("should require property", function() {
2787
+ expectFailure(metadataPlus({ settings: [{ name: "Foo", type: "string" }] }),
2788
+ "template.yml setting must specify a property:");
2789
+ });
2790
+ it("should require type", function() {
2791
+ expectFailure(metadataPlus({ settings: [{ name: "Foo", property: "foo" }] }),
2792
+ "template.yml setting “foo” must specify a type:");
2793
+ });
2794
+ it("should require name", function() {
2795
+ expectFailure(metadataPlus({ settings: [{ property: "foo", type: "string" }] }),
2796
+ "template.yml setting “foo” must specify a name:");
2797
+ });
2798
+ it("should not require name if choices are specified", function() {
2799
+ expectSuccess(metadataPlus({ settings: [{ property: "foo", type: "string", choices: [] }] }));
2800
+ });
2801
+ &nbsp;
2802
+ describe("optional settings", function() {
2803
+ it("should not support optional strings", function() {
2804
+ expectFailure(settingPlus({ optional: true }),
2805
+ "The “optional” property is only supported for “number”, “color” and “font” type settings");
2806
+ });
2807
+ it("should not support optional booleans", function() {
2808
+ expectFailure(settingPlus({ type: "boolean", optional: true }),
2809
+ "The “optional” property is only supported for “number”, “color” and “font” type settings");
2810
+ });
2811
+ it("should support optional numbers", function() {
2812
+ expectSuccess(settingPlus({ type: "number", optional: true }));
2813
+ });
2814
+ it("should support optional fonts", function() {
2815
+ expectSuccess(settingPlus({ type: "font", optional: true }));
2816
+ });
2817
+ it("should support non-optional numbers", function() {
2818
+ expectSuccess(settingPlus({ type: "number", optional: false }));
2819
+ });
2820
+ &nbsp;
2821
+ it("should not recognise optional: null", function() {
2822
+ expectFailure(settingPlus({ type: "number", optional: null }),
2823
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2824
+ });
2825
+ it("should not recognise optional: undefined", function() {
2826
+ expectFailure(settingPlus({ type: "number", optional: undefined }),
2827
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2828
+ });
2829
+ it("should not recognise optional: 23", function() {
2830
+ expectFailure(settingPlus({ type: "number", optional: 23 }),
2831
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2832
+ });
2833
+ it("should not recognise optional: \"bar\"", function() {
2834
+ expectFailure(settingPlus({ type: "number", optional: "bar" }),
2835
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2836
+ });
2837
+ it("should not recognise optional: []", function() {
2838
+ expectFailure(settingPlus({ type: "number", optional: [] }),
2839
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2840
+ });
2841
+ it("should not recognise optional: {}", function() {
2842
+ expectFailure(settingPlus({ type: "number", optional: {} }),
2843
+ "template.yml setting “foo” has an invalid value for “optional”: should be true or false");
2844
+ });
2845
+ });
2846
+ &nbsp;
2847
+ describe("choices", function() {
2848
+ it("should not support choices for a number setting", function() {
2849
+ expectFailure(settingPlus({ type: "number", choices: [] }),
2850
+ "template.yml setting “foo” has a “choices” field, but is of type number");
2851
+ });
2852
+ it("should support choices for a string setting", function() {
2853
+ expectSuccess(settingPlus({ choices: [] }));
2854
+ });
2855
+ it("should not support choices_other without choices", function() {
2856
+ expectFailure(settingPlus({ choices_other: true }),
2857
+ "template.yml setting “foo” has a “choices_other” field, but no choices:");
2858
+ });
2859
+ it("should support choices_other with choices", function() {
2860
+ expectSuccess(settingPlus({ choices: [], choices_other: true }));
2861
+ });
2862
+ it("should not support choices_other: null", function() {
2863
+ expectFailure(settingPlus({ choices: [], choices_other: null }),
2864
+ "template.yml setting “foo” has invalid value for “choices_other”: should be boolean");
2865
+ });
2866
+ it("should not support choices_other: 23", function() {
2867
+ expectFailure(settingPlus({ choices: [], choices_other: 23 }),
2868
+ "template.yml setting “foo” has invalid value for “choices_other”: should be boolean");
2869
+ });
2870
+ it("should not support choices_other: \"bar\"", function() {
2871
+ expectFailure(settingPlus({ choices: [], choices_other: "bar" }),
2872
+ "template.yml setting “foo” has invalid value for “choices_other”: should be boolean");
2873
+ });
2874
+ it("should not support choices_other: []", function() {
2875
+ expectFailure(settingPlus({ choices: [], choices_other: [] }),
2876
+ "template.yml setting “foo” has invalid value for “choices_other”: should be boolean");
2877
+ });
2878
+ it("should not support choices_other: {}", function() {
2879
+ expectFailure(settingPlus({ choices: [], choices_other: {} }),
2880
+ "template.yml setting “foo” has invalid value for “choices_other”: should be boolean");
2881
+ });
2882
+ &nbsp;
2883
+ it("should support a string array", function() {
2884
+ expectSuccess(settingPlus({ choices: ["a", "b", "c"] }));
2885
+ });
2886
+ it("should reject a string array if type is not string", function() {
2887
+ expectFailure(settingPlus({ type: "boolean", choices: ["a", "b", "c"] }),
2888
+ "template.yml setting “foo” has a “choices” field with a string element, but is of type boolean");
2889
+ });
2890
+ &nbsp;
2891
+ it("should support pairs", function() {
2892
+ expectSuccess(settingPlus({ choices: [
2893
+ ["A", "a"],
2894
+ ["A", "b"],
2895
+ ["A", "c"],
2896
+ ] }));
2897
+ });
2898
+ it("should reject singletons", function() {
2899
+ expectFailure(settingPlus({ choices: [
2900
+ ["A", "a"],
2901
+ ["b"],
2902
+ ["A", "c"],
2903
+ ] }),
2904
+ "template.yml setting “foo”: element 1 of “choices” field has 1 elements (should be 2)");
2905
+ });
2906
+ it("should reject numbers for a string setting", function() {
2907
+ expectFailure(settingPlus({ choices: [
2908
+ ["A", "a"],
2909
+ ["B", 23],
2910
+ ["A", "c"],
2911
+ ] }),
2912
+ "template.yml setting “foo”: second entry of element 1 of “choices” field is not a string");
2913
+ });
2914
+ it("should reject true for a string setting", function() {
2915
+ expectFailure(settingPlus({ choices: [
2916
+ ["A", "a"],
2917
+ ["B", true],
2918
+ ["A", "c"],
2919
+ ] }),
2920
+ "template.yml setting “foo”: second entry of element 1 of “choices” field is not a string");
2921
+ });
2922
+ it("should reject false for a string setting", function() {
2923
+ expectFailure(settingPlus({ choices: [
2924
+ ["A", "a"],
2925
+ ["B", false],
2926
+ ["A", "c"],
2927
+ ] }),
2928
+ "template.yml setting “foo”: second entry of element 1 of “choices” field is not a string");
2929
+ });
2930
+ it("should reject null for a string setting", function() {
2931
+ expectFailure(settingPlus({ choices: [
2932
+ ["A", "a"],
2933
+ ["B", null],
2934
+ ["A", "c"],
2935
+ ] }),
2936
+ "template.yml setting “foo”: second entry of element 1 of “choices” field is not a string");
2937
+ });
2938
+ it("should support triples", function() {
2939
+ expectSuccess(settingPlus({ choices: [
2940
+ ["A", "a"],
2941
+ ["A", "b", "b_image.png"],
2942
+ ["A", "c"],
2943
+ ] }));
2944
+ });
2945
+ describe("boolean choices", function() {
2946
+ it("should support boolean pairs", function() {
2947
+ expectSuccess(settingPlus({ type: "boolean", choices: [
2948
+ ["A", true],
2949
+ ["A", false],
2950
+ ] }));
2951
+ });
2952
+ it("should support boolean pairs the other way round", function() {
2953
+ expectSuccess(settingPlus({ type: "boolean", choices: [
2954
+ ["A", false],
2955
+ ["A", true],
2956
+ ] }));
2957
+ });
2958
+ it("should reject an empty list", function() {
2959
+ expectFailure(settingPlus({ type: "boolean", choices: [] }),
2960
+ "template.yml setting “foo”: “choices” field for boolean property can only contain one “false” and one “true” option");
2961
+ });
2962
+ it("should reject true alone", function() {
2963
+ expectFailure(settingPlus({ type: "boolean", choices: [
2964
+ ["A", true],
2965
+ ] }),
2966
+ "template.yml setting “foo”: “choices” field for boolean property can only contain one “false” and one “true” option");
2967
+ });
2968
+ it("should reject false alone", function() {
2969
+ expectFailure(settingPlus({ type: "boolean", choices: [
2970
+ ["A", false],
2971
+ ] }),
2972
+ "template.yml setting “foo”: “choices” field for boolean property can only contain one “false” and one “true” option");
2973
+ });
2974
+ it("should reject repetitions", function() {
2975
+ expectFailure(settingPlus({ type: "boolean", choices: [
2976
+ ["A", true],
2977
+ ["B", true],
2978
+ ["C", false],
2979
+ ] }),
2980
+ "template.yml setting “foo”: “choices” field for boolean property can only contain one “false” and one “true” option");
2981
+ });
2982
+ });
2983
+ });
2984
+ &nbsp;
2985
+ describe("show_if / hide_if", function() {
2986
+ it("should permit a reference to another setting (show_if)", function() {
2987
+ expectSuccess(settingPlus({ show_if: "bar" }));
2988
+ });
2989
+ it("should permit a reference to another setting (hide_if)", function() {
2990
+ expectSuccess(settingPlus({ hide_if: "bar" }));
2991
+ });
2992
+ &nbsp;
2993
+ it("should forbid a reference to itself (show_if shortform)", function() {
2994
+ expectFailure(settingPlus({ show_if: "foo" }),
2995
+ "template.yml setting “foo” cannot be conditional on itself");
2996
+ });
2997
+ it("should forbid a reference to itself (hide_if shortform)", function() {
2998
+ expectFailure(settingPlus({ hide_if: "foo" }),
2999
+ "template.yml setting “foo” cannot be conditional on itself");
3000
+ });
3001
+ &nbsp;
3002
+ it("should forbid a reference to itself (show_if)", function() {
3003
+ expectFailure(settingPlus({ show_if: { "foo": true } }),
3004
+ "template.yml setting “foo” cannot be conditional on itself");
3005
+ });
3006
+ it("should forbid a reference to itself (hide_if)", function() {
3007
+ expectFailure(settingPlus({ hide_if: { "foo": true } }),
3008
+ "template.yml setting “foo” cannot be conditional on itself");
3009
+ });
3010
+ &nbsp;
3011
+ it("should forbid a reference to a non-existent setting (show_if)", function() {
3012
+ expectFailure(settingPlus({ show_if: "baz" }),
3013
+ "template.yml: “show_if” or “hide_if” property refers to non-existent setting “baz”");
3014
+ });
3015
+ it("should forbid a reference to a non-existent setting (hide_if)", function() {
3016
+ expectFailure(settingPlus({ hide_if: "baz" }),
3017
+ "template.yml: “show_if” or “hide_if” property refers to non-existent setting “baz”");
3018
+ });
3019
+ &nbsp;
3020
+ it("should only allow one", function() {
3021
+ expectFailure(settingPlus({ show_if: "bar", hide_if: "bar" }),
3022
+ "template.yml setting “foo” has both “show_if” and “hide_if” properties: there can only be one");
3023
+ });
3024
+ &nbsp;
3025
+ it("should forbid null", function() {
3026
+ expectFailure(settingPlus({ show_if: null }),
3027
+ "template.yml Conditional setting “foo” is badly formed or wrongly indented");
3028
+ });
3029
+ it("should forbid true", function() {
3030
+ expectFailure(settingPlus({ show_if: true }),
3031
+ "template.yml setting “foo” has a “show_if” value that is not a string or object");
3032
+ });
3033
+ it("should forbid false", function() {
3034
+ expectFailure(settingPlus({ show_if: false }),
3035
+ "template.yml setting “foo” has a “show_if” value that is not a string or object");
3036
+ });
3037
+ it("should forbid empty arrays", function() {
3038
+ expectFailure(settingPlus({ show_if: [] }),
3039
+ "template.yml setting “foo” “show_if” property must specify a setting to test against");
3040
+ });
3041
+ &nbsp;
3042
+ it("should accept an array containing an object with multiple string values", function() {
3043
+ const blah = { name: "Blah", property: "blah", type: "string" };
3044
+ expectSuccess(settingPlus({ show_if: [{ "bar": "xxx", "blah": "xxx" }] }, undefined, [blah]));
3045
+ });
3046
+ &nbsp;
3047
+ it("should accept an array containing an object with multiple array values", function() {
3048
+ const blah = { name: "Blah", property: "blah", type: "string" };
3049
+ expectSuccess(settingPlus({ show_if: [{ "bar": ["xxx"], "blah": ["xxx"] }] }, undefined, [blah]));
3050
+ });
3051
+ &nbsp;
3052
+ it("should reject an array containing any objects with empty array values", function() {
3053
+ const blah = { name: "Blah", property: "blah", type: "string" };
3054
+ expectFailure(settingPlus({ show_if: [{ "bar": [], "blah": "xxx" }] }, undefined, [blah]),
3055
+ "template.yml setting “foo” “show_if” property: condition for bar is empty");
3056
+ });
3057
+ &nbsp;
3058
+ it("should reject an array containing any objects referring to non-existent settings", function() {
3059
+ expectFailure(settingPlus({ show_if: [{ "bar": "xxx", "baz": "xxx" }] }),
3060
+ "template.yml: “show_if” or “hide_if” property refers to non-existent setting “baz”");
3061
+ });
3062
+ &nbsp;
3063
+ it("should accept an array containing an object with a string value and a valid data binding", function() {
3064
+ expectSuccess(settingPlus({ show_if: [{ "bar": "xxx", "data.dataset.key": true }] }, { data: [binding] }));
3065
+ });
3066
+ &nbsp;
3067
+ it("should reject an array with a data reference when there are no data bindings", function() {
3068
+ expectFailure(settingPlus({ show_if: [{ "bar": "xxx", "data.dataset.key": true }] }),
3069
+ "template.yml: “show_if” or “hide_if” property refers to data binding “data.dataset.key” when none are defined");
3070
+ });
3071
+ &nbsp;
3072
+ it("should reject an array with a reference to a non-existent data binding", function() {
3073
+ expectFailure(settingPlus({ show_if: [{ "bar": "xxx", "data.dataset.nosuchkey": true }] }, { data: [binding] }),
3074
+ "template.yml: “show_if” or “hide_if” property refers to non-existent data binding “data.dataset.nosuchkey”");
3075
+ });
3076
+ &nbsp;
3077
+ it("should accept an array containing multiple objects of including string and boolean values", function() {
3078
+ const blah = { name: "Blah", property: "blah", type: "string" };
3079
+ const bool = { name: "Bool", property: "bool", type: "boolean" };
3080
+ expectSuccess(settingPlus({ show_if: [{ "bar": "xxx", "blah": "xxx" }, { "bool": true }] }, undefined, [blah, bool]));
3081
+ });
3082
+ &nbsp;
3083
+ it("should forbid empty objects", function() {
3084
+ expectFailure(settingPlus({ show_if: {} }),
3085
+ "template.yml setting “foo” “show_if” property must specify a setting to test against");
3086
+ });
3087
+ &nbsp;
3088
+ it("should accept an object with a string value", function() {
3089
+ expectSuccess(settingPlus({ show_if: { "bar": "xxx" } }));
3090
+ });
3091
+ it("should accept an object with an array value", function() {
3092
+ expectSuccess(settingPlus({ show_if: { "bar": ["xxx"] } }));
3093
+ });
3094
+ it("should reject an object with an empty array value", function() {
3095
+ expectFailure(settingPlus({ show_if: { "bar": [] } }),
3096
+ "template.yml setting “foo” “show_if” property: value for bar is empty");
3097
+ });
3098
+ it("should reject an object referring to a non-existent setting", function() {
3099
+ expectFailure(settingPlus({ show_if: { "baz": ["xxx"] } }),
3100
+ "template.yml: “show_if” or “hide_if” property refers to non-existent setting “baz”");
3101
+ });
3102
+ it("should accept a reference to a data binding", function() {
3103
+ expectSuccess(settingPlus({ show_if: "data.dataset.key" }, { data: [binding] }));
3104
+ });
3105
+ it("should reject a data reference when there are no data bindings", function() {
3106
+ expectFailure(settingPlus({ show_if: "data.dataset.key" }),
3107
+ "template.yml: “show_if” or “hide_if” property refers to data binding “data.dataset.key” when none are defined");
3108
+ });
3109
+ it("should reject a reference to a non-existent data binding", function() {
3110
+ expectFailure(settingPlus({ show_if: "data.dataset.nosuchkey" }, { data: [binding] }),
3111
+ "template.yml: “show_if” or “hide_if” property refers to non-existent data binding “data.dataset.nosuchkey”");
3112
+ });
3113
+ &nbsp;
3114
+ // This test is skipped because it doesn’t pass, and looks like it would be
3115
+ // complicated to fix.
3116
+ it.skip("should reject a string value when referencing a data binding", function() {
3117
+ <span class="cstat-no" title="statement not covered" > expectFailure(settingPlus({ show_if: { "data.dataset.key": "foo" } }, { data: [binding] }));</span>
3118
+ });
3119
+ &nbsp;
3120
+ it("should reject a reference to a data binding that has no key", function() {
3121
+ const binding_undef_key = { name: "No-key binding", dataset: "dataset", key: undefined, type: "column", column: "Foo::A" };
3122
+ expectFailure(settingPlus({ show_if: "data.dataset" }, { data: [binding_undef_key] }),
3123
+ "template.yml: “show_if” or “hide_if” property specifies invalid data binding or column type “data.dataset”");
3124
+ });
3125
+ it("should accept settings whose names start with /data./ [kiln/flourish-sdk#45]", function() {
3126
+ const data_foo = { name: "Data foo", property: "data_foo", type: "string" };
3127
+ expectSuccess(settingPlus({ show_if: { "data_foo": "xxx" } }, undefined, [data_foo]));
3128
+ });
3129
+ });
3130
+ &nbsp;
3131
+ describe("import", function() {
3132
+ describe("when the module to import exists", function() {
3133
+ let imported_module_directory, imported_settings_filename;
3134
+ before(function() {
3135
+ imported_module_directory = path.join(temp_directory, "node_modules/@flourish/layout/");
3136
+ imported_settings_filename = path.join(imported_module_directory, "settings.yml");
3137
+ fs.mkdirSync(imported_module_directory, { recursive: true });
3138
+ fs.closeSync(fs.openSync(imported_settings_filename, "w"));
3139
+ sinon.stub(nodeResolve, "sync").returns(imported_settings_filename);
3140
+ });
3141
+ after(function() {
3142
+ nodeResolve.sync.restore();
3143
+ fs.unlinkSync(imported_settings_filename);
3144
+ });
3145
+ it("should permit the import of a component", function() {
3146
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout" }] }));
3147
+ });
3148
+ it("should allow for a show_if condition for an imported component", function() {
3149
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", show_if: true }] }));
3150
+ });
3151
+ it("should allow for a hide_if condition for an imported component", function() {
3152
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", hide_if: true }] }));
3153
+ });
3154
+ it("should not allow for a name property (for example) for an imported component", function() {
3155
+ expectFailure(
3156
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", name: "Flourish" }] }),
3157
+ "template.yml: Unexpected property 'name' in import",
3158
+ );
3159
+ });
3160
+ it("should allow for an overrides array for an imported component", function() {
3161
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [] }] }));
3162
+ });
3163
+ it("should throw if overrides is a string", function() {
3164
+ expectFailure(
3165
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: "Hello Mark!" }] }),
3166
+ "template.yml Setting import overrides must be an array",
3167
+ );
3168
+ });
3169
+ it("should throw if overrides is an object", function() {
3170
+ expectFailure(
3171
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: {} }] }),
3172
+ "template.yml Setting import overrides must be an array",
3173
+ );
3174
+ });
3175
+ it("should throw if an override is missing the 'property' or 'tag' property", function() {
3176
+ expectFailure(
3177
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{}] }] }),
3178
+ `template.yml Setting import overrides must each specify overridden “property” or “tag”`,
3179
+ );
3180
+ });
3181
+ it("should throw if an override has both 'property' and 'tag' property", function () {
3182
+ expectFailure(
3183
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ property: "bg_color", tag: "categorical" }] }] }),
3184
+ `template.yml Setting import overrides cannot contain both “property” and “tag” property`,
3185
+ );
3186
+ });
3187
+ it("should allow for an override to have 'tag' in place of 'property'", function () {
3188
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ tag: "categorical" }] }] }));
3189
+ });
3190
+ it("should allow for an override without a 'method' property", function() {
3191
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ property: "bg_color" }] }] }));
3192
+ });
3193
+ it("should allow for an override with a 'method' property equal to 'replace'", function() {
3194
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ property: "bg_color", method: "replace" }] }] }));
3195
+ });
3196
+ it("should allow for an override with a 'method' property equal to 'extend'", function() {
3197
+ expectSuccess(metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ property: "bg_color", method: "extend" }] }] }));
3198
+ });
3199
+ it("should throw if an override has a 'method' property of (eg) 'delete'", function() {
3200
+ expectFailure(
3201
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout", overrides: [{ property: "bg_color", method: "delete" }] }] }),
3202
+ `template.yml Setting import override “method” method must be either “replace” or “extend”`,
3203
+ );
3204
+ });
3205
+ });
3206
+ &nbsp;
3207
+ describe("when the module to import doesn't exist", function() {
3208
+ it("should error when trying to import the component", function() {
3209
+ const expected_error = `Cannot find module '@flourish/layout/settings.yml' from '${temp_directory}'`;
3210
+ expectFailure(
3211
+ metadataPlus({ settings: [{ property: "imported_prop", import: "@flourish/layout" }] }),
3212
+ expected_error,
3213
+ );
3214
+ });
3215
+ });
3216
+ });
3217
+ &nbsp;
3218
+ describe("new_section", function() {
3219
+ it("should accept true", function() {
3220
+ expectSuccess(settingPlus({ new_section: true }));
3221
+ });
3222
+ it("should accept false", function() {
3223
+ expectSuccess(settingPlus({ new_section: false }));
3224
+ });
3225
+ it("should accept a string", function() {
3226
+ expectSuccess(settingPlus({ new_section: "section title" }));
3227
+ });
3228
+ it("should reject null", function() {
3229
+ expectFailure(settingPlus({ new_section: null }),
3230
+ "template.yml setting “foo” new_section property must be a boolean or string, not null");
3231
+ });
3232
+ it("should reject numbers", function() {
3233
+ expectFailure(settingPlus({ new_section: 23 }),
3234
+ "template.yml setting “foo” new_section property must be a boolean or string, not number");
3235
+ });
3236
+ it("should reject arrays", function() {
3237
+ expectFailure(settingPlus({ new_section: [] }),
3238
+ "template.yml setting “foo” new_section property must be a boolean or string, not array");
3239
+ });
3240
+ it("should reject objects", function() {
3241
+ expectFailure(settingPlus({ new_section: {} }),
3242
+ "template.yml setting “foo” new_section property must be a boolean or string, not object");
3243
+ });
3244
+ });
3245
+ &nbsp;
3246
+ describe("width", function() {
3247
+ it("should accept “full”", function() {
3248
+ expectSuccess(settingPlus({ width: "full" }));
3249
+ });
3250
+ it("should accept “half”", function() {
3251
+ expectSuccess(settingPlus({ width: "half" }));
3252
+ });
3253
+ it("should accept “quarter”", function() {
3254
+ expectSuccess(settingPlus({ width: "quarter" }));
3255
+ });
3256
+ it("should accept “three quarters”", function() {
3257
+ expectSuccess(settingPlus({ width: "three quarters" }));
3258
+ });
3259
+ &nbsp;
3260
+ const expected_message = "template.yml setting “foo” has unsupported width property: must be “full”, “half”, “quarter” or “three quarters”";
3261
+ it("should accept true", function() {
3262
+ expectFailure(settingPlus({ width: true }), expected_message);
3263
+ });
3264
+ it("should accept false", function() {
3265
+ expectFailure(settingPlus({ width: false }), expected_message);
3266
+ });
3267
+ it("should reject an empty string", function() {
3268
+ expectFailure(settingPlus({ width: "" }), expected_message);
3269
+ });
3270
+ it("should reject an unexpected string", function() {
3271
+ expectFailure(settingPlus({ width: "unexpected string" }), expected_message);
3272
+ });
3273
+ it("should reject null", function() {
3274
+ expectFailure(settingPlus({ width: null }), expected_message);
3275
+ });
3276
+ it("should reject numbers", function() {
3277
+ expectFailure(settingPlus({ width: 23 }), expected_message);
3278
+ });
3279
+ it("should reject arrays", function() {
3280
+ expectFailure(settingPlus({ width: [] }), expected_message);
3281
+ });
3282
+ it("should reject objects", function() {
3283
+ expectFailure(settingPlus({ width: {} }), expected_message);
3284
+ });
3285
+ });
3286
+ });
3287
+ });
3288
+ &nbsp;</pre></td></tr></table></pre>
3289
+
3290
+ <div class='push'></div><!-- for sticky footer -->
3291
+ </div><!-- /wrapper -->
3292
+ <div class='footer quiet pad2 space-top1 center small'>
3293
+ Code coverage generated by
3294
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3295
+ at 2025-09-14T22:52:55.226Z
3296
+ </div>
3297
+ <script src="../../prettify.js"></script>
3298
+ <script>
3299
+ window.onload = function () {
3300
+ prettyPrint();
3301
+ };
3302
+ </script>
3303
+ <script src="../../sorter.js"></script>
3304
+ <script src="../../block-navigation.js"></script>
3305
+ </body>
3306
+ </html>
3307
+