apostrophe 2.221.0 → 2.221.2

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 (195) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/lib/modules/apostrophe-caches/index.js +23 -1
  3. package/lib/modules/apostrophe-soft-redirects/index.js +21 -14
  4. package/package.json +1 -1
  5. package/test/caches.js +29 -0
  6. package/test/soft-redirects.js +16 -3
  7. package/.nyc_output/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +0 -1
  8. package/.nyc_output/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +0 -1
  9. package/.nyc_output/99acae99-becc-463d-ba35-9333f88d2694.json +0 -1
  10. package/.nyc_output/d071f9e0-3b11-44e6-9817-69f184dd064d.json +0 -1
  11. package/.nyc_output/ed000bec-7ff7-49bf-a109-d17bfe883433.json +0 -1
  12. package/.nyc_output/processinfo/02d8fb44-f6bc-4ab4-8f47-22c7a42b887d.json +0 -1
  13. package/.nyc_output/processinfo/14b3f5f0-7e4e-461b-a7d9-4b735f510bd7.json +0 -1
  14. package/.nyc_output/processinfo/99acae99-becc-463d-ba35-9333f88d2694.json +0 -1
  15. package/.nyc_output/processinfo/d071f9e0-3b11-44e6-9817-69f184dd064d.json +0 -1
  16. package/.nyc_output/processinfo/ed000bec-7ff7-49bf-a109-d17bfe883433.json +0 -1
  17. package/.nyc_output/processinfo/index.json +0 -1
  18. package/coverage/a3/defaults.js.html +0 -253
  19. package/coverage/a3/index.html +0 -131
  20. package/coverage/a3/index.js.html +0 -2338
  21. package/coverage/a3/lib/escape-host.js.html +0 -109
  22. package/coverage/a3/lib/index.html +0 -176
  23. package/coverage/a3/lib/mongodb-connect.js.html +0 -250
  24. package/coverage/a3/lib/moog-require.js.html +0 -790
  25. package/coverage/a3/lib/moog.js.html +0 -1711
  26. package/coverage/a3/lib/opentelemetry.js.html +0 -517
  27. package/coverage/a3/modules/@apostrophecms/admin-bar/index.html +0 -116
  28. package/coverage/a3/modules/@apostrophecms/admin-bar/index.js.html +0 -931
  29. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.html +0 -116
  30. package/coverage/a3/modules/@apostrophecms/any-doc-type/index.js.html +0 -115
  31. package/coverage/a3/modules/@apostrophecms/any-page-type/index.html +0 -116
  32. package/coverage/a3/modules/@apostrophecms/any-page-type/index.js.html +0 -1105
  33. package/coverage/a3/modules/@apostrophecms/archive-page/index.html +0 -116
  34. package/coverage/a3/modules/@apostrophecms/archive-page/index.js.html +0 -97
  35. package/coverage/a3/modules/@apostrophecms/area/index.html +0 -116
  36. package/coverage/a3/modules/@apostrophecms/area/index.js.html +0 -2104
  37. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/area.js.html +0 -469
  38. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/index.html +0 -131
  39. package/coverage/a3/modules/@apostrophecms/area/lib/custom-tags/widget.js.html +0 -286
  40. package/coverage/a3/modules/@apostrophecms/asset/index.html +0 -116
  41. package/coverage/a3/modules/@apostrophecms/asset/index.js.html +0 -3982
  42. package/coverage/a3/modules/@apostrophecms/asset/lib/globalIcons.js.html +0 -346
  43. package/coverage/a3/modules/@apostrophecms/asset/lib/index.html +0 -116
  44. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/index.html +0 -131
  45. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.scss.js.html +0 -289
  46. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js.html +0 -148
  47. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/index.html +0 -116
  48. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/index.html +0 -131
  49. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.es5.js.html +0 -184
  50. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/src/webpack.scss.js.html +0 -238
  51. package/coverage/a3/modules/@apostrophecms/asset/lib/webpack/utils.js.html +0 -958
  52. package/coverage/a3/modules/@apostrophecms/attachment/index.html +0 -116
  53. package/coverage/a3/modules/@apostrophecms/attachment/index.js.html +0 -3676
  54. package/coverage/a3/modules/@apostrophecms/attachment/lib/index.html +0 -116
  55. package/coverage/a3/modules/@apostrophecms/attachment/lib/legacy-migrations.js.html +0 -205
  56. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/index.html +0 -116
  57. package/coverage/a3/modules/@apostrophecms/attachment/lib/tasks/rescale.js.html +0 -328
  58. package/coverage/a3/modules/@apostrophecms/busy/index.html +0 -116
  59. package/coverage/a3/modules/@apostrophecms/busy/index.js.html +0 -145
  60. package/coverage/a3/modules/@apostrophecms/cache/index.html +0 -116
  61. package/coverage/a3/modules/@apostrophecms/cache/index.js.html +0 -424
  62. package/coverage/a3/modules/@apostrophecms/db/index.html +0 -116
  63. package/coverage/a3/modules/@apostrophecms/db/index.js.html +0 -640
  64. package/coverage/a3/modules/@apostrophecms/doc/index.html +0 -116
  65. package/coverage/a3/modules/@apostrophecms/doc/index.js.html +0 -3937
  66. package/coverage/a3/modules/@apostrophecms/doc/lib/index.html +0 -116
  67. package/coverage/a3/modules/@apostrophecms/doc/lib/legacy-migrations.js.html +0 -622
  68. package/coverage/a3/modules/@apostrophecms/doc-type/index.html +0 -116
  69. package/coverage/a3/modules/@apostrophecms/doc-type/index.js.html +0 -8638
  70. package/coverage/a3/modules/@apostrophecms/doc-type/lib/autocomplete.js.html +0 -319
  71. package/coverage/a3/modules/@apostrophecms/doc-type/lib/index.html +0 -116
  72. package/coverage/a3/modules/@apostrophecms/email/index.html +0 -116
  73. package/coverage/a3/modules/@apostrophecms/email/index.js.html +0 -301
  74. package/coverage/a3/modules/@apostrophecms/error/index.html +0 -116
  75. package/coverage/a3/modules/@apostrophecms/error/index.js.html +0 -202
  76. package/coverage/a3/modules/@apostrophecms/express/index.html +0 -116
  77. package/coverage/a3/modules/@apostrophecms/express/index.js.html +0 -2116
  78. package/coverage/a3/modules/@apostrophecms/file/index.html +0 -116
  79. package/coverage/a3/modules/@apostrophecms/file/index.js.html +0 -367
  80. package/coverage/a3/modules/@apostrophecms/file-tag/index.html +0 -116
  81. package/coverage/a3/modules/@apostrophecms/file-tag/index.js.html +0 -127
  82. package/coverage/a3/modules/@apostrophecms/global/index.html +0 -116
  83. package/coverage/a3/modules/@apostrophecms/global/index.js.html +0 -535
  84. package/coverage/a3/modules/@apostrophecms/home-page/index.html +0 -116
  85. package/coverage/a3/modules/@apostrophecms/home-page/index.js.html +0 -94
  86. package/coverage/a3/modules/@apostrophecms/html-widget/index.html +0 -116
  87. package/coverage/a3/modules/@apostrophecms/html-widget/index.js.html +0 -271
  88. package/coverage/a3/modules/@apostrophecms/http/index.html +0 -116
  89. package/coverage/a3/modules/@apostrophecms/http/index.js.html +0 -976
  90. package/coverage/a3/modules/@apostrophecms/i18n/index.html +0 -116
  91. package/coverage/a3/modules/@apostrophecms/i18n/index.js.html +0 -2083
  92. package/coverage/a3/modules/@apostrophecms/image/index.html +0 -116
  93. package/coverage/a3/modules/@apostrophecms/image/index.js.html +0 -1486
  94. package/coverage/a3/modules/@apostrophecms/image-tag/index.html +0 -116
  95. package/coverage/a3/modules/@apostrophecms/image-tag/index.js.html +0 -127
  96. package/coverage/a3/modules/@apostrophecms/image-widget/index.html +0 -116
  97. package/coverage/a3/modules/@apostrophecms/image-widget/index.js.html +0 -145
  98. package/coverage/a3/modules/@apostrophecms/job/index.html +0 -116
  99. package/coverage/a3/modules/@apostrophecms/job/index.js.html +0 -1321
  100. package/coverage/a3/modules/@apostrophecms/launder/index.html +0 -116
  101. package/coverage/a3/modules/@apostrophecms/launder/index.js.html +0 -124
  102. package/coverage/a3/modules/@apostrophecms/lock/index.html +0 -116
  103. package/coverage/a3/modules/@apostrophecms/lock/index.js.html +0 -676
  104. package/coverage/a3/modules/@apostrophecms/login/index.html +0 -116
  105. package/coverage/a3/modules/@apostrophecms/login/index.js.html +0 -2617
  106. package/coverage/a3/modules/@apostrophecms/migration/index.html +0 -116
  107. package/coverage/a3/modules/@apostrophecms/migration/index.js.html +0 -970
  108. package/coverage/a3/modules/@apostrophecms/modal/index.html +0 -116
  109. package/coverage/a3/modules/@apostrophecms/modal/index.js.html +0 -193
  110. package/coverage/a3/modules/@apostrophecms/module/index.html +0 -116
  111. package/coverage/a3/modules/@apostrophecms/module/index.js.html +0 -2500
  112. package/coverage/a3/modules/@apostrophecms/module/lib/events.js.html +0 -547
  113. package/coverage/a3/modules/@apostrophecms/module/lib/index.html +0 -116
  114. package/coverage/a3/modules/@apostrophecms/notification/index.html +0 -116
  115. package/coverage/a3/modules/@apostrophecms/notification/index.js.html +0 -1315
  116. package/coverage/a3/modules/@apostrophecms/oembed/index.html +0 -116
  117. package/coverage/a3/modules/@apostrophecms/oembed/index.js.html +0 -781
  118. package/coverage/a3/modules/@apostrophecms/oembed/lib/index.html +0 -161
  119. package/coverage/a3/modules/@apostrophecms/oembed/lib/infogram.js.html +0 -178
  120. package/coverage/a3/modules/@apostrophecms/oembed/lib/vimeo.js.html +0 -124
  121. package/coverage/a3/modules/@apostrophecms/oembed/lib/wufoo.js.html +0 -256
  122. package/coverage/a3/modules/@apostrophecms/oembed/lib/youtube.js.html +0 -322
  123. package/coverage/a3/modules/@apostrophecms/oembed-field/index.html +0 -116
  124. package/coverage/a3/modules/@apostrophecms/oembed-field/index.js.html +0 -268
  125. package/coverage/a3/modules/@apostrophecms/page/index.html +0 -116
  126. package/coverage/a3/modules/@apostrophecms/page/index.js.html +0 -6955
  127. package/coverage/a3/modules/@apostrophecms/page/lib/index.html +0 -116
  128. package/coverage/a3/modules/@apostrophecms/page/lib/legacy-migrations.js.html +0 -568
  129. package/coverage/a3/modules/@apostrophecms/page-type/index.html +0 -116
  130. package/coverage/a3/modules/@apostrophecms/page-type/index.js.html +0 -1501
  131. package/coverage/a3/modules/@apostrophecms/pager/index.html +0 -116
  132. package/coverage/a3/modules/@apostrophecms/pager/index.js.html +0 -232
  133. package/coverage/a3/modules/@apostrophecms/permission/index.html +0 -116
  134. package/coverage/a3/modules/@apostrophecms/permission/index.js.html +0 -1057
  135. package/coverage/a3/modules/@apostrophecms/permission/lib/index.html +0 -116
  136. package/coverage/a3/modules/@apostrophecms/permission/lib/legacy-migrations.js.html +0 -160
  137. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.html +0 -116
  138. package/coverage/a3/modules/@apostrophecms/piece-page-type/index.js.html +0 -1051
  139. package/coverage/a3/modules/@apostrophecms/piece-type/index.html +0 -116
  140. package/coverage/a3/modules/@apostrophecms/piece-type/index.js.html +0 -3103
  141. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.html +0 -116
  142. package/coverage/a3/modules/@apostrophecms/polymorphic-type/index.js.html +0 -157
  143. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.html +0 -116
  144. package/coverage/a3/modules/@apostrophecms/rich-text-widget/index.js.html +0 -1363
  145. package/coverage/a3/modules/@apostrophecms/schema/index.html +0 -116
  146. package/coverage/a3/modules/@apostrophecms/schema/index.js.html +0 -4603
  147. package/coverage/a3/modules/@apostrophecms/schema/lib/addFieldTypes.js.html +0 -3502
  148. package/coverage/a3/modules/@apostrophecms/schema/lib/index.html +0 -131
  149. package/coverage/a3/modules/@apostrophecms/schema/lib/joinr.js.html +0 -703
  150. package/coverage/a3/modules/@apostrophecms/search/index.html +0 -116
  151. package/coverage/a3/modules/@apostrophecms/search/index.js.html +0 -1222
  152. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.html +0 -116
  153. package/coverage/a3/modules/@apostrophecms/soft-redirect/index.js.html +0 -343
  154. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.html +0 -116
  155. package/coverage/a3/modules/@apostrophecms/submitted-draft/index.js.html +0 -595
  156. package/coverage/a3/modules/@apostrophecms/task/index.html +0 -116
  157. package/coverage/a3/modules/@apostrophecms/task/index.js.html +0 -1147
  158. package/coverage/a3/modules/@apostrophecms/template/index.html +0 -116
  159. package/coverage/a3/modules/@apostrophecms/template/index.js.html +0 -2731
  160. package/coverage/a3/modules/@apostrophecms/template/lib/bundlesLoader.js.html +0 -559
  161. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/component.js.html +0 -310
  162. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/fragment.js.html +0 -325
  163. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/index.html +0 -146
  164. package/coverage/a3/modules/@apostrophecms/template/lib/custom-tags/render.js.html +0 -490
  165. package/coverage/a3/modules/@apostrophecms/template/lib/index.html +0 -131
  166. package/coverage/a3/modules/@apostrophecms/template/lib/nunjucksLoader.js.html +0 -658
  167. package/coverage/a3/modules/@apostrophecms/ui/index.html +0 -116
  168. package/coverage/a3/modules/@apostrophecms/ui/index.js.html +0 -181
  169. package/coverage/a3/modules/@apostrophecms/uploadfs/index.html +0 -116
  170. package/coverage/a3/modules/@apostrophecms/uploadfs/index.js.html +0 -286
  171. package/coverage/a3/modules/@apostrophecms/url/index.html +0 -116
  172. package/coverage/a3/modules/@apostrophecms/url/index.js.html +0 -733
  173. package/coverage/a3/modules/@apostrophecms/user/index.html +0 -116
  174. package/coverage/a3/modules/@apostrophecms/user/index.js.html +0 -1684
  175. package/coverage/a3/modules/@apostrophecms/user/lib/index.html +0 -116
  176. package/coverage/a3/modules/@apostrophecms/user/lib/legacy-migrations.js.html +0 -157
  177. package/coverage/a3/modules/@apostrophecms/util/index.html +0 -116
  178. package/coverage/a3/modules/@apostrophecms/util/index.js.html +0 -3424
  179. package/coverage/a3/modules/@apostrophecms/util/lib/index.html +0 -116
  180. package/coverage/a3/modules/@apostrophecms/util/lib/logger.js.html +0 -319
  181. package/coverage/a3/modules/@apostrophecms/video-widget/index.html +0 -116
  182. package/coverage/a3/modules/@apostrophecms/video-widget/index.js.html +0 -178
  183. package/coverage/a3/modules/@apostrophecms/widget-type/index.html +0 -116
  184. package/coverage/a3/modules/@apostrophecms/widget-type/index.js.html +0 -1225
  185. package/coverage/a3/test-lib/index.html +0 -131
  186. package/coverage/a3/test-lib/test.js.html +0 -232
  187. package/coverage/a3/test-lib/util.js.html +0 -373
  188. package/coverage/base.css +0 -224
  189. package/coverage/block-navigation.js +0 -87
  190. package/coverage/favicon.png +0 -0
  191. package/coverage/index.html +0 -1256
  192. package/coverage/prettify.css +0 -1
  193. package/coverage/prettify.js +0 -2
  194. package/coverage/sort-arrow-sprite.png +0 -0
  195. package/coverage/sorter.js +0 -196
@@ -1,2083 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for a3/modules/@apostrophecms/i18n/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/modules/@apostrophecms/i18n</a> index.js</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">66.31% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>189/285</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">63.76% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>139/218</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">75.67% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>28/37</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">66.07% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>187/283</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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-yes">90x</span>
740
- <span class="cline-any cline-yes">90x</span>
741
- <span class="cline-any cline-yes">90x</span>
742
- <span class="cline-any cline-yes">90x</span>
743
- <span class="cline-any cline-yes">90x</span>
744
- <span class="cline-any cline-yes">90x</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-yes">90x</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-no">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-neutral">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-neutral">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-yes">90x</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-yes">90x</span>
782
- <span class="cline-any cline-yes">90x</span>
783
- <span class="cline-any cline-yes">90x</span>
784
- <span class="cline-any cline-yes">90x</span>
785
- <span class="cline-any cline-yes">90x</span>
786
- <span class="cline-any cline-yes">97x</span>
787
- <span class="cline-any cline-yes">90x</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-yes">90x</span>
790
- <span class="cline-any cline-yes">99x</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-yes">99x</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-yes">99x</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span>
799
- <span class="cline-any cline-yes">99x</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-yes">90x</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-yes">90x</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-yes">90x</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-yes">90x</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-yes">90x</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-yes">90x</span>
831
- <span class="cline-any cline-yes">90x</span>
832
- <span class="cline-any cline-yes">90x</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-yes">90x</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-yes">90x</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-yes">78x</span>
853
- <span class="cline-any cline-yes">78x</span>
854
- <span class="cline-any cline-yes">3x</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-yes">75x</span>
857
- <span class="cline-any cline-yes">75x</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-yes">75x</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-yes">75x</span>
873
- <span class="cline-any cline-yes">75x</span>
874
- <span class="cline-any cline-yes">90x</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-yes">90x</span>
878
- <span class="cline-any cline-yes">109x</span>
879
- <span class="cline-any cline-yes">90x</span>
880
- <span class="cline-any cline-yes">80x</span>
881
- <span class="cline-any cline-yes">80x</span>
882
- <span class="cline-any cline-yes">80x</span>
883
- <span class="cline-any cline-yes">67x</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-yes">90x</span>
887
- <span class="cline-any cline-yes">90x</span>
888
- <span class="cline-any cline-yes">90x</span>
889
- <span class="cline-any cline-yes">90x</span>
890
- <span class="cline-any cline-yes">90x</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-neutral">&nbsp;</span>
897
- <span class="cline-any cline-yes">90x</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-yes">787x</span>
900
- <span class="cline-any cline-yes">787x</span>
901
- <span class="cline-any cline-yes">787x</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-no">&nbsp;</span>
905
- <span class="cline-any cline-no">&nbsp;</span>
906
- <span class="cline-any cline-no">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-no">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-neutral">&nbsp;</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-neutral">&nbsp;</span>
929
- <span class="cline-any cline-neutral">&nbsp;</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-neutral">&nbsp;</span>
937
- <span class="cline-any cline-neutral">&nbsp;</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-neutral">&nbsp;</span>
940
- <span class="cline-any cline-yes">787x</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-neutral">&nbsp;</span>
945
- <span class="cline-any cline-yes">787x</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-yes">787x</span>
948
- <span class="cline-any cline-no">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-yes">787x</span>
951
- <span class="cline-any cline-neutral">&nbsp;</span>
952
- <span class="cline-any cline-yes">787x</span>
953
- <span class="cline-any cline-yes">787x</span>
954
- <span class="cline-any cline-neutral">&nbsp;</span>
955
- <span class="cline-any cline-yes">3x</span>
956
- <span class="cline-any cline-neutral">&nbsp;</span>
957
- <span class="cline-any cline-no">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-yes">3x</span>
960
- <span class="cline-any cline-yes">3x</span>
961
- <span class="cline-any cline-yes">3x</span>
962
- <span class="cline-any cline-yes">3x</span>
963
- <span class="cline-any cline-yes">3x</span>
964
- <span class="cline-any cline-no">&nbsp;</span>
965
- <span class="cline-any cline-no">&nbsp;</span>
966
- <span class="cline-any cline-no">&nbsp;</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-no">&nbsp;</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-neutral">&nbsp;</span>
971
- <span class="cline-any cline-neutral">&nbsp;</span>
972
- <span class="cline-any cline-no">&nbsp;</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-no">&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">787x</span>
980
- <span class="cline-any cline-yes">3x</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-yes">784x</span>
983
- <span class="cline-any cline-neutral">&nbsp;</span>
984
- <span class="cline-any cline-yes">787x</span>
985
- <span class="cline-any cline-yes">787x</span>
986
- <span class="cline-any cline-yes">787x</span>
987
- <span class="cline-any cline-yes">787x</span>
988
- <span class="cline-any cline-no">&nbsp;</span>
989
- <span class="cline-any cline-neutral">&nbsp;</span>
990
- <span class="cline-any cline-neutral">&nbsp;</span>
991
- <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-yes">787x</span>
993
- <span class="cline-any cline-yes">787x</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-yes">787x</span>
997
- <span class="cline-any cline-yes">5x</span>
998
- <span class="cline-any cline-neutral">&nbsp;</span>
999
- <span class="cline-any cline-neutral">&nbsp;</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-neutral">&nbsp;</span>
1002
- <span class="cline-any cline-yes">787x</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-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-neutral">&nbsp;</span>
1007
- <span class="cline-any cline-no">&nbsp;</span>
1008
- <span class="cline-any cline-neutral">&nbsp;</span>
1009
- <span class="cline-any cline-yes">787x</span>
1010
- <span class="cline-any cline-yes">787x</span>
1011
- <span class="cline-any cline-neutral">&nbsp;</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-neutral">&nbsp;</span>
1014
- <span class="cline-any cline-neutral">&nbsp;</span>
1015
- <span class="cline-any cline-yes">90x</span>
1016
- <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-neutral">&nbsp;</span>
1018
- <span class="cline-any cline-no">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-neutral">&nbsp;</span>
1021
- <span class="cline-any cline-no">&nbsp;</span>
1022
- <span class="cline-any cline-no">&nbsp;</span>
1023
- <span class="cline-any cline-neutral">&nbsp;</span>
1024
- <span class="cline-any cline-neutral">&nbsp;</span>
1025
- <span class="cline-any cline-neutral">&nbsp;</span>
1026
- <span class="cline-any cline-no">&nbsp;</span>
1027
- <span class="cline-any cline-neutral">&nbsp;</span>
1028
- <span class="cline-any cline-no">&nbsp;</span>
1029
- <span class="cline-any cline-neutral">&nbsp;</span>
1030
- <span class="cline-any cline-no">&nbsp;</span>
1031
- <span class="cline-any cline-neutral">&nbsp;</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-no">&nbsp;</span>
1034
- <span class="cline-any cline-no">&nbsp;</span>
1035
- <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-no">&nbsp;</span>
1038
- <span class="cline-any cline-no">&nbsp;</span>
1039
- <span class="cline-any cline-no">&nbsp;</span>
1040
- <span class="cline-any cline-neutral">&nbsp;</span>
1041
- <span class="cline-any cline-neutral">&nbsp;</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-no">&nbsp;</span>
1045
- <span class="cline-any cline-no">&nbsp;</span>
1046
- <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-no">&nbsp;</span>
1048
- <span class="cline-any cline-no">&nbsp;</span>
1049
- <span class="cline-any cline-no">&nbsp;</span>
1050
- <span class="cline-any cline-neutral">&nbsp;</span>
1051
- <span class="cline-any cline-neutral">&nbsp;</span>
1052
- <span class="cline-any cline-neutral">&nbsp;</span>
1053
- <span class="cline-any cline-no">&nbsp;</span>
1054
- <span class="cline-any cline-neutral">&nbsp;</span>
1055
- <span class="cline-any cline-no">&nbsp;</span>
1056
- <span class="cline-any cline-no">&nbsp;</span>
1057
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
1062
- <span class="cline-any cline-no">&nbsp;</span>
1063
- <span class="cline-any cline-neutral">&nbsp;</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-no">&nbsp;</span>
1067
- <span class="cline-any cline-neutral">&nbsp;</span>
1068
- <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-neutral">&nbsp;</span>
1070
- <span class="cline-any cline-neutral">&nbsp;</span>
1071
- <span class="cline-any cline-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-neutral">&nbsp;</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-neutral">&nbsp;</span>
1076
- <span class="cline-any cline-neutral">&nbsp;</span>
1077
- <span class="cline-any cline-neutral">&nbsp;</span>
1078
- <span class="cline-any cline-neutral">&nbsp;</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-neutral">&nbsp;</span>
1081
- <span class="cline-any cline-no">&nbsp;</span>
1082
- <span class="cline-any cline-no">&nbsp;</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-no">&nbsp;</span>
1085
- <span class="cline-any cline-no">&nbsp;</span>
1086
- <span class="cline-any cline-no">&nbsp;</span>
1087
- <span class="cline-any cline-no">&nbsp;</span>
1088
- <span class="cline-any cline-no">&nbsp;</span>
1089
- <span class="cline-any cline-no">&nbsp;</span>
1090
- <span class="cline-any cline-no">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-no">&nbsp;</span>
1093
- <span class="cline-any cline-neutral">&nbsp;</span>
1094
- <span class="cline-any cline-neutral">&nbsp;</span>
1095
- <span class="cline-any cline-neutral">&nbsp;</span>
1096
- <span class="cline-any cline-neutral">&nbsp;</span>
1097
- <span class="cline-any cline-neutral">&nbsp;</span>
1098
- <span class="cline-any cline-neutral">&nbsp;</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-neutral">&nbsp;</span>
1101
- <span class="cline-any cline-no">&nbsp;</span>
1102
- <span class="cline-any cline-no">&nbsp;</span>
1103
- <span class="cline-any cline-no">&nbsp;</span>
1104
- <span class="cline-any cline-no">&nbsp;</span>
1105
- <span class="cline-any cline-neutral">&nbsp;</span>
1106
- <span class="cline-any cline-no">&nbsp;</span>
1107
- <span class="cline-any cline-neutral">&nbsp;</span>
1108
- <span class="cline-any cline-neutral">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-neutral">&nbsp;</span>
1111
- <span class="cline-any cline-neutral">&nbsp;</span>
1112
- <span class="cline-any cline-yes">90x</span>
1113
- <span class="cline-any cline-neutral">&nbsp;</span>
1114
- <span class="cline-any cline-neutral">&nbsp;</span>
1115
- <span class="cline-any cline-neutral">&nbsp;</span>
1116
- <span class="cline-any cline-yes">4632x</span>
1117
- <span class="cline-any cline-yes">4632x</span>
1118
- <span class="cline-any cline-neutral">&nbsp;</span>
1119
- <span class="cline-any cline-neutral">&nbsp;</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-neutral">&nbsp;</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-yes">4632x</span>
1126
- <span class="cline-any cline-yes">4632x</span>
1127
- <span class="cline-any cline-yes">4632x</span>
1128
- <span class="cline-any cline-yes">4632x</span>
1129
- <span class="cline-any cline-yes">23624x</span>
1130
- <span class="cline-any cline-yes">23624x</span>
1131
- <span class="cline-any cline-yes">10061x</span>
1132
- <span class="cline-any cline-yes">10061x</span>
1133
- <span class="cline-any cline-yes">9967x</span>
1134
- <span class="cline-any cline-neutral">&nbsp;</span>
1135
- <span class="cline-any cline-yes">94x</span>
1136
- <span class="cline-any cline-yes">455x</span>
1137
- <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-yes">2x</span>
1139
- <span class="cline-any cline-neutral">&nbsp;</span>
1140
- <span class="cline-any cline-yes">453x</span>
1141
- <span class="cline-any cline-yes">453x</span>
1142
- <span class="cline-any cline-yes">453x</span>
1143
- <span class="cline-any cline-neutral">&nbsp;</span>
1144
- <span class="cline-any cline-neutral">&nbsp;</span>
1145
- <span class="cline-any cline-neutral">&nbsp;</span>
1146
- <span class="cline-any cline-neutral">&nbsp;</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-yes">4632x</span>
1152
- <span class="cline-any cline-yes">23624x</span>
1153
- <span class="cline-any cline-yes">23624x</span>
1154
- <span class="cline-any cline-yes">23624x</span>
1155
- <span class="cline-any cline-yes">10061x</span>
1156
- <span class="cline-any cline-yes">10061x</span>
1157
- <span class="cline-any cline-yes">9967x</span>
1158
- <span class="cline-any cline-neutral">&nbsp;</span>
1159
- <span class="cline-any cline-yes">94x</span>
1160
- <span class="cline-any cline-yes">455x</span>
1161
- <span class="cline-any cline-neutral">&nbsp;</span>
1162
- <span class="cline-any cline-yes">453x</span>
1163
- <span class="cline-any cline-neutral">&nbsp;</span>
1164
- <span class="cline-any cline-yes">2x</span>
1165
- <span class="cline-any cline-yes">2x</span>
1166
- <span class="cline-any cline-neutral">&nbsp;</span>
1167
- <span class="cline-any cline-yes">2x</span>
1168
- <span class="cline-any cline-yes">2x</span>
1169
- <span class="cline-any cline-yes">2x</span>
1170
- <span class="cline-any cline-yes">2x</span>
1171
- <span class="cline-any cline-yes">2x</span>
1172
- <span class="cline-any cline-yes">2x</span>
1173
- <span class="cline-any cline-neutral">&nbsp;</span>
1174
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1178
- <span class="cline-any cline-neutral">&nbsp;</span>
1179
- <span class="cline-any cline-neutral">&nbsp;</span>
1180
- <span class="cline-any cline-neutral">&nbsp;</span>
1181
- <span class="cline-any cline-neutral">&nbsp;</span>
1182
- <span class="cline-any cline-yes">90x</span>
1183
- <span class="cline-any cline-yes">90x</span>
1184
- <span class="cline-any cline-yes">90x</span>
1185
- <span class="cline-any cline-yes">270x</span>
1186
- <span class="cline-any cline-neutral">&nbsp;</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-yes">787x</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-neutral">&nbsp;</span>
1192
- <span class="cline-any cline-neutral">&nbsp;</span>
1193
- <span class="cline-any cline-neutral">&nbsp;</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-neutral">&nbsp;</span>
1196
- <span class="cline-any cline-neutral">&nbsp;</span>
1197
- <span class="cline-any cline-yes">787x</span>
1198
- <span class="cline-any cline-yes">787x</span>
1199
- <span class="cline-any cline-yes">787x</span>
1200
- <span class="cline-any cline-yes">817x</span>
1201
- <span class="cline-any cline-neutral">&nbsp;</span>
1202
- <span class="cline-any cline-yes">817x</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-yes">817x</span>
1206
- <span class="cline-any cline-no">&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-yes">817x</span>
1211
- <span class="cline-any cline-yes">10x</span>
1212
- <span class="cline-any cline-yes">1x</span>
1213
- <span class="cline-any cline-yes">1x</span>
1214
- <span class="cline-any cline-neutral">&nbsp;</span>
1215
- <span class="cline-any cline-neutral">&nbsp;</span>
1216
- <span class="cline-any cline-yes">807x</span>
1217
- <span class="cline-any cline-yes">20x</span>
1218
- <span class="cline-any cline-yes">3x</span>
1219
- <span class="cline-any cline-yes">3x</span>
1220
- <span class="cline-any cline-neutral">&nbsp;</span>
1221
- <span class="cline-any cline-neutral">&nbsp;</span>
1222
- <span class="cline-any cline-neutral">&nbsp;</span>
1223
- <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-yes">787x</span>
1225
- <span class="cline-any cline-neutral">&nbsp;</span>
1226
- <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-neutral">&nbsp;</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-neutral">&nbsp;</span>
1231
- <span class="cline-any cline-yes">141x</span>
1232
- <span class="cline-any cline-yes">141x</span>
1233
- <span class="cline-any cline-yes">140x</span>
1234
- <span class="cline-any cline-yes">140x</span>
1235
- <span class="cline-any cline-neutral">&nbsp;</span>
1236
- <span class="cline-any cline-no">&nbsp;</span>
1237
- <span class="cline-any cline-neutral">&nbsp;</span>
1238
- <span class="cline-any cline-yes">140x</span>
1239
- <span class="cline-any cline-yes">140x</span>
1240
- <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-no">&nbsp;</span>
1242
- <span class="cline-any cline-neutral">&nbsp;</span>
1243
- <span class="cline-any cline-neutral">&nbsp;</span>
1244
- <span class="cline-any cline-neutral">&nbsp;</span>
1245
- <span class="cline-any cline-neutral">&nbsp;</span>
1246
- <span class="cline-any cline-yes">1x</span>
1247
- <span class="cline-any cline-yes">1x</span>
1248
- <span class="cline-any cline-neutral">&nbsp;</span>
1249
- <span class="cline-any cline-yes">141x</span>
1250
- <span class="cline-any cline-no">&nbsp;</span>
1251
- <span class="cline-any cline-neutral">&nbsp;</span>
1252
- <span class="cline-any cline-yes">141x</span>
1253
- <span class="cline-any cline-neutral">&nbsp;</span>
1254
- <span class="cline-any cline-neutral">&nbsp;</span>
1255
- <span class="cline-any cline-yes">1x</span>
1256
- <span class="cline-any cline-neutral">&nbsp;</span>
1257
- <span class="cline-any cline-yes">140x</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-neutral">&nbsp;</span>
1260
- <span class="cline-any cline-neutral">&nbsp;</span>
1261
- <span class="cline-any cline-yes">30x</span>
1262
- <span class="cline-any cline-neutral">&nbsp;</span>
1263
- <span class="cline-any cline-neutral">&nbsp;</span>
1264
- <span class="cline-any cline-yes">30x</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-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-yes">30x</span>
1269
- <span class="cline-any cline-no">&nbsp;</span>
1270
- <span class="cline-any cline-neutral">&nbsp;</span>
1271
- <span class="cline-any cline-yes">30x</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-yes">30x</span>
1283
- <span class="cline-any cline-no">&nbsp;</span>
1284
- <span class="cline-any cline-neutral">&nbsp;</span>
1285
- <span class="cline-any cline-yes">30x</span>
1286
- <span class="cline-any cline-neutral">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-yes">30x</span>
1289
- <span class="cline-any cline-yes">30x</span>
1290
- <span class="cline-any cline-yes">61x</span>
1291
- <span class="cline-any cline-yes">31x</span>
1292
- <span class="cline-any cline-neutral">&nbsp;</span>
1293
- <span class="cline-any cline-neutral">&nbsp;</span>
1294
- <span class="cline-any cline-yes">30x</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-neutral">&nbsp;</span>
1297
- <span class="cline-any cline-yes">90x</span>
1298
- <span class="cline-any cline-neutral">&nbsp;</span>
1299
- <span class="cline-any cline-neutral">&nbsp;</span>
1300
- <span class="cline-any cline-neutral">&nbsp;</span>
1301
- <span class="cline-any cline-neutral">&nbsp;</span>
1302
- <span class="cline-any cline-yes">90x</span>
1303
- <span class="cline-any cline-yes">90x</span>
1304
- <span class="cline-any cline-yes">90x</span>
1305
- <span class="cline-any cline-yes">99x</span>
1306
- <span class="cline-any cline-yes">99x</span>
1307
- <span class="cline-any cline-yes">99x</span>
1308
- <span class="cline-any cline-no">&nbsp;</span>
1309
- <span class="cline-any cline-neutral">&nbsp;</span>
1310
- <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1315
- <span class="cline-any cline-neutral">&nbsp;</span>
1316
- <span class="cline-any cline-yes">99x</span>
1317
- <span class="cline-any cline-neutral">&nbsp;</span>
1318
- <span class="cline-any cline-yes">90x</span>
1319
- <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-neutral">&nbsp;</span>
1326
- <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-neutral">&nbsp;</span>
1329
- <span class="cline-any cline-neutral">&nbsp;</span>
1330
- <span class="cline-any cline-yes">90x</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-yes">3x</span>
1334
- <span class="cline-any cline-yes">3x</span>
1335
- <span class="cline-any cline-no">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-yes">3x</span>
1338
- <span class="cline-any cline-neutral">&nbsp;</span>
1339
- <span class="cline-any cline-neutral">&nbsp;</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-yes">3472x</span>
1353
- <span class="cline-any cline-yes">3472x</span>
1354
- <span class="cline-any cline-yes">3472x</span>
1355
- <span class="cline-any cline-yes">213x</span>
1356
- <span class="cline-any cline-neutral">&nbsp;</span>
1357
- <span class="cline-any cline-yes">3259x</span>
1358
- <span class="cline-any cline-neutral">&nbsp;</span>
1359
- <span class="cline-any cline-yes">3472x</span>
1360
- <span class="cline-any cline-yes">3472x</span>
1361
- <span class="cline-any cline-yes">3472x</span>
1362
- <span class="cline-any cline-yes">3472x</span>
1363
- <span class="cline-any cline-neutral">&nbsp;</span>
1364
- <span class="cline-any cline-neutral">&nbsp;</span>
1365
- <span class="cline-any cline-yes">3243x</span>
1366
- <span class="cline-any cline-neutral">&nbsp;</span>
1367
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
1373
- <span class="cline-any cline-yes">754x</span>
1374
- <span class="cline-any cline-no">&nbsp;</span>
1375
- <span class="cline-any cline-no">&nbsp;</span>
1376
- <span class="cline-any cline-no">&nbsp;</span>
1377
- <span class="cline-any cline-neutral">&nbsp;</span>
1378
- <span class="cline-any cline-neutral">&nbsp;</span>
1379
- <span class="cline-any cline-no">&nbsp;</span>
1380
- <span class="cline-any cline-neutral">&nbsp;</span>
1381
- <span class="cline-any cline-neutral">&nbsp;</span>
1382
- <span class="cline-any cline-no">&nbsp;</span>
1383
- <span class="cline-any cline-no">&nbsp;</span>
1384
- <span class="cline-any cline-neutral">&nbsp;</span>
1385
- <span class="cline-any cline-no">&nbsp;</span>
1386
- <span class="cline-any cline-no">&nbsp;</span>
1387
- <span class="cline-any cline-neutral">&nbsp;</span>
1388
- <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</span>
1394
- <span class="cline-any cline-neutral">&nbsp;</span>
1395
- <span class="cline-any cline-neutral">&nbsp;</span>
1396
- <span class="cline-any cline-yes">3x</span>
1397
- <span class="cline-any cline-neutral">&nbsp;</span>
1398
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// This module makes an instance of the [i18next](https://npmjs.org/package/i18next) npm module available
1399
- // in Nunjucks templates via the `__t()` helper function. That function is also available on `req` objects
1400
- // as `req.t()`. Any options passed to this module are passed on to `i18next`.
1401
- //
1402
- // `apos.i18n.i18next` can be used to directly access the `i18next` npm module instance if necessary.
1403
- // It usually is not necessary. Use `req.t` if you need to localize in a route.
1404
- &nbsp;
1405
- const i18next = require('i18next');
1406
- const fs = require('fs');
1407
- const _ = require('lodash');
1408
- const { stripIndent } = require('common-tags');
1409
- const ExpressSessionCookie = require('express-session/session/cookie');
1410
- const path = require('path');
1411
- &nbsp;
1412
- const apostropheI18nDebugPlugin = {
1413
- type: 'postProcessor',
1414
- name: 'apostropheI18nDebugPlugin',
1415
- <span class="fstat-no" title="function not covered" > pr</span>ocess(value, key, options, translator) {
1416
- // The key is passed as an array (theoretically to include multiple keys).
1417
- // We confirm that and grab the primary one for comparison.
1418
- const l10nKey = <span class="cstat-no" title="statement not covered" >Array.isArray(key) ? key[0] : key;</span>
1419
- &nbsp;
1420
- <span class="cstat-no" title="statement not covered" > if (value === l10nKey) {</span>
1421
- <span class="cstat-no" title="statement not covered" > if (l10nKey.match(/^\S+:/)) {</span>
1422
- // The l10n key does not have a value assigned (or the key is
1423
- // actually the same as the phrase). The key seems to have a
1424
- // namespace, so might be from the Apostrophe UI.
1425
- <span class="cstat-no" title="statement not covered" > return `❌ ${value}`;</span>
1426
- } else {
1427
- // The l10n key does not have a value assigned (or the key is
1428
- // actually the same as the phrase). It is in the default namespace.
1429
- <span class="cstat-no" title="statement not covered" > return `🕳 ${value}`;</span>
1430
- }
1431
- } else {
1432
- // The phrase is fully localized.
1433
- <span class="cstat-no" title="statement not covered" > return `🌍 ${value}`;</span>
1434
- }
1435
- }
1436
- };
1437
- &nbsp;
1438
- module.exports = {
1439
- options: {
1440
- alias: 'i18n',
1441
- i18n: {
1442
- ns: 'apostrophe',
1443
- browser: true
1444
- }
1445
- },
1446
- async init(self) {
1447
- self.defaultNamespace = 'default';
1448
- self.namespaces = {};
1449
- self.debug = process.env.APOS_DEBUG_I18N ? <span class="branch-0 cbranch-no" title="branch not covered" >true </span>: self.options.debug;
1450
- self.show = process.env.APOS_SHOW_I18N ? <span class="branch-0 cbranch-no" title="branch not covered" >true </span>: self.options.show;
1451
- self.locales = self.getLocales();
1452
- self.hostnamesInUse = Object.values(self.locales).find(locale =&gt; locale.hostname);
1453
- self.defaultLocale = self.options.defaultLocale || Object.keys(self.locales)[0];
1454
- // Lint the locale configurations
1455
- for (const [ key, options ] of Object.entries(self.locales)) {
1456
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!options) {
1457
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid', `Locale "${key}" was not configured.`);</span>
1458
- }
1459
- <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof key !== 'string' || !key.match(/^[a-zA-Z]/)) {
1460
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid', `Locale names must begin with a non-numeric, "word" character (a-z or A-Z). Check locale "${key}".`);</span>
1461
- }
1462
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.prefix &amp;&amp; !options.prefix.match(/^\//)) {
1463
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid', `Locale prefixes must begin with a forward slash ("/"). Check locale "${key}".`);</span>
1464
- }
1465
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.prefix &amp;&amp; options.prefix.match(/\/.*?\//)) {
1466
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid', `Locale prefixes must not contain more than one forward slash ("/").\nUse hyphens as separators. Check locale "${key}".`);</span>
1467
- }
1468
- }
1469
- const fallbackLng = [ self.defaultLocale ];
1470
- // In case the default locale also has inadequate admin UI phrases
1471
- <span class="missing-if-branch" title="if path not taken" >I</span>if (fallbackLng[0] !== 'en') {
1472
- <span class="cstat-no" title="statement not covered" > fallbackLng.push('en');</span>
1473
- }
1474
- // Make sure we have our own instance to avoid conflicts with other apos objects
1475
- self.i18next = i18next.createInstance({
1476
- fallbackLng,
1477
- // Required to prevent the debugger from complaining
1478
- languages: Object.keys(self.locales),
1479
- // Added later, but required here
1480
- resources: {},
1481
- interpolation: {
1482
- // Nunjucks and Vue will already do this
1483
- escapeValue: false
1484
- },
1485
- defaultNS: self.defaultNamespace,
1486
- debug: self.debug
1487
- });
1488
- <span class="missing-if-branch" title="if path not taken" >I</span>if (self.show) {
1489
- <span class="cstat-no" title="statement not covered" > self.i18next.use(apostropheI18nDebugPlugin);</span>
1490
- }
1491
- &nbsp;
1492
- const i18nextOptions = self.show ? <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1493
- postProcess: 'apostropheI18nDebugPlugin'
1494
- } : {};
1495
- &nbsp;
1496
- await self.i18next.init(i18nextOptions);
1497
- self.addInitialResources();
1498
- self.enableBrowserData();
1499
- },
1500
- handlers(self) {
1501
- return {
1502
- 'apostrophe:modulesRegistered': {
1503
- addModal() {
1504
- self.addLocalizeModal();
1505
- }
1506
- },
1507
- '@apostrophecms/page:beforeSend': {
1508
- // Developers can link to alternate locales by iterating over
1509
- // `data.localizations` in any page template. Each element always has
1510
- // `locale`, `label` and `homePageUrl` properties. Each element also has an
1511
- // `available` property; if true, the current context document is available
1512
- // in that locale, `title` and a small number of other document properties are
1513
- // populated, and `_url` redirects to the context document in that locale.
1514
- //
1515
- // The array is provided in the order in which locales are configured.
1516
- // The current locale is included and has the property `current: true`.
1517
- async addLocalizations(req) {
1518
- const context = req.data.piece || req.data.page;
1519
- if (!context) {
1520
- return;
1521
- }
1522
- const manager = self.apos.doc.getManager(context.type);
1523
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!manager.isLocalized()) {
1524
- <span class="cstat-no" title="statement not covered" > return;</span>
1525
- }
1526
- const localizations = await self.apos.doc.db.find({
1527
- aposDocId: context.aposDocId,
1528
- aposMode: req.mode
1529
- }).project({
1530
- type: 1,
1531
- title: 1,
1532
- slug: 1,
1533
- aposLocale: 1,
1534
- aposMode: 1,
1535
- visibility: 1,
1536
- docPermissions: 1
1537
- }).toArray();
1538
- req.data.localizations = [];
1539
- for (const name of Object.keys(self.locales)) {
1540
- const localeReq = self.apos.util.cloneReq(req, {
1541
- locale: name
1542
- });
1543
- self.setPrefixUrls(localeReq);
1544
- const doc = localizations.find(doc =&gt; doc.aposLocale.split(':')[0] === name);
1545
- if (doc &amp;&amp; self.apos.permission.can(req, 'view', doc)) {
1546
- doc.available = true;
1547
- doc._url = `${self.apos.prefix}${manager.action}/${context._id}/locale/${name}`;
1548
- if (doc._id === context._id) {
1549
- doc.current = true;
1550
- }
1551
- }
1552
- const info = doc || {};
1553
- info.locale = name;
1554
- info.label = self.locales[name].label;
1555
- info.homePageUrl = `${localeReq.prefix}/`;
1556
- req.data.localizations.push(info);
1557
- }
1558
- }
1559
- }
1560
- };
1561
- },
1562
- middleware(self) {
1563
- return {
1564
- async acceptCrossDomainSessionToken(req, res, next) {
1565
- let crossDomainSessionToken = req.query.aposCrossDomainSessionToken;
1566
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!crossDomainSessionToken) {
1567
- return next();
1568
- }
1569
- <span class="cstat-no" title="statement not covered" > crossDomainSessionToken = self.apos.launder.string(crossDomainSessionToken);</span>
1570
- <span class="cstat-no" title="statement not covered" > try {</span>
1571
- const sessionData = <span class="cstat-no" title="statement not covered" >await self.apos.cache.get('@apostrophecms/i18n:cross-domain-sessions', crossDomainSessionToken);</span>
1572
- <span class="cstat-no" title="statement not covered" > for (const key of Object.keys(req.session)) {</span>
1573
- <span class="cstat-no" title="statement not covered" > delete req.session[key];</span>
1574
- }
1575
- <span class="cstat-no" title="statement not covered" > Object.assign(req.session, sessionData || {});</span>
1576
- <span class="cstat-no" title="statement not covered" > await self.apos.cache.set('@apostrophecms/i18n:cross-domain-sessions', crossDomainSessionToken, null);</span>
1577
- } catch (e) {
1578
- <span class="cstat-no" title="statement not covered" > self.apos.util.error(e);</span>
1579
- }
1580
- // Since the req.session object at this stage is just
1581
- // a plain Javascript object, getters and setters of
1582
- // the Cookie prototype from the express-session module
1583
- // (like req.session.cookie.data) are unavailable and
1584
- // will return 'undefined' when called internally by the
1585
- // express-session module. This ends up corrupting the
1586
- // set-cookie headers generated by the express-session
1587
- // module, thus breaking sessions. The express-session
1588
- // module normally generates an instance of its Cookie
1589
- // prototype which contains these methods and expects
1590
- // that interface always to function properly. To ensure
1591
- // this, we re-instantiate req.session.cookie as an
1592
- // instance of the Cookie class from the express-session
1593
- // module to ensure that the sessions remain intact even
1594
- // across domains. Note that we use the cookie settings
1595
- // from the Apostrophe Express module to ensure that user
1596
- // defined cookie settings are respected.
1597
- const aposExpressModule = <span class="cstat-no" title="statement not covered" >self.apos.modules['@apostrophecms/express'];</span>
1598
- <span class="cstat-no" title="statement not covered" > req.session.cookie = new ExpressSessionCookie(aposExpressModule.sessionOptions.cookie);</span>
1599
- <span class="cstat-no" title="statement not covered" > return res.redirect(self.apos.url.build(req.url, { aposCrossDomainSessionToken: null }));</span>
1600
- },
1601
- locale(req, res, next) {
1602
- // Support for a single aposLocale query param that
1603
- // also contains the mode, which is likely to occur
1604
- // since we have the `aposLocale` property in docs
1605
- // structured that way
1606
- <span class="missing-if-branch" title="if path not taken" >I</span>if (req.query.aposLocale &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >req.query.aposLocale.includes(':'))</span> {
1607
- const parts = <span class="cstat-no" title="statement not covered" >req.query.aposLocale.split(':');</span>
1608
- <span class="cstat-no" title="statement not covered" > req.query.aposLocale = parts[0];</span>
1609
- <span class="cstat-no" title="statement not covered" > req.query.aposMode = parts[1];</span>
1610
- }
1611
- const validModes = [ 'draft', 'published' ];
1612
- let locale;
1613
- <span class="missing-if-branch" title="if path not taken" >I</span>if (self.isValidLocale(req.query.aposLocale)) {
1614
- <span class="cstat-no" title="statement not covered" > locale = req.query.aposLocale;</span>
1615
- } else {
1616
- locale = self.matchLocale(req);
1617
- }
1618
- const localeOptions = self.locales[locale];
1619
- if (localeOptions.prefix) {
1620
- // Remove locale prefix so URL parsing can proceed normally from here
1621
- <span class="missing-if-branch" title="if path not taken" >I</span>if (req.path === localeOptions.prefix) {
1622
- // Add / for home page
1623
- <span class="cstat-no" title="statement not covered" > return res.redirect(`${req.url}/`);</span>
1624
- }
1625
- <span class="missing-if-branch" title="else path not taken" >E</span>if (req.path.substring(0, localeOptions.prefix.length + 1) === localeOptions.prefix + '/') {
1626
- req.path = req.path.replace(localeOptions.prefix, '');
1627
- req.url = req.url.replace(localeOptions.prefix, '');
1628
- const superRedirect = res.redirect;
1629
- res.redirect = <span class="fstat-no" title="function not covered" >fu</span>nction (status, url) {
1630
- <span class="cstat-no" title="statement not covered" > if (arguments.length === 1) {</span>
1631
- <span class="cstat-no" title="statement not covered" > url = status;</span>
1632
- <span class="cstat-no" title="statement not covered" > status = 302;</span>
1633
- }
1634
- <span class="cstat-no" title="statement not covered" > if (!url.match(/^[a-zA-Z]+:/)) {</span>
1635
- // We don't need all of req.prefix here because
1636
- // the global site prefix middleware already extended
1637
- // res.redirect once
1638
- <span class="cstat-no" title="statement not covered" > url = localeOptions.prefix + url;</span>
1639
- }
1640
- <span class="cstat-no" title="statement not covered" > return superRedirect.call(this, status, url);</span>
1641
- };
1642
- }
1643
- }
1644
- let mode;
1645
- if (validModes.includes(req.query.aposMode)) {
1646
- mode = req.query.aposMode;
1647
- } else {
1648
- mode = 'published';
1649
- }
1650
- req.locale = locale;
1651
- req.mode = mode;
1652
- self.setPrefixUrls(req);
1653
- <span class="missing-if-branch" title="if path not taken" >I</span>if ((req.mode === 'draft') &amp;&amp; (!self.apos.permission.can(req, 'view-draft'))) {
1654
- <span class="cstat-no" title="statement not covered" > return res.status(403).send({</span>
1655
- name: 'forbidden'
1656
- });
1657
- }
1658
- _.defaults(req.data, _.pick(req, 'baseUrl', 'baseUrlWithPrefix', 'absoluteUrl'));
1659
- return next();
1660
- },
1661
- localize(req, res, next) {
1662
- req.t = (key, options = {}) =&gt; {
1663
- return self.i18next.t(key, {
1664
- ...options,
1665
- lng: req.locale
1666
- });
1667
- };
1668
- req.__ = <span class="fstat-no" title="function not covered" >ke</span>y =&gt; {
1669
- <span class="cstat-no" title="statement not covered" > self.apos.util.warnDevOnce('old-i18n-req-helper', stripIndent`</span>
1670
- The req.__() and res.__() functions are deprecated and do not localize in A3.
1671
- Use req.t instead.
1672
- `);
1673
- <span class="cstat-no" title="statement not covered" > return key;</span>
1674
- };
1675
- req.res.__ = req.__;
1676
- return next();
1677
- }
1678
- };
1679
- },
1680
- apiRoutes(self) {
1681
- return {
1682
- post: {
1683
- <span class="fstat-no" title="function not covered" > as</span>ync locale(req) {
1684
- const sanitizedLocale = <span class="cstat-no" title="statement not covered" >self.sanitizeLocaleName(req.body.locale);</span>
1685
- // Clipboards transferring between locales needs to jump
1686
- // from LocalStorage to the cross-domain session cache
1687
- let clipboard = <span class="cstat-no" title="statement not covered" >req.body.clipboard;</span>
1688
- <span class="cstat-no" title="statement not covered" > if (clipboard &amp;&amp; ((typeof clipboard) !== 'string')) {</span>
1689
- // Clipboard re-validation doesn't have to be more detailed here because
1690
- // on any actual paste attempt it will go through server side validation
1691
- // like any normal insert of a widget
1692
- <span class="cstat-no" title="statement not covered" > clipboard = null;</span>
1693
- }
1694
- const _id = <span class="cstat-no" title="statement not covered" >self.apos.launder.id(req.body.contextDocId);</span>
1695
- let doc;
1696
- const localeReq = <span class="cstat-no" title="statement not covered" >req.clone({</span>
1697
- locale: sanitizedLocale
1698
- });
1699
- <span class="cstat-no" title="statement not covered" > if (_id) {</span>
1700
- <span class="cstat-no" title="statement not covered" > doc = await self.apos.doc.find(localeReq, {</span>
1701
- aposDocId: _id.split(':')[0]
1702
- }).toObject();
1703
- <span class="cstat-no" title="statement not covered" > if (!doc) {</span>
1704
- const publishedLocaleReq = <span class="cstat-no" title="statement not covered" >localeReq.clone({ mode: 'draft' });</span>
1705
- <span class="cstat-no" title="statement not covered" > doc = await self.apos.doc.find(publishedLocaleReq, {</span>
1706
- aposDocId: _id.split(':')[0]
1707
- }).toObject();
1708
- }
1709
- }
1710
- <span class="cstat-no" title="statement not covered" > if (!sanitizedLocale) {</span>
1711
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
1712
- }
1713
- const result = <span class="cstat-no" title="statement not covered" >{};</span>
1714
- <span class="cstat-no" title="statement not covered" > if (doc &amp;&amp; doc._url) {</span>
1715
- <span class="cstat-no" title="statement not covered" > result.redirectTo = doc &amp;&amp; doc._url;</span>
1716
- } else {
1717
- // No matching document, so as a fallback go to the home page
1718
- // with the appropriate prefix
1719
- <span class="cstat-no" title="statement not covered" > result.redirectTo = localeReq.prefix;</span>
1720
- };
1721
- <span class="cstat-no" title="statement not covered" > if (self.locales[localeReq.locale].hostname !== self.locales[req.locale].hostname) {</span>
1722
- const crossDomainSessionToken = <span class="cstat-no" title="statement not covered" >self.apos.util.generateId();</span>
1723
- const session = <span class="cstat-no" title="statement not covered" >{</span>
1724
- ...req.session,
1725
- aposCrossDomainClipboard: clipboard
1726
- };
1727
- <span class="cstat-no" title="statement not covered" > await self.apos.cache.set('@apostrophecms/i18n:cross-domain-sessions', crossDomainSessionToken, session, 60 * 60);</span>
1728
- <span class="cstat-no" title="statement not covered" > result.redirectTo = self.apos.url.build(result.redirectTo, {</span>
1729
- aposCrossDomainSessionToken: crossDomainSessionToken
1730
- });
1731
- }
1732
- <span class="cstat-no" title="statement not covered" > return result;</span>
1733
- },
1734
- // Fast bulk query for doc `ids` that exist in the given `locale`.
1735
- // `ids` may contain `_id` or `aposDocId` values.
1736
- //
1737
- // The response object contains `originalLocaleIds`, `newLocaleIds` and
1738
- // `aposDocIds` arrays. Any documents not existing in `locale`
1739
- // will not be included in these arrays.
1740
- //
1741
- // The original mode and locale are inferred from the given
1742
- // `ids`, or from the request.
1743
- //
1744
- // This route is a POST route because large numbers of ids
1745
- // might not be accepted as a query string.
1746
- <span class="fstat-no" title="function not covered" > as</span>ync existInLocale(req) {
1747
- <span class="cstat-no" title="statement not covered" > if (!req.user) {</span>
1748
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('notfound');</span>
1749
- }
1750
- const ids = <span class="cstat-no" title="statement not covered" >self.apos.launder.ids(req.body.ids);</span>
1751
- const locale = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.locale);</span>
1752
- const originalLocale = <span class="cstat-no" title="statement not covered" >(ids[0] &amp;&amp; ids[0].split(':')[1]) || req.locale;</span>
1753
- const originalMode = <span class="cstat-no" title="statement not covered" >(ids[0] &amp;&amp; ids[0].split(':')[2]) || req.mode;</span>
1754
- const mode = <span class="cstat-no" title="statement not covered" >self.apos.launder.string(req.body.mode, originalMode);</span>
1755
- <span class="cstat-no" title="statement not covered" > if (!self.isValidLocale(locale)) {</span>
1756
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('invalid');</span>
1757
- }
1758
- const found = <span class="cstat-no" title="statement not covered" >await self.apos.doc.db.find({</span>
1759
- aposLocale: `${locale}:${mode}`,
1760
- aposDocId: {
1761
- $in: ids.map(self.apos.doc.toAposDocId)
1762
- }
1763
- }).project({
1764
- _id: 1,
1765
- aposDocId: 1
1766
- }).toArray();
1767
- const result = <span class="cstat-no" title="statement not covered" >{</span>
1768
- originalLocaleIds: found.map(<span class="fstat-no" title="function not covered" >do</span>c =&gt; <span class="cstat-no" title="statement not covered" >`${doc.aposDocId}:${originalLocale}:${originalMode}`)</span>,
1769
- newLocaleIds: found.map(<span class="fstat-no" title="function not covered" >do</span>c =&gt; <span class="cstat-no" title="statement not covered" >doc._id)</span>,
1770
- aposDocIds: found.map(<span class="fstat-no" title="function not covered" >do</span>c =&gt; <span class="cstat-no" title="statement not covered" >doc.aposDocId)</span>
1771
- };
1772
- <span class="cstat-no" title="statement not covered" > return result;</span>
1773
- }
1774
- }
1775
- };
1776
- },
1777
- methods(self) {
1778
- return {
1779
- // Add the i18next resources provided by the specified module,
1780
- // merging with any existing phrases for the same locales and namespaces
1781
- addResourcesForModule(module) {
1782
- self.addDefaultResourcesForModule(module);
1783
- self.addNamespacedResourcesForModule(module);
1784
- },
1785
- // Automatically adds any localizations found in .json files in the main `i18n` subdirectory
1786
- // of a module.
1787
- //
1788
- // These are added to the `default` namespace, unless the legacy `i18n.ns` option is set
1789
- // for the module (not the preferred way, use namespace subdirectories in new projects).
1790
- addDefaultResourcesForModule(module) {
1791
- const ns = (module.options.i18n &amp;&amp; module.options.i18n.ns) || 'default';
1792
- self.namespaces[ns] = self.namespaces[ns] || {};
1793
- self.namespaces[ns].browser = self.namespaces[ns].browser || (module.options.i18n &amp;&amp; module.options.i18n.browser);
1794
- for (const entry of module.__meta.chain) {
1795
- const localizationsDir = path.join(entry.dirname, 'i18n');
1796
- if (!self.defaultLocalizationsDirsAdded.has(localizationsDir)) {
1797
- self.defaultLocalizationsDirsAdded.add(localizationsDir);
1798
- if (!fs.existsSync(localizationsDir)) {
1799
- continue;
1800
- }
1801
- for (const localizationFile of fs.readdirSync(localizationsDir)) {
1802
- if (!localizationFile.endsWith('.json')) {
1803
- // Likely a namespace subdirectory
1804
- continue;
1805
- }
1806
- const data = JSON.parse(fs.readFileSync(path.join(localizationsDir, localizationFile)));
1807
- const locale = localizationFile.replace('.json', '');
1808
- self.i18next.addResourceBundle(locale, ns, data, true, true);
1809
- }
1810
- }
1811
- }
1812
- },
1813
- // Automatically adds any localizations found in subdirectories of the main `i18n`
1814
- // subdirectory of a module. The subdirectory's name is treated as an i18n namespace
1815
- // name.
1816
- addNamespacedResourcesForModule(module) {
1817
- for (const entry of module.__meta.chain) {
1818
- const metadata = module.__meta.i18n[entry.name] || {};
1819
- const localizationsDir = `${entry.dirname}/i18n`;
1820
- if (!self.namespacedLocalizationsDirsAdded.has(localizationsDir)) {
1821
- self.namespacedLocalizationsDirsAdded.add(localizationsDir);
1822
- if (!fs.existsSync(localizationsDir)) {
1823
- continue;
1824
- }
1825
- for (const ns of fs.readdirSync(localizationsDir)) {
1826
- if (ns.endsWith('.json')) {
1827
- // A JSON file for the default namespace, already handled
1828
- continue;
1829
- }
1830
- self.namespaces[ns] = self.namespaces[ns] || {};
1831
- self.namespaces[ns].browser = self.namespaces[ns].browser ||
1832
- (metadata[ns] &amp;&amp; metadata[ns].browser);
1833
- const namespaceDir = path.join(localizationsDir, ns);
1834
- for (const localizationFile of fs.readdirSync(namespaceDir)) {
1835
- const fullLocalizationFile = path.join(namespaceDir, localizationFile);
1836
- const data = JSON.parse(fs.readFileSync(fullLocalizationFile));
1837
- const locale = localizationFile.replace('.json', '');
1838
- self.i18next.addResourceBundle(locale, ns, data, true, true);
1839
- }
1840
- }
1841
- }
1842
- }
1843
- },
1844
- // Adds i18next resources for modules initialized before the i18n module
1845
- // itself, called by init. Later modules call addResourcesForModule(self),
1846
- // making phrases available gradually as Apostrophe starts up
1847
- addInitialResources() {
1848
- self.defaultLocalizationsDirsAdded = new Set();
1849
- self.namespacedLocalizationsDirsAdded = new Set();
1850
- for (const module of Object.values(self.apos.modules)) {
1851
- self.addResourcesForModule(module);
1852
- }
1853
- },
1854
- isValidLocale(locale) {
1855
- return locale &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >has(self.locales, locale);</span>
1856
- },
1857
- // Return the best matching locale for the request based on the hostname
1858
- // and path prefix. If available the first locale matching both
1859
- // hostname and prefix is returned, otherwise the first matching locale
1860
- // that specifies only a hostname or only a prefix. If no matches are
1861
- // possible the default locale is returned.
1862
- matchLocale(req) {
1863
- const hostname = req.hostname;
1864
- let best = false;
1865
- for (const [ name, options ] of Object.entries(self.locales)) {
1866
- const matchedHostname = options.hostname
1867
- ? (hostname === options.hostname.split(':')[0]) : null;
1868
- const matchedPrefix = options.prefix
1869
- ? ((req.path === options.prefix) || req.path.startsWith(options.prefix + '/'))
1870
- : null;
1871
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.hostname &amp;&amp; options.prefix) {
1872
- <span class="cstat-no" title="statement not covered" > if (matchedHostname &amp;&amp; matchedPrefix) {</span>
1873
- // Best possible match
1874
- <span class="cstat-no" title="statement not covered" > return name;</span>
1875
- }
1876
- } else if (options.hostname) {
1877
- if (matchedHostname) {
1878
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!best) {
1879
- best = name;
1880
- }
1881
- }
1882
- } else if (options.prefix) {
1883
- if (matchedPrefix) {
1884
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!best) {
1885
- best = name;
1886
- }
1887
- }
1888
- }
1889
- }
1890
- return best || self.defaultLocale;
1891
- },
1892
- // Infer `req.locale` and `req.mode` from `_id` if they were
1893
- // not set already by explicit query parameters. Conversely,
1894
- // if the appropriate query parameters were set, rewrite
1895
- // `_id` accordingly. Returns `_id`, after rewriting if appropriate.
1896
- inferIdLocaleAndMode(req, _id) {
1897
- let [ cuid, locale, mode ] = _id.split(':');
1898
- if (locale &amp;&amp; mode) {
1899
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!req.query.aposLocale) {
1900
- req.locale = locale;
1901
- } else {
1902
- <span class="cstat-no" title="statement not covered" > locale = req.locale;</span>
1903
- }
1904
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!req.query.aposMode) {
1905
- req.mode = mode;
1906
- } else {
1907
- <span class="cstat-no" title="statement not covered" > mode = req.mode;</span>
1908
- }
1909
- } else {
1910
- // aposDocId was passed, complete the _id from whatever
1911
- // was in query params or defaults
1912
- locale = req.locale;
1913
- mode = req.mode;
1914
- }
1915
- <span class="missing-if-branch" title="if path not taken" >I</span>if ((req.mode === 'draft') &amp;&amp; (!self.apos.permission.can(req, 'view-draft'))) {
1916
- <span class="cstat-no" title="statement not covered" > throw self.apos.error('forbidden');</span>
1917
- }
1918
- if (_id.charAt(0) === '_') {
1919
- // A shortcut such as _home or _archive,
1920
- // will be interpreted later
1921
- return _id;
1922
- } else {
1923
- return `${cuid}:${locale}:${mode}`;
1924
- }
1925
- },
1926
- getBrowserData(req) {
1927
- const i18n = {
1928
- [req.locale]: self.getBrowserBundles(req.locale)
1929
- };
1930
- <span class="missing-if-branch" title="if path not taken" >I</span>if (req.locale !== self.defaultLocale) {
1931
- <span class="cstat-no" title="statement not covered" > i18n[self.defaultLocale] = self.getBrowserBundles(self.defaultLocale);</span>
1932
- }
1933
- // In case the default locale also has inadequate admin UI phrases
1934
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!i18n.en) {
1935
- <span class="cstat-no" title="statement not covered" > i18n.en = self.getBrowserBundles('en');</span>
1936
- }
1937
- const result = {
1938
- i18n,
1939
- locale: req.locale,
1940
- defaultLocale: self.defaultLocale,
1941
- defaultNamespace: self.defaultNamespace,
1942
- locales: self.locales,
1943
- debug: self.debug,
1944
- show: self.show,
1945
- action: self.action,
1946
- crossDomainClipboard: req.session &amp;&amp; req.session.aposCrossDomainClipboard
1947
- };
1948
- <span class="missing-if-branch" title="if path not taken" >I</span>if (req.session &amp;&amp; req.session.aposCrossDomainClipboard) {
1949
- <span class="cstat-no" title="statement not covered" > req.session.aposCrossDomainClipboard = null;</span>
1950
- }
1951
- return result;
1952
- },
1953
- getBrowserBundles(locale) {
1954
- const i18n = {};
1955
- for (const [ name, options ] of Object.entries(self.namespaces)) {
1956
- if (options.browser) {
1957
- i18n[name] = self.i18next.getResourceBundle(locale, name);
1958
- }
1959
- }
1960
- return i18n;
1961
- },
1962
- getLocales() {
1963
- const locales = self.options.locales || {
1964
- en: {
1965
- label: 'English'
1966
- }
1967
- };
1968
- const taken = {};
1969
- let hostnamesCount = 0;
1970
- for (const [ name, options ] of Object.entries(locales)) {
1971
- const key = (options.hostname || '__none') + ':' + (options.prefix || '__none');
1972
- hostnamesCount += (options.hostname ? 1 : 0);
1973
- <span class="missing-if-branch" title="if path not taken" >I</span>if (taken[key]) {
1974
- <span class="cstat-no" title="statement not covered" > throw new Error(stripIndent`</span>
1975
- @apostrophecms/i18n: the locale ${name} cannot be distinguished from
1976
- earlier locales. Make sure it is uniquely distinguished by its hostname
1977
- option, prefix option or a combination of the two. One locale per site
1978
- may be a default with neither hostname nor prefix, and one locale per
1979
- hostname may be a default for that hostname without a prefix.
1980
- `);
1981
- }
1982
- taken[key] = true;
1983
- }
1984
- <span class="missing-if-branch" title="if path not taken" >I</span>if ((hostnamesCount &gt; 0) &amp;&amp; (hostnamesCount &lt; Object.keys(locales).length) &amp;&amp; (!self.apos.options.baseUrl)) {
1985
- <span class="cstat-no" title="statement not covered" > throw new Error(stripIndent`</span>
1986
- If some of your locales have hostnames, then they all must have
1987
- hostnames, or your top-level baseUrl option must be set.
1988
- &nbsp;
1989
- In development, you can set baseUrl to http://localhost:3000
1990
- for testing purposes. In production it should always be set
1991
- to a real base URL for the site.
1992
- `);
1993
- }
1994
- // Make sure they are adequately distinguished by
1995
- // hostname and prefix
1996
- return locales;
1997
- },
1998
- sanitizeLocaleName(locale) {
1999
- locale = self.apos.launder.string(locale);
2000
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!has(self.locales, locale)) {
2001
- <span class="cstat-no" title="statement not covered" > return null;</span>
2002
- }
2003
- return locale;
2004
- },
2005
- addLocalizeModal() {
2006
- self.apos.modal.add(
2007
- `${self.__meta.name}:localize`,
2008
- self.getComponentName('localizeModal', 'AposI18nLocalize'),
2009
- { moduleName: self.__meta.name }
2010
- );
2011
- },
2012
- setPrefixUrls(req) {
2013
- // In a production-like environment, use req.hostname, otherwise the Host header
2014
- // to allow port numbers in dev.
2015
- //
2016
- // Watch out for modules that won't be set up if this is an afterInit task in an
2017
- // early module like the asset module
2018
- const host = (process.env.NODE_ENV === 'production') ? req.hostname : req.get('Host');
2019
- const fallbackBaseUrl = `${req.protocol}://${host}`;
2020
- if (self.hostnamesInUse) {
2021
- req.baseUrl = (self.apos.page &amp;&amp; self.apos.page.getBaseUrl(req)) || <span class="branch-2 cbranch-no" title="branch not covered" >fallbackBaseUrl;</span>
2022
- } else {
2023
- req.baseUrl = self.apos.page &amp;&amp; self.apos.page.getBaseUrl(req);
2024
- }
2025
- req.baseUrlWithPrefix = `${req.baseUrl}${self.apos.prefix}`;
2026
- req.absoluteUrl = req.baseUrlWithPrefix + req.url;
2027
- req.prefix = `${req.baseUrlWithPrefix}${self.locales[req.locale].prefix || ''}`;
2028
- if (!req.baseUrl) {
2029
- // Always set for bc, but in the absence of locale hostnames we
2030
- // set it later so it is not part of req.prefix
2031
- req.baseUrl = fallbackBaseUrl;
2032
- }
2033
- },
2034
- // Returns an Express route suitable for use in a module
2035
- // like a piece type or the page module. The returned route will
2036
- // expect req.params._id and req.params.toLocale and redirect,
2037
- // if possible, to the corresponding version in toLocale.
2038
- toLocaleRouteFactory(module) {
2039
- return <span class="fstat-no" title="function not covered" >as</span>ync (req, res) =&gt; {
2040
- const _id = <span class="cstat-no" title="statement not covered" >module.inferIdLocaleAndMode(req, req.params._id);</span>
2041
- const toLocale = <span class="cstat-no" title="statement not covered" >req.params.toLocale;</span>
2042
- const localeReq = <span class="cstat-no" title="statement not covered" >req.clone({</span>
2043
- locale: toLocale
2044
- });
2045
- const corresponding = <span class="cstat-no" title="statement not covered" >await module.find(localeReq, {</span>
2046
- _id: `${_id.split(':')[0]}:${localeReq.locale}:${localeReq.mode}`
2047
- }).toObject();
2048
- <span class="cstat-no" title="statement not covered" > if (!corresponding) {</span>
2049
- <span class="cstat-no" title="statement not covered" > return res.status(404).send('not found');</span>
2050
- }
2051
- <span class="cstat-no" title="statement not covered" > if (!corresponding._url) {</span>
2052
- <span class="cstat-no" title="statement not covered" > return res.status(400).send('invalid (has no URL)');</span>
2053
- }
2054
- <span class="cstat-no" title="statement not covered" > return res.redirect(corresponding._url);</span>
2055
- };
2056
- }
2057
- };
2058
- }
2059
- };
2060
- &nbsp;
2061
- function has(o, k) {
2062
- return Object.prototype.hasOwnProperty.call(o, k);
2063
- }
2064
- &nbsp;</pre></td></tr></table></pre>
2065
-
2066
- <div class='push'></div><!-- for sticky footer -->
2067
- </div><!-- /wrapper -->
2068
- <div class='footer quiet pad2 space-top1 center small'>
2069
- Code coverage generated by
2070
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2071
- at Wed Jun 08 2022 11:06:49 GMT+0200 (Central European Summer Time)
2072
- </div>
2073
- <script src="../../../../prettify.js"></script>
2074
- <script>
2075
- window.onload = function () {
2076
- prettyPrint();
2077
- };
2078
- </script>
2079
- <script src="../../../../sorter.js"></script>
2080
- <script src="../../../../block-navigation.js"></script>
2081
- </body>
2082
- </html>
2083
-