UNPKG

61.2 kBHTMLView Raw
1<!doctype html>
2<html lang="en">
3<head>
4 <title>Code coverage report for Application.ts</title>
5 <meta charset="utf-8" />
6 <link rel="stylesheet" href="prettify.css" />
7 <link rel="stylesheet" href="base.css" />
8 <meta name="viewport" content="width=device-width, initial-scale=1">
9 <style type='text/css'>
10 .coverage-summary .sorter {
11 background-image: url(sort-arrow-sprite.png);
12 }
13 </style>
14</head>
15<body>
16<div class='wrapper'>
17 <div class='pad1'>
18 <h1>
19 <a href="index.html">All files</a> Application.ts
20 </h1>
21 <div class='clearfix'>
22 <div class='fl pad1y space-right2'>
23 <span class="strong">92.99% </span>
24 <span class="quiet">Statements</span>
25 <span class='fraction'>146/157</span>
26 </div>
27 <div class='fl pad1y space-right2'>
28 <span class="strong">79.17% </span>
29 <span class="quiet">Branches</span>
30 <span class='fraction'>38/48</span>
31 </div>
32 <div class='fl pad1y space-right2'>
33 <span class="strong">93.02% </span>
34 <span class="quiet">Functions</span>
35 <span class='fraction'>40/43</span>
36 </div>
37 <div class='fl pad1y space-right2'>
38 <span class="strong">92.95% </span>
39 <span class="quiet">Lines</span>
40 <span class='fraction'>145/156</span>
41 </div>
42 </div>
43 <p class="quiet">
44 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.
45 </p>
46 </div>
47 <div class='status-line high'></div>
48<pre><table class="coverage">
49<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
50<a name='L2'></a><a href='#L2'>2</a>
51<a name='L3'></a><a href='#L3'>3</a>
52<a name='L4'></a><a href='#L4'>4</a>
53<a name='L5'></a><a href='#L5'>5</a>
54<a name='L6'></a><a href='#L6'>6</a>
55<a name='L7'></a><a href='#L7'>7</a>
56<a name='L8'></a><a href='#L8'>8</a>
57<a name='L9'></a><a href='#L9'>9</a>
58<a name='L10'></a><a href='#L10'>10</a>
59<a name='L11'></a><a href='#L11'>11</a>
60<a name='L12'></a><a href='#L12'>12</a>
61<a name='L13'></a><a href='#L13'>13</a>
62<a name='L14'></a><a href='#L14'>14</a>
63<a name='L15'></a><a href='#L15'>15</a>
64<a name='L16'></a><a href='#L16'>16</a>
65<a name='L17'></a><a href='#L17'>17</a>
66<a name='L18'></a><a href='#L18'>18</a>
67<a name='L19'></a><a href='#L19'>19</a>
68<a name='L20'></a><a href='#L20'>20</a>
69<a name='L21'></a><a href='#L21'>21</a>
70<a name='L22'></a><a href='#L22'>22</a>
71<a name='L23'></a><a href='#L23'>23</a>
72<a name='L24'></a><a href='#L24'>24</a>
73<a name='L25'></a><a href='#L25'>25</a>
74<a name='L26'></a><a href='#L26'>26</a>
75<a name='L27'></a><a href='#L27'>27</a>
76<a name='L28'></a><a href='#L28'>28</a>
77<a name='L29'></a><a href='#L29'>29</a>
78<a name='L30'></a><a href='#L30'>30</a>
79<a name='L31'></a><a href='#L31'>31</a>
80<a name='L32'></a><a href='#L32'>32</a>
81<a name='L33'></a><a href='#L33'>33</a>
82<a name='L34'></a><a href='#L34'>34</a>
83<a name='L35'></a><a href='#L35'>35</a>
84<a name='L36'></a><a href='#L36'>36</a>
85<a name='L37'></a><a href='#L37'>37</a>
86<a name='L38'></a><a href='#L38'>38</a>
87<a name='L39'></a><a href='#L39'>39</a>
88<a name='L40'></a><a href='#L40'>40</a>
89<a name='L41'></a><a href='#L41'>41</a>
90<a name='L42'></a><a href='#L42'>42</a>
91<a name='L43'></a><a href='#L43'>43</a>
92<a name='L44'></a><a href='#L44'>44</a>
93<a name='L45'></a><a href='#L45'>45</a>
94<a name='L46'></a><a href='#L46'>46</a>
95<a name='L47'></a><a href='#L47'>47</a>
96<a name='L48'></a><a href='#L48'>48</a>
97<a name='L49'></a><a href='#L49'>49</a>
98<a name='L50'></a><a href='#L50'>50</a>
99<a name='L51'></a><a href='#L51'>51</a>
100<a name='L52'></a><a href='#L52'>52</a>
101<a name='L53'></a><a href='#L53'>53</a>
102<a name='L54'></a><a href='#L54'>54</a>
103<a name='L55'></a><a href='#L55'>55</a>
104<a name='L56'></a><a href='#L56'>56</a>
105<a name='L57'></a><a href='#L57'>57</a>
106<a name='L58'></a><a href='#L58'>58</a>
107<a name='L59'></a><a href='#L59'>59</a>
108<a name='L60'></a><a href='#L60'>60</a>
109<a name='L61'></a><a href='#L61'>61</a>
110<a name='L62'></a><a href='#L62'>62</a>
111<a name='L63'></a><a href='#L63'>63</a>
112<a name='L64'></a><a href='#L64'>64</a>
113<a name='L65'></a><a href='#L65'>65</a>
114<a name='L66'></a><a href='#L66'>66</a>
115<a name='L67'></a><a href='#L67'>67</a>
116<a name='L68'></a><a href='#L68'>68</a>
117<a name='L69'></a><a href='#L69'>69</a>
118<a name='L70'></a><a href='#L70'>70</a>
119<a name='L71'></a><a href='#L71'>71</a>
120<a name='L72'></a><a href='#L72'>72</a>
121<a name='L73'></a><a href='#L73'>73</a>
122<a name='L74'></a><a href='#L74'>74</a>
123<a name='L75'></a><a href='#L75'>75</a>
124<a name='L76'></a><a href='#L76'>76</a>
125<a name='L77'></a><a href='#L77'>77</a>
126<a name='L78'></a><a href='#L78'>78</a>
127<a name='L79'></a><a href='#L79'>79</a>
128<a name='L80'></a><a href='#L80'>80</a>
129<a name='L81'></a><a href='#L81'>81</a>
130<a name='L82'></a><a href='#L82'>82</a>
131<a name='L83'></a><a href='#L83'>83</a>
132<a name='L84'></a><a href='#L84'>84</a>
133<a name='L85'></a><a href='#L85'>85</a>
134<a name='L86'></a><a href='#L86'>86</a>
135<a name='L87'></a><a href='#L87'>87</a>
136<a name='L88'></a><a href='#L88'>88</a>
137<a name='L89'></a><a href='#L89'>89</a>
138<a name='L90'></a><a href='#L90'>90</a>
139<a name='L91'></a><a href='#L91'>91</a>
140<a name='L92'></a><a href='#L92'>92</a>
141<a name='L93'></a><a href='#L93'>93</a>
142<a name='L94'></a><a href='#L94'>94</a>
143<a name='L95'></a><a href='#L95'>95</a>
144<a name='L96'></a><a href='#L96'>96</a>
145<a name='L97'></a><a href='#L97'>97</a>
146<a name='L98'></a><a href='#L98'>98</a>
147<a name='L99'></a><a href='#L99'>99</a>
148<a name='L100'></a><a href='#L100'>100</a>
149<a name='L101'></a><a href='#L101'>101</a>
150<a name='L102'></a><a href='#L102'>102</a>
151<a name='L103'></a><a href='#L103'>103</a>
152<a name='L104'></a><a href='#L104'>104</a>
153<a name='L105'></a><a href='#L105'>105</a>
154<a name='L106'></a><a href='#L106'>106</a>
155<a name='L107'></a><a href='#L107'>107</a>
156<a name='L108'></a><a href='#L108'>108</a>
157<a name='L109'></a><a href='#L109'>109</a>
158<a name='L110'></a><a href='#L110'>110</a>
159<a name='L111'></a><a href='#L111'>111</a>
160<a name='L112'></a><a href='#L112'>112</a>
161<a name='L113'></a><a href='#L113'>113</a>
162<a name='L114'></a><a href='#L114'>114</a>
163<a name='L115'></a><a href='#L115'>115</a>
164<a name='L116'></a><a href='#L116'>116</a>
165<a name='L117'></a><a href='#L117'>117</a>
166<a name='L118'></a><a href='#L118'>118</a>
167<a name='L119'></a><a href='#L119'>119</a>
168<a name='L120'></a><a href='#L120'>120</a>
169<a name='L121'></a><a href='#L121'>121</a>
170<a name='L122'></a><a href='#L122'>122</a>
171<a name='L123'></a><a href='#L123'>123</a>
172<a name='L124'></a><a href='#L124'>124</a>
173<a name='L125'></a><a href='#L125'>125</a>
174<a name='L126'></a><a href='#L126'>126</a>
175<a name='L127'></a><a href='#L127'>127</a>
176<a name='L128'></a><a href='#L128'>128</a>
177<a name='L129'></a><a href='#L129'>129</a>
178<a name='L130'></a><a href='#L130'>130</a>
179<a name='L131'></a><a href='#L131'>131</a>
180<a name='L132'></a><a href='#L132'>132</a>
181<a name='L133'></a><a href='#L133'>133</a>
182<a name='L134'></a><a href='#L134'>134</a>
183<a name='L135'></a><a href='#L135'>135</a>
184<a name='L136'></a><a href='#L136'>136</a>
185<a name='L137'></a><a href='#L137'>137</a>
186<a name='L138'></a><a href='#L138'>138</a>
187<a name='L139'></a><a href='#L139'>139</a>
188<a name='L140'></a><a href='#L140'>140</a>
189<a name='L141'></a><a href='#L141'>141</a>
190<a name='L142'></a><a href='#L142'>142</a>
191<a name='L143'></a><a href='#L143'>143</a>
192<a name='L144'></a><a href='#L144'>144</a>
193<a name='L145'></a><a href='#L145'>145</a>
194<a name='L146'></a><a href='#L146'>146</a>
195<a name='L147'></a><a href='#L147'>147</a>
196<a name='L148'></a><a href='#L148'>148</a>
197<a name='L149'></a><a href='#L149'>149</a>
198<a name='L150'></a><a href='#L150'>150</a>
199<a name='L151'></a><a href='#L151'>151</a>
200<a name='L152'></a><a href='#L152'>152</a>
201<a name='L153'></a><a href='#L153'>153</a>
202<a name='L154'></a><a href='#L154'>154</a>
203<a name='L155'></a><a href='#L155'>155</a>
204<a name='L156'></a><a href='#L156'>156</a>
205<a name='L157'></a><a href='#L157'>157</a>
206<a name='L158'></a><a href='#L158'>158</a>
207<a name='L159'></a><a href='#L159'>159</a>
208<a name='L160'></a><a href='#L160'>160</a>
209<a name='L161'></a><a href='#L161'>161</a>
210<a name='L162'></a><a href='#L162'>162</a>
211<a name='L163'></a><a href='#L163'>163</a>
212<a name='L164'></a><a href='#L164'>164</a>
213<a name='L165'></a><a href='#L165'>165</a>
214<a name='L166'></a><a href='#L166'>166</a>
215<a name='L167'></a><a href='#L167'>167</a>
216<a name='L168'></a><a href='#L168'>168</a>
217<a name='L169'></a><a href='#L169'>169</a>
218<a name='L170'></a><a href='#L170'>170</a>
219<a name='L171'></a><a href='#L171'>171</a>
220<a name='L172'></a><a href='#L172'>172</a>
221<a name='L173'></a><a href='#L173'>173</a>
222<a name='L174'></a><a href='#L174'>174</a>
223<a name='L175'></a><a href='#L175'>175</a>
224<a name='L176'></a><a href='#L176'>176</a>
225<a name='L177'></a><a href='#L177'>177</a>
226<a name='L178'></a><a href='#L178'>178</a>
227<a name='L179'></a><a href='#L179'>179</a>
228<a name='L180'></a><a href='#L180'>180</a>
229<a name='L181'></a><a href='#L181'>181</a>
230<a name='L182'></a><a href='#L182'>182</a>
231<a name='L183'></a><a href='#L183'>183</a>
232<a name='L184'></a><a href='#L184'>184</a>
233<a name='L185'></a><a href='#L185'>185</a>
234<a name='L186'></a><a href='#L186'>186</a>
235<a name='L187'></a><a href='#L187'>187</a>
236<a name='L188'></a><a href='#L188'>188</a>
237<a name='L189'></a><a href='#L189'>189</a>
238<a name='L190'></a><a href='#L190'>190</a>
239<a name='L191'></a><a href='#L191'>191</a>
240<a name='L192'></a><a href='#L192'>192</a>
241<a name='L193'></a><a href='#L193'>193</a>
242<a name='L194'></a><a href='#L194'>194</a>
243<a name='L195'></a><a href='#L195'>195</a>
244<a name='L196'></a><a href='#L196'>196</a>
245<a name='L197'></a><a href='#L197'>197</a>
246<a name='L198'></a><a href='#L198'>198</a>
247<a name='L199'></a><a href='#L199'>199</a>
248<a name='L200'></a><a href='#L200'>200</a>
249<a name='L201'></a><a href='#L201'>201</a>
250<a name='L202'></a><a href='#L202'>202</a>
251<a name='L203'></a><a href='#L203'>203</a>
252<a name='L204'></a><a href='#L204'>204</a>
253<a name='L205'></a><a href='#L205'>205</a>
254<a name='L206'></a><a href='#L206'>206</a>
255<a name='L207'></a><a href='#L207'>207</a>
256<a name='L208'></a><a href='#L208'>208</a>
257<a name='L209'></a><a href='#L209'>209</a>
258<a name='L210'></a><a href='#L210'>210</a>
259<a name='L211'></a><a href='#L211'>211</a>
260<a name='L212'></a><a href='#L212'>212</a>
261<a name='L213'></a><a href='#L213'>213</a>
262<a name='L214'></a><a href='#L214'>214</a>
263<a name='L215'></a><a href='#L215'>215</a>
264<a name='L216'></a><a href='#L216'>216</a>
265<a name='L217'></a><a href='#L217'>217</a>
266<a name='L218'></a><a href='#L218'>218</a>
267<a name='L219'></a><a href='#L219'>219</a>
268<a name='L220'></a><a href='#L220'>220</a>
269<a name='L221'></a><a href='#L221'>221</a>
270<a name='L222'></a><a href='#L222'>222</a>
271<a name='L223'></a><a href='#L223'>223</a>
272<a name='L224'></a><a href='#L224'>224</a>
273<a name='L225'></a><a href='#L225'>225</a>
274<a name='L226'></a><a href='#L226'>226</a>
275<a name='L227'></a><a href='#L227'>227</a>
276<a name='L228'></a><a href='#L228'>228</a>
277<a name='L229'></a><a href='#L229'>229</a>
278<a name='L230'></a><a href='#L230'>230</a>
279<a name='L231'></a><a href='#L231'>231</a>
280<a name='L232'></a><a href='#L232'>232</a>
281<a name='L233'></a><a href='#L233'>233</a>
282<a name='L234'></a><a href='#L234'>234</a>
283<a name='L235'></a><a href='#L235'>235</a>
284<a name='L236'></a><a href='#L236'>236</a>
285<a name='L237'></a><a href='#L237'>237</a>
286<a name='L238'></a><a href='#L238'>238</a>
287<a name='L239'></a><a href='#L239'>239</a>
288<a name='L240'></a><a href='#L240'>240</a>
289<a name='L241'></a><a href='#L241'>241</a>
290<a name='L242'></a><a href='#L242'>242</a>
291<a name='L243'></a><a href='#L243'>243</a>
292<a name='L244'></a><a href='#L244'>244</a>
293<a name='L245'></a><a href='#L245'>245</a>
294<a name='L246'></a><a href='#L246'>246</a>
295<a name='L247'></a><a href='#L247'>247</a>
296<a name='L248'></a><a href='#L248'>248</a>
297<a name='L249'></a><a href='#L249'>249</a>
298<a name='L250'></a><a href='#L250'>250</a>
299<a name='L251'></a><a href='#L251'>251</a>
300<a name='L252'></a><a href='#L252'>252</a>
301<a name='L253'></a><a href='#L253'>253</a>
302<a name='L254'></a><a href='#L254'>254</a>
303<a name='L255'></a><a href='#L255'>255</a>
304<a name='L256'></a><a href='#L256'>256</a>
305<a name='L257'></a><a href='#L257'>257</a>
306<a name='L258'></a><a href='#L258'>258</a>
307<a name='L259'></a><a href='#L259'>259</a>
308<a name='L260'></a><a href='#L260'>260</a>
309<a name='L261'></a><a href='#L261'>261</a>
310<a name='L262'></a><a href='#L262'>262</a>
311<a name='L263'></a><a href='#L263'>263</a>
312<a name='L264'></a><a href='#L264'>264</a>
313<a name='L265'></a><a href='#L265'>265</a>
314<a name='L266'></a><a href='#L266'>266</a>
315<a name='L267'></a><a href='#L267'>267</a>
316<a name='L268'></a><a href='#L268'>268</a>
317<a name='L269'></a><a href='#L269'>269</a>
318<a name='L270'></a><a href='#L270'>270</a>
319<a name='L271'></a><a href='#L271'>271</a>
320<a name='L272'></a><a href='#L272'>272</a>
321<a name='L273'></a><a href='#L273'>273</a>
322<a name='L274'></a><a href='#L274'>274</a>
323<a name='L275'></a><a href='#L275'>275</a>
324<a name='L276'></a><a href='#L276'>276</a>
325<a name='L277'></a><a href='#L277'>277</a>
326<a name='L278'></a><a href='#L278'>278</a>
327<a name='L279'></a><a href='#L279'>279</a>
328<a name='L280'></a><a href='#L280'>280</a>
329<a name='L281'></a><a href='#L281'>281</a>
330<a name='L282'></a><a href='#L282'>282</a>
331<a name='L283'></a><a href='#L283'>283</a>
332<a name='L284'></a><a href='#L284'>284</a>
333<a name='L285'></a><a href='#L285'>285</a>
334<a name='L286'></a><a href='#L286'>286</a>
335<a name='L287'></a><a href='#L287'>287</a>
336<a name='L288'></a><a href='#L288'>288</a>
337<a name='L289'></a><a href='#L289'>289</a>
338<a name='L290'></a><a href='#L290'>290</a>
339<a name='L291'></a><a href='#L291'>291</a>
340<a name='L292'></a><a href='#L292'>292</a>
341<a name='L293'></a><a href='#L293'>293</a>
342<a name='L294'></a><a href='#L294'>294</a>
343<a name='L295'></a><a href='#L295'>295</a>
344<a name='L296'></a><a href='#L296'>296</a>
345<a name='L297'></a><a href='#L297'>297</a>
346<a name='L298'></a><a href='#L298'>298</a>
347<a name='L299'></a><a href='#L299'>299</a>
348<a name='L300'></a><a href='#L300'>300</a>
349<a name='L301'></a><a href='#L301'>301</a>
350<a name='L302'></a><a href='#L302'>302</a>
351<a name='L303'></a><a href='#L303'>303</a>
352<a name='L304'></a><a href='#L304'>304</a>
353<a name='L305'></a><a href='#L305'>305</a>
354<a name='L306'></a><a href='#L306'>306</a>
355<a name='L307'></a><a href='#L307'>307</a>
356<a name='L308'></a><a href='#L308'>308</a>
357<a name='L309'></a><a href='#L309'>309</a>
358<a name='L310'></a><a href='#L310'>310</a>
359<a name='L311'></a><a href='#L311'>311</a>
360<a name='L312'></a><a href='#L312'>312</a>
361<a name='L313'></a><a href='#L313'>313</a>
362<a name='L314'></a><a href='#L314'>314</a>
363<a name='L315'></a><a href='#L315'>315</a>
364<a name='L316'></a><a href='#L316'>316</a>
365<a name='L317'></a><a href='#L317'>317</a>
366<a name='L318'></a><a href='#L318'>318</a>
367<a name='L319'></a><a href='#L319'>319</a>
368<a name='L320'></a><a href='#L320'>320</a>
369<a name='L321'></a><a href='#L321'>321</a>
370<a name='L322'></a><a href='#L322'>322</a>
371<a name='L323'></a><a href='#L323'>323</a>
372<a name='L324'></a><a href='#L324'>324</a>
373<a name='L325'></a><a href='#L325'>325</a>
374<a name='L326'></a><a href='#L326'>326</a>
375<a name='L327'></a><a href='#L327'>327</a>
376<a name='L328'></a><a href='#L328'>328</a>
377<a name='L329'></a><a href='#L329'>329</a>
378<a name='L330'></a><a href='#L330'>330</a>
379<a name='L331'></a><a href='#L331'>331</a>
380<a name='L332'></a><a href='#L332'>332</a>
381<a name='L333'></a><a href='#L333'>333</a>
382<a name='L334'></a><a href='#L334'>334</a>
383<a name='L335'></a><a href='#L335'>335</a>
384<a name='L336'></a><a href='#L336'>336</a>
385<a name='L337'></a><a href='#L337'>337</a>
386<a name='L338'></a><a href='#L338'>338</a>
387<a name='L339'></a><a href='#L339'>339</a>
388<a name='L340'></a><a href='#L340'>340</a>
389<a name='L341'></a><a href='#L341'>341</a>
390<a name='L342'></a><a href='#L342'>342</a>
391<a name='L343'></a><a href='#L343'>343</a>
392<a name='L344'></a><a href='#L344'>344</a>
393<a name='L345'></a><a href='#L345'>345</a>
394<a name='L346'></a><a href='#L346'>346</a>
395<a name='L347'></a><a href='#L347'>347</a>
396<a name='L348'></a><a href='#L348'>348</a>
397<a name='L349'></a><a href='#L349'>349</a>
398<a name='L350'></a><a href='#L350'>350</a>
399<a name='L351'></a><a href='#L351'>351</a>
400<a name='L352'></a><a href='#L352'>352</a>
401<a name='L353'></a><a href='#L353'>353</a>
402<a name='L354'></a><a href='#L354'>354</a>
403<a name='L355'></a><a href='#L355'>355</a>
404<a name='L356'></a><a href='#L356'>356</a>
405<a name='L357'></a><a href='#L357'>357</a>
406<a name='L358'></a><a href='#L358'>358</a>
407<a name='L359'></a><a href='#L359'>359</a>
408<a name='L360'></a><a href='#L360'>360</a>
409<a name='L361'></a><a href='#L361'>361</a>
410<a name='L362'></a><a href='#L362'>362</a>
411<a name='L363'></a><a href='#L363'>363</a>
412<a name='L364'></a><a href='#L364'>364</a>
413<a name='L365'></a><a href='#L365'>365</a>
414<a name='L366'></a><a href='#L366'>366</a>
415<a name='L367'></a><a href='#L367'>367</a>
416<a name='L368'></a><a href='#L368'>368</a>
417<a name='L369'></a><a href='#L369'>369</a>
418<a name='L370'></a><a href='#L370'>370</a>
419<a name='L371'></a><a href='#L371'>371</a>
420<a name='L372'></a><a href='#L372'>372</a>
421<a name='L373'></a><a href='#L373'>373</a>
422<a name='L374'></a><a href='#L374'>374</a>
423<a name='L375'></a><a href='#L375'>375</a>
424<a name='L376'></a><a href='#L376'>376</a>
425<a name='L377'></a><a href='#L377'>377</a>
426<a name='L378'></a><a href='#L378'>378</a>
427<a name='L379'></a><a href='#L379'>379</a>
428<a name='L380'></a><a href='#L380'>380</a>
429<a name='L381'></a><a href='#L381'>381</a>
430<a name='L382'></a><a href='#L382'>382</a>
431<a name='L383'></a><a href='#L383'>383</a>
432<a name='L384'></a><a href='#L384'>384</a>
433<a name='L385'></a><a href='#L385'>385</a>
434<a name='L386'></a><a href='#L386'>386</a>
435<a name='L387'></a><a href='#L387'>387</a>
436<a name='L388'></a><a href='#L388'>388</a>
437<a name='L389'></a><a href='#L389'>389</a>
438<a name='L390'></a><a href='#L390'>390</a>
439<a name='L391'></a><a href='#L391'>391</a>
440<a name='L392'></a><a href='#L392'>392</a>
441<a name='L393'></a><a href='#L393'>393</a>
442<a name='L394'></a><a href='#L394'>394</a>
443<a name='L395'></a><a href='#L395'>395</a>
444<a name='L396'></a><a href='#L396'>396</a>
445<a name='L397'></a><a href='#L397'>397</a>
446<a name='L398'></a><a href='#L398'>398</a>
447<a name='L399'></a><a href='#L399'>399</a>
448<a name='L400'></a><a href='#L400'>400</a>
449<a name='L401'></a><a href='#L401'>401</a>
450<a name='L402'></a><a href='#L402'>402</a>
451<a name='L403'></a><a href='#L403'>403</a>
452<a name='L404'></a><a href='#L404'>404</a>
453<a name='L405'></a><a href='#L405'>405</a>
454<a name='L406'></a><a href='#L406'>406</a>
455<a name='L407'></a><a href='#L407'>407</a>
456<a name='L408'></a><a href='#L408'>408</a>
457<a name='L409'></a><a href='#L409'>409</a>
458<a name='L410'></a><a href='#L410'>410</a>
459<a name='L411'></a><a href='#L411'>411</a>
460<a name='L412'></a><a href='#L412'>412</a>
461<a name='L413'></a><a href='#L413'>413</a>
462<a name='L414'></a><a href='#L414'>414</a>
463<a name='L415'></a><a href='#L415'>415</a>
464<a name='L416'></a><a href='#L416'>416</a>
465<a name='L417'></a><a href='#L417'>417</a>
466<a name='L418'></a><a href='#L418'>418</a>
467<a name='L419'></a><a href='#L419'>419</a>
468<a name='L420'></a><a href='#L420'>420</a>
469<a name='L421'></a><a href='#L421'>421</a>
470<a name='L422'></a><a href='#L422'>422</a>
471<a name='L423'></a><a href='#L423'>423</a>
472<a name='L424'></a><a href='#L424'>424</a>
473<a name='L425'></a><a href='#L425'>425</a>
474<a name='L426'></a><a href='#L426'>426</a>
475<a name='L427'></a><a href='#L427'>427</a>
476<a name='L428'></a><a href='#L428'>428</a>
477<a name='L429'></a><a href='#L429'>429</a>
478<a name='L430'></a><a href='#L430'>430</a>
479<a name='L431'></a><a href='#L431'>431</a>
480<a name='L432'></a><a href='#L432'>432</a>
481<a name='L433'></a><a href='#L433'>433</a>
482<a name='L434'></a><a href='#L434'>434</a>
483<a name='L435'></a><a href='#L435'>435</a>
484<a name='L436'></a><a href='#L436'>436</a>
485<a name='L437'></a><a href='#L437'>437</a>
486<a name='L438'></a><a href='#L438'>438</a>
487<a name='L439'></a><a href='#L439'>439</a>
488<a name='L440'></a><a href='#L440'>440</a>
489<a name='L441'></a><a href='#L441'>441</a>
490<a name='L442'></a><a href='#L442'>442</a>
491<a name='L443'></a><a href='#L443'>443</a>
492<a name='L444'></a><a href='#L444'>444</a>
493<a name='L445'></a><a href='#L445'>445</a>
494<a name='L446'></a><a href='#L446'>446</a>
495<a name='L447'></a><a href='#L447'>447</a>
496<a name='L448'></a><a href='#L448'>448</a>
497<a name='L449'></a><a href='#L449'>449</a>
498<a name='L450'></a><a href='#L450'>450</a>
499<a name='L451'></a><a href='#L451'>451</a>
500<a name='L452'></a><a href='#L452'>452</a>
501<a name='L453'></a><a href='#L453'>453</a>
502<a name='L454'></a><a href='#L454'>454</a>
503<a name='L455'></a><a href='#L455'>455</a>
504<a name='L456'></a><a href='#L456'>456</a>
505<a name='L457'></a><a href='#L457'>457</a>
506<a name='L458'></a><a href='#L458'>458</a>
507<a name='L459'></a><a href='#L459'>459</a>
508<a name='L460'></a><a href='#L460'>460</a>
509<a name='L461'></a><a href='#L461'>461</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
510<span class="cline-any cline-neutral">&nbsp;</span>
511<span class="cline-any cline-neutral">&nbsp;</span>
512<span class="cline-any cline-neutral">&nbsp;</span>
513<span class="cline-any cline-neutral">&nbsp;</span>
514<span class="cline-any cline-neutral">&nbsp;</span>
515<span class="cline-any cline-neutral">&nbsp;</span>
516<span class="cline-any cline-neutral">&nbsp;</span>
517<span class="cline-any cline-neutral">&nbsp;</span>
518<span class="cline-any cline-neutral">&nbsp;</span>
519<span class="cline-any cline-neutral">&nbsp;</span>
520<span class="cline-any cline-neutral">&nbsp;</span>
521<span class="cline-any cline-neutral">&nbsp;</span>
522<span class="cline-any cline-neutral">&nbsp;</span>
523<span class="cline-any cline-neutral">&nbsp;</span>
524<span class="cline-any cline-yes">1x</span>
525<span class="cline-any cline-yes">1x</span>
526<span class="cline-any cline-yes">1x</span>
527<span class="cline-any cline-yes">1x</span>
528<span class="cline-any cline-neutral">&nbsp;</span>
529<span class="cline-any cline-yes">1x</span>
530<span class="cline-any cline-neutral">&nbsp;</span>
531<span class="cline-any cline-neutral">&nbsp;</span>
532<span class="cline-any cline-neutral">&nbsp;</span>
533<span class="cline-any cline-neutral">&nbsp;</span>
534<span class="cline-any cline-yes">1x</span>
535<span class="cline-any cline-yes">1x</span>
536<span class="cline-any cline-yes">1x</span>
537<span class="cline-any cline-neutral">&nbsp;</span>
538<span class="cline-any cline-yes">1x</span>
539<span class="cline-any cline-yes">1x</span>
540<span class="cline-any cline-yes">1x</span>
541<span class="cline-any cline-yes">1x</span>
542<span class="cline-any cline-neutral">&nbsp;</span>
543<span class="cline-any cline-neutral">&nbsp;</span>
544<span class="cline-any cline-yes">1x</span>
545<span class="cline-any cline-neutral">&nbsp;</span>
546<span class="cline-any cline-neutral">&nbsp;</span>
547<span class="cline-any cline-neutral">&nbsp;</span>
548<span class="cline-any cline-neutral">&nbsp;</span>
549<span class="cline-any cline-yes">1x</span>
550<span class="cline-any cline-neutral">&nbsp;</span>
551<span class="cline-any cline-neutral">&nbsp;</span>
552<span class="cline-any cline-neutral">&nbsp;</span>
553<span class="cline-any cline-neutral">&nbsp;</span>
554<span class="cline-any cline-yes">1x</span>
555<span class="cline-any cline-neutral">&nbsp;</span>
556<span class="cline-any cline-neutral">&nbsp;</span>
557<span class="cline-any cline-neutral">&nbsp;</span>
558<span class="cline-any cline-neutral">&nbsp;</span>
559<span class="cline-any cline-neutral">&nbsp;</span>
560<span class="cline-any cline-neutral">&nbsp;</span>
561<span class="cline-any cline-neutral">&nbsp;</span>
562<span class="cline-any cline-neutral">&nbsp;</span>
563<span class="cline-any cline-neutral">&nbsp;</span>
564<span class="cline-any cline-neutral">&nbsp;</span>
565<span class="cline-any cline-neutral">&nbsp;</span>
566<span class="cline-any cline-neutral">&nbsp;</span>
567<span class="cline-any cline-neutral">&nbsp;</span>
568<span class="cline-any cline-neutral">&nbsp;</span>
569<span class="cline-any cline-neutral">&nbsp;</span>
570<span class="cline-any cline-neutral">&nbsp;</span>
571<span class="cline-any cline-neutral">&nbsp;</span>
572<span class="cline-any cline-neutral">&nbsp;</span>
573<span class="cline-any cline-neutral">&nbsp;</span>
574<span class="cline-any cline-neutral">&nbsp;</span>
575<span class="cline-any cline-neutral">&nbsp;</span>
576<span class="cline-any cline-yes">25x</span>
577<span class="cline-any cline-neutral">&nbsp;</span>
578<span class="cline-any cline-yes">25x</span>
579<span class="cline-any cline-neutral">&nbsp;</span>
580<span class="cline-any cline-yes">25x</span>
581<span class="cline-any cline-neutral">&nbsp;</span>
582<span class="cline-any cline-yes">25x</span>
583<span class="cline-any cline-neutral">&nbsp;</span>
584<span class="cline-any cline-yes">25x</span>
585<span class="cline-any cline-neutral">&nbsp;</span>
586<span class="cline-any cline-yes">25x</span>
587<span class="cline-any cline-neutral">&nbsp;</span>
588<span class="cline-any cline-neutral">&nbsp;</span>
589<span class="cline-any cline-yes">25x</span>
590<span class="cline-any cline-neutral">&nbsp;</span>
591<span class="cline-any cline-yes">25x</span>
592<span class="cline-any cline-yes">25x</span>
593<span class="cline-any cline-neutral">&nbsp;</span>
594<span class="cline-any cline-yes">25x</span>
595<span class="cline-any cline-yes">21x</span>
596<span class="cline-any cline-yes">21x</span>
597<span class="cline-any cline-neutral">&nbsp;</span>
598<span class="cline-any cline-neutral">&nbsp;</span>
599<span class="cline-any cline-yes">4x</span>
600<span class="cline-any cline-yes">4x</span>
601<span class="cline-any cline-neutral">&nbsp;</span>
602<span class="cline-any cline-neutral">&nbsp;</span>
603<span class="cline-any cline-yes">25x</span>
604<span class="cline-any cline-no">&nbsp;</span>
605<span class="cline-any cline-neutral">&nbsp;</span>
606<span class="cline-any cline-neutral">&nbsp;</span>
607<span class="cline-any cline-yes">25x</span>
608<span class="cline-any cline-neutral">&nbsp;</span>
609<span class="cline-any cline-yes">25x</span>
610<span class="cline-any cline-yes">25x</span>
611<span class="cline-any cline-neutral">&nbsp;</span>
612<span class="cline-any cline-yes">25x</span>
613<span class="cline-any cline-neutral">&nbsp;</span>
614<span class="cline-any cline-neutral">&nbsp;</span>
615<span class="cline-any cline-neutral">&nbsp;</span>
616<span class="cline-any cline-yes">25x</span>
617<span class="cline-any cline-yes">25x</span>
618<span class="cline-any cline-yes">25x</span>
619<span class="cline-any cline-yes">25x</span>
620<span class="cline-any cline-yes">25x</span>
621<span class="cline-any cline-yes">25x</span>
622<span class="cline-any cline-neutral">&nbsp;</span>
623<span class="cline-any cline-yes">25x</span>
624<span class="cline-any cline-yes">4x</span>
625<span class="cline-any cline-yes">4x</span>
626<span class="cline-any cline-neutral">&nbsp;</span>
627<span class="cline-any cline-neutral">&nbsp;</span>
628<span class="cline-any cline-yes">25x</span>
629<span class="cline-any cline-neutral">&nbsp;</span>
630<span class="cline-any cline-yes">25x</span>
631<span class="cline-any cline-neutral">&nbsp;</span>
632<span class="cline-any cline-yes">25x</span>
633<span class="cline-any cline-neutral">&nbsp;</span>
634<span class="cline-any cline-yes">25x</span>
635<span class="cline-any cline-yes">21x</span>
636<span class="cline-any cline-neutral">&nbsp;</span>
637<span class="cline-any cline-neutral">&nbsp;</span>
638<span class="cline-any cline-yes">4x</span>
639<span class="cline-any cline-neutral">&nbsp;</span>
640<span class="cline-any cline-yes">25x</span>
641<span class="cline-any cline-neutral">&nbsp;</span>
642<span class="cline-any cline-yes">25x</span>
643<span class="cline-any cline-neutral">&nbsp;</span>
644<span class="cline-any cline-yes">25x</span>
645<span class="cline-any cline-yes">25x</span>
646<span class="cline-any cline-yes">25x</span>
647<span class="cline-any cline-neutral">&nbsp;</span>
648<span class="cline-any cline-neutral">&nbsp;</span>
649<span class="cline-any cline-neutral">&nbsp;</span>
650<span class="cline-any cline-yes">25x</span>
651<span class="cline-any cline-neutral">&nbsp;</span>
652<span class="cline-any cline-neutral">&nbsp;</span>
653<span class="cline-any cline-neutral">&nbsp;</span>
654<span class="cline-any cline-neutral">&nbsp;</span>
655<span class="cline-any cline-yes">25x</span>
656<span class="cline-any cline-neutral">&nbsp;</span>
657<span class="cline-any cline-yes">25x</span>
658<span class="cline-any cline-yes">25x</span>
659<span class="cline-any cline-neutral">&nbsp;</span>
660<span class="cline-any cline-yes">25x</span>
661<span class="cline-any cline-neutral">&nbsp;</span>
662<span class="cline-any cline-yes">25x</span>
663<span class="cline-any cline-yes">25x</span>
664<span class="cline-any cline-neutral">&nbsp;</span>
665<span class="cline-any cline-yes">25x</span>
666<span class="cline-any cline-yes">23x</span>
667<span class="cline-any cline-yes">21x</span>
668<span class="cline-any cline-yes">21x</span>
669<span class="cline-any cline-yes">21x</span>
670<span class="cline-any cline-neutral">&nbsp;</span>
671<span class="cline-any cline-neutral">&nbsp;</span>
672<span class="cline-any cline-yes">2x</span>
673<span class="cline-any cline-neutral">&nbsp;</span>
674<span class="cline-any cline-neutral">&nbsp;</span>
675<span class="cline-any cline-neutral">&nbsp;</span>
676<span class="cline-any cline-yes">2x</span>
677<span class="cline-any cline-neutral">&nbsp;</span>
678<span class="cline-any cline-neutral">&nbsp;</span>
679<span class="cline-any cline-yes">25x</span>
680<span class="cline-any cline-yes">25x</span>
681<span class="cline-any cline-neutral">&nbsp;</span>
682<span class="cline-any cline-no">&nbsp;</span>
683<span class="cline-any cline-neutral">&nbsp;</span>
684<span class="cline-any cline-neutral">&nbsp;</span>
685<span class="cline-any cline-neutral">&nbsp;</span>
686<span class="cline-any cline-neutral">&nbsp;</span>
687<span class="cline-any cline-yes">25x</span>
688<span class="cline-any cline-neutral">&nbsp;</span>
689<span class="cline-any cline-neutral">&nbsp;</span>
690<span class="cline-any cline-yes">25x</span>
691<span class="cline-any cline-neutral">&nbsp;</span>
692<span class="cline-any cline-yes">25x</span>
693<span class="cline-any cline-yes">25x</span>
694<span class="cline-any cline-yes">25x</span>
695<span class="cline-any cline-yes">25x</span>
696<span class="cline-any cline-neutral">&nbsp;</span>
697<span class="cline-any cline-yes">25x</span>
698<span class="cline-any cline-neutral">&nbsp;</span>
699<span class="cline-any cline-neutral">&nbsp;</span>
700<span class="cline-any cline-neutral">&nbsp;</span>
701<span class="cline-any cline-neutral">&nbsp;</span>
702<span class="cline-any cline-neutral">&nbsp;</span>
703<span class="cline-any cline-neutral">&nbsp;</span>
704<span class="cline-any cline-yes">1x</span>
705<span class="cline-any cline-neutral">&nbsp;</span>
706<span class="cline-any cline-neutral">&nbsp;</span>
707<span class="cline-any cline-neutral">&nbsp;</span>
708<span class="cline-any cline-neutral">&nbsp;</span>
709<span class="cline-any cline-neutral">&nbsp;</span>
710<span class="cline-any cline-neutral">&nbsp;</span>
711<span class="cline-any cline-yes">51x</span>
712<span class="cline-any cline-neutral">&nbsp;</span>
713<span class="cline-any cline-neutral">&nbsp;</span>
714<span class="cline-any cline-neutral">&nbsp;</span>
715<span class="cline-any cline-neutral">&nbsp;</span>
716<span class="cline-any cline-neutral">&nbsp;</span>
717<span class="cline-any cline-neutral">&nbsp;</span>
718<span class="cline-any cline-neutral">&nbsp;</span>
719<span class="cline-any cline-neutral">&nbsp;</span>
720<span class="cline-any cline-yes">77x</span>
721<span class="cline-any cline-yes">77x</span>
722<span class="cline-any cline-yes">26x</span>
723<span class="cline-any cline-yes">26x</span>
724<span class="cline-any cline-neutral">&nbsp;</span>
725<span class="cline-any cline-yes">77x</span>
726<span class="cline-any cline-yes">6x</span>
727<span class="cline-any cline-yes">6x</span>
728<span class="cline-any cline-neutral">&nbsp;</span>
729<span class="cline-any cline-yes">77x</span>
730<span class="cline-any cline-yes">4x</span>
731<span class="cline-any cline-yes">4x</span>
732<span class="cline-any cline-neutral">&nbsp;</span>
733<span class="cline-any cline-yes">77x</span>
734<span class="cline-any cline-yes">4x</span>
735<span class="cline-any cline-yes">4x</span>
736<span class="cline-any cline-neutral">&nbsp;</span>
737<span class="cline-any cline-neutral">&nbsp;</span>
738<span class="cline-any cline-neutral">&nbsp;</span>
739<span class="cline-any cline-neutral">&nbsp;</span>
740<span class="cline-any cline-yes">23x</span>
741<span class="cline-any cline-yes">23x</span>
742<span class="cline-any cline-yes">21x</span>
743<span class="cline-any cline-yes">21x</span>
744<span class="cline-any cline-neutral">&nbsp;</span>
745<span class="cline-any cline-neutral">&nbsp;</span>
746<span class="cline-any cline-neutral">&nbsp;</span>
747<span class="cline-any cline-yes">2x</span>
748<span class="cline-any cline-neutral">&nbsp;</span>
749<span class="cline-any cline-neutral">&nbsp;</span>
750<span class="cline-any cline-neutral">&nbsp;</span>
751<span class="cline-any cline-neutral">&nbsp;</span>
752<span class="cline-any cline-neutral">&nbsp;</span>
753<span class="cline-any cline-neutral">&nbsp;</span>
754<span class="cline-any cline-neutral">&nbsp;</span>
755<span class="cline-any cline-neutral">&nbsp;</span>
756<span class="cline-any cline-neutral">&nbsp;</span>
757<span class="cline-any cline-neutral">&nbsp;</span>
758<span class="cline-any cline-neutral">&nbsp;</span>
759<span class="cline-any cline-neutral">&nbsp;</span>
760<span class="cline-any cline-neutral">&nbsp;</span>
761<span class="cline-any cline-neutral">&nbsp;</span>
762<span class="cline-any cline-neutral">&nbsp;</span>
763<span class="cline-any cline-yes">23x</span>
764<span class="cline-any cline-yes">23x</span>
765<span class="cline-any cline-yes">23x</span>
766<span class="cline-any cline-neutral">&nbsp;</span>
767<span class="cline-any cline-no">&nbsp;</span>
768<span class="cline-any cline-neutral">&nbsp;</span>
769<span class="cline-any cline-neutral">&nbsp;</span>
770<span class="cline-any cline-neutral">&nbsp;</span>
771<span class="cline-any cline-neutral">&nbsp;</span>
772<span class="cline-any cline-neutral">&nbsp;</span>
773<span class="cline-any cline-neutral">&nbsp;</span>
774<span class="cline-any cline-neutral">&nbsp;</span>
775<span class="cline-any cline-neutral">&nbsp;</span>
776<span class="cline-any cline-yes">24x</span>
777<span class="cline-any cline-neutral">&nbsp;</span>
778<span class="cline-any cline-neutral">&nbsp;</span>
779<span class="cline-any cline-neutral">&nbsp;</span>
780<span class="cline-any cline-neutral">&nbsp;</span>
781<span class="cline-any cline-neutral">&nbsp;</span>
782<span class="cline-any cline-neutral">&nbsp;</span>
783<span class="cline-any cline-neutral">&nbsp;</span>
784<span class="cline-any cline-yes">2x</span>
785<span class="cline-any cline-neutral">&nbsp;</span>
786<span class="cline-any cline-neutral">&nbsp;</span>
787<span class="cline-any cline-neutral">&nbsp;</span>
788<span class="cline-any cline-neutral">&nbsp;</span>
789<span class="cline-any cline-neutral">&nbsp;</span>
790<span class="cline-any cline-neutral">&nbsp;</span>
791<span class="cline-any cline-yes">454x</span>
792<span class="cline-any cline-neutral">&nbsp;</span>
793<span class="cline-any cline-neutral">&nbsp;</span>
794<span class="cline-any cline-neutral">&nbsp;</span>
795<span class="cline-any cline-neutral">&nbsp;</span>
796<span class="cline-any cline-neutral">&nbsp;</span>
797<span class="cline-any cline-neutral">&nbsp;</span>
798<span class="cline-any cline-yes">253x</span>
799<span class="cline-any cline-neutral">&nbsp;</span>
800<span class="cline-any cline-neutral">&nbsp;</span>
801<span class="cline-any cline-neutral">&nbsp;</span>
802<span class="cline-any cline-neutral">&nbsp;</span>
803<span class="cline-any cline-neutral">&nbsp;</span>
804<span class="cline-any cline-neutral">&nbsp;</span>
805<span class="cline-any cline-yes">21x</span>
806<span class="cline-any cline-neutral">&nbsp;</span>
807<span class="cline-any cline-neutral">&nbsp;</span>
808<span class="cline-any cline-neutral">&nbsp;</span>
809<span class="cline-any cline-neutral">&nbsp;</span>
810<span class="cline-any cline-neutral">&nbsp;</span>
811<span class="cline-any cline-neutral">&nbsp;</span>
812<span class="cline-any cline-neutral">&nbsp;</span>
813<span class="cline-any cline-neutral">&nbsp;</span>
814<span class="cline-any cline-neutral">&nbsp;</span>
815<span class="cline-any cline-neutral">&nbsp;</span>
816<span class="cline-any cline-neutral">&nbsp;</span>
817<span class="cline-any cline-neutral">&nbsp;</span>
818<span class="cline-any cline-neutral">&nbsp;</span>
819<span class="cline-any cline-neutral">&nbsp;</span>
820<span class="cline-any cline-yes">2x</span>
821<span class="cline-any cline-neutral">&nbsp;</span>
822<span class="cline-any cline-neutral">&nbsp;</span>
823<span class="cline-any cline-neutral">&nbsp;</span>
824<span class="cline-any cline-neutral">&nbsp;</span>
825<span class="cline-any cline-neutral">&nbsp;</span>
826<span class="cline-any cline-neutral">&nbsp;</span>
827<span class="cline-any cline-yes">1x</span>
828<span class="cline-any cline-neutral">&nbsp;</span>
829<span class="cline-any cline-neutral">&nbsp;</span>
830<span class="cline-any cline-neutral">&nbsp;</span>
831<span class="cline-any cline-neutral">&nbsp;</span>
832<span class="cline-any cline-neutral">&nbsp;</span>
833<span class="cline-any cline-neutral">&nbsp;</span>
834<span class="cline-any cline-yes">10x</span>
835<span class="cline-any cline-neutral">&nbsp;</span>
836<span class="cline-any cline-neutral">&nbsp;</span>
837<span class="cline-any cline-neutral">&nbsp;</span>
838<span class="cline-any cline-neutral">&nbsp;</span>
839<span class="cline-any cline-neutral">&nbsp;</span>
840<span class="cline-any cline-neutral">&nbsp;</span>
841<span class="cline-any cline-yes">26x</span>
842<span class="cline-any cline-yes">26x</span>
843<span class="cline-any cline-neutral">&nbsp;</span>
844<span class="cline-any cline-yes">26x</span>
845<span class="cline-any cline-no">&nbsp;</span>
846<span class="cline-any cline-neutral">&nbsp;</span>
847<span class="cline-any cline-neutral">&nbsp;</span>
848<span class="cline-any cline-yes">26x</span>
849<span class="cline-any cline-neutral">&nbsp;</span>
850<span class="cline-any cline-no">&nbsp;</span>
851<span class="cline-any cline-neutral">&nbsp;</span>
852<span class="cline-any cline-neutral">&nbsp;</span>
853<span class="cline-any cline-yes">26x</span>
854<span class="cline-any cline-no">&nbsp;</span>
855<span class="cline-any cline-neutral">&nbsp;</span>
856<span class="cline-any cline-neutral">&nbsp;</span>
857<span class="cline-any cline-yes">26x</span>
858<span class="cline-any cline-neutral">&nbsp;</span>
859<span class="cline-any cline-no">&nbsp;</span>
860<span class="cline-any cline-neutral">&nbsp;</span>
861<span class="cline-any cline-neutral">&nbsp;</span>
862<span class="cline-any cline-yes">26x</span>
863<span class="cline-any cline-neutral">&nbsp;</span>
864<span class="cline-any cline-neutral">&nbsp;</span>
865<span class="cline-any cline-neutral">&nbsp;</span>
866<span class="cline-any cline-neutral">&nbsp;</span>
867<span class="cline-any cline-neutral">&nbsp;</span>
868<span class="cline-any cline-neutral">&nbsp;</span>
869<span class="cline-any cline-neutral">&nbsp;</span>
870<span class="cline-any cline-yes">4x</span>
871<span class="cline-any cline-neutral">&nbsp;</span>
872<span class="cline-any cline-neutral">&nbsp;</span>
873<span class="cline-any cline-neutral">&nbsp;</span>
874<span class="cline-any cline-neutral">&nbsp;</span>
875<span class="cline-any cline-neutral">&nbsp;</span>
876<span class="cline-any cline-neutral">&nbsp;</span>
877<span class="cline-any cline-neutral">&nbsp;</span>
878<span class="cline-any cline-yes">2x</span>
879<span class="cline-any cline-neutral">&nbsp;</span>
880<span class="cline-any cline-neutral">&nbsp;</span>
881<span class="cline-any cline-neutral">&nbsp;</span>
882<span class="cline-any cline-neutral">&nbsp;</span>
883<span class="cline-any cline-neutral">&nbsp;</span>
884<span class="cline-any cline-neutral">&nbsp;</span>
885<span class="cline-any cline-yes">4x</span>
886<span class="cline-any cline-neutral">&nbsp;</span>
887<span class="cline-any cline-neutral">&nbsp;</span>
888<span class="cline-any cline-neutral">&nbsp;</span>
889<span class="cline-any cline-neutral">&nbsp;</span>
890<span class="cline-any cline-neutral">&nbsp;</span>
891<span class="cline-any cline-neutral">&nbsp;</span>
892<span class="cline-any cline-neutral">&nbsp;</span>
893<span class="cline-any cline-neutral">&nbsp;</span>
894<span class="cline-any cline-yes">4x</span>
895<span class="cline-any cline-yes">4x</span>
896<span class="cline-any cline-neutral">&nbsp;</span>
897<span class="cline-any cline-yes">4x</span>
898<span class="cline-any cline-no">&nbsp;</span>
899<span class="cline-any cline-neutral">&nbsp;</span>
900<span class="cline-any cline-neutral">&nbsp;</span>
901<span class="cline-any cline-yes">4x</span>
902<span class="cline-any cline-neutral">&nbsp;</span>
903<span class="cline-any cline-yes">4x</span>
904<span class="cline-any cline-yes">1x</span>
905<span class="cline-any cline-neutral">&nbsp;</span>
906<span class="cline-any cline-neutral">&nbsp;</span>
907<span class="cline-any cline-yes">3x</span>
908<span class="cline-any cline-no">&nbsp;</span>
909<span class="cline-any cline-neutral">&nbsp;</span>
910<span class="cline-any cline-neutral">&nbsp;</span>
911<span class="cline-any cline-yes">3x</span>
912<span class="cline-any cline-yes">3x</span>
913<span class="cline-any cline-yes">6x</span>
914<span class="cline-any cline-yes">6x</span>
915<span class="cline-any cline-yes">6x</span>
916<span class="cline-any cline-no">&nbsp;</span>
917<span class="cline-any cline-neutral">&nbsp;</span>
918<span class="cline-any cline-neutral">&nbsp;</span>
919<span class="cline-any cline-neutral">&nbsp;</span>
920<span class="cline-any cline-yes">6x</span>
921<span class="cline-any cline-yes">6x</span>
922<span class="cline-any cline-no">&nbsp;</span>
923<span class="cline-any cline-neutral">&nbsp;</span>
924<span class="cline-any cline-neutral">&nbsp;</span>
925<span class="cline-any cline-yes">6x</span>
926<span class="cline-any cline-yes">3x</span>
927<span class="cline-any cline-neutral">&nbsp;</span>
928<span class="cline-any cline-neutral">&nbsp;</span>
929<span class="cline-any cline-yes">3x</span>
930<span class="cline-any cline-neutral">&nbsp;</span>
931<span class="cline-any cline-neutral">&nbsp;</span>
932<span class="cline-any cline-neutral">&nbsp;</span>
933<span class="cline-any cline-neutral">&nbsp;</span>
934<span class="cline-any cline-yes">3x</span>
935<span class="cline-any cline-neutral">&nbsp;</span>
936<span class="cline-any cline-neutral">&nbsp;</span>
937<span class="cline-any cline-neutral">&nbsp;</span>
938<span class="cline-any cline-neutral">&nbsp;</span>
939<span class="cline-any cline-neutral">&nbsp;</span>
940<span class="cline-any cline-neutral">&nbsp;</span>
941<span class="cline-any cline-neutral">&nbsp;</span>
942<span class="cline-any cline-yes">14x</span>
943<span class="cline-any cline-neutral">&nbsp;</span>
944<span class="cline-any cline-yes">1x</span>
945<span class="cline-any cline-neutral">&nbsp;</span>
946<span class="cline-any cline-yes">1x</span>
947<span class="cline-any cline-neutral">&nbsp;</span>
948<span class="cline-any cline-yes">1x</span>
949<span class="cline-any cline-neutral">&nbsp;</span>
950<span class="cline-any cline-yes">1x</span>
951<span class="cline-any cline-neutral">&nbsp;</span>
952<span class="cline-any cline-yes">1x</span>
953<span class="cline-any cline-neutral">&nbsp;</span>
954<span class="cline-any cline-yes">4x</span>
955<span class="cline-any cline-neutral">&nbsp;</span>
956<span class="cline-any cline-yes">4x</span>
957<span class="cline-any cline-neutral">&nbsp;</span>
958<span class="cline-any cline-yes">1x</span>
959<span class="cline-any cline-neutral">&nbsp;</span>
960<span class="cline-any cline-neutral">&nbsp;</span>
961<span class="cline-any cline-neutral">&nbsp;</span>
962<span class="cline-any cline-neutral">&nbsp;</span>
963<span class="cline-any cline-neutral">&nbsp;</span>
964<span class="cline-any cline-neutral">&nbsp;</span>
965<span class="cline-any cline-neutral">&nbsp;</span>
966<span class="cline-any cline-neutral">&nbsp;</span>
967<span class="cline-any cline-neutral">&nbsp;</span>
968<span class="cline-any cline-neutral">&nbsp;</span>
969<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// Copyright (C) 2017 Norman Breau
970&nbsp;
971// This program is free software: you can redistribute it and/or modify
972// it under the terms of the GNU General Public License as published by
973// the Free Software Foundation, either version 3 of the License, or
974// (at your option) any later version.
975&nbsp;
976// This program is distributed in the hope that it will be useful,
977// but WITHOUT ANY WARRANTY; without even the implied warranty of
978// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
979// GNU General Public License for more details.
980&nbsp;
981// You should have received a copy of the GNU General Public License
982// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
983&nbsp;
984import {EventEmitter} from 'events';
985import {setInstance} from './instance';
986import {Logger} from './Logger';
987import {LogSeverity} from './LogSeverity';
988import {TokenManager} from './TokenManager';
989import {ApplicationEvent} from './ApplicationEvent';
990import {ExitCode} from './ExitCode';
991import {Database} from './Database';
992import {Handler} from './Handler';
993import {IHandler} from './IHandler';
994import {Request} from './Request';
995import {Response} from './Response';
996import {ConfigLoader} from './ConfigLoader';
997import {IConfig} from './IConfig';
998import Commander = require('commander');
999import * as Express from 'express';
1000import * as BodyParser from 'body-parser';
1001import * as http from 'http';
1002&nbsp;
1003// tslint:disable-next-line: no-var-requires
1004require('source-map-support').install();
1005&nbsp;
1006/**
1007 * The default log level to log informational, warnings, errors, and fatal messages.
1008 */
1009const DEFAULT_LOG_LEVEL = LogSeverity.INFO | LogSeverity.WARNING | LogSeverity.ERROR | LogSeverity.FATAL;
1010&nbsp;
1011/**
1012 * Main entry point for the Application. Should be extended and have the abstract methods implemented.
1013 */
1014export abstract class Application extends EventEmitter {
1015 private logger: Logger;
1016 private name: string;
1017 private configPath: string;
1018 private config: IConfig;
1019 private tokenManager: TokenManager;
1020 private server: Express.Application;
1021 private db: Database;
1022 private _logConfigDefaulting: boolean;
1023 private _isTestEnvironment: boolean;
1024 private socket: http.Server;
1025&nbsp;
1026 // private _argv: any;
1027 private _program: Commander.CommanderStatic;
1028&nbsp;
1029 /**
1030 *
1031 * @param name The application name
1032 * @param configPath The directory where bt-config.json and bt-local-config.json can be found. Defaults to current working directory.
1033 * @param logSeverity Log severity. Defaults to INFO | WARNING | ERROR | FATAL
1034 */
1035 public constructor(name: string, configPath: string, logSeverity?: LogSeverity) {
1036 super();
1037&nbsp;
1038 setInstance(this);
1039&nbsp;
1040 this._isTestEnvironment = false;
1041
1042 this.$buildArgOptions();
1043&nbsp;
1044 <span class="missing-if-branch" title="else path not taken" >E</span>if ((&lt;any&gt;global).jasmine) {
1045 // We are in a test development
1046 this._isTestEnvironment = true;
1047 }
1048&nbsp;
1049 this._program.parse(process.argv);
1050&nbsp;
1051 this.name = name;
1052 this.logger = this._createLogger();
1053&nbsp;
1054 if (logSeverity) {
1055 this._logConfigDefaulting = false;
1056 this.getLogger().setLogLevel(logSeverity);
1057 }
1058 else {
1059 this._logConfigDefaulting = true;
1060 this.getLogger().setLogLevel(this._getDefaultLogLevel());
1061 }
1062&nbsp;
1063 process.on('unhandledRejection', <span class="fstat-no" title="function not covered" >(e</span>rror: any) =&gt; {
1064<span class="cstat-no" title="statement not covered" > this.getLogger().fatal(error);</span>
1065 });
1066&nbsp;
1067 this.configPath = configPath || <span class="branch-1 cbranch-no" title="branch not covered" >process.cwd();</span>
1068&nbsp;
1069 this.getLogger().trace('Application is booting...');
1070 this.getLogger().trace('Loading Configuration...');
1071&nbsp;
1072 this._load();
1073 }
1074&nbsp;
1075 private _load(): void {
1076 this.loadConfig(this.configPath).then((config: IConfig) =&gt; {
1077 this.config = config;
1078 this.getLogger().trace('Configuration loaded.');
1079 this.emit(ApplicationEvent.CONFIG_LOADED);
1080 this.onConfigLoad(this.config);
1081 return Promise.resolve();
1082 }).then(() =&gt; {
1083 if (this._logConfigDefaulting) {
1084 let logSeverity: LogSeverity = this._parseLogLevelConfig(this.getConfig());
1085 this.logger.setLogLevel(logSeverity);
1086 }
1087&nbsp;
1088 this.logger.loadFilters();
1089&nbsp;
1090 this.getLogger().trace('Initializing DB...');
1091&nbsp;
1092 return this.initDB(this.getConfig());
1093 }).then((db: Database) =&gt; {
1094 if (db) {
1095 this.getLogger().trace('DB Initialized.');
1096 }
1097 else {
1098 this.getLogger().trace('DB is not initialized.');
1099 }
1100 this.db = db;
1101&nbsp;
1102 return Promise.resolve();
1103 }).then(() =&gt; {
1104 this.getLogger().trace('Starting server...');
1105 this.server = Express();
1106 this.server.use(BodyParser.json({
1107 type : 'application/json',
1108 limit : this.getRequestSizeLimit()
1109 }));
1110 this.server.use(BodyParser.text({
1111 type : 'text/*',
1112 limit : this.getRequestSizeLimit()
1113 }));
1114&nbsp;
1115 return Promise.resolve();
1116 }).then(() =&gt; {
1117 this.getLogger().trace('Attaching handlers...');
1118 return this.attachHandlers();
1119 }).then(() =&gt; {
1120 this.onBeforeReady();
1121
1122 let bindingIP: string = this.getConfig().binding_ip;
1123 let port: number = this.getConfig().port;
1124
1125 if (bindingIP !== null &amp;&amp; bindingIP !== 'null') {
1126 if (this.shouldListen()) {
1127 this.getLogger().trace(`Server started on ${bindingIP}:${port}`);
1128 this.socket = http.createServer(this.server);
1129 this.socket.listen(port, bindingIP);
1130 }
1131 else {
1132 this.getLogger().trace('Server did not bind because shouldListen() returned false.');
1133 }
1134 }
1135 else {
1136 this.getLogger().info(`Server does not have a bounding IP set. The server will not be listening for connections.`);
1137 }
1138&nbsp;
1139 this.onReady();
1140 this.emit('ready');
1141 }).catch(<span class="fstat-no" title="function not covered" >(e</span>rror) =&gt; {
1142<span class="cstat-no" title="statement not covered" > this.getLogger().fatal(error);</span>
1143 });
1144 }
1145&nbsp;
1146 private $buildArgOptions() {
1147 this._program = Commander;
1148&nbsp;
1149 // eslint-disable-next-line @typescript-eslint/no-var-requires
1150 let pkg: any = require('../package.json');
1151
1152 this._program.version(pkg.version, '-v, --version');
1153 this._program.option('--port &lt;port&gt;', 'The running port to consume');
1154 this._program.option('--binding &lt;ip&gt;', 'The binding IP to listen on');
1155 this._program.option('--authentication_header', 'The header name of the authentication token');
1156&nbsp;
1157 this._buildArgOptions(this._program);
1158 }
1159&nbsp;
1160 // eslint-disable-next-line @typescript-eslint/no-empty-function
1161 protected _buildArgOptions(program: Commander.CommanderStatic): void {}
1162&nbsp;
1163 public getProgram(): Commander.CommanderStatic {
1164 return this._program;
1165 }
1166&nbsp;
1167 /**
1168 * The maximum size limit for incoming requests that this service needs to handle.
1169 */
1170 public getRequestSizeLimit(): number {
1171 return this.getConfig().request_size_limit;
1172 }
1173&nbsp;
1174 /**
1175 *
1176 * @param path The URL API path. E.g. /api/myService/myCommand/
1177 * @param HandlerClass The concrete class (not the instance) of Handler to be used for this API.
1178 */
1179 public attachHandler(path: string, HandlerClass: IHandler): void {
1180 let handler: Handler = new HandlerClass(this);
1181 this.server.get(path, (request: Express.Request, response: Express.Response) =&gt; {
1182 let r: Request = new Request(request);
1183 handler.get(r, new Response(response, r.getURL()));
1184 });
1185 this.server.post(path, (request: Express.Request, response: Express.Response) =&gt; {
1186 let r: Request = new Request(request);
1187 handler.post(r, new Response(response, r.getURL()));
1188 });
1189 this.server.put(path, (request: Express.Request, response: Express.Response) =&gt; {
1190 let r: Request = new Request(request);
1191 handler.put(r, new Response(response, r.getURL()));
1192 });
1193 this.server.delete(path, (request: Express.Request, response: Express.Response) =&gt; {
1194 let r: Request = new Request(request);
1195 handler.delete(r, new Response(response, r.getURL()));
1196 });
1197 }
1198&nbsp;
1199 public close(): Promise&lt;void&gt; {
1200 return new Promise&lt;void&gt;((resolve, reject) =&gt; {
1201 if (this.socket &amp;&amp; this.socket.listening) {
1202 this.socket.close(() =&gt; {
1203 resolve();
1204 });
1205 }
1206 else {
1207 resolve();
1208 }
1209 });
1210 }
1211&nbsp;
1212 /**
1213 * Subclasses are expected to attach the API handlers for their service. This will be invoked during application startup.
1214 * @returns Promise&lt;void&gt;
1215 */
1216 protected abstract attachHandlers(): Promise&lt;void&gt;;
1217&nbsp;
1218 /**
1219 *
1220 * @param path The directory path that contains bt-config.json and bt-local-config.json
1221 */
1222 public loadConfig(path: string): Promise&lt;IConfig&gt; {
1223 return new Promise&lt;IConfig&gt;((resolve, reject) =&gt; {
1224 ConfigLoader.load(path).then((config: IConfig) =&gt; {
1225 resolve(config);
1226 }).catch(<span class="fstat-no" title="function not covered" >(e</span>xitCode: ExitCode) =&gt; {
1227<span class="cstat-no" title="statement not covered" > process.exit(exitCode);</span>
1228 });
1229 });
1230 }
1231&nbsp;
1232 /**
1233 * @returns the application name
1234 */
1235 public getName(): string {
1236 return this.name;
1237 }
1238&nbsp;
1239 /**
1240 *
1241 * @param logger Logger class to use
1242 */
1243 public setLogger(logger: Logger): void {
1244 this.logger = logger;
1245 }
1246&nbsp;
1247 /**
1248 * @returns the application's logger
1249 */
1250 public getLogger(): Logger {
1251 return this.logger;
1252 }
1253&nbsp;
1254 /**
1255 * @returns the config object.
1256 */
1257 public getConfig(): IConfig {
1258 return this.config;
1259 }
1260&nbsp;
1261 /**
1262 * @returns true if the Application should bind to an IP address
1263 */
1264 public shouldListen(): boolean {
1265 return true;
1266 }
1267&nbsp;
1268 /**
1269 * Invoked once the config has been loaded and ready to be used.
1270 *
1271 * @param config The config object (as defined in bt-config.json/bt-local-config.json)
1272 */
1273 protected onConfigLoad(config: IConfig): void {}
1274&nbsp;
1275 /**
1276 * Sets the TokenManager to be used for authentication.
1277 * @param tokenManager
1278 */
1279 public setTokenManager(tokenManager: TokenManager): void {
1280 this.tokenManager = tokenManager;
1281 }
1282&nbsp;
1283 /**
1284 * @returns the token manager
1285 */
1286 public getTokenManager(): TokenManager {
1287 return this.tokenManager;
1288 }
1289&nbsp;
1290 /**
1291 * @returns the database pool. This will need to be casted based on your preferred database dialect.
1292 */
1293 public getDB(): Database {
1294 return this.db;
1295 }
1296&nbsp;
1297 /**
1298 * @returns command line arguments
1299 */
1300 public getCmdLineArgs(): any {
1301 let program: Commander.CommanderStatic = this._program;
1302 let o: any = {};
1303&nbsp;
1304 <span class="missing-if-branch" title="if path not taken" >I</span>if (!program) {
1305<span class="cstat-no" title="statement not covered" > return o;</span>
1306 }
1307&nbsp;
1308 <span class="missing-if-branch" title="if path not taken" >I</span>if (program.binding !== undefined) {
1309 // eslint-disable-next-line @typescript-eslint/camelcase
1310<span class="cstat-no" title="statement not covered" > o.binding_ip = program.binding;</span>
1311 }
1312&nbsp;
1313 <span class="missing-if-branch" title="if path not taken" >I</span>if (program.port !== undefined) {
1314<span class="cstat-no" title="statement not covered" > o.port = program.port;</span>
1315 }
1316&nbsp;
1317 <span class="missing-if-branch" title="if path not taken" >I</span>if (program.authenticationHeader !== undefined) {
1318 // eslint-disable-next-line @typescript-eslint/camelcase
1319<span class="cstat-no" title="statement not covered" > o.authentication_header = program.authenticationHeader;</span>
1320 }
1321&nbsp;
1322 return o;
1323 }
1324&nbsp;
1325 /**
1326 * Subclasses are expected to override this to configure their database setup, if the service uses a database.
1327 * @param config The bt-config object
1328 */
1329 protected initDB(config: IConfig): Promise&lt;Database&gt; {
1330 return Promise.resolve(null);
1331 }
1332&nbsp;
1333 /**
1334 * Creates the logger instance used by the application
1335 * @returns Logger
1336 */
1337 protected _createLogger(): Logger {
1338 return new Logger(this.getName());
1339 }
1340&nbsp;
1341 /**
1342 * Sets the default log level on the Logger
1343 */
1344 protected _getDefaultLogLevel(): LogSeverity {
1345 return DEFAULT_LOG_LEVEL;
1346 }
1347&nbsp;
1348 /**
1349 * Parses the log severity flags from the config object.
1350 * @param config bt-config object
1351 * @returns the severity mask
1352 */
1353 protected _parseLogLevelConfig(config: IConfig): LogSeverity {
1354 let llConfig: string = config.log_level;
1355 let severity: LogSeverity = null;
1356&nbsp;
1357 <span class="missing-if-branch" title="if path not taken" >I</span>if (!llConfig) {
1358<span class="cstat-no" title="statement not covered" > return null;</span>
1359 }
1360&nbsp;
1361 llConfig = llConfig.toLowerCase().trim();
1362&nbsp;
1363 if (llConfig.indexOf('all') &gt; -1) {
1364 return LogSeverity.ALL;
1365 }
1366&nbsp;
1367 <span class="missing-if-branch" title="if path not taken" >I</span>if (llConfig.indexOf('|') === -1) {
1368<span class="cstat-no" title="statement not covered" > severity = this._llStrToSeverity(llConfig);</span>
1369 }
1370 else {
1371 let llParts: Array&lt;string&gt; = llConfig.split('|');
1372 for (let i: number = 0; i &lt; llParts.length; i++) {
1373 let llPart: string = llParts[i];
1374 llPart = llPart.trim();
1375 <span class="missing-if-branch" title="if path not taken" >I</span>if (llPart === '') {
1376<span class="cstat-no" title="statement not covered" > continue;</span>
1377 }
1378&nbsp;
1379 /* istanbul ignore next */
1380 let llSev: LogSeverity = this._llStrToSeverity(llPart);
1381 <span class="missing-if-branch" title="if path not taken" >I</span>if (!llSev) {
1382<span class="cstat-no" title="statement not covered" > continue;</span>
1383 }
1384&nbsp;
1385 if (!severity) {
1386 severity = llSev;
1387 }
1388 else {
1389 severity = severity | llSev;
1390 }
1391 }
1392 }
1393&nbsp;
1394 return severity;
1395 }
1396&nbsp;
1397 /**
1398 * Translates the severity string to its corresponding enumeration value.
1399 * @param ll sevierty string
1400 */
1401 protected _llStrToSeverity(ll: string): LogSeverity {
1402 switch (ll) {
1403 case 'all':
1404 return LogSeverity.ALL;
1405 case 'trace':
1406 return LogSeverity.TRACE;
1407 case 'debug':
1408 return LogSeverity.DEBUG;
1409 case 'info':
1410 return LogSeverity.INFO;
1411 case 'warning':
1412 return LogSeverity.WARNING;
1413 case 'error':
1414 return LogSeverity.ERROR;
1415 case 'fatal':
1416 return LogSeverity.FATAL;
1417 default:
1418 return null;
1419 }
1420 }
1421&nbsp;
1422 protected onBeforeReady(): void {}
1423&nbsp;
1424 /**
1425 * Invoked when the application is considered ready for operation.
1426 */
1427 protected onReady(): void {}
1428}
1429&nbsp;</pre></td></tr>
1430</table></pre>
1431<div class='push'></div><!-- for sticky footer -->
1432</div><!-- /wrapper -->
1433<div class='footer quiet pad2 space-top1 center small'>
1434 Code coverage
1435 generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Oct 06 2019 20:17:21 GMT-0300 (Atlantic Daylight Time)
1436</div>
1437</div>
1438<script src="prettify.js"></script>
1439<script>
1440window.onload = function () {
1441 if (typeof prettyPrint === 'function') {
1442 prettyPrint();
1443 }
1444};
1445</script>
1446<script src="sorter.js"></script>
1447<script src="block-navigation.js"></script>
1448</body>
1449</html>