fullstx 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/bin/create.js +68 -0
- package/bin/generate.js +78 -0
- package/coverage/clover.xml +1356 -0
- package/coverage/coverage-final.json +30 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/fullstx/index.html +146 -0
- package/coverage/lcov-report/fullstx/index.js.html +379 -0
- package/coverage/lcov-report/fullstx/lib/application.js.html +1840 -0
- package/coverage/lcov-report/fullstx/lib/browser-sync.js.html +199 -0
- package/coverage/lcov-report/fullstx/lib/database.js.html +535 -0
- package/coverage/lcov-report/fullstx/lib/errors.js.html +154 -0
- package/coverage/lcov-report/fullstx/lib/features/hooks.js.html +151 -0
- package/coverage/lcov-report/fullstx/lib/features/index.html +176 -0
- package/coverage/lcov-report/fullstx/lib/features/jwt.js.html +214 -0
- package/coverage/lcov-report/fullstx/lib/features/plugins.js.html +172 -0
- package/coverage/lcov-report/fullstx/lib/features/routing.js.html +211 -0
- package/coverage/lcov-report/fullstx/lib/features/utils.js.html +1216 -0
- package/coverage/lcov-report/fullstx/lib/index.html +236 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/apiKey.js.html +127 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/authorize.js.html +115 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/basicAuth.js.html +148 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/csp.js.html +124 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/csrf.js.html +178 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/htmx.js.html +157 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/i18n.js.html +175 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/index.html +281 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/rateLimit.js.html +169 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/redisCache.js.html +154 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/requirePermission.js.html +118 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/routeLocalization.js.html +118 -0
- package/coverage/lcov-report/fullstx/lib/middlewares/session.js.html +133 -0
- package/coverage/lcov-report/fullstx/lib/middlewares.js.html +340 -0
- package/coverage/lcov-report/fullstx/lib/radix-router.js.html +418 -0
- package/coverage/lcov-report/fullstx/lib/request.js.html +328 -0
- package/coverage/lcov-report/fullstx/lib/response.js.html +610 -0
- package/coverage/lcov-report/fullstx/lib/websocket.js.html +166 -0
- package/coverage/lcov-report/fullstx/router.js.html +226 -0
- package/coverage/lcov-report/fullstx/server.js.html +664 -0
- package/coverage/lcov-report/index.html +161 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +2753 -0
- package/dist/index.js +238 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +238 -0
- package/dist/index.mjs.map +1 -0
- package/index.d.ts +115 -0
- package/index.js +98 -0
- package/lib/application.js +585 -0
- package/lib/browser-sync.js +38 -0
- package/lib/database.js +150 -0
- package/lib/errors.js +23 -0
- package/lib/features/hooks.js +22 -0
- package/lib/features/jwt.js +43 -0
- package/lib/features/plugins.js +29 -0
- package/lib/features/routing.js +42 -0
- package/lib/features/utils.js +377 -0
- package/lib/middlewares/apiKey.js +14 -0
- package/lib/middlewares/authorize.js +10 -0
- package/lib/middlewares/basicAuth.js +21 -0
- package/lib/middlewares/csp.js +13 -0
- package/lib/middlewares/csrf.js +31 -0
- package/lib/middlewares/htmx.js +24 -0
- package/lib/middlewares/i18n.js +30 -0
- package/lib/middlewares/rateLimit.js +28 -0
- package/lib/middlewares/redisCache.js +23 -0
- package/lib/middlewares/requirePermission.js +11 -0
- package/lib/middlewares/routeLocalization.js +11 -0
- package/lib/middlewares/session.js +16 -0
- package/lib/middlewares.js +85 -0
- package/lib/radix-router.js +111 -0
- package/lib/request.js +81 -0
- package/lib/response.js +175 -0
- package/lib/websocket.js +27 -0
- package/package.json +61 -0
- package/router.js +47 -0
- package/server.js +193 -0
- package/session.js +109 -0
|
@@ -0,0 +1,1840 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for fullstx/lib/application.js</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">fullstx/lib</a> application.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">16.3% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>53/325</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">3.55% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>6/169</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">6.77% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>4/59</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">17.11% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>51/298</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 low'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">3x</span>
|
|
652
|
+
<span class="cline-any cline-yes">3x</span>
|
|
653
|
+
<span class="cline-any cline-yes">3x</span>
|
|
654
|
+
<span class="cline-any cline-yes">3x</span>
|
|
655
|
+
<span class="cline-any cline-yes">3x</span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-yes">3x</span>
|
|
660
|
+
<span class="cline-any cline-yes">3x</span>
|
|
661
|
+
<span class="cline-any cline-yes">3x</span>
|
|
662
|
+
<span class="cline-any cline-yes">3x</span>
|
|
663
|
+
<span class="cline-any cline-yes">3x</span>
|
|
664
|
+
<span class="cline-any cline-yes">3x</span>
|
|
665
|
+
<span class="cline-any cline-yes">3x</span>
|
|
666
|
+
<span class="cline-any cline-yes">3x</span>
|
|
667
|
+
<span class="cline-any cline-yes">3x</span>
|
|
668
|
+
<span class="cline-any cline-yes">3x</span>
|
|
669
|
+
<span class="cline-any cline-yes">3x</span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-yes">3x</span>
|
|
672
|
+
<span class="cline-any cline-yes">3x</span>
|
|
673
|
+
<span class="cline-any cline-yes">3x</span>
|
|
674
|
+
<span class="cline-any cline-yes">3x</span>
|
|
675
|
+
<span class="cline-any cline-yes">3x</span>
|
|
676
|
+
<span class="cline-any cline-yes">3x</span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-yes">3x</span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-yes">3x</span>
|
|
681
|
+
<span class="cline-any cline-yes">3x</span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-yes">3x</span>
|
|
689
|
+
<span class="cline-any cline-yes">3x</span>
|
|
690
|
+
<span class="cline-any cline-yes">3x</span>
|
|
691
|
+
<span class="cline-any cline-yes">3x</span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-yes">3x</span>
|
|
694
|
+
<span class="cline-any cline-yes">3x</span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-no"> </span>
|
|
704
|
+
<span class="cline-any cline-no"> </span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
710
|
+
<span class="cline-any cline-no"> </span>
|
|
711
|
+
<span class="cline-any cline-no"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-no"> </span>
|
|
714
|
+
<span class="cline-any cline-no"> </span>
|
|
715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
721
|
+
<span class="cline-any cline-no"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-no"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-no"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-no"> </span>
|
|
733
|
+
<span class="cline-any cline-no"> </span>
|
|
734
|
+
<span class="cline-any cline-no"> </span>
|
|
735
|
+
<span class="cline-any cline-no"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-no"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-no"> </span>
|
|
751
|
+
<span class="cline-any cline-no"> </span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-no"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-no"> </span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-no"> </span>
|
|
767
|
+
<span class="cline-any cline-no"> </span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-no"> </span>
|
|
770
|
+
<span class="cline-any cline-no"> </span>
|
|
771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-no"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-neutral"> </span>
|
|
780
|
+
<span class="cline-any cline-neutral"> </span>
|
|
781
|
+
<span class="cline-any cline-neutral"> </span>
|
|
782
|
+
<span class="cline-any cline-no"> </span>
|
|
783
|
+
<span class="cline-any cline-no"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-no"> </span>
|
|
786
|
+
<span class="cline-any cline-no"> </span>
|
|
787
|
+
<span class="cline-any cline-no"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-no"> </span>
|
|
794
|
+
<span class="cline-any cline-neutral"> </span>
|
|
795
|
+
<span class="cline-any cline-neutral"> </span>
|
|
796
|
+
<span class="cline-any cline-no"> </span>
|
|
797
|
+
<span class="cline-any cline-no"> </span>
|
|
798
|
+
<span class="cline-any cline-no"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-no"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-neutral"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-no"> </span>
|
|
812
|
+
<span class="cline-any cline-no"> </span>
|
|
813
|
+
<span class="cline-any cline-no"> </span>
|
|
814
|
+
<span class="cline-any cline-no"> </span>
|
|
815
|
+
<span class="cline-any cline-neutral"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-no"> </span>
|
|
822
|
+
<span class="cline-any cline-no"> </span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-no"> </span>
|
|
825
|
+
<span class="cline-any cline-no"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-neutral"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-no"> </span>
|
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-no"> </span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-no"> </span>
|
|
835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-neutral"> </span>
|
|
837
|
+
<span class="cline-any cline-neutral"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-no"> </span>
|
|
840
|
+
<span class="cline-any cline-no"> </span>
|
|
841
|
+
<span class="cline-any cline-no"> </span>
|
|
842
|
+
<span class="cline-any cline-no"> </span>
|
|
843
|
+
<span class="cline-any cline-no"> </span>
|
|
844
|
+
<span class="cline-any cline-no"> </span>
|
|
845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
846
|
+
<span class="cline-any cline-neutral"> </span>
|
|
847
|
+
<span class="cline-any cline-neutral"> </span>
|
|
848
|
+
<span class="cline-any cline-neutral"> </span>
|
|
849
|
+
<span class="cline-any cline-no"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-neutral"> </span>
|
|
852
|
+
<span class="cline-any cline-no"> </span>
|
|
853
|
+
<span class="cline-any cline-no"> </span>
|
|
854
|
+
<span class="cline-any cline-neutral"> </span>
|
|
855
|
+
<span class="cline-any cline-no"> </span>
|
|
856
|
+
<span class="cline-any cline-no"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-neutral"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-no"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-no"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-neutral"> </span>
|
|
870
|
+
<span class="cline-any cline-no"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-neutral"> </span>
|
|
874
|
+
<span class="cline-any cline-neutral"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-no"> </span>
|
|
877
|
+
<span class="cline-any cline-no"> </span>
|
|
878
|
+
<span class="cline-any cline-no"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-no"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-neutral"> </span>
|
|
884
|
+
<span class="cline-any cline-neutral"> </span>
|
|
885
|
+
<span class="cline-any cline-neutral"> </span>
|
|
886
|
+
<span class="cline-any cline-neutral"> </span>
|
|
887
|
+
<span class="cline-any cline-neutral"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-neutral"> </span>
|
|
895
|
+
<span class="cline-any cline-neutral"> </span>
|
|
896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
897
|
+
<span class="cline-any cline-neutral"> </span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-no"> </span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-no"> </span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-neutral"> </span>
|
|
913
|
+
<span class="cline-any cline-neutral"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-no"> </span>
|
|
919
|
+
<span class="cline-any cline-no"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-no"> </span>
|
|
923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
925
|
+
<span class="cline-any cline-no"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-no"> </span>
|
|
928
|
+
<span class="cline-any cline-no"> </span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-no"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-no"> </span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-neutral"> </span>
|
|
939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
940
|
+
<span class="cline-any cline-no"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-neutral"> </span>
|
|
950
|
+
<span class="cline-any cline-no"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-neutral"> </span>
|
|
953
|
+
<span class="cline-any cline-no"> </span>
|
|
954
|
+
<span class="cline-any cline-no"> </span>
|
|
955
|
+
<span class="cline-any cline-no"> </span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
959
|
+
<span class="cline-any cline-neutral"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-no"> </span>
|
|
963
|
+
<span class="cline-any cline-no"> </span>
|
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-no"> </span>
|
|
967
|
+
<span class="cline-any cline-no"> </span>
|
|
968
|
+
<span class="cline-any cline-neutral"> </span>
|
|
969
|
+
<span class="cline-any cline-neutral"> </span>
|
|
970
|
+
<span class="cline-any cline-no"> </span>
|
|
971
|
+
<span class="cline-any cline-no"> </span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-neutral"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
989
|
+
<span class="cline-any cline-neutral"> </span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-neutral"> </span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-neutral"> </span>
|
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-neutral"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-neutral"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1008
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-no"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1054
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1072
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1140
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1141
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1142
|
+
<span class="cline-any cline-yes">12x</span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </span>
|
|
1169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1171
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1172
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1173
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1175
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1176
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1183
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1186
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1188
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1193
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </span>
|
|
1202
|
+
<span class="cline-any cline-no"> </span>
|
|
1203
|
+
<span class="cline-any cline-no"> </span>
|
|
1204
|
+
<span class="cline-any cline-no"> </span>
|
|
1205
|
+
<span class="cline-any cline-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-no"> </span>
|
|
1215
|
+
<span class="cline-any cline-no"> </span>
|
|
1216
|
+
<span class="cline-any cline-no"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1220
|
+
<span class="cline-any cline-no"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1227
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-yes">3x</span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const EventEmitter = require('events');
|
|
1237
|
+
const setupRouting = require('./features/routing');
|
|
1238
|
+
const setupHooks = require('./features/hooks');
|
|
1239
|
+
const setupJwt = require('./features/jwt');
|
|
1240
|
+
const setupPlugins = require('./features/plugins');
|
|
1241
|
+
|
|
1242
|
+
class FullstxApplication extends EventEmitter {
|
|
1243
|
+
constructor(opts, router, db, wsRedisPub, wsRedisSub, wss, Sentry, faker, sanitizeHtml, server) {
|
|
1244
|
+
super();
|
|
1245
|
+
this.opts = opts;
|
|
1246
|
+
this.router = router;
|
|
1247
|
+
this.db = db;
|
|
1248
|
+
this.wsRedisPub = wsRedisPub;
|
|
1249
|
+
this.wsRedisSub = wsRedisSub;
|
|
1250
|
+
this.wss = wss;
|
|
1251
|
+
this.sentry = Sentry;
|
|
1252
|
+
this.faker = faker;
|
|
1253
|
+
this.sanitizeHtml = sanitizeHtml;
|
|
1254
|
+
this.server = server;
|
|
1255
|
+
|
|
1256
|
+
this.get = router.get.bind(router);
|
|
1257
|
+
this.post = router.post.bind(router);
|
|
1258
|
+
this.put = router.put.bind(router);
|
|
1259
|
+
this.patch = router.patch.bind(router);
|
|
1260
|
+
this.delete = router.del.bind(router);
|
|
1261
|
+
this.use = router.use.bind(router);
|
|
1262
|
+
|
|
1263
|
+
this.zod = require('zod');
|
|
1264
|
+
|
|
1265
|
+
this.plugins = new Set();
|
|
1266
|
+
this.hooks = {
|
|
1267
|
+
onRequest: [],
|
|
1268
|
+
preValidation: [],
|
|
1269
|
+
preHandler: [],
|
|
1270
|
+
onResponse: []
|
|
1271
|
+
};
|
|
1272
|
+
|
|
1273
|
+
setupRouting(this, this.router);
|
|
1274
|
+
setupHooks(this);
|
|
1275
|
+
setupJwt(this, this.opts);
|
|
1276
|
+
setupPlugins(this);
|
|
1277
|
+
|
|
1278
|
+
const setupUtils = require('./features/utils');
|
|
1279
|
+
setupUtils(this);
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
<span class="fstat-no" title="function not covered" > ge</span>tServer() {
|
|
1283
|
+
<span class="cstat-no" title="statement not covered" > return this.server;</span>
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
<span class="fstat-no" title="function not covered" > db</span>PoolStats() {
|
|
1287
|
+
<span class="cstat-no" title="statement not covered" > if (!this.db) <span class="cstat-no" title="statement not covered" >return { error: 'Database is not configured' };</span></span>
|
|
1288
|
+
<span class="cstat-no" title="statement not covered" > if (this.opts.db && this.opts.db.type === 'postgres') {</span>
|
|
1289
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1290
|
+
totalCount: this.db.totalCount,
|
|
1291
|
+
idleCount: this.db.idleCount,
|
|
1292
|
+
waitingCount: this.db.waitingCount
|
|
1293
|
+
};
|
|
1294
|
+
}
|
|
1295
|
+
<span class="cstat-no" title="statement not covered" > if (this.opts.db && (this.opts.db.type === 'mysql' || this.opts.db.type === 'mariadb')) {</span>
|
|
1296
|
+
const pool = <span class="cstat-no" title="statement not covered" >this.db.pool || this.db;</span>
|
|
1297
|
+
const internalPool = <span class="cstat-no" title="statement not covered" >pool.pool || pool;</span>
|
|
1298
|
+
<span class="cstat-no" title="statement not covered" > if (internalPool && internalPool._allConnections) {</span>
|
|
1299
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1300
|
+
totalCount: internalPool._allConnections.length,
|
|
1301
|
+
idleCount: internalPool._freeConnections.length,
|
|
1302
|
+
waitingCount: internalPool._connectionQueue ? internalPool._connectionQueue.length : 0
|
|
1303
|
+
};
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
<span class="cstat-no" title="statement not covered" > return { message: 'Pool stats not supported for this database type' };</span>
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
<span class="fstat-no" title="function not covered" > sa</span>nitize(html, options) {
|
|
1310
|
+
<span class="cstat-no" title="statement not covered" > if (!this.sanitizeHtml) <span class="cstat-no" title="statement not covered" >throw new Error('Please install sanitize-html to use sanitize()');</span></span>
|
|
1311
|
+
<span class="cstat-no" title="statement not covered" > return this.sanitizeHtml(html, options);</span>
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
<span class="fstat-no" title="function not covered" > me</span>taTags(tags = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
1315
|
+
let html = <span class="cstat-no" title="statement not covered" >'';</span>
|
|
1316
|
+
<span class="cstat-no" title="statement not covered" > for (const [key, value] of Object.entries(tags)) {</span>
|
|
1317
|
+
<span class="cstat-no" title="statement not covered" > if (!value) <span class="cstat-no" title="statement not covered" >continue;</span></span>
|
|
1318
|
+
<span class="cstat-no" title="statement not covered" > if (key === 'title') {</span>
|
|
1319
|
+
<span class="cstat-no" title="statement not covered" > html += `<title>${value}</title>\n`;</span>
|
|
1320
|
+
} else <span class="cstat-no" title="statement not covered" >if (key.startsWith('og:') || key.startsWith('twitter:')) {</span>
|
|
1321
|
+
<span class="cstat-no" title="statement not covered" > html += `<meta property="${key}" content="${value}">\n`;</span>
|
|
1322
|
+
} else {
|
|
1323
|
+
<span class="cstat-no" title="statement not covered" > html += `<meta name="${key}" content="${value}">\n`;</span>
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
<span class="cstat-no" title="statement not covered" > return html;</span>
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
<span class="fstat-no" title="function not covered" > ws</span>Broadcast(data) {
|
|
1330
|
+
const payload = <span class="cstat-no" title="statement not covered" >typeof data === 'string' ? data : JSON.stringify(data);</span>
|
|
1331
|
+
<span class="cstat-no" title="statement not covered" > if (this.wsRedisPub && this.wsRedisPub.isOpen) {</span>
|
|
1332
|
+
const channel = <span class="cstat-no" title="statement not covered" >this.opts.ws.pubSubChannel || 'fullstx_ws_pubsub';</span>
|
|
1333
|
+
<span class="cstat-no" title="statement not covered" > this.wsRedisPub.publish(channel, payload).catch(console.error);</span>
|
|
1334
|
+
} else <span class="cstat-no" title="statement not covered" >if (this.wss) {</span>
|
|
1335
|
+
<span class="cstat-no" title="statement not covered" > this.wss.clients.forEach(<span class="fstat-no" title="function not covered" >(c</span>lient) => {</span>
|
|
1336
|
+
<span class="cstat-no" title="statement not covered" > if (client.readyState === 1) <span class="cstat-no" title="statement not covered" >client.send(payload);</span></span>
|
|
1337
|
+
});
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
<span class="fstat-no" title="function not covered" > fa</span>ctory(count, generatorFn) {
|
|
1342
|
+
<span class="cstat-no" title="statement not covered" > if (!this.faker) <span class="cstat-no" title="statement not covered" >throw new Error('Please install @faker-js/faker to use factory()');</span></span>
|
|
1343
|
+
const items = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1344
|
+
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < count; i++) {</span>
|
|
1345
|
+
<span class="cstat-no" title="statement not covered" > items.push(generatorFn(this.faker, i));</span>
|
|
1346
|
+
}
|
|
1347
|
+
<span class="cstat-no" title="statement not covered" > return items;</span>
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
<span class="fstat-no" title="function not covered" > st</span>orage(provider, config) {
|
|
1351
|
+
<span class="cstat-no" title="statement not covered" > if (provider === 's3') {</span>
|
|
1352
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1353
|
+
const { S3Client, PutObjectCommand, GetObjectCommand } = <span class="cstat-no" title="statement not covered" >require('@aws-sdk/client-s3');</span>
|
|
1354
|
+
const client = <span class="cstat-no" title="statement not covered" >new S3Client(config);</span>
|
|
1355
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1356
|
+
<span class="fstat-no" title="function not covered" > as</span>ync upload(bucket, key, body) {
|
|
1357
|
+
const command = <span class="cstat-no" title="statement not covered" >new PutObjectCommand({ Bucket: bucket, Key: key, Body: body });</span>
|
|
1358
|
+
<span class="cstat-no" title="statement not covered" > return client.send(command);</span>
|
|
1359
|
+
},
|
|
1360
|
+
<span class="fstat-no" title="function not covered" > as</span>ync get(bucket, key) {
|
|
1361
|
+
const command = <span class="cstat-no" title="statement not covered" >new GetObjectCommand({ Bucket: bucket, Key: key });</span>
|
|
1362
|
+
<span class="cstat-no" title="statement not covered" > return client.send(command);</span>
|
|
1363
|
+
},
|
|
1364
|
+
client
|
|
1365
|
+
};
|
|
1366
|
+
} catch {
|
|
1367
|
+
<span class="cstat-no" title="statement not covered" > console.error("[!] Please install '@aws-sdk/client-s3' to use S3 storage.");</span>
|
|
1368
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1369
|
+
}
|
|
1370
|
+
} else <span class="cstat-no" title="statement not covered" >if (provider === 'gcs') {</span>
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1372
|
+
const { Storage } = <span class="cstat-no" title="statement not covered" >require('@google-cloud/storage');</span>
|
|
1373
|
+
const storage = <span class="cstat-no" title="statement not covered" >new Storage(config);</span>
|
|
1374
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1375
|
+
<span class="fstat-no" title="function not covered" > as</span>ync upload(bucket, key, fileBuffer) {
|
|
1376
|
+
const b = <span class="cstat-no" title="statement not covered" >storage.bucket(bucket);</span>
|
|
1377
|
+
const file = <span class="cstat-no" title="statement not covered" >b.file(key);</span>
|
|
1378
|
+
<span class="cstat-no" title="statement not covered" > return file.save(fileBuffer);</span>
|
|
1379
|
+
},
|
|
1380
|
+
<span class="fstat-no" title="function not covered" > as</span>ync get(bucket, key) {
|
|
1381
|
+
const b = <span class="cstat-no" title="statement not covered" >storage.bucket(bucket);</span>
|
|
1382
|
+
const file = <span class="cstat-no" title="statement not covered" >b.file(key);</span>
|
|
1383
|
+
<span class="cstat-no" title="statement not covered" > return file.download();</span>
|
|
1384
|
+
},
|
|
1385
|
+
client: storage
|
|
1386
|
+
};
|
|
1387
|
+
} catch {
|
|
1388
|
+
<span class="cstat-no" title="statement not covered" > console.error("[!] Please install '@google-cloud/storage' to use GCS storage.");</span>
|
|
1389
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(`Unsupported storage provider: ${provider}`);</span>
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
<span class="fstat-no" title="function not covered" > te</span>lemetry(serviceName) {
|
|
1396
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1397
|
+
const { NodeSDK } = <span class="cstat-no" title="statement not covered" >require('@opentelemetry/sdk-node');</span>
|
|
1398
|
+
const { getNodeAutoInstrumentations } = <span class="cstat-no" title="statement not covered" >require('@opentelemetry/auto-instrumentations-node');</span>
|
|
1399
|
+
const { ConsoleSpanExporter } = <span class="cstat-no" title="statement not covered" >require('@opentelemetry/sdk-trace-node');</span>
|
|
1400
|
+
|
|
1401
|
+
const sdk = <span class="cstat-no" title="statement not covered" >new NodeSDK({</span>
|
|
1402
|
+
serviceName: serviceName || 'fullstx-app',
|
|
1403
|
+
traceExporter: new ConsoleSpanExporter(),
|
|
1404
|
+
instrumentations: [getNodeAutoInstrumentations()]
|
|
1405
|
+
});
|
|
1406
|
+
<span class="cstat-no" title="statement not covered" > sdk.start();</span>
|
|
1407
|
+
<span class="cstat-no" title="statement not covered" > console.log(`[fullstx] OpenTelemetry initialized for service: ${serviceName || 'fullstx-app'}`);</span>
|
|
1408
|
+
|
|
1409
|
+
<span class="cstat-no" title="statement not covered" > process.on('SIGTERM', <span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
1410
|
+
<span class="cstat-no" title="statement not covered" > sdk.shutdown()</span>
|
|
1411
|
+
.then(<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >console.log('Tracing terminated'))</span>
|
|
1412
|
+
.catch(console.error);
|
|
1413
|
+
});
|
|
1414
|
+
<span class="cstat-no" title="statement not covered" > return sdk;</span>
|
|
1415
|
+
} catch {
|
|
1416
|
+
<span class="cstat-no" title="statement not covered" > console.error(</span>
|
|
1417
|
+
'[!] Please install @opentelemetry/sdk-node, @opentelemetry/auto-instrumentations-node, and @opentelemetry/sdk-trace-node'
|
|
1418
|
+
);
|
|
1419
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
<span class="fstat-no" title="function not covered" > re</span>pl() {
|
|
1424
|
+
const repl = <span class="cstat-no" title="statement not covered" >require('repl');</span>
|
|
1425
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] Starting Interactive REPL...');</span>
|
|
1426
|
+
const replServer = <span class="cstat-no" title="statement not covered" >repl.start({ prompt: 'fullstx> ' });</span>
|
|
1427
|
+
<span class="cstat-no" title="statement not covered" > replServer.context.app = this;</span>
|
|
1428
|
+
<span class="cstat-no" title="statement not covered" > replServer.context.db = this.db;</span>
|
|
1429
|
+
<span class="cstat-no" title="statement not covered" > return replServer;</span>
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
<span class="fstat-no" title="function not covered" > im</span>ageResizer(options = <span class="branch-0 cbranch-no" title="branch not covered" >{ cacheDir: './cache' })</span> {
|
|
1433
|
+
let sharp;
|
|
1434
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1435
|
+
<span class="cstat-no" title="statement not covered" > sharp = require('sharp');</span>
|
|
1436
|
+
} catch {
|
|
1437
|
+
<span class="cstat-no" title="statement not covered" > console.error("[!] Please install 'sharp' to use imageResizer()");</span>
|
|
1438
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(r</span>eq, res, next) => <span class="cstat-no" title="statement not covered" >next();</span></span>
|
|
1439
|
+
}
|
|
1440
|
+
const fs = <span class="cstat-no" title="statement not covered" >require('fs');</span>
|
|
1441
|
+
const path = <span class="cstat-no" title="statement not covered" >require('path');</span>
|
|
1442
|
+
<span class="cstat-no" title="statement not covered" > if (!fs.existsSync(options.cacheDir)) <span class="cstat-no" title="statement not covered" >fs.mkdirSync(options.cacheDir, { recursive: true });</span></span>
|
|
1443
|
+
|
|
1444
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >as</span>ync (req, res, next) => {</span>
|
|
1445
|
+
const w = <span class="cstat-no" title="statement not covered" >parseInt(req.query.w);</span>
|
|
1446
|
+
const h = <span class="cstat-no" title="statement not covered" >parseInt(req.query.h);</span>
|
|
1447
|
+
<span class="cstat-no" title="statement not covered" > if ((!w && !h) || !req.url.match(/\.(jpg|jpeg|png|webp|avif|gif)$/i)) <span class="cstat-no" title="statement not covered" >return next();</span></span>
|
|
1448
|
+
|
|
1449
|
+
const filePath = <span class="cstat-no" title="statement not covered" >path.join(this.opts.staticDir, req.url.split('?')[0]);</span>
|
|
1450
|
+
<span class="cstat-no" title="statement not covered" > if (!fs.existsSync(filePath)) <span class="cstat-no" title="statement not covered" >return next();</span></span>
|
|
1451
|
+
|
|
1452
|
+
const cacheKey = <span class="cstat-no" title="statement not covered" >`${w || 'auto'}x${h || 'auto'}_${path.basename(filePath)}`;</span>
|
|
1453
|
+
const cachePath = <span class="cstat-no" title="statement not covered" >path.join(options.cacheDir, cacheKey);</span>
|
|
1454
|
+
|
|
1455
|
+
<span class="cstat-no" title="statement not covered" > if (fs.existsSync(cachePath)) {</span>
|
|
1456
|
+
<span class="cstat-no" title="statement not covered" > res.setHeader('Content-Type', 'image/' + path.extname(cachePath).slice(1));</span>
|
|
1457
|
+
<span class="cstat-no" title="statement not covered" > return fs.createReadStream(cachePath).pipe(res);</span>
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1461
|
+
const transformer = <span class="cstat-no" title="statement not covered" >sharp(filePath).resize({ width: w || null, height: h || null, fit: 'cover' });</span>
|
|
1462
|
+
<span class="cstat-no" title="statement not covered" > await transformer.toFile(cachePath);</span>
|
|
1463
|
+
<span class="cstat-no" title="statement not covered" > res.setHeader('Content-Type', 'image/' + path.extname(cachePath).slice(1));</span>
|
|
1464
|
+
<span class="cstat-no" title="statement not covered" > return fs.createReadStream(cachePath).pipe(res);</span>
|
|
1465
|
+
} catch (e) {
|
|
1466
|
+
<span class="cstat-no" title="statement not covered" > console.error('Image resize error:', e);</span>
|
|
1467
|
+
<span class="cstat-no" title="statement not covered" > next();</span>
|
|
1468
|
+
}
|
|
1469
|
+
};
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
<span class="fstat-no" title="function not covered" > in</span>ertia(
|
|
1473
|
+
htmlTemplate = <span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >(p</span>age) => <span class="cstat-no" title="statement not covered" >`<div id="app" data-page='${JSON.stringify(page).replace(/'/g, '&apos;')}' ></div>`,</span></span>
|
|
1474
|
+
version = <span class="branch-0 cbranch-no" title="branch not covered" >'1.0'</span>
|
|
1475
|
+
) {
|
|
1476
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(r</span>eq, res, next) => {</span>
|
|
1477
|
+
<span class="cstat-no" title="statement not covered" > res.inertia = <span class="fstat-no" title="function not covered" >(c</span>omponent, props = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> => {</span>
|
|
1478
|
+
const page = <span class="cstat-no" title="statement not covered" >{</span>
|
|
1479
|
+
component,
|
|
1480
|
+
props,
|
|
1481
|
+
url: req.url,
|
|
1482
|
+
version
|
|
1483
|
+
};
|
|
1484
|
+
<span class="cstat-no" title="statement not covered" > if (req.headers['x-inertia']) {</span>
|
|
1485
|
+
<span class="cstat-no" title="statement not covered" > res.setHeader('Vary', 'Accept');</span>
|
|
1486
|
+
<span class="cstat-no" title="statement not covered" > res.setHeader('X-Inertia', 'true');</span>
|
|
1487
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': 'application/json' });</span>
|
|
1488
|
+
<span class="cstat-no" title="statement not covered" > return res.end(JSON.stringify(page));</span>
|
|
1489
|
+
}
|
|
1490
|
+
const html = <span class="cstat-no" title="statement not covered" >htmlTemplate(page);</span>
|
|
1491
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': 'text/html' });</span>
|
|
1492
|
+
<span class="cstat-no" title="statement not covered" > return res.end(html);</span>
|
|
1493
|
+
};
|
|
1494
|
+
<span class="cstat-no" title="statement not covered" > next();</span>
|
|
1495
|
+
};
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
<span class="fstat-no" title="function not covered" > te</span>nant(options = <span class="branch-0 cbranch-no" title="branch not covered" >{ resolveBy: 'subdomain' })</span> {
|
|
1499
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(r</span>eq, res, next) => {</span>
|
|
1500
|
+
const host = <span class="cstat-no" title="statement not covered" >req.headers.host || '';</span>
|
|
1501
|
+
<span class="cstat-no" title="statement not covered" > if (options.resolveBy === 'subdomain') {</span>
|
|
1502
|
+
const parts = <span class="cstat-no" title="statement not covered" >host.split('.');</span>
|
|
1503
|
+
<span class="cstat-no" title="statement not covered" > if (parts.length > 2) {</span>
|
|
1504
|
+
<span class="cstat-no" title="statement not covered" > req.tenant = parts[0];</span>
|
|
1505
|
+
}
|
|
1506
|
+
} else <span class="cstat-no" title="statement not covered" >if (options.resolveBy === 'header') {</span>
|
|
1507
|
+
<span class="cstat-no" title="statement not covered" > req.tenant = req.headers['x-tenant-id'];</span>
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
<span class="cstat-no" title="statement not covered" > if (!req.tenant && options.requireTenant) {</span>
|
|
1511
|
+
<span class="cstat-no" title="statement not covered" > if (res.json) <span class="cstat-no" title="statement not covered" >return res.json({ error: 'Tenant not identified' }, 400);</span></span>
|
|
1512
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(400, { 'Content-Type': 'application/json' });</span>
|
|
1513
|
+
<span class="cstat-no" title="statement not covered" > return res.end(JSON.stringify({ error: 'Tenant not identified' }));</span>
|
|
1514
|
+
}
|
|
1515
|
+
<span class="cstat-no" title="statement not covered" > next();</span>
|
|
1516
|
+
};
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
<span class="fstat-no" title="function not covered" > ap</span>iDocs(endpoint = <span class="branch-0 cbranch-no" title="branch not covered" >'/api/docs')</span> {
|
|
1520
|
+
<span class="cstat-no" title="statement not covered" > this.get(endpoint, <span class="fstat-no" title="function not covered" >(r</span>eq, res) => {</span>
|
|
1521
|
+
const docs = <span class="cstat-no" title="statement not covered" >this.router.routes.map(<span class="fstat-no" title="function not covered" >(r</span>) => (<span class="cstat-no" title="statement not covered" >{</span></span>
|
|
1522
|
+
method: r.method,
|
|
1523
|
+
path: r.path
|
|
1524
|
+
}));
|
|
1525
|
+
<span class="cstat-no" title="statement not covered" > if (res.json) <span class="cstat-no" title="statement not covered" >return res.json({ routes: docs });</span></span>
|
|
1526
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': 'application/json' });</span>
|
|
1527
|
+
<span class="cstat-no" title="statement not covered" > res.end(JSON.stringify({ routes: docs }));</span>
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
<span class="fstat-no" title="function not covered" > db</span>Replica(writeConnection, readConnections = <span class="branch-0 cbranch-no" title="branch not covered" >[])</span> {
|
|
1532
|
+
let readIndex = <span class="cstat-no" title="statement not covered" >0;</span>
|
|
1533
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1534
|
+
<span class="fstat-no" title="function not covered" > ge</span>t write() {
|
|
1535
|
+
<span class="cstat-no" title="statement not covered" > return writeConnection;</span>
|
|
1536
|
+
},
|
|
1537
|
+
<span class="fstat-no" title="function not covered" > ge</span>t read() {
|
|
1538
|
+
<span class="cstat-no" title="statement not covered" > if (readConnections.length === 0) <span class="cstat-no" title="statement not covered" >return writeConnection;</span></span>
|
|
1539
|
+
const conn = <span class="cstat-no" title="statement not covered" >readConnections[readIndex];</span>
|
|
1540
|
+
<span class="cstat-no" title="statement not covered" > readIndex = (readIndex + 1) % readConnections.length;</span>
|
|
1541
|
+
<span class="cstat-no" title="statement not covered" > return conn;</span>
|
|
1542
|
+
}
|
|
1543
|
+
};
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
<span class="fstat-no" title="function not covered" > pr</span>esence() {
|
|
1547
|
+
const channels = <span class="cstat-no" title="statement not covered" >new Map();</span>
|
|
1548
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1549
|
+
<span class="fstat-no" title="function not covered" > jo</span>in(channel, user) {
|
|
1550
|
+
<span class="cstat-no" title="statement not covered" > if (!channels.has(channel)) <span class="cstat-no" title="statement not covered" >channels.set(channel, new Set());</span></span>
|
|
1551
|
+
<span class="cstat-no" title="statement not covered" > channels.get(channel).add(user);</span>
|
|
1552
|
+
<span class="cstat-no" title="statement not covered" > return Array.from(channels.get(channel));</span>
|
|
1553
|
+
},
|
|
1554
|
+
<span class="fstat-no" title="function not covered" > le</span>ave(channel, user) {
|
|
1555
|
+
<span class="cstat-no" title="statement not covered" > if (channels.has(channel)) {</span>
|
|
1556
|
+
<span class="cstat-no" title="statement not covered" > channels.get(channel).delete(user);</span>
|
|
1557
|
+
}
|
|
1558
|
+
},
|
|
1559
|
+
<span class="fstat-no" title="function not covered" > ge</span>tUsers(channel) {
|
|
1560
|
+
<span class="cstat-no" title="statement not covered" > return channels.has(channel) ? Array.from(channels.get(channel)) : [];</span>
|
|
1561
|
+
}
|
|
1562
|
+
};
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
<span class="fstat-no" title="function not covered" > ad</span>minPanel(endpoint = <span class="branch-0 cbranch-no" title="branch not covered" >'/admin')</span> {
|
|
1566
|
+
<span class="cstat-no" title="statement not covered" > this.get(endpoint, <span class="fstat-no" title="function not covered" >(r</span>eq, res) => {</span>
|
|
1567
|
+
const html = <span class="cstat-no" title="statement not covered" >`</span>
|
|
1568
|
+
<!DOCTYPE html>
|
|
1569
|
+
<html>
|
|
1570
|
+
<head>
|
|
1571
|
+
<title>Fullstx Admin Panel</title>
|
|
1572
|
+
<style>
|
|
1573
|
+
body { font-family: system-ui, sans-serif; background: #f4f4f5; margin: 0; }
|
|
1574
|
+
header { background: #18181b; color: white; padding: 1rem; }
|
|
1575
|
+
.container { padding: 2rem; }
|
|
1576
|
+
.card { background: white; padding: 1rem; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
|
1577
|
+
</style>
|
|
1578
|
+
</head>
|
|
1579
|
+
<body>
|
|
1580
|
+
<header><h2>⚡ Fullstx Admin</h2></header>
|
|
1581
|
+
<div class="container">
|
|
1582
|
+
<div class="card">
|
|
1583
|
+
<h3>Dashboard Overview</h3>
|
|
1584
|
+
<p>Welcome to the built-in admin panel.</p>
|
|
1585
|
+
<ul>
|
|
1586
|
+
<li>Registered Routes: ${this.router.routes ? this.router.routes.length : 0}</li>
|
|
1587
|
+
<li>Plugins Loaded: ${this.plugins ? this.plugins.size : 0}</li>
|
|
1588
|
+
<li>DB Connected: ${!!this.db}</li>
|
|
1589
|
+
</ul>
|
|
1590
|
+
</div>
|
|
1591
|
+
</div>
|
|
1592
|
+
</body>
|
|
1593
|
+
</html>`;
|
|
1594
|
+
<span class="cstat-no" title="statement not covered" > if (res.html) <span class="cstat-no" title="statement not covered" >return res.html(html);</span></span>
|
|
1595
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': 'text/html' });</span>
|
|
1596
|
+
<span class="cstat-no" title="statement not covered" > res.end(html);</span>
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
<span class="fstat-no" title="function not covered" > as</span>ync e2eTest(url = <span class="branch-0 cbranch-no" title="branch not covered" >'http://localhost:3000',</span> scriptFn) {
|
|
1601
|
+
let chromium;
|
|
1602
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1603
|
+
<span class="cstat-no" title="statement not covered" > chromium = require('playwright').chromium;</span>
|
|
1604
|
+
} catch {
|
|
1605
|
+
<span class="cstat-no" title="statement not covered" > console.error("[!] Please install 'playwright' to run E2E tests.");</span>
|
|
1606
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1607
|
+
}
|
|
1608
|
+
<span class="cstat-no" title="statement not covered" > console.log(`[fullstx] Starting E2E Test on ${url}`);</span>
|
|
1609
|
+
const browser = <span class="cstat-no" title="statement not covered" >await chromium.launch();</span>
|
|
1610
|
+
const page = <span class="cstat-no" title="statement not covered" >await browser.newPage();</span>
|
|
1611
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1612
|
+
<span class="cstat-no" title="statement not covered" > await page.goto(url);</span>
|
|
1613
|
+
<span class="cstat-no" title="statement not covered" > if (typeof scriptFn === 'function') {</span>
|
|
1614
|
+
<span class="cstat-no" title="statement not covered" > await scriptFn(page);</span>
|
|
1615
|
+
}
|
|
1616
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] E2E Test passed successfully.');</span>
|
|
1617
|
+
} catch (err) {
|
|
1618
|
+
<span class="cstat-no" title="statement not covered" > console.error('[!] E2E Test failed:', err);</span>
|
|
1619
|
+
} finally {
|
|
1620
|
+
<span class="cstat-no" title="statement not covered" > await browser.close();</span>
|
|
1621
|
+
}
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
<span class="fstat-no" title="function not covered" > as</span>ync buildAssets(options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
|
|
1625
|
+
let esbuild;
|
|
1626
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1627
|
+
<span class="cstat-no" title="statement not covered" > esbuild = require('esbuild');</span>
|
|
1628
|
+
} catch {
|
|
1629
|
+
<span class="cstat-no" title="statement not covered" > console.error("[!] Please install 'esbuild' to use the asset bundler.");</span>
|
|
1630
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1631
|
+
}
|
|
1632
|
+
const config = <span class="cstat-no" title="statement not covered" >Object.assign(</span>
|
|
1633
|
+
{
|
|
1634
|
+
entryPoints: ['public/js/app.js'],
|
|
1635
|
+
bundle: true,
|
|
1636
|
+
minify: true,
|
|
1637
|
+
outdir: 'public/dist',
|
|
1638
|
+
sourcemap: true
|
|
1639
|
+
},
|
|
1640
|
+
options
|
|
1641
|
+
);
|
|
1642
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] Bundling assets with esbuild...');</span>
|
|
1643
|
+
<span class="cstat-no" title="statement not covered" > return await esbuild.build(config);</span>
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
<span class="fstat-no" title="function not covered" > re</span>gisterDomain(domainName, { controller, service, repository }) {
|
|
1647
|
+
<span class="cstat-no" title="statement not covered" > if (!this.domains) <span class="cstat-no" title="statement not covered" >this.domains = new Map();</span></span>
|
|
1648
|
+
<span class="cstat-no" title="statement not covered" > this.domains.set(domainName, { controller, service, repository });</span>
|
|
1649
|
+
<span class="cstat-no" title="statement not covered" > if (typeof controller.registerRoutes === 'function') {</span>
|
|
1650
|
+
const srv = <span class="cstat-no" title="statement not covered" >typeof service === 'function' ? new service(repository) : service;</span>
|
|
1651
|
+
const ctrl = <span class="cstat-no" title="statement not covered" >new controller(srv);</span>
|
|
1652
|
+
<span class="cstat-no" title="statement not covered" > ctrl.registerRoutes(this.router);</span>
|
|
1653
|
+
}
|
|
1654
|
+
<span class="cstat-no" title="statement not covered" > console.log(`[fullstx] Domain registered: ${domainName}`);</span>
|
|
1655
|
+
<span class="cstat-no" title="statement not covered" > return this;</span>
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
<span class="fstat-no" title="function not covered" > cq</span>rs() {
|
|
1659
|
+
const events = <span class="cstat-no" title="statement not covered" >[];</span>
|
|
1660
|
+
const handlers = <span class="cstat-no" title="statement not covered" >new Map();</span>
|
|
1661
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1662
|
+
<span class="fstat-no" title="function not covered" > re</span>gisterHandler(eventType, handlerFn) {
|
|
1663
|
+
<span class="cstat-no" title="statement not covered" > if (!handlers.has(eventType)) <span class="cstat-no" title="statement not covered" >handlers.set(eventType, []);</span></span>
|
|
1664
|
+
<span class="cstat-no" title="statement not covered" > handlers.get(eventType).push(handlerFn);</span>
|
|
1665
|
+
},
|
|
1666
|
+
<span class="fstat-no" title="function not covered" > as</span>ync dispatchCommand(commandType, payload) {
|
|
1667
|
+
const event = <span class="cstat-no" title="statement not covered" >{ type: commandType + 'Executed', payload, timestamp: Date.now() };</span>
|
|
1668
|
+
<span class="cstat-no" title="statement not covered" > events.push(event);</span>
|
|
1669
|
+
const funcs = <span class="cstat-no" title="statement not covered" >handlers.get(event.type) || [];</span>
|
|
1670
|
+
<span class="cstat-no" title="statement not covered" > for (const fn of funcs) {</span>
|
|
1671
|
+
<span class="cstat-no" title="statement not covered" > await fn(event);</span>
|
|
1672
|
+
}
|
|
1673
|
+
<span class="cstat-no" title="statement not covered" > return event;</span>
|
|
1674
|
+
},
|
|
1675
|
+
<span class="fstat-no" title="function not covered" > ge</span>tEvents() {
|
|
1676
|
+
<span class="cstat-no" title="statement not covered" > return events;</span>
|
|
1677
|
+
}
|
|
1678
|
+
};
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
<span class="fstat-no" title="function not covered" > va</span>lidate(schema) {
|
|
1682
|
+
<span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >(r</span>eq, res, next) => {</span>
|
|
1683
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1684
|
+
const data = <span class="cstat-no" title="statement not covered" >{</span>
|
|
1685
|
+
body: req.body,
|
|
1686
|
+
query: req.query,
|
|
1687
|
+
params: req.params || {}
|
|
1688
|
+
};
|
|
1689
|
+
const parsed = <span class="cstat-no" title="statement not covered" >schema.parse(data);</span>
|
|
1690
|
+
<span class="cstat-no" title="statement not covered" > if (parsed.body) <span class="cstat-no" title="statement not covered" >req.body = parsed.body;</span></span>
|
|
1691
|
+
<span class="cstat-no" title="statement not covered" > if (parsed.query) <span class="cstat-no" title="statement not covered" >req.query = parsed.query;</span></span>
|
|
1692
|
+
<span class="cstat-no" title="statement not covered" > if (parsed.params) <span class="cstat-no" title="statement not covered" >req.params = parsed.params;</span></span>
|
|
1693
|
+
<span class="cstat-no" title="statement not covered" > next();</span>
|
|
1694
|
+
} catch (e) {
|
|
1695
|
+
<span class="cstat-no" title="statement not covered" > console.error('Zod Validation Error:', e);</span>
|
|
1696
|
+
<span class="cstat-no" title="statement not covered" > if (res.json) {</span>
|
|
1697
|
+
<span class="cstat-no" title="statement not covered" > return res.json({ error: 'Validation failed', details: e.errors }, 400);</span>
|
|
1698
|
+
}
|
|
1699
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(400, { 'Content-Type': 'application/json' });</span>
|
|
1700
|
+
<span class="cstat-no" title="statement not covered" > return res.end(JSON.stringify({ error: 'Validation failed', details: e.errors }));</span>
|
|
1701
|
+
}
|
|
1702
|
+
};
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
<span class="fstat-no" title="function not covered" > kn</span>ex(config) {
|
|
1706
|
+
<span class="cstat-no" title="statement not covered" > return require('knex')(config);</span>
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
<span class="fstat-no" title="function not covered" > mo</span>ngoose(url, options) {
|
|
1710
|
+
const mongoose = <span class="cstat-no" title="statement not covered" >require('mongoose');</span>
|
|
1711
|
+
<span class="cstat-no" title="statement not covered" > mongoose.connect(url, options);</span>
|
|
1712
|
+
<span class="cstat-no" title="statement not covered" > return mongoose;</span>
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
listen(port, callback) {
|
|
1716
|
+
const userPort = port;
|
|
1717
|
+
const internalPort =
|
|
1718
|
+
typeof this.opts.internalPort === 'number'
|
|
1719
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >this.opts.internalPort</span>
|
|
1720
|
+
: this.opts.liveReload
|
|
1721
|
+
? <span class="branch-0 cbranch-no" title="branch not covered" >port + (this.opts.internalPortOffset || 1000)</span>
|
|
1722
|
+
: port;
|
|
1723
|
+
|
|
1724
|
+
this.router.middlewares.unshift(async (req, res, next) => {
|
|
1725
|
+
try {
|
|
1726
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (this.executeHooks) await this.executeHooks('onRequest', req, res);
|
|
1727
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (!res.headersSent) next();
|
|
1728
|
+
} catch (e) {
|
|
1729
|
+
<span class="cstat-no" title="statement not covered" > if (res.json) <span class="cstat-no" title="statement not covered" >res.json({ error: e.message }, 500);</span></span>
|
|
1730
|
+
else {
|
|
1731
|
+
<span class="cstat-no" title="statement not covered" > res.writeHead(500);</span>
|
|
1732
|
+
<span class="cstat-no" title="statement not covered" > res.end(e.message);</span>
|
|
1733
|
+
}
|
|
1734
|
+
}
|
|
1735
|
+
});
|
|
1736
|
+
|
|
1737
|
+
this.server.on('error', <span class="fstat-no" title="function not covered" >(e</span>rr) => {
|
|
1738
|
+
<span class="cstat-no" title="statement not covered" > if (err && err.code === 'EADDRINUSE') {</span>
|
|
1739
|
+
<span class="cstat-no" title="statement not covered" > console.error(</span>
|
|
1740
|
+
'\\n[x] Failed to start: port ' + internalPort + ' (internal) is already in use by another process.'
|
|
1741
|
+
);
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" > console.error(' Solution:');</span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > console.error(</span>
|
|
1744
|
+
' 1) Stop the process occupying port ' +
|
|
1745
|
+
internalPort +
|
|
1746
|
+
' (check via: netstat -ano | grep ":' +
|
|
1747
|
+
internalPort +
|
|
1748
|
+
'")'
|
|
1749
|
+
);
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" > console.error(' 2) Or manually set internalPort: Framework({ internalPort: 4100 })\\n');</span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > process.exit(1);</span>
|
|
1752
|
+
}
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
1754
|
+
});
|
|
1755
|
+
|
|
1756
|
+
try {
|
|
1757
|
+
const { WebSocketServer } = require('ws');
|
|
1758
|
+
this.wss = new WebSocketServer({ server: this.server });
|
|
1759
|
+
} catch {}
|
|
1760
|
+
|
|
1761
|
+
const handleShutdown = <span class="fstat-no" title="function not covered" >()</span> => {
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > if (this.isShuttingDown) <span class="cstat-no" title="statement not covered" >return;</span></span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" > this.isShuttingDown = true;</span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > this.close();</span>
|
|
1765
|
+
};
|
|
1766
|
+
|
|
1767
|
+
process.on('SIGINT', handleShutdown);
|
|
1768
|
+
process.on('SIGTERM', handleShutdown);
|
|
1769
|
+
|
|
1770
|
+
this.server.listen(internalPort, () => {
|
|
1771
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (typeof callback === 'function') <span class="cstat-no" title="statement not covered" >callback();</span>
|
|
1772
|
+
|
|
1773
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (this.opts.liveReload) {
|
|
1774
|
+
const startBrowserSync = <span class="cstat-no" title="statement not covered" >require('./browser-sync');</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > startBrowserSync(userPort, internalPort, this.opts);</span>
|
|
1776
|
+
} else {
|
|
1777
|
+
console.log('Server Running on http://localhost:' + userPort);
|
|
1778
|
+
console.log('Live reload disabled (Framework({ liveReload: false }))');
|
|
1779
|
+
}
|
|
1780
|
+
});
|
|
1781
|
+
|
|
1782
|
+
return this.server;
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
<span class="fstat-no" title="function not covered" > cl</span>ose(callback) {
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" > console.log('\\n[fullstx] Initiating graceful shutdown...');</span>
|
|
1787
|
+
let pending = <span class="cstat-no" title="statement not covered" >1;</span>
|
|
1788
|
+
const done = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
1789
|
+
<span class="cstat-no" title="statement not covered" > pending--;</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > if (pending === 0) {</span>
|
|
1791
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] Server safely stopped.');</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > if (typeof callback === 'function') <span class="cstat-no" title="statement not covered" >callback();</span></span>
|
|
1793
|
+
else <span class="cstat-no" title="statement not covered" >process.exit(0);</span>
|
|
1794
|
+
}
|
|
1795
|
+
};
|
|
1796
|
+
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" > if (this.wss) {</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > pending++;</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > this.wss.close(<span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] WebSocket server closed.');</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" > done();</span>
|
|
1802
|
+
});
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
<span class="cstat-no" title="statement not covered" > if (this.db && typeof this.db.end === 'function') {</span>
|
|
1806
|
+
<span class="cstat-no" title="statement not covered" > pending++;</span>
|
|
1807
|
+
<span class="cstat-no" title="statement not covered" > this.db.end(<span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
1808
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] Database connection closed.');</span>
|
|
1809
|
+
<span class="cstat-no" title="statement not covered" > done();</span>
|
|
1810
|
+
});
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
<span class="cstat-no" title="statement not covered" > this.server.close(<span class="fstat-no" title="function not covered" >()</span> => {</span>
|
|
1814
|
+
<span class="cstat-no" title="statement not covered" > console.log('[fullstx] HTTP server closed.');</span>
|
|
1815
|
+
<span class="cstat-no" title="statement not covered" > done();</span>
|
|
1816
|
+
});
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
module.exports = FullstxApplication;
|
|
1821
|
+
</pre></td></tr></table></pre>
|
|
1822
|
+
|
|
1823
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1824
|
+
</div><!-- /wrapper -->
|
|
1825
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1826
|
+
Code coverage generated by
|
|
1827
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1828
|
+
at 2026-07-08T05:29:05.155Z
|
|
1829
|
+
</div>
|
|
1830
|
+
<script src="../../prettify.js"></script>
|
|
1831
|
+
<script>
|
|
1832
|
+
window.onload = function () {
|
|
1833
|
+
prettyPrint();
|
|
1834
|
+
};
|
|
1835
|
+
</script>
|
|
1836
|
+
<script src="../../sorter.js"></script>
|
|
1837
|
+
<script src="../../block-navigation.js"></script>
|
|
1838
|
+
</body>
|
|
1839
|
+
</html>
|
|
1840
|
+
|