velocious 1.0.431 → 1.0.433

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 (794) hide show
  1. package/build/application.js +229 -0
  2. package/build/authorization/ability.js +329 -0
  3. package/build/authorization/base-resource.js +143 -0
  4. package/build/background-jobs/client.js +50 -0
  5. package/build/background-jobs/cron-expression.js +277 -0
  6. package/build/background-jobs/forked-runner-child.js +86 -0
  7. package/build/background-jobs/job-record.js +13 -0
  8. package/build/background-jobs/job-registry.js +92 -0
  9. package/build/background-jobs/job-runner.js +107 -0
  10. package/build/background-jobs/job.js +77 -0
  11. package/build/background-jobs/json-socket.js +78 -0
  12. package/build/background-jobs/main.js +926 -0
  13. package/build/background-jobs/normalize-error.js +26 -0
  14. package/build/background-jobs/scheduler.js +274 -0
  15. package/build/background-jobs/socket-request.js +68 -0
  16. package/build/background-jobs/status-reporter.js +101 -0
  17. package/build/background-jobs/store.js +994 -0
  18. package/build/background-jobs/types.js +70 -0
  19. package/build/background-jobs/web/authorization.js +89 -0
  20. package/build/background-jobs/web/controller.js +280 -0
  21. package/build/background-jobs/web/index.js +57 -0
  22. package/build/background-jobs/web/path-matcher.js +74 -0
  23. package/build/background-jobs/web/registry.js +49 -0
  24. package/build/background-jobs/worker.js +683 -0
  25. package/build/beacon/client.js +330 -0
  26. package/build/beacon/in-process-broker.js +71 -0
  27. package/build/beacon/in-process-client.js +139 -0
  28. package/build/beacon/server.js +148 -0
  29. package/build/beacon/types.js +55 -0
  30. package/build/cli/base-command.js +67 -0
  31. package/build/cli/browser-cli.js +45 -0
  32. package/build/cli/commands/background-jobs-main.js +7 -0
  33. package/build/cli/commands/background-jobs-runner.js +7 -0
  34. package/build/cli/commands/background-jobs-worker.js +7 -0
  35. package/build/cli/commands/beacon.js +7 -0
  36. package/build/cli/commands/console.js +12 -0
  37. package/build/cli/commands/db/base-command.js +82 -0
  38. package/build/cli/commands/db/create.js +64 -0
  39. package/build/cli/commands/db/drop.js +75 -0
  40. package/build/cli/commands/db/migrate.js +17 -0
  41. package/build/cli/commands/db/reset.js +22 -0
  42. package/build/cli/commands/db/rollback.js +15 -0
  43. package/build/cli/commands/db/schema/dump.js +12 -0
  44. package/build/cli/commands/db/schema/load.js +12 -0
  45. package/build/cli/commands/db/seed.js +12 -0
  46. package/build/cli/commands/db/tenants/check.js +38 -0
  47. package/build/cli/commands/db/tenants/create.js +33 -0
  48. package/build/cli/commands/db/tenants/migrate.js +49 -0
  49. package/build/cli/commands/destroy/migration.js +7 -0
  50. package/build/cli/commands/generate/base-models.js +7 -0
  51. package/build/cli/commands/generate/frontend-models.js +12 -0
  52. package/build/cli/commands/generate/migration.js +7 -0
  53. package/build/cli/commands/generate/model.js +7 -0
  54. package/build/cli/commands/init.js +11 -0
  55. package/build/cli/commands/routes.js +7 -0
  56. package/build/cli/commands/run-script.js +12 -0
  57. package/build/cli/commands/runner.js +12 -0
  58. package/build/cli/commands/server.js +7 -0
  59. package/build/cli/commands/test.js +9 -0
  60. package/build/cli/index.js +152 -0
  61. package/build/cli/tenant-database-command-helper.js +198 -0
  62. package/build/cli/use-browser-cli.js +30 -0
  63. package/build/configuration-resolver.js +65 -0
  64. package/build/configuration-types.js +429 -0
  65. package/build/configuration.js +2590 -0
  66. package/build/controller.js +421 -0
  67. package/build/current-configuration.js +31 -0
  68. package/build/current.js +80 -0
  69. package/build/database/annotations-async-hooks.js +47 -0
  70. package/build/database/annotations.js +40 -0
  71. package/build/database/drivers/base-column.js +182 -0
  72. package/build/database/drivers/base-columns-index.js +81 -0
  73. package/build/database/drivers/base-foreign-key.js +104 -0
  74. package/build/database/drivers/base-table.js +156 -0
  75. package/build/database/drivers/base.js +1609 -0
  76. package/build/database/drivers/mssql/column.js +74 -0
  77. package/build/database/drivers/mssql/columns-index.js +6 -0
  78. package/build/database/drivers/mssql/connect-connection.js +16 -0
  79. package/build/database/drivers/mssql/foreign-key.js +12 -0
  80. package/build/database/drivers/mssql/index.js +590 -0
  81. package/build/database/drivers/mssql/options.js +79 -0
  82. package/build/database/drivers/mssql/query-parser.js +6 -0
  83. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  84. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  85. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  87. package/build/database/drivers/mssql/sql/delete.js +19 -0
  88. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  89. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  90. package/build/database/drivers/mssql/sql/insert.js +4 -0
  91. package/build/database/drivers/mssql/sql/update.js +31 -0
  92. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  93. package/build/database/drivers/mssql/structure-sql.js +120 -0
  94. package/build/database/drivers/mssql/table.js +145 -0
  95. package/build/database/drivers/mysql/column.js +112 -0
  96. package/build/database/drivers/mysql/columns-index.js +22 -0
  97. package/build/database/drivers/mysql/foreign-key.js +12 -0
  98. package/build/database/drivers/mysql/index.js +473 -0
  99. package/build/database/drivers/mysql/options.js +34 -0
  100. package/build/database/drivers/mysql/query-parser.js +6 -0
  101. package/build/database/drivers/mysql/query.js +37 -0
  102. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  103. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  104. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  106. package/build/database/drivers/mysql/sql/delete.js +21 -0
  107. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  108. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  109. package/build/database/drivers/mysql/sql/insert.js +6 -0
  110. package/build/database/drivers/mysql/sql/update.js +33 -0
  111. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  112. package/build/database/drivers/mysql/structure-sql.js +93 -0
  113. package/build/database/drivers/mysql/table.js +121 -0
  114. package/build/database/drivers/pgsql/column.js +90 -0
  115. package/build/database/drivers/pgsql/columns-index.js +6 -0
  116. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  117. package/build/database/drivers/pgsql/index.js +441 -0
  118. package/build/database/drivers/pgsql/options.js +32 -0
  119. package/build/database/drivers/pgsql/query-parser.js +6 -0
  120. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  121. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  122. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  124. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  125. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  126. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  127. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  128. package/build/database/drivers/pgsql/sql/update.js +33 -0
  129. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  130. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  131. package/build/database/drivers/pgsql/table.js +135 -0
  132. package/build/database/drivers/sqlite/base.js +509 -0
  133. package/build/database/drivers/sqlite/column.js +75 -0
  134. package/build/database/drivers/sqlite/columns-index.js +30 -0
  135. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  136. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  137. package/build/database/drivers/sqlite/index.js +394 -0
  138. package/build/database/drivers/sqlite/index.native.js +72 -0
  139. package/build/database/drivers/sqlite/index.web.js +99 -0
  140. package/build/database/drivers/sqlite/options.js +32 -0
  141. package/build/database/drivers/sqlite/query-parser.js +6 -0
  142. package/build/database/drivers/sqlite/query.js +35 -0
  143. package/build/database/drivers/sqlite/query.native.js +35 -0
  144. package/build/database/drivers/sqlite/query.web.js +49 -0
  145. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  146. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  147. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  148. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  149. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  151. package/build/database/drivers/sqlite/sql/update.js +33 -0
  152. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  153. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  154. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  155. package/build/database/drivers/sqlite/table.js +131 -0
  156. package/build/database/drivers/structure-sql/utils.js +35 -0
  157. package/build/database/handler.js +13 -0
  158. package/build/database/initializer-from-require-context.js +101 -0
  159. package/build/database/migration/index.js +438 -0
  160. package/build/database/migrator/files-finder.js +55 -0
  161. package/build/database/migrator/types.js +31 -0
  162. package/build/database/migrator.js +557 -0
  163. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  164. package/build/database/pool/base-methods-forward.js +52 -0
  165. package/build/database/pool/base.js +380 -0
  166. package/build/database/pool/single-multi-use.js +118 -0
  167. package/build/database/query/alter-table-base.js +104 -0
  168. package/build/database/query/base.js +49 -0
  169. package/build/database/query/create-database-base.js +42 -0
  170. package/build/database/query/create-index-base.js +117 -0
  171. package/build/database/query/create-table-base.js +205 -0
  172. package/build/database/query/delete-base.js +19 -0
  173. package/build/database/query/drop-database-base.js +38 -0
  174. package/build/database/query/drop-table-base.js +58 -0
  175. package/build/database/query/from-base.js +36 -0
  176. package/build/database/query/from-plain.js +16 -0
  177. package/build/database/query/from-table.js +18 -0
  178. package/build/database/query/index.js +533 -0
  179. package/build/database/query/insert-base.js +172 -0
  180. package/build/database/query/join-base.js +43 -0
  181. package/build/database/query/join-object.js +167 -0
  182. package/build/database/query/join-plain.js +18 -0
  183. package/build/database/query/join-tracker.js +93 -0
  184. package/build/database/query/model-class-query.js +1577 -0
  185. package/build/database/query/order-base.js +33 -0
  186. package/build/database/query/order-column.js +77 -0
  187. package/build/database/query/order-plain.js +28 -0
  188. package/build/database/query/preloader/belongs-to.js +267 -0
  189. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  190. package/build/database/query/preloader/has-many.js +316 -0
  191. package/build/database/query/preloader/has-one.js +123 -0
  192. package/build/database/query/preloader/selection.js +152 -0
  193. package/build/database/query/preloader.js +201 -0
  194. package/build/database/query/query-data.js +305 -0
  195. package/build/database/query/select-base.js +30 -0
  196. package/build/database/query/select-plain.js +18 -0
  197. package/build/database/query/select-table-and-column.js +28 -0
  198. package/build/database/query/update-base.js +41 -0
  199. package/build/database/query/upsert-base.js +103 -0
  200. package/build/database/query/where-base.js +38 -0
  201. package/build/database/query/where-combinator.js +31 -0
  202. package/build/database/query/where-hash.js +77 -0
  203. package/build/database/query/where-model-class-hash.js +505 -0
  204. package/build/database/query/where-not.js +23 -0
  205. package/build/database/query/where-plain.js +20 -0
  206. package/build/database/query/with-count.js +219 -0
  207. package/build/database/query-parser/base-query-parser.js +40 -0
  208. package/build/database/query-parser/from-parser.js +49 -0
  209. package/build/database/query-parser/group-parser.js +55 -0
  210. package/build/database/query-parser/joins-parser.js +37 -0
  211. package/build/database/query-parser/limit-parser.js +77 -0
  212. package/build/database/query-parser/options.js +94 -0
  213. package/build/database/query-parser/order-parser.js +45 -0
  214. package/build/database/query-parser/select-parser.js +67 -0
  215. package/build/database/query-parser/where-parser.js +46 -0
  216. package/build/database/record/acts-as-list.js +374 -0
  217. package/build/database/record/attachments/download.js +49 -0
  218. package/build/database/record/attachments/handle.js +188 -0
  219. package/build/database/record/attachments/normalize-input.js +213 -0
  220. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  221. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  222. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  223. package/build/database/record/attachments/store.js +591 -0
  224. package/build/database/record/index.js +4119 -0
  225. package/build/database/record/instance-relationships/base.js +289 -0
  226. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  227. package/build/database/record/instance-relationships/has-many.js +284 -0
  228. package/build/database/record/instance-relationships/has-one.js +117 -0
  229. package/build/database/record/record-not-found-error.js +3 -0
  230. package/build/database/record/relationships/base.js +195 -0
  231. package/build/database/record/relationships/belongs-to.js +57 -0
  232. package/build/database/record/relationships/has-many.js +46 -0
  233. package/build/database/record/relationships/has-one.js +46 -0
  234. package/build/database/record/state-machine.js +278 -0
  235. package/build/database/record/user-module.js +43 -0
  236. package/build/database/record/validators/base.js +27 -0
  237. package/build/database/record/validators/format.js +50 -0
  238. package/build/database/record/validators/presence.js +24 -0
  239. package/build/database/record/validators/uniqueness.js +124 -0
  240. package/build/database/table-data/index.js +241 -0
  241. package/build/database/table-data/table-column.js +416 -0
  242. package/build/database/table-data/table-foreign-key.js +69 -0
  243. package/build/database/table-data/table-index.js +46 -0
  244. package/build/database/table-data/table-reference.js +13 -0
  245. package/build/database/use-database.js +48 -0
  246. package/build/environment-handlers/base.js +561 -0
  247. package/build/environment-handlers/browser.js +338 -0
  248. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  249. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  251. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  252. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  253. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  254. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  255. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  256. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  257. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  258. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  259. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  260. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  261. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  262. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  263. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  264. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  265. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  266. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  267. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  268. package/build/environment-handlers/node.js +887 -0
  269. package/build/error-logger.js +30 -0
  270. package/build/frontend-model-controller.js +3491 -0
  271. package/build/frontend-model-resource/base-resource.js +939 -0
  272. package/build/frontend-models/base.js +4004 -0
  273. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  274. package/build/frontend-models/event-hook-models.js +49 -0
  275. package/build/frontend-models/model-registry.js +28 -0
  276. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  277. package/build/frontend-models/preloader.js +169 -0
  278. package/build/frontend-models/query.js +2245 -0
  279. package/build/frontend-models/resource-config-validation.js +56 -0
  280. package/build/frontend-models/resource-definition.js +399 -0
  281. package/build/frontend-models/transport-serialization.js +369 -0
  282. package/build/frontend-models/use-created-event.js +21 -0
  283. package/build/frontend-models/use-destroyed-event.js +148 -0
  284. package/build/frontend-models/use-model-class-event.js +164 -0
  285. package/build/frontend-models/use-updated-event.js +152 -0
  286. package/build/frontend-models/websocket-channel.js +494 -0
  287. package/build/frontend-models/websocket-publishers.js +224 -0
  288. package/build/http-client/header.js +17 -0
  289. package/build/http-client/index.js +139 -0
  290. package/build/http-client/request.js +94 -0
  291. package/build/http-client/response.js +151 -0
  292. package/build/http-client/websocket-client.js +27 -0
  293. package/build/http-server/client/index.js +507 -0
  294. package/build/http-server/client/params-to-object.js +152 -0
  295. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  296. package/build/http-server/client/request-buffer/header.js +19 -0
  297. package/build/http-server/client/request-buffer/index.js +535 -0
  298. package/build/http-server/client/request-parser.js +195 -0
  299. package/build/http-server/client/request-runner.js +321 -0
  300. package/build/http-server/client/request-timing.js +171 -0
  301. package/build/http-server/client/request.js +114 -0
  302. package/build/http-server/client/response.js +251 -0
  303. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  304. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  305. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  306. package/build/http-server/client/websocket-request.js +147 -0
  307. package/build/http-server/client/websocket-session.js +1755 -0
  308. package/build/http-server/cookie.js +245 -0
  309. package/build/http-server/development-reloader.js +240 -0
  310. package/build/http-server/index.js +561 -0
  311. package/build/http-server/remote-address.js +77 -0
  312. package/build/http-server/server-client.js +222 -0
  313. package/build/http-server/server-lock.js +178 -0
  314. package/build/http-server/websocket-channel-subscribers.js +110 -0
  315. package/build/http-server/websocket-channel.js +137 -0
  316. package/build/http-server/websocket-connection.js +118 -0
  317. package/build/http-server/websocket-event-log-store.js +433 -0
  318. package/build/http-server/websocket-events-host.js +170 -0
  319. package/build/http-server/websocket-events.js +50 -0
  320. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  321. package/build/http-server/worker-handler/in-process.js +155 -0
  322. package/build/http-server/worker-handler/index.js +370 -0
  323. package/build/http-server/worker-handler/worker-script.js +6 -0
  324. package/build/http-server/worker-handler/worker-thread.js +286 -0
  325. package/build/initializer.js +39 -0
  326. package/build/jobs/mail-delivery.js +22 -0
  327. package/build/logger/base-logger.js +34 -0
  328. package/build/logger/console-logger.js +28 -0
  329. package/build/logger/file-logger.js +36 -0
  330. package/build/logger/outputs/array-output.js +50 -0
  331. package/build/logger/outputs/console-output.js +32 -0
  332. package/build/logger/outputs/file-output.js +55 -0
  333. package/build/logger/outputs/stdout-output.js +64 -0
  334. package/build/logger.js +507 -0
  335. package/build/mailer/backends/smtp.js +197 -0
  336. package/build/mailer/base.js +337 -0
  337. package/build/mailer/delivery.js +70 -0
  338. package/build/mailer/index.js +24 -0
  339. package/build/mailer.js +15 -0
  340. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  341. package/build/plugins/sqljs-wasm-route.js +71 -0
  342. package/build/record-payload-values.js +83 -0
  343. package/build/routes/app-routes.js +17 -0
  344. package/build/routes/base-route.js +133 -0
  345. package/build/routes/basic-route.js +109 -0
  346. package/build/routes/built-in/debug/controller.js +12 -0
  347. package/build/routes/built-in/errors/controller.js +7 -0
  348. package/build/routes/get-route.js +75 -0
  349. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  350. package/build/routes/index.js +50 -0
  351. package/build/routes/namespace-route.js +51 -0
  352. package/build/routes/plugin-routes.js +141 -0
  353. package/build/routes/post-route.js +74 -0
  354. package/build/routes/resolver.js +535 -0
  355. package/build/routes/resource-route.js +154 -0
  356. package/build/routes/root-route.js +11 -0
  357. package/build/src/application.js +187 -214
  358. package/build/src/authorization/ability.js +250 -297
  359. package/build/src/authorization/base-resource.js +120 -136
  360. package/build/src/background-jobs/client.js +43 -47
  361. package/build/src/background-jobs/cron-expression.js +127 -166
  362. package/build/src/background-jobs/forked-runner-child.js +37 -47
  363. package/build/src/background-jobs/job-record.js +8 -10
  364. package/build/src/background-jobs/job-registry.js +72 -84
  365. package/build/src/background-jobs/job-runner.js +74 -81
  366. package/build/src/background-jobs/job.js +62 -72
  367. package/build/src/background-jobs/json-socket.js +65 -70
  368. package/build/src/background-jobs/main.js +841 -900
  369. package/build/src/background-jobs/normalize-error.js +12 -11
  370. package/build/src/background-jobs/scheduler.js +205 -247
  371. package/build/src/background-jobs/socket-request.js +60 -65
  372. package/build/src/background-jobs/status-reporter.js +86 -96
  373. package/build/src/background-jobs/store.js +862 -980
  374. package/build/src/background-jobs/types.js +2 -3
  375. package/build/src/background-jobs/web/authorization.js +38 -50
  376. package/build/src/background-jobs/web/controller.js +232 -268
  377. package/build/src/background-jobs/web/index.js +36 -40
  378. package/build/src/background-jobs/web/path-matcher.js +45 -48
  379. package/build/src/background-jobs/web/registry.js +9 -14
  380. package/build/src/background-jobs/worker.js +585 -639
  381. package/build/src/beacon/client.js +264 -293
  382. package/build/src/beacon/in-process-broker.js +20 -25
  383. package/build/src/beacon/in-process-client.js +104 -116
  384. package/build/src/beacon/server.js +110 -126
  385. package/build/src/beacon/types.js +2 -8
  386. package/build/src/cli/base-command.js +49 -57
  387. package/build/src/cli/browser-cli.js +37 -42
  388. package/build/src/cli/commands/background-jobs-main.js +5 -5
  389. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  390. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  391. package/build/src/cli/commands/beacon.js +5 -5
  392. package/build/src/cli/commands/console.js +10 -10
  393. package/build/src/cli/commands/db/base-command.js +71 -76
  394. package/build/src/cli/commands/db/create.js +53 -61
  395. package/build/src/cli/commands/db/drop.js +62 -71
  396. package/build/src/cli/commands/db/migrate.js +13 -15
  397. package/build/src/cli/commands/db/reset.js +16 -19
  398. package/build/src/cli/commands/db/rollback.js +12 -13
  399. package/build/src/cli/commands/db/schema/dump.js +9 -9
  400. package/build/src/cli/commands/db/schema/load.js +9 -9
  401. package/build/src/cli/commands/db/seed.js +9 -9
  402. package/build/src/cli/commands/db/tenants/check.js +32 -35
  403. package/build/src/cli/commands/db/tenants/create.js +26 -29
  404. package/build/src/cli/commands/db/tenants/migrate.js +40 -44
  405. package/build/src/cli/commands/destroy/migration.js +5 -5
  406. package/build/src/cli/commands/generate/base-models.js +5 -5
  407. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  408. package/build/src/cli/commands/generate/migration.js +5 -5
  409. package/build/src/cli/commands/generate/model.js +5 -5
  410. package/build/src/cli/commands/init.js +7 -9
  411. package/build/src/cli/commands/routes.js +6 -6
  412. package/build/src/cli/commands/run-script.js +9 -9
  413. package/build/src/cli/commands/runner.js +9 -9
  414. package/build/src/cli/commands/server.js +6 -6
  415. package/build/src/cli/commands/test.js +6 -7
  416. package/build/src/cli/index.js +127 -141
  417. package/build/src/cli/tenant-database-command-helper.js +154 -185
  418. package/build/src/cli/use-browser-cli.js +15 -20
  419. package/build/src/configuration-resolver.js +47 -54
  420. package/build/src/configuration-types.d.ts +5 -3
  421. package/build/src/configuration-types.d.ts.map +1 -1
  422. package/build/src/configuration-types.js +3 -54
  423. package/build/src/configuration.js +2240 -2547
  424. package/build/src/controller.js +363 -407
  425. package/build/src/current-configuration.js +9 -12
  426. package/build/src/current.js +70 -75
  427. package/build/src/database/annotations-async-hooks.js +16 -22
  428. package/build/src/database/annotations.js +12 -18
  429. package/build/src/database/drivers/base-column.js +155 -179
  430. package/build/src/database/drivers/base-columns-index.js +69 -78
  431. package/build/src/database/drivers/base-foreign-key.js +89 -101
  432. package/build/src/database/drivers/base-table.js +124 -149
  433. package/build/src/database/drivers/base.js +1306 -1489
  434. package/build/src/database/drivers/mssql/column.js +39 -50
  435. package/build/src/database/drivers/mssql/columns-index.js +2 -3
  436. package/build/src/database/drivers/mssql/connect-connection.js +11 -9
  437. package/build/src/database/drivers/mssql/foreign-key.js +8 -9
  438. package/build/src/database/drivers/mssql/index.js +507 -587
  439. package/build/src/database/drivers/mssql/options.js +68 -75
  440. package/build/src/database/drivers/mssql/query-parser.js +2 -3
  441. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  442. package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
  443. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  444. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  445. package/build/src/database/drivers/mssql/sql/delete.js +14 -16
  446. package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
  447. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  448. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  449. package/build/src/database/drivers/mssql/sql/update.js +24 -28
  450. package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
  451. package/build/src/database/drivers/mssql/structure-sql.js +102 -114
  452. package/build/src/database/drivers/mssql/table.js +81 -96
  453. package/build/src/database/drivers/mysql/column.js +75 -92
  454. package/build/src/database/drivers/mysql/columns-index.js +16 -19
  455. package/build/src/database/drivers/mysql/foreign-key.js +8 -9
  456. package/build/src/database/drivers/mysql/index.js +396 -457
  457. package/build/src/database/drivers/mysql/options.js +26 -30
  458. package/build/src/database/drivers/mysql/query-parser.js +2 -3
  459. package/build/src/database/drivers/mysql/query.js +26 -29
  460. package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
  461. package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
  462. package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
  463. package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
  464. package/build/src/database/drivers/mysql/sql/delete.js +14 -17
  465. package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
  466. package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
  467. package/build/src/database/drivers/mysql/sql/insert.js +2 -3
  468. package/build/src/database/drivers/mysql/sql/update.js +24 -29
  469. package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
  470. package/build/src/database/drivers/mysql/structure-sql.js +79 -88
  471. package/build/src/database/drivers/mysql/table.js +83 -98
  472. package/build/src/database/drivers/pgsql/column.js +56 -72
  473. package/build/src/database/drivers/pgsql/columns-index.js +2 -3
  474. package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
  475. package/build/src/database/drivers/pgsql/index.js +377 -438
  476. package/build/src/database/drivers/pgsql/options.js +25 -28
  477. package/build/src/database/drivers/pgsql/query-parser.js +2 -3
  478. package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
  479. package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
  480. package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
  481. package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
  482. package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
  483. package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
  484. package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
  485. package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
  486. package/build/src/database/drivers/pgsql/sql/update.js +24 -29
  487. package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
  488. package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
  489. package/build/src/database/drivers/pgsql/table.js +60 -77
  490. package/build/src/database/drivers/sqlite/base.js +405 -478
  491. package/build/src/database/drivers/sqlite/column.js +54 -69
  492. package/build/src/database/drivers/sqlite/columns-index.js +22 -27
  493. package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
  494. package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
  495. package/build/src/database/drivers/sqlite/index.js +330 -373
  496. package/build/src/database/drivers/sqlite/index.native.js +55 -64
  497. package/build/src/database/drivers/sqlite/index.web.js +69 -87
  498. package/build/src/database/drivers/sqlite/options.js +25 -28
  499. package/build/src/database/drivers/sqlite/query-parser.js +2 -3
  500. package/build/src/database/drivers/sqlite/query.js +21 -24
  501. package/build/src/database/drivers/sqlite/query.native.js +20 -25
  502. package/build/src/database/drivers/sqlite/query.web.js +30 -37
  503. package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
  504. package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
  505. package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
  506. package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
  507. package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
  508. package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
  509. package/build/src/database/drivers/sqlite/sql/update.js +24 -29
  510. package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
  511. package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
  512. package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
  513. package/build/src/database/drivers/sqlite/table.js +102 -125
  514. package/build/src/database/drivers/structure-sql/utils.js +14 -17
  515. package/build/src/database/handler.js +9 -10
  516. package/build/src/database/initializer-from-require-context.js +76 -87
  517. package/build/src/database/migration/index.js +332 -395
  518. package/build/src/database/migrator/files-finder.js +40 -50
  519. package/build/src/database/migrator/types.js +2 -30
  520. package/build/src/database/migrator.js +454 -526
  521. package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
  522. package/build/src/database/pool/base-methods-forward.js +40 -43
  523. package/build/src/database/pool/base.js +298 -343
  524. package/build/src/database/pool/single-multi-use.js +93 -110
  525. package/build/src/database/query/alter-table-base.js +84 -99
  526. package/build/src/database/query/base.js +39 -46
  527. package/build/src/database/query/create-database-base.js +25 -30
  528. package/build/src/database/query/create-index-base.js +75 -94
  529. package/build/src/database/query/create-table-base.js +151 -193
  530. package/build/src/database/query/delete-base.js +14 -16
  531. package/build/src/database/query/drop-database-base.js +23 -28
  532. package/build/src/database/query/drop-table-base.js +42 -53
  533. package/build/src/database/query/from-base.js +30 -33
  534. package/build/src/database/query/from-plain.js +11 -13
  535. package/build/src/database/query/from-table.js +13 -15
  536. package/build/src/database/query/index.js +410 -472
  537. package/build/src/database/query/insert-base.js +143 -164
  538. package/build/src/database/query/join-base.js +35 -40
  539. package/build/src/database/query/join-object.js +128 -153
  540. package/build/src/database/query/join-plain.js +13 -15
  541. package/build/src/database/query/join-tracker.js +76 -90
  542. package/build/src/database/query/model-class-query.js +1134 -1370
  543. package/build/src/database/query/order-base.js +27 -30
  544. package/build/src/database/query/order-column.js +44 -53
  545. package/build/src/database/query/order-plain.js +20 -24
  546. package/build/src/database/query/preloader/belongs-to.js +210 -258
  547. package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
  548. package/build/src/database/query/preloader/has-many.js +240 -301
  549. package/build/src/database/query/preloader/has-one.js +91 -117
  550. package/build/src/database/query/preloader/selection.js +117 -129
  551. package/build/src/database/query/preloader.js +160 -185
  552. package/build/src/database/query/query-data.js +157 -201
  553. package/build/src/database/query/select-base.js +25 -27
  554. package/build/src/database/query/select-plain.js +13 -15
  555. package/build/src/database/query/select-table-and-column.js +21 -25
  556. package/build/src/database/query/update-base.js +35 -38
  557. package/build/src/database/query/upsert-base.js +93 -100
  558. package/build/src/database/query/where-base.js +32 -35
  559. package/build/src/database/query/where-combinator.js +25 -28
  560. package/build/src/database/query/where-hash.js +61 -68
  561. package/build/src/database/query/where-model-class-hash.js +414 -469
  562. package/build/src/database/query/where-not.js +18 -20
  563. package/build/src/database/query/where-plain.js +15 -17
  564. package/build/src/database/query/with-count.js +125 -159
  565. package/build/src/database/query-parser/base-query-parser.js +32 -37
  566. package/build/src/database/query-parser/from-parser.js +36 -45
  567. package/build/src/database/query-parser/group-parser.js +42 -50
  568. package/build/src/database/query-parser/joins-parser.js +28 -33
  569. package/build/src/database/query-parser/limit-parser.js +67 -70
  570. package/build/src/database/query-parser/options.js +75 -82
  571. package/build/src/database/query-parser/order-parser.js +36 -40
  572. package/build/src/database/query-parser/select-parser.js +49 -60
  573. package/build/src/database/query-parser/where-parser.js +36 -41
  574. package/build/src/database/record/acts-as-list.js +235 -273
  575. package/build/src/database/record/attachments/download.js +44 -45
  576. package/build/src/database/record/attachments/handle.js +141 -161
  577. package/build/src/database/record/attachments/normalize-input.js +128 -138
  578. package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
  579. package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
  580. package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
  581. package/build/src/database/record/attachments/store.js +467 -539
  582. package/build/src/database/record/index.d.ts +109 -25
  583. package/build/src/database/record/index.d.ts.map +1 -1
  584. package/build/src/database/record/index.js +3502 -3898
  585. package/build/src/database/record/instance-relationships/base.js +234 -268
  586. package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
  587. package/build/src/database/record/instance-relationships/has-many.js +225 -264
  588. package/build/src/database/record/instance-relationships/has-one.js +85 -105
  589. package/build/src/database/record/record-not-found-error.js +3 -2
  590. package/build/src/database/record/relationships/base.js +144 -166
  591. package/build/src/database/record/relationships/belongs-to.js +44 -51
  592. package/build/src/database/record/relationships/has-many.js +32 -40
  593. package/build/src/database/record/relationships/has-one.js +32 -40
  594. package/build/src/database/record/state-machine.js +156 -208
  595. package/build/src/database/record/user-module.js +32 -38
  596. package/build/src/database/record/validators/base.js +22 -24
  597. package/build/src/database/record/validators/format.js +36 -46
  598. package/build/src/database/record/validators/presence.js +18 -20
  599. package/build/src/database/record/validators/uniqueness.js +99 -117
  600. package/build/src/database/table-data/index.js +199 -231
  601. package/build/src/database/table-data/table-column.js +338 -382
  602. package/build/src/database/table-data/table-foreign-key.js +57 -66
  603. package/build/src/database/table-data/table-index.js +29 -36
  604. package/build/src/database/table-data/table-reference.js +10 -10
  605. package/build/src/database/use-database.js +32 -40
  606. package/build/src/environment-handlers/base.js +484 -544
  607. package/build/src/environment-handlers/browser.js +241 -294
  608. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
  609. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
  610. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
  611. package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
  612. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
  613. package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
  614. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
  615. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
  616. package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
  617. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
  618. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  619. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  620. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +326 -358
  621. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
  622. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  623. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
  624. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
  625. package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
  626. package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
  627. package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
  628. package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
  629. package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
  630. package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
  631. package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
  632. package/build/src/environment-handlers/node.js +753 -874
  633. package/build/src/error-logger.js +22 -21
  634. package/build/src/frontend-model-controller.js +2791 -3291
  635. package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
  636. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  637. package/build/src/frontend-model-resource/base-resource.js +770 -865
  638. package/build/src/frontend-models/base.js +3136 -3593
  639. package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
  640. package/build/src/frontend-models/event-hook-models.js +16 -21
  641. package/build/src/frontend-models/model-registry.js +9 -11
  642. package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
  643. package/build/src/frontend-models/preloader.js +131 -149
  644. package/build/src/frontend-models/query.js +1557 -1855
  645. package/build/src/frontend-models/resource-config-validation.js +27 -37
  646. package/build/src/frontend-models/resource-definition.d.ts +6 -7
  647. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  648. package/build/src/frontend-models/resource-definition.js +237 -291
  649. package/build/src/frontend-models/transport-serialization.js +203 -266
  650. package/build/src/frontend-models/use-created-event.js +5 -7
  651. package/build/src/frontend-models/use-destroyed-event.js +80 -93
  652. package/build/src/frontend-models/use-model-class-event.js +79 -91
  653. package/build/src/frontend-models/use-updated-event.js +84 -97
  654. package/build/src/frontend-models/websocket-channel.js +381 -441
  655. package/build/src/frontend-models/websocket-publishers.js +142 -175
  656. package/build/src/http-client/header.js +13 -14
  657. package/build/src/http-client/index.js +116 -132
  658. package/build/src/http-client/request.js +71 -87
  659. package/build/src/http-client/response.js +122 -140
  660. package/build/src/http-client/websocket-client.js +15 -17
  661. package/build/src/http-server/client/index.js +409 -465
  662. package/build/src/http-server/client/params-to-object.js +124 -135
  663. package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
  664. package/build/src/http-server/client/request-buffer/header.js +15 -16
  665. package/build/src/http-server/client/request-buffer/index.js +446 -506
  666. package/build/src/http-server/client/request-parser.js +163 -186
  667. package/build/src/http-server/client/request-runner.js +226 -259
  668. package/build/src/http-server/client/request-timing.js +132 -151
  669. package/build/src/http-server/client/request.js +96 -108
  670. package/build/src/http-server/client/response.js +213 -235
  671. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
  672. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
  673. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  674. package/build/src/http-server/client/websocket-request.js +114 -137
  675. package/build/src/http-server/client/websocket-session.js +1452 -1657
  676. package/build/src/http-server/cookie.js +216 -236
  677. package/build/src/http-server/development-reloader.js +190 -221
  678. package/build/src/http-server/index.js +451 -525
  679. package/build/src/http-server/remote-address.js +38 -50
  680. package/build/src/http-server/server-client.js +181 -208
  681. package/build/src/http-server/server-lock.js +153 -167
  682. package/build/src/http-server/websocket-channel-subscribers.js +81 -93
  683. package/build/src/http-server/websocket-channel.js +104 -117
  684. package/build/src/http-server/websocket-connection.js +96 -104
  685. package/build/src/http-server/websocket-event-log-store.js +350 -404
  686. package/build/src/http-server/websocket-events-host.js +145 -164
  687. package/build/src/http-server/websocket-events.js +47 -47
  688. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
  689. package/build/src/http-server/worker-handler/in-process.js +123 -141
  690. package/build/src/http-server/worker-handler/index.js +313 -349
  691. package/build/src/http-server/worker-handler/worker-script.js +4 -5
  692. package/build/src/http-server/worker-handler/worker-thread.js +240 -269
  693. package/build/src/initializer.js +31 -36
  694. package/build/src/jobs/mail-delivery.js +13 -15
  695. package/build/src/logger/base-logger.js +24 -26
  696. package/build/src/logger/console-logger.js +21 -23
  697. package/build/src/logger/file-logger.js +29 -31
  698. package/build/src/logger/outputs/array-output.js +37 -42
  699. package/build/src/logger/outputs/console-output.js +20 -24
  700. package/build/src/logger/outputs/file-output.js +43 -48
  701. package/build/src/logger/outputs/stdout-output.js +39 -48
  702. package/build/src/logger.js +338 -394
  703. package/build/src/mailer/backends/smtp.js +134 -163
  704. package/build/src/mailer/base.js +211 -251
  705. package/build/src/mailer/delivery.js +56 -64
  706. package/build/src/mailer/index.js +4 -22
  707. package/build/src/mailer.js +4 -13
  708. package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
  709. package/build/src/plugins/sqljs-wasm-route.js +28 -38
  710. package/build/src/record-payload-values.js +25 -28
  711. package/build/src/routes/app-routes.js +12 -14
  712. package/build/src/routes/base-route.js +112 -130
  713. package/build/src/routes/basic-route.js +83 -102
  714. package/build/src/routes/built-in/debug/controller.js +10 -10
  715. package/build/src/routes/built-in/errors/controller.js +5 -5
  716. package/build/src/routes/get-route.js +50 -63
  717. package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
  718. package/build/src/routes/index.js +36 -43
  719. package/build/src/routes/namespace-route.js +38 -47
  720. package/build/src/routes/plugin-routes.js +107 -124
  721. package/build/src/routes/post-route.js +51 -62
  722. package/build/src/routes/resolver.js +422 -494
  723. package/build/src/routes/resource-route.js +124 -143
  724. package/build/src/routes/root-route.js +7 -8
  725. package/build/src/testing/base-expect.js +13 -14
  726. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
  727. package/build/src/testing/browser-test-app.js +23 -29
  728. package/build/src/testing/expect-to-change.js +41 -50
  729. package/build/src/testing/expect-utils.js +139 -184
  730. package/build/src/testing/expect.js +638 -731
  731. package/build/src/testing/request-client.js +70 -85
  732. package/build/src/testing/test-files-finder.js +285 -339
  733. package/build/src/testing/test-filter-parser.js +124 -155
  734. package/build/src/testing/test-runner.js +883 -1020
  735. package/build/src/testing/test-suite-splitter.js +114 -142
  736. package/build/src/testing/test.js +216 -256
  737. package/build/src/utils/backtrace-cleaner-node.js +62 -69
  738. package/build/src/utils/backtrace-cleaner.js +188 -216
  739. package/build/src/utils/ensure-error.js +7 -7
  740. package/build/src/utils/event-emitter.js +4 -6
  741. package/build/src/utils/file-exists.js +9 -10
  742. package/build/src/utils/format-value.js +67 -76
  743. package/build/src/utils/model-scope.js +27 -31
  744. package/build/src/utils/nest-callbacks.js +10 -13
  745. package/build/src/utils/plain-object.js +5 -6
  746. package/build/src/utils/ransack.js +448 -563
  747. package/build/src/utils/rest-args-error.js +5 -6
  748. package/build/src/utils/singularize-model-name.js +9 -11
  749. package/build/src/utils/split-sql-statements.js +68 -79
  750. package/build/src/utils/to-import-specifier.js +24 -30
  751. package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
  752. package/build/src/utils/with-tracked-stack.js +14 -18
  753. package/build/src/velocious-error.js +27 -30
  754. package/build/templates/configuration.js +61 -0
  755. package/build/templates/generate-migration.js +11 -0
  756. package/build/templates/generate-model.js +6 -0
  757. package/build/templates/routes.js +11 -0
  758. package/build/testing/base-expect.js +17 -0
  759. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  760. package/build/testing/browser-test-app.js +32 -0
  761. package/build/testing/expect-to-change.js +55 -0
  762. package/build/testing/expect-utils.js +269 -0
  763. package/build/testing/expect.js +763 -0
  764. package/build/testing/request-client.js +90 -0
  765. package/build/testing/test-files-finder.js +364 -0
  766. package/build/testing/test-filter-parser.js +198 -0
  767. package/build/testing/test-runner.js +1168 -0
  768. package/build/testing/test-suite-splitter.js +177 -0
  769. package/build/testing/test.js +370 -0
  770. package/build/utils/backtrace-cleaner-node.js +87 -0
  771. package/build/utils/backtrace-cleaner.js +266 -0
  772. package/build/utils/ensure-error.js +15 -0
  773. package/build/utils/event-emitter.js +8 -0
  774. package/build/utils/file-exists.js +18 -0
  775. package/build/utils/format-value.js +101 -0
  776. package/build/utils/model-scope.js +56 -0
  777. package/build/utils/nest-callbacks.js +22 -0
  778. package/build/utils/plain-object.js +14 -0
  779. package/build/utils/ransack.js +859 -0
  780. package/build/utils/rest-args-error.js +14 -0
  781. package/build/utils/singularize-model-name.js +18 -0
  782. package/build/utils/split-sql-statements.js +88 -0
  783. package/build/utils/to-import-specifier.js +53 -0
  784. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  785. package/build/utils/with-tracked-stack.js +38 -0
  786. package/build/velocious-error.js +34 -0
  787. package/package.json +3 -3
  788. package/src/configuration-types.js +1 -1
  789. package/src/database/record/index.js +174 -25
  790. package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
  791. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
  792. package/src/frontend-model-resource/base-resource.js +6 -2
  793. package/src/frontend-models/resource-definition.js +3 -3
  794. package/src/frontend-models/websocket-publishers.js +6 -6
@@ -1,20 +1,15 @@
1
1
  // @ts-check
2
-
3
- import {randomUUID} from "node:crypto"
4
- import net from "node:net"
5
- import timeout from "awaitery/build/timeout.js"
6
-
7
- import JsonSocket from "../background-jobs/json-socket.js"
8
- import EventEmitter from "../utils/event-emitter.js"
9
-
10
- const DEFAULT_RECONNECT_DELAY_MS = 1000
11
- const MAX_RECONNECT_DELAY_MS = 30_000
12
-
2
+ import { randomUUID } from "node:crypto";
3
+ import net from "node:net";
4
+ import timeout from "awaitery/build/timeout.js";
5
+ import JsonSocket from "../background-jobs/json-socket.js";
6
+ import EventEmitter from "../utils/event-emitter.js";
7
+ const DEFAULT_RECONNECT_DELAY_MS = 1000;
8
+ const MAX_RECONNECT_DELAY_MS = 30_000;
13
9
  /**
14
10
  * BeaconBroadcastHandler type.
15
11
  * @typedef {function(import("./types.js").BeaconBroadcastMessage): void} BeaconBroadcastHandler
16
12
  */
17
-
18
13
  /**
19
14
  * BeaconClient connects to a `velocious beacon` daemon and exchanges
20
15
  * broadcasts with all peer processes connected to the same daemon.
@@ -34,297 +29,273 @@ const MAX_RECONNECT_DELAY_MS = 30_000
34
29
  * not replay missed publishes (Beacon is pubsub, not a queue).
35
30
  */
36
31
  export default class BeaconClient extends EventEmitter {
37
- /**
38
- * Runs constructor.
39
- * @param {object} args - Options.
40
- * @param {string} args.host - Beacon host.
41
- * @param {number} args.port - Beacon port.
42
- * @param {string} [args.peerType] - Optional human-readable peer label.
43
- * @param {string} [args.peerId] - Optional explicit peer id (defaults to a random UUID).
44
- * @param {number} [args.reconnectDelayMs] - Starting reconnect delay in ms.
45
- * @param {number} [args.maxReconnectDelayMs] - Maximum reconnect delay in ms.
46
- */
47
- constructor({host, port, peerType, peerId, reconnectDelayMs, maxReconnectDelayMs}) {
48
- super()
49
- this.host = host
50
- this.port = port
51
- this.peerType = peerType
52
- this.peerId = peerId || randomUUID()
53
- this._initialReconnectDelayMs = reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS
54
- this._maxReconnectDelayMs = maxReconnectDelayMs ?? MAX_RECONNECT_DELAY_MS
55
- this._reconnectDelayMs = this._initialReconnectDelayMs
56
32
  /**
57
- * Narrows the runtime value to the documented type.
58
- @type {JsonSocket | undefined} */
59
- this._jsonSocket = undefined
33
+ * Runs constructor.
34
+ * @param {object} args - Options.
35
+ * @param {string} args.host - Beacon host.
36
+ * @param {number} args.port - Beacon port.
37
+ * @param {string} [args.peerType] - Optional human-readable peer label.
38
+ * @param {string} [args.peerId] - Optional explicit peer id (defaults to a random UUID).
39
+ * @param {number} [args.reconnectDelayMs] - Starting reconnect delay in ms.
40
+ * @param {number} [args.maxReconnectDelayMs] - Maximum reconnect delay in ms.
41
+ */
42
+ constructor({ host, port, peerType, peerId, reconnectDelayMs, maxReconnectDelayMs }) {
43
+ super();
44
+ this.host = host;
45
+ this.port = port;
46
+ this.peerType = peerType;
47
+ this.peerId = peerId || randomUUID();
48
+ this._initialReconnectDelayMs = reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;
49
+ this._maxReconnectDelayMs = maxReconnectDelayMs ?? MAX_RECONNECT_DELAY_MS;
50
+ this._reconnectDelayMs = this._initialReconnectDelayMs;
51
+ /**
52
+ * Narrows the runtime value to the documented type.
53
+ @type {JsonSocket | undefined} */
54
+ this._jsonSocket = undefined;
55
+ /**
56
+ * Narrows the runtime value to the documented type.
57
+ @type {net.Socket | undefined} */
58
+ this._socket = undefined;
59
+ this._connected = false;
60
+ this._ready = false;
61
+ this._closed = false;
62
+ /**
63
+ * Narrows the runtime value to the documented type.
64
+ @type {NodeJS.Timeout | undefined} */
65
+ this._reconnectTimer = undefined;
66
+ /**
67
+ * Narrows the runtime value to the documented type.
68
+ @type {Promise<void> | undefined} */
69
+ this._connectPromise = undefined;
70
+ /**
71
+ * Last socket error observed while connected, surfaced as the disconnect reason.
72
+ * @type {Error | undefined}
73
+ */
74
+ this._lastSocketError = undefined;
75
+ }
60
76
  /**
61
- * Narrows the runtime value to the documented type.
62
- @type {net.Socket | undefined} */
63
- this._socket = undefined
64
- this._connected = false
65
- this._ready = false
66
- this._closed = false
77
+ * Runs get peer id.
78
+ * @returns {string} - The peer id sent on the hello handshake.
79
+ */
80
+ getPeerId() { return this.peerId; }
81
+ /**
82
+ * Runs is connected.
83
+ * @returns {boolean} - Whether the underlying socket is currently connected.
84
+ */
85
+ isConnected() { return this._connected; }
67
86
  /**
68
- * Narrows the runtime value to the documented type.
69
- @type {NodeJS.Timeout | undefined} */
70
- this._reconnectTimer = undefined
87
+ * Runs is ready.
88
+ * @returns {boolean} - Whether the daemon has acknowledged this peer registration.
89
+ */
90
+ isReady() { return this._ready; }
91
+ /**
92
+ * Resolves on the first successful connect. Subsequent calls return
93
+ * the same promise. Subsequent reconnects after a drop are silent —
94
+ * use `on("connect")` / `on("disconnect", reason)` to observe them.
95
+ * The `disconnect` listener receives an `Error` reason: either the
96
+ * underlying socket error, or `Error("Beacon broker disconnected")`
97
+ * when the close had no preceding error.
98
+ * @returns {Promise<void>}
99
+ */
100
+ async connect() {
101
+ if (this._closed)
102
+ throw new Error("BeaconClient has been closed");
103
+ if (this._connectPromise)
104
+ return await this._connectPromise;
105
+ this._connectPromise = new Promise((resolve, reject) => {
106
+ const onConnect = () => {
107
+ this.off("connect", onConnect);
108
+ this.off("connect-error", onError);
109
+ resolve();
110
+ };
111
+ const onError = (/**
112
+ * Narrows the runtime value to the documented type.
113
+ @type {Error} */ error) => {
114
+ this.off("connect", onConnect);
115
+ this.off("connect-error", onError);
116
+ reject(error);
117
+ };
118
+ this.on("connect", onConnect);
119
+ this.on("connect-error", onError);
120
+ });
121
+ this._openSocket();
122
+ return await this._connectPromise;
123
+ }
71
124
  /**
72
- * Narrows the runtime value to the documented type.
73
- @type {Promise<void> | undefined} */
74
- this._connectPromise = undefined
125
+ * Resolves after the Beacon daemon has acknowledged this peer's
126
+ * hello handshake. This is stronger than `isConnected()`: connected
127
+ * means the TCP socket is open, ready means the daemon has registered
128
+ * the peer and broadcasts can be routed through the bus.
129
+ * @param {object} [args] - Options.
130
+ * @param {number} [args.timeoutMs] - Optional timeout in milliseconds.
131
+ * @returns {Promise<void>}
132
+ */
133
+ async waitForReady({ timeoutMs } = {}) {
134
+ if (this._ready)
135
+ return;
136
+ /** Cleanup. @type {() => void} */
137
+ let cleanup = () => { };
138
+ const readyPromise = new Promise((resolve) => {
139
+ const onReady = () => {
140
+ cleanup();
141
+ resolve(undefined);
142
+ };
143
+ cleanup = () => this.off("ready", onReady);
144
+ this.on("ready", onReady);
145
+ });
146
+ try {
147
+ if (typeof timeoutMs === "number") {
148
+ await timeout({ timeout: timeoutMs }, async () => {
149
+ await readyPromise;
150
+ });
151
+ }
152
+ else {
153
+ await readyPromise;
154
+ }
155
+ }
156
+ finally {
157
+ cleanup();
158
+ }
159
+ }
75
160
  /**
76
- * Last socket error observed while connected, surfaced as the disconnect reason.
77
- * @type {Error | undefined}
161
+ * Publishes a broadcast message to all peers (including this one,
162
+ * unless the daemon is restarted mid-publish).
163
+ * @param {object} args - Broadcast args.
164
+ * @param {string} args.channel - Channel name.
165
+ * @param {Record<string, ?>} args.broadcastParams - Routing params.
166
+ * @param {?} args.body - Message body.
167
+ * @returns {boolean} - True if the publish was written to the socket. False if the client is currently disconnected.
78
168
  */
79
- this._lastSocketError = undefined
80
- }
81
-
82
- /**
83
- * Runs get peer id.
84
- * @returns {string} - The peer id sent on the hello handshake.
85
- */
86
- getPeerId() { return this.peerId }
87
-
88
- /**
89
- * Runs is connected.
90
- * @returns {boolean} - Whether the underlying socket is currently connected.
91
- */
92
- isConnected() { return this._connected }
93
-
94
- /**
95
- * Runs is ready.
96
- * @returns {boolean} - Whether the daemon has acknowledged this peer registration.
97
- */
98
- isReady() { return this._ready }
99
-
100
- /**
101
- * Resolves on the first successful connect. Subsequent calls return
102
- * the same promise. Subsequent reconnects after a drop are silent —
103
- * use `on("connect")` / `on("disconnect", reason)` to observe them.
104
- * The `disconnect` listener receives an `Error` reason: either the
105
- * underlying socket error, or `Error("Beacon broker disconnected")`
106
- * when the close had no preceding error.
107
- * @returns {Promise<void>}
108
- */
109
- async connect() {
110
- if (this._closed) throw new Error("BeaconClient has been closed")
111
- if (this._connectPromise) return await this._connectPromise
112
-
113
- this._connectPromise = new Promise((resolve, reject) => {
114
- const onConnect = () => {
115
- this.off("connect", onConnect)
116
- this.off("connect-error", onError)
117
- resolve()
118
- }
119
- const onError = (/**
120
- * Narrows the runtime value to the documented type.
121
- @type {Error} */ error) => {
122
- this.off("connect", onConnect)
123
- this.off("connect-error", onError)
124
- reject(error)
125
- }
126
-
127
- this.on("connect", onConnect)
128
- this.on("connect-error", onError)
129
- })
130
-
131
- this._openSocket()
132
-
133
- return await this._connectPromise
134
- }
135
-
136
- /**
137
- * Resolves after the Beacon daemon has acknowledged this peer's
138
- * hello handshake. This is stronger than `isConnected()`: connected
139
- * means the TCP socket is open, ready means the daemon has registered
140
- * the peer and broadcasts can be routed through the bus.
141
- * @param {object} [args] - Options.
142
- * @param {number} [args.timeoutMs] - Optional timeout in milliseconds.
143
- * @returns {Promise<void>}
144
- */
145
- async waitForReady({timeoutMs} = {}) {
146
- if (this._ready) return
147
-
148
- /** Cleanup. @type {() => void} */
149
- let cleanup = () => {}
150
- const readyPromise = new Promise((resolve) => {
151
- const onReady = () => {
152
- cleanup()
153
- resolve(undefined)
154
- }
155
-
156
- cleanup = () => this.off("ready", onReady)
157
- this.on("ready", onReady)
158
- })
159
-
160
- try {
161
- if (typeof timeoutMs === "number") {
162
- await timeout({timeout: timeoutMs}, async () => {
163
- await readyPromise
164
- })
165
- } else {
166
- await readyPromise
167
- }
168
- } finally {
169
- cleanup()
169
+ publish({ channel, broadcastParams, body }) {
170
+ if (!this._connected || !this._jsonSocket)
171
+ return false;
172
+ /**
173
+ * Message.
174
+ @type {import("./types.js").BeaconBroadcastMessage} */
175
+ const message = {
176
+ type: "broadcast",
177
+ channel,
178
+ broadcastParams,
179
+ body,
180
+ originPeerId: this.peerId
181
+ };
182
+ try {
183
+ this._jsonSocket.send(message);
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
170
189
  }
171
- }
172
-
173
- /**
174
- * Publishes a broadcast message to all peers (including this one,
175
- * unless the daemon is restarted mid-publish).
176
- * @param {object} args - Broadcast args.
177
- * @param {string} args.channel - Channel name.
178
- * @param {Record<string, ?>} args.broadcastParams - Routing params.
179
- * @param {?} args.body - Message body.
180
- * @returns {boolean} - True if the publish was written to the socket. False if the client is currently disconnected.
181
- */
182
- publish({channel, broadcastParams, body}) {
183
- if (!this._connected || !this._jsonSocket) return false
184
-
185
190
  /**
186
- * Message.
187
- @type {import("./types.js").BeaconBroadcastMessage} */
188
- const message = {
189
- type: "broadcast",
190
- channel,
191
- broadcastParams,
192
- body,
193
- originPeerId: this.peerId
191
+ * Registers a handler called once for every `broadcast` message
192
+ * received from the daemon (including echoes of this client's own
193
+ * publishes synapse-style fan-out).
194
+ * @param {BeaconBroadcastHandler} handler - Handler.
195
+ * @returns {() => void} - Unregister function.
196
+ */
197
+ onBroadcast(handler) {
198
+ this.on("broadcast", handler);
199
+ return () => this.off("broadcast", handler);
194
200
  }
195
-
196
- try {
197
- this._jsonSocket.send(message)
198
- return true
199
- } catch {
200
- return false
201
+ /**
202
+ * Runs close.
203
+ * @returns {Promise<void>} - Resolves once the socket is closed.
204
+ */
205
+ async close() {
206
+ this._closed = true;
207
+ if (this._reconnectTimer) {
208
+ clearTimeout(this._reconnectTimer);
209
+ this._reconnectTimer = undefined;
210
+ }
211
+ if (this._socket) {
212
+ const socket = this._socket;
213
+ await new Promise((resolve) => {
214
+ socket.once("close", () => resolve(undefined));
215
+ socket.end();
216
+ });
217
+ }
201
218
  }
202
- }
203
-
204
- /**
205
- * Registers a handler called once for every `broadcast` message
206
- * received from the daemon (including echoes of this client's own
207
- * publishes — synapse-style fan-out).
208
- * @param {BeaconBroadcastHandler} handler - Handler.
209
- * @returns {() => void} - Unregister function.
210
- */
211
- onBroadcast(handler) {
212
- this.on("broadcast", handler)
213
- return () => this.off("broadcast", handler)
214
- }
215
-
216
- /**
217
- * Runs close.
218
- * @returns {Promise<void>} - Resolves once the socket is closed.
219
- */
220
- async close() {
221
- this._closed = true
222
-
223
- if (this._reconnectTimer) {
224
- clearTimeout(this._reconnectTimer)
225
- this._reconnectTimer = undefined
219
+ /**
220
+ * Runs open socket.
221
+ * @returns {void}
222
+ */
223
+ _openSocket() {
224
+ if (this._closed)
225
+ return;
226
+ const socket = net.createConnection({ host: this.host, port: this.port });
227
+ this._socket = socket;
228
+ const jsonSocket = new JsonSocket(socket);
229
+ this._jsonSocket = jsonSocket;
230
+ socket.on("connect", () => {
231
+ this._connected = true;
232
+ this._ready = false;
233
+ this._reconnectDelayMs = this._initialReconnectDelayMs;
234
+ jsonSocket.send({
235
+ type: "hello",
236
+ role: "client",
237
+ peerId: this.peerId,
238
+ peerType: this.peerType
239
+ });
240
+ this.emit("connect");
241
+ });
242
+ jsonSocket.on("message", (/**
243
+ * Narrows the runtime value to the documented type.
244
+ @type {import("./types.js").BeaconSocketMessage} */ message) => {
245
+ if (message?.type === "hello-ack" && message.peerId === this.peerId) {
246
+ this._ready = true;
247
+ this.emit("ready");
248
+ }
249
+ else if (message?.type === "broadcast") {
250
+ this.emit("broadcast", message);
251
+ }
252
+ });
253
+ jsonSocket.on("error", (error) => {
254
+ if (!this._connected) {
255
+ // Initial connect failed — surface to `connect()`'s promise via `connect-error`.
256
+ // No `error` emit: that channel is for established-session errors; the
257
+ // initial-connect path is owned by `connect-error`.
258
+ this.emit("connect-error", error);
259
+ }
260
+ else {
261
+ // Established session error. Cache so the upcoming `close` event can
262
+ // surface it as the disconnect reason.
263
+ this._lastSocketError = error;
264
+ this.emit("error", error);
265
+ }
266
+ });
267
+ jsonSocket.on("close", () => {
268
+ const wasConnected = this._connected;
269
+ this._connected = false;
270
+ this._ready = false;
271
+ this._jsonSocket = undefined;
272
+ this._socket = undefined;
273
+ // Explicit close() sets `_closed = true` before ending the socket.
274
+ // Don't surface user-initiated teardown as a disconnect "error" —
275
+ // only network-driven drops should be reported.
276
+ if (wasConnected && !this._closed) {
277
+ const reason = this._lastSocketError || new Error("Beacon broker disconnected");
278
+ this.emit("disconnect", reason);
279
+ }
280
+ this._lastSocketError = undefined;
281
+ if (this._closed)
282
+ return;
283
+ this._scheduleReconnect();
284
+ });
226
285
  }
227
-
228
- if (this._socket) {
229
- const socket = this._socket
230
-
231
- await new Promise((resolve) => {
232
- socket.once("close", () => resolve(undefined))
233
- socket.end()
234
- })
286
+ /**
287
+ * Runs schedule reconnect.
288
+ * @returns {void}
289
+ */
290
+ _scheduleReconnect() {
291
+ if (this._reconnectTimer)
292
+ return;
293
+ const delay = this._reconnectDelayMs;
294
+ this._reconnectTimer = setTimeout(() => {
295
+ this._reconnectTimer = undefined;
296
+ this._reconnectDelayMs = Math.min(delay * 2, this._maxReconnectDelayMs);
297
+ this._openSocket();
298
+ }, delay);
235
299
  }
236
- }
237
-
238
- /**
239
- * Runs open socket.
240
- * @returns {void}
241
- */
242
- _openSocket() {
243
- if (this._closed) return
244
-
245
- const socket = net.createConnection({host: this.host, port: this.port})
246
- this._socket = socket
247
- const jsonSocket = new JsonSocket(socket)
248
- this._jsonSocket = jsonSocket
249
-
250
- socket.on("connect", () => {
251
- this._connected = true
252
- this._ready = false
253
- this._reconnectDelayMs = this._initialReconnectDelayMs
254
-
255
- jsonSocket.send({
256
- type: "hello",
257
- role: "client",
258
- peerId: this.peerId,
259
- peerType: this.peerType
260
- })
261
-
262
- this.emit("connect")
263
- })
264
-
265
- jsonSocket.on("message", (/**
266
- * Narrows the runtime value to the documented type.
267
- @type {import("./types.js").BeaconSocketMessage} */ message) => {
268
- if (message?.type === "hello-ack" && message.peerId === this.peerId) {
269
- this._ready = true
270
- this.emit("ready")
271
- } else if (message?.type === "broadcast") {
272
- this.emit("broadcast", message)
273
- }
274
- })
275
-
276
- jsonSocket.on("error", (error) => {
277
- if (!this._connected) {
278
- // Initial connect failed — surface to `connect()`'s promise via `connect-error`.
279
- // No `error` emit: that channel is for established-session errors; the
280
- // initial-connect path is owned by `connect-error`.
281
- this.emit("connect-error", error)
282
- } else {
283
- // Established session error. Cache so the upcoming `close` event can
284
- // surface it as the disconnect reason.
285
- this._lastSocketError = error
286
- this.emit("error", error)
287
- }
288
- })
289
-
290
- jsonSocket.on("close", () => {
291
- const wasConnected = this._connected
292
-
293
- this._connected = false
294
- this._ready = false
295
- this._jsonSocket = undefined
296
- this._socket = undefined
297
-
298
- // Explicit close() sets `_closed = true` before ending the socket.
299
- // Don't surface user-initiated teardown as a disconnect "error" —
300
- // only network-driven drops should be reported.
301
- if (wasConnected && !this._closed) {
302
- const reason = this._lastSocketError || new Error("Beacon broker disconnected")
303
-
304
- this.emit("disconnect", reason)
305
- }
306
-
307
- this._lastSocketError = undefined
308
-
309
- if (this._closed) return
310
-
311
- this._scheduleReconnect()
312
- })
313
- }
314
-
315
- /**
316
- * Runs schedule reconnect.
317
- * @returns {void}
318
- */
319
- _scheduleReconnect() {
320
- if (this._reconnectTimer) return
321
-
322
- const delay = this._reconnectDelayMs
323
-
324
- this._reconnectTimer = setTimeout(() => {
325
- this._reconnectTimer = undefined
326
- this._reconnectDelayMs = Math.min(delay * 2, this._maxReconnectDelayMs)
327
- this._openSocket()
328
- }, delay)
329
- }
330
300
  }
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JlYWNvbi9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdEMsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFBO0FBQzFCLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBRS9DLE9BQU8sVUFBVSxNQUFNLG1DQUFtQyxDQUFBO0FBQzFELE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBRXBELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFBO0FBQ3ZDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFBO0FBRXJDOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLFlBQVk7SUFDcEQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBQztRQUMvRSxLQUFLLEVBQUUsQ0FBQTtRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFBO1FBQ3BDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxnQkFBZ0IsSUFBSSwwQkFBMEIsQ0FBQTtRQUM5RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLElBQUksc0JBQXNCLENBQUE7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQTtRQUN0RDs7MkNBRW1DO1FBQ25DLElBQUksQ0FB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SUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7WUFDdkUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ3BCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNYLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5cbmltcG9ydCBKc29uU29ja2V0IGZyb20gXCIuLi9iYWNrZ3JvdW5kLWpvYnMvanNvbi1zb2NrZXQuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZX01TID0gMTAwMFxuY29uc3QgTUFYX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDMwXzAwMFxuXG4vKipcbiAqIEJlYWNvbkJyb2FkY2FzdEhhbmRsZXIgdHlwZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJlYWNvbkJyb2FkY2FzdE1lc3NhZ2UpOiB2b2lkfSBCZWFjb25Ccm9hZGNhc3RIYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBCZWFjb25DbGllbnQgY29ubmVjdHMgdG8gYSBgdmVsb2Npb3VzIGJlYWNvbmAgZGFlbW9uIGFuZCBleGNoYW5nZXNcbiAqIGJyb2FkY2FzdHMgd2l0aCBhbGwgcGVlciBwcm9jZXNzZXMgY29ubmVjdGVkIHRvIHRoZSBzYW1lIGRhZW1vbi5cbiAqXG4gKiBMaWZlY3ljbGU6XG4gKiAgIGNvbnN0IGNsaWVudCA9IG5ldyBCZWFjb25DbGllbnQoe2hvc3QsIHBvcnQsIHBlZXJUeXBlOiBcInNlcnZlclwifSlcbiAqICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlcyBvbiBmaXJzdCBzdWNjZXNzZnVsIGNvbm5lY3RcbiAqICAgYXdhaXQgY2xpZW50LndhaXRGb3JSZWFkeSh7dGltZW91dE1zOiAxMDAwfSkgICAvLyByZXNvbHZlcyBhZnRlciB0aGUgZGFlbW9uIGhlbGxvLWFja1xuICogICBjbGllbnQub25Ccm9hZGNhc3QoKG1lc3NhZ2UpID0+IHsgLi4uIH0pICAgICAgIC8vIGV2ZXJ5IGZhbi1vdXRcbiAqICAgY2xpZW50LnB1Ymxpc2goe2NoYW5uZWwsIGJyb2FkY2FzdFBhcmFtcywgYm9keX0pXG4gKiAgIGF3YWl0IGNsaWVudC5jbG9zZSgpXG4gKlxuICogUmVjb25uZWN0OiBvbiBzb2NrZXQgY2xvc2UgKHdpdGhvdXQgYW4gZXhwbGljaXQgYGNsb3NlKClgIGNhbGwpIHRoZVxuICogY2xpZW50IHNjaGVkdWxlcyBhIHJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuIFdoaWxlIHRoZVxuICogdW5kZXJseWluZyBzb2NrZXQgaXMgZG93biwgYHB1Ymxpc2goLi4uKWAgcmV0dXJucyBmYWxzZSBhbmQgdGhlXG4gKiBjYWxsZXIgY2FuIGZhbGwgYmFjayB0byBsb2NhbC1vbmx5IGRlbGl2ZXJ5OyBzdWJzZXF1ZW50IHJlY29ubmVjdHMgZG9cbiAqIG5vdCByZXBsYXkgbWlzc2VkIHB1Ymxpc2hlcyAoQmVhY29uIGlzIHB1YnN1Yiwgbm90IGEgcXVldWUpLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWFjb25DbGllbnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5ob3N0IC0gQmVhY29uIGhvc3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnBvcnQgLSBCZWFjb24gcG9ydC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnBlZXJUeXBlXSAtIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIHBlZXIgbGFiZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5wZWVySWRdIC0gT3B0aW9uYWwgZXhwbGljaXQgcGVlciBpZCAoZGVmYXVsdHMgdG8gYSByYW5kb20gVVVJRCkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZWNvbm5lY3REZWxheU1zXSAtIFN0YXJ0aW5nIHJlY29ubmVjdCBkZWxheSBpbiBtcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heFJlY29ubmVjdERlbGF5TXNdIC0gTWF4aW11bSByZWNvbm5lY3QgZGVsYXkgaW4gbXMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7aG9zdCwgcG9ydCwgcGVlclR5cGUsIHBlZXJJZCwgcmVjb25uZWN0RGVsYXlNcywgbWF4UmVjb25uZWN0RGVsYXlNc30pIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5ob3N0ID0gaG9zdFxuICAgIHRoaXMucG9ydCA9IHBvcnRcbiAgICB0aGlzLnBlZXJUeXBlID0gcGVlclR5cGVcbiAgICB0aGlzLnBlZXJJZCA9IHBlZXJJZCB8fCByYW5kb21VVUlEKClcbiAgICB0aGlzLl9pbml0aWFsUmVjb25uZWN0RGVsYXlNcyA9IHJlY29ubmVjdERlbGF5TXMgPz8gREVGQVVMVF9SRUNPTk5FQ1RfREVMQVlfTVNcbiAgICB0aGlzLl9tYXhSZWNvbm5lY3REZWxheU1zID0gbWF4UmVjb25uZWN0RGVsYXlNcyA/PyBNQVhfUkVDT05ORUNUX0RFTEFZX01TXG4gICAgdGhpcy5fcmVjb25uZWN0RGVsYXlNcyA9IHRoaXMuX2luaXRpYWxSZWNvbm5lY3REZWxheU1zXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge0pzb25Tb2NrZXQgfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fanNvblNvY2tldCA9IHVuZGVmaW5lZFxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgIEB0eXBlIHtuZXQuU29ja2V0IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX3NvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX2Nsb3NlZCA9IGZhbHNlXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge05vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX3JlY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgQHR5cGUge1Byb21pc2U8dm9pZD4gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvKipcbiAgICAgKiBMYXN0IHNvY2tldCBlcnJvciBvYnNlcnZlZCB3aGlsZSBjb25uZWN0ZWQsIHN1cmZhY2VkIGFzIHRoZSBkaXNjb25uZWN0IHJlYXNvbi5cbiAgICAgKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5fbGFzdFNvY2tldEVycm9yID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcGVlciBpZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcGVlciBpZCBzZW50IG9uIHRoZSBoZWxsbyBoYW5kc2hha2UuXG4gICAqL1xuICBnZXRQZWVySWQoKSB7IHJldHVybiB0aGlzLnBlZXJJZCB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgY29ubmVjdGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpcyBjdXJyZW50bHkgY29ubmVjdGVkLlxuICAgKi9cbiAgaXNDb25uZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9jb25uZWN0ZWQgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIHJlYWR5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBkYWVtb24gaGFzIGFja25vd2xlZGdlZCB0aGlzIHBlZXIgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgaXNSZWFkeSgpIHsgcmV0dXJuIHRoaXMuX3JlYWR5IH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb24gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgY29ubmVjdC4gU3Vic2VxdWVudCBjYWxscyByZXR1cm5cbiAgICogdGhlIHNhbWUgcHJvbWlzZS4gU3Vic2VxdWVudCByZWNvbm5lY3RzIGFmdGVyIGEgZHJvcCBhcmUgc2lsZW50IOKAlFxuICAgKiB1c2UgYG9uKFwiY29ubmVjdFwiKWAgLyBgb24oXCJkaXNjb25uZWN0XCIsIHJlYXNvbilgIHRvIG9ic2VydmUgdGhlbS5cbiAgICogVGhlIGBkaXNjb25uZWN0YCBsaXN0ZW5lciByZWNlaXZlcyBhbiBgRXJyb3JgIHJlYXNvbjogZWl0aGVyIHRoZVxuICAgKiB1bmRlcmx5aW5nIHNvY2tldCBlcnJvciwgb3IgYEVycm9yKFwiQmVhY29uIGJyb2tlciBkaXNjb25uZWN0ZWRcIilgXG4gICAqIHdoZW4gdGhlIGNsb3NlIGhhZCBubyBwcmVjZWRpbmcgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJCZWFjb25DbGllbnQgaGFzIGJlZW4gY2xvc2VkXCIpXG4gICAgaWYgKHRoaXMuX2Nvbm5lY3RQcm9taXNlKSByZXR1cm4gYXdhaXQgdGhpcy5fY29ubmVjdFByb21pc2VcblxuICAgIHRoaXMuX2Nvbm5lY3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb25Db25uZWN0ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9mZihcImNvbm5lY3RcIiwgb25Db25uZWN0KVxuICAgICAgICB0aGlzLm9mZihcImNvbm5lY3QtZXJyb3JcIiwgb25FcnJvcilcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm9mZihcImNvbm5lY3RcIiwgb25Db25uZWN0KVxuICAgICAgICB0aGlzLm9mZihcImNvbm5lY3QtZXJyb3JcIiwgb25FcnJvcilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLm9uKFwiY29ubmVjdFwiLCBvbkNvbm5lY3QpXG4gICAgICB0aGlzLm9uKFwiY29ubmVjdC1lcnJvclwiLCBvbkVycm9yKVxuICAgIH0pXG5cbiAgICB0aGlzLl9vcGVuU29ja2V0KClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25uZWN0UHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFmdGVyIHRoZSBCZWFjb24gZGFlbW9uIGhhcyBhY2tub3dsZWRnZWQgdGhpcyBwZWVyJ3NcbiAgICogaGVsbG8gaGFuZHNoYWtlLiBUaGlzIGlzIHN0cm9uZ2VyIHRoYW4gYGlzQ29ubmVjdGVkKClgOiBjb25uZWN0ZWRcbiAgICogbWVhbnMgdGhlIFRDUCBzb2NrZXQgaXMgb3BlbiwgcmVhZHkgbWVhbnMgdGhlIGRhZW1vbiBoYXMgcmVnaXN0ZXJlZFxuICAgKiB0aGUgcGVlciBhbmQgYnJvYWRjYXN0cyBjYW4gYmUgcm91dGVkIHRocm91Z2ggdGhlIGJ1cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy50aW1lb3V0TXNdIC0gT3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclJlYWR5KHt0aW1lb3V0TXN9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fcmVhZHkpIHJldHVyblxuXG4gICAgLyoqIENsZWFudXAuIEB0eXBlIHsoKSA9PiB2b2lkfSAqL1xuICAgIGxldCBjbGVhbnVwID0gKCkgPT4ge31cbiAgICBjb25zdCByZWFkeVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb25SZWFkeSA9ICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfVxuXG4gICAgICBjbGVhbnVwID0gKCkgPT4gdGhpcy5vZmYoXCJyZWFkeVwiLCBvblJlYWR5KVxuICAgICAgdGhpcy5vbihcInJlYWR5XCIsIG9uUmVhZHkpXG4gICAgfSlcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXN9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcmVhZHlQcm9taXNlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCByZWFkeVByb21pc2VcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYW51cCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJyb2FkY2FzdCBtZXNzYWdlIHRvIGFsbCBwZWVycyAoaW5jbHVkaW5nIHRoaXMgb25lLFxuICAgKiB1bmxlc3MgdGhlIGRhZW1vbiBpcyByZXN0YXJ0ZWQgbWlkLXB1Ymxpc2gpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEJyb2FkY2FzdCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLmJyb2FkY2FzdFBhcmFtcyAtIFJvdXRpbmcgcGFyYW1zLlxuICAgKiBAcGFyYW0gez99IGFyZ3MuYm9keSAtIE1lc3NhZ2UgYm9keS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0aGUgcHVibGlzaCB3YXMgd3JpdHRlbiB0byB0aGUgc29ja2V0LiBGYWxzZSBpZiB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQuXG4gICAqL1xuICBwdWJsaXNoKHtjaGFubmVsLCBicm9hZGNhc3RQYXJhbXMsIGJvZHl9KSB7XG4gICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQgfHwgIXRoaXMuX2pzb25Tb2NrZXQpIHJldHVybiBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZS5cbiAgICAgIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJlYWNvbkJyb2FkY2FzdE1lc3NhZ2V9ICovXG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6IFwiYnJvYWRjYXN0XCIsXG4gICAgICBjaGFubmVsLFxuICAgICAgYnJvYWRjYXN0UGFyYW1zLFxuICAgICAgYm9keSxcbiAgICAgIG9yaWdpblBlZXJJZDogdGhpcy5wZWVySWRcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fanNvblNvY2tldC5zZW5kKG1lc3NhZ2UpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IGBicm9hZGNhc3RgIG1lc3NhZ2VcbiAgICogcmVjZWl2ZWQgZnJvbSB0aGUgZGFlbW9uIChpbmNsdWRpbmcgZWNob2VzIG9mIHRoaXMgY2xpZW50J3Mgb3duXG4gICAqIHB1Ymxpc2hlcyDigJQgc3luYXBzZS1zdHlsZSBmYW4tb3V0KS5cbiAgICogQHBhcmFtIHtCZWFjb25Ccm9hZGNhc3RIYW5kbGVyfSBoYW5kbGVyIC0gSGFuZGxlci5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IC0gVW5yZWdpc3RlciBmdW5jdGlvbi5cbiAgICovXG4gIG9uQnJvYWRjYXN0KGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uKFwiYnJvYWRjYXN0XCIsIGhhbmRsZXIpXG4gICAgcmV0dXJuICgpID0+IHRoaXMub2ZmKFwiYnJvYWRjYXN0XCIsIGhhbmRsZXIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjbG9zZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgb25jZSB0aGUgc29ja2V0IGlzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIHRoaXMuX2Nsb3NlZCA9IHRydWVcblxuICAgIGlmICh0aGlzLl9yZWNvbm5lY3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JlY29ubmVjdFRpbWVyKVxuICAgICAgdGhpcy5fcmVjb25uZWN0VGltZXIgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLl9zb2NrZXRcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICAgIHNvY2tldC5lbmQoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBvcGVuIHNvY2tldC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfb3BlblNvY2tldCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm5cblxuICAgIGNvbnN0IHNvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHtob3N0OiB0aGlzLmhvc3QsIHBvcnQ6IHRoaXMucG9ydH0pXG4gICAgdGhpcy5fc29ja2V0ID0gc29ja2V0XG4gICAgY29uc3QganNvblNvY2tldCA9IG5ldyBKc29uU29ja2V0KHNvY2tldClcbiAgICB0aGlzLl9qc29uU29ja2V0ID0ganNvblNvY2tldFxuXG4gICAgc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlXG4gICAgICB0aGlzLl9yZWFkeSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWNvbm5lY3REZWxheU1zID0gdGhpcy5faW5pdGlhbFJlY29ubmVjdERlbGF5TXNcblxuICAgICAganNvblNvY2tldC5zZW5kKHtcbiAgICAgICAgdHlwZTogXCJoZWxsb1wiLFxuICAgICAgICByb2xlOiBcImNsaWVudFwiLFxuICAgICAgICBwZWVySWQ6IHRoaXMucGVlcklkLFxuICAgICAgICBwZWVyVHlwZTogdGhpcy5wZWVyVHlwZVxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbWl0KFwiY29ubmVjdFwiKVxuICAgIH0pXG5cbiAgICBqc29uU29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJlYWNvblNvY2tldE1lc3NhZ2V9ICovIG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcImhlbGxvLWFja1wiICYmIG1lc3NhZ2UucGVlcklkID09PSB0aGlzLnBlZXJJZCkge1xuICAgICAgICB0aGlzLl9yZWFkeSA9IHRydWVcbiAgICAgICAgdGhpcy5lbWl0KFwicmVhZHlcIilcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJicm9hZGNhc3RcIikge1xuICAgICAgICB0aGlzLmVtaXQoXCJicm9hZGNhc3RcIiwgbWVzc2FnZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgLy8gSW5pdGlhbCBjb25uZWN0IGZhaWxlZCDigJQgc3VyZmFjZSB0byBgY29ubmVjdCgpYCdzIHByb21pc2UgdmlhIGBjb25uZWN0LWVycm9yYC5cbiAgICAgICAgLy8gTm8gYGVycm9yYCBlbWl0OiB0aGF0IGNoYW5uZWwgaXMgZm9yIGVzdGFibGlzaGVkLXNlc3Npb24gZXJyb3JzOyB0aGVcbiAgICAgICAgLy8gaW5pdGlhbC1jb25uZWN0IHBhdGggaXMgb3duZWQgYnkgYGNvbm5lY3QtZXJyb3JgLlxuICAgICAgICB0aGlzLmVtaXQoXCJjb25uZWN0LWVycm9yXCIsIGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXN0YWJsaXNoZWQgc2Vzc2lvbiBlcnJvci4gQ2FjaGUgc28gdGhlIHVwY29taW5nIGBjbG9zZWAgZXZlbnQgY2FuXG4gICAgICAgIC8vIHN1cmZhY2UgaXQgYXMgdGhlIGRpc2Nvbm5lY3QgcmVhc29uLlxuICAgICAgICB0aGlzLl9sYXN0U29ja2V0RXJyb3IgPSBlcnJvclxuICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9KVxuXG4gICAganNvblNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHdhc0Nvbm5lY3RlZCA9IHRoaXMuX2Nvbm5lY3RlZFxuXG4gICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5fcmVhZHkgPSBmYWxzZVxuICAgICAgdGhpcy5fanNvblNvY2tldCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5fc29ja2V0ID0gdW5kZWZpbmVkXG5cbiAgICAgIC8vIEV4cGxpY2l0IGNsb3NlKCkgc2V0cyBgX2Nsb3NlZCA9IHRydWVgIGJlZm9yZSBlbmRpbmcgdGhlIHNvY2tldC5cbiAgICAgIC8vIERvbid0IHN1cmZhY2UgdXNlci1pbml0aWF0ZWQgdGVhcmRvd24gYXMgYSBkaXNjb25uZWN0IFwiZXJyb3JcIiDigJRcbiAgICAgIC8vIG9ubHkgbmV0d29yay1kcml2ZW4gZHJvcHMgc2hvdWxkIGJlIHJlcG9ydGVkLlxuICAgICAgaWYgKHdhc0Nvbm5lY3RlZCAmJiAhdGhpcy5fY2xvc2VkKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuX2xhc3RTb2NrZXRFcnJvciB8fCBuZXcgRXJyb3IoXCJCZWFjb24gYnJva2VyIGRpc2Nvbm5lY3RlZFwiKVxuXG4gICAgICAgIHRoaXMuZW1pdChcImRpc2Nvbm5lY3RcIiwgcmVhc29uKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9sYXN0U29ja2V0RXJyb3IgPSB1bmRlZmluZWRcblxuICAgICAgaWYgKHRoaXMuX2Nsb3NlZCkgcmV0dXJuXG5cbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVjb25uZWN0KClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2NoZWR1bGUgcmVjb25uZWN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zY2hlZHVsZVJlY29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5fcmVjb25uZWN0VGltZXIpIHJldHVyblxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLl9yZWNvbm5lY3REZWxheU1zXG5cbiAgICB0aGlzLl9yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVjb25uZWN0VGltZXIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuX3JlY29ubmVjdERlbGF5TXMgPSBNYXRoLm1pbihkZWxheSAqIDIsIHRoaXMuX21heFJlY29ubmVjdERlbGF5TXMpXG4gICAgICB0aGlzLl9vcGVuU29ja2V0KClcbiAgICB9LCBkZWxheSlcbiAgfVxufVxuIl19