kareem 2.6.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1603 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for index.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> index.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">96.66% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>232/240</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">90.08% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>109/121</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'>30/30</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">96.56% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>225/233</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></td><td class="line-coverage quiet"><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-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-yes">62x</span>
579
+ <span class="cline-any cline-yes">62x</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-yes">1x</span>
583
+ <span class="cline-any cline-yes">6x</span>
584
+ <span class="cline-any cline-yes">3x</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-yes">3x</span>
588
+ <span class="cline-any cline-neutral">&nbsp;</span>
589
+ <span class="cline-any cline-neutral">&nbsp;</span>
590
+ <span class="cline-any cline-yes">1x</span>
591
+ <span class="cline-any cline-yes">12x</span>
592
+ <span class="cline-any cline-yes">6x</span>
593
+ <span class="cline-any cline-neutral">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-yes">6x</span>
596
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-yes">1x</span>
606
+ <span class="cline-any cline-yes">27x</span>
607
+ <span class="cline-any cline-yes">27x</span>
608
+ <span class="cline-any cline-yes">27x</span>
609
+ <span class="cline-any cline-yes">27x</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-yes">27x</span>
612
+ <span class="cline-any cline-yes">3x</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-yes">24x</span>
616
+ <span class="cline-any cline-yes">24x</span>
617
+ <span class="cline-any cline-yes">33x</span>
618
+ <span class="cline-any cline-yes">27x</span>
619
+ <span class="cline-any cline-yes">27x</span>
620
+ <span class="cline-any cline-yes">27x</span>
621
+ <span class="cline-any cline-yes">27x</span>
622
+ <span class="cline-any cline-yes">27x</span>
623
+ <span class="cline-any cline-neutral">&nbsp;</span>
624
+ <span class="cline-any cline-yes">27x</span>
625
+ <span class="cline-any cline-yes">27x</span>
626
+ <span class="cline-any cline-yes">27x</span>
627
+ <span class="cline-any cline-yes">19x</span>
628
+ <span class="cline-any cline-no">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-yes">19x</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-yes">27x</span>
634
+ <span class="cline-any cline-yes">27x</span>
635
+ <span class="cline-any cline-yes">27x</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-yes">27x</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-yes">9x</span>
642
+ <span class="cline-any cline-yes">3x</span>
643
+ <span class="cline-any cline-yes">3x</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-yes">6x</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-yes">6x</span>
649
+ <span class="cline-any cline-yes">6x</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-yes">2x</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-yes">2x</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-yes">16x</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-yes">16x</span>
663
+ <span class="cline-any cline-yes">3x</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-neutral">&nbsp;</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-yes">1x</span>
675
+ <span class="cline-any cline-yes">4x</span>
676
+ <span class="cline-any cline-yes">4x</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-yes">4x</span>
679
+ <span class="cline-any cline-yes">4x</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</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-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-yes">1x</span>
692
+ <span class="cline-any cline-yes">27x</span>
693
+ <span class="cline-any cline-yes">27x</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-yes">27x</span>
696
+ <span class="cline-any cline-yes">27x</span>
697
+ <span class="cline-any cline-yes">6x</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-yes">27x</span>
701
+ <span class="cline-any cline-yes">1x</span>
702
+ <span class="cline-any cline-no">&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-yes">26x</span>
708
+ <span class="cline-any cline-yes">41x</span>
709
+ <span class="cline-any cline-yes">41x</span>
710
+ <span class="cline-any cline-yes">41x</span>
711
+ <span class="cline-any cline-yes">41x</span>
712
+ <span class="cline-any cline-yes">41x</span>
713
+ <span class="cline-any cline-yes">40x</span>
714
+ <span class="cline-any cline-yes">40x</span>
715
+ <span class="cline-any cline-yes">40x</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-yes">41x</span>
720
+ <span class="cline-any cline-yes">1x</span>
721
+ <span class="cline-any cline-yes">1x</span>
722
+ <span class="cline-any cline-yes">1x</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-yes">41x</span>
729
+ <span class="cline-any cline-yes">41x</span>
730
+ <span class="cline-any cline-yes">41x</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-yes">41x</span>
733
+ <span class="cline-any cline-yes">24x</span>
734
+ <span class="cline-any cline-yes">12x</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-yes">12x</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">41x</span>
741
+ <span class="cline-any cline-yes">14x</span>
742
+ <span class="cline-any cline-yes">8x</span>
743
+ <span class="cline-any cline-yes">8x</span>
744
+ <span class="cline-any cline-yes">8x</span>
745
+ <span class="cline-any cline-yes">1x</span>
746
+ <span class="cline-any cline-yes">7x</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-yes">6x</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-yes">5x</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-no">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-yes">5x</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-yes">6x</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-yes">27x</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-yes">1x</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-yes">26x</span>
766
+ <span class="cline-any cline-yes">26x</span>
767
+ <span class="cline-any cline-yes">26x</span>
768
+ <span class="cline-any cline-yes">26x</span>
769
+ <span class="cline-any cline-yes">3x</span>
770
+ <span class="cline-any cline-yes">23x</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-yes">18x</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-yes">7x</span>
776
+ <span class="cline-any cline-yes">2x</span>
777
+ <span class="cline-any cline-yes">2x</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-yes">5x</span>
780
+ <span class="cline-any cline-yes">5x</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-yes">19x</span>
784
+ <span class="cline-any cline-yes">2x</span>
785
+ <span class="cline-any cline-yes">2x</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">26x</span>
792
+ <span class="cline-any cline-yes">11x</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-yes">15x</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-neutral">&nbsp;</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">1x</span>
806
+ <span class="cline-any cline-yes">5x</span>
807
+ <span class="cline-any cline-yes">5x</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">5x</span>
810
+ <span class="cline-any cline-yes">6x</span>
811
+ <span class="cline-any cline-yes">6x</span>
812
+ <span class="cline-any cline-yes">2x</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-yes">5x</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-neutral">&nbsp;</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-yes">1x</span>
826
+ <span class="cline-any cline-yes">2x</span>
827
+ <span class="cline-any cline-yes">2x</span>
828
+ <span class="cline-any cline-yes">2x</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">2x</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-yes">2x</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-yes">2x</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-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-yes">1x</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-yes">17x</span>
850
+ <span class="cline-any cline-yes">17x</span>
851
+ <span class="cline-any cline-yes">17x</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-yes">7x</span>
854
+ <span class="cline-any cline-yes">2x</span>
855
+ <span class="cline-any cline-yes">2x</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-yes">5x</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-yes">12x</span>
862
+ <span class="cline-any cline-yes">10x</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-yes">9x</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-yes">7x</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-neutral">&nbsp;</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-yes">1x</span>
876
+ <span class="cline-any cline-yes">2x</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-yes">2x</span>
880
+ <span class="cline-any cline-yes">4x</span>
881
+ <span class="cline-any cline-yes">6x</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-yes">4x</span>
885
+ <span class="cline-any cline-yes">1x</span>
886
+ <span class="cline-any cline-yes">1x</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-yes">3x</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-yes">2x</span>
893
+ <span class="cline-any cline-yes">2x</span>
894
+ <span class="cline-any cline-yes">4x</span>
895
+ <span class="cline-any cline-yes">6x</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-yes">4x</span>
899
+ <span class="cline-any cline-yes">1x</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-yes">3x</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-yes">2x</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-yes">1x</span>
915
+ <span class="cline-any cline-yes">2x</span>
916
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-yes">1x</span>
927
+ <span class="cline-any cline-yes">1x</span>
928
+ <span class="cline-any cline-yes">1x</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-yes">1x</span>
934
+ <span class="cline-any cline-yes">1x</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-neutral">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-yes">1x</span>
948
+ <span class="cline-any cline-yes">51x</span>
949
+ <span class="cline-any cline-yes">43x</span>
950
+ <span class="cline-any cline-yes">43x</span>
951
+ <span class="cline-any cline-yes">8x</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-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-yes">51x</span>
956
+ <span class="cline-any cline-yes">51x</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-yes">51x</span>
959
+ <span class="cline-any cline-yes">1x</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-yes">50x</span>
963
+ <span class="cline-any cline-yes">2x</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-yes">48x</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-yes">50x</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-yes">1x</span>
981
+ <span class="cline-any cline-yes">60x</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-yes">60x</span>
984
+ <span class="cline-any cline-yes">52x</span>
985
+ <span class="cline-any cline-yes">52x</span>
986
+ <span class="cline-any cline-yes">52x</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-yes">60x</span>
990
+ <span class="cline-any cline-yes">1x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-yes">59x</span>
994
+ <span class="cline-any cline-yes">2x</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-yes">57x</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-yes">59x</span>
999
+ <span class="cline-any cline-yes">59x</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-yes">1x</span>
1012
+ <span class="cline-any cline-yes">1x</span>
1013
+ <span class="cline-any cline-yes">1x</span>
1014
+ <span class="cline-any cline-yes">1x</span>
1015
+ <span class="cline-any cline-yes">1x</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-yes">1x</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-yes">1x</span>
1025
+ <span class="cline-any cline-yes">4x</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-yes">4x</span>
1028
+ <span class="cline-any cline-yes">6x</span>
1029
+ <span class="cline-any cline-yes">6x</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-yes">4x</span>
1032
+ <span class="cline-any cline-yes">5x</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">4x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-yes">1x</span>
1045
+ <span class="cline-any cline-yes">1x</span>
1046
+ <span class="cline-any cline-yes">1x</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-yes">1x</span>
1049
+ <span class="cline-any cline-yes">1x</span>
1050
+ <span class="cline-any cline-yes">1x</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-yes">1x</span>
1053
+ <span class="cline-any cline-yes">1x</span>
1054
+ <span class="cline-any cline-yes">1x</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-yes">1x</span>
1057
+ <span class="cline-any cline-yes">1x</span>
1058
+ <span class="cline-any cline-yes">1x</span>
1059
+ <span class="cline-any cline-yes">1x</span>
1060
+ <span class="cline-any cline-yes">1x</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-yes">1x</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-yes">61x</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-yes">41x</span>
1072
+ <span class="cline-any cline-yes">2x</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-yes">39x</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-yes">1x</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict';
1079
+ &nbsp;
1080
+ /**
1081
+ * Create a new instance
1082
+ */
1083
+ function Kareem() {
1084
+ this._pres = new Map();
1085
+ this._posts = new Map();
1086
+ }
1087
+ &nbsp;
1088
+ Kareem.skipWrappedFunction = function skipWrappedFunction() {
1089
+ if (!(this instanceof Kareem.skipWrappedFunction)) {
1090
+ return new Kareem.skipWrappedFunction(...arguments);
1091
+ }
1092
+ &nbsp;
1093
+ this.args = [...arguments];
1094
+ };
1095
+ &nbsp;
1096
+ Kareem.overwriteResult = function overwriteResult() {
1097
+ if (!(this instanceof Kareem.overwriteResult)) {
1098
+ return new Kareem.overwriteResult(...arguments);
1099
+ }
1100
+ &nbsp;
1101
+ this.args = [...arguments];
1102
+ };
1103
+ &nbsp;
1104
+ /**
1105
+ * Execute all "pre" hooks for "name"
1106
+ * @param {String} name The hook name to execute
1107
+ * @param {*} context Overwrite the "this" for the hook
1108
+ * @param {Array|Function} args arguments passed to the pre hooks
1109
+ * @returns {void}
1110
+ */
1111
+ Kareem.prototype.execPre = async function execPre(name, context, args) {
1112
+ const pres = this._pres.get(name) || [];
1113
+ const numPres = pres.length;
1114
+ const $args = args;
1115
+ let skipWrappedFunction = null;
1116
+ &nbsp;
1117
+ if (!numPres) {
1118
+ return;
1119
+ }
1120
+ &nbsp;
1121
+ const asyncPrePromises = [];
1122
+ for (const pre of pres) {
1123
+ if (pre.fn.length &gt; 0) {
1124
+ let resolve = null;
1125
+ let reject = null;
1126
+ const cbPromise = new Promise((_resolve, _reject) =&gt; {
1127
+ resolve = _resolve;
1128
+ reject = _reject;
1129
+ });
1130
+ const args = [(err) =&gt; err ? reject(err) : resolve()];
1131
+ const _args = [null].concat($args);
1132
+ for (let i = 1; i &lt; _args.length; ++i) {
1133
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (i === _args.length - 1 &amp;&amp; typeof _args[i] === 'function') {
1134
+ <span class="cstat-no" title="statement not covered" > continue; </span>// skip callbacks to avoid accidentally calling the callback from a hook
1135
+ }
1136
+ args.push(_args[i]);
1137
+ }
1138
+ &nbsp;
1139
+ try {
1140
+ const maybePromiseLike = pre.fn.apply(context, args);
1141
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (isPromiseLike(maybePromiseLike)) {
1142
+ <span class="cstat-no" title="statement not covered" > await maybePromiseLike;</span>
1143
+ } else {
1144
+ await cbPromise;
1145
+ }
1146
+ } catch (error) {
1147
+ if (error instanceof Kareem.skipWrappedFunction) {
1148
+ skipWrappedFunction = error;
1149
+ continue;
1150
+ }
1151
+ throw error;
1152
+ }
1153
+ } else {
1154
+ try {
1155
+ await pre.fn.call(context);
1156
+ } catch (error) {
1157
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (error instanceof Kareem.skipWrappedFunction) {
1158
+ <span class="cstat-no" title="statement not covered" > skipWrappedFunction = error;</span>
1159
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1160
+ }
1161
+ throw error;
1162
+ }
1163
+ }
1164
+ }
1165
+ &nbsp;
1166
+ await Promise.all(asyncPrePromises);
1167
+ &nbsp;
1168
+ if (skipWrappedFunction) {
1169
+ throw skipWrappedFunction;
1170
+ }
1171
+ };
1172
+ &nbsp;
1173
+ /**
1174
+ * Execute all "pre" hooks for "name" synchronously
1175
+ * @param {String} name The hook name to execute
1176
+ * @param {*} context Overwrite the "this" for the hook
1177
+ * @param {Array} [args] Apply custom arguments to the hook
1178
+ * @returns {void}
1179
+ */
1180
+ Kareem.prototype.execPreSync = function(name, context, args) {
1181
+ const pres = this._pres.get(name) || [];
1182
+ const numPres = pres.length;
1183
+ &nbsp;
1184
+ for (let i = 0; i &lt; numPres; ++i) {
1185
+ pres[i].fn.apply(context, args || []);
1186
+ }
1187
+ };
1188
+ &nbsp;
1189
+ /**
1190
+ * Execute all "post" hooks for "name"
1191
+ * @param {String} name The hook name to execute
1192
+ * @param {*} context Overwrite the "this" for the hook
1193
+ * @param {Array|Function} args Apply custom arguments to the hook
1194
+ * @param {*} options Optional options or directly the callback
1195
+ * @returns {void}
1196
+ */
1197
+ Kareem.prototype.execPost = async function execPost(name, context, args, options) {
1198
+ const posts = this._posts.get(name) || [];
1199
+ const numPosts = posts.length;
1200
+ &nbsp;
1201
+ let firstError = null;
1202
+ if (options &amp;&amp; options.error) {
1203
+ firstError = options.error;
1204
+ }
1205
+ &nbsp;
1206
+ if (!numPosts) {
1207
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (firstError != null) {
1208
+ <span class="cstat-no" title="statement not covered" > throw firstError;</span>
1209
+ }
1210
+ return args;
1211
+ }
1212
+ &nbsp;
1213
+ for (const currentPost of posts) {
1214
+ const post = currentPost.fn;
1215
+ let numArgs = 0;
1216
+ const newArgs = [];
1217
+ const argLength = args.length;
1218
+ for (let i = 0; i &lt; argLength; ++i) {
1219
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!args[i] || !args[i]._kareemIgnore) {
1220
+ numArgs += 1;
1221
+ newArgs.push(args[i]);
1222
+ }
1223
+ }
1224
+ // If numCallbackParams set, fill in the rest with null to enforce consistent number of args
1225
+ if (options?.numCallbackParams != null) {
1226
+ numArgs = options.numCallbackParams;
1227
+ for (let i = newArgs.length; i &lt; numArgs; ++i) {
1228
+ newArgs.push(null);
1229
+ }
1230
+ }
1231
+ &nbsp;
1232
+ let resolve;
1233
+ let reject;
1234
+ const cbPromise = new Promise((_resolve, _reject) =&gt; {
1235
+ resolve = _resolve;
1236
+ reject = _reject;
1237
+ });
1238
+ newArgs.push(function nextCallback(err) {
1239
+ if (err) {
1240
+ reject(err);
1241
+ } else {
1242
+ resolve();
1243
+ }
1244
+ });
1245
+ &nbsp;
1246
+ if (firstError) {
1247
+ if (isErrorHandlingMiddleware(currentPost, numArgs)) {
1248
+ try {
1249
+ const res = post.apply(context, [firstError].concat(newArgs));
1250
+ if (isPromiseLike(res)) {
1251
+ await res;
1252
+ } else if (post.length === numArgs + 2) {
1253
+ // `numArgs + 2` because we added the error and the callback
1254
+ await cbPromise;
1255
+ }
1256
+ } catch (error) {
1257
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (error instanceof Kareem.overwriteResult) {
1258
+ <span class="cstat-no" title="statement not covered" > args = error.args;</span>
1259
+ <span class="cstat-no" title="statement not covered" > continue;</span>
1260
+ }
1261
+ firstError = error;
1262
+ }
1263
+ } else {
1264
+ continue;
1265
+ }
1266
+ } else {
1267
+ if (isErrorHandlingMiddleware(currentPost, numArgs)) {
1268
+ // Skip error handlers if no error
1269
+ continue;
1270
+ } else {
1271
+ let res = null;
1272
+ try {
1273
+ res = post.apply(context, newArgs);
1274
+ if (isPromiseLike(res)) {
1275
+ res = await res;
1276
+ } else if (post.length === numArgs + 1) {
1277
+ // If post function takes a callback, wait for the post function to call the callback
1278
+ res = await cbPromise;
1279
+ }
1280
+ } catch (error) {
1281
+ if (error instanceof Kareem.overwriteResult) {
1282
+ args = error.args;
1283
+ continue;
1284
+ }
1285
+ firstError = error;
1286
+ continue;
1287
+ }
1288
+ &nbsp;
1289
+ if (res instanceof Kareem.overwriteResult) {
1290
+ args = res.args;
1291
+ continue;
1292
+ }
1293
+ }
1294
+ }
1295
+ }
1296
+ &nbsp;
1297
+ if (firstError != null) {
1298
+ throw firstError;
1299
+ }
1300
+ &nbsp;
1301
+ return args;
1302
+ };
1303
+ &nbsp;
1304
+ /**
1305
+ * Execute all "post" hooks for "name" synchronously
1306
+ * @param {String} name The hook name to execute
1307
+ * @param {*} context Overwrite the "this" for the hook
1308
+ * @param {Array|Function} args Apply custom arguments to the hook
1309
+ * @returns {Array} The used arguments
1310
+ */
1311
+ Kareem.prototype.execPostSync = function(name, context, args) {
1312
+ const posts = this._posts.get(name) || [];
1313
+ const numPosts = posts.length;
1314
+ &nbsp;
1315
+ for (let i = 0; i &lt; numPosts; ++i) {
1316
+ const res = posts[i].fn.apply(context, args || []);
1317
+ if (res instanceof Kareem.overwriteResult) {
1318
+ args = res.args;
1319
+ }
1320
+ }
1321
+ &nbsp;
1322
+ return args;
1323
+ };
1324
+ &nbsp;
1325
+ /**
1326
+ * Create a synchronous wrapper for "fn"
1327
+ * @param {String} name The name of the hook
1328
+ * @param {Function} fn The function to wrap
1329
+ * @returns {Function} The wrapped function
1330
+ */
1331
+ Kareem.prototype.createWrapperSync = function(name, fn) {
1332
+ const _this = this;
1333
+ return function syncWrapper() {
1334
+ _this.execPreSync(name, this, arguments);
1335
+ &nbsp;
1336
+ const toReturn = fn.apply(this, arguments);
1337
+ &nbsp;
1338
+ const result = _this.execPostSync(name, this, [toReturn]);
1339
+ &nbsp;
1340
+ return result[0];
1341
+ };
1342
+ };
1343
+ &nbsp;
1344
+ /**
1345
+ * Executes pre hooks, followed by the wrapped function, followed by post hooks.
1346
+ * @param {String} name The name of the hook
1347
+ * @param {Function} fn The function for the hook
1348
+ * @param {*} context Overwrite the "this" for the hook
1349
+ * @param {Array} args Apply custom arguments to the hook
1350
+ * @param {Object} options Additional options for the hook
1351
+ * @returns {void}
1352
+ */
1353
+ Kareem.prototype.wrap = async function wrap(name, fn, context, args, options) {
1354
+ let ret;
1355
+ let skipWrappedFunction = false;
1356
+ try {
1357
+ await this.execPre(name, context, args);
1358
+ } catch (error) {
1359
+ if (error instanceof Kareem.skipWrappedFunction) {
1360
+ ret = error.args;
1361
+ skipWrappedFunction = true;
1362
+ } else {
1363
+ await this.execPost(name, context, args, { ...options, error });
1364
+ }
1365
+ }
1366
+ &nbsp;
1367
+ if (!skipWrappedFunction) {
1368
+ ret = await fn.apply(context, args);
1369
+ }
1370
+ &nbsp;
1371
+ ret = await this.execPost(name, context, [ret], options);
1372
+ &nbsp;
1373
+ return ret[0];
1374
+ };
1375
+ &nbsp;
1376
+ /**
1377
+ * Filter current instance for something specific and return the filtered clone
1378
+ * @param {Function} fn The filter function
1379
+ * @returns {Kareem} The cloned and filtered instance
1380
+ */
1381
+ Kareem.prototype.filter = function(fn) {
1382
+ const clone = this.clone();
1383
+ &nbsp;
1384
+ const pres = Array.from(clone._pres.keys());
1385
+ for (const name of pres) {
1386
+ const hooks = this._pres.get(name).
1387
+ map(h =&gt; Object.assign({}, h, { name: name })).
1388
+ filter(fn);
1389
+ &nbsp;
1390
+ if (hooks.length === 0) {
1391
+ clone._pres.delete(name);
1392
+ continue;
1393
+ }
1394
+ &nbsp;
1395
+ clone._pres.set(name, hooks);
1396
+ }
1397
+ &nbsp;
1398
+ const posts = Array.from(clone._posts.keys());
1399
+ for (const name of posts) {
1400
+ const hooks = this._posts.get(name).
1401
+ map(h =&gt; Object.assign({}, h, { name: name })).
1402
+ filter(fn);
1403
+ &nbsp;
1404
+ if (hooks.length === 0) {
1405
+ clone._posts.delete(name);
1406
+ continue;
1407
+ }
1408
+ &nbsp;
1409
+ clone._posts.set(name, hooks);
1410
+ }
1411
+ &nbsp;
1412
+ return clone;
1413
+ };
1414
+ &nbsp;
1415
+ /**
1416
+ * Check for a "name" to exist either in pre or post hooks
1417
+ * @param {String} name The name of the hook
1418
+ * @returns {Boolean} "true" if found, "false" otherwise
1419
+ */
1420
+ Kareem.prototype.hasHooks = function(name) {
1421
+ return this._pres.has(name) || this._posts.has(name);
1422
+ };
1423
+ &nbsp;
1424
+ /**
1425
+ * Create a Wrapper for "fn" on "name" and return the wrapped function
1426
+ * @param {String} name The name of the hook
1427
+ * @param {Function} fn The function to wrap
1428
+ * @param {*} context Overwrite the "this" for the hook
1429
+ * @param {Object} [options]
1430
+ * @returns {Function} The wrapped function
1431
+ */
1432
+ Kareem.prototype.createWrapper = function(name, fn, context, options) {
1433
+ const _this = this;
1434
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.hasHooks(name)) {
1435
+ // Fast path: if there's no hooks for this function, just return the function
1436
+ <span class="cstat-no" title="statement not covered" > return fn;</span>
1437
+ }
1438
+ return function kareemWrappedFunction() {
1439
+ const _context = context || <span class="branch-1 cbranch-no" title="branch not covered" >this;</span>
1440
+ return _this.wrap(name, fn, _context, Array.from(arguments), options);
1441
+ };
1442
+ };
1443
+ &nbsp;
1444
+ /**
1445
+ * Register a new hook for "pre"
1446
+ * @param {String} name The name of the hook
1447
+ * @param {Object} [options]
1448
+ * @param {Function} fn The function to register for "name"
1449
+ * @param {never} error Unused
1450
+ * @param {Boolean} [unshift] Wheter to "push" or to "unshift" the new hook
1451
+ * @returns {Kareem}
1452
+ */
1453
+ Kareem.prototype.pre = function(name, options, fn, error, unshift) {
1454
+ if (typeof options === 'function') {
1455
+ fn = options;
1456
+ options = {};
1457
+ } else if (options == null) {
1458
+ options = {};
1459
+ }
1460
+ &nbsp;
1461
+ const pres = this._pres.get(name) || [];
1462
+ this._pres.set(name, pres);
1463
+ &nbsp;
1464
+ if (typeof fn !== 'function') {
1465
+ throw new Error('pre() requires a function, got "' + typeof fn + '"');
1466
+ }
1467
+ &nbsp;
1468
+ if (unshift) {
1469
+ pres.unshift(Object.assign({}, options, { fn: fn }));
1470
+ } else {
1471
+ pres.push(Object.assign({}, options, { fn: fn }));
1472
+ }
1473
+ &nbsp;
1474
+ return this;
1475
+ };
1476
+ &nbsp;
1477
+ /**
1478
+ * Register a new hook for "post"
1479
+ * @param {String} name The name of the hook
1480
+ * @param {Object} [options]
1481
+ * @param {Boolean} [options.errorHandler] Whether this is an error handler
1482
+ * @param {Function} fn The function to register for "name"
1483
+ * @param {Boolean} [unshift] Wheter to "push" or to "unshift" the new hook
1484
+ * @returns {Kareem}
1485
+ */
1486
+ Kareem.prototype.post = function(name, options, fn, unshift) {
1487
+ const posts = this._posts.get(name) || [];
1488
+ &nbsp;
1489
+ if (typeof options === 'function') {
1490
+ unshift = !!fn;
1491
+ fn = options;
1492
+ options = {};
1493
+ }
1494
+ &nbsp;
1495
+ if (typeof fn !== 'function') {
1496
+ throw new Error('post() requires a function, got "' + typeof fn + '"');
1497
+ }
1498
+ &nbsp;
1499
+ if (unshift) {
1500
+ posts.unshift(Object.assign({}, options, { fn: fn }));
1501
+ } else {
1502
+ posts.push(Object.assign({}, options, { fn: fn }));
1503
+ }
1504
+ this._posts.set(name, posts);
1505
+ return this;
1506
+ };
1507
+ &nbsp;
1508
+ /**
1509
+ * Register a new error handler for "name"
1510
+ * @param {String} name The name of the hook
1511
+ * @param {Object} [options]
1512
+ * @param {Function} fn The function to register for "name"
1513
+ * @param {Boolean} [unshift] Wheter to "push" or to "unshift" the new hook
1514
+ * @returns {Kareem}
1515
+ */
1516
+ &nbsp;
1517
+ Kareem.prototype.postError = function postError(name, options, fn, unshift) {
1518
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof options === 'function') {
1519
+ unshift = !!fn;
1520
+ fn = options;
1521
+ options = {};
1522
+ }
1523
+ return this.post(name, { ...options, errorHandler: true }, fn, unshift);
1524
+ };
1525
+ &nbsp;
1526
+ /**
1527
+ * Clone the current instance
1528
+ * @returns {Kareem} The cloned instance
1529
+ */
1530
+ Kareem.prototype.clone = function() {
1531
+ const n = new Kareem();
1532
+ &nbsp;
1533
+ for (const key of this._pres.keys()) {
1534
+ const clone = this._pres.get(key).slice();
1535
+ n._pres.set(key, clone);
1536
+ }
1537
+ for (const key of this._posts.keys()) {
1538
+ n._posts.set(key, this._posts.get(key).slice());
1539
+ }
1540
+ &nbsp;
1541
+ return n;
1542
+ };
1543
+ &nbsp;
1544
+ /**
1545
+ * Merge "other" into self or "clone"
1546
+ * @param {Kareem} other The instance to merge with
1547
+ * @param {Kareem} [clone] The instance to merge onto (if not defined, using "this")
1548
+ * @returns {Kareem} The merged instance
1549
+ */
1550
+ Kareem.prototype.merge = function(other, clone) {
1551
+ clone = arguments.length === 1 ? true : <span class="branch-1 cbranch-no" title="branch not covered" >clone;</span>
1552
+ const ret = clone ? this.clone() : <span class="branch-1 cbranch-no" title="branch not covered" >this;</span>
1553
+ &nbsp;
1554
+ for (const key of other._pres.keys()) {
1555
+ const sourcePres = ret._pres.get(key) || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
1556
+ const deduplicated = other._pres.get(key).
1557
+ // Deduplicate based on `fn`
1558
+ filter(p =&gt; sourcePres.map(_p =&gt; _p.fn).indexOf(p.fn) === -1);
1559
+ const combined = sourcePres.concat(deduplicated);
1560
+ ret._pres.set(key, combined);
1561
+ }
1562
+ for (const key of other._posts.keys()) {
1563
+ const sourcePosts = ret._posts.get(key) || [];
1564
+ const deduplicated = other._posts.get(key).
1565
+ filter(p =&gt; sourcePosts.indexOf(p) === -1);
1566
+ ret._posts.set(key, sourcePosts.concat(deduplicated));
1567
+ }
1568
+ &nbsp;
1569
+ return ret;
1570
+ };
1571
+ &nbsp;
1572
+ function isPromiseLike(v) {
1573
+ return (typeof v === 'object' &amp;&amp; v !== null &amp;&amp; typeof v.then === 'function');
1574
+ }
1575
+ &nbsp;
1576
+ function isErrorHandlingMiddleware(post, numArgs) {
1577
+ if (post.errorHandler) {
1578
+ return true;
1579
+ }
1580
+ return post.fn.length === numArgs + 2;
1581
+ }
1582
+ &nbsp;
1583
+ module.exports = Kareem;
1584
+ &nbsp;</pre></td></tr></table></pre>
1585
+
1586
+ <div class='push'></div><!-- for sticky footer -->
1587
+ </div><!-- /wrapper -->
1588
+ <div class='footer quiet pad2 space-top1 center small'>
1589
+ Code coverage generated by
1590
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1591
+ at 2025-08-25T20:16:45.952Z
1592
+ </div>
1593
+ <script src="prettify.js"></script>
1594
+ <script>
1595
+ window.onload = function () {
1596
+ prettyPrint();
1597
+ };
1598
+ </script>
1599
+ <script src="sorter.js"></script>
1600
+ <script src="block-navigation.js"></script>
1601
+ </body>
1602
+ </html>
1603
+