@budibase/server 2.3.1 → 2.3.2-alpha.1

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 (514) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/builder/assets/{index.3dd03883.css → index.584d49b4.css} +1 -1
  3. package/builder/assets/{index.5dbe1f07.js → index.f9a5e06c.js} +207 -207
  4. package/builder/index.html +2 -2
  5. package/coverage/clover.xml +8468 -4046
  6. package/coverage/coverage-final.json +153 -70
  7. package/coverage/lcov-report/index.html +332 -122
  8. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +1 -1
  9. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +1 -1
  10. package/coverage/lcov-report/src/api/controllers/application.ts.html +114 -114
  11. package/coverage/lcov-report/src/api/controllers/auth.ts.html +1 -1
  12. package/coverage/lcov-report/src/api/controllers/automation.ts.html +25 -25
  13. package/coverage/lcov-report/src/api/controllers/backup.ts.html +1 -1
  14. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +15 -15
  15. package/coverage/lcov-report/src/api/controllers/component.ts.html +1 -1
  16. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +17 -17
  17. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +12 -12
  18. package/coverage/lcov-report/src/api/controllers/deploy/index.html +1 -1
  19. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +70 -70
  20. package/coverage/lcov-report/src/api/controllers/dev.ts.html +10 -10
  21. package/coverage/lcov-report/src/api/controllers/index.html +35 -35
  22. package/coverage/lcov-report/src/api/controllers/integration.ts.html +1 -1
  23. package/coverage/lcov-report/src/api/controllers/layout.ts.html +11 -11
  24. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +1 -1
  25. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +1 -1
  26. package/coverage/lcov-report/src/api/controllers/permission.ts.html +22 -22
  27. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +1 -1
  28. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +1 -1
  29. package/coverage/lcov-report/src/api/controllers/plugin/index.html +1 -1
  30. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +8 -8
  31. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +1 -1
  32. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +1 -1
  33. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +1 -1
  34. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +1 -1
  35. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +1 -1
  36. package/coverage/lcov-report/src/api/controllers/public/index.html +1 -1
  37. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +1 -1
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +1 -1
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +1 -1
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +1 -1
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +1 -1
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +1 -1
  43. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +1 -1
  44. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +1 -1
  45. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +1 -1
  46. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +1 -1
  47. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +1 -1
  48. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +1 -1
  49. package/coverage/lcov-report/src/api/controllers/query/import/index.html +1 -1
  50. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +1 -1
  51. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +1 -1
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +1 -1
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +1 -1
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +1 -1
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +1 -1
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +1 -1
  57. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +1 -1
  58. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/curl/curl.spec.js.html +391 -0
  59. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/curl/index.html +116 -0
  60. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi2/index.html +116 -0
  61. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js.html +796 -0
  62. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi3/index.html +116 -0
  63. package/coverage/lcov-report/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js.html +805 -0
  64. package/coverage/lcov-report/src/api/controllers/query/import/tests/index.html +116 -0
  65. package/coverage/lcov-report/src/api/controllers/query/import/tests/index.spec.js.html +568 -0
  66. package/coverage/lcov-report/src/api/controllers/query/index.html +1 -1
  67. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +13 -13
  68. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +1 -1
  69. package/coverage/lcov-report/src/api/controllers/role.ts.html +1 -1
  70. package/coverage/lcov-report/src/api/controllers/routing.ts.html +1 -1
  71. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +1 -1
  72. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +1 -1
  73. package/coverage/lcov-report/src/api/controllers/row/index.html +5 -5
  74. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +16 -16
  75. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +16 -16
  76. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +1 -1
  77. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +16 -16
  78. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +15 -15
  79. package/coverage/lcov-report/src/api/controllers/screen.ts.html +21 -21
  80. package/coverage/lcov-report/src/api/controllers/script.ts.html +1 -1
  81. package/coverage/lcov-report/src/api/controllers/static/index.html +1 -1
  82. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +1 -1
  83. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +43 -43
  84. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +1 -1
  85. package/coverage/lcov-report/src/api/controllers/table/index.html +20 -20
  86. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +18 -18
  87. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +49 -49
  88. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +34 -34
  89. package/coverage/lcov-report/src/api/controllers/templates.ts.html +1 -1
  90. package/coverage/lcov-report/src/api/controllers/user.ts.html +15 -15
  91. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +1 -1
  92. package/coverage/lcov-report/src/api/controllers/view/index.html +1 -1
  93. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +1 -1
  94. package/coverage/lcov-report/src/api/controllers/view/tests/index.html +116 -0
  95. package/coverage/lcov-report/src/api/controllers/view/tests/viewBuilder.spec.js.html +277 -0
  96. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +1 -1
  97. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +1 -1
  98. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +13 -13
  99. package/coverage/lcov-report/src/api/index.html +1 -1
  100. package/coverage/lcov-report/src/api/index.ts.html +5 -5
  101. package/coverage/lcov-report/src/api/routes/analytics.ts.html +1 -1
  102. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +1 -1
  103. package/coverage/lcov-report/src/api/routes/application.ts.html +1 -1
  104. package/coverage/lcov-report/src/api/routes/auth.ts.html +1 -1
  105. package/coverage/lcov-report/src/api/routes/automation.ts.html +1 -1
  106. package/coverage/lcov-report/src/api/routes/backup.ts.html +1 -1
  107. package/coverage/lcov-report/src/api/routes/cloud.ts.html +1 -1
  108. package/coverage/lcov-report/src/api/routes/component.ts.html +1 -1
  109. package/coverage/lcov-report/src/api/routes/datasource.ts.html +1 -1
  110. package/coverage/lcov-report/src/api/routes/deploy.ts.html +1 -1
  111. package/coverage/lcov-report/src/api/routes/dev.ts.html +1 -1
  112. package/coverage/lcov-report/src/api/routes/index.html +1 -1
  113. package/coverage/lcov-report/src/api/routes/index.ts.html +1 -1
  114. package/coverage/lcov-report/src/api/routes/integration.ts.html +1 -1
  115. package/coverage/lcov-report/src/api/routes/layout.ts.html +1 -1
  116. package/coverage/lcov-report/src/api/routes/metadata.ts.html +1 -1
  117. package/coverage/lcov-report/src/api/routes/migrations.ts.html +1 -1
  118. package/coverage/lcov-report/src/api/routes/permission.ts.html +1 -1
  119. package/coverage/lcov-report/src/api/routes/plugin.ts.html +1 -1
  120. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +2 -5
  121. package/coverage/lcov-report/src/api/routes/public/index.html +1 -1
  122. package/coverage/lcov-report/src/api/routes/public/index.ts.html +1 -1
  123. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +1 -1
  124. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +1 -1
  125. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +1 -1
  126. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +1 -1
  127. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +1 -1
  128. package/coverage/lcov-report/src/api/routes/public/tests/compare.spec.js.html +583 -0
  129. package/coverage/lcov-report/src/api/routes/public/tests/index.html +38 -8
  130. package/coverage/lcov-report/src/api/routes/public/tests/users.spec.js.html +199 -0
  131. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +1 -1
  132. package/coverage/lcov-report/src/api/routes/public/users.ts.html +1 -1
  133. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +1 -1
  134. package/coverage/lcov-report/src/api/routes/public/utils/index.html +1 -1
  135. package/coverage/lcov-report/src/api/routes/query.ts.html +1 -1
  136. package/coverage/lcov-report/src/api/routes/role.ts.html +1 -1
  137. package/coverage/lcov-report/src/api/routes/routing.ts.html +1 -1
  138. package/coverage/lcov-report/src/api/routes/row.ts.html +1 -1
  139. package/coverage/lcov-report/src/api/routes/screen.ts.html +1 -1
  140. package/coverage/lcov-report/src/api/routes/script.ts.html +1 -1
  141. package/coverage/lcov-report/src/api/routes/static.ts.html +1 -1
  142. package/coverage/lcov-report/src/api/routes/table.ts.html +1 -1
  143. package/coverage/lcov-report/src/api/routes/templates.ts.html +1 -1
  144. package/coverage/lcov-report/src/api/routes/tests/analytics.spec.js.html +271 -0
  145. package/coverage/lcov-report/src/api/routes/tests/apikeys.spec.js.html +259 -0
  146. package/coverage/lcov-report/src/api/routes/tests/application.spec.ts.html +1066 -0
  147. package/coverage/lcov-report/src/api/routes/tests/auth.spec.js.html +154 -0
  148. package/coverage/lcov-report/src/api/routes/tests/automation.spec.js.html +1123 -0
  149. package/coverage/lcov-report/src/api/routes/tests/backup.spec.ts.html +223 -0
  150. package/coverage/lcov-report/src/api/routes/tests/cloud.seq.spec.ts.html +268 -0
  151. package/coverage/lcov-report/src/api/routes/tests/component.spec.js.html +178 -0
  152. package/coverage/lcov-report/src/api/routes/tests/datasource.spec.ts.html +799 -0
  153. package/coverage/lcov-report/src/api/routes/tests/dev.spec.js.html +202 -0
  154. package/coverage/lcov-report/src/api/routes/tests/index.html +521 -0
  155. package/coverage/lcov-report/src/api/routes/tests/integration.spec.js.html +238 -0
  156. package/coverage/lcov-report/src/api/routes/tests/internalSearch.spec.js.html +670 -0
  157. package/coverage/lcov-report/src/api/routes/tests/layout.spec.js.html +259 -0
  158. package/coverage/lcov-report/src/api/routes/tests/metadata.spec.js.html +280 -0
  159. package/coverage/lcov-report/src/api/routes/tests/misc.spec.js.html +358 -0
  160. package/coverage/lcov-report/src/api/routes/tests/permissions.spec.js.html +484 -0
  161. package/coverage/lcov-report/src/api/routes/tests/plugin.spec.ts.html +622 -0
  162. package/coverage/lcov-report/src/api/routes/tests/query.seq.spec.js.html +1696 -0
  163. package/coverage/lcov-report/src/api/routes/tests/role.spec.js.html +478 -0
  164. package/coverage/lcov-report/src/api/routes/tests/routing.spec.js.html +430 -0
  165. package/coverage/lcov-report/src/api/routes/tests/row.spec.js.html +1804 -0
  166. package/coverage/lcov-report/src/api/routes/tests/screen.spec.js.html +391 -0
  167. package/coverage/lcov-report/src/api/routes/tests/static.spec.js.html +541 -0
  168. package/coverage/lcov-report/src/api/routes/tests/table.spec.js.html +991 -0
  169. package/coverage/lcov-report/src/api/routes/tests/templates.spec.js.html +154 -0
  170. package/coverage/lcov-report/src/api/routes/tests/user.spec.js.html +688 -0
  171. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +110 -41
  172. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +19 -19
  173. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +11 -5
  174. package/coverage/lcov-report/src/api/routes/tests/view.spec.js.html +1342 -0
  175. package/coverage/lcov-report/src/api/routes/tests/webhook.spec.js.html +484 -0
  176. package/coverage/lcov-report/src/api/routes/user.ts.html +1 -1
  177. package/coverage/lcov-report/src/api/routes/utils/index.html +1 -1
  178. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +1 -1
  179. package/coverage/lcov-report/src/api/routes/view.ts.html +1 -1
  180. package/coverage/lcov-report/src/api/routes/webhook.ts.html +1 -1
  181. package/coverage/lcov-report/src/app.ts.html +6 -3
  182. package/coverage/lcov-report/src/automations/actions.ts.html +1 -1
  183. package/coverage/lcov-report/src/automations/automationUtils.ts.html +1 -1
  184. package/coverage/lcov-report/src/automations/bullboard.ts.html +2 -2
  185. package/coverage/lcov-report/src/automations/index.html +27 -27
  186. package/coverage/lcov-report/src/automations/index.ts.html +5 -5
  187. package/coverage/lcov-report/src/automations/logging/index.html +1 -1
  188. package/coverage/lcov-report/src/automations/logging/index.ts.html +7 -7
  189. package/coverage/lcov-report/src/automations/steps/bash.ts.html +1 -1
  190. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +1 -1
  191. package/coverage/lcov-report/src/automations/steps/delay.ts.html +1 -1
  192. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +1 -1
  193. package/coverage/lcov-report/src/automations/steps/discord.ts.html +1 -1
  194. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +1 -1
  195. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +1 -1
  196. package/coverage/lcov-report/src/automations/steps/filter.ts.html +1 -1
  197. package/coverage/lcov-report/src/automations/steps/index.html +1 -1
  198. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +1 -1
  199. package/coverage/lcov-report/src/automations/steps/loop.ts.html +1 -1
  200. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +1 -1
  201. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +1 -1
  202. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +1 -1
  203. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +1 -1
  204. package/coverage/lcov-report/src/automations/steps/slack.ts.html +1 -1
  205. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +1 -1
  206. package/coverage/lcov-report/src/automations/steps/utils.ts.html +1 -1
  207. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +1 -1
  208. package/coverage/lcov-report/src/automations/tests/automation.spec.js.html +337 -0
  209. package/coverage/lcov-report/src/automations/tests/bash.spec.js.html +187 -0
  210. package/coverage/lcov-report/src/automations/tests/createRow.spec.ts.html +223 -0
  211. package/coverage/lcov-report/src/automations/tests/delay.spec.js.html +133 -0
  212. package/coverage/lcov-report/src/automations/tests/deleteRow.spec.ts.html +250 -0
  213. package/coverage/lcov-report/src/automations/tests/discord.spec.js.html +166 -0
  214. package/coverage/lcov-report/src/automations/tests/executeQuery.spec.js.html +229 -0
  215. package/coverage/lcov-report/src/automations/tests/executeScript.spec.js.html +229 -0
  216. package/coverage/lcov-report/src/automations/tests/filter.spec.js.html +232 -0
  217. package/coverage/lcov-report/src/automations/tests/index.html +341 -0
  218. package/coverage/lcov-report/src/automations/tests/loop.spec.ts.html +220 -0
  219. package/coverage/lcov-report/src/automations/tests/outgoingWebhook.spec.js.html +202 -0
  220. package/coverage/lcov-report/src/automations/tests/queryRows.spec.js.html +436 -0
  221. package/coverage/lcov-report/src/automations/tests/sendSmtpEmail.spec.js.html +298 -0
  222. package/coverage/lcov-report/src/automations/tests/serverLog.spec.js.html +151 -0
  223. package/coverage/lcov-report/src/automations/tests/updateRow.spec.js.html +217 -0
  224. package/coverage/lcov-report/src/automations/tests/utilities/index.html +1 -1
  225. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +1 -1
  226. package/coverage/lcov-report/src/automations/tests/zapier.spec.js.html +166 -0
  227. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +1 -1
  228. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +1 -1
  229. package/coverage/lcov-report/src/automations/triggerInfo/index.html +1 -1
  230. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +1 -1
  231. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +1 -1
  232. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +1 -1
  233. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +1 -1
  234. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +1 -1
  235. package/coverage/lcov-report/src/automations/triggers.ts.html +24 -24
  236. package/coverage/lcov-report/src/automations/unitTests/automationUtils.spec.ts.html +280 -0
  237. package/coverage/lcov-report/src/automations/unitTests/index.html +116 -0
  238. package/coverage/lcov-report/src/automations/utils.ts.html +38 -38
  239. package/coverage/lcov-report/src/constants/index.html +1 -1
  240. package/coverage/lcov-report/src/constants/index.ts.html +2 -2
  241. package/coverage/lcov-report/src/constants/layouts.ts.html +1 -1
  242. package/coverage/lcov-report/src/constants/screens.ts.html +3 -3
  243. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +1 -1
  244. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +1 -1
  245. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +1 -1
  246. package/coverage/lcov-report/src/db/defaultData/index.html +1 -1
  247. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +1 -1
  248. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +1 -1
  249. package/coverage/lcov-report/src/db/dynamoClient.ts.html +1 -1
  250. package/coverage/lcov-report/src/db/inMemoryView.ts.html +1 -1
  251. package/coverage/lcov-report/src/db/index.html +16 -16
  252. package/coverage/lcov-report/src/db/index.ts.html +13 -13
  253. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +12 -12
  254. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +1 -1
  255. package/coverage/lcov-report/src/db/linkedRows/index.html +1 -1
  256. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +15 -15
  257. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +6 -6
  258. package/coverage/lcov-report/src/db/newid.ts.html +3 -3
  259. package/coverage/lcov-report/src/db/tests/index.html +131 -0
  260. package/coverage/lcov-report/src/db/tests/linkController.spec.js.html +793 -0
  261. package/coverage/lcov-report/src/db/tests/linkTests.spec.js.html +277 -0
  262. package/coverage/lcov-report/src/db/utils.ts.html +33 -33
  263. package/coverage/lcov-report/src/definitions/automations.ts.html +1 -1
  264. package/coverage/lcov-report/src/definitions/index.html +1 -1
  265. package/coverage/lcov-report/src/environment.ts.html +19 -19
  266. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +1 -1
  267. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +1 -1
  268. package/coverage/lcov-report/src/events/index.html +1 -1
  269. package/coverage/lcov-report/src/events/index.ts.html +1 -1
  270. package/coverage/lcov-report/src/events/utils.ts.html +1 -1
  271. package/coverage/lcov-report/src/index.html +16 -16
  272. package/coverage/lcov-report/src/index.ts.html +1 -1
  273. package/coverage/lcov-report/src/integrations/airtable.ts.html +1 -1
  274. package/coverage/lcov-report/src/integrations/arangodb.ts.html +1 -1
  275. package/coverage/lcov-report/src/integrations/base/index.html +1 -1
  276. package/coverage/lcov-report/src/integrations/base/query.ts.html +1 -1
  277. package/coverage/lcov-report/src/integrations/base/sql.ts.html +1 -1
  278. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +1 -1
  279. package/coverage/lcov-report/src/integrations/base/utils.ts.html +1 -1
  280. package/coverage/lcov-report/src/integrations/couchdb.ts.html +1 -1
  281. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +1 -1
  282. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +1 -1
  283. package/coverage/lcov-report/src/integrations/firebase.ts.html +1 -1
  284. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +1 -1
  285. package/coverage/lcov-report/src/integrations/index.html +1 -1
  286. package/coverage/lcov-report/src/integrations/index.ts.html +10 -10
  287. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +1 -1
  288. package/coverage/lcov-report/src/integrations/mongodb.ts.html +1 -1
  289. package/coverage/lcov-report/src/integrations/mysql.ts.html +1 -1
  290. package/coverage/lcov-report/src/integrations/oracle.ts.html +1 -1
  291. package/coverage/lcov-report/src/integrations/postgres.ts.html +1 -1
  292. package/coverage/lcov-report/src/integrations/queries/index.html +1 -1
  293. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +1 -1
  294. package/coverage/lcov-report/src/integrations/redis.ts.html +1 -1
  295. package/coverage/lcov-report/src/integrations/rest.ts.html +1 -1
  296. package/coverage/lcov-report/src/integrations/s3.ts.html +1 -1
  297. package/coverage/lcov-report/src/integrations/snowflake.ts.html +1 -1
  298. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
  299. package/coverage/lcov-report/src/integrations/tests/airtable.spec.ts.html +310 -0
  300. package/coverage/lcov-report/src/integrations/tests/arangodb.spec.ts.html +199 -0
  301. package/coverage/lcov-report/src/integrations/tests/couchdb.spec.ts.html +349 -0
  302. package/coverage/lcov-report/src/integrations/tests/dynamodb.spec.ts.html +550 -0
  303. package/coverage/lcov-report/src/integrations/tests/elasticsearch.spec.ts.html +331 -0
  304. package/coverage/lcov-report/src/integrations/tests/firebase.spec.ts.html +376 -0
  305. package/coverage/lcov-report/src/integrations/tests/index.html +230 -5
  306. package/coverage/lcov-report/src/integrations/tests/microsoftSqlServer.spec.ts.html +253 -0
  307. package/coverage/lcov-report/src/integrations/tests/mongo.spec.ts.html +1087 -0
  308. package/coverage/lcov-report/src/integrations/tests/mysql.spec.ts.html +484 -0
  309. package/coverage/lcov-report/src/integrations/tests/oracle.spec.ts.html +373 -0
  310. package/coverage/lcov-report/src/integrations/tests/postgres.spec.ts.html +328 -0
  311. package/coverage/lcov-report/src/integrations/tests/redis.spec.ts.html +337 -0
  312. package/coverage/lcov-report/src/integrations/tests/rest.spec.ts.html +1870 -0
  313. package/coverage/lcov-report/src/integrations/tests/s3.spec.ts.html +421 -0
  314. package/coverage/lcov-report/src/integrations/tests/sql.spec.ts.html +1753 -0
  315. package/coverage/lcov-report/src/integrations/utils.ts.html +3 -3
  316. package/coverage/lcov-report/src/middleware/appInfo.ts.html +1 -1
  317. package/coverage/lcov-report/src/middleware/authorized.ts.html +19 -19
  318. package/coverage/lcov-report/src/middleware/builder.ts.html +13 -13
  319. package/coverage/lcov-report/src/middleware/currentapp.ts.html +47 -47
  320. package/coverage/lcov-report/src/middleware/index.html +15 -15
  321. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +1 -1
  322. package/coverage/lcov-report/src/middleware/publicApi.ts.html +1 -1
  323. package/coverage/lcov-report/src/middleware/resourceId.ts.html +1 -1
  324. package/coverage/lcov-report/src/middleware/selfhost.ts.html +1 -1
  325. package/coverage/lcov-report/src/middleware/tests/authorized.spec.js.html +574 -0
  326. package/coverage/lcov-report/src/middleware/tests/currentapp.spec.js.html +814 -0
  327. package/coverage/lcov-report/src/middleware/tests/index.html +161 -0
  328. package/coverage/lcov-report/src/middleware/tests/resourceId.spec.js.html +397 -0
  329. package/coverage/lcov-report/src/middleware/tests/selfhost.spec.js.html +214 -0
  330. package/coverage/lcov-report/src/middleware/utils.ts.html +3 -3
  331. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +1 -1
  332. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +1 -1
  333. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +1 -1
  334. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +1 -1
  335. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +1 -1
  336. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +1 -1
  337. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +1 -1
  338. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +1 -1
  339. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +1 -1
  340. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +1 -1
  341. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +1 -1
  342. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +1 -1
  343. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +1 -1
  344. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +1 -1
  345. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +1 -1
  346. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +1 -1
  347. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +1 -1
  348. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +1 -1
  349. package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
  350. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +1 -1
  351. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +1 -1
  352. package/coverage/lcov-report/src/migrations/functions/tests/appUrls.spec.js.html +163 -0
  353. package/coverage/lcov-report/src/migrations/functions/tests/index.html +161 -0
  354. package/coverage/lcov-report/src/migrations/functions/tests/syncQuotas.spec.js.html +163 -0
  355. package/coverage/lcov-report/src/migrations/functions/tests/tableSettings.spec.ts.html +517 -0
  356. package/coverage/lcov-report/src/migrations/functions/tests/userEmailViewCasing.spec.js.html +190 -0
  357. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +1 -1
  358. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +1 -1
  359. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +1 -1
  360. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +1 -1
  361. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +1 -1
  362. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/index.html +131 -0
  363. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts.html +190 -0
  364. package/coverage/lcov-report/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts.html +244 -0
  365. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +1 -1
  366. package/coverage/lcov-report/src/migrations/index.html +1 -1
  367. package/coverage/lcov-report/src/migrations/index.ts.html +1 -1
  368. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +1 -1
  369. package/coverage/lcov-report/src/migrations/tests/index.html +23 -8
  370. package/coverage/lcov-report/src/migrations/tests/index.spec.ts.html +535 -0
  371. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +1 -1
  372. package/coverage/lcov-report/src/sdk/app/applications/index.html +1 -1
  373. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +1 -1
  374. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +18 -18
  375. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +7 -7
  376. package/coverage/lcov-report/src/sdk/app/automations/index.html +1 -1
  377. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +1 -1
  378. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +8 -8
  379. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +1 -1
  380. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +26 -8
  381. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +1 -1
  382. package/coverage/lcov-report/src/sdk/app/backups/index.html +10 -10
  383. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +1 -1
  384. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +1 -1
  385. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +15 -15
  386. package/coverage/lcov-report/src/sdk/app/datasources/index.html +1 -1
  387. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +1 -1
  388. package/coverage/lcov-report/src/sdk/app/queries/index.html +1 -1
  389. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +1 -1
  390. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +1 -1
  391. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +1 -1
  392. package/coverage/lcov-report/src/sdk/app/rows/index.html +1 -1
  393. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +1 -1
  394. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +1 -1
  395. package/coverage/lcov-report/src/sdk/app/tables/index.html +1 -1
  396. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +5 -5
  397. package/coverage/lcov-report/src/sdk/index.html +1 -1
  398. package/coverage/lcov-report/src/sdk/index.ts.html +2 -2
  399. package/coverage/lcov-report/src/sdk/tests/attachments.spec.ts.html +313 -0
  400. package/coverage/lcov-report/src/sdk/tests/index.html +116 -0
  401. package/coverage/lcov-report/src/sdk/users/index.html +1 -1
  402. package/coverage/lcov-report/src/sdk/users/index.ts.html +1 -1
  403. package/coverage/lcov-report/src/sdk/users/utils.ts.html +24 -24
  404. package/coverage/lcov-report/src/sdk/utils/index.html +1 -1
  405. package/coverage/lcov-report/src/sdk/utils/index.ts.html +1 -1
  406. package/coverage/lcov-report/src/startup.ts.html +4 -4
  407. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +308 -140
  408. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +6 -6
  409. package/coverage/lcov-report/src/tests/utilities/index.html +18 -18
  410. package/coverage/lcov-report/src/tests/utilities/index.ts.html +1 -1
  411. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +18 -18
  412. package/coverage/lcov-report/src/threads/automation.ts.html +1 -1
  413. package/coverage/lcov-report/src/threads/index.html +1 -1
  414. package/coverage/lcov-report/src/threads/index.ts.html +1 -1
  415. package/coverage/lcov-report/src/threads/query.ts.html +1 -1
  416. package/coverage/lcov-report/src/threads/utils.ts.html +1 -1
  417. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +2 -2
  418. package/coverage/lcov-report/src/utilities/centralPath.ts.html +1 -1
  419. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +3 -3
  420. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +1 -1
  421. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +1 -1
  422. package/coverage/lcov-report/src/utilities/fileSystem/index.html +1 -1
  423. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +1 -1
  424. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +1 -1
  425. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +1 -1
  426. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +1 -1
  427. package/coverage/lcov-report/src/utilities/global.ts.html +36 -36
  428. package/coverage/lcov-report/src/utilities/index.html +34 -19
  429. package/coverage/lcov-report/src/utilities/index.ts.html +19 -19
  430. package/coverage/lcov-report/src/utilities/redis.ts.html +1 -1
  431. package/coverage/lcov-report/src/utilities/retry.ts.html +139 -0
  432. package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
  433. package/coverage/lcov-report/src/utilities/routing/index.ts.html +1 -1
  434. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +1 -1
  435. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +41 -41
  436. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +2 -2
  437. package/coverage/lcov-report/src/utilities/rowProcessor/tests/index.html +116 -0
  438. package/coverage/lcov-report/src/utilities/rowProcessor/tests/utils.spec.ts.html +256 -0
  439. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +12 -12
  440. package/coverage/lcov-report/src/utilities/schema.ts.html +1 -1
  441. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +1 -1
  442. package/coverage/lcov-report/src/utilities/security.ts.html +19 -19
  443. package/coverage/lcov-report/src/utilities/usageQuota/index.html +1 -1
  444. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +32 -32
  445. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +1 -1
  446. package/coverage/lcov-report/src/utilities/users.ts.html +1 -1
  447. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +15 -15
  448. package/coverage/lcov-report/src/watch.ts.html +1 -1
  449. package/coverage/lcov-report/src/websocket.ts.html +1 -1
  450. package/coverage/lcov.info +14432 -7219
  451. package/dist/app.js +1 -1
  452. package/dist/package.json +8 -6
  453. package/dist/sdk/app/backups/exports.js +8 -2
  454. package/dist/tsconfig.build.tsbuildinfo +1 -1
  455. package/dist/utilities/retry.js +30 -0
  456. package/jest-testcontainers-config.js +8 -0
  457. package/jest.config.ts +28 -11
  458. package/package.json +9 -7
  459. package/scripts/load/create-many-apps.js +24 -0
  460. package/scripts/load/create-many-rows.js +30 -0
  461. package/scripts/load/utils.js +66 -0
  462. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  463. package/src/api/routes/public/applications.ts +0 -1
  464. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  465. package/src/api/routes/tests/analytics.spec.js +4 -1
  466. package/src/api/routes/tests/apikeys.spec.js +1 -1
  467. package/src/api/routes/tests/application.spec.ts +20 -6
  468. package/src/api/routes/tests/auth.spec.js +2 -2
  469. package/src/api/routes/tests/automation.spec.js +6 -2
  470. package/src/api/routes/tests/backup.spec.ts +4 -13
  471. package/src/api/routes/tests/{cloud.spec.ts → cloud.seq.spec.ts} +10 -14
  472. package/src/api/routes/tests/component.spec.js +1 -1
  473. package/src/api/routes/tests/datasource.spec.ts +20 -3
  474. package/src/api/routes/tests/dev.spec.js +1 -1
  475. package/src/api/routes/tests/integration.spec.js +1 -1
  476. package/src/api/routes/tests/layout.spec.js +1 -1
  477. package/src/api/routes/tests/metadata.spec.js +1 -1
  478. package/src/api/routes/tests/misc.spec.js +1 -1
  479. package/src/api/routes/tests/permissions.spec.js +4 -1
  480. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +21 -1
  481. package/src/api/routes/tests/role.spec.js +6 -1
  482. package/src/api/routes/tests/routing.spec.js +1 -1
  483. package/src/api/routes/tests/row.spec.js +11 -3
  484. package/src/api/routes/tests/screen.spec.js +1 -1
  485. package/src/api/routes/tests/static.spec.js +2 -1
  486. package/src/api/routes/tests/table.spec.js +1 -1
  487. package/src/api/routes/tests/templates.spec.js +1 -1
  488. package/src/api/routes/tests/user.spec.js +3 -0
  489. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -2
  490. package/src/api/routes/tests/utilities/index.ts +5 -3
  491. package/src/api/routes/tests/view.spec.js +4 -1
  492. package/src/api/routes/tests/webhook.spec.js +11 -2
  493. package/src/app.ts +2 -1
  494. package/src/automations/tests/automation.spec.js +4 -4
  495. package/src/automations/tests/bash.spec.js +1 -1
  496. package/src/automations/tests/discord.spec.js +1 -1
  497. package/src/automations/tests/executeQuery.spec.js +2 -3
  498. package/src/automations/tests/executeScript.spec.js +1 -1
  499. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  500. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  501. package/src/automations/tests/serverLog.spec.js +1 -1
  502. package/src/automations/tests/updateRow.spec.js +1 -1
  503. package/src/automations/tests/zapier.spec.js +1 -1
  504. package/src/db/tests/linkController.spec.js +4 -1
  505. package/src/db/tests/linkTests.spec.js +1 -1
  506. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  507. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  508. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +1 -1
  509. package/src/migrations/tests/index.spec.ts +3 -2
  510. package/src/sdk/app/backups/exports.ts +8 -2
  511. package/src/tests/jestEnv.ts +2 -6
  512. package/src/tests/jestSetup.ts +5 -6
  513. package/src/tests/utilities/TestConfiguration.ts +90 -34
  514. package/src/utilities/retry.ts +18 -0
@@ -0,0 +1,1804 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/api/routes/tests/row.spec.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">src/api/routes/tests</a> row.spec.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/238</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/44</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/234</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 low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
+ <span class="cline-any cline-no">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-no">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
+ <span class="cline-any cline-no">&nbsp;</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-no">&nbsp;</span>
703
+ <span class="cline-any cline-no">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-no">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
+ <span class="cline-any cline-no">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
+ <span class="cline-any cline-no">&nbsp;</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
+ <span class="cline-any cline-no">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-no">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <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-no">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-no">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-no">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&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-neutral">&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-no">&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-no">&nbsp;</span>
773
+ <span class="cline-any cline-no">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-no">&nbsp;</span>
783
+ <span class="cline-any cline-no">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-no">&nbsp;</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-no">&nbsp;</span>
790
+ <span class="cline-any cline-no">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-no">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&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-no">&nbsp;</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-no">&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-no">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</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-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-neutral">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-neutral">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-no">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-no">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-no">&nbsp;</span>
887
+ <span class="cline-any cline-no">&nbsp;</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-no">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-no">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-no">&nbsp;</span>
917
+ <span class="cline-any cline-no">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-no">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-no">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-no">&nbsp;</span>
969
+ <span class="cline-any cline-no">&nbsp;</span>
970
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-no">&nbsp;</span>
981
+ <span class="cline-any cline-no">&nbsp;</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-no">&nbsp;</span>
987
+ <span class="cline-any cline-no">&nbsp;</span>
988
+ <span class="cline-any cline-no">&nbsp;</span>
989
+ <span class="cline-any cline-no">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-no">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-no">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-no">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-no">&nbsp;</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-neutral">&nbsp;</span>
1012
+ <span class="cline-any cline-neutral">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-no">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-no">&nbsp;</span>
1023
+ <span class="cline-any cline-no">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-no">&nbsp;</span>
1026
+ <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-no">&nbsp;</span>
1039
+ <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-no">&nbsp;</span>
1041
+ <span class="cline-any cline-no">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-no">&nbsp;</span>
1058
+ <span class="cline-any cline-no">&nbsp;</span>
1059
+ <span class="cline-any cline-no">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-no">&nbsp;</span>
1063
+ <span class="cline-any cline-no">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1072
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1076
+ <span class="cline-any cline-no">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-no">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-no">&nbsp;</span>
1095
+ <span class="cline-any cline-no">&nbsp;</span>
1096
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1100
+ <span class="cline-any cline-no">&nbsp;</span>
1101
+ <span class="cline-any cline-neutral">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-no">&nbsp;</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-no">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-no">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-no">&nbsp;</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-no">&nbsp;</span>
1144
+ <span class="cline-any cline-no">&nbsp;</span>
1145
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-no">&nbsp;</span>
1157
+ <span class="cline-any cline-no">&nbsp;</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&nbsp;</span>
1170
+ <span class="cline-any cline-no">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</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-no">&nbsp;</span>
1179
+ <span class="cline-any cline-no">&nbsp;</span>
1180
+ <span class="cline-any cline-no">&nbsp;</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-no">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-no">&nbsp;</span>
1192
+ <span class="cline-any cline-no">&nbsp;</span>
1193
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-no">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-no">&nbsp;</span>
1208
+ <span class="cline-any cline-no">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const tk = <span class="cstat-no" title="statement not covered" >require( "timekeeper")</span>
1213
+ const timestamp = <span class="cstat-no" title="statement not covered" >new Date("2023-01-26T11:48:57.597Z").toISOString()</span>
1214
+ <span class="cstat-no" title="statement not covered" >tk.freeze(timestamp)</span>
1215
+ &nbsp;
1216
+ &nbsp;
1217
+ const { outputProcessing } = <span class="cstat-no" title="statement not covered" >require("../../../utilities/rowProcessor")</span>
1218
+ const setup = <span class="cstat-no" title="statement not covered" >require("./utilities")</span>
1219
+ const { basicRow } = <span class="cstat-no" title="statement not covered" >setup.structures</span>
1220
+ const { context, tenancy } = <span class="cstat-no" title="statement not covered" >require("@budibase/backend-core")</span>
1221
+ const {
1222
+ quotas,
1223
+ } = <span class="cstat-no" title="statement not covered" >require("@budibase/pro")</span>
1224
+ const {
1225
+ QuotaUsageType,
1226
+ StaticQuotaName,
1227
+ MonthlyQuotaName,
1228
+ } = <span class="cstat-no" title="statement not covered" >require("@budibase/types")</span>
1229
+ const { structures } = <span class="cstat-no" title="statement not covered" >require("@budibase/backend-core/tests");</span>
1230
+ &nbsp;
1231
+ <span class="cstat-no" title="statement not covered" >describe("/rows", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1232
+ let request = <span class="cstat-no" title="statement not covered" >setup.getRequest()</span>
1233
+ let config = <span class="cstat-no" title="statement not covered" >setup.getConfig()</span>
1234
+ let table
1235
+ let row
1236
+ &nbsp;
1237
+ <span class="cstat-no" title="statement not covered" > afterAll(setup.afterAll)</span>
1238
+ &nbsp;
1239
+ <span class="cstat-no" title="statement not covered" > beforeAll(<span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1240
+ <span class="cstat-no" title="statement not covered" > await config.init()</span>
1241
+ })
1242
+ &nbsp;
1243
+ <span class="cstat-no" title="statement not covered" > beforeEach(<span class="fstat-no" title="function not covered" >as</span>ync()=&gt;{</span>
1244
+ <span class="cstat-no" title="statement not covered" > table = await config.createTable()</span>
1245
+ <span class="cstat-no" title="statement not covered" > row = basicRow(table._id)</span>
1246
+ })
1247
+ &nbsp;
1248
+ const loadRow = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (id, status = <span class="branch-0 cbranch-no" title="branch not covered" >200)</span> =&gt;</span>
1249
+ <span class="cstat-no" title="statement not covered" > await request</span>
1250
+ .get(`/api/${table._id}/rows/${id}`)
1251
+ .set(config.defaultHeaders())
1252
+ .expect("Content-Type", /json/)
1253
+ .expect(status)
1254
+ &nbsp;
1255
+ const getRowUsage = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1256
+ const { total } = <span class="cstat-no" title="statement not covered" >await config.doInContext(null, <span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >quotas.getCurrentUsageValues(QuotaUsageType.STATIC, StaticQuotaName.ROWS))</span></span>
1257
+ <span class="cstat-no" title="statement not covered" > return total</span>
1258
+ }
1259
+ &nbsp;
1260
+ const getQueryUsage = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1261
+ const { total } = <span class="cstat-no" title="statement not covered" >await config.doInContext(null, <span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >quotas.getCurrentUsageValues(QuotaUsageType.MONTHLY, MonthlyQuotaName.QUERIES))</span></span>
1262
+ <span class="cstat-no" title="statement not covered" > return total</span>
1263
+ }
1264
+ &nbsp;
1265
+ const assertRowUsage = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync expected =&gt; {</span>
1266
+ const usage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1267
+ <span class="cstat-no" title="statement not covered" > expect(usage).toBe(expected)</span>
1268
+ }
1269
+ &nbsp;
1270
+ const assertQueryUsage = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync expected =&gt; {</span>
1271
+ const usage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1272
+ <span class="cstat-no" title="statement not covered" > expect(usage).toBe(expected)</span>
1273
+ }
1274
+ &nbsp;
1275
+ <span class="cstat-no" title="statement not covered" > describe("save, load, update", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1276
+ <span class="cstat-no" title="statement not covered" > it("returns a success message when the row is created", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1277
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1278
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1279
+ &nbsp;
1280
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1281
+ .post(`/api/${row.tableId}/rows`)
1282
+ .send(row)
1283
+ .set(config.defaultHeaders())
1284
+ .expect('Content-Type', /json/)
1285
+ .expect(200)
1286
+ <span class="cstat-no" title="statement not covered" > expect(res.res.statusMessage).toEqual(`${table.name} saved successfully`)</span>
1287
+ <span class="cstat-no" title="statement not covered" > expect(res.body.name).toEqual("Test Contact")</span>
1288
+ <span class="cstat-no" title="statement not covered" > expect(res.body._rev).toBeDefined()</span>
1289
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage + 1)</span>
1290
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1291
+ })
1292
+ &nbsp;
1293
+ <span class="cstat-no" title="statement not covered" > it("updates a row successfully", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1294
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1295
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1296
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1297
+ &nbsp;
1298
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1299
+ .post(`/api/${table._id}/rows`)
1300
+ .send({
1301
+ _id: existing._id,
1302
+ _rev: existing._rev,
1303
+ tableId: table._id,
1304
+ name: "Updated Name",
1305
+ })
1306
+ .set(config.defaultHeaders())
1307
+ .expect("Content-Type", /json/)
1308
+ .expect(200)
1309
+ &nbsp;
1310
+ <span class="cstat-no" title="statement not covered" > expect(res.res.statusMessage).toEqual(</span>
1311
+ `${table.name} updated successfully.`
1312
+ )
1313
+ <span class="cstat-no" title="statement not covered" > expect(res.body.name).toEqual("Updated Name")</span>
1314
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1315
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1316
+ })
1317
+ &nbsp;
1318
+ <span class="cstat-no" title="statement not covered" > it("should load a row", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1319
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1320
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1321
+ &nbsp;
1322
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1323
+ .get(`/api/${table._id}/rows/${existing._id}`)
1324
+ .set(config.defaultHeaders())
1325
+ .expect("Content-Type", /json/)
1326
+ .expect(200)
1327
+ &nbsp;
1328
+ <span class="cstat-no" title="statement not covered" > expect(res.body).toEqual({</span>
1329
+ ...row,
1330
+ _id: existing._id,
1331
+ _rev: existing._rev,
1332
+ type: "row",
1333
+ createdAt: timestamp,
1334
+ updatedAt: timestamp,
1335
+ })
1336
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1337
+ })
1338
+ &nbsp;
1339
+ <span class="cstat-no" title="statement not covered" > it("should list all rows for given tableId", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1340
+ const newRow = <span class="cstat-no" title="statement not covered" >{</span>
1341
+ tableId: table._id,
1342
+ name: "Second Contact",
1343
+ status: "new",
1344
+ }
1345
+ <span class="cstat-no" title="statement not covered" > await config.createRow()</span>
1346
+ <span class="cstat-no" title="statement not covered" > await config.createRow(newRow)</span>
1347
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1348
+ &nbsp;
1349
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1350
+ .get(`/api/${table._id}/rows`)
1351
+ .set(config.defaultHeaders())
1352
+ .expect("Content-Type", /json/)
1353
+ .expect(200)
1354
+ &nbsp;
1355
+ <span class="cstat-no" title="statement not covered" > expect(res.body.length).toBe(2)</span>
1356
+ <span class="cstat-no" title="statement not covered" > expect(res.body.find(<span class="fstat-no" title="function not covered" >r </span>=&gt; <span class="cstat-no" title="statement not covered" >r.name === newRow.name)</span>).toBeDefined()</span>
1357
+ <span class="cstat-no" title="statement not covered" > expect(res.body.find(<span class="fstat-no" title="function not covered" >r </span>=&gt; <span class="cstat-no" title="statement not covered" >r.name === row.name)</span>).toBeDefined()</span>
1358
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1359
+ })
1360
+ &nbsp;
1361
+ <span class="cstat-no" title="statement not covered" > it("load should return 404 when row does not exist", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1362
+ <span class="cstat-no" title="statement not covered" > await config.createRow()</span>
1363
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1364
+ &nbsp;
1365
+ <span class="cstat-no" title="statement not covered" > await request</span>
1366
+ .get(`/api/${table._id}/rows/not-a-valid-id`)
1367
+ .set(config.defaultHeaders())
1368
+ .expect("Content-Type", /json/)
1369
+ .expect(404)
1370
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage) </span>// no change
1371
+ })
1372
+ &nbsp;
1373
+ <span class="cstat-no" title="statement not covered" > it("row values are coerced", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1374
+ const str = <span class="cstat-no" title="statement not covered" >{</span>
1375
+ type: "string",
1376
+ constraints: { type: "string", presence: false },
1377
+ }
1378
+ const attachment = <span class="cstat-no" title="statement not covered" >{</span>
1379
+ type: "attachment",
1380
+ constraints: { type: "array", presence: false },
1381
+ }
1382
+ const bool = <span class="cstat-no" title="statement not covered" >{</span>
1383
+ type: "boolean",
1384
+ constraints: { type: "boolean", presence: false },
1385
+ }
1386
+ const number = <span class="cstat-no" title="statement not covered" >{</span>
1387
+ type: "number",
1388
+ constraints: { type: "number", presence: false },
1389
+ }
1390
+ const datetime = <span class="cstat-no" title="statement not covered" >{</span>
1391
+ type: "datetime",
1392
+ constraints: {
1393
+ type: "string",
1394
+ presence: false,
1395
+ datetime: { earliest: "", latest: "" },
1396
+ },
1397
+ }
1398
+ &nbsp;
1399
+ <span class="cstat-no" title="statement not covered" > table = await config.createTable({</span>
1400
+ name: "TestTable2",
1401
+ type: "table",
1402
+ key: "name",
1403
+ schema: {
1404
+ name: str,
1405
+ stringUndefined: str,
1406
+ stringNull: str,
1407
+ stringString: str,
1408
+ numberEmptyString: number,
1409
+ numberNull: number,
1410
+ numberUndefined: number,
1411
+ numberString: number,
1412
+ numberNumber: number,
1413
+ datetimeEmptyString: datetime,
1414
+ datetimeNull: datetime,
1415
+ datetimeUndefined: datetime,
1416
+ datetimeString: datetime,
1417
+ datetimeDate: datetime,
1418
+ boolNull: bool,
1419
+ boolEmpty: bool,
1420
+ boolUndefined: bool,
1421
+ boolString: bool,
1422
+ boolBool: bool,
1423
+ attachmentNull: attachment,
1424
+ attachmentUndefined: attachment,
1425
+ attachmentEmpty: attachment,
1426
+ },
1427
+ })
1428
+ &nbsp;
1429
+ <span class="cstat-no" title="statement not covered" > row = {</span>
1430
+ name: "Test Row",
1431
+ stringUndefined: undefined,
1432
+ stringNull: null,
1433
+ stringString: "i am a string",
1434
+ numberEmptyString: "",
1435
+ numberNull: null,
1436
+ numberUndefined: undefined,
1437
+ numberString: "123",
1438
+ numberNumber: 123,
1439
+ datetimeEmptyString: "",
1440
+ datetimeNull: null,
1441
+ datetimeUndefined: undefined,
1442
+ datetimeString: "1984-04-20T00:00:00.000Z",
1443
+ datetimeDate: new Date("1984-04-20"),
1444
+ boolNull: null,
1445
+ boolEmpty: "",
1446
+ boolUndefined: undefined,
1447
+ boolString: "true",
1448
+ boolBool: true,
1449
+ tableId: table._id,
1450
+ attachmentNull: null,
1451
+ attachmentUndefined: undefined,
1452
+ attachmentEmpty: "",
1453
+ }
1454
+ &nbsp;
1455
+ const id = <span class="cstat-no" title="statement not covered" >(await config.createRow(row))._id</span>
1456
+ &nbsp;
1457
+ const saved = <span class="cstat-no" title="statement not covered" >(await loadRow(id)).body</span>
1458
+ &nbsp;
1459
+ <span class="cstat-no" title="statement not covered" > expect(saved.stringUndefined).toBe(undefined)</span>
1460
+ <span class="cstat-no" title="statement not covered" > expect(saved.stringNull).toBe("")</span>
1461
+ <span class="cstat-no" title="statement not covered" > expect(saved.stringString).toBe("i am a string")</span>
1462
+ <span class="cstat-no" title="statement not covered" > expect(saved.numberEmptyString).toBe(null)</span>
1463
+ <span class="cstat-no" title="statement not covered" > expect(saved.numberNull).toBe(null)</span>
1464
+ <span class="cstat-no" title="statement not covered" > expect(saved.numberUndefined).toBe(undefined)</span>
1465
+ <span class="cstat-no" title="statement not covered" > expect(saved.numberString).toBe(123)</span>
1466
+ <span class="cstat-no" title="statement not covered" > expect(saved.numberNumber).toBe(123)</span>
1467
+ <span class="cstat-no" title="statement not covered" > expect(saved.datetimeEmptyString).toBe(null)</span>
1468
+ <span class="cstat-no" title="statement not covered" > expect(saved.datetimeNull).toBe(null)</span>
1469
+ <span class="cstat-no" title="statement not covered" > expect(saved.datetimeUndefined).toBe(undefined)</span>
1470
+ <span class="cstat-no" title="statement not covered" > expect(saved.datetimeString).toBe(</span>
1471
+ new Date(row.datetimeString).toISOString()
1472
+ )
1473
+ <span class="cstat-no" title="statement not covered" > expect(saved.datetimeDate).toBe(row.datetimeDate.toISOString())</span>
1474
+ <span class="cstat-no" title="statement not covered" > expect(saved.boolNull).toBe(null)</span>
1475
+ <span class="cstat-no" title="statement not covered" > expect(saved.boolEmpty).toBe(null)</span>
1476
+ <span class="cstat-no" title="statement not covered" > expect(saved.boolUndefined).toBe(undefined)</span>
1477
+ <span class="cstat-no" title="statement not covered" > expect(saved.boolString).toBe(true)</span>
1478
+ <span class="cstat-no" title="statement not covered" > expect(saved.boolBool).toBe(true)</span>
1479
+ <span class="cstat-no" title="statement not covered" > expect(saved.attachmentNull).toEqual([])</span>
1480
+ <span class="cstat-no" title="statement not covered" > expect(saved.attachmentUndefined).toBe(undefined)</span>
1481
+ <span class="cstat-no" title="statement not covered" > expect(saved.attachmentEmpty).toEqual([])</span>
1482
+ })
1483
+ })
1484
+ &nbsp;
1485
+ <span class="cstat-no" title="statement not covered" > describe("patch", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1486
+ <span class="cstat-no" title="statement not covered" > it("should update only the fields that are supplied", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1487
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1488
+ &nbsp;
1489
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1490
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1491
+ &nbsp;
1492
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1493
+ .patch(`/api/${table._id}/rows`)
1494
+ .send({
1495
+ _id: existing._id,
1496
+ _rev: existing._rev,
1497
+ tableId: table._id,
1498
+ name: "Updated Name",
1499
+ })
1500
+ .set(config.defaultHeaders())
1501
+ .expect("Content-Type", /json/)
1502
+ .expect(200)
1503
+ &nbsp;
1504
+ <span class="cstat-no" title="statement not covered" > expect(res.res.statusMessage).toEqual(</span>
1505
+ `${table.name} updated successfully.`
1506
+ )
1507
+ <span class="cstat-no" title="statement not covered" > expect(res.body.name).toEqual("Updated Name")</span>
1508
+ <span class="cstat-no" title="statement not covered" > expect(res.body.description).toEqual(existing.description)</span>
1509
+ &nbsp;
1510
+ const savedRow = <span class="cstat-no" title="statement not covered" >await loadRow(res.body._id)</span>
1511
+ &nbsp;
1512
+ <span class="cstat-no" title="statement not covered" > expect(savedRow.body.description).toEqual(existing.description)</span>
1513
+ <span class="cstat-no" title="statement not covered" > expect(savedRow.body.name).toEqual("Updated Name")</span>
1514
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1515
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 2) </span>// account for the second load
1516
+ })
1517
+ &nbsp;
1518
+ <span class="cstat-no" title="statement not covered" > it("should throw an error when given improper types", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1519
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1520
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1521
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1522
+ &nbsp;
1523
+ <span class="cstat-no" title="statement not covered" > await request</span>
1524
+ .patch(`/api/${table._id}/rows`)
1525
+ .send({
1526
+ _id: existing._id,
1527
+ _rev: existing._rev,
1528
+ tableId: table._id,
1529
+ name: 1,
1530
+ })
1531
+ .set(config.defaultHeaders())
1532
+ .expect(400)
1533
+ &nbsp;
1534
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1535
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage)</span>
1536
+ })
1537
+ })
1538
+ &nbsp;
1539
+ <span class="cstat-no" title="statement not covered" > describe("destroy", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1540
+ <span class="cstat-no" title="statement not covered" > it("should be able to delete a row", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1541
+ const createdRow = <span class="cstat-no" title="statement not covered" >await config.createRow(row)</span>
1542
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1543
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1544
+ &nbsp;
1545
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1546
+ .delete(`/api/${table._id}/rows`)
1547
+ .send({
1548
+ rows: [createdRow],
1549
+ })
1550
+ .set(config.defaultHeaders())
1551
+ .expect("Content-Type", /json/)
1552
+ .expect(200)
1553
+ <span class="cstat-no" title="statement not covered" > expect(res.body[0]._id).toEqual(createdRow._id)</span>
1554
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage - 1)</span>
1555
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1556
+ })
1557
+ })
1558
+ &nbsp;
1559
+ <span class="cstat-no" title="statement not covered" > describe("validate", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1560
+ <span class="cstat-no" title="statement not covered" > it("should return no errors on valid row", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1561
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1562
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1563
+ &nbsp;
1564
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1565
+ .post(`/api/${table._id}/rows/validate`)
1566
+ .send({ name: "ivan" })
1567
+ .set(config.defaultHeaders())
1568
+ .expect("Content-Type", /json/)
1569
+ .expect(200)
1570
+ &nbsp;
1571
+ <span class="cstat-no" title="statement not covered" > expect(res.body.valid).toBe(true)</span>
1572
+ <span class="cstat-no" title="statement not covered" > expect(Object.keys(res.body.errors)).toEqual([])</span>
1573
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1574
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage)</span>
1575
+ })
1576
+ &nbsp;
1577
+ <span class="cstat-no" title="statement not covered" > it("should errors on invalid row", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1578
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1579
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1580
+ &nbsp;
1581
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1582
+ .post(`/api/${table._id}/rows/validate`)
1583
+ .send({ name: 1 })
1584
+ .set(config.defaultHeaders())
1585
+ .expect("Content-Type", /json/)
1586
+ .expect(200)
1587
+ &nbsp;
1588
+ <span class="cstat-no" title="statement not covered" > expect(res.body.valid).toBe(false)</span>
1589
+ <span class="cstat-no" title="statement not covered" > expect(Object.keys(res.body.errors)).toEqual(["name"])</span>
1590
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1591
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage)</span>
1592
+ })
1593
+ })
1594
+ &nbsp;
1595
+ <span class="cstat-no" title="statement not covered" > describe("bulkDelete", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1596
+ <span class="cstat-no" title="statement not covered" > it("should be able to delete a bulk set of rows", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1597
+ const row1 = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1598
+ const row2 = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1599
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1600
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1601
+ &nbsp;
1602
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1603
+ .delete(`/api/${table._id}/rows`)
1604
+ .send({
1605
+ rows: [row1, row2],
1606
+ })
1607
+ .set(config.defaultHeaders())
1608
+ .expect("Content-Type", /json/)
1609
+ .expect(200)
1610
+ &nbsp;
1611
+ <span class="cstat-no" title="statement not covered" > expect(res.body.length).toEqual(2)</span>
1612
+ <span class="cstat-no" title="statement not covered" > await loadRow(row1._id, 404)</span>
1613
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage - 2)</span>
1614
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1615
+ })
1616
+ })
1617
+ &nbsp;
1618
+ <span class="cstat-no" title="statement not covered" > describe("fetchView", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1619
+ <span class="cstat-no" title="statement not covered" > it("should be able to fetch tables contents via 'view'", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1620
+ const row = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1621
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1622
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1623
+ &nbsp;
1624
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1625
+ .get(`/api/views/${table._id}`)
1626
+ .set(config.defaultHeaders())
1627
+ .expect("Content-Type", /json/)
1628
+ .expect(200)
1629
+ <span class="cstat-no" title="statement not covered" > expect(res.body.length).toEqual(1)</span>
1630
+ <span class="cstat-no" title="statement not covered" > expect(res.body[0]._id).toEqual(row._id)</span>
1631
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1632
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1633
+ })
1634
+ &nbsp;
1635
+ <span class="cstat-no" title="statement not covered" > it("should throw an error if view doesn't exist", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1636
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1637
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1638
+ &nbsp;
1639
+ <span class="cstat-no" title="statement not covered" > await request</span>
1640
+ .get(`/api/views/derp`)
1641
+ .set(config.defaultHeaders())
1642
+ .expect(404)
1643
+ &nbsp;
1644
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1645
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage)</span>
1646
+ })
1647
+ &nbsp;
1648
+ <span class="cstat-no" title="statement not covered" > it("should be able to run on a view", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1649
+ const view = <span class="cstat-no" title="statement not covered" >await config.createView()</span>
1650
+ const row = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1651
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1652
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1653
+ &nbsp;
1654
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1655
+ .get(`/api/views/${view.name}`)
1656
+ .set(config.defaultHeaders())
1657
+ .expect("Content-Type", /json/)
1658
+ .expect(200)
1659
+ <span class="cstat-no" title="statement not covered" > expect(res.body.length).toEqual(1)</span>
1660
+ <span class="cstat-no" title="statement not covered" > expect(res.body[0]._id).toEqual(row._id)</span>
1661
+ &nbsp;
1662
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1663
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 1)</span>
1664
+ })
1665
+ })
1666
+ &nbsp;
1667
+ <span class="cstat-no" title="statement not covered" > describe("fetchEnrichedRows", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1668
+ <span class="cstat-no" title="statement not covered" > it("should allow enriching some linked rows", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1669
+ const { table, firstRow, secondRow } = <span class="cstat-no" title="statement not covered" >await tenancy.doInTenant(</span>
1670
+ setup.structures.TENANT_ID,
1671
+ <span class="fstat-no" title="function not covered" > as</span>ync () =&gt; {
1672
+ const table = <span class="cstat-no" title="statement not covered" >await config.createLinkedTable()</span>
1673
+ const firstRow = <span class="cstat-no" title="statement not covered" >await config.createRow({</span>
1674
+ name: "Test Contact",
1675
+ description: "original description",
1676
+ tableId: table._id,
1677
+ })
1678
+ const secondRow = <span class="cstat-no" title="statement not covered" >await config.createRow({</span>
1679
+ name: "Test 2",
1680
+ description: "og desc",
1681
+ link: [{ _id: firstRow._id }],
1682
+ tableId: table._id,
1683
+ })
1684
+ <span class="cstat-no" title="statement not covered" > return { table, firstRow, secondRow }</span>
1685
+ }
1686
+ )
1687
+ const rowUsage = <span class="cstat-no" title="statement not covered" >await getRowUsage()</span>
1688
+ const queryUsage = <span class="cstat-no" title="statement not covered" >await getQueryUsage()</span>
1689
+ &nbsp;
1690
+ // test basic enrichment
1691
+ const resBasic = <span class="cstat-no" title="statement not covered" >await request</span>
1692
+ .get(`/api/${table._id}/rows/${secondRow._id}`)
1693
+ .set(config.defaultHeaders())
1694
+ .expect("Content-Type", /json/)
1695
+ .expect(200)
1696
+ <span class="cstat-no" title="statement not covered" > expect(resBasic.body.link[0]._id).toBe(firstRow._id)</span>
1697
+ <span class="cstat-no" title="statement not covered" > expect(resBasic.body.link[0].primaryDisplay).toBe("Test Contact")</span>
1698
+ &nbsp;
1699
+ // test full enrichment
1700
+ const resEnriched = <span class="cstat-no" title="statement not covered" >await request</span>
1701
+ .get(`/api/${table._id}/${secondRow._id}/enrich`)
1702
+ .set(config.defaultHeaders())
1703
+ .expect("Content-Type", /json/)
1704
+ .expect(200)
1705
+ <span class="cstat-no" title="statement not covered" > expect(resEnriched.body.link.length).toBe(1)</span>
1706
+ <span class="cstat-no" title="statement not covered" > expect(resEnriched.body.link[0]._id).toBe(firstRow._id)</span>
1707
+ <span class="cstat-no" title="statement not covered" > expect(resEnriched.body.link[0].name).toBe("Test Contact")</span>
1708
+ <span class="cstat-no" title="statement not covered" > expect(resEnriched.body.link[0].description).toBe("original description")</span>
1709
+ <span class="cstat-no" title="statement not covered" > await assertRowUsage(rowUsage)</span>
1710
+ <span class="cstat-no" title="statement not covered" > await assertQueryUsage(queryUsage + 2)</span>
1711
+ })
1712
+ })
1713
+ &nbsp;
1714
+ <span class="cstat-no" title="statement not covered" > describe("attachments", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1715
+ <span class="cstat-no" title="statement not covered" > it("should allow enriching attachment rows", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1716
+ const table = <span class="cstat-no" title="statement not covered" >await config.createAttachmentTable()</span>
1717
+ const attachmentId = <span class="cstat-no" title="statement not covered" >`${structures.uuid()}.csv`</span>
1718
+ const row = <span class="cstat-no" title="statement not covered" >await config.createRow({</span>
1719
+ name: "test",
1720
+ description: "test",
1721
+ attachment: [
1722
+ {
1723
+ key: `${config.getAppId()}/attachments/${attachmentId}`,
1724
+ },
1725
+ ],
1726
+ tableId: table._id,
1727
+ })
1728
+ // the environment needs configured for this
1729
+ <span class="cstat-no" title="statement not covered" > await setup.switchToSelfHosted(<span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1730
+ <span class="cstat-no" title="statement not covered" > context.doInAppContext(config.getAppId(), <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1731
+ const enriched = <span class="cstat-no" title="statement not covered" >await outputProcessing(table, [row])</span>
1732
+ <span class="cstat-no" title="statement not covered" > expect(enriched[0].attachment[0].url).toBe(</span>
1733
+ `/files/signed/prod-budi-app-assets/${config.getProdAppId()}/attachments/${attachmentId}`
1734
+ )
1735
+ })
1736
+ })
1737
+ })
1738
+ })
1739
+ &nbsp;
1740
+ <span class="cstat-no" title="statement not covered" > describe("exportData", <span class="fstat-no" title="function not covered" >()</span> =&gt; {</span>
1741
+ <span class="cstat-no" title="statement not covered" > it("should allow exporting all columns", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1742
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1743
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1744
+ .post(`/api/${table._id}/rows/exportRows?format=json`)
1745
+ .set(config.defaultHeaders())
1746
+ .send({
1747
+ rows: [existing._id],
1748
+ })
1749
+ .expect("Content-Type", /json/)
1750
+ .expect(200)
1751
+ const results = <span class="cstat-no" title="statement not covered" >JSON.parse(res.text)</span>
1752
+ <span class="cstat-no" title="statement not covered" > expect(results.length).toEqual(1)</span>
1753
+ const row = <span class="cstat-no" title="statement not covered" >results[0]</span>
1754
+ &nbsp;
1755
+ // Ensure all original columns were exported
1756
+ <span class="cstat-no" title="statement not covered" > expect(Object.keys(row).length).toBeGreaterThanOrEqual(</span>
1757
+ Object.keys(existing).length
1758
+ )
1759
+ <span class="cstat-no" title="statement not covered" > Object.keys(existing).forEach(<span class="fstat-no" title="function not covered" >ke</span>y =&gt; {</span>
1760
+ <span class="cstat-no" title="statement not covered" > expect(row[key]).toEqual(existing[key])</span>
1761
+ })
1762
+ })
1763
+ &nbsp;
1764
+ <span class="cstat-no" title="statement not covered" > it("should allow exporting only certain columns", <span class="fstat-no" title="function not covered" >as</span>ync () =&gt; {</span>
1765
+ const existing = <span class="cstat-no" title="statement not covered" >await config.createRow()</span>
1766
+ const res = <span class="cstat-no" title="statement not covered" >await request</span>
1767
+ .post(`/api/${table._id}/rows/exportRows?format=json`)
1768
+ .set(config.defaultHeaders())
1769
+ .send({
1770
+ rows: [existing._id],
1771
+ columns: ["_id"],
1772
+ })
1773
+ .expect("Content-Type", /json/)
1774
+ .expect(200)
1775
+ const results = <span class="cstat-no" title="statement not covered" >JSON.parse(res.text)</span>
1776
+ <span class="cstat-no" title="statement not covered" > expect(results.length).toEqual(1)</span>
1777
+ const row = <span class="cstat-no" title="statement not covered" >results[0]</span>
1778
+ &nbsp;
1779
+ // Ensure only the _id column was exported
1780
+ <span class="cstat-no" title="statement not covered" > expect(Object.keys(row).length).toEqual(1)</span>
1781
+ <span class="cstat-no" title="statement not covered" > expect(row._id).toEqual(existing._id)</span>
1782
+ })
1783
+ })
1784
+ })
1785
+ &nbsp;</pre></td></tr></table></pre>
1786
+
1787
+ <div class='push'></div><!-- for sticky footer -->
1788
+ </div><!-- /wrapper -->
1789
+ <div class='footer quiet pad2 space-top1 center small'>
1790
+ Code coverage generated by
1791
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1792
+ at Tue Feb 07 2023 15:01:11 GMT+0000 (Coordinated Universal Time)
1793
+ </div>
1794
+ <script src="../../../../prettify.js"></script>
1795
+ <script>
1796
+ window.onload = function () {
1797
+ prettyPrint();
1798
+ };
1799
+ </script>
1800
+ <script src="../../../../sorter.js"></script>
1801
+ <script src="../../../../block-navigation.js"></script>
1802
+ </body>
1803
+ </html>
1804
+