@budibase/server 2.3.19 → 2.3.21-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/__mocks__/node-fetch.ts +3 -0
  3. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  4. package/builder/assets/{index.a3f8cb92.js → index.90fba548.js} +439 -426
  5. package/builder/assets/index.b24b9dea.css +6 -0
  6. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  7. package/builder/index.html +2 -2
  8. package/dist/api/controllers/automation.js +11 -2
  9. package/dist/api/controllers/cloud.js +2 -2
  10. package/dist/api/controllers/query/index.js +2 -0
  11. package/dist/api/controllers/row/ExternalRequest.js +50 -23
  12. package/dist/api/controllers/row/external.js +12 -1
  13. package/dist/api/controllers/row/internalSearch.js +6 -450
  14. package/dist/api/controllers/row/utils.js +1 -3
  15. package/dist/api/controllers/table/external.js +8 -8
  16. package/dist/api/index.js +1 -21
  17. package/dist/api/routes/automation.js +1 -1
  18. package/dist/api/routes/public/applications.js +7 -7
  19. package/dist/api/routes/public/queries.js +2 -2
  20. package/dist/api/routes/public/rows.js +5 -5
  21. package/dist/api/routes/public/tables.js +5 -5
  22. package/dist/api/routes/public/users.js +5 -5
  23. package/dist/app.js +9 -1
  24. package/dist/constants/index.js +4 -24
  25. package/dist/db/defaultData/datasource_bb_default.js +6 -5
  26. package/dist/db/index.js +25 -2
  27. package/dist/db/linkedRows/LinkController.js +9 -8
  28. package/dist/db/utils.js +2 -5
  29. package/dist/db/views/staticViews.js +2 -1
  30. package/dist/ddApm.js +11 -0
  31. package/dist/elasticApm.js +14 -0
  32. package/dist/integrations/base/sql.js +6 -3
  33. package/dist/integrations/googlesheets.js +17 -20
  34. package/dist/middleware/authorized.js +5 -3
  35. package/dist/middleware/builder.js +6 -3
  36. package/dist/migrations/functions/backfill/global/configs.js +10 -4
  37. package/dist/migrations/tests/helpers.js +1 -1
  38. package/dist/migrations/tests/structures.js +1 -1
  39. package/dist/package.json +14 -9
  40. package/dist/sdk/app/backups/constants.js +2 -1
  41. package/dist/sdk/app/backups/exports.js +20 -7
  42. package/dist/sdk/app/datasources/datasources.js +3 -0
  43. package/dist/sdk/app/rows/attachments.js +1 -1
  44. package/dist/startup.js +3 -0
  45. package/dist/tsconfig.build.tsbuildinfo +1 -1
  46. package/dist/utilities/redis.js +2 -0
  47. package/dist/utilities/retry.js +30 -0
  48. package/jest-testcontainers-config.js +8 -0
  49. package/jest.config.ts +35 -22
  50. package/package.json +15 -10
  51. package/scripts/load/create-many-apps.js +24 -0
  52. package/scripts/load/create-many-rows.js +30 -0
  53. package/scripts/load/utils.js +66 -0
  54. package/scripts/test.sh +12 -0
  55. package/specs/{generate.js → generate.ts} +7 -9
  56. package/specs/openapi.json +30 -30
  57. package/specs/openapi.yaml +27 -27
  58. package/specs/{parameters.js → parameters.ts} +6 -6
  59. package/specs/resources/{application.js → application.ts} +4 -4
  60. package/specs/resources/{index.js → index.ts} +8 -8
  61. package/specs/resources/{misc.js → misc.ts} +3 -3
  62. package/specs/resources/{query.js → query.ts} +4 -4
  63. package/specs/resources/{row.js → row.ts} +3 -4
  64. package/specs/resources/{table.js → table.ts} +5 -5
  65. package/specs/resources/{user.js → user.ts} +3 -3
  66. package/specs/resources/utils/Resource.ts +39 -0
  67. package/specs/resources/utils/{index.js → index.ts} +1 -1
  68. package/specs/{security.js → security.ts} +1 -1
  69. package/src/api/controllers/automation.ts +13 -2
  70. package/src/api/controllers/cloud.ts +2 -2
  71. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  72. package/src/api/controllers/query/index.ts +2 -0
  73. package/src/api/controllers/row/ExternalRequest.ts +98 -27
  74. package/src/api/controllers/row/external.ts +13 -1
  75. package/src/api/controllers/row/internalSearch.ts +11 -524
  76. package/src/api/controllers/row/utils.ts +1 -2
  77. package/src/api/controllers/table/external.ts +3 -2
  78. package/src/api/index.ts +3 -22
  79. package/src/api/routes/automation.ts +1 -1
  80. package/src/api/routes/public/applications.ts +7 -8
  81. package/src/api/routes/public/queries.ts +2 -2
  82. package/src/api/routes/public/rows.ts +5 -5
  83. package/src/api/routes/public/tables.ts +5 -5
  84. package/src/api/routes/public/tests/{compare.spec.js → compare.spec.ts} +45 -26
  85. package/src/api/routes/public/tests/users.spec.js +1 -1
  86. package/src/api/routes/public/tests/utils.ts +25 -8
  87. package/src/api/routes/public/users.ts +5 -5
  88. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  89. package/src/api/routes/tests/analytics.spec.js +4 -1
  90. package/src/api/routes/tests/apikeys.spec.js +1 -1
  91. package/src/api/routes/tests/application.spec.ts +20 -6
  92. package/src/api/routes/tests/auth.spec.js +2 -2
  93. package/src/api/routes/tests/automation.spec.js +6 -2
  94. package/src/api/routes/tests/backup.spec.ts +4 -14
  95. package/src/api/routes/tests/cloud.spec.ts +20 -31
  96. package/src/api/routes/tests/component.spec.js +1 -1
  97. package/src/api/routes/tests/datasource.spec.ts +20 -3
  98. package/src/api/routes/tests/dev.spec.js +1 -1
  99. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  100. package/src/api/routes/tests/integration.spec.js +1 -1
  101. package/src/api/routes/tests/layout.spec.js +1 -1
  102. package/src/api/routes/tests/metadata.spec.js +1 -1
  103. package/src/api/routes/tests/misc.spec.js +1 -1
  104. package/src/api/routes/tests/permissions.spec.js +4 -1
  105. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  106. package/src/api/routes/tests/role.spec.js +6 -1
  107. package/src/api/routes/tests/routing.spec.js +1 -1
  108. package/src/api/routes/tests/row.spec.js +11 -3
  109. package/src/api/routes/tests/screen.spec.js +1 -1
  110. package/src/api/routes/tests/static.spec.js +2 -13
  111. package/src/api/routes/tests/table.spec.js +1 -1
  112. package/src/api/routes/tests/templates.spec.js +1 -1
  113. package/src/api/routes/tests/user.spec.js +11 -12
  114. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -3
  115. package/src/api/routes/tests/utilities/index.ts +5 -3
  116. package/src/api/routes/tests/view.spec.js +4 -1
  117. package/src/api/routes/tests/webhook.spec.js +11 -2
  118. package/src/app.ts +12 -1
  119. package/src/automations/tests/automation.spec.js +4 -4
  120. package/src/automations/tests/bash.spec.js +1 -1
  121. package/src/automations/tests/discord.spec.js +1 -1
  122. package/src/automations/tests/executeQuery.spec.js +2 -3
  123. package/src/automations/tests/executeScript.spec.js +1 -1
  124. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  125. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  126. package/src/automations/tests/serverLog.spec.js +1 -1
  127. package/src/automations/tests/updateRow.spec.js +1 -1
  128. package/src/automations/tests/zapier.spec.js +1 -1
  129. package/src/constants/index.ts +1 -23
  130. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  131. package/src/db/index.ts +2 -2
  132. package/src/db/linkedRows/LinkController.ts +2 -1
  133. package/src/db/tests/linkController.spec.js +4 -1
  134. package/src/db/tests/linkTests.spec.js +1 -1
  135. package/src/db/utils.ts +0 -4
  136. package/src/db/views/staticViews.ts +3 -3
  137. package/src/ddApm.ts +7 -0
  138. package/src/definitions/openapi.ts +449 -63
  139. package/src/elasticApm.ts +10 -0
  140. package/src/integration-test/postgres.spec.ts +1032 -0
  141. package/src/integrations/base/sql.ts +11 -5
  142. package/src/integrations/googlesheets.ts +21 -22
  143. package/src/integrations/oracle.ts +1 -1
  144. package/src/integrations/tests/couchdb.spec.ts +0 -2
  145. package/src/integrations/tests/googlesheets.spec.ts +122 -0
  146. package/src/middleware/authorized.ts +6 -4
  147. package/src/middleware/builder.ts +8 -3
  148. package/src/migrations/functions/backfill/global/configs.ts +15 -9
  149. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  150. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  151. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +4 -5
  152. package/src/migrations/tests/helpers.ts +2 -2
  153. package/src/migrations/tests/index.spec.ts +13 -20
  154. package/src/migrations/tests/structures.ts +1 -0
  155. package/src/sdk/app/backups/constants.ts +1 -0
  156. package/src/sdk/app/backups/exports.ts +32 -10
  157. package/src/sdk/app/datasources/datasources.ts +3 -0
  158. package/src/sdk/app/rows/attachments.ts +1 -1
  159. package/src/startup.ts +4 -1
  160. package/src/tests/jestEnv.ts +9 -11
  161. package/src/tests/jestSetup.ts +9 -7
  162. package/src/tests/logging.ts +34 -0
  163. package/src/tests/utilities/TestConfiguration.ts +187 -101
  164. package/src/tests/utilities/structures.ts +16 -4
  165. package/src/utilities/redis.ts +2 -0
  166. package/src/utilities/retry.ts +18 -0
  167. package/tsconfig.build.json +1 -0
  168. package/builder/assets/index.4488f38d.css +0 -6
  169. package/coverage/clover.xml +0 -11774
  170. package/coverage/coverage-final.json +0 -284
  171. package/coverage/lcov-report/base.css +0 -224
  172. package/coverage/lcov-report/block-navigation.js +0 -87
  173. package/coverage/lcov-report/favicon.png +0 -0
  174. package/coverage/lcov-report/index.html +0 -1031
  175. package/coverage/lcov-report/prettify.css +0 -1
  176. package/coverage/lcov-report/prettify.js +0 -2
  177. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  178. package/coverage/lcov-report/sorter.js +0 -196
  179. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
  180. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
  181. package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
  182. package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
  183. package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
  184. package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
  185. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
  186. package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
  187. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
  188. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
  189. package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
  190. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
  191. package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
  192. package/coverage/lcov-report/src/api/controllers/index.html +0 -431
  193. package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
  194. package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
  195. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
  196. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
  197. package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
  198. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
  199. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
  200. package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
  201. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
  202. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
  203. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
  204. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
  205. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
  206. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
  207. package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
  208. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
  209. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
  210. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
  211. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
  212. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
  213. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
  214. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
  215. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
  216. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
  217. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
  218. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
  219. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
  220. package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
  221. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
  222. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
  223. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
  224. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
  225. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
  226. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
  227. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
  228. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
  229. package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
  230. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
  231. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
  232. package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
  233. package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
  234. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
  235. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
  236. package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
  237. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
  238. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
  239. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
  240. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -595
  241. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
  242. package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
  243. package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
  244. package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
  245. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
  246. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
  247. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
  248. package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
  249. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
  250. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
  251. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
  252. package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
  253. package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
  254. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
  255. package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
  256. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
  257. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
  258. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
  259. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
  260. package/coverage/lcov-report/src/api/index.html +0 -116
  261. package/coverage/lcov-report/src/api/index.ts.html +0 -352
  262. package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
  263. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
  264. package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
  265. package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
  266. package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
  267. package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
  268. package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
  269. package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
  270. package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
  271. package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
  272. package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
  273. package/coverage/lcov-report/src/api/routes/index.html +0 -551
  274. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
  275. package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
  276. package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
  277. package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
  278. package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
  279. package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
  280. package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
  281. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
  282. package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
  283. package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
  284. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
  285. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
  286. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
  287. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
  288. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
  289. package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
  290. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
  291. package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
  292. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
  293. package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
  294. package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
  295. package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
  296. package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
  297. package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
  298. package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
  299. package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
  300. package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
  301. package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
  302. package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
  303. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
  304. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
  305. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
  306. package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
  307. package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
  308. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
  309. package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
  310. package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
  311. package/coverage/lcov-report/src/app.ts.html +0 -424
  312. package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
  313. package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
  314. package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
  315. package/coverage/lcov-report/src/automations/index.html +0 -191
  316. package/coverage/lcov-report/src/automations/index.ts.html +0 -163
  317. package/coverage/lcov-report/src/automations/logging/index.html +0 -116
  318. package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
  319. package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
  320. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
  321. package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
  322. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
  323. package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -397
  324. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
  325. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
  326. package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
  327. package/coverage/lcov-report/src/automations/steps/index.html +0 -371
  328. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -409
  329. package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
  330. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
  331. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
  332. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
  333. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
  334. package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -340
  335. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
  336. package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
  337. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -403
  338. package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
  339. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
  340. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
  341. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
  342. package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
  343. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
  344. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
  345. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
  346. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
  347. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
  348. package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
  349. package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
  350. package/coverage/lcov-report/src/constants/index.html +0 -146
  351. package/coverage/lcov-report/src/constants/index.ts.html +0 -697
  352. package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
  353. package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
  354. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
  355. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
  356. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
  357. package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
  358. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
  359. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
  360. package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
  361. package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
  362. package/coverage/lcov-report/src/db/index.html +0 -176
  363. package/coverage/lcov-report/src/db/index.ts.html +0 -133
  364. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
  365. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
  366. package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
  367. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
  368. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
  369. package/coverage/lcov-report/src/db/newid.ts.html +0 -100
  370. package/coverage/lcov-report/src/db/utils.ts.html +0 -913
  371. package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
  372. package/coverage/lcov-report/src/definitions/index.html +0 -116
  373. package/coverage/lcov-report/src/environment.ts.html +0 -472
  374. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
  375. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
  376. package/coverage/lcov-report/src/events/index.html +0 -161
  377. package/coverage/lcov-report/src/events/index.ts.html +0 -100
  378. package/coverage/lcov-report/src/events/utils.ts.html +0 -319
  379. package/coverage/lcov-report/src/index.html +0 -191
  380. package/coverage/lcov-report/src/index.ts.html +0 -133
  381. package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
  382. package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
  383. package/coverage/lcov-report/src/integrations/base/index.html +0 -161
  384. package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
  385. package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
  386. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
  387. package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
  388. package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
  389. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
  390. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
  391. package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
  392. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
  393. package/coverage/lcov-report/src/integrations/index.html +0 -371
  394. package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
  395. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
  396. package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
  397. package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
  398. package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
  399. package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
  400. package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
  401. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
  402. package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
  403. package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
  404. package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
  405. package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
  406. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
  407. package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
  408. package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
  409. package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
  410. package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
  411. package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
  412. package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
  413. package/coverage/lcov-report/src/middleware/index.html +0 -236
  414. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
  415. package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
  416. package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
  417. package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
  418. package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
  419. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
  420. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
  421. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
  422. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
  423. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
  424. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
  425. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
  426. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
  427. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
  428. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
  429. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
  430. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
  431. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
  432. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
  433. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
  434. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
  435. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
  436. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
  437. package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
  438. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
  439. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
  440. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
  441. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
  442. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
  443. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
  444. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
  445. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
  446. package/coverage/lcov-report/src/migrations/index.html +0 -116
  447. package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
  448. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
  449. package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
  450. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
  451. package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
  452. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
  453. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
  454. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
  455. package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
  456. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
  457. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
  458. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
  459. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
  460. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
  461. package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
  462. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
  463. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
  464. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
  465. package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
  466. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
  467. package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
  468. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
  469. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
  470. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
  471. package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
  472. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
  473. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
  474. package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
  475. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
  476. package/coverage/lcov-report/src/sdk/index.html +0 -116
  477. package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
  478. package/coverage/lcov-report/src/sdk/users/index.html +0 -131
  479. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
  480. package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
  481. package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
  482. package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
  483. package/coverage/lcov-report/src/startup.ts.html +0 -484
  484. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
  485. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
  486. package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
  487. package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
  488. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
  489. package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
  490. package/coverage/lcov-report/src/threads/index.html +0 -161
  491. package/coverage/lcov-report/src/threads/index.ts.html +0 -418
  492. package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
  493. package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
  494. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
  495. package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
  496. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
  497. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
  498. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
  499. package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
  500. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
  501. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
  502. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
  503. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
  504. package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
  505. package/coverage/lcov-report/src/utilities/index.html +0 -251
  506. package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
  507. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
  508. package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
  509. package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
  510. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
  511. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
  512. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
  513. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
  514. package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
  515. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
  516. package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
  517. package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
  518. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
  519. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
  520. package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
  521. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
  522. package/coverage/lcov-report/src/watch.ts.html +0 -196
  523. package/coverage/lcov-report/src/websocket.ts.html +0 -163
  524. package/coverage/lcov.info +0 -21777
  525. package/dist/api/routes/public/tests/utils.js +0 -33
  526. package/dist/integrations/base/utils.js +0 -16
  527. package/specs/resources/utils/Resource.js +0 -26
  528. package/src/integrations/base/utils.ts +0 -12
@@ -1,1417 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/db/linkedRows/LinkController.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/db/linkedRows</a> LinkController.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">95.39% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>145/152</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">87.03% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>47/54</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">88.88% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>24/27</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">96% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>144/150</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 high'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">56x</span>
511
- <span class="cline-any cline-yes">56x</span>
512
- <span class="cline-any cline-yes">56x</span>
513
- <span class="cline-any cline-yes">56x</span>
514
- <span class="cline-any cline-yes">56x</span>
515
- <span class="cline-any cline-yes">56x</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-neutral">&nbsp;</span>
525
- <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-neutral">&nbsp;</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-neutral">&nbsp;</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-neutral">&nbsp;</span>
534
- <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-yes">235x</span>
540
- <span class="cline-any cline-yes">235x</span>
541
- <span class="cline-any cline-yes">235x</span>
542
- <span class="cline-any cline-yes">235x</span>
543
- <span class="cline-any cline-yes">235x</span>
544
- <span class="cline-any cline-neutral">&nbsp;</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">53x</span>
553
- <span class="cline-any cline-yes">6x</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-yes">53x</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-yes">230x</span>
568
- <span class="cline-any cline-yes">6x</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-yes">230x</span>
571
- <span class="cline-any cline-yes">550x</span>
572
- <span class="cline-any cline-yes">550x</span>
573
- <span class="cline-any cline-yes">41x</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-neutral">&nbsp;</span>
576
- <span class="cline-any cline-yes">189x</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-yes">27x</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-neutral">&nbsp;</span>
586
- <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-neutral">&nbsp;</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-yes">9x</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-neutral">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">22x</span>
605
- <span class="cline-any cline-yes">22x</span>
606
- <span class="cline-any cline-yes">82x</span>
607
- <span class="cline-any cline-yes">43x</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-yes">39x</span>
610
- <span class="cline-any cline-yes">39x</span>
611
- <span class="cline-any cline-yes">1x</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">38x</span>
616
- <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-neutral">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-yes">4x</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-yes">4x</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-yes">21x</span>
634
- <span class="cline-any cline-yes">2x</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-yes">2x</span>
638
- <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-neutral">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
645
- <span class="cline-any cline-yes">39x</span>
646
- <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-yes">35x</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-yes">35x</span>
652
- <span class="cline-any cline-yes">4x</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-yes">3x</span>
655
- <span class="cline-any cline-yes">1x</span>
656
- <span class="cline-any cline-yes">1x</span>
657
- <span class="cline-any cline-neutral">&nbsp;</span>
658
- <span class="cline-any cline-yes">39x</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-neutral">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&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-yes">22x</span>
671
- <span class="cline-any cline-yes">22x</span>
672
- <span class="cline-any cline-yes">22x</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-yes">22x</span>
675
- <span class="cline-any cline-yes">22x</span>
676
- <span class="cline-any cline-neutral">&nbsp;</span>
677
- <span class="cline-any cline-yes">83x</span>
678
- <span class="cline-any cline-yes">83x</span>
679
- <span class="cline-any cline-yes">83x</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-yes">12x</span>
682
- <span class="cline-any cline-neutral">&nbsp;</span>
683
- <span class="cline-any cline-yes">1x</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-yes">12x</span>
687
- <span class="cline-any cline-yes">1x</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
693
- <span class="cline-any cline-yes">12x</span>
694
- <span class="cline-any cline-yes">12x</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-yes">12x</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-no">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-neutral">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&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-neutral">&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-yes">12x</span>
711
- <span class="cline-any cline-yes">11x</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-yes">2x</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-yes">1x</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-neutral">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-yes">2x</span>
728
- <span class="cline-any cline-yes">1x</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-yes">10x</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">10x</span>
737
- <span class="cline-any cline-yes">10x</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-yes">1x</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-yes">9x</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-neutral">&nbsp;</span>
746
- <span class="cline-any cline-neutral">&nbsp;</span>
747
- <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-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-yes">11x</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-yes">1x</span>
759
- <span class="cline-any cline-yes">1x</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-yes">1x</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-yes">11x</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-yes">11x</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-yes">21x</span>
771
- <span class="cline-any cline-yes">21x</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-yes">2x</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-yes">2x</span>
784
- <span class="cline-any cline-yes">2x</span>
785
- <span class="cline-any cline-yes">1x</span>
786
- <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-yes">1x</span>
788
- <span class="cline-any cline-yes">1x</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-neutral">&nbsp;</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-yes">1x</span>
794
- <span class="cline-any cline-yes">1x</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-neutral">&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-neutral">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-yes">2x</span>
804
- <span class="cline-any cline-yes">2x</span>
805
- <span class="cline-any cline-yes">2x</span>
806
- <span class="cline-any cline-yes">2x</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-yes">4x</span>
809
- <span class="cline-any cline-neutral">&nbsp;</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-yes">4x</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-yes">2x</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-yes">3x</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-yes">2x</span>
823
- <span class="cline-any cline-yes">2x</span>
824
- <span class="cline-any cline-yes">2x</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-yes">2x</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-yes">21x</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-yes">21x</span>
839
- <span class="cline-any cline-yes">21x</span>
840
- <span class="cline-any cline-yes">21x</span>
841
- <span class="cline-any cline-yes">76x</span>
842
- <span class="cline-any cline-yes">76x</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-yes">35x</span>
848
- <span class="cline-any cline-yes">35x</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-no">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-yes">35x</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-neutral">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-yes">35x</span>
863
- <span class="cline-any cline-yes">35x</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-yes">35x</span>
866
- <span class="cline-any cline-yes">2x</span>
867
- <span class="cline-any cline-yes">2x</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-yes">35x</span>
872
- <span class="cline-any cline-yes">35x</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-yes">1x</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-yes">34x</span>
880
- <span class="cline-any cline-yes">34x</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-yes">34x</span>
883
- <span class="cline-any cline-yes">1x</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-yes">20x</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-yes">2x</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-yes">2x</span>
899
- <span class="cline-any cline-yes">2x</span>
900
- <span class="cline-any cline-yes">6x</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-yes">6x</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-yes">1x</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-neutral">&nbsp;</span>
910
- <span class="cline-any cline-yes">2x</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-neutral">&nbsp;</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-neutral">&nbsp;</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-yes">2x</span>
922
- <span class="cline-any cline-yes">2x</span>
923
- <span class="cline-any cline-yes">2x</span>
924
- <span class="cline-any cline-yes">7x</span>
925
- <span class="cline-any cline-yes">7x</span>
926
- <span class="cline-any cline-yes">7x</span>
927
- <span class="cline-any cline-yes">3x</span>
928
- <span class="cline-any cline-yes">3x</span>
929
- <span class="cline-any cline-yes">3x</span>
930
- <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
935
- <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-neutral">&nbsp;</span>
937
- <span class="cline-any cline-yes">2x</span>
938
- <span class="cline-any cline-yes">2x</span>
939
- <span class="cline-any cline-yes">1x</span>
940
- <span class="cline-any cline-neutral">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-yes">1x</span>
943
- <span class="cline-any cline-yes">1x</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-yes">1x</span>
949
- <span class="cline-any cline-yes">1x</span>
950
- <span class="cline-any cline-neutral">&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-yes">226x</span>
954
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { IncludeDocs, getLinkDocuments } from "./linkUtils"
955
- import { InternalTables, getUserMetadataParams } from "../utils"
956
- import Sentry from "@sentry/node"
957
- import { FieldTypes, RelationshipTypes } from "../../constants"
958
- import { context } from "@budibase/backend-core"
959
- import LinkDocument from "./LinkDocument"
960
- import {
961
- Database,
962
- FieldSchema,
963
- LinkDocumentValue,
964
- Row,
965
- Table,
966
- } from "@budibase/types"
967
- &nbsp;
968
- type LinkControllerOpts = {
969
- tableId?: string
970
- row?: Row
971
- table?: Table
972
- oldTable?: Table
973
- }
974
- &nbsp;
975
- class LinkController {
976
- _db: Database
977
- _tableId?: string
978
- _row?: Row
979
- _table?: Table
980
- _oldTable?: Table
981
- &nbsp;
982
- constructor({ tableId, row, table, oldTable }: LinkControllerOpts) {
983
- this._db = context.getAppDB()
984
- this._tableId = tableId
985
- this._row = row
986
- this._table = table
987
- this._oldTable = oldTable
988
- }
989
- &nbsp;
990
- /**
991
- * Retrieves the table, if it was not already found in the eventData.
992
- * @returns {Promise&lt;object&gt;} This will return a table based on the event data, either
993
- * if it was in the event already, or it uses the specified tableId to get it.
994
- */
995
- async table() {
996
- if (this._table == null) {
997
- this._table =
998
- this._table == null ? await this._db.get(this._tableId) : <span class="branch-1 cbranch-no" title="branch not covered" >this._table</span>
999
- }
1000
- return this._table!
1001
- }
1002
- &nbsp;
1003
- /**
1004
- * Checks if the table this was constructed with has any linking columns currently.
1005
- * If the table has not been retrieved this will retrieve it based on the eventData.
1006
- * @params {object|null} table If a table that is not known to the link controller is to be tested.
1007
- * @returns {Promise&lt;boolean&gt;} True if there are any linked fields, otherwise it will return
1008
- * false.
1009
- */
1010
- async doesTableHaveLinkedFields(table?: Table) {
1011
- if (table == null) {
1012
- table = await this.table()
1013
- }
1014
- for (let fieldName of Object.keys(table.schema)) {
1015
- const { type } = table.schema[fieldName]
1016
- if (type === FieldTypes.LINK) {
1017
- return true
1018
- }
1019
- }
1020
- return false
1021
- }
1022
- &nbsp;
1023
- /**
1024
- * Utility function for main getLinkDocuments function - refer to it for functionality.
1025
- */
1026
- getRowLinkDocs(rowId: string) {
1027
- return getLinkDocuments({
1028
- tableId: this._tableId,
1029
- rowId,
1030
- includeDocs: IncludeDocs.INCLUDE,
1031
- })
1032
- }
1033
- &nbsp;
1034
- /**
1035
- * Utility function for main getLinkDocuments function - refer to it for functionality.
1036
- */
1037
- async getTableLinkDocs() {
1038
- return (await getLinkDocuments({
1039
- tableId: this._tableId,
1040
- includeDocs: IncludeDocs.INCLUDE,
1041
- })) as LinkDocument[]
1042
- }
1043
- &nbsp;
1044
- /**
1045
- * Makes sure the passed in table schema contains valid relationship structures.
1046
- */
1047
- validateTable(table: Table) {
1048
- const usedAlready = []
1049
- for (let schema of Object.values(table.schema)) {
1050
- if (schema.type !== FieldTypes.LINK) {
1051
- continue
1052
- }
1053
- const unique = schema.tableId! + schema?.fieldName
1054
- if (usedAlready.indexOf(unique) !== -1) {
1055
- throw new Error(
1056
- "Cannot re-use the linked column name for a linked table."
1057
- )
1058
- }
1059
- usedAlready.push(unique)
1060
- }
1061
- }
1062
- &nbsp;
1063
- /**
1064
- * Returns whether the two link schemas are equal (in the important parts, not a pure equality check)
1065
- */
1066
- areLinkSchemasEqual(linkSchema1: FieldSchema, linkSchema2: FieldSchema) {
1067
- const compareFields = [
1068
- "name",
1069
- "type",
1070
- "tableId",
1071
- "fieldName",
1072
- "autocolumn",
1073
- "relationshipType",
1074
- ]
1075
- for (let field of compareFields) {
1076
- // @ts-ignore
1077
- if (linkSchema1[field] !== linkSchema2[field]) {
1078
- return false
1079
- }
1080
- }
1081
- return true
1082
- }
1083
- &nbsp;
1084
- /**
1085
- * Given the link field of this table, and the link field of the linked table, this makes sure
1086
- * the state of relationship type is accurate on both.
1087
- */
1088
- handleRelationshipType(linkerField: FieldSchema, linkedField: FieldSchema) {
1089
- if (
1090
- !linkerField.relationshipType ||
1091
- linkerField.relationshipType === RelationshipTypes.MANY_TO_MANY
1092
- ) {
1093
- linkedField.relationshipType = RelationshipTypes.MANY_TO_MANY
1094
- // make sure by default all are many to many (if not specified)
1095
- linkerField.relationshipType = RelationshipTypes.MANY_TO_MANY
1096
- } else if (linkerField.relationshipType === RelationshipTypes.MANY_TO_ONE) {
1097
- // Ensure that the other side of the relationship is locked to one record
1098
- linkedField.relationshipType = RelationshipTypes.ONE_TO_MANY
1099
- } else if (linkerField.relationshipType === RelationshipTypes.ONE_TO_MANY) {
1100
- linkedField.relationshipType = RelationshipTypes.MANY_TO_ONE
1101
- }
1102
- return { linkerField, linkedField }
1103
- }
1104
- &nbsp;
1105
- // all operations here will assume that the table
1106
- // this operation is related to has linked rows
1107
- /**
1108
- * When a row is saved this will carry out the necessary operations to make sure
1109
- * the link has been created/updated.
1110
- * @returns {Promise&lt;object&gt;} returns the row that has been cleaned and prepared to be written to the DB - links
1111
- * have also been created.
1112
- */
1113
- async rowSaved() {
1114
- const table = await this.table()
1115
- const row = this._row!
1116
- const operations = []
1117
- // get link docs to compare against
1118
- const linkDocs = (await this.getRowLinkDocs(row._id!)) as LinkDocument[]
1119
- for (let fieldName of Object.keys(table.schema)) {
1120
- // get the links this row wants to make
1121
- const rowField = row[fieldName]
1122
- const field = table.schema[fieldName]
1123
- if (field.type === FieldTypes.LINK &amp;&amp; rowField != null) {
1124
- // check which links actual pertain to the update in this row
1125
- const thisFieldLinkDocs = linkDocs.filter(
1126
- linkDoc =&gt;
1127
- linkDoc.doc1.fieldName === fieldName ||
1128
- <span class="branch-1 cbranch-no" title="branch not covered" > linkDoc.doc2.fieldName === fieldName</span>
1129
- )
1130
- const linkDocIds = thisFieldLinkDocs.map(linkDoc =&gt; {
1131
- return linkDoc.doc1.rowId === row._id
1132
- ? linkDoc.doc2.rowId
1133
- : <span class="branch-1 cbranch-no" title="branch not covered" >linkDoc.doc1.rowId</span>
1134
- })
1135
- &nbsp;
1136
- // if 1:N, ensure that this ID is not already attached to another record
1137
- const linkedTable = await this._db.get(field.tableId)
1138
- const linkedSchema = linkedTable.schema[field.fieldName!]
1139
- &nbsp;
1140
- // We need to map the global users to metadata in each app for relationships
1141
- <span class="missing-if-branch" title="if path not taken" >I</span>if (field.tableId === InternalTables.USER_METADATA) {
1142
- const users = <span class="cstat-no" title="statement not covered" >await this._db.allDocs(getUserMetadataParams(null, {}))</span>
1143
- const metadataRequired = <span class="cstat-no" title="statement not covered" >rowField.filter(</span>
1144
- <span class="fstat-no" title="function not covered" > (u</span>serId: string) =&gt; <span class="cstat-no" title="statement not covered" >!users.rows.some(<span class="fstat-no" title="function not covered" >user =&gt; <span class="cstat-no" title="statement not covered" >u</span>ser.id === userId)</span></span>
1145
- )
1146
- &nbsp;
1147
- // ensure non-existing user metadata is created in the app DB
1148
- <span class="cstat-no" title="statement not covered" > await this._db.bulkDocs(</span>
1149
- metadataRequired.map(<span class="fstat-no" title="function not covered" >(u</span>serId: string) =&gt; (<span class="cstat-no" title="statement not covered" >{ _id: userId }))</span>
1150
- )
1151
- }
1152
- &nbsp;
1153
- // iterate through the link IDs in the row field, see if any don't exist already
1154
- for (let linkId of rowField) {
1155
- if (
1156
- linkedSchema?.relationshipType === RelationshipTypes.ONE_TO_MANY
1157
- ) {
1158
- let links = (
1159
- (await getLinkDocuments({
1160
- tableId: field.tableId,
1161
- rowId: linkId,
1162
- includeDocs: IncludeDocs.EXCLUDE,
1163
- })) as LinkDocumentValue[]
1164
- ).filter(
1165
- link =&gt;
1166
- link.id !== row._id &amp;&amp; link.fieldName === linkedSchema.name
1167
- )
1168
- &nbsp;
1169
- // The 1 side of 1:N is already related to something else
1170
- // You must remove the existing relationship
1171
- if (links.length &gt; 0) {
1172
- throw new Error(
1173
- `1:N Relationship Error: Record already linked to another.`
1174
- )
1175
- }
1176
- }
1177
- &nbsp;
1178
- if (linkId &amp;&amp; linkId !== "" &amp;&amp; linkDocIds.indexOf(linkId) === -1) {
1179
- // first check the doc we're linking to exists
1180
- try {
1181
- await this._db.get(linkId)
1182
- } catch (err) {
1183
- // skip links that don't exist
1184
- continue
1185
- }
1186
- operations.push(
1187
- new LinkDocument(
1188
- table._id!,
1189
- fieldName,
1190
- row._id!,
1191
- field.tableId!,
1192
- field.fieldName!,
1193
- linkId
1194
- )
1195
- )
1196
- }
1197
- }
1198
- // find the docs that need to be deleted
1199
- let toDeleteDocs = thisFieldLinkDocs
1200
- .filter(doc =&gt; {
1201
- let correctDoc =
1202
- doc.doc1.fieldName === fieldName ? doc.doc2 : <span class="branch-1 cbranch-no" title="branch not covered" >doc.doc1</span>
1203
- return rowField.indexOf(correctDoc.rowId) === -1
1204
- })
1205
- .map(doc =&gt; {
1206
- return { ...doc, _deleted: true }
1207
- })
1208
- // now add the docs to be deleted to the bulk operation
1209
- operations.push(...toDeleteDocs)
1210
- // remove the field from this row, link doc will be added to row on way out
1211
- delete row[fieldName]
1212
- }
1213
- }
1214
- await this._db.bulkDocs(operations)
1215
- return row
1216
- }
1217
- &nbsp;
1218
- /**
1219
- * When a row is deleted this will carry out the necessary operations to make sure
1220
- * any links that existed have been removed.
1221
- * @returns {Promise&lt;object&gt;} The operation has been completed and the link documents should now
1222
- * be accurate. This also returns the row that was deleted.
1223
- */
1224
- async rowDeleted() {
1225
- const row = this._row!
1226
- // need to get the full link docs to be be able to delete it
1227
- const linkDocs = await this.getRowLinkDocs(row._id!)
1228
- if (linkDocs.length === 0) {
1229
- return null
1230
- }
1231
- const toDelete = linkDocs.map(doc =&gt; {
1232
- return {
1233
- ...doc,
1234
- _deleted: true,
1235
- }
1236
- })
1237
- await this._db.bulkDocs(toDelete)
1238
- return row
1239
- }
1240
- &nbsp;
1241
- /**
1242
- * Remove a field from a table as well as any linked rows that pertained to it.
1243
- * @param {string} fieldName The field to be removed from the table.
1244
- * @returns {Promise&lt;void&gt;} The table has now been updated.
1245
- */
1246
- async removeFieldFromTable(fieldName: string) {
1247
- let oldTable = this._oldTable
1248
- let field = oldTable?.schema[fieldName] as FieldSchema
1249
- const linkDocs = await this.getTableLinkDocs()
1250
- let toDelete = linkDocs.filter(linkDoc =&gt; {
1251
- let correctFieldName =
1252
- linkDoc.doc1.tableId === oldTable?._id
1253
- ? linkDoc.doc1.fieldName
1254
- : <span class="branch-1 cbranch-no" title="branch not covered" >linkDoc.doc2.fieldName</span>
1255
- return correctFieldName === fieldName
1256
- })
1257
- await this._db.bulkDocs(
1258
- toDelete.map(doc =&gt; {
1259
- return {
1260
- ...doc,
1261
- _deleted: true,
1262
- }
1263
- })
1264
- )
1265
- // remove schema from other table
1266
- let linkedTable = await this._db.get(field.tableId)
1267
- if (field.fieldName) {
1268
- delete linkedTable.schema[field.fieldName]
1269
- }
1270
- await this._db.put(linkedTable)
1271
- }
1272
- &nbsp;
1273
- /**
1274
- * When a table is saved this will carry out the necessary operations to make sure
1275
- * any linked tables are notified and updated correctly.
1276
- * @returns {Promise&lt;object&gt;} The operation has been completed and the link documents should now
1277
- * be accurate. Also returns the table that was operated on.
1278
- */
1279
- async tableSaved() {
1280
- const table = await this.table()
1281
- // validate the table first
1282
- this.validateTable(table)
1283
- const schema = table.schema
1284
- for (let fieldName of Object.keys(schema)) {
1285
- const field = schema[fieldName]
1286
- if (field.type === FieldTypes.LINK &amp;&amp; field.fieldName) {
1287
- // handle this in a separate try catch, want
1288
- // the put to bubble up as an error, if can't update
1289
- // table for some reason
1290
- let linkedTable
1291
- try {
1292
- linkedTable = await this._db.get(field.tableId)
1293
- } catch (err) {
1294
- /* istanbul ignore next */
1295
- <span class="cstat-no" title="statement not covered" > continue</span>
1296
- }
1297
- const fields = this.handleRelationshipType(field, {
1298
- name: field.fieldName,
1299
- type: FieldTypes.LINK,
1300
- // these are the props of the table that initiated the link
1301
- tableId: table._id,
1302
- fieldName: fieldName,
1303
- })
1304
- &nbsp;
1305
- // update table schema after checking relationship types
1306
- schema[fieldName] = fields.linkerField
1307
- const linkedField = fields.linkedField
1308
- &nbsp;
1309
- if (field.autocolumn) {
1310
- linkedField.autocolumn = field.autocolumn
1311
- linkedField.subtype = field.subtype
1312
- }
1313
- &nbsp;
1314
- // check the linked table to make sure we aren't overwriting an existing column
1315
- const existingSchema = linkedTable.schema[field.fieldName]
1316
- if (
1317
- existingSchema != null &amp;&amp;
1318
- !this.areLinkSchemasEqual(existingSchema, linkedField)
1319
- ) {
1320
- throw new Error("Cannot overwrite existing column.")
1321
- }
1322
- // create the link field in the other table
1323
- linkedTable.schema[field.fieldName] = linkedField
1324
- const response = await this._db.put(linkedTable)
1325
- // special case for when linking back to self, make sure rev updated
1326
- if (linkedTable._id === table._id) {
1327
- table._rev = response.rev
1328
- }
1329
- }
1330
- }
1331
- return table
1332
- }
1333
- &nbsp;
1334
- /**
1335
- * Update a table, this means if a field is removed need to handle removing from other table and removing
1336
- * any link docs that pertained to it.
1337
- * @returns {Promise&lt;Object&gt;} The table which has been saved, same response as with the tableSaved function.
1338
- */
1339
- async tableUpdated() {
1340
- const oldTable = this._oldTable
1341
- // first start by checking if any link columns have been deleted
1342
- const newTable = await this.table()
1343
- for (let fieldName of Object.keys(oldTable?.schema || <span class="branch-1 cbranch-no" title="branch not covered" >{})) {</span>
1344
- const field = oldTable?.schema[fieldName] as FieldSchema
1345
- // this field has been removed from the table schema
1346
- if (
1347
- field.type === FieldTypes.LINK &amp;&amp;
1348
- newTable.schema[fieldName] == null
1349
- ) {
1350
- await this.removeFieldFromTable(fieldName)
1351
- }
1352
- }
1353
- // now handle as if its a new save
1354
- return this.tableSaved()
1355
- }
1356
- &nbsp;
1357
- /**
1358
- * When a table is deleted this will carry out the necessary operations to make sure
1359
- * any linked tables have the joining column correctly removed as well as removing any
1360
- * now stale linking documents.
1361
- * @returns {Promise&lt;object&gt;} The operation has been completed and the link documents should now
1362
- * be accurate. Also returns the table that was operated on.
1363
- */
1364
- async tableDeleted() {
1365
- const table = await this.table()
1366
- const schema = table.schema
1367
- for (let fieldName of Object.keys(schema)) {
1368
- const field = schema[fieldName]
1369
- try {
1370
- if (field.type === FieldTypes.LINK &amp;&amp; field.fieldName) {
1371
- const linkedTable = await this._db.get(field.tableId)
1372
- delete linkedTable.schema[field.fieldName]
1373
- await this._db.put(linkedTable)
1374
- }
1375
- } catch (err) {
1376
- /* istanbul ignore next */
1377
- Sentry.captureException(err)
1378
- }
1379
- }
1380
- // need to get the full link docs to delete them
1381
- const linkDocs = await this.getTableLinkDocs()
1382
- if (linkDocs.length === 0) {
1383
- return null
1384
- }
1385
- // get link docs for this table and configure for deletion
1386
- const toDelete = linkDocs.map(doc =&gt; {
1387
- return {
1388
- ...doc,
1389
- _deleted: true,
1390
- }
1391
- })
1392
- await this._db.bulkDocs(toDelete)
1393
- return table
1394
- }
1395
- }
1396
- &nbsp;
1397
- export default LinkController
1398
- &nbsp;</pre></td></tr></table></pre>
1399
-
1400
- <div class='push'></div><!-- for sticky footer -->
1401
- </div><!-- /wrapper -->
1402
- <div class='footer quiet pad2 space-top1 center small'>
1403
- Code coverage generated by
1404
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1405
- at Wed Mar 01 2023 19:54:18 GMT+0000 (Coordinated Universal Time)
1406
- </div>
1407
- <script src="../../../prettify.js"></script>
1408
- <script>
1409
- window.onload = function () {
1410
- prettyPrint();
1411
- };
1412
- </script>
1413
- <script src="../../../sorter.js"></script>
1414
- <script src="../../../block-navigation.js"></script>
1415
- </body>
1416
- </html>
1417
-