@contractkit/plugin-bruno 1.5.7 → 1.5.9

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.
@@ -1,2827 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/codegen-bruno.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../prettify.css" />
9
- <link rel="stylesheet" href="../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> codegen-bruno.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">88.74% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>339/382</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">79.03% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>245/310</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">93.22% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>55/59</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">89.85% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>301/335</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a>
607
- <a name='L542'></a><a href='#L542'>542</a>
608
- <a name='L543'></a><a href='#L543'>543</a>
609
- <a name='L544'></a><a href='#L544'>544</a>
610
- <a name='L545'></a><a href='#L545'>545</a>
611
- <a name='L546'></a><a href='#L546'>546</a>
612
- <a name='L547'></a><a href='#L547'>547</a>
613
- <a name='L548'></a><a href='#L548'>548</a>
614
- <a name='L549'></a><a href='#L549'>549</a>
615
- <a name='L550'></a><a href='#L550'>550</a>
616
- <a name='L551'></a><a href='#L551'>551</a>
617
- <a name='L552'></a><a href='#L552'>552</a>
618
- <a name='L553'></a><a href='#L553'>553</a>
619
- <a name='L554'></a><a href='#L554'>554</a>
620
- <a name='L555'></a><a href='#L555'>555</a>
621
- <a name='L556'></a><a href='#L556'>556</a>
622
- <a name='L557'></a><a href='#L557'>557</a>
623
- <a name='L558'></a><a href='#L558'>558</a>
624
- <a name='L559'></a><a href='#L559'>559</a>
625
- <a name='L560'></a><a href='#L560'>560</a>
626
- <a name='L561'></a><a href='#L561'>561</a>
627
- <a name='L562'></a><a href='#L562'>562</a>
628
- <a name='L563'></a><a href='#L563'>563</a>
629
- <a name='L564'></a><a href='#L564'>564</a>
630
- <a name='L565'></a><a href='#L565'>565</a>
631
- <a name='L566'></a><a href='#L566'>566</a>
632
- <a name='L567'></a><a href='#L567'>567</a>
633
- <a name='L568'></a><a href='#L568'>568</a>
634
- <a name='L569'></a><a href='#L569'>569</a>
635
- <a name='L570'></a><a href='#L570'>570</a>
636
- <a name='L571'></a><a href='#L571'>571</a>
637
- <a name='L572'></a><a href='#L572'>572</a>
638
- <a name='L573'></a><a href='#L573'>573</a>
639
- <a name='L574'></a><a href='#L574'>574</a>
640
- <a name='L575'></a><a href='#L575'>575</a>
641
- <a name='L576'></a><a href='#L576'>576</a>
642
- <a name='L577'></a><a href='#L577'>577</a>
643
- <a name='L578'></a><a href='#L578'>578</a>
644
- <a name='L579'></a><a href='#L579'>579</a>
645
- <a name='L580'></a><a href='#L580'>580</a>
646
- <a name='L581'></a><a href='#L581'>581</a>
647
- <a name='L582'></a><a href='#L582'>582</a>
648
- <a name='L583'></a><a href='#L583'>583</a>
649
- <a name='L584'></a><a href='#L584'>584</a>
650
- <a name='L585'></a><a href='#L585'>585</a>
651
- <a name='L586'></a><a href='#L586'>586</a>
652
- <a name='L587'></a><a href='#L587'>587</a>
653
- <a name='L588'></a><a href='#L588'>588</a>
654
- <a name='L589'></a><a href='#L589'>589</a>
655
- <a name='L590'></a><a href='#L590'>590</a>
656
- <a name='L591'></a><a href='#L591'>591</a>
657
- <a name='L592'></a><a href='#L592'>592</a>
658
- <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a>
662
- <a name='L597'></a><a href='#L597'>597</a>
663
- <a name='L598'></a><a href='#L598'>598</a>
664
- <a name='L599'></a><a href='#L599'>599</a>
665
- <a name='L600'></a><a href='#L600'>600</a>
666
- <a name='L601'></a><a href='#L601'>601</a>
667
- <a name='L602'></a><a href='#L602'>602</a>
668
- <a name='L603'></a><a href='#L603'>603</a>
669
- <a name='L604'></a><a href='#L604'>604</a>
670
- <a name='L605'></a><a href='#L605'>605</a>
671
- <a name='L606'></a><a href='#L606'>606</a>
672
- <a name='L607'></a><a href='#L607'>607</a>
673
- <a name='L608'></a><a href='#L608'>608</a>
674
- <a name='L609'></a><a href='#L609'>609</a>
675
- <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a>
677
- <a name='L612'></a><a href='#L612'>612</a>
678
- <a name='L613'></a><a href='#L613'>613</a>
679
- <a name='L614'></a><a href='#L614'>614</a>
680
- <a name='L615'></a><a href='#L615'>615</a>
681
- <a name='L616'></a><a href='#L616'>616</a>
682
- <a name='L617'></a><a href='#L617'>617</a>
683
- <a name='L618'></a><a href='#L618'>618</a>
684
- <a name='L619'></a><a href='#L619'>619</a>
685
- <a name='L620'></a><a href='#L620'>620</a>
686
- <a name='L621'></a><a href='#L621'>621</a>
687
- <a name='L622'></a><a href='#L622'>622</a>
688
- <a name='L623'></a><a href='#L623'>623</a>
689
- <a name='L624'></a><a href='#L624'>624</a>
690
- <a name='L625'></a><a href='#L625'>625</a>
691
- <a name='L626'></a><a href='#L626'>626</a>
692
- <a name='L627'></a><a href='#L627'>627</a>
693
- <a name='L628'></a><a href='#L628'>628</a>
694
- <a name='L629'></a><a href='#L629'>629</a>
695
- <a name='L630'></a><a href='#L630'>630</a>
696
- <a name='L631'></a><a href='#L631'>631</a>
697
- <a name='L632'></a><a href='#L632'>632</a>
698
- <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a>
700
- <a name='L635'></a><a href='#L635'>635</a>
701
- <a name='L636'></a><a href='#L636'>636</a>
702
- <a name='L637'></a><a href='#L637'>637</a>
703
- <a name='L638'></a><a href='#L638'>638</a>
704
- <a name='L639'></a><a href='#L639'>639</a>
705
- <a name='L640'></a><a href='#L640'>640</a>
706
- <a name='L641'></a><a href='#L641'>641</a>
707
- <a name='L642'></a><a href='#L642'>642</a>
708
- <a name='L643'></a><a href='#L643'>643</a>
709
- <a name='L644'></a><a href='#L644'>644</a>
710
- <a name='L645'></a><a href='#L645'>645</a>
711
- <a name='L646'></a><a href='#L646'>646</a>
712
- <a name='L647'></a><a href='#L647'>647</a>
713
- <a name='L648'></a><a href='#L648'>648</a>
714
- <a name='L649'></a><a href='#L649'>649</a>
715
- <a name='L650'></a><a href='#L650'>650</a>
716
- <a name='L651'></a><a href='#L651'>651</a>
717
- <a name='L652'></a><a href='#L652'>652</a>
718
- <a name='L653'></a><a href='#L653'>653</a>
719
- <a name='L654'></a><a href='#L654'>654</a>
720
- <a name='L655'></a><a href='#L655'>655</a>
721
- <a name='L656'></a><a href='#L656'>656</a>
722
- <a name='L657'></a><a href='#L657'>657</a>
723
- <a name='L658'></a><a href='#L658'>658</a>
724
- <a name='L659'></a><a href='#L659'>659</a>
725
- <a name='L660'></a><a href='#L660'>660</a>
726
- <a name='L661'></a><a href='#L661'>661</a>
727
- <a name='L662'></a><a href='#L662'>662</a>
728
- <a name='L663'></a><a href='#L663'>663</a>
729
- <a name='L664'></a><a href='#L664'>664</a>
730
- <a name='L665'></a><a href='#L665'>665</a>
731
- <a name='L666'></a><a href='#L666'>666</a>
732
- <a name='L667'></a><a href='#L667'>667</a>
733
- <a name='L668'></a><a href='#L668'>668</a>
734
- <a name='L669'></a><a href='#L669'>669</a>
735
- <a name='L670'></a><a href='#L670'>670</a>
736
- <a name='L671'></a><a href='#L671'>671</a>
737
- <a name='L672'></a><a href='#L672'>672</a>
738
- <a name='L673'></a><a href='#L673'>673</a>
739
- <a name='L674'></a><a href='#L674'>674</a>
740
- <a name='L675'></a><a href='#L675'>675</a>
741
- <a name='L676'></a><a href='#L676'>676</a>
742
- <a name='L677'></a><a href='#L677'>677</a>
743
- <a name='L678'></a><a href='#L678'>678</a>
744
- <a name='L679'></a><a href='#L679'>679</a>
745
- <a name='L680'></a><a href='#L680'>680</a>
746
- <a name='L681'></a><a href='#L681'>681</a>
747
- <a name='L682'></a><a href='#L682'>682</a>
748
- <a name='L683'></a><a href='#L683'>683</a>
749
- <a name='L684'></a><a href='#L684'>684</a>
750
- <a name='L685'></a><a href='#L685'>685</a>
751
- <a name='L686'></a><a href='#L686'>686</a>
752
- <a name='L687'></a><a href='#L687'>687</a>
753
- <a name='L688'></a><a href='#L688'>688</a>
754
- <a name='L689'></a><a href='#L689'>689</a>
755
- <a name='L690'></a><a href='#L690'>690</a>
756
- <a name='L691'></a><a href='#L691'>691</a>
757
- <a name='L692'></a><a href='#L692'>692</a>
758
- <a name='L693'></a><a href='#L693'>693</a>
759
- <a name='L694'></a><a href='#L694'>694</a>
760
- <a name='L695'></a><a href='#L695'>695</a>
761
- <a name='L696'></a><a href='#L696'>696</a>
762
- <a name='L697'></a><a href='#L697'>697</a>
763
- <a name='L698'></a><a href='#L698'>698</a>
764
- <a name='L699'></a><a href='#L699'>699</a>
765
- <a name='L700'></a><a href='#L700'>700</a>
766
- <a name='L701'></a><a href='#L701'>701</a>
767
- <a name='L702'></a><a href='#L702'>702</a>
768
- <a name='L703'></a><a href='#L703'>703</a>
769
- <a name='L704'></a><a href='#L704'>704</a>
770
- <a name='L705'></a><a href='#L705'>705</a>
771
- <a name='L706'></a><a href='#L706'>706</a>
772
- <a name='L707'></a><a href='#L707'>707</a>
773
- <a name='L708'></a><a href='#L708'>708</a>
774
- <a name='L709'></a><a href='#L709'>709</a>
775
- <a name='L710'></a><a href='#L710'>710</a>
776
- <a name='L711'></a><a href='#L711'>711</a>
777
- <a name='L712'></a><a href='#L712'>712</a>
778
- <a name='L713'></a><a href='#L713'>713</a>
779
- <a name='L714'></a><a href='#L714'>714</a>
780
- <a name='L715'></a><a href='#L715'>715</a>
781
- <a name='L716'></a><a href='#L716'>716</a>
782
- <a name='L717'></a><a href='#L717'>717</a>
783
- <a name='L718'></a><a href='#L718'>718</a>
784
- <a name='L719'></a><a href='#L719'>719</a>
785
- <a name='L720'></a><a href='#L720'>720</a>
786
- <a name='L721'></a><a href='#L721'>721</a>
787
- <a name='L722'></a><a href='#L722'>722</a>
788
- <a name='L723'></a><a href='#L723'>723</a>
789
- <a name='L724'></a><a href='#L724'>724</a>
790
- <a name='L725'></a><a href='#L725'>725</a>
791
- <a name='L726'></a><a href='#L726'>726</a>
792
- <a name='L727'></a><a href='#L727'>727</a>
793
- <a name='L728'></a><a href='#L728'>728</a>
794
- <a name='L729'></a><a href='#L729'>729</a>
795
- <a name='L730'></a><a href='#L730'>730</a>
796
- <a name='L731'></a><a href='#L731'>731</a>
797
- <a name='L732'></a><a href='#L732'>732</a>
798
- <a name='L733'></a><a href='#L733'>733</a>
799
- <a name='L734'></a><a href='#L734'>734</a>
800
- <a name='L735'></a><a href='#L735'>735</a>
801
- <a name='L736'></a><a href='#L736'>736</a>
802
- <a name='L737'></a><a href='#L737'>737</a>
803
- <a name='L738'></a><a href='#L738'>738</a>
804
- <a name='L739'></a><a href='#L739'>739</a>
805
- <a name='L740'></a><a href='#L740'>740</a>
806
- <a name='L741'></a><a href='#L741'>741</a>
807
- <a name='L742'></a><a href='#L742'>742</a>
808
- <a name='L743'></a><a href='#L743'>743</a>
809
- <a name='L744'></a><a href='#L744'>744</a>
810
- <a name='L745'></a><a href='#L745'>745</a>
811
- <a name='L746'></a><a href='#L746'>746</a>
812
- <a name='L747'></a><a href='#L747'>747</a>
813
- <a name='L748'></a><a href='#L748'>748</a>
814
- <a name='L749'></a><a href='#L749'>749</a>
815
- <a name='L750'></a><a href='#L750'>750</a>
816
- <a name='L751'></a><a href='#L751'>751</a>
817
- <a name='L752'></a><a href='#L752'>752</a>
818
- <a name='L753'></a><a href='#L753'>753</a>
819
- <a name='L754'></a><a href='#L754'>754</a>
820
- <a name='L755'></a><a href='#L755'>755</a>
821
- <a name='L756'></a><a href='#L756'>756</a>
822
- <a name='L757'></a><a href='#L757'>757</a>
823
- <a name='L758'></a><a href='#L758'>758</a>
824
- <a name='L759'></a><a href='#L759'>759</a>
825
- <a name='L760'></a><a href='#L760'>760</a>
826
- <a name='L761'></a><a href='#L761'>761</a>
827
- <a name='L762'></a><a href='#L762'>762</a>
828
- <a name='L763'></a><a href='#L763'>763</a>
829
- <a name='L764'></a><a href='#L764'>764</a>
830
- <a name='L765'></a><a href='#L765'>765</a>
831
- <a name='L766'></a><a href='#L766'>766</a>
832
- <a name='L767'></a><a href='#L767'>767</a>
833
- <a name='L768'></a><a href='#L768'>768</a>
834
- <a name='L769'></a><a href='#L769'>769</a>
835
- <a name='L770'></a><a href='#L770'>770</a>
836
- <a name='L771'></a><a href='#L771'>771</a>
837
- <a name='L772'></a><a href='#L772'>772</a>
838
- <a name='L773'></a><a href='#L773'>773</a>
839
- <a name='L774'></a><a href='#L774'>774</a>
840
- <a name='L775'></a><a href='#L775'>775</a>
841
- <a name='L776'></a><a href='#L776'>776</a>
842
- <a name='L777'></a><a href='#L777'>777</a>
843
- <a name='L778'></a><a href='#L778'>778</a>
844
- <a name='L779'></a><a href='#L779'>779</a>
845
- <a name='L780'></a><a href='#L780'>780</a>
846
- <a name='L781'></a><a href='#L781'>781</a>
847
- <a name='L782'></a><a href='#L782'>782</a>
848
- <a name='L783'></a><a href='#L783'>783</a>
849
- <a name='L784'></a><a href='#L784'>784</a>
850
- <a name='L785'></a><a href='#L785'>785</a>
851
- <a name='L786'></a><a href='#L786'>786</a>
852
- <a name='L787'></a><a href='#L787'>787</a>
853
- <a name='L788'></a><a href='#L788'>788</a>
854
- <a name='L789'></a><a href='#L789'>789</a>
855
- <a name='L790'></a><a href='#L790'>790</a>
856
- <a name='L791'></a><a href='#L791'>791</a>
857
- <a name='L792'></a><a href='#L792'>792</a>
858
- <a name='L793'></a><a href='#L793'>793</a>
859
- <a name='L794'></a><a href='#L794'>794</a>
860
- <a name='L795'></a><a href='#L795'>795</a>
861
- <a name='L796'></a><a href='#L796'>796</a>
862
- <a name='L797'></a><a href='#L797'>797</a>
863
- <a name='L798'></a><a href='#L798'>798</a>
864
- <a name='L799'></a><a href='#L799'>799</a>
865
- <a name='L800'></a><a href='#L800'>800</a>
866
- <a name='L801'></a><a href='#L801'>801</a>
867
- <a name='L802'></a><a href='#L802'>802</a>
868
- <a name='L803'></a><a href='#L803'>803</a>
869
- <a name='L804'></a><a href='#L804'>804</a>
870
- <a name='L805'></a><a href='#L805'>805</a>
871
- <a name='L806'></a><a href='#L806'>806</a>
872
- <a name='L807'></a><a href='#L807'>807</a>
873
- <a name='L808'></a><a href='#L808'>808</a>
874
- <a name='L809'></a><a href='#L809'>809</a>
875
- <a name='L810'></a><a href='#L810'>810</a>
876
- <a name='L811'></a><a href='#L811'>811</a>
877
- <a name='L812'></a><a href='#L812'>812</a>
878
- <a name='L813'></a><a href='#L813'>813</a>
879
- <a name='L814'></a><a href='#L814'>814</a>
880
- <a name='L815'></a><a href='#L815'>815</a>
881
- <a name='L816'></a><a href='#L816'>816</a>
882
- <a name='L817'></a><a href='#L817'>817</a>
883
- <a name='L818'></a><a href='#L818'>818</a>
884
- <a name='L819'></a><a href='#L819'>819</a>
885
- <a name='L820'></a><a href='#L820'>820</a>
886
- <a name='L821'></a><a href='#L821'>821</a>
887
- <a name='L822'></a><a href='#L822'>822</a>
888
- <a name='L823'></a><a href='#L823'>823</a>
889
- <a name='L824'></a><a href='#L824'>824</a>
890
- <a name='L825'></a><a href='#L825'>825</a>
891
- <a name='L826'></a><a href='#L826'>826</a>
892
- <a name='L827'></a><a href='#L827'>827</a>
893
- <a name='L828'></a><a href='#L828'>828</a>
894
- <a name='L829'></a><a href='#L829'>829</a>
895
- <a name='L830'></a><a href='#L830'>830</a>
896
- <a name='L831'></a><a href='#L831'>831</a>
897
- <a name='L832'></a><a href='#L832'>832</a>
898
- <a name='L833'></a><a href='#L833'>833</a>
899
- <a name='L834'></a><a href='#L834'>834</a>
900
- <a name='L835'></a><a href='#L835'>835</a>
901
- <a name='L836'></a><a href='#L836'>836</a>
902
- <a name='L837'></a><a href='#L837'>837</a>
903
- <a name='L838'></a><a href='#L838'>838</a>
904
- <a name='L839'></a><a href='#L839'>839</a>
905
- <a name='L840'></a><a href='#L840'>840</a>
906
- <a name='L841'></a><a href='#L841'>841</a>
907
- <a name='L842'></a><a href='#L842'>842</a>
908
- <a name='L843'></a><a href='#L843'>843</a>
909
- <a name='L844'></a><a href='#L844'>844</a>
910
- <a name='L845'></a><a href='#L845'>845</a>
911
- <a name='L846'></a><a href='#L846'>846</a>
912
- <a name='L847'></a><a href='#L847'>847</a>
913
- <a name='L848'></a><a href='#L848'>848</a>
914
- <a name='L849'></a><a href='#L849'>849</a>
915
- <a name='L850'></a><a href='#L850'>850</a>
916
- <a name='L851'></a><a href='#L851'>851</a>
917
- <a name='L852'></a><a href='#L852'>852</a>
918
- <a name='L853'></a><a href='#L853'>853</a>
919
- <a name='L854'></a><a href='#L854'>854</a>
920
- <a name='L855'></a><a href='#L855'>855</a>
921
- <a name='L856'></a><a href='#L856'>856</a>
922
- <a name='L857'></a><a href='#L857'>857</a>
923
- <a name='L858'></a><a href='#L858'>858</a>
924
- <a name='L859'></a><a href='#L859'>859</a>
925
- <a name='L860'></a><a href='#L860'>860</a>
926
- <a name='L861'></a><a href='#L861'>861</a>
927
- <a name='L862'></a><a href='#L862'>862</a>
928
- <a name='L863'></a><a href='#L863'>863</a>
929
- <a name='L864'></a><a href='#L864'>864</a>
930
- <a name='L865'></a><a href='#L865'>865</a>
931
- <a name='L866'></a><a href='#L866'>866</a>
932
- <a name='L867'></a><a href='#L867'>867</a>
933
- <a name='L868'></a><a href='#L868'>868</a>
934
- <a name='L869'></a><a href='#L869'>869</a>
935
- <a name='L870'></a><a href='#L870'>870</a>
936
- <a name='L871'></a><a href='#L871'>871</a>
937
- <a name='L872'></a><a href='#L872'>872</a>
938
- <a name='L873'></a><a href='#L873'>873</a>
939
- <a name='L874'></a><a href='#L874'>874</a>
940
- <a name='L875'></a><a href='#L875'>875</a>
941
- <a name='L876'></a><a href='#L876'>876</a>
942
- <a name='L877'></a><a href='#L877'>877</a>
943
- <a name='L878'></a><a href='#L878'>878</a>
944
- <a name='L879'></a><a href='#L879'>879</a>
945
- <a name='L880'></a><a href='#L880'>880</a>
946
- <a name='L881'></a><a href='#L881'>881</a>
947
- <a name='L882'></a><a href='#L882'>882</a>
948
- <a name='L883'></a><a href='#L883'>883</a>
949
- <a name='L884'></a><a href='#L884'>884</a>
950
- <a name='L885'></a><a href='#L885'>885</a>
951
- <a name='L886'></a><a href='#L886'>886</a>
952
- <a name='L887'></a><a href='#L887'>887</a>
953
- <a name='L888'></a><a href='#L888'>888</a>
954
- <a name='L889'></a><a href='#L889'>889</a>
955
- <a name='L890'></a><a href='#L890'>890</a>
956
- <a name='L891'></a><a href='#L891'>891</a>
957
- <a name='L892'></a><a href='#L892'>892</a>
958
- <a name='L893'></a><a href='#L893'>893</a>
959
- <a name='L894'></a><a href='#L894'>894</a>
960
- <a name='L895'></a><a href='#L895'>895</a>
961
- <a name='L896'></a><a href='#L896'>896</a>
962
- <a name='L897'></a><a href='#L897'>897</a>
963
- <a name='L898'></a><a href='#L898'>898</a>
964
- <a name='L899'></a><a href='#L899'>899</a>
965
- <a name='L900'></a><a href='#L900'>900</a>
966
- <a name='L901'></a><a href='#L901'>901</a>
967
- <a name='L902'></a><a href='#L902'>902</a>
968
- <a name='L903'></a><a href='#L903'>903</a>
969
- <a name='L904'></a><a href='#L904'>904</a>
970
- <a name='L905'></a><a href='#L905'>905</a>
971
- <a name='L906'></a><a href='#L906'>906</a>
972
- <a name='L907'></a><a href='#L907'>907</a>
973
- <a name='L908'></a><a href='#L908'>908</a>
974
- <a name='L909'></a><a href='#L909'>909</a>
975
- <a name='L910'></a><a href='#L910'>910</a>
976
- <a name='L911'></a><a href='#L911'>911</a>
977
- <a name='L912'></a><a href='#L912'>912</a>
978
- <a name='L913'></a><a href='#L913'>913</a>
979
- <a name='L914'></a><a href='#L914'>914</a>
980
- <a name='L915'></a><a href='#L915'>915</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-neutral">&nbsp;</span>
984
- <span class="cline-any cline-neutral">&nbsp;</span>
985
- <span class="cline-any cline-neutral">&nbsp;</span>
986
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-neutral">&nbsp;</span>
996
- <span class="cline-any cline-neutral">&nbsp;</span>
997
- <span class="cline-any cline-neutral">&nbsp;</span>
998
- <span class="cline-any cline-neutral">&nbsp;</span>
999
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-neutral">&nbsp;</span>
1016
- <span class="cline-any cline-yes">1x</span>
1017
- <span class="cline-any cline-neutral">&nbsp;</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-yes">1x</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-neutral">&nbsp;</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-neutral">&nbsp;</span>
1048
- <span class="cline-any cline-neutral">&nbsp;</span>
1049
- <span class="cline-any cline-neutral">&nbsp;</span>
1050
- <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-neutral">&nbsp;</span>
1052
- <span class="cline-any cline-neutral">&nbsp;</span>
1053
- <span class="cline-any cline-neutral">&nbsp;</span>
1054
- <span class="cline-any cline-neutral">&nbsp;</span>
1055
- <span class="cline-any cline-neutral">&nbsp;</span>
1056
- <span class="cline-any cline-neutral">&nbsp;</span>
1057
- <span class="cline-any cline-neutral">&nbsp;</span>
1058
- <span class="cline-any cline-neutral">&nbsp;</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</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-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-neutral">&nbsp;</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1078
- <span class="cline-any cline-neutral">&nbsp;</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1081
- <span class="cline-any cline-neutral">&nbsp;</span>
1082
- <span class="cline-any cline-neutral">&nbsp;</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-neutral">&nbsp;</span>
1085
- <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-neutral">&nbsp;</span>
1088
- <span class="cline-any cline-neutral">&nbsp;</span>
1089
- <span class="cline-any cline-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-neutral">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-neutral">&nbsp;</span>
1093
- <span class="cline-any cline-neutral">&nbsp;</span>
1094
- <span class="cline-any cline-neutral">&nbsp;</span>
1095
- <span class="cline-any cline-neutral">&nbsp;</span>
1096
- <span class="cline-any cline-neutral">&nbsp;</span>
1097
- <span class="cline-any cline-neutral">&nbsp;</span>
1098
- <span class="cline-any cline-neutral">&nbsp;</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-neutral">&nbsp;</span>
1101
- <span class="cline-any cline-neutral">&nbsp;</span>
1102
- <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-neutral">&nbsp;</span>
1106
- <span class="cline-any cline-neutral">&nbsp;</span>
1107
- <span class="cline-any cline-neutral">&nbsp;</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-yes">96x</span>
1112
- <span class="cline-any cline-yes">96x</span>
1113
- <span class="cline-any cline-neutral">&nbsp;</span>
1114
- <span class="cline-any cline-neutral">&nbsp;</span>
1115
- <span class="cline-any cline-neutral">&nbsp;</span>
1116
- <span class="cline-any cline-neutral">&nbsp;</span>
1117
- <span class="cline-any cline-neutral">&nbsp;</span>
1118
- <span class="cline-any cline-neutral">&nbsp;</span>
1119
- <span class="cline-any cline-neutral">&nbsp;</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-neutral">&nbsp;</span>
1127
- <span class="cline-any cline-neutral">&nbsp;</span>
1128
- <span class="cline-any cline-yes">4x</span>
1129
- <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-yes">108x</span>
1131
- <span class="cline-any cline-yes">108x</span>
1132
- <span class="cline-any cline-yes">108x</span>
1133
- <span class="cline-any cline-yes">108x</span>
1134
- <span class="cline-any cline-yes">108x</span>
1135
- <span class="cline-any cline-neutral">&nbsp;</span>
1136
- <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-yes">108x</span>
1138
- <span class="cline-any cline-yes">108x</span>
1139
- <span class="cline-any cline-neutral">&nbsp;</span>
1140
- <span class="cline-any cline-neutral">&nbsp;</span>
1141
- <span class="cline-any cline-neutral">&nbsp;</span>
1142
- <span class="cline-any cline-yes">108x</span>
1143
- <span class="cline-any cline-yes">109x</span>
1144
- <span class="cline-any cline-neutral">&nbsp;</span>
1145
- <span class="cline-any cline-neutral">&nbsp;</span>
1146
- <span class="cline-any cline-yes">108x</span>
1147
- <span class="cline-any cline-yes">8x</span>
1148
- <span class="cline-any cline-yes">8x</span>
1149
- <span class="cline-any cline-yes">8x</span>
1150
- <span class="cline-any cline-yes">8x</span>
1151
- <span class="cline-any cline-yes">3x</span>
1152
- <span class="cline-any cline-neutral">&nbsp;</span>
1153
- <span class="cline-any cline-neutral">&nbsp;</span>
1154
- <span class="cline-any cline-yes">108x</span>
1155
- <span class="cline-any cline-neutral">&nbsp;</span>
1156
- <span class="cline-any cline-neutral">&nbsp;</span>
1157
- <span class="cline-any cline-neutral">&nbsp;</span>
1158
- <span class="cline-any cline-neutral">&nbsp;</span>
1159
- <span class="cline-any cline-yes">108x</span>
1160
- <span class="cline-any cline-yes">108x</span>
1161
- <span class="cline-any cline-yes">108x</span>
1162
- <span class="cline-any cline-yes">114x</span>
1163
- <span class="cline-any cline-yes">114x</span>
1164
- <span class="cline-any cline-yes">114x</span>
1165
- <span class="cline-any cline-yes">111x</span>
1166
- <span class="cline-any cline-yes">111x</span>
1167
- <span class="cline-any cline-yes">111x</span>
1168
- <span class="cline-any cline-yes">111x</span>
1169
- <span class="cline-any cline-neutral">&nbsp;</span>
1170
- <span class="cline-any cline-neutral">&nbsp;</span>
1171
- <span class="cline-any cline-yes">114x</span>
1172
- <span class="cline-any cline-yes">114x</span>
1173
- <span class="cline-any cline-yes">114x</span>
1174
- <span class="cline-any cline-neutral">&nbsp;</span>
1175
- <span class="cline-any cline-yes">114x</span>
1176
- <span class="cline-any cline-yes">7x</span>
1177
- <span class="cline-any cline-yes">7x</span>
1178
- <span class="cline-any cline-yes">7x</span>
1179
- <span class="cline-any cline-yes">7x</span>
1180
- <span class="cline-any cline-yes">7x</span>
1181
- <span class="cline-any cline-neutral">&nbsp;</span>
1182
- <span class="cline-any cline-neutral">&nbsp;</span>
1183
- <span class="cline-any cline-neutral">&nbsp;</span>
1184
- <span class="cline-any cline-yes">114x</span>
1185
- <span class="cline-any cline-yes">130x</span>
1186
- <span class="cline-any cline-neutral">&nbsp;</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-yes">125x</span>
1189
- <span class="cline-any cline-neutral">&nbsp;</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-neutral">&nbsp;</span>
1192
- <span class="cline-any cline-neutral">&nbsp;</span>
1193
- <span class="cline-any cline-yes">108x</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-neutral">&nbsp;</span>
1196
- <span class="cline-any cline-neutral">&nbsp;</span>
1197
- <span class="cline-any cline-neutral">&nbsp;</span>
1198
- <span class="cline-any cline-neutral">&nbsp;</span>
1199
- <span class="cline-any cline-neutral">&nbsp;</span>
1200
- <span class="cline-any cline-neutral">&nbsp;</span>
1201
- <span class="cline-any cline-yes">108x</span>
1202
- <span class="cline-any cline-neutral">&nbsp;</span>
1203
- <span class="cline-any cline-neutral">&nbsp;</span>
1204
- <span class="cline-any cline-neutral">&nbsp;</span>
1205
- <span class="cline-any cline-neutral">&nbsp;</span>
1206
- <span class="cline-any cline-neutral">&nbsp;</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-neutral">&nbsp;</span>
1209
- <span class="cline-any cline-neutral">&nbsp;</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-yes">114x</span>
1212
- <span class="cline-any cline-yes">114x</span>
1213
- <span class="cline-any cline-yes">117x</span>
1214
- <span class="cline-any cline-yes">131x</span>
1215
- <span class="cline-any cline-yes">130x</span>
1216
- <span class="cline-any cline-neutral">&nbsp;</span>
1217
- <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-yes">114x</span>
1219
- <span class="cline-any cline-neutral">&nbsp;</span>
1220
- <span class="cline-any cline-yes">114x</span>
1221
- <span class="cline-any cline-yes">114x</span>
1222
- <span class="cline-any cline-yes">114x</span>
1223
- <span class="cline-any cline-yes">130x</span>
1224
- <span class="cline-any cline-yes">130x</span>
1225
- <span class="cline-any cline-neutral">&nbsp;</span>
1226
- <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-neutral">&nbsp;</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-neutral">&nbsp;</span>
1231
- <span class="cline-any cline-neutral">&nbsp;</span>
1232
- <span class="cline-any cline-neutral">&nbsp;</span>
1233
- <span class="cline-any cline-yes">130x</span>
1234
- <span class="cline-any cline-neutral">&nbsp;</span>
1235
- <span class="cline-any cline-yes">114x</span>
1236
- <span class="cline-any cline-neutral">&nbsp;</span>
1237
- <span class="cline-any cline-neutral">&nbsp;</span>
1238
- <span class="cline-any cline-neutral">&nbsp;</span>
1239
- <span class="cline-any cline-neutral">&nbsp;</span>
1240
- <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-neutral">&nbsp;</span>
1242
- <span class="cline-any cline-neutral">&nbsp;</span>
1243
- <span class="cline-any cline-neutral">&nbsp;</span>
1244
- <span class="cline-any cline-neutral">&nbsp;</span>
1245
- <span class="cline-any cline-yes">125x</span>
1246
- <span class="cline-any cline-yes">125x</span>
1247
- <span class="cline-any cline-yes">125x</span>
1248
- <span class="cline-any cline-yes">125x</span>
1249
- <span class="cline-any cline-yes">5x</span>
1250
- <span class="cline-any cline-neutral">&nbsp;</span>
1251
- <span class="cline-any cline-yes">125x</span>
1252
- <span class="cline-any cline-neutral">&nbsp;</span>
1253
- <span class="cline-any cline-neutral">&nbsp;</span>
1254
- <span class="cline-any cline-neutral">&nbsp;</span>
1255
- <span class="cline-any cline-neutral">&nbsp;</span>
1256
- <span class="cline-any cline-neutral">&nbsp;</span>
1257
- <span class="cline-any cline-neutral">&nbsp;</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
- <span class="cline-any cline-neutral">&nbsp;</span>
1261
- <span class="cline-any cline-yes">130x</span>
1262
- <span class="cline-any cline-yes">130x</span>
1263
- <span class="cline-any cline-yes">130x</span>
1264
- <span class="cline-any cline-yes">20x</span>
1265
- <span class="cline-any cline-yes">20x</span>
1266
- <span class="cline-any cline-neutral">&nbsp;</span>
1267
- <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-neutral">&nbsp;</span>
1269
- <span class="cline-any cline-yes">130x</span>
1270
- <span class="cline-any cline-neutral">&nbsp;</span>
1271
- <span class="cline-any cline-neutral">&nbsp;</span>
1272
- <span class="cline-any cline-neutral">&nbsp;</span>
1273
- <span class="cline-any cline-neutral">&nbsp;</span>
1274
- <span class="cline-any cline-neutral">&nbsp;</span>
1275
- <span class="cline-any cline-neutral">&nbsp;</span>
1276
- <span class="cline-any cline-yes">130x</span>
1277
- <span class="cline-any cline-neutral">&nbsp;</span>
1278
- <span class="cline-any cline-neutral">&nbsp;</span>
1279
- <span class="cline-any cline-neutral">&nbsp;</span>
1280
- <span class="cline-any cline-neutral">&nbsp;</span>
1281
- <span class="cline-any cline-neutral">&nbsp;</span>
1282
- <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-neutral">&nbsp;</span>
1284
- <span class="cline-any cline-neutral">&nbsp;</span>
1285
- <span class="cline-any cline-neutral">&nbsp;</span>
1286
- <span class="cline-any cline-neutral">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
- <span class="cline-any cline-neutral">&nbsp;</span>
1291
- <span class="cline-any cline-neutral">&nbsp;</span>
1292
- <span class="cline-any cline-neutral">&nbsp;</span>
1293
- <span class="cline-any cline-neutral">&nbsp;</span>
1294
- <span class="cline-any cline-yes">130x</span>
1295
- <span class="cline-any cline-yes">130x</span>
1296
- <span class="cline-any cline-yes">130x</span>
1297
- <span class="cline-any cline-yes">130x</span>
1298
- <span class="cline-any cline-yes">130x</span>
1299
- <span class="cline-any cline-yes">23x</span>
1300
- <span class="cline-any cline-neutral">&nbsp;</span>
1301
- <span class="cline-any cline-yes">130x</span>
1302
- <span class="cline-any cline-yes">11x</span>
1303
- <span class="cline-any cline-yes">11x</span>
1304
- <span class="cline-any cline-yes">2x</span>
1305
- <span class="cline-any cline-neutral">&nbsp;</span>
1306
- <span class="cline-any cline-neutral">&nbsp;</span>
1307
- <span class="cline-any cline-yes">130x</span>
1308
- <span class="cline-any cline-neutral">&nbsp;</span>
1309
- <span class="cline-any cline-neutral">&nbsp;</span>
1310
- <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-yes">390x</span>
1312
- <span class="cline-any cline-yes">18x</span>
1313
- <span class="cline-any cline-yes">19x</span>
1314
- <span class="cline-any cline-yes">5x</span>
1315
- <span class="cline-any cline-yes">5x</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-neutral">&nbsp;</span>
1319
- <span class="cline-any cline-neutral">&nbsp;</span>
1320
- <span class="cline-any cline-neutral">&nbsp;</span>
1321
- <span class="cline-any cline-neutral">&nbsp;</span>
1322
- <span class="cline-any cline-neutral">&nbsp;</span>
1323
- <span class="cline-any cline-yes">107x</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-neutral">&nbsp;</span>
1326
- <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-neutral">&nbsp;</span>
1329
- <span class="cline-any cline-neutral">&nbsp;</span>
1330
- <span class="cline-any cline-neutral">&nbsp;</span>
1331
- <span class="cline-any cline-neutral">&nbsp;</span>
1332
- <span class="cline-any cline-neutral">&nbsp;</span>
1333
- <span class="cline-any cline-neutral">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-neutral">&nbsp;</span>
1336
- <span class="cline-any cline-yes">8x</span>
1337
- <span class="cline-any cline-neutral">&nbsp;</span>
1338
- <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-yes">8x</span>
1340
- <span class="cline-any cline-yes">7x</span>
1341
- <span class="cline-any cline-yes">7x</span>
1342
- <span class="cline-any cline-yes">7x</span>
1343
- <span class="cline-any cline-yes">2x</span>
1344
- <span class="cline-any cline-neutral">&nbsp;</span>
1345
- <span class="cline-any cline-neutral">&nbsp;</span>
1346
- <span class="cline-any cline-neutral">&nbsp;</span>
1347
- <span class="cline-any cline-neutral">&nbsp;</span>
1348
- <span class="cline-any cline-neutral">&nbsp;</span>
1349
- <span class="cline-any cline-neutral">&nbsp;</span>
1350
- <span class="cline-any cline-neutral">&nbsp;</span>
1351
- <span class="cline-any cline-neutral">&nbsp;</span>
1352
- <span class="cline-any cline-neutral">&nbsp;</span>
1353
- <span class="cline-any cline-yes">5x</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span>
1355
- <span class="cline-any cline-neutral">&nbsp;</span>
1356
- <span class="cline-any cline-neutral">&nbsp;</span>
1357
- <span class="cline-any cline-neutral">&nbsp;</span>
1358
- <span class="cline-any cline-neutral">&nbsp;</span>
1359
- <span class="cline-any cline-yes">20x</span>
1360
- <span class="cline-any cline-neutral">&nbsp;</span>
1361
- <span class="cline-any cline-neutral">&nbsp;</span>
1362
- <span class="cline-any cline-neutral">&nbsp;</span>
1363
- <span class="cline-any cline-neutral">&nbsp;</span>
1364
- <span class="cline-any cline-neutral">&nbsp;</span>
1365
- <span class="cline-any cline-neutral">&nbsp;</span>
1366
- <span class="cline-any cline-neutral">&nbsp;</span>
1367
- <span class="cline-any cline-yes">13x</span>
1368
- <span class="cline-any cline-yes">13x</span>
1369
- <span class="cline-any cline-yes">13x</span>
1370
- <span class="cline-any cline-neutral">&nbsp;</span>
1371
- <span class="cline-any cline-yes">13x</span>
1372
- <span class="cline-any cline-neutral">&nbsp;</span>
1373
- <span class="cline-any cline-yes">7x</span>
1374
- <span class="cline-any cline-neutral">&nbsp;</span>
1375
- <span class="cline-any cline-neutral">&nbsp;</span>
1376
- <span class="cline-any cline-neutral">&nbsp;</span>
1377
- <span class="cline-any cline-neutral">&nbsp;</span>
1378
- <span class="cline-any cline-neutral">&nbsp;</span>
1379
- <span class="cline-any cline-neutral">&nbsp;</span>
1380
- <span class="cline-any cline-neutral">&nbsp;</span>
1381
- <span class="cline-any cline-neutral">&nbsp;</span>
1382
- <span class="cline-any cline-neutral">&nbsp;</span>
1383
- <span class="cline-any cline-neutral">&nbsp;</span>
1384
- <span class="cline-any cline-neutral">&nbsp;</span>
1385
- <span class="cline-any cline-neutral">&nbsp;</span>
1386
- <span class="cline-any cline-neutral">&nbsp;</span>
1387
- <span class="cline-any cline-neutral">&nbsp;</span>
1388
- <span class="cline-any cline-yes">10x</span>
1389
- <span class="cline-any cline-yes">10x</span>
1390
- <span class="cline-any cline-yes">3x</span>
1391
- <span class="cline-any cline-neutral">&nbsp;</span>
1392
- <span class="cline-any cline-yes">7x</span>
1393
- <span class="cline-any cline-yes">7x</span>
1394
- <span class="cline-any cline-neutral">&nbsp;</span>
1395
- <span class="cline-any cline-neutral">&nbsp;</span>
1396
- <span class="cline-any cline-neutral">&nbsp;</span>
1397
- <span class="cline-any cline-neutral">&nbsp;</span>
1398
- <span class="cline-any cline-neutral">&nbsp;</span>
1399
- <span class="cline-any cline-yes">108x</span>
1400
- <span class="cline-any cline-yes">108x</span>
1401
- <span class="cline-any cline-yes">7x</span>
1402
- <span class="cline-any cline-yes">7x</span>
1403
- <span class="cline-any cline-yes">7x</span>
1404
- <span class="cline-any cline-neutral">&nbsp;</span>
1405
- <span class="cline-any cline-yes">108x</span>
1406
- <span class="cline-any cline-yes">108x</span>
1407
- <span class="cline-any cline-neutral">&nbsp;</span>
1408
- <span class="cline-any cline-neutral">&nbsp;</span>
1409
- <span class="cline-any cline-neutral">&nbsp;</span>
1410
- <span class="cline-any cline-neutral">&nbsp;</span>
1411
- <span class="cline-any cline-neutral">&nbsp;</span>
1412
- <span class="cline-any cline-neutral">&nbsp;</span>
1413
- <span class="cline-any cline-yes">108x</span>
1414
- <span class="cline-any cline-yes">4x</span>
1415
- <span class="cline-any cline-neutral">&nbsp;</span>
1416
- <span class="cline-any cline-neutral">&nbsp;</span>
1417
- <span class="cline-any cline-neutral">&nbsp;</span>
1418
- <span class="cline-any cline-neutral">&nbsp;</span>
1419
- <span class="cline-any cline-yes">105x</span>
1420
- <span class="cline-any cline-yes">105x</span>
1421
- <span class="cline-any cline-yes">7x</span>
1422
- <span class="cline-any cline-neutral">&nbsp;</span>
1423
- <span class="cline-any cline-yes">105x</span>
1424
- <span class="cline-any cline-neutral">&nbsp;</span>
1425
- <span class="cline-any cline-neutral">&nbsp;</span>
1426
- <span class="cline-any cline-neutral">&nbsp;</span>
1427
- <span class="cline-any cline-yes">109x</span>
1428
- <span class="cline-any cline-yes">109x</span>
1429
- <span class="cline-any cline-yes">119x</span>
1430
- <span class="cline-any cline-yes">119x</span>
1431
- <span class="cline-any cline-yes">119x</span>
1432
- <span class="cline-any cline-neutral">&nbsp;</span>
1433
- <span class="cline-any cline-yes">109x</span>
1434
- <span class="cline-any cline-yes">109x</span>
1435
- <span class="cline-any cline-neutral">&nbsp;</span>
1436
- <span class="cline-any cline-neutral">&nbsp;</span>
1437
- <span class="cline-any cline-neutral">&nbsp;</span>
1438
- <span class="cline-any cline-yes">4x</span>
1439
- <span class="cline-any cline-neutral">&nbsp;</span>
1440
- <span class="cline-any cline-neutral">&nbsp;</span>
1441
- <span class="cline-any cline-neutral">&nbsp;</span>
1442
- <span class="cline-any cline-yes">118x</span>
1443
- <span class="cline-any cline-neutral">&nbsp;</span>
1444
- <span class="cline-any cline-neutral">&nbsp;</span>
1445
- <span class="cline-any cline-neutral">&nbsp;</span>
1446
- <span class="cline-any cline-neutral">&nbsp;</span>
1447
- <span class="cline-any cline-neutral">&nbsp;</span>
1448
- <span class="cline-any cline-neutral">&nbsp;</span>
1449
- <span class="cline-any cline-neutral">&nbsp;</span>
1450
- <span class="cline-any cline-neutral">&nbsp;</span>
1451
- <span class="cline-any cline-neutral">&nbsp;</span>
1452
- <span class="cline-any cline-neutral">&nbsp;</span>
1453
- <span class="cline-any cline-neutral">&nbsp;</span>
1454
- <span class="cline-any cline-neutral">&nbsp;</span>
1455
- <span class="cline-any cline-yes">125x</span>
1456
- <span class="cline-any cline-neutral">&nbsp;</span>
1457
- <span class="cline-any cline-yes">125x</span>
1458
- <span class="cline-any cline-yes">125x</span>
1459
- <span class="cline-any cline-yes">125x</span>
1460
- <span class="cline-any cline-yes">125x</span>
1461
- <span class="cline-any cline-yes">125x</span>
1462
- <span class="cline-any cline-yes">125x</span>
1463
- <span class="cline-any cline-yes">125x</span>
1464
- <span class="cline-any cline-yes">125x</span>
1465
- <span class="cline-any cline-neutral">&nbsp;</span>
1466
- <span class="cline-any cline-neutral">&nbsp;</span>
1467
- <span class="cline-any cline-neutral">&nbsp;</span>
1468
- <span class="cline-any cline-yes">125x</span>
1469
- <span class="cline-any cline-neutral">&nbsp;</span>
1470
- <span class="cline-any cline-neutral">&nbsp;</span>
1471
- <span class="cline-any cline-neutral">&nbsp;</span>
1472
- <span class="cline-any cline-neutral">&nbsp;</span>
1473
- <span class="cline-any cline-neutral">&nbsp;</span>
1474
- <span class="cline-any cline-yes">125x</span>
1475
- <span class="cline-any cline-yes">15x</span>
1476
- <span class="cline-any cline-neutral">&nbsp;</span>
1477
- <span class="cline-any cline-yes">125x</span>
1478
- <span class="cline-any cline-neutral">&nbsp;</span>
1479
- <span class="cline-any cline-yes">125x</span>
1480
- <span class="cline-any cline-yes">20x</span>
1481
- <span class="cline-any cline-yes">20x</span>
1482
- <span class="cline-any cline-yes">29x</span>
1483
- <span class="cline-any cline-yes">29x</span>
1484
- <span class="cline-any cline-yes">29x</span>
1485
- <span class="cline-any cline-yes">29x</span>
1486
- <span class="cline-any cline-neutral">&nbsp;</span>
1487
- <span class="cline-any cline-neutral">&nbsp;</span>
1488
- <span class="cline-any cline-neutral">&nbsp;</span>
1489
- <span class="cline-any cline-neutral">&nbsp;</span>
1490
- <span class="cline-any cline-yes">125x</span>
1491
- <span class="cline-any cline-yes">4x</span>
1492
- <span class="cline-any cline-yes">4x</span>
1493
- <span class="cline-any cline-yes">4x</span>
1494
- <span class="cline-any cline-yes">4x</span>
1495
- <span class="cline-any cline-yes">6x</span>
1496
- <span class="cline-any cline-yes">6x</span>
1497
- <span class="cline-any cline-yes">6x</span>
1498
- <span class="cline-any cline-neutral">&nbsp;</span>
1499
- <span class="cline-any cline-neutral">&nbsp;</span>
1500
- <span class="cline-any cline-neutral">&nbsp;</span>
1501
- <span class="cline-any cline-neutral">&nbsp;</span>
1502
- <span class="cline-any cline-neutral">&nbsp;</span>
1503
- <span class="cline-any cline-yes">125x</span>
1504
- <span class="cline-any cline-yes">7x</span>
1505
- <span class="cline-any cline-yes">7x</span>
1506
- <span class="cline-any cline-yes">1x</span>
1507
- <span class="cline-any cline-yes">1x</span>
1508
- <span class="cline-any cline-neutral">&nbsp;</span>
1509
- <span class="cline-any cline-yes">6x</span>
1510
- <span class="cline-any cline-neutral">&nbsp;</span>
1511
- <span class="cline-any cline-neutral">&nbsp;</span>
1512
- <span class="cline-any cline-neutral">&nbsp;</span>
1513
- <span class="cline-any cline-neutral">&nbsp;</span>
1514
- <span class="cline-any cline-yes">125x</span>
1515
- <span class="cline-any cline-yes">23x</span>
1516
- <span class="cline-any cline-neutral">&nbsp;</span>
1517
- <span class="cline-any cline-neutral">&nbsp;</span>
1518
- <span class="cline-any cline-neutral">&nbsp;</span>
1519
- <span class="cline-any cline-neutral">&nbsp;</span>
1520
- <span class="cline-any cline-neutral">&nbsp;</span>
1521
- <span class="cline-any cline-yes">69x</span>
1522
- <span class="cline-any cline-neutral">&nbsp;</span>
1523
- <span class="cline-any cline-yes">23x</span>
1524
- <span class="cline-any cline-yes">23x</span>
1525
- <span class="cline-any cline-yes">1x</span>
1526
- <span class="cline-any cline-yes">1x</span>
1527
- <span class="cline-any cline-yes">22x</span>
1528
- <span class="cline-any cline-no">&nbsp;</span>
1529
- <span class="cline-any cline-no">&nbsp;</span>
1530
- <span class="cline-any cline-neutral">&nbsp;</span>
1531
- <span class="cline-any cline-yes">22x</span>
1532
- <span class="cline-any cline-yes">22x</span>
1533
- <span class="cline-any cline-yes">22x</span>
1534
- <span class="cline-any cline-yes">22x</span>
1535
- <span class="cline-any cline-yes">69x</span>
1536
- <span class="cline-any cline-neutral">&nbsp;</span>
1537
- <span class="cline-any cline-neutral">&nbsp;</span>
1538
- <span class="cline-any cline-neutral">&nbsp;</span>
1539
- <span class="cline-any cline-neutral">&nbsp;</span>
1540
- <span class="cline-any cline-neutral">&nbsp;</span>
1541
- <span class="cline-any cline-yes">125x</span>
1542
- <span class="cline-any cline-yes">125x</span>
1543
- <span class="cline-any cline-yes">125x</span>
1544
- <span class="cline-any cline-yes">125x</span>
1545
- <span class="cline-any cline-yes">10x</span>
1546
- <span class="cline-any cline-yes">10x</span>
1547
- <span class="cline-any cline-yes">10x</span>
1548
- <span class="cline-any cline-yes">10x</span>
1549
- <span class="cline-any cline-yes">10x</span>
1550
- <span class="cline-any cline-neutral">&nbsp;</span>
1551
- <span class="cline-any cline-neutral">&nbsp;</span>
1552
- <span class="cline-any cline-yes">10x</span>
1553
- <span class="cline-any cline-yes">10x</span>
1554
- <span class="cline-any cline-yes">1x</span>
1555
- <span class="cline-any cline-yes">1x</span>
1556
- <span class="cline-any cline-yes">1x</span>
1557
- <span class="cline-any cline-neutral">&nbsp;</span>
1558
- <span class="cline-any cline-neutral">&nbsp;</span>
1559
- <span class="cline-any cline-neutral">&nbsp;</span>
1560
- <span class="cline-any cline-neutral">&nbsp;</span>
1561
- <span class="cline-any cline-yes">125x</span>
1562
- <span class="cline-any cline-yes">125x</span>
1563
- <span class="cline-any cline-yes">3x</span>
1564
- <span class="cline-any cline-yes">3x</span>
1565
- <span class="cline-any cline-yes">3x</span>
1566
- <span class="cline-any cline-yes">8x</span>
1567
- <span class="cline-any cline-neutral">&nbsp;</span>
1568
- <span class="cline-any cline-neutral">&nbsp;</span>
1569
- <span class="cline-any cline-neutral">&nbsp;</span>
1570
- <span class="cline-any cline-yes">125x</span>
1571
- <span class="cline-any cline-yes">125x</span>
1572
- <span class="cline-any cline-neutral">&nbsp;</span>
1573
- <span class="cline-any cline-neutral">&nbsp;</span>
1574
- <span class="cline-any cline-neutral">&nbsp;</span>
1575
- <span class="cline-any cline-neutral">&nbsp;</span>
1576
- <span class="cline-any cline-yes">125x</span>
1577
- <span class="cline-any cline-yes">125x</span>
1578
- <span class="cline-any cline-neutral">&nbsp;</span>
1579
- <span class="cline-any cline-neutral">&nbsp;</span>
1580
- <span class="cline-any cline-neutral">&nbsp;</span>
1581
- <span class="cline-any cline-neutral">&nbsp;</span>
1582
- <span class="cline-any cline-yes">125x</span>
1583
- <span class="cline-any cline-yes">125x</span>
1584
- <span class="cline-any cline-yes">125x</span>
1585
- <span class="cline-any cline-yes">125x</span>
1586
- <span class="cline-any cline-yes">125x</span>
1587
- <span class="cline-any cline-yes">1x</span>
1588
- <span class="cline-any cline-yes">1x</span>
1589
- <span class="cline-any cline-yes">2x</span>
1590
- <span class="cline-any cline-yes">2x</span>
1591
- <span class="cline-any cline-yes">2x</span>
1592
- <span class="cline-any cline-neutral">&nbsp;</span>
1593
- <span class="cline-any cline-yes">1x</span>
1594
- <span class="cline-any cline-neutral">&nbsp;</span>
1595
- <span class="cline-any cline-yes">125x</span>
1596
- <span class="cline-any cline-neutral">&nbsp;</span>
1597
- <span class="cline-any cline-neutral">&nbsp;</span>
1598
- <span class="cline-any cline-neutral">&nbsp;</span>
1599
- <span class="cline-any cline-neutral">&nbsp;</span>
1600
- <span class="cline-any cline-neutral">&nbsp;</span>
1601
- <span class="cline-any cline-neutral">&nbsp;</span>
1602
- <span class="cline-any cline-yes">7x</span>
1603
- <span class="cline-any cline-yes">7x</span>
1604
- <span class="cline-any cline-yes">5x</span>
1605
- <span class="cline-any cline-neutral">&nbsp;</span>
1606
- <span class="cline-any cline-yes">2x</span>
1607
- <span class="cline-any cline-yes">1x</span>
1608
- <span class="cline-any cline-neutral">&nbsp;</span>
1609
- <span class="cline-any cline-yes">1x</span>
1610
- <span class="cline-any cline-yes">1x</span>
1611
- <span class="cline-any cline-yes">1x</span>
1612
- <span class="cline-any cline-neutral">&nbsp;</span>
1613
- <span class="cline-any cline-no">&nbsp;</span>
1614
- <span class="cline-any cline-neutral">&nbsp;</span>
1615
- <span class="cline-any cline-neutral">&nbsp;</span>
1616
- <span class="cline-any cline-neutral">&nbsp;</span>
1617
- <span class="cline-any cline-neutral">&nbsp;</span>
1618
- <span class="cline-any cline-yes">6x</span>
1619
- <span class="cline-any cline-yes">2x</span>
1620
- <span class="cline-any cline-yes">1x</span>
1621
- <span class="cline-any cline-no">&nbsp;</span>
1622
- <span class="cline-any cline-neutral">&nbsp;</span>
1623
- <span class="cline-any cline-neutral">&nbsp;</span>
1624
- <span class="cline-any cline-neutral">&nbsp;</span>
1625
- <span class="cline-any cline-neutral">&nbsp;</span>
1626
- <span class="cline-any cline-neutral">&nbsp;</span>
1627
- <span class="cline-any cline-yes">108x</span>
1628
- <span class="cline-any cline-yes">108x</span>
1629
- <span class="cline-any cline-yes">10x</span>
1630
- <span class="cline-any cline-yes">11x</span>
1631
- <span class="cline-any cline-neutral">&nbsp;</span>
1632
- <span class="cline-any cline-neutral">&nbsp;</span>
1633
- <span class="cline-any cline-yes">108x</span>
1634
- <span class="cline-any cline-neutral">&nbsp;</span>
1635
- <span class="cline-any cline-neutral">&nbsp;</span>
1636
- <span class="cline-any cline-neutral">&nbsp;</span>
1637
- <span class="cline-any cline-neutral">&nbsp;</span>
1638
- <span class="cline-any cline-yes">11x</span>
1639
- <span class="cline-any cline-yes">11x</span>
1640
- <span class="cline-any cline-yes">1x</span>
1641
- <span class="cline-any cline-yes">1x</span>
1642
- <span class="cline-any cline-yes">1x</span>
1643
- <span class="cline-any cline-neutral">&nbsp;</span>
1644
- <span class="cline-any cline-neutral">&nbsp;</span>
1645
- <span class="cline-any cline-yes">11x</span>
1646
- <span class="cline-any cline-neutral">&nbsp;</span>
1647
- <span class="cline-any cline-neutral">&nbsp;</span>
1648
- <span class="cline-any cline-neutral">&nbsp;</span>
1649
- <span class="cline-any cline-neutral">&nbsp;</span>
1650
- <span class="cline-any cline-neutral">&nbsp;</span>
1651
- <span class="cline-any cline-neutral">&nbsp;</span>
1652
- <span class="cline-any cline-neutral">&nbsp;</span>
1653
- <span class="cline-any cline-neutral">&nbsp;</span>
1654
- <span class="cline-any cline-neutral">&nbsp;</span>
1655
- <span class="cline-any cline-neutral">&nbsp;</span>
1656
- <span class="cline-any cline-neutral">&nbsp;</span>
1657
- <span class="cline-any cline-neutral">&nbsp;</span>
1658
- <span class="cline-any cline-neutral">&nbsp;</span>
1659
- <span class="cline-any cline-yes">12x</span>
1660
- <span class="cline-any cline-yes">13x</span>
1661
- <span class="cline-any cline-neutral">&nbsp;</span>
1662
- <span class="cline-any cline-yes">5x</span>
1663
- <span class="cline-any cline-yes">5x</span>
1664
- <span class="cline-any cline-yes">5x</span>
1665
- <span class="cline-any cline-yes">3x</span>
1666
- <span class="cline-any cline-yes">7x</span>
1667
- <span class="cline-any cline-yes">6x</span>
1668
- <span class="cline-any cline-neutral">&nbsp;</span>
1669
- <span class="cline-any cline-neutral">&nbsp;</span>
1670
- <span class="cline-any cline-yes">2x</span>
1671
- <span class="cline-any cline-yes">2x</span>
1672
- <span class="cline-any cline-neutral">&nbsp;</span>
1673
- <span class="cline-any cline-neutral">&nbsp;</span>
1674
- <span class="cline-any cline-no">&nbsp;</span>
1675
- <span class="cline-any cline-no">&nbsp;</span>
1676
- <span class="cline-any cline-neutral">&nbsp;</span>
1677
- <span class="cline-any cline-no">&nbsp;</span>
1678
- <span class="cline-any cline-neutral">&nbsp;</span>
1679
- <span class="cline-any cline-neutral">&nbsp;</span>
1680
- <span class="cline-any cline-neutral">&nbsp;</span>
1681
- <span class="cline-any cline-neutral">&nbsp;</span>
1682
- <span class="cline-any cline-yes">14x</span>
1683
- <span class="cline-any cline-yes">6x</span>
1684
- <span class="cline-any cline-no">&nbsp;</span>
1685
- <span class="cline-any cline-no">&nbsp;</span>
1686
- <span class="cline-any cline-no">&nbsp;</span>
1687
- <span class="cline-any cline-neutral">&nbsp;</span>
1688
- <span class="cline-any cline-no">&nbsp;</span>
1689
- <span class="cline-any cline-no">&nbsp;</span>
1690
- <span class="cline-any cline-neutral">&nbsp;</span>
1691
- <span class="cline-any cline-no">&nbsp;</span>
1692
- <span class="cline-any cline-neutral">&nbsp;</span>
1693
- <span class="cline-any cline-neutral">&nbsp;</span>
1694
- <span class="cline-any cline-neutral">&nbsp;</span>
1695
- <span class="cline-any cline-neutral">&nbsp;</span>
1696
- <span class="cline-any cline-yes">35x</span>
1697
- <span class="cline-any cline-yes">35x</span>
1698
- <span class="cline-any cline-yes">25x</span>
1699
- <span class="cline-any cline-yes">24x</span>
1700
- <span class="cline-any cline-yes">24x</span>
1701
- <span class="cline-any cline-yes">24x</span>
1702
- <span class="cline-any cline-yes">5x</span>
1703
- <span class="cline-any cline-yes">5x</span>
1704
- <span class="cline-any cline-neutral">&nbsp;</span>
1705
- <span class="cline-any cline-yes">19x</span>
1706
- <span class="cline-any cline-neutral">&nbsp;</span>
1707
- <span class="cline-any cline-yes">5x</span>
1708
- <span class="cline-any cline-neutral">&nbsp;</span>
1709
- <span class="cline-any cline-yes">1x</span>
1710
- <span class="cline-any cline-neutral">&nbsp;</span>
1711
- <span class="cline-any cline-no">&nbsp;</span>
1712
- <span class="cline-any cline-neutral">&nbsp;</span>
1713
- <span class="cline-any cline-neutral">&nbsp;</span>
1714
- <span class="cline-any cline-neutral">&nbsp;</span>
1715
- <span class="cline-any cline-yes">6x</span>
1716
- <span class="cline-any cline-neutral">&nbsp;</span>
1717
- <span class="cline-any cline-no">&nbsp;</span>
1718
- <span class="cline-any cline-neutral">&nbsp;</span>
1719
- <span class="cline-any cline-yes">1x</span>
1720
- <span class="cline-any cline-neutral">&nbsp;</span>
1721
- <span class="cline-any cline-no">&nbsp;</span>
1722
- <span class="cline-any cline-neutral">&nbsp;</span>
1723
- <span class="cline-any cline-no">&nbsp;</span>
1724
- <span class="cline-any cline-neutral">&nbsp;</span>
1725
- <span class="cline-any cline-yes">1x</span>
1726
- <span class="cline-any cline-neutral">&nbsp;</span>
1727
- <span class="cline-any cline-yes">5x</span>
1728
- <span class="cline-any cline-neutral">&nbsp;</span>
1729
- <span class="cline-any cline-neutral">&nbsp;</span>
1730
- <span class="cline-any cline-neutral">&nbsp;</span>
1731
- <span class="cline-any cline-neutral">&nbsp;</span>
1732
- <span class="cline-any cline-neutral">&nbsp;</span>
1733
- <span class="cline-any cline-yes">5x</span>
1734
- <span class="cline-any cline-neutral">&nbsp;</span>
1735
- <span class="cline-any cline-yes">1x</span>
1736
- <span class="cline-any cline-neutral">&nbsp;</span>
1737
- <span class="cline-any cline-yes">1x</span>
1738
- <span class="cline-any cline-neutral">&nbsp;</span>
1739
- <span class="cline-any cline-no">&nbsp;</span>
1740
- <span class="cline-any cline-neutral">&nbsp;</span>
1741
- <span class="cline-any cline-neutral">&nbsp;</span>
1742
- <span class="cline-any cline-neutral">&nbsp;</span>
1743
- <span class="cline-any cline-yes">1x</span>
1744
- <span class="cline-any cline-neutral">&nbsp;</span>
1745
- <span class="cline-any cline-yes">1x</span>
1746
- <span class="cline-any cline-neutral">&nbsp;</span>
1747
- <span class="cline-any cline-yes">1x</span>
1748
- <span class="cline-any cline-neutral">&nbsp;</span>
1749
- <span class="cline-any cline-no">&nbsp;</span>
1750
- <span class="cline-any cline-neutral">&nbsp;</span>
1751
- <span class="cline-any cline-neutral">&nbsp;</span>
1752
- <span class="cline-any cline-neutral">&nbsp;</span>
1753
- <span class="cline-any cline-neutral">&nbsp;</span>
1754
- <span class="cline-any cline-neutral">&nbsp;</span>
1755
- <span class="cline-any cline-neutral">&nbsp;</span>
1756
- <span class="cline-any cline-neutral">&nbsp;</span>
1757
- <span class="cline-any cline-neutral">&nbsp;</span>
1758
- <span class="cline-any cline-neutral">&nbsp;</span>
1759
- <span class="cline-any cline-neutral">&nbsp;</span>
1760
- <span class="cline-any cline-neutral">&nbsp;</span>
1761
- <span class="cline-any cline-neutral">&nbsp;</span>
1762
- <span class="cline-any cline-neutral">&nbsp;</span>
1763
- <span class="cline-any cline-neutral">&nbsp;</span>
1764
- <span class="cline-any cline-neutral">&nbsp;</span>
1765
- <span class="cline-any cline-yes">45x</span>
1766
- <span class="cline-any cline-neutral">&nbsp;</span>
1767
- <span class="cline-any cline-yes">22x</span>
1768
- <span class="cline-any cline-neutral">&nbsp;</span>
1769
- <span class="cline-any cline-yes">11x</span>
1770
- <span class="cline-any cline-neutral">&nbsp;</span>
1771
- <span class="cline-any cline-yes">3x</span>
1772
- <span class="cline-any cline-neutral">&nbsp;</span>
1773
- <span class="cline-any cline-no">&nbsp;</span>
1774
- <span class="cline-any cline-neutral">&nbsp;</span>
1775
- <span class="cline-any cline-yes">2x</span>
1776
- <span class="cline-any cline-neutral">&nbsp;</span>
1777
- <span class="cline-any cline-neutral">&nbsp;</span>
1778
- <span class="cline-any cline-neutral">&nbsp;</span>
1779
- <span class="cline-any cline-yes">3x</span>
1780
- <span class="cline-any cline-neutral">&nbsp;</span>
1781
- <span class="cline-any cline-yes">1x</span>
1782
- <span class="cline-any cline-neutral">&nbsp;</span>
1783
- <span class="cline-any cline-no">&nbsp;</span>
1784
- <span class="cline-any cline-neutral">&nbsp;</span>
1785
- <span class="cline-any cline-no">&nbsp;</span>
1786
- <span class="cline-any cline-neutral">&nbsp;</span>
1787
- <span class="cline-any cline-yes">1x</span>
1788
- <span class="cline-any cline-neutral">&nbsp;</span>
1789
- <span class="cline-any cline-yes">1x</span>
1790
- <span class="cline-any cline-neutral">&nbsp;</span>
1791
- <span class="cline-any cline-no">&nbsp;</span>
1792
- <span class="cline-any cline-neutral">&nbsp;</span>
1793
- <span class="cline-any cline-no">&nbsp;</span>
1794
- <span class="cline-any cline-neutral">&nbsp;</span>
1795
- <span class="cline-any cline-neutral">&nbsp;</span>
1796
- <span class="cline-any cline-yes">1x</span>
1797
- <span class="cline-any cline-neutral">&nbsp;</span>
1798
- <span class="cline-any cline-no">&nbsp;</span>
1799
- <span class="cline-any cline-neutral">&nbsp;</span>
1800
- <span class="cline-any cline-yes">1x</span>
1801
- <span class="cline-any cline-neutral">&nbsp;</span>
1802
- <span class="cline-any cline-no">&nbsp;</span>
1803
- <span class="cline-any cline-neutral">&nbsp;</span>
1804
- <span class="cline-any cline-no">&nbsp;</span>
1805
- <span class="cline-any cline-neutral">&nbsp;</span>
1806
- <span class="cline-any cline-no">&nbsp;</span>
1807
- <span class="cline-any cline-neutral">&nbsp;</span>
1808
- <span class="cline-any cline-no">&nbsp;</span>
1809
- <span class="cline-any cline-neutral">&nbsp;</span>
1810
- <span class="cline-any cline-no">&nbsp;</span>
1811
- <span class="cline-any cline-neutral">&nbsp;</span>
1812
- <span class="cline-any cline-yes">11x</span>
1813
- <span class="cline-any cline-yes">11x</span>
1814
- <span class="cline-any cline-neutral">&nbsp;</span>
1815
- <span class="cline-any cline-yes">7x</span>
1816
- <span class="cline-any cline-yes">7x</span>
1817
- <span class="cline-any cline-neutral">&nbsp;</span>
1818
- <span class="cline-any cline-neutral">&nbsp;</span>
1819
- <span class="cline-any cline-no">&nbsp;</span>
1820
- <span class="cline-any cline-neutral">&nbsp;</span>
1821
- <span class="cline-any cline-yes">10x</span>
1822
- <span class="cline-any cline-neutral">&nbsp;</span>
1823
- <span class="cline-any cline-no">&nbsp;</span>
1824
- <span class="cline-any cline-neutral">&nbsp;</span>
1825
- <span class="cline-any cline-neutral">&nbsp;</span>
1826
- <span class="cline-any cline-neutral">&nbsp;</span>
1827
- <span class="cline-any cline-neutral">&nbsp;</span>
1828
- <span class="cline-any cline-neutral">&nbsp;</span>
1829
- <span class="cline-any cline-yes">7x</span>
1830
- <span class="cline-any cline-neutral">&nbsp;</span>
1831
- <span class="cline-any cline-neutral">&nbsp;</span>
1832
- <span class="cline-any cline-neutral">&nbsp;</span>
1833
- <span class="cline-any cline-neutral">&nbsp;</span>
1834
- <span class="cline-any cline-yes">17x</span>
1835
- <span class="cline-any cline-yes">17x</span>
1836
- <span class="cline-any cline-yes">32x</span>
1837
- <span class="cline-any cline-yes">29x</span>
1838
- <span class="cline-any cline-yes">6x</span>
1839
- <span class="cline-any cline-yes">23x</span>
1840
- <span class="cline-any cline-yes">22x</span>
1841
- <span class="cline-any cline-neutral">&nbsp;</span>
1842
- <span class="cline-any cline-neutral">&nbsp;</span>
1843
- <span class="cline-any cline-yes">17x</span>
1844
- <span class="cline-any cline-neutral">&nbsp;</span>
1845
- <span class="cline-any cline-neutral">&nbsp;</span>
1846
- <span class="cline-any cline-neutral">&nbsp;</span>
1847
- <span class="cline-any cline-neutral">&nbsp;</span>
1848
- <span class="cline-any cline-neutral">&nbsp;</span>
1849
- <span class="cline-any cline-neutral">&nbsp;</span>
1850
- <span class="cline-any cline-yes">125x</span>
1851
- <span class="cline-any cline-neutral">&nbsp;</span>
1852
- <span class="cline-any cline-neutral">&nbsp;</span>
1853
- <span class="cline-any cline-neutral">&nbsp;</span>
1854
- <span class="cline-any cline-neutral">&nbsp;</span>
1855
- <span class="cline-any cline-yes">23x</span>
1856
- <span class="cline-any cline-neutral">&nbsp;</span>
1857
- <span class="cline-any cline-neutral">&nbsp;</span>
1858
- <span class="cline-any cline-neutral">&nbsp;</span>
1859
- <span class="cline-any cline-yes">23x</span>
1860
- <span class="cline-any cline-neutral">&nbsp;</span>
1861
- <span class="cline-any cline-neutral">&nbsp;</span>
1862
- <span class="cline-any cline-neutral">&nbsp;</span>
1863
- <span class="cline-any cline-neutral">&nbsp;</span>
1864
- <span class="cline-any cline-yes">130x</span>
1865
- <span class="cline-any cline-neutral">&nbsp;</span>
1866
- <span class="cline-any cline-neutral">&nbsp;</span>
1867
- <span class="cline-any cline-neutral">&nbsp;</span>
1868
- <span class="cline-any cline-neutral">&nbsp;</span>
1869
- <span class="cline-any cline-neutral">&nbsp;</span>
1870
- <span class="cline-any cline-neutral">&nbsp;</span>
1871
- <span class="cline-any cline-yes">130x</span>
1872
- <span class="cline-any cline-neutral">&nbsp;</span>
1873
- <span class="cline-any cline-neutral">&nbsp;</span>
1874
- <span class="cline-any cline-neutral">&nbsp;</span>
1875
- <span class="cline-any cline-neutral">&nbsp;</span>
1876
- <span class="cline-any cline-yes">125x</span>
1877
- <span class="cline-any cline-neutral">&nbsp;</span>
1878
- <span class="cline-any cline-neutral">&nbsp;</span>
1879
- <span class="cline-any cline-neutral">&nbsp;</span>
1880
- <span class="cline-any cline-neutral">&nbsp;</span>
1881
- <span class="cline-any cline-yes">105x</span>
1882
- <span class="cline-any cline-neutral">&nbsp;</span>
1883
- <span class="cline-any cline-neutral">&nbsp;</span>
1884
- <span class="cline-any cline-neutral">&nbsp;</span>
1885
- <span class="cline-any cline-neutral">&nbsp;</span>
1886
- <span class="cline-any cline-neutral">&nbsp;</span>
1887
- <span class="cline-any cline-neutral">&nbsp;</span>
1888
- <span class="cline-any cline-neutral">&nbsp;</span>
1889
- <span class="cline-any cline-yes">476x</span>
1890
- <span class="cline-any cline-yes">139x</span>
1891
- <span class="cline-any cline-neutral">&nbsp;</span>
1892
- <span class="cline-any cline-yes">337x</span>
1893
- <span class="cline-any cline-neutral">&nbsp;</span>
1894
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type {
1895
- OpRootNode,
1896
- OpRouteNode,
1897
- OpOperationNode,
1898
- OpResponseNode,
1899
- ParamSource,
1900
- ContractTypeNode,
1901
- ContractRootNode,
1902
- ModelNode,
1903
- FieldNode,
1904
- IncrementalManifest,
1905
- IncrementalUnit,
1906
- IncrementalResult as IncrementalResultBase,
1907
- } from '@contractkit/core';
1908
- import {
1909
- resolveSecurity,
1910
- resolveModifiers,
1911
- SECURITY_NONE,
1912
- collectTransitiveModelRefs,
1913
- runIncrementalCodegen,
1914
- parseIncrementalManifest,
1915
- emptyIncrementalManifest,
1916
- serializeIncrementalManifest,
1917
- hashFingerprint,
1918
- INCREMENTAL_MANIFEST_VERSION,
1919
- } from '@contractkit/core';
1920
- import { basename } from 'path';
1921
- import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
1922
- &nbsp;
1923
- /** A single file produced by the Bruno codegen — a relative output path and its YAML content. */
1924
- export interface OpenCollectionFile {
1925
- relativePath: string;
1926
- content: string;
1927
- }
1928
- &nbsp;
1929
- /** Manifest filename — tracks which files this plugin previously generated so subsequent runs can clean up only those, leaving any user-added files alone. */
1930
- export const MANIFEST_FILENAME = '.contractkit-bruno-manifest.json';
1931
- &nbsp;
1932
- /**
1933
- * Bumped whenever the codegen output shape changes in a way that should bust
1934
- * every per-op fingerprint. Mixed into the per-op fingerprint so a plugin
1935
- * upgrade forces full regeneration even when source `.ck` files are unchanged.
1936
- */
1937
- export const BRUNO_CODEGEN_VERSION = '1';
1938
- &nbsp;
1939
- /** Subset of a security scheme sufficient for Bruno auth generation (non-HMAC). */
1940
- export interface BrunoSecurityScheme {
1941
- type: string; // "http" | "apiKey" | "oauth2" | "openIdConnect"
1942
- scheme?: string; // "bearer" | "basic" (when type === "http")
1943
- name?: string; // header/query param name (when type === "apiKey")
1944
- in?: string; // "header" | "query" (when type === "apiKey")
1945
- }
1946
- &nbsp;
1947
- /** Auth configuration passed to the Bruno codegen; drives collection-level auth and per-operation auth blocks. */
1948
- export interface BrunoAuthOptions {
1949
- /** Name of the default scheme (from config.security.default) */
1950
- defaultScheme?: string;
1951
- /** Scheme definitions keyed by name (non-HMAC only) */
1952
- schemes?: Record&lt;string, BrunoSecurityScheme&gt;;
1953
- }
1954
- &nbsp;
1955
- /** Options controlling what {@link generateOpenCollection} emits. */
1956
- export interface OpenCollectionOptions {
1957
- collectionName: string;
1958
- contractRoots?: ContractRootNode[];
1959
- auth?: BrunoAuthOptions;
1960
- /**
1961
- * When true, emit Bruno faker template strings (e.g. `{{$randomUUID}}`,
1962
- * `{{$randomEmail}}`) for compatible scalar types so each send produces
1963
- * fresh data. When false (default), use deterministic placeholders.
1964
- */
1965
- randomExamples?: boolean;
1966
- /**
1967
- * Whether to generate request files for operations marked `internal`. Defaults to
1968
- * `true` — Bruno collections are typically used by the team that owns the API and
1969
- * benefit from full coverage. Set to `false` to omit internal ops.
1970
- */
1971
- includeInternal?: boolean;
1972
- /**
1973
- * Map of environment name → variables. Each entry produces a
1974
- * `environments/&lt;name&gt;.yml` file with the variables in declaration order.
1975
- * Values are coerced to strings.
1976
- *
1977
- * When omitted, a default `environments/local.yml` is emitted with
1978
- * `baseUrl=http://localhost:3000` plus any auth env-var placeholders the
1979
- * default scheme requires. When provided, the default is replaced entirely
1980
- * — auth vars are not auto-injected, so include them explicitly if needed.
1981
- */
1982
- environments?: Record&lt;string, Record&lt;string, unknown&gt;&gt;;
1983
- }
1984
- &nbsp;
1985
- /** Per-operation bookkeeping computed up front: where the file lives, what to call it, and the YAML inputs needed to render or fingerprint it. */
1986
- interface OpEntry {
1987
- /** Stable identifier across runs — `&lt;file&gt;::&lt;METHOD&gt; &lt;path&gt;`. */
1988
- opKey: string;
1989
- /** Output path relative to the collection root (e.g. `users/get-user.yml`). */
1990
- relativePath: string;
1991
- /** Display name used inside the YAML `info:` block (alphabetized within its folder). */
1992
- requestName: string;
1993
- /** 1-based sequence within the request's containing folder, drives Bruno's UI ordering. */
1994
- seq: number;
1995
- route: OpRouteNode;
1996
- op: OpOperationNode;
1997
- root: OpRootNode;
1998
- }
1999
- &nbsp;
2000
- /**
2001
- * @deprecated Use {@link IncrementalManifest} from `@contractkit/core`. Re-exported here for backwards compatibility.
2002
- */
2003
- export type BrunoManifest = IncrementalManifest;
2004
- &nbsp;
2005
- /** Result of {@link generateOpenCollectionIncremental}. Renamed `skippedOpCount` for Bruno-specific clarity but otherwise the shared {@link IncrementalResultBase}. */
2006
- export interface IncrementalResult extends Omit&lt;IncrementalResultBase, 'skippedUnitCount'&gt; {
2007
- /** Number of ops whose codegen was skipped because their fingerprint matched. */
2008
- skippedOpCount: number;
2009
- }
2010
- &nbsp;
2011
- /**
2012
- * Generates an OpenCollection (https://spec.opencollection.com/) API collection
2013
- * from a set of operation roots. Produces opencollection.yml, an environment
2014
- * file, one .yml request file per operation, and the tracking manifest.
2015
- *
2016
- * This is the full-regeneration entry point — every file is rebuilt from scratch.
2017
- * For cache-aware incremental builds, use {@link generateOpenCollectionIncremental}.
2018
- *
2019
- * The manifest appears in the returned list (under {@link MANIFEST_FILENAME}) for
2020
- * convenience — single-shot callers can write the entire array as-is. The plugin's
2021
- * incremental path persists the manifest separately (under the CLI cache dir), so
2022
- * its `filesToWrite` does not include the manifest.
2023
- */
2024
- export function generateOpenCollection(roots: OpRootNode[], options: OpenCollectionOptions): OpenCollectionFile[] {
2025
- const result = generateOpenCollectionIncremental(roots, options, emptyManifest());
2026
- return [...result.filesToWrite, { relativePath: MANIFEST_FILENAME, content: serializeIncrementalManifest(result.manifest) }];
2027
- }
2028
- &nbsp;
2029
- /**
2030
- * Cache-aware variant of {@link generateOpenCollection}. Skips re-rendering YAML
2031
- * for any op whose fingerprint matches the entry in `prevManifest`. The caller is
2032
- * responsible for emitting `filesToWrite`, deleting `deletedPaths`, and persisting
2033
- * `manifest` so the next run can match against it.
2034
- *
2035
- * Global files (collection root, env files, folder.yml) are always regenerated —
2036
- * they're cheap and depend on options the manifest doesn't fingerprint.
2037
- */
2038
- export function generateOpenCollectionIncremental(
2039
- roots: OpRootNode[],
2040
- options: OpenCollectionOptions,
2041
- prevManifest: IncrementalManifest,
2042
- fileExists: (relativePath: string) =&gt; boolean = () =&gt; true,
2043
- ): IncrementalResult {
2044
- const modelMap = buildModelMap(options.contractRoots ?? []);
2045
- const authOpts = options.auth;
2046
- const defaultScheme = authOpts?.defaultScheme ? authOpts.schemes?.[authOpts.defaultScheme] : undefined;
2047
- const randomExamples = options.randomExamples ?? false;
2048
- const includeInternal = options.includeInternal ?? true;
2049
- &nbsp;
2050
- // ── Global files (collection root + env files + folder.yml per area/subarea) ──
2051
- const globalFiles: OpenCollectionFile[] = [];
2052
- globalFiles.push({
2053
- relativePath: 'opencollection.yml',
2054
- content: generateCollectionRoot(options.collectionName, defaultScheme),
2055
- });
2056
- for (const envFile of generateEnvFiles(options.environments, defaultScheme)) {
2057
- globalFiles.push(envFile);
2058
- }
2059
- &nbsp;
2060
- const sortedRoots = [...roots].sort((a, b) =&gt; {
2061
- const aArea = a.meta['area'] ?? deriveFolderName(a.file);
2062
- const bArea = b.meta['area'] ?? deriveFolderName(b.file);
2063
- const cmp = aArea.localeCompare(bArea);
2064
- if (cmp !== 0) return cmp;
2065
- return (a.meta['subarea'] ?? <span class="branch-1 cbranch-no" title="branch not covered" >''</span>).localeCompare(b.meta['subarea'] ?? '');
2066
- });
2067
- &nbsp;
2068
- const units: IncrementalUnit[] = [];
2069
- // Track which folder.yml paths we've already emitted so multiple roots sharing
2070
- // an area (the area's own root + its subarea roots) don't each push the
2071
- // area-level folder.yml — that produced N near-duplicate emits per area, only
2072
- // the last of which survived on disk.
2073
- const emittedFolders = new Set&lt;string&gt;();
2074
- let areaSeq = 0;
2075
- for (const root of sortedRoots) {
2076
- const folder = root.meta['area'] ? slugifyName(root.meta['area']) : deriveFolderName(root.file);
2077
- const folderRel = `${folder}/folder.yml`;
2078
- if (!emittedFolders.has(folderRel)) {
2079
- const displayName = (root.meta['area'] ?? folder).charAt(0).toUpperCase() + (root.meta['area'] ?? folder).slice(1);
2080
- areaSeq++;
2081
- globalFiles.push({ relativePath: folderRel, content: generateFolderFile(displayName, areaSeq) });
2082
- emittedFolders.add(folderRel);
2083
- }
2084
- &nbsp;
2085
- const subarea = root.meta['subarea'];
2086
- const subareaSlug = subarea ? slugifyName(subarea) : undefined;
2087
- const requestDir = subareaSlug ? `${folder}/${subareaSlug}` : folder;
2088
- &nbsp;
2089
- if (subareaSlug) {
2090
- const subareaRel = `${requestDir}/folder.yml`;
2091
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!emittedFolders.has(subareaRel)) {
2092
- const subareaDisplayName = subarea!.charAt(0).toUpperCase() + subarea!.slice(1);
2093
- globalFiles.push({ relativePath: subareaRel, content: generateFolderFile(subareaDisplayName, 1) });
2094
- emittedFolders.add(subareaRel);
2095
- }
2096
- }
2097
- &nbsp;
2098
- for (const entry of buildOpEntries(root, requestDir, includeInternal)) {
2099
- units.push({
2100
- key: entry.opKey,
2101
- fingerprint: computeOpFingerprint(entry, modelMap, defaultScheme, randomExamples),
2102
- render: () =&gt; [renderOpFile(entry, modelMap, defaultScheme, randomExamples)],
2103
- });
2104
- }
2105
- }
2106
- &nbsp;
2107
- const result = runIncrementalCodegen({
2108
- codegenVersion: BRUNO_CODEGEN_VERSION,
2109
- prevManifest,
2110
- globalFiles,
2111
- units,
2112
- fileExists,
2113
- });
2114
- &nbsp;
2115
- return {
2116
- filesToWrite: result.filesToWrite,
2117
- manifest: result.manifest,
2118
- deletedPaths: result.deletedPaths,
2119
- skippedOpCount: result.skippedUnitCount,
2120
- };
2121
- }
2122
- &nbsp;
2123
- /** Build the ordered, alphabetized op entries for a single root. seq numbers are assigned in alphabetical order so the Bruno UI shows requests sorted by display name. */
2124
- function buildOpEntries(root: OpRootNode, requestDir: string, includeInternal: boolean): OpEntry[] {
2125
- const requests: Array&lt;{ route: OpRouteNode; op: OpOperationNode; requestName: string }&gt; = [];
2126
- for (const route of root.routes) {
2127
- for (const op of route.operations) {
2128
- if (!includeInternal &amp;&amp; resolveModifiers(route, op).includes('internal')) continue;
2129
- requests.push({ route, op, requestName: op.name ?? route.path });
2130
- }
2131
- }
2132
- requests.sort((a, b) =&gt; a.requestName.localeCompare(b.requestName));
2133
- &nbsp;
2134
- const entries: OpEntry[] = [];
2135
- let seq = 1;
2136
- for (const { route, op, requestName } of requests) {
2137
- const fileName = op.name ? `${slugifyName(op.name)}.yml` : `${op.method}-${sanitizePath(route.path)}.yml`;
2138
- entries.push({
2139
- opKey: `${root.file}::${op.method.toUpperCase()} ${route.path}`,
2140
- relativePath: `${requestDir}/${fileName}`,
2141
- requestName,
2142
- seq,
2143
- route,
2144
- op,
2145
- root,
2146
- });
2147
- seq++;
2148
- }
2149
- return entries;
2150
- }
2151
- &nbsp;
2152
- /** Render a single op's request file (including any plugin-extension YAML override). */
2153
- function renderOpFile(
2154
- entry: OpEntry,
2155
- modelMap: Map&lt;string, ModelNode&gt;,
2156
- defaultScheme: BrunoSecurityScheme | undefined,
2157
- randomExamples: boolean,
2158
- ): OpenCollectionFile {
2159
- let content = generateRequestFile(entry.route, entry.op, entry.requestName, entry.seq, modelMap, entry.root, defaultScheme, randomExamples);
2160
- const brunoExt = entry.op.pluginExtensions?.['bruno'];
2161
- const pluginOverride = brunoExt &amp;&amp; typeof brunoExt === 'object' &amp;&amp; !Array.isArray(brunoExt) ? brunoExt['template'] : undefined;
2162
- if (typeof pluginOverride === 'string') {
2163
- content = mergePluginFile(content, pluginOverride);
2164
- }
2165
- return { relativePath: entry.relativePath, content };
2166
- }
2167
- &nbsp;
2168
- /** Compute a fingerprint covering every input that affects this op's rendered file. Stable across runs given identical inputs. */
2169
- function computeOpFingerprint(
2170
- entry: OpEntry,
2171
- modelMap: Map&lt;string, ModelNode&gt;,
2172
- defaultScheme: BrunoSecurityScheme | undefined,
2173
- randomExamples: boolean,
2174
- ): string {
2175
- const referencedModels = collectTransitiveModelRefs(collectOpTypeNodes(entry.route, entry.op), modelMap);
2176
- const modelSnapshot: Record&lt;string, unknown&gt; = {};
2177
- for (const name of [...referencedModels].sort()) {
2178
- const m = modelMap.get(name);
2179
- if (m) modelSnapshot[name] = m;
2180
- }
2181
- // Only include the route fields this op actually depends on. We deliberately exclude
2182
- // `route.operations` so a change to a sibling op doesn't invalidate this op's cache.
2183
- const routeShape = {
2184
- path: entry.route.path,
2185
- params: entry.route.params ?? null,
2186
- modifiers: entry.route.modifiers ?? null,
2187
- security: entry.route.security ?? null,
2188
- description: entry.route.description ?? null,
2189
- };
2190
- return hashFingerprint({
2191
- v: BRUNO_CODEGEN_VERSION,
2192
- opKey: entry.opKey,
2193
- relativePath: entry.relativePath,
2194
- requestName: entry.requestName,
2195
- seq: entry.seq,
2196
- route: routeShape,
2197
- op: entry.op,
2198
- rootMeta: entry.root.meta,
2199
- rootFile: entry.root.file,
2200
- defaultScheme: defaultScheme ?? null,
2201
- randomExamples,
2202
- models: modelSnapshot,
2203
- });
2204
- }
2205
- &nbsp;
2206
- /** Collect every ContractTypeNode that contributes to this op's rendered output. Used as the seed set for transitive model collection in {@link computeOpFingerprint}. */
2207
- function collectOpTypeNodes(route: OpRouteNode, op: OpOperationNode): ContractTypeNode[] {
2208
- const out: ContractTypeNode[] = [];
2209
- pushFromParamSource(route.params, out);
2210
- pushFromParamSource(op.query, out);
2211
- pushFromParamSource(op.headers, out);
2212
- if (op.request) {
2213
- for (const body of op.request.bodies) out.push(body.bodyType);
2214
- }
2215
- for (const resp of op.responses) {
2216
- if (resp.bodyType) out.push(resp.bodyType);
2217
- if (resp.headers) {
2218
- for (const h of resp.headers) out.push(h.type);
2219
- }
2220
- }
2221
- return out;
2222
- }
2223
- &nbsp;
2224
- function pushFromParamSource(src: ParamSource | undefined, out: ContractTypeNode[]): void {
2225
- if (!src) return;
2226
- if (src.kind === 'params') {
2227
- for (const n of src.nodes) out.push(n.type);
2228
- } else if (src.kind === 'ref') {
2229
- out.push({ kind: 'ref', name: src.name } as ContractTypeNode);
2230
- } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (src.kind === 'type') {</span>
2231
- <span class="cstat-no" title="statement not covered" > out.push(src.node);</span>
2232
- }
2233
- }
2234
- &nbsp;
2235
- /** Empty-state manifest, used when none has been written yet (or when the cache is being bypassed). */
2236
- export function emptyManifest(): IncrementalManifest {
2237
- return emptyIncrementalManifest(BRUNO_CODEGEN_VERSION);
2238
- }
2239
- &nbsp;
2240
- /**
2241
- * Parse a previously-written manifest. Accepts both v1 (`{ files: string[] }`) and v2
2242
- * (full {@link IncrementalManifest}) shapes. v1 manifests are returned with an empty
2243
- * `units` map so the next run treats every op as a cache miss while still cleaning up
2244
- * the tracked file list.
2245
- *
2246
- * Returns an empty manifest on any parse error so a stale/garbled file never blocks
2247
- * regeneration.
2248
- */
2249
- export function parseManifest(content: string): IncrementalManifest {
2250
- const parsed = parseIncrementalManifest(content);
2251
- // The shared parser handles v2. If v2 parsing produced an empty manifest, fall
2252
- // through to a v1 shape ({ files: [...] }) and migrate it for cleanup purposes.
2253
- if (parsed.files.length &gt; 0 || Object.keys(parsed.units).length &gt; 0) return parsed;
2254
- try {
2255
- const raw = JSON.parse(content);
2256
- if (Array.isArray(raw?.files) &amp;&amp; raw.files.every((f: unknown) =&gt; typeof f === 'string')) {
2257
- return {
2258
- version: INCREMENTAL_MANIFEST_VERSION,
2259
- codegenVersion: '',
2260
- files: raw.files as string[],
2261
- units: {},
2262
- };
2263
- }
2264
- } catch {
2265
- // fall through
2266
- }
2267
- return emptyManifest();
2268
- }
2269
- &nbsp;
2270
- // ─── Plugin file merge ─────────────────────────────────────────────────────
2271
- &nbsp;
2272
- function deepMerge(base: unknown, override: unknown): unknown {
2273
- if (
2274
- override !== null &amp;&amp;
2275
- typeof override === 'object' &amp;&amp;
2276
- !Array.isArray(override) &amp;&amp;
2277
- base !== null &amp;&amp;
2278
- typeof base === 'object' &amp;&amp;
2279
- !Array.isArray(base)
2280
- ) {
2281
- const result: Record&lt;string, unknown&gt; = { ...(base as Record&lt;string, unknown&gt;) };
2282
- for (const [key, val] of Object.entries(override as Record&lt;string, unknown&gt;)) {
2283
- result[key] = deepMerge(result[key], val);
2284
- }
2285
- return result;
2286
- }
2287
- return override;
2288
- }
2289
- &nbsp;
2290
- /**
2291
- * Deep-merges a YAML override string into a generated YAML string.
2292
- *
2293
- * Objects are merged recursively; arrays and scalars in the override replace the
2294
- * generated value entirely. If `pluginFileContent` is not a YAML mapping (e.g. it
2295
- * is a scalar or a list), the generated content is returned unchanged.
2296
- *
2297
- * @param generatedYaml - The YAML string produced by the Bruno codegen.
2298
- * @param pluginFileContent - The YAML override string to merge in.
2299
- * @returns The merged YAML string, or `generatedYaml` if the override is not a mapping.
2300
- */
2301
- export function mergePluginFile(generatedYaml: string, pluginFileContent: string): string {
2302
- const overrideParsed = parseYaml(pluginFileContent);
2303
- if (overrideParsed === null || typeof overrideParsed !== 'object' || Array.isArray(overrideParsed)) {
2304
- return generatedYaml;
2305
- }
2306
- const merged = deepMerge(parseYaml(generatedYaml), overrideParsed);
2307
- return stringifyYaml(merged, { lineWidth: 0 });
2308
- }
2309
- &nbsp;
2310
- // ─── File generators ───────────────────────────────────────────────────────
2311
- &nbsp;
2312
- function generateCollectionRoot(name: string, scheme?: BrunoSecurityScheme): string {
2313
- const lines = [`opencollection: "1.0.0"`, `info:`, ` name: ${yamlString(name)}`];
2314
- if (scheme) {
2315
- lines.push(``);
2316
- lines.push(`request:`);
2317
- lines.push(...renderAuthBlock(scheme, ' '));
2318
- }
2319
- lines.push(``);
2320
- return lines.join('\n');
2321
- }
2322
- &nbsp;
2323
- function generateEnvFiles(
2324
- environments: Record&lt;string, Record&lt;string, unknown&gt;&gt; | undefined,
2325
- scheme: BrunoSecurityScheme | undefined,
2326
- ): OpenCollectionFile[] {
2327
- if (environments &amp;&amp; Object.keys(environments).length &gt; 0) {
2328
- return Object.entries(environments).map(([name, variables]) =&gt; ({
2329
- relativePath: `environments/${name}.yml`,
2330
- content: renderEnvFile(displayNameFor(name), variables),
2331
- }));
2332
- }
2333
- const defaultVars: Record&lt;string, string&gt; = { baseUrl: 'http://localhost:3000' };
2334
- if (scheme) {
2335
- for (const varName of authEnvVarNames(scheme)) defaultVars[varName] = '';
2336
- }
2337
- return [{ relativePath: 'environments/local.yml', content: renderEnvFile('Local', defaultVars) }];
2338
- }
2339
- &nbsp;
2340
- function renderEnvFile(name: string, variables: Record&lt;string, unknown&gt;): string {
2341
- const lines = [`name: ${name}`, `variables:`];
2342
- for (const [key, value] of Object.entries(variables)) {
2343
- const escaped = String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
2344
- lines.push(` - name: ${key}`);
2345
- lines.push(` value: "${escaped}"`);
2346
- }
2347
- lines.push(``);
2348
- return lines.join('\n');
2349
- }
2350
- &nbsp;
2351
- function displayNameFor(envKey: string): string {
2352
- return envKey.charAt(0).toUpperCase() + envKey.slice(1);
2353
- }
2354
- &nbsp;
2355
- function generateFolderFile(name: string, seq: number): string {
2356
- return [`info:`, ` name: ${yamlString(name)}`, ` type: folder`, ` seq: ${seq}`, ``].join('\n');
2357
- }
2358
- &nbsp;
2359
- function generateRequestFile(
2360
- route: OpRouteNode,
2361
- op: OpOperationNode,
2362
- name: string,
2363
- seq: number,
2364
- modelMap: Map&lt;string, ModelNode&gt;,
2365
- root?: OpRootNode,
2366
- defaultScheme?: BrunoSecurityScheme,
2367
- randomExamples = false,
2368
- ): string {
2369
- const lines: string[] = [];
2370
- &nbsp;
2371
- lines.push(`info:`);
2372
- lines.push(` name: ${yamlString(name)}`);
2373
- lines.push(` type: http`);
2374
- lines.push(` seq: ${seq}`);
2375
- lines.push(``);
2376
- lines.push(`http:`);
2377
- lines.push(` method: ${op.method.toUpperCase()}`);
2378
- lines.push(` url: ${yamlString(`{{baseUrl}}${openCollectionPath(route.path)}`)}`);
2379
- &nbsp;
2380
- // Params — flat array with type: "path" | "query". Optional query params are
2381
- // emitted with disabled: true so users opt in before sending.
2382
- const pathParams: Array&lt;ParamEntry &amp; { kind: 'path' | 'query' }&gt; = extractPathParamNames(route.path).map(n =&gt; ({
2383
- name: n,
2384
- type: findParamType(route.params, n, modelMap),
2385
- optional: false,
2386
- kind: 'path' as const,
2387
- }));
2388
- const queryParams: Array&lt;ParamEntry &amp; { kind: 'path' | 'query' }&gt; = op.query
2389
- ? expandParamSource(op.query, modelMap).map(e =&gt; ({ ...e, kind: 'query' as const }))
2390
- : [];
2391
- const allParams = [...pathParams, ...queryParams];
2392
- &nbsp;
2393
- if (allParams.length &gt; 0) {
2394
- lines.push(` params:`);
2395
- for (const p of allParams) {
2396
- lines.push(` - name: ${p.name}`);
2397
- lines.push(` value: ${paramExampleValue(p.type, p.default, randomExamples)}`);
2398
- lines.push(` type: ${p.kind}`);
2399
- if (p.optional &amp;&amp; p.kind === 'query') lines.push(` disabled: true`);
2400
- }
2401
- }
2402
- &nbsp;
2403
- // Headers
2404
- if (op.headers) {
2405
- const headerEntries = expandParamSource(op.headers, modelMap);
2406
- <span class="missing-if-branch" title="else path not taken" >E</span>if (headerEntries.length &gt; 0) {
2407
- lines.push(` headers:`);
2408
- for (const h of headerEntries) {
2409
- lines.push(` - name: ${h.name}`);
2410
- lines.push(` value: ${paramExampleValue(h.type, h.default, randomExamples)}`);
2411
- if (h.optional) lines.push(` disabled: true`);
2412
- }
2413
- }
2414
- }
2415
- &nbsp;
2416
- // Auth — inside http block; inherit collection default unless this op is explicitly public
2417
- if (defaultScheme) {
2418
- const security = root ? resolveSecurity(route, op, root) : (<span class="branch-1 cbranch-no" title="branch not covered" >op.security ?? route.security)</span>;
2419
- if (security === SECURITY_NONE) {
2420
- lines.push(` auth:`);
2421
- lines.push(` type: none`);
2422
- } else {
2423
- lines.push(` auth: inherit`);
2424
- }
2425
- }
2426
- &nbsp;
2427
- // Body — Bruno supports a single body per request, so prefer JSON, then form-urlencoded, then multipart.
2428
- if (op.request &amp;&amp; op.request.bodies.length &gt; 0) {
2429
- const preferredOrder: Array&lt;(typeof op.request.bodies)[number]['contentType']&gt; = [
2430
- 'application/json',
2431
- 'application/x-www-form-urlencoded',
2432
- 'multipart/form-data',
2433
- ];
2434
- const primary =
2435
- preferredOrder.map(ct =&gt; op.request!.bodies.find(b =&gt; b.contentType === ct)).find(b =&gt; b !== undefined) ?? <span class="branch-1 cbranch-no" title="branch not covered" >op.request.bodies[0]!</span>;
2436
- &nbsp;
2437
- lines.push(` body:`);
2438
- if (primary.contentType === 'multipart/form-data') {
2439
- lines.push(` type: multipart-form`);
2440
- lines.push(` data: []`);
2441
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (primary.contentType === 'application/x-www-form-urlencoded') {
2442
- <span class="cstat-no" title="statement not covered" > lines.push(` type: form-urlencoded`);</span>
2443
- <span class="cstat-no" title="statement not covered" > lines.push(` data: []`);</span>
2444
- } else {
2445
- const json = JSON.stringify(typeToExampleValue(primary.bodyType, modelMap, randomExamples), null, 2);
2446
- lines.push(` type: json`);
2447
- lines.push(` data: |`);
2448
- for (const jsonLine of json.split('\n')) {
2449
- lines.push(` ${jsonLine}`);
2450
- }
2451
- }
2452
- }
2453
- &nbsp;
2454
- // runtime.assertions — auto-generate a status-code check and presence checks for required response headers.
2455
- const expectedStatus = pickAssertionStatus(op.responses);
2456
- const assertedResponse = op.responses.find(r =&gt; r.statusCode === expectedStatus);
2457
- const requiredHeaders = (assertedResponse?.headers ?? []).filter(h =&gt; !h.optional);
2458
- if (expectedStatus !== undefined) {
2459
- lines.push(``);
2460
- lines.push(`runtime:`);
2461
- lines.push(` assertions:`);
2462
- lines.push(` - expression: res.status`);
2463
- lines.push(` operator: eq`);
2464
- // Always quote — the OpenCollection schema types `value` as a string,
2465
- // so we must keep "200" from being parsed as YAML number 200.
2466
- lines.push(` value: "${expectedStatus}"`);
2467
- for (const h of requiredHeaders) {
2468
- lines.push(` - expression: res.headers["${h.name.toLowerCase()}"]`);
2469
- lines.push(` operator: isDefined`);
2470
- lines.push(` value: ""`);
2471
- }
2472
- }
2473
- &nbsp;
2474
- // docs — combine route- and operation-level descriptions plus the declared response-header summary.
2475
- const docs = buildRequestDocs(route, op, assertedResponse);
2476
- if (docs) {
2477
- lines.push(``);
2478
- lines.push(`docs: |-`);
2479
- for (const docLine of docs.split('\n')) {
2480
- lines.push(` ${docLine}`);
2481
- }
2482
- }
2483
- &nbsp;
2484
- lines.push(``);
2485
- return lines.join('\n');
2486
- }
2487
- &nbsp;
2488
- /** Pick the response whose status code we'll assert against. Prefers the first declared 2xx; otherwise falls back to the first declared response. Returns undefined if no responses are declared. */
2489
- function pickAssertionStatus(responses: OpResponseNode[]): number | undefined {
2490
- const success = responses.find(r =&gt; r.statusCode &gt;= 200 &amp;&amp; r.statusCode &lt; 300);
2491
- return success?.statusCode ?? responses[0]?.statusCode;
2492
- }
2493
- &nbsp;
2494
- /** Build a markdown docs block from route- and operation-level descriptions, plus declared response-header summary. */
2495
- function buildRequestDocs(route: OpRouteNode, op: OpOperationNode, assertedResponse?: OpResponseNode): string | undefined {
2496
- const parts: string[] = [];
2497
- if (route.description) parts.push(route.description.trim());
2498
- if (op.description) parts.push(op.description.trim());
2499
- const headers = assertedResponse?.headers ?? [];
2500
- if (headers.length &gt; 0) {
2501
- const lines = ['**Response headers**', ''];
2502
- for (const h of headers) {
2503
- const tag = h.optional ? 'optional' : 'required';
2504
- const desc = h.description ? ` — ${h.description}` : '';
2505
- lines.push(`- \`${h.name}\` (${tag})${desc}`);
2506
- }
2507
- parts.push(lines.join('\n'));
2508
- }
2509
- return parts.length &gt; 0 ? parts.join('\n\n') : undefined;
2510
- }
2511
- &nbsp;
2512
- // ─── Auth helpers ──────────────────────────────────────────────────────────
2513
- &nbsp;
2514
- /** Generate the YAML lines for an auth block (flat, per spec), indented by `indent`. */
2515
- function renderAuthBlock(scheme: BrunoSecurityScheme, indent: string): string[] {
2516
- const i = indent;
2517
- if (scheme.type === 'http' &amp;&amp; scheme.scheme === 'bearer') {
2518
- return [`${i}auth:`, `${i} type: bearer`, `${i} token: "{{token}}"`];
2519
- }
2520
- if (scheme.type === 'http' &amp;&amp; scheme.scheme === 'basic') {
2521
- return [`${i}auth:`, `${i} type: basic`, `${i} username: "{{username}}"`, `${i} password: "{{password}}"`];
2522
- }
2523
- <span class="missing-if-branch" title="else path not taken" >E</span>if (scheme.type === 'apiKey' &amp;&amp; scheme.in === 'header') {
2524
- const headerName = scheme.name ?? <span class="branch-1 cbranch-no" title="branch not covered" >'X-Api-Key';</span>
2525
- return [`${i}auth:`, `${i} type: apikey`, `${i} key: ${headerName}`, `${i} value: "{{apiKey}}"`, `${i} placement: header`];
2526
- }
2527
- <span class="cstat-no" title="statement not covered" > return [];</span>
2528
- }
2529
- &nbsp;
2530
- /** Return the environment variable names needed for a given auth scheme. */
2531
- function authEnvVarNames(scheme: BrunoSecurityScheme): string[] {
2532
- if (scheme.type === 'http' &amp;&amp; scheme.scheme === 'bearer') return ['token'];
2533
- if (scheme.type === 'http' &amp;&amp; scheme.scheme === 'basic') return ['username', 'password'];
2534
- <span class="missing-if-branch" title="else path not taken" >E</span>if (scheme.type === 'apiKey') return ['apiKey'];
2535
- <span class="cstat-no" title="statement not covered" > return [];</span>
2536
- }
2537
- &nbsp;
2538
- // ─── Model registry ────────────────────────────────────────────────────────
2539
- &nbsp;
2540
- function buildModelMap(contractRoots: ContractRootNode[]): Map&lt;string, ModelNode&gt; {
2541
- const map = new Map&lt;string, ModelNode&gt;();
2542
- for (const root of contractRoots) {
2543
- for (const model of root.models) {
2544
- map.set(model.name, model);
2545
- }
2546
- }
2547
- return map;
2548
- }
2549
- &nbsp;
2550
- /** Resolve all fields for a model, including inherited base fields (bases first, in declaration order). */
2551
- function resolveModelFields(model: ModelNode, modelMap: Map&lt;string, ModelNode&gt;): FieldNode[] {
2552
- const collected: FieldNode[] = [];
2553
- if (model.bases) {
2554
- for (const base of model.bases) {
2555
- const baseModel = modelMap.get(base);
2556
- <span class="missing-if-branch" title="else path not taken" >E</span>if (baseModel) collected.push(...resolveModelFields(baseModel, modelMap));
2557
- }
2558
- }
2559
- return [...collected, ...model.fields];
2560
- }
2561
- &nbsp;
2562
- // ─── Param helpers ─────────────────────────────────────────────────────────
2563
- &nbsp;
2564
- interface ParamEntry {
2565
- name: string;
2566
- type: ContractTypeNode | undefined;
2567
- default?: string | number | boolean;
2568
- optional: boolean;
2569
- }
2570
- &nbsp;
2571
- /** Expand a ParamSource into a flat list of named entries with their types. */
2572
- function expandParamSource(source: ParamSource, modelMap: Map&lt;string, ModelNode&gt;): ParamEntry[] {
2573
- if (source.kind === 'params') {
2574
- return source.nodes.map(n =&gt; ({ name: n.name, type: n.type, default: n.default, optional: n.optional }));
2575
- }
2576
- <span class="missing-if-branch" title="else path not taken" >E</span>if (source.kind === 'ref') {
2577
- const model = modelMap.get(source.name);
2578
- if (model) {
2579
- return resolveModelFields(model, modelMap)
2580
- .filter(f =&gt; f.visibility !== 'readonly')
2581
- .map(f =&gt; ({ name: f.name, type: f.type, default: f.default, optional: f.optional }));
2582
- }
2583
- // Fallback: single placeholder entry
2584
- const name = source.name.charAt(0).toLowerCase() + source.name.slice(1);
2585
- return [{ name, type: undefined, optional: false }];
2586
- }
2587
- // kind === 'type': if it's an inline object, expand its fields
2588
- <span class="cstat-no" title="statement not covered" > if (source.node.kind === 'inlineObject') {</span>
2589
- <span class="cstat-no" title="statement not covered" > return source.node.fields.map(<span class="fstat-no" title="function not covered" >f =&gt; (<span class="cstat-no" title="statement not covered" >{</span> name: f.name, type: f.type, default: f.default, optional: f.optional }));</span></span>
2590
- }
2591
- <span class="cstat-no" title="statement not covered" > return [];</span>
2592
- }
2593
- &nbsp;
2594
- /** Look up a named path param's type from route.params. */
2595
- function findParamType(source: ParamSource | undefined, name: string, modelMap: Map&lt;string, ModelNode&gt;): ContractTypeNode | undefined {
2596
- if (!source) return undefined;
2597
- <span class="missing-if-branch" title="else path not taken" >E</span>if (source.kind === 'params') return source.nodes.find(n =&gt; n.name === name)?.type;
2598
- <span class="cstat-no" title="statement not covered" > if (source.kind === 'ref') {</span>
2599
- const model = <span class="cstat-no" title="statement not covered" >modelMap.get(source.name);</span>
2600
- <span class="cstat-no" title="statement not covered" > if (model) <span class="cstat-no" title="statement not covered" >return resolveModelFields(model, modelMap).find(<span class="fstat-no" title="function not covered" >f =&gt; <span class="cstat-no" title="statement not covered" >f</span>.name === name)?.t</span>ype;</span></span>
2601
- }
2602
- <span class="cstat-no" title="statement not covered" > if (source.kind === 'type' &amp;&amp; source.node.kind === 'inlineObject') {</span>
2603
- <span class="cstat-no" title="statement not covered" > return source.node.fields.find(<span class="fstat-no" title="function not covered" >f =&gt; <span class="cstat-no" title="statement not covered" >f</span>.name === name)?.t</span>ype;</span>
2604
- }
2605
- <span class="cstat-no" title="statement not covered" > return undefined;</span>
2606
- }
2607
- &nbsp;
2608
- /** Return a YAML-quoted example value string for a param, preferring a default value when provided. */
2609
- function paramExampleValue(type: ContractTypeNode | undefined, defaultValue?: string | number | boolean, randomExamples = false): string {
2610
- <span class="missing-if-branch" title="if path not taken" >I</span>if (defaultValue !== undefined) <span class="cstat-no" title="statement not covered" >return `"${defaultValue}"`;</span>
2611
- if (!type) return '""';
2612
- if (type.kind === 'enum') return type.values.length &gt; 0 ? `"${type.values[0]}"` : <span class="branch-1 cbranch-no" title="branch not covered" >'""';</span>
2613
- <span class="missing-if-branch" title="if path not taken" >I</span>if (type.kind === 'literal') <span class="cstat-no" title="statement not covered" >return `"${type.value}"`;</span>
2614
- <span class="missing-if-branch" title="if path not taken" >I</span>if (type.kind !== 'scalar') <span class="cstat-no" title="statement not covered" >return '""';</span>
2615
- if (randomExamples) {
2616
- const random = randomScalarTemplate(type.name);
2617
- <span class="missing-if-branch" title="else path not taken" >E</span>if (random !== undefined) return `"${random}"`;
2618
- }
2619
- switch (type.name) {
2620
- case 'uuid':
2621
- return '"00000000-0000-0000-0000-000000000000"';
2622
- case 'email':
2623
- return '"user@example.com"';
2624
- <span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
2625
- <span class="cstat-no" title="statement not covered" > return '"https://example.com"';</span>
2626
- <span class="branch-3 cbranch-no" title="branch not covered" > case 'number':</span>
2627
- case 'int':
2628
- case 'bigint':
2629
- return '"0"';
2630
- <span class="branch-6 cbranch-no" title="branch not covered" > case 'boolean':</span>
2631
- <span class="cstat-no" title="statement not covered" > return '"true"';</span>
2632
- case 'date':
2633
- return '"2024-01-01"';
2634
- <span class="branch-8 cbranch-no" title="branch not covered" > case 'time':</span>
2635
- <span class="cstat-no" title="statement not covered" > return '"00:00:00"';</span>
2636
- <span class="branch-9 cbranch-no" title="branch not covered" > case 'datetime':</span>
2637
- <span class="cstat-no" title="statement not covered" > return '"2024-01-01T00:00:00Z"';</span>
2638
- case 'duration':
2639
- return '"PT1H"';
2640
- default:
2641
- return '""';
2642
- }
2643
- }
2644
- &nbsp;
2645
- /** Bruno faker template for a scalar type, or undefined when no clean equivalent exists (date, time, duration, raw string). */
2646
- function randomScalarTemplate(name: string): string | undefined {
2647
- switch (name) {
2648
- case 'uuid':
2649
- return '{{$randomUUID}}';
2650
- case 'email':
2651
- return '{{$randomEmail}}';
2652
- <span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
2653
- <span class="cstat-no" title="statement not covered" > return '{{$randomUrl}}';</span>
2654
- <span class="branch-3 cbranch-no" title="branch not covered" > case 'number':</span>
2655
- case 'int':
2656
- case 'bigint':
2657
- return '{{$randomInt}}';
2658
- case 'boolean':
2659
- return '{{$randomBoolean}}';
2660
- case 'datetime':
2661
- return '{{$isoTimestamp}}';
2662
- <span class="branch-8 cbranch-no" title="branch not covered" > default:</span>
2663
- <span class="cstat-no" title="statement not covered" > return undefined;</span>
2664
- }
2665
- }
2666
- &nbsp;
2667
- // ─── Body helpers ──────────────────────────────────────────────────────────
2668
- &nbsp;
2669
- /**
2670
- * Recursively build an example JSON value from a ContractTypeNode.
2671
- *
2672
- * When `randomExamples` is true we substitute Bruno faker templates only for
2673
- * scalars whose JSON representation is a string (uuid/email/url/datetime).
2674
- * Numbers and booleans stay deterministic — embedding `{{$randomInt}}` as a
2675
- * bare JSON number would require sentinel-stripping the surrounding quotes,
2676
- * and the body skeleton is meant as a starting point users edit anyway.
2677
- */
2678
- function typeToExampleValue(type: ContractTypeNode, modelMap: Map&lt;string, ModelNode&gt;, randomExamples = false): unknown {
2679
- switch (type.kind) {
2680
- case 'scalar':
2681
- switch (type.name) {
2682
- case 'string':
2683
- return '';
2684
- case 'email':
2685
- return randomExamples ? '{{$randomEmail}}' : 'user@example.com';
2686
- <span class="branch-2 cbranch-no" title="branch not covered" > case 'url':</span>
2687
- <span class="cstat-no" title="statement not covered" > return randomExamples ? '{{$randomUrl}}' : 'https://example.com';</span>
2688
- case 'uuid':
2689
- return randomExamples ? '{{$randomUUID}}' : <span class="branch-1 cbranch-no" title="branch not covered" >'00000000-0000-0000-0000-000000000000';</span>
2690
- <span class="branch-4 cbranch-no" title="branch not covered" > case 'number':</span>
2691
- case 'int':
2692
- case 'bigint':
2693
- return 0;
2694
- case 'boolean':
2695
- return true;
2696
- <span class="branch-8 cbranch-no" title="branch not covered" > case 'date':</span>
2697
- <span class="cstat-no" title="statement not covered" > return '2024-01-01';</span>
2698
- <span class="branch-9 cbranch-no" title="branch not covered" > case 'time':</span>
2699
- <span class="cstat-no" title="statement not covered" > return '00:00:00';</span>
2700
- case 'datetime':
2701
- return randomExamples ? '{{$isoTimestamp}}' : <span class="branch-1 cbranch-no" title="branch not covered" >'2024-01-01T00:00:00Z';</span>
2702
- case 'duration':
2703
- return 'PT1H';
2704
- <span class="branch-12 cbranch-no" title="branch not covered" > case 'null':</span>
2705
- <span class="cstat-no" title="statement not covered" > return null;</span>
2706
- <span class="branch-13 cbranch-no" title="branch not covered" > default:</span>
2707
- <span class="cstat-no" title="statement not covered" > return null;</span>
2708
- }
2709
- case 'enum':
2710
- return type.values[0] ?? <span class="branch-1 cbranch-no" title="branch not covered" >'';</span>
2711
- <span class="branch-2 cbranch-no" title="branch not covered" > case 'literal':</span>
2712
- <span class="cstat-no" title="statement not covered" > return type.value;</span>
2713
- case 'array':
2714
- return [typeToExampleValue(type.item, modelMap, randomExamples)];
2715
- <span class="branch-4 cbranch-no" title="branch not covered" > case 'tuple':</span>
2716
- <span class="cstat-no" title="statement not covered" > return type.items.map(<span class="fstat-no" title="function not covered" >t =&gt; <span class="cstat-no" title="statement not covered" >t</span>ypeToExampleValue(t, modelMap, randomExamples));</span></span>
2717
- <span class="branch-5 cbranch-no" title="branch not covered" > case 'record':</span>
2718
- <span class="cstat-no" title="statement not covered" > return {};</span>
2719
- <span class="branch-6 cbranch-no" title="branch not covered" > case 'union':</span>
2720
- <span class="cstat-no" title="statement not covered" > return type.members.length &gt; 0 ? typeToExampleValue(type.members[0]!, modelMap, randomExamples) : null;</span>
2721
- <span class="branch-7 cbranch-no" title="branch not covered" > case 'discriminatedUnion':</span>
2722
- <span class="cstat-no" title="statement not covered" > return type.members.length &gt; 0 ? typeToExampleValue(type.members[0]!, modelMap, randomExamples) : null;</span>
2723
- <span class="branch-8 cbranch-no" title="branch not covered" > case 'intersection':</span>
2724
- <span class="cstat-no" title="statement not covered" > return {};</span>
2725
- case 'ref': {
2726
- const model = modelMap.get(type.name);
2727
- if (!model) return {};
2728
- // Type alias — recurse into the aliased type
2729
- <span class="missing-if-branch" title="if path not taken" >I</span>if (model.type) <span class="cstat-no" title="statement not covered" >return typeToExampleValue(model.type, modelMap, randomExamples);</span>
2730
- return modelToExampleObject(model, modelMap, randomExamples);
2731
- }
2732
- <span class="branch-10 cbranch-no" title="branch not covered" > case 'lazy':</span>
2733
- <span class="cstat-no" title="statement not covered" > return typeToExampleValue(type.inner, modelMap, randomExamples);</span>
2734
- case 'inlineObject':
2735
- return fieldsToExampleObject(type.fields, modelMap, randomExamples);
2736
- <span class="branch-12 cbranch-no" title="branch not covered" > default:</span>
2737
- <span class="cstat-no" title="statement not covered" > return null;</span>
2738
- }
2739
- }
2740
- &nbsp;
2741
- /** Build an example object from a ModelNode's fields (including inherited base fields). */
2742
- function modelToExampleObject(model: ModelNode, modelMap: Map&lt;string, ModelNode&gt;, randomExamples = false): Record&lt;string, unknown&gt; {
2743
- return fieldsToExampleObject(resolveModelFields(model, modelMap), modelMap, randomExamples);
2744
- }
2745
- &nbsp;
2746
- /** Build an example object from a list of FieldNodes. Excludes readonly fields; uses defaults when available; omits optional fields that have no default so they don't appear in the JSON output. */
2747
- function fieldsToExampleObject(fields: FieldNode[], modelMap: Map&lt;string, ModelNode&gt;, randomExamples = false): Record&lt;string, unknown&gt; {
2748
- const obj: Record&lt;string, unknown&gt; = {};
2749
- for (const field of fields) {
2750
- if (field.visibility === 'readonly') continue;
2751
- if (field.default !== undefined) {
2752
- obj[field.name] = field.default;
2753
- } else if (!field.optional) {
2754
- obj[field.name] = typeToExampleValue(field.type, modelMap, randomExamples);
2755
- }
2756
- }
2757
- return obj;
2758
- }
2759
- &nbsp;
2760
- // ─── Path helpers ──────────────────────────────────────────────────────────
2761
- &nbsp;
2762
- /** Convert /users/{id}/posts → /users/:id/posts (Bruno path parameter syntax) */
2763
- function openCollectionPath(path: string): string {
2764
- return path.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, ':$1');
2765
- }
2766
- &nbsp;
2767
- /** Convert "Create an Offer" → create-an-offer (for .yml file names) */
2768
- export function slugifyName(name: string): string {
2769
- const result = name
2770
- .toLowerCase()
2771
- .replace(/[^a-z0-9]+/g, '-')
2772
- .replace(/^-|-$/g, '');
2773
- return result || <span class="branch-1 cbranch-no" title="branch not covered" >'request';</span>
2774
- }
2775
- &nbsp;
2776
- /** Convert /users/{id}/posts → users-id-posts (for .yml file names) */
2777
- export function sanitizePath(path: string): string {
2778
- const result = path
2779
- .replace(/^\//, '')
2780
- .replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, '$1')
2781
- .replace(/\//g, '-')
2782
- .replace(/[^a-zA-Z0-9-]/g, '')
2783
- .replace(/-+/g, '-')
2784
- .replace(/^-|-$/g, '');
2785
- return result || 'root';
2786
- }
2787
- &nbsp;
2788
- /** Extract param names from a URL template, e.g. /users/{id} → ['id'] */
2789
- function extractPathParamNames(path: string): string[] {
2790
- return [...path.matchAll(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g)].map(m =&gt; m[1]!);
2791
- }
2792
- &nbsp;
2793
- /** Derive folder name from op file path, e.g. src/users.op → users */
2794
- function deriveFolderName(file: string): string {
2795
- return basename(file).replace(/\.(op|ck)$/, '');
2796
- }
2797
- &nbsp;
2798
- /**
2799
- * Wrap a string in YAML double quotes if it contains characters that require quoting
2800
- * (flow indicators, colons, braces, etc.).
2801
- */
2802
- function yamlString(value: string): string {
2803
- if (/[:{}[\],&amp;*#?|&lt;&gt;=!%@`"']/.test(value) || /^\s|\s$/.test(value)) {
2804
- return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
2805
- }
2806
- return value;
2807
- }
2808
- &nbsp;</pre></td></tr></table></pre>
2809
-
2810
- <div class='push'></div><!-- for sticky footer -->
2811
- </div><!-- /wrapper -->
2812
- <div class='footer quiet pad2 space-top1 center small'>
2813
- Code coverage generated by
2814
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2815
- at 2026-06-16T15:55:44.321Z
2816
- </div>
2817
- <script src="../prettify.js"></script>
2818
- <script>
2819
- window.onload = function () {
2820
- prettyPrint();
2821
- };
2822
- </script>
2823
- <script src="../sorter.js"></script>
2824
- <script src="../block-navigation.js"></script>
2825
- </body>
2826
- </html>
2827
-