apostrophe 2.220.6 → 2.221.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.
Files changed (201) hide show
  1. package/.nyc_output/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
  2. package/.nyc_output/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
  3. package/.nyc_output/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
  4. package/.nyc_output/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
  5. package/.nyc_output/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
  6. package/.nyc_output/processinfo/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +1 -0
  7. package/.nyc_output/processinfo/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +1 -0
  8. package/.nyc_output/processinfo/99acae99-becc-463d-ba35-9333f88d2694.json +1 -0
  9. package/.nyc_output/processinfo/d071f9e0-3b11-44e6-9817-69f184dd064d.json +1 -0
  10. package/.nyc_output/processinfo/ed000bec-7ff7-49bf-a109-d17bfe883433.json +1 -0
  11. package/.nyc_output/processinfo/index.json +1 -0
  12. package/CHANGELOG.md +33 -0
  13. package/coverage/a3/defaults.js.html +253 -0
  14. package/coverage/a3/index.html +131 -0
  15. package/coverage/a3/index.js.html +2338 -0
  16. package/coverage/a3/lib/escape-host.js.html +109 -0
  17. package/coverage/a3/lib/index.html +176 -0
  18. package/coverage/a3/lib/mongodb-connect.js.html +250 -0
  19. package/coverage/a3/lib/moog-require.js.html +790 -0
  20. package/coverage/a3/lib/moog.js.html +1711 -0
  21. package/coverage/a3/lib/opentelemetry.js.html +517 -0
  22. package/coverage/a3/modules/@apostrophecms/admin-bar/index.html +116 -0
  23. package/coverage/a3/modules/@apostrophecms/admin-bar/index.js.html +931 -0
  24. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.html +116 -0
  25. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.js.html +115 -0
  26. package/coverage/a3/modules/@apostrophecms/any-page-type/index.html +116 -0
  27. package/coverage/a3/modules/@apostrophecms/any-page-type/index.js.html +1105 -0
  28. package/coverage/a3/modules/@apostrophecms/archive-page/index.html +116 -0
  29. package/coverage/a3/modules/@apostrophecms/archive-page/index.js.html +97 -0
  30. package/coverage/a3/modules/@apostrophecms/area/index.html +116 -0
  31. package/coverage/a3/modules/@apostrophecms/area/index.js.html +2104 -0
  32. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/area.js.html +469 -0
  33. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/index.html +131 -0
  34. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/widget.js.html +286 -0
  35. package/coverage/a3/modules/@apostrophecms/asset/index.html +116 -0
  36. package/coverage/a3/modules/@apostrophecms/asset/index.js.html +3982 -0
  37. package/coverage/a3/modules/@apostrophecms/asset/lib/globalIcons.js.html +346 -0
  38. package/coverage/a3/modules/@apostrophecms/asset/lib/index.html +116 -0
  39. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/index.html +131 -0
  40. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.scss.js.html +289 -0
  41. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js.html +148 -0
  42. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/index.html +116 -0
  43. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/index.html +131 -0
  44. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.es5.js.html +184 -0
  45. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.scss.js.html +238 -0
  46. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/utils.js.html +958 -0
  47. package/coverage/a3/modules/@apostrophecms/attachment/index.html +116 -0
  48. package/coverage/a3/modules/@apostrophecms/attachment/index.js.html +3676 -0
  49. package/coverage/a3/modules/@apostrophecms/attachment/lib/index.html +116 -0
  50. package/coverage/a3/modules/@apostrophecms/attachment/lib/legacy-migrations.js.html +205 -0
  51. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/index.html +116 -0
  52. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/rescale.js.html +328 -0
  53. package/coverage/a3/modules/@apostrophecms/busy/index.html +116 -0
  54. package/coverage/a3/modules/@apostrophecms/busy/index.js.html +145 -0
  55. package/coverage/a3/modules/@apostrophecms/cache/index.html +116 -0
  56. package/coverage/a3/modules/@apostrophecms/cache/index.js.html +424 -0
  57. package/coverage/a3/modules/@apostrophecms/db/index.html +116 -0
  58. package/coverage/a3/modules/@apostrophecms/db/index.js.html +640 -0
  59. package/coverage/a3/modules/@apostrophecms/doc/index.html +116 -0
  60. package/coverage/a3/modules/@apostrophecms/doc/index.js.html +3937 -0
  61. package/coverage/a3/modules/@apostrophecms/doc/lib/index.html +116 -0
  62. package/coverage/a3/modules/@apostrophecms/doc/lib/legacy-migrations.js.html +622 -0
  63. package/coverage/a3/modules/@apostrophecms/doc-type/index.html +116 -0
  64. package/coverage/a3/modules/@apostrophecms/doc-type/index.js.html +8638 -0
  65. package/coverage/a3/modules/@apostrophecms/doc-type/lib/autocomplete.js.html +319 -0
  66. package/coverage/a3/modules/@apostrophecms/doc-type/lib/index.html +116 -0
  67. package/coverage/a3/modules/@apostrophecms/email/index.html +116 -0
  68. package/coverage/a3/modules/@apostrophecms/email/index.js.html +301 -0
  69. package/coverage/a3/modules/@apostrophecms/error/index.html +116 -0
  70. package/coverage/a3/modules/@apostrophecms/error/index.js.html +202 -0
  71. package/coverage/a3/modules/@apostrophecms/express/index.html +116 -0
  72. package/coverage/a3/modules/@apostrophecms/express/index.js.html +2116 -0
  73. package/coverage/a3/modules/@apostrophecms/file/index.html +116 -0
  74. package/coverage/a3/modules/@apostrophecms/file/index.js.html +367 -0
  75. package/coverage/a3/modules/@apostrophecms/file-tag/index.html +116 -0
  76. package/coverage/a3/modules/@apostrophecms/file-tag/index.js.html +127 -0
  77. package/coverage/a3/modules/@apostrophecms/global/index.html +116 -0
  78. package/coverage/a3/modules/@apostrophecms/global/index.js.html +535 -0
  79. package/coverage/a3/modules/@apostrophecms/home-page/index.html +116 -0
  80. package/coverage/a3/modules/@apostrophecms/home-page/index.js.html +94 -0
  81. package/coverage/a3/modules/@apostrophecms/html-widget/index.html +116 -0
  82. package/coverage/a3/modules/@apostrophecms/html-widget/index.js.html +271 -0
  83. package/coverage/a3/modules/@apostrophecms/http/index.html +116 -0
  84. package/coverage/a3/modules/@apostrophecms/http/index.js.html +976 -0
  85. package/coverage/a3/modules/@apostrophecms/i18n/index.html +116 -0
  86. package/coverage/a3/modules/@apostrophecms/i18n/index.js.html +2083 -0
  87. package/coverage/a3/modules/@apostrophecms/image/index.html +116 -0
  88. package/coverage/a3/modules/@apostrophecms/image/index.js.html +1486 -0
  89. package/coverage/a3/modules/@apostrophecms/image-tag/index.html +116 -0
  90. package/coverage/a3/modules/@apostrophecms/image-tag/index.js.html +127 -0
  91. package/coverage/a3/modules/@apostrophecms/image-widget/index.html +116 -0
  92. package/coverage/a3/modules/@apostrophecms/image-widget/index.js.html +145 -0
  93. package/coverage/a3/modules/@apostrophecms/job/index.html +116 -0
  94. package/coverage/a3/modules/@apostrophecms/job/index.js.html +1321 -0
  95. package/coverage/a3/modules/@apostrophecms/launder/index.html +116 -0
  96. package/coverage/a3/modules/@apostrophecms/launder/index.js.html +124 -0
  97. package/coverage/a3/modules/@apostrophecms/lock/index.html +116 -0
  98. package/coverage/a3/modules/@apostrophecms/lock/index.js.html +676 -0
  99. package/coverage/a3/modules/@apostrophecms/login/index.html +116 -0
  100. package/coverage/a3/modules/@apostrophecms/login/index.js.html +2617 -0
  101. package/coverage/a3/modules/@apostrophecms/migration/index.html +116 -0
  102. package/coverage/a3/modules/@apostrophecms/migration/index.js.html +970 -0
  103. package/coverage/a3/modules/@apostrophecms/modal/index.html +116 -0
  104. package/coverage/a3/modules/@apostrophecms/modal/index.js.html +193 -0
  105. package/coverage/a3/modules/@apostrophecms/module/index.html +116 -0
  106. package/coverage/a3/modules/@apostrophecms/module/index.js.html +2500 -0
  107. package/coverage/a3/modules/@apostrophecms/module/lib/events.js.html +547 -0
  108. package/coverage/a3/modules/@apostrophecms/module/lib/index.html +116 -0
  109. package/coverage/a3/modules/@apostrophecms/notification/index.html +116 -0
  110. package/coverage/a3/modules/@apostrophecms/notification/index.js.html +1315 -0
  111. package/coverage/a3/modules/@apostrophecms/oembed/index.html +116 -0
  112. package/coverage/a3/modules/@apostrophecms/oembed/index.js.html +781 -0
  113. package/coverage/a3/modules/@apostrophecms/oembed/lib/index.html +161 -0
  114. package/coverage/a3/modules/@apostrophecms/oembed/lib/infogram.js.html +178 -0
  115. package/coverage/a3/modules/@apostrophecms/oembed/lib/vimeo.js.html +124 -0
  116. package/coverage/a3/modules/@apostrophecms/oembed/lib/wufoo.js.html +256 -0
  117. package/coverage/a3/modules/@apostrophecms/oembed/lib/youtube.js.html +322 -0
  118. package/coverage/a3/modules/@apostrophecms/oembed-field/index.html +116 -0
  119. package/coverage/a3/modules/@apostrophecms/oembed-field/index.js.html +268 -0
  120. package/coverage/a3/modules/@apostrophecms/page/index.html +116 -0
  121. package/coverage/a3/modules/@apostrophecms/page/index.js.html +6955 -0
  122. package/coverage/a3/modules/@apostrophecms/page/lib/index.html +116 -0
  123. package/coverage/a3/modules/@apostrophecms/page/lib/legacy-migrations.js.html +568 -0
  124. package/coverage/a3/modules/@apostrophecms/page-type/index.html +116 -0
  125. package/coverage/a3/modules/@apostrophecms/page-type/index.js.html +1501 -0
  126. package/coverage/a3/modules/@apostrophecms/pager/index.html +116 -0
  127. package/coverage/a3/modules/@apostrophecms/pager/index.js.html +232 -0
  128. package/coverage/a3/modules/@apostrophecms/permission/index.html +116 -0
  129. package/coverage/a3/modules/@apostrophecms/permission/index.js.html +1057 -0
  130. package/coverage/a3/modules/@apostrophecms/permission/lib/index.html +116 -0
  131. package/coverage/a3/modules/@apostrophecms/permission/lib/legacy-migrations.js.html +160 -0
  132. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.html +116 -0
  133. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.js.html +1051 -0
  134. package/coverage/a3/modules/@apostrophecms/piece-type/index.html +116 -0
  135. package/coverage/a3/modules/@apostrophecms/piece-type/index.js.html +3103 -0
  136. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.html +116 -0
  137. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.js.html +157 -0
  138. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.html +116 -0
  139. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.js.html +1363 -0
  140. package/coverage/a3/modules/@apostrophecms/schema/index.html +116 -0
  141. package/coverage/a3/modules/@apostrophecms/schema/index.js.html +4603 -0
  142. package/coverage/a3/modules/@apostrophecms/schema/lib/addFieldTypes.js.html +3502 -0
  143. package/coverage/a3/modules/@apostrophecms/schema/lib/index.html +131 -0
  144. package/coverage/a3/modules/@apostrophecms/schema/lib/joinr.js.html +703 -0
  145. package/coverage/a3/modules/@apostrophecms/search/index.html +116 -0
  146. package/coverage/a3/modules/@apostrophecms/search/index.js.html +1222 -0
  147. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.html +116 -0
  148. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.js.html +343 -0
  149. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.html +116 -0
  150. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.js.html +595 -0
  151. package/coverage/a3/modules/@apostrophecms/task/index.html +116 -0
  152. package/coverage/a3/modules/@apostrophecms/task/index.js.html +1147 -0
  153. package/coverage/a3/modules/@apostrophecms/template/index.html +116 -0
  154. package/coverage/a3/modules/@apostrophecms/template/index.js.html +2731 -0
  155. package/coverage/a3/modules/@apostrophecms/template/lib/bundlesLoader.js.html +559 -0
  156. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/component.js.html +310 -0
  157. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/fragment.js.html +325 -0
  158. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/index.html +146 -0
  159. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/render.js.html +490 -0
  160. package/coverage/a3/modules/@apostrophecms/template/lib/index.html +131 -0
  161. package/coverage/a3/modules/@apostrophecms/template/lib/nunjucksLoader.js.html +658 -0
  162. package/coverage/a3/modules/@apostrophecms/ui/index.html +116 -0
  163. package/coverage/a3/modules/@apostrophecms/ui/index.js.html +181 -0
  164. package/coverage/a3/modules/@apostrophecms/uploadfs/index.html +116 -0
  165. package/coverage/a3/modules/@apostrophecms/uploadfs/index.js.html +286 -0
  166. package/coverage/a3/modules/@apostrophecms/url/index.html +116 -0
  167. package/coverage/a3/modules/@apostrophecms/url/index.js.html +733 -0
  168. package/coverage/a3/modules/@apostrophecms/user/index.html +116 -0
  169. package/coverage/a3/modules/@apostrophecms/user/index.js.html +1684 -0
  170. package/coverage/a3/modules/@apostrophecms/user/lib/index.html +116 -0
  171. package/coverage/a3/modules/@apostrophecms/user/lib/legacy-migrations.js.html +157 -0
  172. package/coverage/a3/modules/@apostrophecms/util/index.html +116 -0
  173. package/coverage/a3/modules/@apostrophecms/util/index.js.html +3424 -0
  174. package/coverage/a3/modules/@apostrophecms/util/lib/index.html +116 -0
  175. package/coverage/a3/modules/@apostrophecms/util/lib/logger.js.html +319 -0
  176. package/coverage/a3/modules/@apostrophecms/video-widget/index.html +116 -0
  177. package/coverage/a3/modules/@apostrophecms/video-widget/index.js.html +178 -0
  178. package/coverage/a3/modules/@apostrophecms/widget-type/index.html +116 -0
  179. package/coverage/a3/modules/@apostrophecms/widget-type/index.js.html +1225 -0
  180. package/coverage/a3/test-lib/index.html +131 -0
  181. package/coverage/a3/test-lib/test.js.html +232 -0
  182. package/coverage/a3/test-lib/util.js.html +373 -0
  183. package/coverage/base.css +224 -0
  184. package/coverage/block-navigation.js +87 -0
  185. package/coverage/favicon.png +0 -0
  186. package/coverage/index.html +1256 -0
  187. package/coverage/prettify.css +1 -0
  188. package/coverage/prettify.js +2 -0
  189. package/coverage/sort-arrow-sprite.png +0 -0
  190. package/coverage/sorter.js +196 -0
  191. package/lib/modules/apostrophe-assets/index.js +3 -1
  192. package/lib/modules/apostrophe-doc-type-manager/lib/routes.js +8 -1
  193. package/lib/modules/apostrophe-global/index.js +6 -0
  194. package/lib/modules/apostrophe-login/index.js +1 -1
  195. package/lib/modules/apostrophe-modal/public/css/components/modal-tabs.less +0 -1
  196. package/lib/modules/apostrophe-modal/views/batch.html +1 -1
  197. package/lib/modules/apostrophe-pages/lib/api.js +8 -6
  198. package/lib/modules/apostrophe-schemas/index.js +50 -44
  199. package/package.json +4 -5
  200. package/test/login-throttle.js +4 -0
  201. package/test/package.json +0 -75
@@ -0,0 +1,2338 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for a3/index.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">a3</a> index.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">64.11% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>193/301</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">56.17% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>100/178</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">75.6% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>31/41</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">64.21% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>192/299</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 oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-yes">91x</span>
819
+ <span class="cline-any cline-yes">91x</span>
820
+ <span class="cline-any cline-yes">91x</span>
821
+ <span class="cline-any cline-yes">91x</span>
822
+ <span class="cline-any cline-yes">91x</span>
823
+ <span class="cline-any cline-yes">91x</span>
824
+ <span class="cline-any cline-yes">91x</span>
825
+ <span class="cline-any cline-yes">91x</span>
826
+ <span class="cline-any cline-yes">91x</span>
827
+ <span class="cline-any cline-yes">91x</span>
828
+ <span class="cline-any cline-yes">91x</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">91x</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-neutral">&nbsp;</span>
895
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
+ <span class="cline-any cline-yes">91x</span>
897
+ <span class="cline-any cline-yes">90x</span>
898
+ <span class="cline-any cline-yes">90x</span>
899
+ <span class="cline-any cline-yes">90x</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-yes">90x</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-yes">90x</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-yes">90x</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-no">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-no">&nbsp;</span>
919
+ <span class="cline-any cline-no">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-no">&nbsp;</span>
925
+ <span class="cline-any cline-no">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-no">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-no">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-neutral">&nbsp;</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-no">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-no">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-no">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-no">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-yes">90x</span>
966
+ <span class="cline-any cline-yes">90x</span>
967
+ <span class="cline-any cline-yes">90x</span>
968
+ <span class="cline-any cline-yes">90x</span>
969
+ <span class="cline-any cline-yes">90x</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-yes">90x</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-yes">90x</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-yes">90x</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-no">&nbsp;</span>
993
+ <span class="cline-any cline-no">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-neutral">&nbsp;</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-no">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-no">&nbsp;</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-no">&nbsp;</span>
1014
+ <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-yes">90x</span>
1023
+ <span class="cline-any cline-yes">90x</span>
1024
+ <span class="cline-any cline-yes">90x</span>
1025
+ <span class="cline-any cline-yes">90x</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-neutral">&nbsp;</span>
1030
+ <span class="cline-any cline-yes">90x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-yes">90x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">90x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-yes">90x</span>
1039
+ <span class="cline-any cline-yes">90x</span>
1040
+ <span class="cline-any cline-yes">90x</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-yes">90x</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-yes">90x</span>
1045
+ <span class="cline-any cline-yes">90x</span>
1046
+ <span class="cline-any cline-yes">90x</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-yes">90x</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-neutral">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-yes">90x</span>
1062
+ <span class="cline-any cline-yes">90x</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-neutral">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-yes">90x</span>
1068
+ <span class="cline-any cline-yes">191x</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-yes">90x</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-no">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-yes">90x</span>
1089
+ <span class="cline-any cline-yes">4632x</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-yes">90x</span>
1096
+ <span class="cline-any cline-yes">90x</span>
1097
+ <span class="cline-any cline-yes">90x</span>
1098
+ <span class="cline-any cline-yes">90x</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-yes">90x</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-yes">90x</span>
1103
+ <span class="cline-any cline-yes">90x</span>
1104
+ <span class="cline-any cline-yes">90x</span>
1105
+ <span class="cline-any cline-yes">90x</span>
1106
+ <span class="cline-any cline-yes">90x</span>
1107
+ <span class="cline-any cline-yes">90x</span>
1108
+ <span class="cline-any cline-yes">90x</span>
1109
+ <span class="cline-any cline-yes">90x</span>
1110
+ <span class="cline-any cline-yes">90x</span>
1111
+ <span class="cline-any cline-yes">90x</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-yes">90x</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-yes">90x</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-yes">90x</span>
1119
+ <span class="cline-any cline-no">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-yes">90x</span>
1122
+ <span class="cline-any cline-yes">90x</span>
1123
+ <span class="cline-any cline-yes">90x</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-yes">90x</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-no">&nbsp;</span>
1131
+ <span class="cline-any cline-no">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-yes">90x</span>
1141
+ <span class="cline-any cline-yes">90x</span>
1142
+ <span class="cline-any cline-yes">90x</span>
1143
+ <span class="cline-any cline-yes">90x</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-yes">90x</span>
1146
+ <span class="cline-any cline-yes">89x</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-yes">90x</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-yes">90x</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-yes">90x</span>
1157
+ <span class="cline-any cline-yes">2x</span>
1158
+ <span class="cline-any cline-yes">1x</span>
1159
+ <span class="cline-any cline-yes">1x</span>
1160
+ <span class="cline-any cline-yes">1x</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-yes">88x</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-yes">90x</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-yes">1x</span>
1173
+ <span class="cline-any cline-yes">1x</span>
1174
+ <span class="cline-any cline-yes">1x</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-yes">5x</span>
1178
+ <span class="cline-any cline-no">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-yes">5x</span>
1181
+ <span class="cline-any cline-yes">5x</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-yes">1x</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-yes">90x</span>
1188
+ <span class="cline-any cline-yes">89x</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">1x</span>
1191
+ <span class="cline-any cline-yes">1x</span>
1192
+ <span class="cline-any cline-yes">1x</span>
1193
+ <span class="cline-any cline-yes">1x</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-no">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-neutral">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-neutral">&nbsp;</span>
1214
+ <span class="cline-any cline-yes">90x</span>
1215
+ <span class="cline-any cline-yes">90x</span>
1216
+ <span class="cline-any cline-yes">4635x</span>
1217
+ <span class="cline-any cline-yes">4635x</span>
1218
+ <span class="cline-any cline-yes">4630x</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-yes">5x</span>
1221
+ <span class="cline-any cline-yes">5x</span>
1222
+ <span class="cline-any cline-yes">1x</span>
1223
+ <span class="cline-any cline-yes">1x</span>
1224
+ <span class="cline-any cline-yes">1x</span>
1225
+ <span class="cline-any cline-no">&nbsp;</span>
1226
+ <span class="cline-any cline-no">&nbsp;</span>
1227
+ <span class="cline-any cline-no">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-yes">4635x</span>
1237
+ <span class="cline-any cline-yes">4635x</span>
1238
+ <span class="cline-any cline-yes">4635x</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-yes">4630x</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-yes">90x</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-no">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-neutral">&nbsp;</span>
1254
+ <span class="cline-any cline-no">&nbsp;</span>
1255
+ <span class="cline-any cline-yes">90x</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-yes">90x</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-no">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-yes">90x</span>
1264
+ <span class="cline-any cline-yes">90x</span>
1265
+ <span class="cline-any cline-no">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-yes">90x</span>
1268
+ <span class="cline-any cline-yes">90x</span>
1269
+ <span class="cline-any cline-yes">90x</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-neutral">&nbsp;</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-yes">90x</span>
1286
+ <span class="cline-any cline-yes">90x</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-no">&nbsp;</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-neutral">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-neutral">&nbsp;</span>
1301
+ <span class="cline-any cline-no">&nbsp;</span>
1302
+ <span class="cline-any cline-no">&nbsp;</span>
1303
+ <span class="cline-any cline-no">&nbsp;</span>
1304
+ <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-no">&nbsp;</span>
1308
+ <span class="cline-any cline-no">&nbsp;</span>
1309
+ <span class="cline-any cline-no">&nbsp;</span>
1310
+ <span class="cline-any cline-no">&nbsp;</span>
1311
+ <span class="cline-any cline-no">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-no">&nbsp;</span>
1315
+ <span class="cline-any cline-no">&nbsp;</span>
1316
+ <span class="cline-any cline-no">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
1323
+ <span class="cline-any cline-no">&nbsp;</span>
1324
+ <span class="cline-any cline-no">&nbsp;</span>
1325
+ <span class="cline-any cline-no">&nbsp;</span>
1326
+ <span class="cline-any cline-no">&nbsp;</span>
1327
+ <span class="cline-any cline-neutral">&nbsp;</span>
1328
+ <span class="cline-any cline-no">&nbsp;</span>
1329
+ <span class="cline-any cline-no">&nbsp;</span>
1330
+ <span class="cline-any cline-no">&nbsp;</span>
1331
+ <span class="cline-any cline-neutral">&nbsp;</span>
1332
+ <span class="cline-any cline-neutral">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-neutral">&nbsp;</span>
1335
+ <span class="cline-any cline-neutral">&nbsp;</span>
1336
+ <span class="cline-any cline-neutral">&nbsp;</span>
1337
+ <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-neutral">&nbsp;</span>
1339
+ <span class="cline-any cline-yes">90x</span>
1340
+ <span class="cline-any cline-yes">90x</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-neutral">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-yes">90x</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
1359
+ <span class="cline-any cline-neutral">&nbsp;</span>
1360
+ <span class="cline-any cline-yes">90x</span>
1361
+ <span class="cline-any cline-yes">90x</span>
1362
+ <span class="cline-any cline-yes">90x</span>
1363
+ <span class="cline-any cline-neutral">&nbsp;</span>
1364
+ <span class="cline-any cline-yes">90x</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-yes">90x</span>
1367
+ <span class="cline-any cline-yes">4635x</span>
1368
+ <span class="cline-any cline-neutral">&nbsp;</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-yes">90x</span>
1373
+ <span class="cline-any cline-neutral">&nbsp;</span>
1374
+ <span class="cline-any cline-yes">90x</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-neutral">&nbsp;</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-yes">90x</span>
1379
+ <span class="cline-any cline-yes">90x</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-yes">4632x</span>
1382
+ <span class="cline-any cline-neutral">&nbsp;</span>
1383
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-neutral">&nbsp;</span>
1386
+ <span class="cline-any cline-yes">211x</span>
1387
+ <span class="cline-any cline-yes">10880x</span>
1388
+ <span class="cline-any cline-yes">10880x</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-neutral">&nbsp;</span>
1392
+ <span class="cline-any cline-neutral">&nbsp;</span>
1393
+ <span class="cline-any cline-yes">90x</span>
1394
+ <span class="cline-any cline-yes">90x</span>
1395
+ <span class="cline-any cline-yes">4632x</span>
1396
+ <span class="cline-any cline-yes">23624x</span>
1397
+ <span class="cline-any cline-neutral">&nbsp;</span>
1398
+ <span class="cline-any cline-neutral">&nbsp;</span>
1399
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
+ <span class="cline-any cline-yes">90x</span>
1401
+ <span class="cline-any cline-yes">1x</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-yes">89x</span>
1405
+ <span class="cline-any cline-yes">89x</span>
1406
+ <span class="cline-any cline-yes">2581x</span>
1407
+ <span class="cline-any cline-yes">89x</span>
1408
+ <span class="cline-any cline-yes">89x</span>
1409
+ <span class="cline-any cline-yes">712x</span>
1410
+ <span class="cline-any cline-yes">712x</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-yes">2492x</span>
1414
+ <span class="cline-any cline-neutral">&nbsp;</span>
1415
+ <span class="cline-any cline-neutral">&nbsp;</span>
1416
+ <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-neutral">&nbsp;</span>
1418
+ <span class="cline-any cline-neutral">&nbsp;</span>
1419
+ <span class="cline-any cline-neutral">&nbsp;</span>
1420
+ <span class="cline-any cline-yes">3204x</span>
1421
+ <span class="cline-any cline-yes">2586x</span>
1422
+ <span class="cline-any cline-yes">2586x</span>
1423
+ <span class="cline-any cline-yes">1620x</span>
1424
+ <span class="cline-any cline-no">&nbsp;</span>
1425
+ <span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-neutral">&nbsp;</span>
1427
+ <span class="cline-any cline-neutral">&nbsp;</span>
1428
+ <span class="cline-any cline-neutral">&nbsp;</span>
1429
+ <span class="cline-any cline-yes">2586x</span>
1430
+ <span class="cline-any cline-no">&nbsp;</span>
1431
+ <span class="cline-any cline-neutral">&nbsp;</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-neutral">&nbsp;</span>
1434
+ <span class="cline-any cline-neutral">&nbsp;</span>
1435
+ <span class="cline-any cline-neutral">&nbsp;</span>
1436
+ <span class="cline-any cline-neutral">&nbsp;</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-neutral">&nbsp;</span>
1440
+ <span class="cline-any cline-neutral">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-yes">2586x</span>
1444
+ <span class="cline-any cline-neutral">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-neutral">&nbsp;</span>
1447
+ <span class="cline-any cline-yes">2586x</span>
1448
+ <span class="cline-any cline-yes">2586x</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-neutral">&nbsp;</span>
1451
+ <span class="cline-any cline-no">&nbsp;</span>
1452
+ <span class="cline-any cline-no">&nbsp;</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-neutral">&nbsp;</span>
1455
+ <span class="cline-any cline-no">&nbsp;</span>
1456
+ <span class="cline-any cline-neutral">&nbsp;</span>
1457
+ <span class="cline-any cline-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-neutral">&nbsp;</span>
1459
+ <span class="cline-any cline-neutral">&nbsp;</span>
1460
+ <span class="cline-any cline-yes">89x</span>
1461
+ <span class="cline-any cline-yes">4582x</span>
1462
+ <span class="cline-any cline-no">&nbsp;</span>
1463
+ <span class="cline-any cline-neutral">&nbsp;</span>
1464
+ <span class="cline-any cline-neutral">&nbsp;</span>
1465
+ <span class="cline-any cline-neutral">&nbsp;</span>
1466
+ <span class="cline-any cline-neutral">&nbsp;</span>
1467
+ <span class="cline-any cline-neutral">&nbsp;</span>
1468
+ <span class="cline-any cline-neutral">&nbsp;</span>
1469
+ <span class="cline-any cline-neutral">&nbsp;</span>
1470
+ <span class="cline-any cline-neutral">&nbsp;</span>
1471
+ <span class="cline-any cline-neutral">&nbsp;</span>
1472
+ <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1474
+ <span class="cline-any cline-yes">4582x</span>
1475
+ <span class="cline-any cline-yes">4582x</span>
1476
+ <span class="cline-any cline-no">&nbsp;</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
1479
+ <span class="cline-any cline-neutral">&nbsp;</span>
1480
+ <span class="cline-any cline-neutral">&nbsp;</span>
1481
+ <span class="cline-any cline-neutral">&nbsp;</span>
1482
+ <span class="cline-any cline-neutral">&nbsp;</span>
1483
+ <span class="cline-any cline-neutral">&nbsp;</span>
1484
+ <span class="cline-any cline-neutral">&nbsp;</span>
1485
+ <span class="cline-any cline-yes">4582x</span>
1486
+ <span class="cline-any cline-no">&nbsp;</span>
1487
+ <span class="cline-any cline-neutral">&nbsp;</span>
1488
+ <span class="cline-any cline-yes">4582x</span>
1489
+ <span class="cline-any cline-no">&nbsp;</span>
1490
+ <span class="cline-any cline-neutral">&nbsp;</span>
1491
+ <span class="cline-any cline-yes">4582x</span>
1492
+ <span class="cline-any cline-no">&nbsp;</span>
1493
+ <span class="cline-any cline-yes">4582x</span>
1494
+ <span class="cline-any cline-yes">1x</span>
1495
+ <span class="cline-any cline-yes">4581x</span>
1496
+ <span class="cline-any cline-yes">18x</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-neutral">&nbsp;</span>
1500
+ <span class="cline-any cline-yes">2979x</span>
1501
+ <span class="cline-any cline-yes">2979x</span>
1502
+ <span class="cline-any cline-yes">21x</span>
1503
+ <span class="cline-any cline-neutral">&nbsp;</span>
1504
+ <span class="cline-any cline-yes">2958x</span>
1505
+ <span class="cline-any cline-neutral">&nbsp;</span>
1506
+ <span class="cline-any cline-yes">2938x</span>
1507
+ <span class="cline-any cline-neutral">&nbsp;</span>
1508
+ <span class="cline-any cline-neutral">&nbsp;</span>
1509
+ <span class="cline-any cline-neutral">&nbsp;</span>
1510
+ <span class="cline-any cline-yes">2958x</span>
1511
+ <span class="cline-any cline-no">&nbsp;</span>
1512
+ <span class="cline-any cline-neutral">&nbsp;</span>
1513
+ <span class="cline-any cline-yes">2958x</span>
1514
+ <span class="cline-any cline-neutral">&nbsp;</span>
1515
+ <span class="cline-any cline-neutral">&nbsp;</span>
1516
+ <span class="cline-any cline-yes">5937x</span>
1517
+ <span class="cline-any cline-yes">53737x</span>
1518
+ <span class="cline-any cline-yes">5937x</span>
1519
+ <span class="cline-any cline-yes">2959x</span>
1520
+ <span class="cline-any cline-neutral">&nbsp;</span>
1521
+ <span class="cline-any cline-yes">2978x</span>
1522
+ <span class="cline-any cline-neutral">&nbsp;</span>
1523
+ <span class="cline-any cline-no">&nbsp;</span>
1524
+ <span class="cline-any cline-neutral">&nbsp;</span>
1525
+ <span class="cline-any cline-yes">2978x</span>
1526
+ <span class="cline-any cline-neutral">&nbsp;</span>
1527
+ <span class="cline-any cline-neutral">&nbsp;</span>
1528
+ <span class="cline-any cline-yes">20x</span>
1529
+ <span class="cline-any cline-yes">20x</span>
1530
+ <span class="cline-any cline-neutral">&nbsp;</span>
1531
+ <span class="cline-any cline-neutral">&nbsp;</span>
1532
+ <span class="cline-any cline-neutral">&nbsp;</span>
1533
+ <span class="cline-any cline-neutral">&nbsp;</span>
1534
+ <span class="cline-any cline-neutral">&nbsp;</span>
1535
+ <span class="cline-any cline-neutral">&nbsp;</span>
1536
+ <span class="cline-any cline-yes">5168x</span>
1537
+ <span class="cline-any cline-neutral">&nbsp;</span>
1538
+ <span class="cline-any cline-neutral">&nbsp;</span>
1539
+ <span class="cline-any cline-neutral">&nbsp;</span>
1540
+ <span class="cline-any cline-yes">19x</span>
1541
+ <span class="cline-any cline-neutral">&nbsp;</span>
1542
+ <span class="cline-any cline-neutral">&nbsp;</span>
1543
+ <span class="cline-any cline-neutral">&nbsp;</span>
1544
+ <span class="cline-any cline-neutral">&nbsp;</span>
1545
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
+ <span class="cline-any cline-neutral">&nbsp;</span>
1547
+ <span class="cline-any cline-neutral">&nbsp;</span>
1548
+ <span class="cline-any cline-yes">91x</span>
1549
+ <span class="cline-any cline-neutral">&nbsp;</span>
1550
+ <span class="cline-any cline-yes">91x</span>
1551
+ <span class="cline-any cline-neutral">&nbsp;</span>
1552
+ <span class="cline-any cline-neutral">&nbsp;</span>
1553
+ <span class="cline-any cline-neutral">&nbsp;</span>
1554
+ <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-no">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1559
+ <span class="cline-any cline-neutral">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-neutral">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-no">&nbsp;</span>
1567
+ <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// this should be loaded first
1569
+ const opentelemetry = require('./lib/opentelemetry');
1570
+ const path = require('path');
1571
+ const _ = require('lodash');
1572
+ const argv = require('boring')({ end: true });
1573
+ const fs = require('fs');
1574
+ const { stripIndent } = require('common-tags');
1575
+ const cluster = require('cluster');
1576
+ const { cpus } = require('os');
1577
+ const process = require('process');
1578
+ const npmResolve = require('resolve');
1579
+ const glob = require('glob');
1580
+ &nbsp;
1581
+ let defaults = require('./defaults.js');
1582
+ &nbsp;
1583
+ // ## Top-level options
1584
+ //
1585
+ // `cluster`
1586
+ //
1587
+ // If set to `true`, Apostrophe will spawn as many processes as
1588
+ // there are CPU cores on the server, or a minimum of 2, and balance
1589
+ // incoming connections among them. This ensures availability while one
1590
+ // process is restarting due to a crash and also increases scalability if
1591
+ // the server has multiple CPU cores.
1592
+ //
1593
+ // If set to an object with a `processes` property, that many
1594
+ // processes are started. If `processes` is 0 or a negative number,
1595
+ // it is added to the number of CPU cores reported by the server.
1596
+ // Notably, `-1` can be a good way to reserve one CPU core for MongoDB
1597
+ // in a single-server deployment.
1598
+ //
1599
+ // However when in cluster mode no fewer than 2 processes will be
1600
+ // started as there is no availability benefit without at least 2.
1601
+ //
1602
+ // If a child process exits with a failure status code it will be
1603
+ // restarted. However, if it exits in less than 20 seconds after
1604
+ // startup there will be a 20 second delay to avoid flooding logs
1605
+ // and pinning the CPU.
1606
+ //
1607
+ // Alternatively the `APOS_CLUSTER_PROCESSES` environment variable
1608
+ // can be set to a number, which will effectively set the cluster
1609
+ // option to `cluster: { processes: n }`.
1610
+ //
1611
+ // `openTelemetryProvider`
1612
+ //
1613
+ // If set, Apostrophe will register it as a global OpenTelemetry tracer provider.
1614
+ // The expected value is an object, an instance of TracerProvider.
1615
+ // If the Node SDK is used in the application instead of manual configuration,
1616
+ // the provider instance is only available as a
1617
+ // private property: `sdkInstance._tracerProvider`. An issue can be opened
1618
+ // to discuss the exposure of a public getter with the OpenTelemetry developers.
1619
+ //
1620
+ // `beforeExit`
1621
+ //
1622
+ // If set, Apostrophe will invoke it (await) before invoking process.exit.
1623
+ // `beforeExit` may be an async function, will be awaited, and takes no arguments.
1624
+ //
1625
+ // ## Awaiting the Apostrophe function
1626
+ //
1627
+ // The apos function is async, but in typical cases you do not
1628
+ // need to await it. If you simply call it, Apostrophe will
1629
+ // start up and listen for connections forever, or run a
1630
+ // task and exit, as appropriate. On failure, the error is
1631
+ // printed to stderr and the process exits.
1632
+ //
1633
+ // If you do `await` the function, then your code will continue
1634
+ // after apostrophe successfully begins listening for
1635
+ // connections. However note it will still exit on errors.
1636
+ //
1637
+ // To avoid exiting on errors, pass the `exit: false` option.
1638
+ // This can option also can be used to allow awaiting a command line
1639
+ // task, as they also normally exit on completion.
1640
+ //
1641
+ // If `options.cluster` is truthy, the function quickly resolves to
1642
+ // `null` in the primary process. In the child process it resolves as
1643
+ // documented above.
1644
+ &nbsp;
1645
+ // The actual entry point, a wrapper that enables the telemetry and starts the
1646
+ // root span
1647
+ module.exports = async function(options) {
1648
+ const telemetry = opentelemetry(options);
1649
+ let spanName = 'apostrophe:boot';
1650
+ const guardTime = 20000;
1651
+ &nbsp;
1652
+ // Detect cluster options
1653
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (process.env.APOS_CLUSTER_PROCESSES) {
1654
+ <span class="cstat-no" title="statement not covered" > options.cluster = {</span>
1655
+ processes: parseInt(process.env.APOS_CLUSTER_PROCESSES)
1656
+ };
1657
+ }
1658
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.cluster &amp;&amp; (<span class="branch-1 cbranch-no" title="branch not covered" >process.env.NODE_ENV !== 'production')</span>) {
1659
+ <span class="cstat-no" title="statement not covered" > console.log('NODE_ENV is not set to production, disabling cluster mode');</span>
1660
+ <span class="cstat-no" title="statement not covered" > options.cluster = false;</span>
1661
+ }
1662
+ &nbsp;
1663
+ // Execute if cluster enabled
1664
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.cluster &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!argv._.length)</span> {
1665
+ // For bc with node 14 and below we need to check both
1666
+ <span class="cstat-no" title="statement not covered" > if (cluster.isPrimary || cluster.isMaster) {</span>
1667
+ // Activate and return the callback return value
1668
+ <span class="cstat-no" title="statement not covered" > return telemetry.startActiveSpan(`${spanName}:primary`, <span class="fstat-no" title="function not covered" >as</span>ync (span) =&gt; {</span>
1669
+ let processes = <span class="cstat-no" title="statement not covered" >options.cluster.processes || cpus().length;</span>
1670
+ <span class="cstat-no" title="statement not covered" > if (processes &lt;= 0) {</span>
1671
+ <span class="cstat-no" title="statement not covered" > processes = cpus().length + processes;</span>
1672
+ }
1673
+ let capped = <span class="cstat-no" title="statement not covered" >'';</span>
1674
+ <span class="cstat-no" title="statement not covered" > if (processes &gt; cpus().length) {</span>
1675
+ <span class="cstat-no" title="statement not covered" > processes = cpus().length;</span>
1676
+ <span class="cstat-no" title="statement not covered" > capped = ' (capped to number of CPU cores)';</span>
1677
+ }
1678
+ <span class="cstat-no" title="statement not covered" > if (processes &lt; 2) {</span>
1679
+ <span class="cstat-no" title="statement not covered" > processes = 2;</span>
1680
+ <span class="cstat-no" title="statement not covered" > if (capped) {</span>
1681
+ <span class="cstat-no" title="statement not covered" > capped = ' (less than 2 cores, capped to minimum of 2)';</span>
1682
+ } else {
1683
+ <span class="cstat-no" title="statement not covered" > capped = ' (using minimum of 2)';</span>
1684
+ }
1685
+ }
1686
+ <span class="cstat-no" title="statement not covered" > console.log(`Starting ${processes} cluster child processes${capped}`);</span>
1687
+ <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; processes; i++) {</span>
1688
+ <span class="cstat-no" title="statement not covered" > clusterFork();</span>
1689
+ }
1690
+ <span class="cstat-no" title="statement not covered" > cluster.on('exit', <span class="fstat-no" title="function not covered" >(w</span>orker, code, signal) =&gt; {</span>
1691
+ <span class="cstat-no" title="statement not covered" > if (code !== 0) {</span>
1692
+ <span class="cstat-no" title="statement not covered" > if ((Date.now() - worker.bornAt) &lt; guardTime) {</span>
1693
+ <span class="cstat-no" title="statement not covered" > console.error(`Worker process ${worker.process.pid} failed in ${seconds(Date.now() - worker.bornAt)}, waiting ${seconds(guardTime)} before restart`);</span>
1694
+ <span class="cstat-no" title="statement not covered" > setTimeout(<span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1695
+ <span class="cstat-no" title="statement not covered" > respawn(worker);</span>
1696
+ }, guardTime);
1697
+ } else {
1698
+ <span class="cstat-no" title="statement not covered" > respawn(worker);</span>
1699
+ }
1700
+ }
1701
+ });
1702
+ <span class="cstat-no" title="statement not covered" > span.end();</span>
1703
+ <span class="cstat-no" title="statement not covered" > if (typeof options.beforeExit === 'function') {</span>
1704
+ <span class="cstat-no" title="statement not covered" > await options.beforeExit();</span>
1705
+ }
1706
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1707
+ });
1708
+ } else {
1709
+ // continue as a worker operation, the pid should be recorded by the auto instrumentation
1710
+ <span class="cstat-no" title="statement not covered" > spanName += ':worker';</span>
1711
+ <span class="cstat-no" title="statement not covered" > console.log(`Cluster worker ${process.pid} started`);</span>
1712
+ }
1713
+ }
1714
+ &nbsp;
1715
+ // Create and activate the root span for the boot tracer
1716
+ const self = await telemetry.startActiveSpan(spanName, async (span) =&gt; {
1717
+ const res = await apostrophe(options, telemetry, span);
1718
+ span.setStatus(telemetry.api.SpanStatusCode.OK);
1719
+ span.end();
1720
+ return res;
1721
+ });
1722
+ &nbsp;
1723
+ return self;
1724
+ };
1725
+ &nbsp;
1726
+ // The actual apostrophe bootstrap
1727
+ async function apostrophe(options, telemetry, rootSpan) {
1728
+ // The core is not a true moog object but it must look enough like one
1729
+ // to participate as an async event emitter
1730
+ const self = {
1731
+ __meta: {
1732
+ name: 'apostrophe'
1733
+ }
1734
+ };
1735
+ &nbsp;
1736
+ // Terminates the process. Emits the `apostrophe:beforeExit` async event;
1737
+ // use this mechanism to invoke any pre-exit application level tasks. Any
1738
+ // `beforeExit` handler errors will be ignored.
1739
+ // Invokes and awaits `options.beforeExit` function if available,
1740
+ // passing as arguments the exit code and message (if any).
1741
+ self._exit = <span class="fstat-no" title="function not covered" >as</span>ync function(code = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span> message) {
1742
+ <span class="cstat-no" title="statement not covered" > try {</span>
1743
+ <span class="cstat-no" title="statement not covered" > if (self.emit) {</span>
1744
+ <span class="cstat-no" title="statement not covered" > await self.emit('beforeExit');</span>
1745
+ }
1746
+ } catch (e) {
1747
+ // we are at the point where errors are ignored,
1748
+ // if emitter is already registered, all handler errors
1749
+ // are already recorded by the event module instrumentation
1750
+ <span class="cstat-no" title="statement not covered" > console.error('beforeExit emit error', e);</span>
1751
+ }
1752
+ &nbsp;
1753
+ <span class="cstat-no" title="statement not covered" > if (code !== 0) {</span>
1754
+ <span class="cstat-no" title="statement not covered" > telemetry.handleError(rootSpan, message);</span>
1755
+ } else {
1756
+ <span class="cstat-no" title="statement not covered" > rootSpan.setStatus({</span>
1757
+ code: telemetry.api.SpanStatusCode.OK,
1758
+ message
1759
+ });
1760
+ }
1761
+ <span class="cstat-no" title="statement not covered" > rootSpan.end();</span>
1762
+ &nbsp;
1763
+ <span class="cstat-no" title="statement not covered" > if (typeof options.beforeExit === 'function') {</span>
1764
+ <span class="cstat-no" title="statement not covered" > try {</span>
1765
+ <span class="cstat-no" title="statement not covered" > await options.beforeExit(code, message);</span>
1766
+ } catch (e) {
1767
+ <span class="cstat-no" title="statement not covered" > console.error('beforeExit handler error', e);</span>
1768
+ }
1769
+ }
1770
+ <span class="cstat-no" title="statement not covered" > process.exit(code);</span>
1771
+ };
1772
+ &nbsp;
1773
+ try {
1774
+ const matches = process.version.match(/^v(\d+)/);
1775
+ const version = parseInt(matches[1]);
1776
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (version &lt; 12) {
1777
+ <span class="cstat-no" title="statement not covered" > throw new Error('Apostrophe 3.x requires at least Node.js 12.x.');</span>
1778
+ }
1779
+ // The core must have a reference to itself in order to use the
1780
+ // promise event emitter code
1781
+ self.apos = self;
1782
+ &nbsp;
1783
+ // Register the telemetry API as a pseudo module
1784
+ self.apos.telemetry = telemetry;
1785
+ &nbsp;
1786
+ Object.assign(self, require('./modules/@apostrophecms/module/lib/events.js')(self));
1787
+ &nbsp;
1788
+ // Determine root module and root directory
1789
+ self.root = options.root || getRoot();
1790
+ self.rootDir = options.rootDir || path.dirname(self.root.filename);
1791
+ self.npmRootDir = options.npmRootDir || self.rootDir;
1792
+ &nbsp;
1793
+ testModule();
1794
+ &nbsp;
1795
+ self.options = mergeConfiguration(options, defaults);
1796
+ autodetectBundles();
1797
+ acceptGlobalOptions();
1798
+ &nbsp;
1799
+ // Module-based async events (self.on and self.emit of each module,
1800
+ // handlers are usually registered via `handlers` in the module
1801
+ // definition rather than `self.on`)
1802
+ self.eventHandlers = {};
1803
+ &nbsp;
1804
+ // Destroys the Apostrophe object, freeing resources such as
1805
+ // HTTP server ports and database connections. Does **not**
1806
+ // delete any data; the persistent database and media files
1807
+ // remain available for the next startup. Emits the
1808
+ // `apostrophe:destroy` async event; use this mechanism to free your own
1809
+ // server-side resources that could prevent garbage
1810
+ // collection by the JavaScript engine, such as timers
1811
+ // and intervals.
1812
+ self.destroy = async function() {
1813
+ await self.emit('destroy');
1814
+ };
1815
+ &nbsp;
1816
+ // Returns true if Apostrophe is running as a command line task
1817
+ // rather than as a server
1818
+ self.isTask = function() {
1819
+ return !!self.argv._.length;
1820
+ };
1821
+ &nbsp;
1822
+ // Returns an array of modules that are instances of the given
1823
+ // module name, i.e. they are of that type or they extend it.
1824
+ // For instance, `apos.instancesOf('@apostrophecms/piece-type')` returns
1825
+ // an array of active modules in your project that extend
1826
+ // pieces, such as `@apostrophecms/user` and
1827
+ // your own piece types
1828
+ &nbsp;
1829
+ self.instancesOf = <span class="fstat-no" title="function not covered" >fu</span>nction(name) {
1830
+ <span class="cstat-no" title="statement not covered" > return _.filter(self.modules, <span class="fstat-no" title="function not covered" >fu</span>nction(module) {</span>
1831
+ <span class="cstat-no" title="statement not covered" > return self.synth.instanceOf(module, name);</span>
1832
+ });
1833
+ };
1834
+ &nbsp;
1835
+ // Returns true if the object is an instance of the given
1836
+ // moog class name or a subclass thereof. A convenience wrapper
1837
+ // for `apos.synth.instanceOf`
1838
+ &nbsp;
1839
+ self.instanceOf = function(object, name) {
1840
+ return self.synth.instanceOf(object, name);
1841
+ };
1842
+ &nbsp;
1843
+ // So the asset module can figure out what other modules
1844
+ // are out there and what icons they need without
1845
+ // actually instantiating them
1846
+ self.modulesToBeInstantiated = modulesToBeInstantiated;
1847
+ self.eventAliases = {};
1848
+ self.aliasEvent('modulesReady', 'modulesRegistered');
1849
+ self.aliasEvent('afterInit', 'ready');
1850
+ &nbsp;
1851
+ defineModules();
1852
+ &nbsp;
1853
+ await instantiateModules();
1854
+ lintModules();
1855
+ await self.emit('modulesRegistered'); // formerly modulesReady
1856
+ self.apos.schema.validateAllSchemas();
1857
+ self.apos.schema.registerAllSchemas();
1858
+ await self.apos.lock.withLock('@apostrophecms/migration:migrate', async () =&gt; {
1859
+ await self.apos.migration.migrate(); // emits before and after events, inside the lock
1860
+ await self.apos.global.insertIfMissing();
1861
+ await self.apos.page.implementParkAllInDefaultLocale();
1862
+ await self.apos.doc.replicate(); // emits beforeReplicate and afterReplicate events
1863
+ // Replicate will have created the parked pages across locales if needed, but we may
1864
+ // still need to reset parked properties
1865
+ await self.apos.page.implementParkAllInOtherLocales();
1866
+ });
1867
+ await self.emit('ready'); // formerly afterInit
1868
+ &nbsp;
1869
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (self.taskRan) {
1870
+ <span class="cstat-no" title="statement not covered" > await self._exit();</span>
1871
+ } else {
1872
+ const after = { exit: null };
1873
+ await self.emit('run', self.isTask(), after);
1874
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (after.exit !== null) {
1875
+ <span class="cstat-no" title="statement not covered" > await self._exit(after.exit);</span>
1876
+ }
1877
+ }
1878
+ &nbsp;
1879
+ return self;
1880
+ } catch (e) {
1881
+ <span class="cstat-no" title="statement not covered" > if (options.exit !== false) {</span>
1882
+ <span class="cstat-no" title="statement not covered" > console.error(e);</span>
1883
+ <span class="cstat-no" title="statement not covered" > await self._exit(1, e);</span>
1884
+ }
1885
+ }
1886
+ &nbsp;
1887
+ // SUPPORTING FUNCTIONS BEGIN HERE
1888
+ &nbsp;
1889
+ // Merge configuration from defaults, data/local.js and app.js
1890
+ function mergeConfiguration(options, defaults) {
1891
+ let config = {};
1892
+ let local = {};
1893
+ const localPath = options.__localPath || '/data/local.js';
1894
+ const reallyLocalPath = self.rootDir + localPath;
1895
+ &nbsp;
1896
+ if (fs.existsSync(reallyLocalPath)) {
1897
+ local = require(reallyLocalPath);
1898
+ }
1899
+ &nbsp;
1900
+ // Otherwise making a second apos instance
1901
+ // uses the same modified defaults object
1902
+ &nbsp;
1903
+ config = _.cloneDeep(options.__testDefaults || defaults);
1904
+ &nbsp;
1905
+ _.merge(config, options);
1906
+ &nbsp;
1907
+ if (typeof (local) === 'function') {
1908
+ if (local.length === 1) {
1909
+ _.merge(config, local(self));
1910
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>if (local.length === 2) {
1911
+ local(self, config);
1912
+ } else {
1913
+ <span class="cstat-no" title="statement not covered" > throw new Error('data/local.js may export an object, a function that takes apos as an argument and returns an object, OR a function that takes apos and config as objects and directly modifies config');</span>
1914
+ }
1915
+ } else {
1916
+ _.merge(config, local || <span class="branch-1 cbranch-no" title="branch not covered" >{})</span>;
1917
+ }
1918
+ &nbsp;
1919
+ return config;
1920
+ }
1921
+ &nbsp;
1922
+ function getRoot() {
1923
+ let _module = module;
1924
+ let m = _module;
1925
+ while (m.parent &amp;&amp; m.parent.filename) {
1926
+ // The test file is the root as far as we are concerned,
1927
+ // not mocha itself
1928
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (m.parent.filename.match(/\/node_modules\/mocha\//)) {
1929
+ <span class="cstat-no" title="statement not covered" > return m;</span>
1930
+ }
1931
+ m = m.parent;
1932
+ _module = m;
1933
+ }
1934
+ return _module;
1935
+ }
1936
+ &nbsp;
1937
+ function nestedModuleSubdirs() {
1938
+ if (!options.nestedModuleSubdirs) {
1939
+ return;
1940
+ }
1941
+ const configs = glob.sync(self.localModules + '/**/modules.js');
1942
+ _.each(configs, function(config) {
1943
+ try {
1944
+ _.merge(self.options.modules, require(config));
1945
+ } catch (e) {
1946
+ <span class="cstat-no" title="statement not covered" > console.error(stripIndent`</span>
1947
+ When nestedModuleSubdirs is active, any modules.js file beneath:
1948
+ &nbsp;
1949
+ ${self.localModules}
1950
+ &nbsp;
1951
+ must export an object containing configuration for Apostrophe modules.
1952
+ &nbsp;
1953
+ The file:
1954
+ &nbsp;
1955
+ ${config}
1956
+ &nbsp;
1957
+ did not parse.
1958
+ `);
1959
+ <span class="cstat-no" title="statement not covered" > throw e;</span>
1960
+ }
1961
+ });
1962
+ }
1963
+ &nbsp;
1964
+ function autodetectBundles() {
1965
+ const modules = _.keys(self.options.modules);
1966
+ _.each(modules, function(name) {
1967
+ const path = getNpmPath(name);
1968
+ if (!path) {
1969
+ return;
1970
+ }
1971
+ const module = require(path);
1972
+ if (module.bundle) {
1973
+ self.options.bundles = (self.options.bundles || []).concat(name);
1974
+ _.each(module.bundle.modules, function(name) {
1975
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!_.has(self.options.modules, name)) {
1976
+ const bundledModule = <span class="cstat-no" title="statement not covered" >require(require('path').dirname(path) + '/' + module.bundle.directory + '/' + name);</span>
1977
+ <span class="cstat-no" title="statement not covered" > if (bundledModule.improve) {</span>
1978
+ <span class="cstat-no" title="statement not covered" > self.options.modules[name] = {};</span>
1979
+ }
1980
+ }
1981
+ });
1982
+ }
1983
+ });
1984
+ }
1985
+ &nbsp;
1986
+ function getNpmPath(name) {
1987
+ const parentPath = path.resolve(self.npmRootDir);
1988
+ try {
1989
+ return npmResolve.sync(name, { basedir: parentPath });
1990
+ } catch (e) {
1991
+ // Not found via npm. This does not mean it doesn't
1992
+ // exist as a project-level thing
1993
+ return null;
1994
+ }
1995
+ }
1996
+ &nbsp;
1997
+ function acceptGlobalOptions() {
1998
+ // Truly global options not specific to a module
1999
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (options.testModule) {
2000
+ // Test command lines have arguments not
2001
+ // intended as command line task arguments
2002
+ <span class="cstat-no" title="statement not covered" > self.argv = {</span>
2003
+ _: []
2004
+ };
2005
+ <span class="cstat-no" title="statement not covered" > self.options.shortName = self.options.shortName || 'test';</span>
2006
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>if (options.argv) {
2007
+ // Allow injection of any set of command line arguments.
2008
+ // Useful with multiple instances
2009
+ self.argv = options.argv;
2010
+ } else {
2011
+ <span class="cstat-no" title="statement not covered" > self.argv = argv;</span>
2012
+ }
2013
+ &nbsp;
2014
+ self.shortName = self.options.shortName;
2015
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!self.shortName) {
2016
+ <span class="cstat-no" title="statement not covered" > throw 'Specify the `shortName` option and set it to the name of your project\'s repository or folder';</span>
2017
+ }
2018
+ self.title = self.options.title;
2019
+ self.baseUrl = self.options.baseUrl;
2020
+ self.prefix = self.options.prefix || '';
2021
+ }
2022
+ &nbsp;
2023
+ // Tweak the Apostrophe environment suitably for
2024
+ // unit testing a separate npm module that extends
2025
+ // Apostrophe, like @apostrophecms/workflow. For instance,
2026
+ // a node_modules subdirectory with a symlink to the
2027
+ // module itself is created so that the module can
2028
+ // be found by Apostrophe during testing. Invoked
2029
+ // when options.testModule is true. There must be a
2030
+ // test/ or tests/ subdir of the module containing
2031
+ // a test.js file that runs under mocha via devDependencies.
2032
+ // If `options.testModule` is a string it will be used as a
2033
+ // namespace for the test module.
2034
+ &nbsp;
2035
+ function testModule() {
2036
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!options.testModule) {
2037
+ return;
2038
+ }
2039
+ <span class="cstat-no" title="statement not covered" > if (!options.shortName) {</span>
2040
+ <span class="cstat-no" title="statement not covered" > options.shortName = 'test';</span>
2041
+ }
2042
+ <span class="cstat-no" title="statement not covered" > defaults = _.cloneDeep(defaults);</span>
2043
+ <span class="cstat-no" title="statement not covered" > _.defaults(defaults, {</span>
2044
+ '@apostrophecms/express': {}
2045
+ });
2046
+ <span class="cstat-no" title="statement not covered" > _.defaults(defaults['@apostrophecms/express'], {</span>
2047
+ port: 7900,
2048
+ secret: 'irrelevant'
2049
+ });
2050
+ const m = <span class="cstat-no" title="statement not covered" >findTestModule();</span>
2051
+ // Allow tests to be in test/ or in tests/
2052
+ const testDir = <span class="cstat-no" title="statement not covered" >require('path').dirname(m.filename);</span>
2053
+ const moduleDir = <span class="cstat-no" title="statement not covered" >testDir.replace(/\/tests?$/, '');</span>
2054
+ <span class="cstat-no" title="statement not covered" > if (testDir === moduleDir) {</span>
2055
+ <span class="cstat-no" title="statement not covered" > throw new Error('Test file must be in test/ or tests/ subdirectory of module');</span>
2056
+ }
2057
+ &nbsp;
2058
+ const pkgName = <span class="cstat-no" title="statement not covered" >require(`${moduleDir}/package.json`).name;</span>
2059
+ let pkgNamespace = <span class="cstat-no" title="statement not covered" >'';</span>
2060
+ <span class="cstat-no" title="statement not covered" > if (pkgName.includes('/')) {</span>
2061
+ const parts = <span class="cstat-no" title="statement not covered" >pkgName.split('/');</span>
2062
+ <span class="cstat-no" title="statement not covered" > pkgNamespace = '/' + parts.slice(0, parts.length - 1).join('/');</span>
2063
+ }
2064
+ &nbsp;
2065
+ <span class="cstat-no" title="statement not covered" > if (!fs.existsSync(testDir + '/node_modules')) {</span>
2066
+ <span class="cstat-no" title="statement not covered" > fs.mkdirSync(testDir + '/node_modules' + pkgNamespace, { recursive: true });</span>
2067
+ <span class="cstat-no" title="statement not covered" > fs.symlinkSync(moduleDir, testDir + '/node_modules/' + pkgName, 'dir');</span>
2068
+ }
2069
+ &nbsp;
2070
+ // Not quite superfluous: it'll return self.root, but
2071
+ // it also makes sure we encounter mocha along the way
2072
+ // and throws an exception if we don't
2073
+ function <span class="fstat-no" title="function not covered" >findTestModule(</span>) {
2074
+ let m = <span class="cstat-no" title="statement not covered" >module;</span>
2075
+ <span class="cstat-no" title="statement not covered" > while (m) {</span>
2076
+ <span class="cstat-no" title="statement not covered" > if (m.parent &amp;&amp; m.parent.filename.match(/node_modules\/mocha/)) {</span>
2077
+ <span class="cstat-no" title="statement not covered" > return m;</span>
2078
+ }
2079
+ <span class="cstat-no" title="statement not covered" > m = m.parent;</span>
2080
+ <span class="cstat-no" title="statement not covered" > if (!m) {</span>
2081
+ <span class="cstat-no" title="statement not covered" > throw new Error('mocha does not seem to be running, is this really a test?');</span>
2082
+ }
2083
+ }
2084
+ }
2085
+ }
2086
+ &nbsp;
2087
+ function defineModules() {
2088
+ // Set moog-require up to create our module manager objects
2089
+ &nbsp;
2090
+ self.localModules = self.options.modulesSubdir || self.options.__testLocalModules || (self.rootDir + '/modules');
2091
+ const synth = require('./lib/moog-require')({
2092
+ root: self.root,
2093
+ bundles: [ 'apostrophe' ].concat(self.options.bundles || []),
2094
+ localModules: self.localModules,
2095
+ defaultBaseClass: '@apostrophecms/module',
2096
+ sections: [ 'helpers', 'handlers', 'routes', 'apiRoutes', 'restApiRoutes', 'renderRoutes', 'middleware', 'customTags', 'components', 'tasks' ],
2097
+ nestedModuleSubdirs: self.options.nestedModuleSubdirs,
2098
+ unparsedSections: [
2099
+ 'queries',
2100
+ 'extendQueries',
2101
+ 'icons',
2102
+ 'i18n',
2103
+ 'webpack'
2104
+ ]
2105
+ });
2106
+ &nbsp;
2107
+ self.synth = synth;
2108
+ &nbsp;
2109
+ // Just like on the browser side, we can
2110
+ // call apos.define rather than apos.synth.define
2111
+ self.define = self.synth.define;
2112
+ self.redefine = self.synth.redefine;
2113
+ self.create = self.synth.create;
2114
+ &nbsp;
2115
+ nestedModuleSubdirs();
2116
+ &nbsp;
2117
+ _.each(self.options.modules, function(options, name) {
2118
+ synth.define(name, options);
2119
+ });
2120
+ &nbsp;
2121
+ // Apostrophe prefers that any improvements to @apostrophecms/global
2122
+ // be applied before any project level version of @apostrophecms/global
2123
+ synth.applyImprovementsBeforeProjectLevel();
2124
+ &nbsp;
2125
+ return synth;
2126
+ }
2127
+ &nbsp;
2128
+ async function instantiateModules() {
2129
+ self.modules = {};
2130
+ for (const item of modulesToBeInstantiated()) {
2131
+ // module registers itself in self.modules
2132
+ await self.synth.create(item, { apos: self });
2133
+ }
2134
+ }
2135
+ &nbsp;
2136
+ function modulesToBeInstantiated() {
2137
+ return Object.keys(self.options.modules).filter(name =&gt; {
2138
+ const improvement = self.synth.isImprovement(name);
2139
+ return !(self.options.modules[name] &amp;&amp; (improvement || self.options.modules[name].instantiate === false));
2140
+ });
2141
+ }
2142
+ &nbsp;
2143
+ function lintModules() {
2144
+ const validSteps = [];
2145
+ for (const module of Object.values(self.modules)) {
2146
+ for (const step of module.__meta.chain) {
2147
+ validSteps.push(step.name);
2148
+ }
2149
+ }
2150
+ &nbsp;
2151
+ if (!fs.existsSync(self.localModules)) {
2152
+ return;
2153
+ }
2154
+ &nbsp;
2155
+ const dirs = fs.readdirSync(self.localModules);
2156
+ for (const dir of dirs) {
2157
+ if (dir.match(/^@/)) {
2158
+ const nsDirs = fs.readdirSync(`${self.localModules}/${dir}`);
2159
+ for (let nsDir of nsDirs) {
2160
+ nsDir = `${dir}/${nsDir}`;
2161
+ testDir(nsDir);
2162
+ }
2163
+ } else {
2164
+ testDir(dir);
2165
+ }
2166
+ }
2167
+ function testDir(name) {
2168
+ // Projects that have different theme modules activated at different times
2169
+ // are a frequent source of false positives for this warning, so ignore
2170
+ // seemingly unused modules with "theme" in the name
2171
+ if (!validSteps.includes(name)) {
2172
+ try {
2173
+ const submodule = require(require('path').resolve(`${self.localModules}/${name}`));
2174
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (submodule &amp;&amp; submodule.options &amp;&amp; submodule.options.ignoreUnusedFolderWarning) {
2175
+ <span class="cstat-no" title="statement not covered" > return;</span>
2176
+ }
2177
+ } catch (e) {
2178
+ // index.js might not exist, that's fine for our purposes
2179
+ }
2180
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (name.match(/^apostrophe-/)) {
2181
+ <span class="cstat-no" title="statement not covered" > warn(</span>
2182
+ 'namespace-apostrophe-modules',
2183
+ stripIndent`
2184
+ You have a ${self.localModules}/${name} folder.
2185
+ You are probably trying to configure an official Apostrophe module, but those
2186
+ are namespaced now. Your directory should be renamed
2187
+ ${self.localModules}/${name.replace(/^apostrophe-/, '@apostrophecms/')}
2188
+ &nbsp;
2189
+ If you get this warning for your own, original module, do not use the
2190
+ "apostrophe-" prefix. It is reserved.
2191
+ `
2192
+ );
2193
+ } else {
2194
+ warn('orphan-modules', `You have a ${self.localModules}/${name} folder, but that module is not activated in app.js and it is not a base class of any other active module. Right now that code doesn't do anything.`);
2195
+ }
2196
+ }
2197
+ function warn(name, message) {
2198
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (self.util) {
2199
+ self.util.warnDevOnce(name, message);
2200
+ } else {
2201
+ // apos.util not in play, this can be the case in our bootstrap tests
2202
+ <span class="cstat-no" title="statement not covered" > if (self.argv[`ignore-${name}`]) {</span>
2203
+ <span class="cstat-no" title="statement not covered" > return;</span>
2204
+ }
2205
+ /* eslint-disable-next-line no-console */
2206
+ <span class="cstat-no" title="statement not covered" > console.warn(message);</span>
2207
+ }
2208
+ }
2209
+ }
2210
+ &nbsp;
2211
+ for (const [ name, module ] of Object.entries(self.modules)) {
2212
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (name.match(/^apostrophe-/)) {
2213
+ <span class="cstat-no" title="statement not covered" > self.util.warnDevOnce(</span>
2214
+ 'namespace-apostrophe-modules',
2215
+ stripIndent`
2216
+ You have configured an ${name} module.
2217
+ You are probably trying to configure an official Apostrophe module, but those
2218
+ are namespaced now. Your module should be renamed ${name.replace(/^apostrophe-/, '@apostrophecms/')}
2219
+ &nbsp;
2220
+ If you get this warning for your own original module, do not use the
2221
+ "apostrophe-" prefix. It is reserved.
2222
+ `
2223
+ );
2224
+ }
2225
+ const moduleNameRegex = /\./;
2226
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (name.match(moduleNameRegex)) {
2227
+ <span class="cstat-no" title="statement not covered" > self.util.warnDevOnce(</span>
2228
+ 'module-name-periods',
2229
+ stripIndent`
2230
+ You have configured a module named ${name}.
2231
+ Modules names may not include periods. Please change this to avoid bugs.
2232
+ `
2233
+ );
2234
+ }
2235
+ &nbsp;
2236
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (module.options.extends &amp;&amp; (<span class="branch-1 cbranch-no" title="branch not covered" >(typeof module.options.extends) === 'string')</span>) {
2237
+ <span class="cstat-no" title="statement not covered" > lint(`The module ${name} contains an "extends" option. This is probably a\nmistake. In Apostrophe "extend" is used to extend other modules.`);</span>
2238
+ }
2239
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (module.options.singletonWarningIfNot &amp;&amp; (<span class="branch-1 cbranch-no" title="branch not covered" >name !== module.options.singletonWarningIfNot)</span>) {
2240
+ <span class="cstat-no" title="statement not covered" > lint(`The module ${name} extends ${module.options.singletonWarningIfNot}, which is normally\na singleton (Apostrophe creates only one instance of it). Two competing\ninstances will lead to problems. If you are adding project-level code to it,\njust use modules/${module.options.singletonWarningIfNot}/index.js and do not use "extend".\nIf you are improving it via an npm module, use "improve" rather than "extend".\nIf neither situation applies you should probably just make a new module that does\nnot extend anything.\n\nIf you are sure you know what you are doing, you can set the\nsingletonWarningIfNot: false option for this module.`);</span>
2241
+ }
2242
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (name.match(/-widget$/) &amp;&amp; (!extending(module)) &amp;&amp; (<span class="branch-2 cbranch-no" title="branch not covered" >!module.options.ignoreNoExtendWarning)</span>) {
2243
+ <span class="cstat-no" title="statement not covered" > lint(`The module ${name} does not extend anything.\n\nA -widget module usually extends @apostrophecms/widget-type or another widget type.\nOr possibly you forgot to npm install something.\n\nIf you are sure you are doing the right thing, set the\nignoreNoExtendWarning option to true for this module.`);</span>
2244
+ } else if (name.match(/-page$/) &amp;&amp; (name !== '@apostrophecms/page') &amp;&amp; (!extending(module)) &amp;&amp; (!module.options.ignoreNoExtendWarning)) {
2245
+ lint(`The module ${name} does not extend anything.\n\nA -page module usually extends @apostrophecms/page-type or\n@apostrophecms/piece-page-type or another page type.\nOr possibly you forgot to npm install something.\n\nIf you are sure you are doing the right thing, set the\nignoreNoExtendWarning option to true for this module.`);
2246
+ } else if ((!extending(module)) &amp;&amp; (!hasCode(name)) &amp;&amp; (!isBundle(name)) &amp;&amp; (!module.options.ignoreNoCodeWarning)) {
2247
+ lint(`The module ${name} does not extend anything and does not have any code.\n\nThis usually means that you:\n\n1. Forgot to "extend" another module\n2. Configured a module that comes from npm without npm installing it\n3. Simply haven't written your "index.js" yet\n\nIf you really want a module with no code, set the ignoreNoCodeWarning option\nto true for this module.`);
2248
+ }
2249
+ }
2250
+ function hasCode(name) {
2251
+ let d = self.synth.definitions[name];
2252
+ if (doesWork(d)) {
2253
+ return true;
2254
+ }
2255
+ if (self.synth.isMy(d.__meta.name)) {
2256
+ // None at project level, but maybe at npm level, look there
2257
+ d = d.extend;
2258
+ }
2259
+ // If we got to the base class of all modules, the module
2260
+ // has no construct of its own
2261
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (self.synth.myToOriginal(d.__meta.name) === '@apostrophecms/module') {
2262
+ <span class="cstat-no" title="statement not covered" > return false;</span>
2263
+ }
2264
+ return doesWork(d);
2265
+ }
2266
+ function doesWork(d) {
2267
+ const countsAsWork = [ 'routes', 'apiRoutes', 'renderRoutes', 'renderRoutes', 'init', 'methods', 'beforeSuperClass', 'handlers', 'helpers', 'restApiRoutes', 'middleware', 'customTags', 'components', 'tasks' ];
2268
+ const code = countsAsWork.find(property =&gt; d[property]);
2269
+ if (code) {
2270
+ return true;
2271
+ }
2272
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (d.__meta.dirname &amp;&amp; (fs.existsSync(`${d.__meta.dirname}/ui/apos`) || fs.existsSync(`${d.__meta.dirname}/ui/src`) || fs.existsSync(`${d.__meta.dirname}/ui/public`))) {
2273
+ // Assets that will be bundled, instead of server code
2274
+ <span class="cstat-no" title="statement not covered" > return true;</span>
2275
+ }
2276
+ return false;
2277
+ }
2278
+ function isBundle(name) {
2279
+ const d = self.synth.definitions[name];
2280
+ return d.bundle || (d.extend &amp;&amp; d.extend.bundle);
2281
+ }
2282
+ function extending(module) {
2283
+ // If the module extends no other module, then it will
2284
+ // have up to four entries in its inheritance chain:
2285
+ // project level self, npm level self, `apostrophe-modules`
2286
+ // project-level and `apostrophe-modules` npm level.
2287
+ return module.__meta.chain.length &gt; 4;
2288
+ }
2289
+ &nbsp;
2290
+ function lint(s) {
2291
+ self.util.warnDev(stripIndent`
2292
+ It looks like you may have made a mistake in your code:\n${s}
2293
+ `);
2294
+ }
2295
+ }
2296
+ &nbsp;
2297
+ };
2298
+ &nbsp;
2299
+ const abstractClasses = [ '@apostrophecms/module', '@apostrophecms/widget-type', '@apostrophecms/page-type', '@apostrophecms/piece-type', '@apostrophecms/piece-page-type', '@apostrophecms/doc-type' ];
2300
+ &nbsp;
2301
+ module.exports.bundle = {
2302
+ modules: abstractClasses.concat(_.keys(defaults.modules)),
2303
+ directory: 'modules'
2304
+ };
2305
+ &nbsp;
2306
+ function <span class="fstat-no" title="function not covered" >seconds(</span>msec) {
2307
+ <span class="cstat-no" title="statement not covered" > return (Math.round(msec / 100) / 10) + ' seconds';</span>
2308
+ }
2309
+ &nbsp;
2310
+ function <span class="fstat-no" title="function not covered" >clusterFork(</span>) {
2311
+ const worker = <span class="cstat-no" title="statement not covered" >cluster.fork();</span>
2312
+ <span class="cstat-no" title="statement not covered" > worker.bornAt = Date.now();</span>
2313
+ }
2314
+ &nbsp;
2315
+ function <span class="fstat-no" title="function not covered" >respawn(</span>worker) {
2316
+ <span class="cstat-no" title="statement not covered" > console.error(`Respawning worker process ${worker.process.pid}`);</span>
2317
+ <span class="cstat-no" title="statement not covered" > clusterFork();</span>
2318
+ }
2319
+ &nbsp;</pre></td></tr></table></pre>
2320
+
2321
+ <div class='push'></div><!-- for sticky footer -->
2322
+ </div><!-- /wrapper -->
2323
+ <div class='footer quiet pad2 space-top1 center small'>
2324
+ Code coverage generated by
2325
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2326
+ at Wed Jun 08 2022 11:06:49 GMT+0200 (Central European Summer Time)
2327
+ </div>
2328
+ <script src="../prettify.js"></script>
2329
+ <script>
2330
+ window.onload = function () {
2331
+ prettyPrint();
2332
+ };
2333
+ </script>
2334
+ <script src="../sorter.js"></script>
2335
+ <script src="../block-navigation.js"></script>
2336
+ </body>
2337
+ </html>
2338
+