velocious 1.0.428 → 1.0.430

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 (933) hide show
  1. package/README.md +2 -0
  2. package/build/src/application.d.ts +96 -9
  3. package/build/src/application.d.ts.map +1 -1
  4. package/build/src/application.js +127 -28
  5. package/build/src/authorization/ability.d.ts +72 -31
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +59 -22
  8. package/build/src/authorization/base-resource.d.ts +47 -20
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +43 -14
  11. package/build/src/background-jobs/client.d.ts +4 -2
  12. package/build/src/background-jobs/client.d.ts.map +1 -1
  13. package/build/src/background-jobs/client.js +4 -2
  14. package/build/src/background-jobs/cron-expression.d.ts +9 -5
  15. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  16. package/build/src/background-jobs/cron-expression.js +16 -6
  17. package/build/src/background-jobs/forked-runner-child.js +12 -5
  18. package/build/src/background-jobs/job-registry.d.ts +7 -1
  19. package/build/src/background-jobs/job-registry.d.ts.map +1 -1
  20. package/build/src/background-jobs/job-registry.js +8 -2
  21. package/build/src/background-jobs/job-runner.d.ts +1 -0
  22. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  23. package/build/src/background-jobs/job-runner.js +8 -3
  24. package/build/src/background-jobs/job.d.ts +12 -8
  25. package/build/src/background-jobs/job.d.ts.map +1 -1
  26. package/build/src/background-jobs/job.js +12 -6
  27. package/build/src/background-jobs/json-socket.d.ts +17 -5
  28. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  29. package/build/src/background-jobs/json-socket.js +18 -6
  30. package/build/src/background-jobs/main.d.ts +118 -32
  31. package/build/src/background-jobs/main.d.ts.map +1 -1
  32. package/build/src/background-jobs/main.js +123 -35
  33. package/build/src/background-jobs/normalize-error.d.ts +2 -1
  34. package/build/src/background-jobs/normalize-error.d.ts.map +1 -1
  35. package/build/src/background-jobs/normalize-error.js +5 -3
  36. package/build/src/background-jobs/scheduler.d.ts +31 -10
  37. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  38. package/build/src/background-jobs/scheduler.js +33 -11
  39. package/build/src/background-jobs/socket-request.d.ts +2 -0
  40. package/build/src/background-jobs/socket-request.d.ts.map +1 -1
  41. package/build/src/background-jobs/socket-request.js +11 -3
  42. package/build/src/background-jobs/status-reporter.d.ts +5 -2
  43. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  44. package/build/src/background-jobs/status-reporter.js +6 -3
  45. package/build/src/background-jobs/store.d.ts +57 -19
  46. package/build/src/background-jobs/store.d.ts.map +1 -1
  47. package/build/src/background-jobs/store.js +70 -20
  48. package/build/src/background-jobs/types.d.ts +7 -7
  49. package/build/src/background-jobs/types.d.ts.map +1 -1
  50. package/build/src/background-jobs/types.js +6 -6
  51. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  52. package/build/src/background-jobs/web/authorization.js +3 -1
  53. package/build/src/background-jobs/web/controller.d.ts +40 -14
  54. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  55. package/build/src/background-jobs/web/controller.js +46 -15
  56. package/build/src/background-jobs/web/registry.d.ts +5 -0
  57. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  58. package/build/src/background-jobs/web/registry.js +4 -1
  59. package/build/src/background-jobs/worker.d.ts +41 -8
  60. package/build/src/background-jobs/worker.d.ts.map +1 -1
  61. package/build/src/background-jobs/worker.js +64 -16
  62. package/build/src/beacon/client.d.ts +39 -12
  63. package/build/src/beacon/client.d.ts.map +1 -1
  64. package/build/src/beacon/client.js +45 -15
  65. package/build/src/beacon/in-process-broker.d.ts +4 -0
  66. package/build/src/beacon/in-process-broker.d.ts.map +1 -1
  67. package/build/src/beacon/in-process-broker.js +8 -3
  68. package/build/src/beacon/in-process-client.d.ts +28 -9
  69. package/build/src/beacon/in-process-client.d.ts.map +1 -1
  70. package/build/src/beacon/in-process-client.js +27 -9
  71. package/build/src/beacon/server.d.ts +13 -2
  72. package/build/src/beacon/server.d.ts.map +1 -1
  73. package/build/src/beacon/server.js +21 -5
  74. package/build/src/beacon/types.d.ts +3 -3
  75. package/build/src/beacon/types.d.ts.map +1 -1
  76. package/build/src/beacon/types.js +2 -2
  77. package/build/src/cli/base-command.d.ts +18 -4
  78. package/build/src/cli/base-command.d.ts.map +1 -1
  79. package/build/src/cli/base-command.js +15 -4
  80. package/build/src/cli/browser-cli.d.ts +3 -0
  81. package/build/src/cli/browser-cli.d.ts.map +1 -1
  82. package/build/src/cli/browser-cli.js +7 -2
  83. package/build/src/cli/commands/background-jobs-main.d.ts +0 -1
  84. package/build/src/cli/commands/background-jobs-main.d.ts.map +1 -1
  85. package/build/src/cli/commands/background-jobs-runner.d.ts +0 -1
  86. package/build/src/cli/commands/background-jobs-runner.d.ts.map +1 -1
  87. package/build/src/cli/commands/background-jobs-worker.d.ts +0 -1
  88. package/build/src/cli/commands/background-jobs-worker.d.ts.map +1 -1
  89. package/build/src/cli/commands/beacon.d.ts +0 -1
  90. package/build/src/cli/commands/beacon.d.ts.map +1 -1
  91. package/build/src/cli/commands/console.d.ts +0 -2
  92. package/build/src/cli/commands/console.d.ts.map +1 -1
  93. package/build/src/cli/commands/console.js +5 -2
  94. package/build/src/cli/commands/db/base-command.d.ts +11 -2
  95. package/build/src/cli/commands/db/base-command.d.ts.map +1 -1
  96. package/build/src/cli/commands/db/base-command.js +12 -3
  97. package/build/src/cli/commands/db/create.d.ts +3 -0
  98. package/build/src/cli/commands/db/create.d.ts.map +1 -1
  99. package/build/src/cli/commands/db/create.js +4 -1
  100. package/build/src/cli/commands/db/drop.d.ts +3 -0
  101. package/build/src/cli/commands/db/drop.d.ts.map +1 -1
  102. package/build/src/cli/commands/db/drop.js +4 -1
  103. package/build/src/cli/commands/db/schema/dump.d.ts +0 -2
  104. package/build/src/cli/commands/db/schema/dump.d.ts.map +1 -1
  105. package/build/src/cli/commands/db/schema/dump.js +5 -2
  106. package/build/src/cli/commands/db/schema/load.d.ts +0 -2
  107. package/build/src/cli/commands/db/schema/load.d.ts.map +1 -1
  108. package/build/src/cli/commands/db/schema/load.js +5 -2
  109. package/build/src/cli/commands/db/seed.d.ts +0 -2
  110. package/build/src/cli/commands/db/seed.d.ts.map +1 -1
  111. package/build/src/cli/commands/db/seed.js +5 -2
  112. package/build/src/cli/commands/db/tenants/check.d.ts +4 -1
  113. package/build/src/cli/commands/db/tenants/check.d.ts.map +1 -1
  114. package/build/src/cli/commands/db/tenants/check.js +5 -2
  115. package/build/src/cli/commands/db/tenants/create.d.ts +4 -1
  116. package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
  117. package/build/src/cli/commands/db/tenants/create.js +5 -2
  118. package/build/src/cli/commands/db/tenants/migrate.d.ts +4 -1
  119. package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
  120. package/build/src/cli/commands/db/tenants/migrate.js +5 -2
  121. package/build/src/cli/commands/destroy/migration.d.ts +0 -1
  122. package/build/src/cli/commands/destroy/migration.d.ts.map +1 -1
  123. package/build/src/cli/commands/generate/base-models.d.ts +0 -1
  124. package/build/src/cli/commands/generate/base-models.d.ts.map +1 -1
  125. package/build/src/cli/commands/generate/frontend-models.d.ts +0 -2
  126. package/build/src/cli/commands/generate/frontend-models.d.ts.map +1 -1
  127. package/build/src/cli/commands/generate/frontend-models.js +5 -2
  128. package/build/src/cli/commands/generate/migration.d.ts +0 -1
  129. package/build/src/cli/commands/generate/migration.d.ts.map +1 -1
  130. package/build/src/cli/commands/generate/model.d.ts +0 -1
  131. package/build/src/cli/commands/generate/model.d.ts.map +1 -1
  132. package/build/src/cli/commands/init.d.ts +0 -1
  133. package/build/src/cli/commands/init.d.ts.map +1 -1
  134. package/build/src/cli/commands/routes.d.ts +0 -1
  135. package/build/src/cli/commands/routes.d.ts.map +1 -1
  136. package/build/src/cli/commands/run-script.d.ts +0 -2
  137. package/build/src/cli/commands/run-script.d.ts.map +1 -1
  138. package/build/src/cli/commands/run-script.js +5 -2
  139. package/build/src/cli/commands/runner.d.ts +0 -2
  140. package/build/src/cli/commands/runner.d.ts.map +1 -1
  141. package/build/src/cli/commands/runner.js +5 -2
  142. package/build/src/cli/commands/server.d.ts +0 -1
  143. package/build/src/cli/commands/server.d.ts.map +1 -1
  144. package/build/src/cli/commands/test.d.ts +0 -1
  145. package/build/src/cli/commands/test.d.ts.map +1 -1
  146. package/build/src/cli/index.d.ts +18 -5
  147. package/build/src/cli/index.d.ts.map +1 -1
  148. package/build/src/cli/index.js +25 -8
  149. package/build/src/cli/tenant-database-command-helper.d.ts +24 -9
  150. package/build/src/cli/tenant-database-command-helper.d.ts.map +1 -1
  151. package/build/src/cli/tenant-database-command-helper.js +30 -11
  152. package/build/src/cli/use-browser-cli.d.ts +1 -0
  153. package/build/src/cli/use-browser-cli.d.ts.map +1 -1
  154. package/build/src/cli/use-browser-cli.js +5 -2
  155. package/build/src/configuration-resolver.d.ts +1 -0
  156. package/build/src/configuration-resolver.d.ts.map +1 -1
  157. package/build/src/configuration-resolver.js +2 -1
  158. package/build/src/configuration-types.d.ts +44 -44
  159. package/build/src/configuration-types.d.ts.map +1 -1
  160. package/build/src/configuration-types.js +27 -27
  161. package/build/src/configuration.d.ts +350 -114
  162. package/build/src/configuration.d.ts.map +1 -1
  163. package/build/src/configuration.js +416 -128
  164. package/build/src/controller.d.ts +67 -18
  165. package/build/src/controller.d.ts.map +1 -1
  166. package/build/src/controller.js +88 -23
  167. package/build/src/current-configuration.d.ts +2 -0
  168. package/build/src/current-configuration.d.ts.map +1 -1
  169. package/build/src/current-configuration.js +6 -2
  170. package/build/src/current.d.ts +16 -9
  171. package/build/src/current.d.ts.map +1 -1
  172. package/build/src/current.js +15 -8
  173. package/build/src/database/annotations-async-hooks.js +13 -6
  174. package/build/src/database/annotations.d.ts +7 -1
  175. package/build/src/database/annotations.d.ts.map +1 -1
  176. package/build/src/database/annotations.js +12 -5
  177. package/build/src/database/drivers/base-column.d.ts +21 -3
  178. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  179. package/build/src/database/drivers/base-column.js +21 -3
  180. package/build/src/database/drivers/base-columns-index.d.ts +9 -0
  181. package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
  182. package/build/src/database/drivers/base-columns-index.js +10 -1
  183. package/build/src/database/drivers/base-foreign-key.d.ts +15 -3
  184. package/build/src/database/drivers/base-foreign-key.d.ts.map +1 -1
  185. package/build/src/database/drivers/base-foreign-key.js +15 -3
  186. package/build/src/database/drivers/base-table.d.ts +16 -3
  187. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  188. package/build/src/database/drivers/base-table.js +16 -3
  189. package/build/src/database/drivers/base.d.ts +174 -37
  190. package/build/src/database/drivers/base.d.ts.map +1 -1
  191. package/build/src/database/drivers/base.js +156 -40
  192. package/build/src/database/drivers/mssql/column.d.ts +3 -2
  193. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  194. package/build/src/database/drivers/mssql/column.js +3 -2
  195. package/build/src/database/drivers/mssql/index.d.ts +5 -6
  196. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  197. package/build/src/database/drivers/mssql/index.js +38 -7
  198. package/build/src/database/drivers/mssql/options.d.ts +1 -0
  199. package/build/src/database/drivers/mssql/options.d.ts.map +1 -1
  200. package/build/src/database/drivers/mssql/options.js +8 -2
  201. package/build/src/database/drivers/mssql/sql/create-database.d.ts +1 -0
  202. package/build/src/database/drivers/mssql/sql/create-database.d.ts.map +1 -1
  203. package/build/src/database/drivers/mssql/sql/create-database.js +2 -1
  204. package/build/src/database/drivers/mssql/sql/drop-database.d.ts.map +1 -1
  205. package/build/src/database/drivers/mssql/sql/drop-database.js +2 -1
  206. package/build/src/database/drivers/mssql/structure-sql.d.ts +5 -2
  207. package/build/src/database/drivers/mssql/structure-sql.d.ts.map +1 -1
  208. package/build/src/database/drivers/mssql/structure-sql.js +5 -2
  209. package/build/src/database/drivers/mssql/table.d.ts +1 -0
  210. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  211. package/build/src/database/drivers/mssql/table.js +9 -4
  212. package/build/src/database/drivers/mysql/column.d.ts +3 -2
  213. package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
  214. package/build/src/database/drivers/mysql/column.js +4 -3
  215. package/build/src/database/drivers/mysql/index.d.ts +11 -3
  216. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  217. package/build/src/database/drivers/mysql/index.js +54 -10
  218. package/build/src/database/drivers/mysql/options.d.ts +1 -0
  219. package/build/src/database/drivers/mysql/options.d.ts.map +1 -1
  220. package/build/src/database/drivers/mysql/options.js +4 -2
  221. package/build/src/database/drivers/mysql/query.d.ts +3 -2
  222. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  223. package/build/src/database/drivers/mysql/query.js +6 -3
  224. package/build/src/database/drivers/mysql/sql/create-database.d.ts.map +1 -1
  225. package/build/src/database/drivers/mysql/sql/create-database.js +3 -1
  226. package/build/src/database/drivers/mysql/structure-sql.d.ts +7 -2
  227. package/build/src/database/drivers/mysql/structure-sql.d.ts.map +1 -1
  228. package/build/src/database/drivers/mysql/structure-sql.js +7 -2
  229. package/build/src/database/drivers/mysql/table.d.ts +1 -0
  230. package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
  231. package/build/src/database/drivers/mysql/table.js +7 -3
  232. package/build/src/database/drivers/pgsql/column.d.ts +3 -2
  233. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  234. package/build/src/database/drivers/pgsql/column.js +3 -2
  235. package/build/src/database/drivers/pgsql/index.d.ts +1 -1
  236. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  237. package/build/src/database/drivers/pgsql/index.js +36 -11
  238. package/build/src/database/drivers/pgsql/options.d.ts +2 -0
  239. package/build/src/database/drivers/pgsql/options.d.ts.map +1 -1
  240. package/build/src/database/drivers/pgsql/options.js +3 -1
  241. package/build/src/database/drivers/pgsql/structure-sql.d.ts +5 -2
  242. package/build/src/database/drivers/pgsql/structure-sql.d.ts.map +1 -1
  243. package/build/src/database/drivers/pgsql/structure-sql.js +5 -2
  244. package/build/src/database/drivers/pgsql/table.d.ts +1 -0
  245. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  246. package/build/src/database/drivers/pgsql/table.js +6 -2
  247. package/build/src/database/drivers/sqlite/base.d.ts +15 -5
  248. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  249. package/build/src/database/drivers/sqlite/base.js +79 -27
  250. package/build/src/database/drivers/sqlite/column.d.ts +3 -2
  251. package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
  252. package/build/src/database/drivers/sqlite/column.js +3 -2
  253. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +4 -2
  254. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  255. package/build/src/database/drivers/sqlite/connection-sql-js.js +4 -2
  256. package/build/src/database/drivers/sqlite/foreign-key.d.ts +3 -2
  257. package/build/src/database/drivers/sqlite/foreign-key.d.ts.map +1 -1
  258. package/build/src/database/drivers/sqlite/foreign-key.js +3 -2
  259. package/build/src/database/drivers/sqlite/index.d.ts +18 -5
  260. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  261. package/build/src/database/drivers/sqlite/index.js +40 -16
  262. package/build/src/database/drivers/sqlite/index.native.d.ts +1 -1
  263. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  264. package/build/src/database/drivers/sqlite/index.native.js +6 -3
  265. package/build/src/database/drivers/sqlite/index.web.d.ts +16 -4
  266. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  267. package/build/src/database/drivers/sqlite/index.web.js +17 -7
  268. package/build/src/database/drivers/sqlite/options.d.ts +2 -0
  269. package/build/src/database/drivers/sqlite/options.d.ts.map +1 -1
  270. package/build/src/database/drivers/sqlite/options.js +3 -1
  271. package/build/src/database/drivers/sqlite/query.d.ts +3 -2
  272. package/build/src/database/drivers/sqlite/query.d.ts.map +1 -1
  273. package/build/src/database/drivers/sqlite/query.js +6 -3
  274. package/build/src/database/drivers/sqlite/query.native.d.ts +2 -2
  275. package/build/src/database/drivers/sqlite/query.native.d.ts.map +1 -1
  276. package/build/src/database/drivers/sqlite/query.native.js +3 -3
  277. package/build/src/database/drivers/sqlite/query.web.d.ts +3 -2
  278. package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
  279. package/build/src/database/drivers/sqlite/query.web.js +6 -3
  280. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  281. package/build/src/database/drivers/sqlite/sql/alter-table.js +9 -3
  282. package/build/src/database/drivers/sqlite/structure-sql.d.ts +2 -0
  283. package/build/src/database/drivers/sqlite/structure-sql.d.ts.map +1 -1
  284. package/build/src/database/drivers/sqlite/structure-sql.js +3 -1
  285. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts +2 -0
  286. package/build/src/database/drivers/sqlite/table-rebuilder.d.ts.map +1 -1
  287. package/build/src/database/drivers/sqlite/table-rebuilder.js +3 -1
  288. package/build/src/database/drivers/sqlite/table.d.ts +2 -0
  289. package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
  290. package/build/src/database/drivers/sqlite/table.js +14 -4
  291. package/build/src/database/drivers/structure-sql/utils.d.ts +2 -0
  292. package/build/src/database/drivers/structure-sql/utils.d.ts.map +1 -1
  293. package/build/src/database/drivers/structure-sql/utils.js +3 -1
  294. package/build/src/database/handler.d.ts +1 -0
  295. package/build/src/database/handler.d.ts.map +1 -1
  296. package/build/src/database/handler.js +2 -1
  297. package/build/src/database/initializer-from-require-context.d.ts +8 -0
  298. package/build/src/database/initializer-from-require-context.d.ts.map +1 -1
  299. package/build/src/database/initializer-from-require-context.js +4 -1
  300. package/build/src/database/migration/index.d.ts +40 -5
  301. package/build/src/database/migration/index.d.ts.map +1 -1
  302. package/build/src/database/migration/index.js +34 -6
  303. package/build/src/database/migrator/files-finder.d.ts +2 -0
  304. package/build/src/database/migrator/files-finder.d.ts.map +1 -1
  305. package/build/src/database/migrator/files-finder.js +6 -2
  306. package/build/src/database/migrator.d.ts +29 -4
  307. package/build/src/database/migrator.d.ts.map +1 -1
  308. package/build/src/database/migrator.js +45 -10
  309. package/build/src/database/pool/async-tracked-multi-connection.d.ts +125 -31
  310. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  311. package/build/src/database/pool/async-tracked-multi-connection.js +189 -52
  312. package/build/src/database/pool/base-methods-forward.d.ts +1 -0
  313. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  314. package/build/src/database/pool/base-methods-forward.js +12 -3
  315. package/build/src/database/pool/base.d.ts +39 -7
  316. package/build/src/database/pool/base.d.ts.map +1 -1
  317. package/build/src/database/pool/base.js +59 -18
  318. package/build/src/database/pool/single-multi-use.d.ts +1 -0
  319. package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
  320. package/build/src/database/pool/single-multi-use.js +16 -4
  321. package/build/src/database/query/alter-table-base.d.ts +1 -0
  322. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  323. package/build/src/database/query/alter-table-base.js +3 -1
  324. package/build/src/database/query/base.d.ts +3 -0
  325. package/build/src/database/query/base.d.ts.map +1 -1
  326. package/build/src/database/query/base.js +4 -1
  327. package/build/src/database/query/create-database-base.d.ts +5 -0
  328. package/build/src/database/query/create-database-base.d.ts.map +1 -1
  329. package/build/src/database/query/create-database-base.js +4 -1
  330. package/build/src/database/query/create-index-base.d.ts +5 -0
  331. package/build/src/database/query/create-index-base.d.ts.map +1 -1
  332. package/build/src/database/query/create-index-base.js +4 -1
  333. package/build/src/database/query/create-table-base.d.ts +2 -0
  334. package/build/src/database/query/create-table-base.d.ts.map +1 -1
  335. package/build/src/database/query/create-table-base.js +3 -1
  336. package/build/src/database/query/delete-base.d.ts +3 -2
  337. package/build/src/database/query/delete-base.d.ts.map +1 -1
  338. package/build/src/database/query/delete-base.js +3 -2
  339. package/build/src/database/query/drop-database-base.d.ts +5 -0
  340. package/build/src/database/query/drop-database-base.d.ts.map +1 -1
  341. package/build/src/database/query/drop-database-base.js +4 -1
  342. package/build/src/database/query/drop-table-base.d.ts +1 -0
  343. package/build/src/database/query/drop-table-base.d.ts.map +1 -1
  344. package/build/src/database/query/drop-table-base.js +3 -1
  345. package/build/src/database/query/from-base.d.ts +6 -1
  346. package/build/src/database/query/from-base.d.ts.map +1 -1
  347. package/build/src/database/query/from-base.js +7 -2
  348. package/build/src/database/query/from-plain.d.ts +1 -0
  349. package/build/src/database/query/from-plain.d.ts.map +1 -1
  350. package/build/src/database/query/from-plain.js +2 -1
  351. package/build/src/database/query/from-table.d.ts +1 -0
  352. package/build/src/database/query/from-table.d.ts.map +1 -1
  353. package/build/src/database/query/from-table.js +2 -1
  354. package/build/src/database/query/index.d.ts +72 -12
  355. package/build/src/database/query/index.d.ts.map +1 -1
  356. package/build/src/database/query/index.js +79 -19
  357. package/build/src/database/query/insert-base.d.ts +13 -8
  358. package/build/src/database/query/insert-base.d.ts.map +1 -1
  359. package/build/src/database/query/insert-base.js +10 -5
  360. package/build/src/database/query/join-base.d.ts +4 -0
  361. package/build/src/database/query/join-base.d.ts.map +1 -1
  362. package/build/src/database/query/join-base.js +5 -1
  363. package/build/src/database/query/join-object.d.ts +11 -0
  364. package/build/src/database/query/join-object.d.ts.map +1 -1
  365. package/build/src/database/query/join-object.js +15 -4
  366. package/build/src/database/query/join-plain.d.ts +1 -0
  367. package/build/src/database/query/join-plain.d.ts.map +1 -1
  368. package/build/src/database/query/join-plain.js +2 -1
  369. package/build/src/database/query/join-tracker.d.ts +7 -0
  370. package/build/src/database/query/join-tracker.d.ts.map +1 -1
  371. package/build/src/database/query/join-tracker.js +8 -1
  372. package/build/src/database/query/model-class-query.d.ts +92 -26
  373. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  374. package/build/src/database/query/model-class-query.js +230 -76
  375. package/build/src/database/query/order-base.d.ts +3 -0
  376. package/build/src/database/query/order-base.d.ts.map +1 -1
  377. package/build/src/database/query/order-base.js +4 -1
  378. package/build/src/database/query/order-column.d.ts +9 -1
  379. package/build/src/database/query/order-column.d.ts.map +1 -1
  380. package/build/src/database/query/order-column.js +10 -2
  381. package/build/src/database/query/order-plain.d.ts +1 -0
  382. package/build/src/database/query/order-plain.d.ts.map +1 -1
  383. package/build/src/database/query/order-plain.js +2 -1
  384. package/build/src/database/query/preloader/belongs-to.d.ts +1 -0
  385. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  386. package/build/src/database/query/preloader/belongs-to.js +68 -23
  387. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts +1 -0
  388. package/build/src/database/query/preloader/ensure-model-class-initialized.d.ts.map +1 -1
  389. package/build/src/database/query/preloader/ensure-model-class-initialized.js +2 -1
  390. package/build/src/database/query/preloader/has-many.d.ts +5 -3
  391. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  392. package/build/src/database/query/preloader/has-many.js +66 -24
  393. package/build/src/database/query/preloader/has-one.d.ts +1 -0
  394. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  395. package/build/src/database/query/preloader/has-one.js +26 -9
  396. package/build/src/database/query/preloader/selection.d.ts +7 -1
  397. package/build/src/database/query/preloader/selection.d.ts.map +1 -1
  398. package/build/src/database/query/preloader/selection.js +13 -5
  399. package/build/src/database/query/preloader.d.ts +1 -0
  400. package/build/src/database/query/preloader.d.ts.map +1 -1
  401. package/build/src/database/query/preloader.js +28 -9
  402. package/build/src/database/query/query-data.d.ts +21 -7
  403. package/build/src/database/query/query-data.d.ts.map +1 -1
  404. package/build/src/database/query/query-data.js +37 -18
  405. package/build/src/database/query/select-base.d.ts +3 -0
  406. package/build/src/database/query/select-base.d.ts.map +1 -1
  407. package/build/src/database/query/select-base.js +4 -1
  408. package/build/src/database/query/select-plain.d.ts +1 -0
  409. package/build/src/database/query/select-plain.d.ts.map +1 -1
  410. package/build/src/database/query/select-plain.js +2 -1
  411. package/build/src/database/query/select-table-and-column.d.ts +1 -0
  412. package/build/src/database/query/select-table-and-column.d.ts.map +1 -1
  413. package/build/src/database/query/select-table-and-column.js +2 -1
  414. package/build/src/database/query/update-base.d.ts +9 -6
  415. package/build/src/database/query/update-base.d.ts.map +1 -1
  416. package/build/src/database/query/update-base.js +7 -4
  417. package/build/src/database/query/upsert-base.d.ts +13 -4
  418. package/build/src/database/query/upsert-base.d.ts.map +1 -1
  419. package/build/src/database/query/upsert-base.js +12 -3
  420. package/build/src/database/query/where-base.d.ts +4 -0
  421. package/build/src/database/query/where-base.d.ts.map +1 -1
  422. package/build/src/database/query/where-base.js +5 -1
  423. package/build/src/database/query/where-combinator.d.ts +1 -0
  424. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  425. package/build/src/database/query/where-combinator.js +6 -2
  426. package/build/src/database/query/where-hash.d.ts +6 -0
  427. package/build/src/database/query/where-hash.d.ts.map +1 -1
  428. package/build/src/database/query/where-hash.js +5 -1
  429. package/build/src/database/query/where-model-class-hash.d.ts +30 -16
  430. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  431. package/build/src/database/query/where-model-class-hash.js +55 -20
  432. package/build/src/database/query/where-not.d.ts +1 -0
  433. package/build/src/database/query/where-not.d.ts.map +1 -1
  434. package/build/src/database/query/where-not.js +3 -1
  435. package/build/src/database/query/where-plain.d.ts +1 -0
  436. package/build/src/database/query/where-plain.d.ts.map +1 -1
  437. package/build/src/database/query/where-plain.js +2 -1
  438. package/build/src/database/query/with-count.d.ts +11 -5
  439. package/build/src/database/query/with-count.d.ts.map +1 -1
  440. package/build/src/database/query/with-count.js +36 -15
  441. package/build/src/database/query-parser/base-query-parser.d.ts +1 -0
  442. package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
  443. package/build/src/database/query-parser/base-query-parser.js +2 -1
  444. package/build/src/database/query-parser/from-parser.d.ts +5 -1
  445. package/build/src/database/query-parser/from-parser.d.ts.map +1 -1
  446. package/build/src/database/query-parser/from-parser.js +6 -2
  447. package/build/src/database/query-parser/group-parser.d.ts +2 -0
  448. package/build/src/database/query-parser/group-parser.d.ts.map +1 -1
  449. package/build/src/database/query-parser/group-parser.js +3 -1
  450. package/build/src/database/query-parser/joins-parser.d.ts +1 -0
  451. package/build/src/database/query-parser/joins-parser.d.ts.map +1 -1
  452. package/build/src/database/query-parser/joins-parser.js +2 -1
  453. package/build/src/database/query-parser/limit-parser.d.ts +1 -0
  454. package/build/src/database/query-parser/limit-parser.d.ts.map +1 -1
  455. package/build/src/database/query-parser/limit-parser.js +2 -1
  456. package/build/src/database/query-parser/options.d.ts +15 -4
  457. package/build/src/database/query-parser/options.d.ts.map +1 -1
  458. package/build/src/database/query-parser/options.js +11 -3
  459. package/build/src/database/query-parser/order-parser.d.ts +1 -0
  460. package/build/src/database/query-parser/order-parser.d.ts.map +1 -1
  461. package/build/src/database/query-parser/order-parser.js +2 -1
  462. package/build/src/database/query-parser/select-parser.d.ts +1 -0
  463. package/build/src/database/query-parser/select-parser.d.ts.map +1 -1
  464. package/build/src/database/query-parser/select-parser.js +2 -1
  465. package/build/src/database/query-parser/where-parser.d.ts +1 -0
  466. package/build/src/database/query-parser/where-parser.d.ts.map +1 -1
  467. package/build/src/database/query-parser/where-parser.js +2 -1
  468. package/build/src/database/record/acts-as-list.d.ts +0 -1
  469. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  470. package/build/src/database/record/acts-as-list.js +89 -45
  471. package/build/src/database/record/attachments/download.d.ts +34 -15
  472. package/build/src/database/record/attachments/download.d.ts.map +1 -1
  473. package/build/src/database/record/attachments/download.js +34 -22
  474. package/build/src/database/record/attachments/handle.d.ts +17 -5
  475. package/build/src/database/record/attachments/handle.d.ts.map +1 -1
  476. package/build/src/database/record/attachments/handle.js +25 -9
  477. package/build/src/database/record/attachments/normalize-input.d.ts +6 -1
  478. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  479. package/build/src/database/record/attachments/normalize-input.js +54 -17
  480. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +7 -1
  481. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  482. package/build/src/database/record/attachments/storage-drivers/filesystem.js +10 -2
  483. package/build/src/database/record/attachments/storage-drivers/native.d.ts +12 -7
  484. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  485. package/build/src/database/record/attachments/storage-drivers/native.js +13 -6
  486. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +18 -9
  487. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  488. package/build/src/database/record/attachments/storage-drivers/s3.js +38 -13
  489. package/build/src/database/record/attachments/store.d.ts +48 -25
  490. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  491. package/build/src/database/record/attachments/store.js +63 -25
  492. package/build/src/database/record/index.d.ts +394 -146
  493. package/build/src/database/record/index.d.ts.map +1 -1
  494. package/build/src/database/record/index.js +697 -248
  495. package/build/src/database/record/instance-relationships/base.d.ts +78 -19
  496. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  497. package/build/src/database/record/instance-relationships/base.js +98 -26
  498. package/build/src/database/record/instance-relationships/belongs-to.d.ts +1 -0
  499. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  500. package/build/src/database/record/instance-relationships/belongs-to.js +13 -5
  501. package/build/src/database/record/instance-relationships/has-many.d.ts +27 -7
  502. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  503. package/build/src/database/record/instance-relationships/has-many.js +50 -16
  504. package/build/src/database/record/instance-relationships/has-one.d.ts +4 -1
  505. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  506. package/build/src/database/record/instance-relationships/has-one.js +28 -10
  507. package/build/src/database/record/relationships/base.d.ts +61 -14
  508. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  509. package/build/src/database/record/relationships/base.js +60 -15
  510. package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
  511. package/build/src/database/record/relationships/belongs-to.js +9 -3
  512. package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
  513. package/build/src/database/record/relationships/has-many.js +9 -3
  514. package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
  515. package/build/src/database/record/relationships/has-one.js +9 -3
  516. package/build/src/database/record/state-machine.d.ts +9 -1
  517. package/build/src/database/record/state-machine.d.ts.map +1 -1
  518. package/build/src/database/record/state-machine.js +35 -14
  519. package/build/src/database/record/user-module.d.ts +2 -0
  520. package/build/src/database/record/user-module.d.ts.map +1 -1
  521. package/build/src/database/record/user-module.js +3 -1
  522. package/build/src/database/record/validators/base.d.ts +4 -2
  523. package/build/src/database/record/validators/base.d.ts.map +1 -1
  524. package/build/src/database/record/validators/base.js +4 -2
  525. package/build/src/database/record/validators/format.d.ts.map +1 -1
  526. package/build/src/database/record/validators/format.js +2 -1
  527. package/build/src/database/record/validators/presence.d.ts.map +1 -1
  528. package/build/src/database/record/validators/presence.js +5 -2
  529. package/build/src/database/record/validators/uniqueness.d.ts +0 -2
  530. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  531. package/build/src/database/record/validators/uniqueness.js +18 -8
  532. package/build/src/database/table-data/index.d.ts +40 -4
  533. package/build/src/database/table-data/index.d.ts.map +1 -1
  534. package/build/src/database/table-data/index.js +38 -5
  535. package/build/src/database/table-data/table-column.d.ts +43 -5
  536. package/build/src/database/table-data/table-column.d.ts.map +1 -1
  537. package/build/src/database/table-data/table-column.js +37 -4
  538. package/build/src/database/table-data/table-foreign-key.d.ts +8 -0
  539. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  540. package/build/src/database/table-data/table-foreign-key.js +9 -1
  541. package/build/src/database/table-data/table-index.d.ts +8 -0
  542. package/build/src/database/table-data/table-index.d.ts.map +1 -1
  543. package/build/src/database/table-data/table-index.js +6 -1
  544. package/build/src/database/table-data/table-reference.d.ts +1 -0
  545. package/build/src/database/table-data/table-reference.d.ts.map +1 -1
  546. package/build/src/database/table-data/table-reference.js +2 -1
  547. package/build/src/database/use-database.d.ts +1 -0
  548. package/build/src/database/use-database.d.ts.map +1 -1
  549. package/build/src/database/use-database.js +2 -1
  550. package/build/src/environment-handlers/base.d.ts +94 -36
  551. package/build/src/environment-handlers/base.d.ts.map +1 -1
  552. package/build/src/environment-handlers/base.js +90 -36
  553. package/build/src/environment-handlers/browser.d.ts +33 -3
  554. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  555. package/build/src/environment-handlers/browser.js +36 -9
  556. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts +5 -0
  557. package/build/src/environment-handlers/node/cli/commands/cli-command-context.d.ts.map +1 -1
  558. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +6 -2
  559. package/build/src/environment-handlers/node/cli/commands/console.d.ts +3 -2
  560. package/build/src/environment-handlers/node/cli/commands/console.d.ts.map +1 -1
  561. package/build/src/environment-handlers/node/cli/commands/console.js +23 -9
  562. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts +4 -1
  563. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.d.ts.map +1 -1
  564. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +5 -2
  565. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +6 -2
  566. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -1
  567. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +11 -5
  568. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts +15 -5
  569. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
  570. package/build/src/environment-handlers/node/cli/commands/db/seed.js +20 -6
  571. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts +5 -0
  572. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
  573. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +3 -1
  574. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +2 -0
  575. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  576. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +6 -4
  577. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +43 -29
  578. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  579. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +99 -40
  580. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts +5 -0
  581. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
  582. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +3 -1
  583. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts +5 -0
  584. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
  585. package/build/src/environment-handlers/node/cli/commands/generate/model.js +3 -1
  586. package/build/src/environment-handlers/node/cli/commands/init.d.ts +5 -0
  587. package/build/src/environment-handlers/node/cli/commands/init.d.ts.map +1 -1
  588. package/build/src/environment-handlers/node/cli/commands/init.js +3 -1
  589. package/build/src/environment-handlers/node/cli/commands/routes.d.ts +3 -0
  590. package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
  591. package/build/src/environment-handlers/node/cli/commands/routes.js +4 -1
  592. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts +15 -5
  593. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
  594. package/build/src/environment-handlers/node/cli/commands/run-script.js +20 -6
  595. package/build/src/environment-handlers/node/cli/commands/runner.d.ts +18 -6
  596. package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
  597. package/build/src/environment-handlers/node/cli/commands/runner.js +20 -6
  598. package/build/src/environment-handlers/node/cli/commands/server.d.ts +13 -1
  599. package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
  600. package/build/src/environment-handlers/node/cli/commands/server.js +23 -6
  601. package/build/src/environment-handlers/node.d.ts +14 -2
  602. package/build/src/environment-handlers/node.d.ts.map +1 -1
  603. package/build/src/environment-handlers/node.js +107 -39
  604. package/build/src/error-logger.d.ts +4 -3
  605. package/build/src/error-logger.d.ts.map +1 -1
  606. package/build/src/error-logger.js +4 -3
  607. package/build/src/frontend-model-controller.d.ts +239 -90
  608. package/build/src/frontend-model-controller.d.ts.map +1 -1
  609. package/build/src/frontend-model-controller.js +577 -787
  610. package/build/src/frontend-model-resource/base-resource.d.ts +118 -66
  611. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  612. package/build/src/frontend-model-resource/base-resource.js +205 -82
  613. package/build/src/frontend-models/base.d.ts +319 -163
  614. package/build/src/frontend-models/base.d.ts.map +1 -1
  615. package/build/src/frontend-models/base.js +717 -366
  616. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts +2 -1
  617. package/build/src/frontend-models/clear-pending-debounced-callback.d.ts.map +1 -1
  618. package/build/src/frontend-models/clear-pending-debounced-callback.js +6 -3
  619. package/build/src/frontend-models/event-hook-models.d.ts +5 -0
  620. package/build/src/frontend-models/event-hook-models.d.ts.map +1 -1
  621. package/build/src/frontend-models/event-hook-models.js +10 -3
  622. package/build/src/frontend-models/model-registry.d.ts +5 -5
  623. package/build/src/frontend-models/model-registry.d.ts.map +1 -1
  624. package/build/src/frontend-models/model-registry.js +5 -5
  625. package/build/src/frontend-models/outgoing-event-buffer.d.ts +11 -3
  626. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  627. package/build/src/frontend-models/outgoing-event-buffer.js +13 -5
  628. package/build/src/frontend-models/preloader.d.ts +9 -6
  629. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  630. package/build/src/frontend-models/preloader.js +21 -9
  631. package/build/src/frontend-models/query.d.ts +283 -73
  632. package/build/src/frontend-models/query.d.ts.map +1 -1
  633. package/build/src/frontend-models/query.js +331 -203
  634. package/build/src/frontend-models/resource-config-validation.d.ts +2 -0
  635. package/build/src/frontend-models/resource-config-validation.d.ts.map +1 -1
  636. package/build/src/frontend-models/resource-config-validation.js +3 -1
  637. package/build/src/frontend-models/resource-definition.d.ts +12 -5
  638. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  639. package/build/src/frontend-models/resource-definition.js +39 -13
  640. package/build/src/frontend-models/transport-serialization.d.ts +14 -11
  641. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  642. package/build/src/frontend-models/transport-serialization.js +80 -53
  643. package/build/src/frontend-models/use-destroyed-event.d.ts +21 -0
  644. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  645. package/build/src/frontend-models/use-destroyed-event.js +34 -11
  646. package/build/src/frontend-models/use-model-class-event.d.ts +24 -0
  647. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  648. package/build/src/frontend-models/use-model-class-event.js +39 -12
  649. package/build/src/frontend-models/use-updated-event.d.ts +21 -0
  650. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  651. package/build/src/frontend-models/use-updated-event.js +37 -12
  652. package/build/src/frontend-models/websocket-channel.d.ts +51 -9
  653. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  654. package/build/src/frontend-models/websocket-channel.js +96 -26
  655. package/build/src/frontend-models/websocket-publishers.d.ts +2 -0
  656. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  657. package/build/src/frontend-models/websocket-publishers.js +33 -11
  658. package/build/src/http-client/header.d.ts +1 -0
  659. package/build/src/http-client/header.d.ts.map +1 -1
  660. package/build/src/http-client/header.js +2 -1
  661. package/build/src/http-client/index.d.ts +4 -0
  662. package/build/src/http-client/index.d.ts.map +1 -1
  663. package/build/src/http-client/index.js +5 -1
  664. package/build/src/http-client/request.d.ts +5 -0
  665. package/build/src/http-client/request.d.ts.map +1 -1
  666. package/build/src/http-client/request.js +6 -1
  667. package/build/src/http-client/response.d.ts +14 -4
  668. package/build/src/http-client/response.d.ts.map +1 -1
  669. package/build/src/http-client/response.js +14 -4
  670. package/build/src/http-client/websocket-client.d.ts +1 -0
  671. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  672. package/build/src/http-client/websocket-client.js +2 -1
  673. package/build/src/http-server/client/index.d.ts +16 -2
  674. package/build/src/http-server/client/index.d.ts.map +1 -1
  675. package/build/src/http-server/client/index.js +44 -13
  676. package/build/src/http-server/client/params-to-object.d.ts +16 -10
  677. package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
  678. package/build/src/http-server/client/params-to-object.js +46 -17
  679. package/build/src/http-server/client/request-buffer/form-data-part.d.ts +10 -6
  680. package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
  681. package/build/src/http-server/client/request-buffer/form-data-part.js +11 -7
  682. package/build/src/http-server/client/request-buffer/header.d.ts +1 -0
  683. package/build/src/http-server/client/request-buffer/header.d.ts.map +1 -1
  684. package/build/src/http-server/client/request-buffer/header.js +2 -1
  685. package/build/src/http-server/client/request-buffer/index.d.ts +29 -4
  686. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  687. package/build/src/http-server/client/request-buffer/index.js +43 -9
  688. package/build/src/http-server/client/request-parser.d.ts +52 -13
  689. package/build/src/http-server/client/request-parser.d.ts.map +1 -1
  690. package/build/src/http-server/client/request-parser.js +58 -15
  691. package/build/src/http-server/client/request-runner.d.ts +5 -1
  692. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  693. package/build/src/http-server/client/request-runner.js +32 -8
  694. package/build/src/http-server/client/request-timing.d.ts +37 -7
  695. package/build/src/http-server/client/request-timing.d.ts.map +1 -1
  696. package/build/src/http-server/client/request-timing.js +32 -8
  697. package/build/src/http-server/client/request.d.ts +15 -5
  698. package/build/src/http-server/client/request.d.ts.map +1 -1
  699. package/build/src/http-server/client/request.js +17 -5
  700. package/build/src/http-server/client/response.d.ts +22 -4
  701. package/build/src/http-server/client/response.d.ts.map +1 -1
  702. package/build/src/http-server/client/response.js +29 -7
  703. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts +1 -0
  704. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.d.ts.map +1 -1
  705. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +3 -1
  706. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts +1 -0
  707. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.d.ts.map +1 -1
  708. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +3 -1
  709. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +2 -0
  710. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
  711. package/build/src/http-server/client/uploaded-file/uploaded-file.js +3 -1
  712. package/build/src/http-server/client/websocket-request.d.ts +24 -12
  713. package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
  714. package/build/src/http-server/client/websocket-request.js +24 -10
  715. package/build/src/http-server/client/websocket-session.d.ts +101 -62
  716. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  717. package/build/src/http-server/client/websocket-session.js +118 -61
  718. package/build/src/http-server/cookie.d.ts +36 -8
  719. package/build/src/http-server/cookie.d.ts.map +1 -1
  720. package/build/src/http-server/cookie.js +37 -9
  721. package/build/src/http-server/development-reloader.d.ts +32 -7
  722. package/build/src/http-server/development-reloader.d.ts.map +1 -1
  723. package/build/src/http-server/development-reloader.js +39 -10
  724. package/build/src/http-server/index.d.ts +102 -25
  725. package/build/src/http-server/index.d.ts.map +1 -1
  726. package/build/src/http-server/index.js +117 -32
  727. package/build/src/http-server/remote-address.d.ts +1 -0
  728. package/build/src/http-server/remote-address.d.ts.map +1 -1
  729. package/build/src/http-server/remote-address.js +15 -4
  730. package/build/src/http-server/server-client.d.ts +37 -8
  731. package/build/src/http-server/server-client.d.ts.map +1 -1
  732. package/build/src/http-server/server-client.js +48 -12
  733. package/build/src/http-server/server-lock.d.ts +76 -0
  734. package/build/src/http-server/server-lock.d.ts.map +1 -0
  735. package/build/src/http-server/server-lock.js +164 -0
  736. package/build/src/http-server/websocket-channel-subscribers.d.ts +13 -8
  737. package/build/src/http-server/websocket-channel-subscribers.d.ts.map +1 -1
  738. package/build/src/http-server/websocket-channel-subscribers.js +16 -7
  739. package/build/src/http-server/websocket-channel.d.ts +13 -11
  740. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  741. package/build/src/http-server/websocket-channel.js +8 -12
  742. package/build/src/http-server/websocket-connection.d.ts +10 -14
  743. package/build/src/http-server/websocket-connection.d.ts.map +1 -1
  744. package/build/src/http-server/websocket-connection.js +8 -12
  745. package/build/src/http-server/websocket-event-log-store.d.ts +48 -10
  746. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  747. package/build/src/http-server/websocket-event-log-store.js +76 -34
  748. package/build/src/http-server/websocket-events-host.d.ts +21 -15
  749. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  750. package/build/src/http-server/websocket-events-host.js +20 -11
  751. package/build/src/http-server/websocket-events.d.ts +8 -7
  752. package/build/src/http-server/websocket-events.d.ts.map +1 -1
  753. package/build/src/http-server/websocket-events.js +6 -5
  754. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts +3 -2
  755. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.d.ts.map +1 -1
  756. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +3 -2
  757. package/build/src/http-server/worker-handler/in-process.d.ts +18 -18
  758. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  759. package/build/src/http-server/worker-handler/in-process.js +28 -20
  760. package/build/src/http-server/worker-handler/index.d.ts +39 -20
  761. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  762. package/build/src/http-server/worker-handler/index.js +34 -14
  763. package/build/src/http-server/worker-handler/worker-thread.d.ts +31 -15
  764. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  765. package/build/src/http-server/worker-handler/worker-thread.js +31 -12
  766. package/build/src/initializer.d.ts +4 -0
  767. package/build/src/initializer.d.ts.map +1 -1
  768. package/build/src/initializer.js +5 -1
  769. package/build/src/jobs/mail-delivery.d.ts +1 -0
  770. package/build/src/jobs/mail-delivery.d.ts.map +1 -1
  771. package/build/src/jobs/mail-delivery.js +2 -1
  772. package/build/src/logger/base-logger.js +2 -2
  773. package/build/src/logger/console-logger.d.ts +2 -0
  774. package/build/src/logger/console-logger.d.ts.map +1 -1
  775. package/build/src/logger/console-logger.js +3 -1
  776. package/build/src/logger/file-logger.d.ts +2 -0
  777. package/build/src/logger/file-logger.d.ts.map +1 -1
  778. package/build/src/logger/file-logger.js +3 -1
  779. package/build/src/logger/outputs/array-output.d.ts +21 -5
  780. package/build/src/logger/outputs/array-output.d.ts.map +1 -1
  781. package/build/src/logger/outputs/array-output.js +19 -6
  782. package/build/src/logger/outputs/console-output.d.ts +10 -2
  783. package/build/src/logger/outputs/console-output.d.ts.map +1 -1
  784. package/build/src/logger/outputs/console-output.js +8 -3
  785. package/build/src/logger/outputs/file-output.d.ts +20 -5
  786. package/build/src/logger/outputs/file-output.d.ts.map +1 -1
  787. package/build/src/logger/outputs/file-output.js +18 -6
  788. package/build/src/logger/outputs/stdout-output.d.ts +7 -1
  789. package/build/src/logger/outputs/stdout-output.d.ts.map +1 -1
  790. package/build/src/logger/outputs/stdout-output.js +9 -3
  791. package/build/src/logger.d.ts +28 -13
  792. package/build/src/logger.d.ts.map +1 -1
  793. package/build/src/logger.js +60 -23
  794. package/build/src/mailer/backends/smtp.d.ts +5 -0
  795. package/build/src/mailer/backends/smtp.d.ts.map +1 -1
  796. package/build/src/mailer/backends/smtp.js +17 -4
  797. package/build/src/mailer/base.d.ts +33 -17
  798. package/build/src/mailer/base.d.ts.map +1 -1
  799. package/build/src/mailer/base.js +54 -18
  800. package/build/src/mailer/delivery.d.ts +16 -5
  801. package/build/src/mailer/delivery.d.ts.map +1 -1
  802. package/build/src/mailer/delivery.js +18 -7
  803. package/build/src/mailer/index.d.ts +5 -5
  804. package/build/src/mailer/index.d.ts.map +1 -1
  805. package/build/src/mailer/index.js +2 -2
  806. package/build/src/mailer.d.ts +5 -5
  807. package/build/src/mailer.d.ts.map +1 -1
  808. package/build/src/mailer.js +2 -2
  809. package/build/src/plugins/sqljs-wasm-route-controller.d.ts +4 -1
  810. package/build/src/plugins/sqljs-wasm-route-controller.d.ts.map +1 -1
  811. package/build/src/plugins/sqljs-wasm-route-controller.js +11 -4
  812. package/build/src/plugins/sqljs-wasm-route.d.ts +6 -0
  813. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  814. package/build/src/plugins/sqljs-wasm-route.js +4 -1
  815. package/build/src/record-payload-values.d.ts +54 -0
  816. package/build/src/record-payload-values.d.ts.map +1 -0
  817. package/build/src/record-payload-values.js +80 -0
  818. package/build/src/routes/app-routes.d.ts +1 -0
  819. package/build/src/routes/app-routes.d.ts.map +1 -1
  820. package/build/src/routes/app-routes.js +2 -1
  821. package/build/src/routes/base-route.d.ts +52 -16
  822. package/build/src/routes/base-route.d.ts.map +1 -1
  823. package/build/src/routes/base-route.js +50 -14
  824. package/build/src/routes/basic-route.d.ts +1 -0
  825. package/build/src/routes/basic-route.d.ts.map +1 -1
  826. package/build/src/routes/basic-route.js +13 -4
  827. package/build/src/routes/built-in/debug/controller.d.ts +4 -1
  828. package/build/src/routes/built-in/debug/controller.d.ts.map +1 -1
  829. package/build/src/routes/built-in/debug/controller.js +5 -2
  830. package/build/src/routes/get-route.d.ts +1 -0
  831. package/build/src/routes/get-route.d.ts.map +1 -1
  832. package/build/src/routes/get-route.js +7 -4
  833. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +1 -0
  834. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  835. package/build/src/routes/hooks/frontend-model-command-route-hook.js +6 -2
  836. package/build/src/routes/index.d.ts +3 -2
  837. package/build/src/routes/index.d.ts.map +1 -1
  838. package/build/src/routes/index.js +10 -4
  839. package/build/src/routes/namespace-route.d.ts +1 -0
  840. package/build/src/routes/namespace-route.d.ts.map +1 -1
  841. package/build/src/routes/namespace-route.js +5 -3
  842. package/build/src/routes/plugin-routes.d.ts +10 -1
  843. package/build/src/routes/plugin-routes.d.ts.map +1 -1
  844. package/build/src/routes/plugin-routes.js +11 -3
  845. package/build/src/routes/post-route.d.ts +1 -0
  846. package/build/src/routes/post-route.d.ts.map +1 -1
  847. package/build/src/routes/post-route.js +7 -4
  848. package/build/src/routes/resolver.d.ts +20 -5
  849. package/build/src/routes/resolver.d.ts.map +1 -1
  850. package/build/src/routes/resolver.js +47 -14
  851. package/build/src/routes/resource-route.d.ts +6 -1
  852. package/build/src/routes/resource-route.d.ts.map +1 -1
  853. package/build/src/routes/resource-route.js +10 -4
  854. package/build/src/testing/base-expect.d.ts +2 -0
  855. package/build/src/testing/base-expect.d.ts.map +1 -1
  856. package/build/src/testing/base-expect.js +3 -1
  857. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +33 -5
  858. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  859. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +95 -23
  860. package/build/src/testing/expect-to-change.d.ts +3 -0
  861. package/build/src/testing/expect-to-change.d.ts.map +1 -1
  862. package/build/src/testing/expect-to-change.js +4 -1
  863. package/build/src/testing/expect-utils.d.ts +22 -16
  864. package/build/src/testing/expect-utils.d.ts.map +1 -1
  865. package/build/src/testing/expect-utils.js +62 -30
  866. package/build/src/testing/expect.d.ts +50 -21
  867. package/build/src/testing/expect.d.ts.map +1 -1
  868. package/build/src/testing/expect.js +58 -17
  869. package/build/src/testing/request-client.d.ts +16 -3
  870. package/build/src/testing/request-client.d.ts.map +1 -1
  871. package/build/src/testing/request-client.js +17 -4
  872. package/build/src/testing/test-files-finder.d.ts +41 -9
  873. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  874. package/build/src/testing/test-files-finder.js +42 -10
  875. package/build/src/testing/test-filter-parser.d.ts +6 -0
  876. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  877. package/build/src/testing/test-filter-parser.js +12 -3
  878. package/build/src/testing/test-runner.d.ts +102 -6
  879. package/build/src/testing/test-runner.d.ts.map +1 -1
  880. package/build/src/testing/test-runner.js +115 -23
  881. package/build/src/testing/test-suite-splitter.d.ts +7 -0
  882. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  883. package/build/src/testing/test-suite-splitter.js +7 -2
  884. package/build/src/testing/test.d.ts +20 -4
  885. package/build/src/testing/test.d.ts.map +1 -1
  886. package/build/src/testing/test.js +67 -20
  887. package/build/src/utils/backtrace-cleaner-node.d.ts.map +1 -1
  888. package/build/src/utils/backtrace-cleaner-node.js +6 -1
  889. package/build/src/utils/backtrace-cleaner.d.ts +16 -1
  890. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  891. package/build/src/utils/backtrace-cleaner.js +20 -2
  892. package/build/src/utils/ensure-error.d.ts +3 -2
  893. package/build/src/utils/ensure-error.d.ts.map +1 -1
  894. package/build/src/utils/ensure-error.js +3 -2
  895. package/build/src/utils/event-emitter.d.ts.map +1 -1
  896. package/build/src/utils/event-emitter.js +2 -2
  897. package/build/src/utils/file-exists.d.ts +1 -0
  898. package/build/src/utils/file-exists.d.ts.map +1 -1
  899. package/build/src/utils/file-exists.js +2 -1
  900. package/build/src/utils/format-value.d.ts +5 -4
  901. package/build/src/utils/format-value.d.ts.map +1 -1
  902. package/build/src/utils/format-value.js +12 -7
  903. package/build/src/utils/model-scope.d.ts +18 -12
  904. package/build/src/utils/model-scope.d.ts.map +1 -1
  905. package/build/src/utils/model-scope.js +19 -11
  906. package/build/src/utils/nest-callbacks.d.ts +1 -0
  907. package/build/src/utils/nest-callbacks.d.ts.map +1 -1
  908. package/build/src/utils/nest-callbacks.js +2 -1
  909. package/build/src/utils/plain-object.d.ts +7 -0
  910. package/build/src/utils/plain-object.d.ts.map +1 -0
  911. package/build/src/utils/plain-object.js +13 -0
  912. package/build/src/utils/ransack.d.ts +29 -5
  913. package/build/src/utils/ransack.d.ts.map +1 -1
  914. package/build/src/utils/ransack.js +136 -49
  915. package/build/src/utils/rest-args-error.d.ts +1 -0
  916. package/build/src/utils/rest-args-error.d.ts.map +1 -1
  917. package/build/src/utils/rest-args-error.js +2 -1
  918. package/build/src/utils/singularize-model-name.d.ts +1 -0
  919. package/build/src/utils/singularize-model-name.d.ts.map +1 -1
  920. package/build/src/utils/singularize-model-name.js +2 -1
  921. package/build/src/utils/to-import-specifier.d.ts.map +1 -1
  922. package/build/src/utils/to-import-specifier.js +3 -1
  923. package/build/src/utils/with-tracked-stack-async-hooks.d.ts +8 -5
  924. package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
  925. package/build/src/utils/with-tracked-stack-async-hooks.js +32 -13
  926. package/build/src/utils/with-tracked-stack.d.ts +9 -5
  927. package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
  928. package/build/src/utils/with-tracked-stack.js +19 -8
  929. package/build/src/velocious-error.d.ts +4 -2
  930. package/build/src/velocious-error.d.ts.map +1 -1
  931. package/build/src/velocious-error.js +5 -3
  932. package/build/tsconfig.tsbuildinfo +1 -1
  933. package/package.json +1 -1
@@ -7,9 +7,14 @@ import Logger from "../logger.js";
7
7
  import Net from "net";
8
8
  import ServerClient from "./server-client.js";
9
9
  import WorkerHandler from "./worker-handler/index.js";
10
- /** @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
11
- /** @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
12
10
  /**
11
+ * Defines this typedef.
12
+ @typedef {{start: () => Promise<void>, stop: () => Promise<void>}} DevelopmentReloaderLike */
13
+ /**
14
+ * Defines this typedef.
15
+ @typedef {function({configuration: import("../configuration.js").default, workerCount: number}) : (WorkerHandler | InProcessHandler)} WorkerHandlerFactory */
16
+ /**
17
+ * Runs normalize worker count.
13
18
  * @param {object} args - Options object.
14
19
  * @param {number} [args.maxWorkers] - Backward-compatible worker count alias.
15
20
  * @param {number} [args.workers] - Configured worker count.
@@ -25,24 +30,39 @@ function normalizeWorkerCount({ maxWorkers, workers }) {
25
30
  export default class VelociousHttpServer {
26
31
  clientCount = 0;
27
32
  _starting = false;
28
- /** @type {DevelopmentReloader | DevelopmentReloaderLike | undefined} */
33
+ /**
34
+ * Narrows the runtime value to the documented type.
35
+ @type {DevelopmentReloader | DevelopmentReloaderLike | undefined} */
29
36
  developmentReloader;
30
- /** @type {import("net").Server | undefined} */
37
+ /**
38
+ * Narrows the runtime value to the documented type.
39
+ @type {import("net").Server | undefined} */
31
40
  netServer;
32
- /** @type {WorkerHandlerFactory | undefined} */
41
+ /**
42
+ * Narrows the runtime value to the documented type.
43
+ @type {WorkerHandlerFactory | undefined} */
33
44
  workerHandlerFactory;
34
- /** @type {Record<string, ServerClient>} */
45
+ /**
46
+ * Clients.
47
+ @type {Record<string, ServerClient>} */
35
48
  clients = {};
36
- /** @type {Set<import("net").Socket>} */
49
+ /**
50
+ * Active sockets.
51
+ @type {Set<import("net").Socket>} */
37
52
  _activeSockets = new Set();
38
53
  events = new EventEmitter();
39
54
  workerCount = 0;
40
- /** @type {Array<WorkerHandler | InProcessHandler>} */
55
+ /**
56
+ * Worker handlers.
57
+ @type {Array<WorkerHandler | InProcessHandler>} */
41
58
  workerHandlers = [];
42
59
  nextWorkerHandlerIndex = 0;
43
- /** @type {Map<string, WorkerHandler | InProcessHandler>} */
60
+ /**
61
+ * Sticky worker handlers.
62
+ @type {Map<string, WorkerHandler | InProcessHandler>} */
44
63
  stickyWorkerHandlers = new Map();
45
64
  /**
65
+ * Runs constructor.
46
66
  * @param {object} args - Options object.
47
67
  * @param {import("../configuration.js").default} args.configuration - Configuration instance.
48
68
  * @param {string} [args.host] - Host.
@@ -63,7 +83,10 @@ export default class VelociousHttpServer {
63
83
  this.port = port ?? 3006;
64
84
  this.workers = normalizeWorkerCount({ maxWorkers, workers });
65
85
  }
66
- /** @returns {Promise<void>} - Resolves when complete. */
86
+ /**
87
+ * Runs start.
88
+ * @returns {Promise<void>} - Resolves when complete.
89
+ */
67
90
  async start() {
68
91
  if (this._starting)
69
92
  throw new Error("Velocious HTTP server is already starting");
@@ -74,7 +97,9 @@ export default class VelociousHttpServer {
74
97
  try {
75
98
  await this._ensureWorkers();
76
99
  await this._startDevelopmentReloader();
77
- /** @type {import("net").Server} */
100
+ /**
101
+ * Net server.
102
+ @type {import("net").Server} */
78
103
  const netServer = new Net.Server();
79
104
  this.netServer = netServer;
80
105
  netServer.on("close", this.onClose);
@@ -90,7 +115,10 @@ export default class VelociousHttpServer {
90
115
  this._starting = false;
91
116
  }
92
117
  }
93
- /** @returns {{developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined, netServer: import("net").Server | undefined, workerHandlers: Array<WorkerHandler | InProcessHandler>}} - Startup state. */
118
+ /**
119
+ * Runs capture startup state.
120
+ * @returns {{developmentReloader: DevelopmentReloader | DevelopmentReloaderLike | undefined, netServer: import("net").Server | undefined, workerHandlers: Array<WorkerHandler | InProcessHandler>}} - Startup state.
121
+ */
94
122
  _captureStartupState() {
95
123
  return {
96
124
  developmentReloader: this.developmentReloader,
@@ -99,11 +127,14 @@ export default class VelociousHttpServer {
99
127
  };
100
128
  }
101
129
  /**
130
+ * Runs stop startup resources.
102
131
  * @param {ReturnType<VelociousHttpServer["_captureStartupState"]>} startupState - State captured before startup.
103
132
  * @returns {Promise<void>} - Resolves when cleanup is complete.
104
133
  */
105
134
  async _stopStartupResources(startupState) {
106
- /** @type {import("net").Server | undefined} */
135
+ /**
136
+ * Startup net server.
137
+ @type {import("net").Server | undefined} */
107
138
  const startupNetServer = this.netServer;
108
139
  if (this.developmentReloader && this.developmentReloader !== startupState.developmentReloader) {
109
140
  await this.developmentReloader.stop();
@@ -118,12 +149,18 @@ export default class VelociousHttpServer {
118
149
  this.workerHandlers = startupState.workerHandlers;
119
150
  this.stickyWorkerHandlers.clear();
120
151
  }
121
- /** @returns {Promise<void>} - Resolves when complete. */
152
+ /**
153
+ * Runs net server listen.
154
+ * @returns {Promise<void>} - Resolves when complete.
155
+ */
122
156
  _netServerListen() {
123
157
  return new Promise((resolve, reject) => {
124
158
  if (!this.netServer)
125
159
  throw new Error("No netServer");
126
- /** @param {Error} error - Listen error. */
160
+ /**
161
+ * On listen error.
162
+ * @param {Error} error - Listen error.
163
+ */
127
164
  const onListenError = (error) => {
128
165
  this.netServer?.off("error", onListenError);
129
166
  reject(error);
@@ -141,20 +178,29 @@ export default class VelociousHttpServer {
141
178
  }
142
179
  });
143
180
  }
144
- /** @returns {Promise<void>} - Resolves when complete. */
181
+ /**
182
+ * Runs ensure workers.
183
+ * @returns {Promise<void>} - Resolves when complete.
184
+ */
145
185
  async _ensureWorkers() {
146
186
  while (this.workerHandlers.length < this.workers) {
147
187
  await this.spawnWorker();
148
188
  }
149
189
  }
150
- /** @returns {boolean} - Whether active. */
190
+ /**
191
+ * Runs is active.
192
+ * @returns {boolean} - Whether active.
193
+ */
151
194
  isActive() {
152
195
  if (this.netServer) {
153
196
  return this.netServer.listening;
154
197
  }
155
198
  return false;
156
199
  }
157
- /** @returns {Promise<Record<string, unknown>>} - HTTP server worker diagnostics. */
200
+ /**
201
+ * Runs get debug snapshot.
202
+ * @returns {Promise<Record<string, ?>>} - HTTP server worker diagnostics.
203
+ */
158
204
  async getDebugSnapshot() {
159
205
  return {
160
206
  active: this.isActive(),
@@ -167,8 +213,9 @@ export default class VelociousHttpServer {
167
213
  };
168
214
  }
169
215
  /**
216
+ * Runs worker debug snapshot.
170
217
  * @param {WorkerHandler | InProcessHandler} workerHandler - Worker handler to inspect.
171
- * @returns {Promise<Record<string, unknown>>} Worker debug snapshot.
218
+ * @returns {Promise<Record<string, ?>>} Worker debug snapshot.
172
219
  */
173
220
  async workerDebugSnapshot(workerHandler) {
174
221
  if (workerHandler instanceof WorkerHandler)
@@ -178,8 +225,9 @@ export default class VelociousHttpServer {
178
225
  return { active: false, error: "Unknown worker handler type" };
179
226
  }
180
227
  /**
228
+ * Runs in process worker debug snapshot.
181
229
  * @param {InProcessHandler} workerHandler - In-process worker handler to inspect.
182
- * @returns {Record<string, unknown>} Worker debug snapshot.
230
+ * @returns {Record<string, ?>} Worker debug snapshot.
183
231
  */
184
232
  inProcessWorkerDebugSnapshot(workerHandler) {
185
233
  return {
@@ -189,7 +237,10 @@ export default class VelociousHttpServer {
189
237
  workerCount: workerHandler.workerCount
190
238
  };
191
239
  }
192
- /** @returns {Promise<void>} - Resolves when complete. */
240
+ /**
241
+ * Runs stop clients.
242
+ * @returns {Promise<void>} - Resolves when complete.
243
+ */
193
244
  async stopClients() {
194
245
  const promises = [];
195
246
  for (const clientCount in this.clients) {
@@ -199,6 +250,7 @@ export default class VelociousHttpServer {
199
250
  await Promise.all(promises);
200
251
  }
201
252
  /**
253
+ * Runs stop server.
202
254
  * @param {import("net").Server | undefined} [netServer] - Server to stop.
203
255
  * @returns {Promise<void>} - Resolves when complete.
204
256
  */
@@ -227,7 +279,10 @@ export default class VelociousHttpServer {
227
279
  });
228
280
  });
229
281
  }
230
- /** @returns {Promise<void>} - Resolves when complete. */
282
+ /**
283
+ * Runs stop.
284
+ * @returns {Promise<void>} - Resolves when complete.
285
+ */
231
286
  async stop() {
232
287
  this._stopping = true;
233
288
  await this.developmentReloader?.stop();
@@ -239,11 +294,15 @@ export default class VelociousHttpServer {
239
294
  this.workerHandlers = [];
240
295
  this.stickyWorkerHandlers.clear();
241
296
  }
242
- /** @returns {void} - No return value. */
297
+ /**
298
+ * On close.
299
+ * @returns {void} - No return value.
300
+ */
243
301
  onClose = () => {
244
302
  this.events.emit("close");
245
303
  };
246
304
  /**
305
+ * On server error.
247
306
  * @param {Error} error - Server socket error.
248
307
  * @returns {void} - No return value.
249
308
  */
@@ -251,6 +310,7 @@ export default class VelociousHttpServer {
251
310
  this.logger.error(`Velocious HTTP server socket error on ${this.host}:${this.port}`, error);
252
311
  };
253
312
  /**
313
+ * On connection.
254
314
  * @param {import("net").Socket} socket - Socket instance.
255
315
  * @returns {void} - No return value.
256
316
  */
@@ -285,6 +345,7 @@ export default class VelociousHttpServer {
285
345
  }
286
346
  };
287
347
  /**
348
+ * On client close.
288
349
  * @param {ServerClient} client - Client instance.
289
350
  * @returns {void} - No return value.
290
351
  */
@@ -297,21 +358,32 @@ export default class VelociousHttpServer {
297
358
  this.logger.error(`Expected client to have been removed but length didn't change from ${oldClientsLength} to ${oldClientsLength - 1}`);
298
359
  }
299
360
  };
300
- /** @returns {Promise<void>} - Resolves when complete. */
361
+ /**
362
+ * Runs spawn worker.
363
+ * @returns {Promise<void>} - Resolves when complete.
364
+ */
301
365
  async spawnWorker() {
302
366
  const workerHandler = await this._buildWorkerHandler();
303
367
  this.workerHandlers.push(workerHandler);
304
368
  }
305
- /** @returns {Promise<Array<WorkerHandler | InProcessHandler>>} - Started worker handlers. */
369
+ /**
370
+ * Runs build worker handlers.
371
+ * @returns {Promise<Array<WorkerHandler | InProcessHandler>>} - Started worker handlers.
372
+ */
306
373
  async _buildWorkerHandlers() {
307
- /** @type {Array<WorkerHandler | InProcessHandler>} */
374
+ /**
375
+ * Worker handlers.
376
+ @type {Array<WorkerHandler | InProcessHandler>} */
308
377
  const workerHandlers = [];
309
378
  for (let index = 0; index < this.workers; index += 1) {
310
379
  workerHandlers.push(await this._buildWorkerHandler());
311
380
  }
312
381
  return workerHandlers;
313
382
  }
314
- /** @returns {Promise<WorkerHandler | InProcessHandler>} - Started worker handler. */
383
+ /**
384
+ * Runs build worker handler.
385
+ * @returns {Promise<WorkerHandler | InProcessHandler>} - Started worker handler.
386
+ */
315
387
  async _buildWorkerHandler() {
316
388
  const workerCount = this.workerCount;
317
389
  this.workerCount++;
@@ -326,6 +398,7 @@ export default class VelociousHttpServer {
326
398
  return workerHandler;
327
399
  }
328
400
  /**
401
+ * Runs worker handler to use.
329
402
  * @param {object} [args] - Options object.
330
403
  * @param {string} [args.stickyKey] - Stable key that must keep routing to the same worker.
331
404
  * @returns {WorkerHandler | InProcessHandler} - The worker handler to use.
@@ -342,7 +415,10 @@ export default class VelociousHttpServer {
342
415
  }
343
416
  return this._nextRoundRobinWorkerHandler();
344
417
  }
345
- /** @returns {WorkerHandler | InProcessHandler} - The next round-robin worker handler. */
418
+ /**
419
+ * Runs next round robin worker handler.
420
+ * @returns {WorkerHandler | InProcessHandler} - The next round-robin worker handler.
421
+ */
346
422
  _nextRoundRobinWorkerHandler() {
347
423
  this.logger.debug(`Worker handlers length: ${this.workerHandlers.length}`);
348
424
  const workerHandlerIndex = this.nextWorkerHandlerIndex % this.workerHandlers.length;
@@ -353,11 +429,17 @@ export default class VelociousHttpServer {
353
429
  this.nextWorkerHandlerIndex += 1;
354
430
  return workerHandler;
355
431
  }
356
- /** @returns {boolean} - Whether development worker hot reload should run. */
432
+ /**
433
+ * Runs should use development hot reload.
434
+ * @returns {boolean} - Whether development worker hot reload should run.
435
+ */
357
436
  shouldUseDevelopmentHotReload() {
358
437
  return !this.inProcess && this.configuration.getEnvironment() === "development";
359
438
  }
360
- /** @returns {Promise<void>} - Resolves when watcher setup finishes. */
439
+ /**
440
+ * Runs start development reloader.
441
+ * @returns {Promise<void>} - Resolves when watcher setup finishes.
442
+ */
361
443
  async _startDevelopmentReloader() {
362
444
  if (!this.shouldUseDevelopmentHotReload())
363
445
  return;
@@ -374,7 +456,10 @@ export default class VelociousHttpServer {
374
456
  });
375
457
  await this.developmentReloader.start();
376
458
  }
377
- /** @returns {Promise<void>} - Resolves when workers have been refreshed. */
459
+ /**
460
+ * Runs reload workers for development.
461
+ * @returns {Promise<void>} - Resolves when workers have been refreshed.
462
+ */
378
463
  async reloadWorkersForDevelopment() {
379
464
  if (this._stopping)
380
465
  return;
@@ -399,4 +484,4 @@ export default class VelociousHttpServer {
399
484
  }
400
485
  }
401
486
  }
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRCxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGdCQUFnQixNQUFNLGdDQUFnQyxDQUFBO0FBQzdELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDckIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUE7QUFFckQsaUdBQWlHO0FBQ2pHLGlLQUFpSztBQUVqSzs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxVQUFVLElBQUksQ0FBQyxDQUFBO0lBRTlDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLG1CQUFtQjtJQUN0QyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQix3RUFBd0U7SUFDeEUsbUJBQW1CLENBQUE7SUFFbkIsK0NBQStDO0lBQy9DLFNBQVMsQ0FBQTtJQUVULCtDQUErQztJQUMvQyxvQkFBb0IsQ0FBQTtJQUVwQiw0Q0FBNEM7SUFDNUMsT0FBTyxHQUFH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Q0FBQyxLQUFLLEVBQUUsQ0FBQTtnQkFFakMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNuRixDQUFDLFFBQVEsSUFBSSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQztRQUN0RSxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFBO1FBQzlDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBEZXZlbG9wbWVudFJlbG9hZGVyIGZyb20gXCIuL2RldmVsb3BtZW50LXJlbG9hZGVyLmpzXCJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEluUHJvY2Vzc0hhbmRsZXIgZnJvbSBcIi4vd29ya2VyLWhhbmRsZXIvaW4tcHJvY2Vzcy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IE5ldCBmcm9tIFwibmV0XCJcbmltcG9ydCBTZXJ2ZXJDbGllbnQgZnJvbSBcIi4vc2VydmVyLWNsaWVudC5qc1wiXG5pbXBvcnQgV29ya2VySGFuZGxlciBmcm9tIFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gRGV2ZWxvcG1lbnRSZWxvYWRlckxpa2UgKi9cbi8qKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgd29ya2VyQ291bnQ6IG51bWJlcn0pIDogKFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyKX0gV29ya2VySGFuZGxlckZhY3RvcnkgKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heFdvcmtlcnNdIC0gQmFja3dhcmQtY29tcGF0aWJsZSB3b3JrZXIgY291bnQgYWxpYXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3Mud29ya2Vyc10gLSBDb25maWd1cmVkIHdvcmtlciBjb3VudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTm9ybWFsaXplZCB3b3JrZXIgY291bnQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtlckNvdW50KHttYXhXb3JrZXJzLCB3b3JrZXJzfSkge1xuICBjb25zdCB3b3JrZXJDb3VudCA9IHdvcmtlcnMgPz8gbWF4V29ya2VycyA/PyAxXG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHdvcmtlckNvdW50KSB8fCB3b3JrZXJDb3VudCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIHNlcnZlciB3b3JrZXJzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpXG4gIH1cblxuICByZXR1cm4gd29ya2VyQ291bnRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlciB7XG4gIGNsaWVudENvdW50ID0gMFxuICBfc3RhcnRpbmcgPSBmYWxzZVxuXG4gIC8qKiBAdHlwZSB7RGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkfSAqL1xuICBkZXZlbG9wbWVudFJlbG9hZGVyXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBuZXRTZXJ2ZXJcblxuICAvKiogQHR5cGUge1dvcmtlckhhbmRsZXJGYWN0b3J5IHwgdW5kZWZpbmVkfSAqL1xuICB3b3JrZXJIYW5kbGVyRmFjdG9yeVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgU2VydmVyQ2xpZW50Pn0gICovXG4gIGNsaWVudHMgPSB7fVxuXG4gIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIm5ldFwiKS5Tb2NrZXQ+fSAqL1xuICBfYWN0aXZlU29ja2V0cyA9IG5ldyBTZXQoKVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICB3b3JrZXJDb3VudCA9IDBcblxuICAvKiogQHR5cGUge0FycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgd29ya2VySGFuZGxlcnMgPSBbXVxuICBuZXh0V29ya2VySGFuZGxlckluZGV4ID0gMFxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgc3RpY2t5V29ya2VySGFuZGxlcnMgPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5ob3N0XSAtIEhvc3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaW5Qcm9jZXNzXSAtIFJ1biBIVFRQIGhhbmRsZXJzIGluIHRoZSBtYWluIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtlciB0aHJlYWRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucG9ydF0gLSBQb3J0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4V29ya2Vyc10gLSBNYXggd29ya2Vycy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLndvcmtlcnNdIC0gV29ya2VyIGhhbmRsZXJzIHRvIHN0YXJ0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG9uUmVsb2FkOiBmdW5jdGlvbih7Y2hhbmdlZFBhdGg6IHN0cmluZ30pIDogUHJvbWlzZTx2b2lkPn0pIDoge3N0YXJ0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gW2FyZ3MuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnldIC0gRGV2ZWxvcG1lbnQgcmVsb2FkZXIgZmFjdG9yeS5cbiAgICogQHBhcmFtIHtXb3JrZXJIYW5kbGVyRmFjdG9yeX0gW2FyZ3Mud29ya2VySGFuZGxlckZhY3RvcnldIC0gV29ya2VyIGhhbmRsZXIgZmFjdG9yeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSwgaG9zdCwgaW5Qcm9jZXNzLCBtYXhXb3JrZXJzLCBwb3J0LCB3b3JrZXJIYW5kbGVyRmFjdG9yeSwgd29ya2Vyc30pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeSA9IGRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5XG4gICAgdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeSA9IHdvcmtlckhhbmRsZXJGYWN0b3J5XG4gICAgdGhpcy5pblByb2Nlc3MgPSBpblByb2Nlc3MgfHwgZmFsc2VcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmhvc3QgPSBob3N0ID8/IFwiMC4wLjAuMFwiXG4gICAgdGhpcy5wb3J0ID0gcG9ydCA/PyAzMDA2XG4gICAgdGhpcy53b3JrZXJzID0gbm9ybWFsaXplV29ya2VyQ291bnQoe21heFdvcmtlcnMsIHdvcmtlcnN9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fc3RhcnRpbmcpIHRocm93IG5ldyBFcnJvcihcIlZlbG9jaW91cyBIVFRQIHNlcnZlciBpcyBhbHJlYWR5IHN0YXJ0aW5nXCIpXG4gICAgaWYgKHRoaXMuaXNBY3RpdmUoKSkgdGhyb3cgbmV3IEVycm9yKFwiVmVsb2Npb3VzIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZ1wiKVxuXG4gICAgdGhpcy5fc3RhcnRpbmcgPSB0cnVlXG4gICAgY29uc3Qgc3RhcnR1cFN0YXRlID0gdGhpcy5fY2FwdHVyZVN0YXJ0dXBTdGF0ZSgpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlV29ya2VycygpXG4gICAgICBhd2FpdCB0aGlzLl9zdGFydERldmVsb3BtZW50UmVsb2FkZXIoKVxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyfSAqL1xuICAgICAgY29uc3QgbmV0U2VydmVyID0gbmV3IE5ldC5TZXJ2ZXIoKVxuICAgICAgdGhpcy5uZXRTZXJ2ZXIgPSBuZXRTZXJ2ZXJcbiAgICAgIG5ldFNlcnZlci5vbihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICAgIG5ldFNlcnZlci5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbkNvbm5lY3Rpb24pXG4gICAgICBuZXRTZXJ2ZXIub24oXCJlcnJvclwiLCB0aGlzLm9uU2VydmVyRXJyb3IpXG4gICAgICBhd2FpdCB0aGlzLl9uZXRTZXJ2ZXJMaXN0ZW4oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdGFydGluZyA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt7ZGV2ZWxvcG1lbnRSZWxvYWRlcjogRGV2ZWxvcG1lbnRSZWxvYWRlciB8IERldmVsb3BtZW50UmVsb2FkZXJMaWtlIHwgdW5kZWZpbmVkLCBuZXRTZXJ2ZXI6IGltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWQsIHdvcmtlckhhbmRsZXJzOiBBcnJheTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59fSAtIFN0YXJ0dXAgc3RhdGUuICovXG4gIF9jYXB0dXJlU3RhcnR1cFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXZlbG9wbWVudFJlbG9hZGVyOiB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIsXG4gICAgICBuZXRTZXJ2ZXI6IHRoaXMubmV0U2VydmVyLFxuICAgICAgd29ya2VySGFuZGxlcnM6IFsuLi50aGlzLndvcmtlckhhbmRsZXJzXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8VmVsb2Npb3VzSHR0cFNlcnZlcltcIl9jYXB0dXJlU3RhcnR1cFN0YXRlXCJdPn0gc3RhcnR1cFN0YXRlIC0gU3RhdGUgY2FwdHVyZWQgYmVmb3JlIHN0YXJ0dXAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgY29uc3Qgc3RhcnR1cE5ldFNlcnZlciA9IHRoaXMubmV0U2VydmVyXG5cbiAgICBpZiAodGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyICYmIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciAhPT0gc3RhcnR1cFN0YXRlLmRldmVsb3BtZW50UmVsb2FkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlci5zdG9wKClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnR1cE5ldFNlcnZlciAmJiBzdGFydHVwTmV0U2VydmVyICE9PSBzdGFydHVwU3RhdGUubmV0U2VydmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BTZXJ2ZXIoc3RhcnR1cE5ldFNlcnZlcilcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydHVwV29ya2VySGFuZGxlcnMgPSB0aGlzLndvcmtlckhhbmRsZXJzLmZpbHRlcigod29ya2VySGFuZGxlcikgPT4gIXN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVycy5pbmNsdWRlcyh3b3JrZXJIYW5kbGVyKSlcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHN0YXJ0dXBXb3JrZXJIYW5kbGVycy5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIuc3RvcCgpKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHN0YXJ0dXBTdGF0ZS5kZXZlbG9wbWVudFJlbG9hZGVyXG4gICAgdGhpcy5uZXRTZXJ2ZXIgPSBzdGFydHVwU3RhdGUubmV0U2VydmVyXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IHN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVyc1xuICAgIHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuY2xlYXIoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBfbmV0U2VydmVyTGlzdGVuKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubmV0U2VydmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXRTZXJ2ZXJcIilcblxuICAgICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gTGlzdGVuIGVycm9yLiAqL1xuICAgICAgY29uc3Qgb25MaXN0ZW5FcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm5ldFNlcnZlcj8ub2ZmKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldFNlcnZlci5vbmNlKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgdGhpcy5uZXRTZXJ2ZXIubGlzdGVuKHRoaXMucG9ydCwgdGhpcy5ob3N0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXRTZXJ2ZXI/Lm9mZihcImVycm9yXCIsIG9uTGlzdGVuRXJyb3IpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZlbG9jaW91cyBsaXN0ZW5pbmcgb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWApXG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLiAgKi9cbiAgYXN5bmMgX2Vuc3VyZVdvcmtlcnMoKSB7XG4gICAgd2hpbGUgKHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoIDwgdGhpcy53b3JrZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhY3RpdmUuICAqL1xuICBpc0FjdGl2ZSgpIHtcbiAgICBpZiAodGhpcy5uZXRTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ldFNlcnZlci5saXN0ZW5pbmdcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IC0gSFRUUCBzZXJ2ZXIgd29ya2VyIGRpYWdub3N0aWNzLiAqL1xuICBhc3luYyBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHRoaXMuaXNBY3RpdmUoKSxcbiAgICAgIGFjdGl2ZVNvY2tldENvdW50OiB0aGlzLl9hY3RpdmVTb2NrZXRzLnNpemUsXG4gICAgICBjbGllbnRDb3VudDogT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGgsXG4gICAgICBjb25maWd1cmVkV29ya2VyQ291bnQ6IHRoaXMud29ya2VycyxcbiAgICAgIGluUHJvY2VzczogdGhpcy5pblByb2Nlc3MsXG4gICAgICB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGgsXG4gICAgICB3b3JrZXJzOiBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndvcmtlckhhbmRsZXJzLm1hcCgoaGFuZGxlcikgPT4gdGhpcy53b3JrZXJEZWJ1Z1NuYXBzaG90KGhhbmRsZXIpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcn0gd29ya2VySGFuZGxlciAtIFdvcmtlciBoYW5kbGVyIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pn0gV29ya2VyIGRlYnVnIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgd29ya2VyRGVidWdTbmFwc2hvdCh3b3JrZXJIYW5kbGVyKSB7XG4gICAgaWYgKHdvcmtlckhhbmRsZXIgaW5zdGFuY2VvZiBXb3JrZXJIYW5kbGVyKSByZXR1cm4gYXdhaXQgd29ya2VySGFuZGxlci5nZXREZWJ1Z1NuYXBzaG90KClcbiAgICBpZiAod29ya2VySGFuZGxlciBpbnN0YW5jZW9mIEluUHJvY2Vzc0hhbmRsZXIpIHJldHVybiB0aGlzLmluUHJvY2Vzc1dvcmtlckRlYnVnU25hcHNob3Qod29ya2VySGFuZGxlcilcblxuICAgIHJldHVybiB7YWN0aXZlOiBmYWxzZSwgZXJyb3I6IFwiVW5rbm93biB3b3JrZXIgaGFuZGxlciB0eXBlXCJ9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtJblByb2Nlc3NIYW5kbGVyfSB3b3JrZXJIYW5kbGVyIC0gSW4tcHJvY2VzcyB3b3JrZXIgaGFuZGxlciB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdvcmtlciBkZWJ1ZyBzbmFwc2hvdC5cbiAgICovXG4gIGluUHJvY2Vzc1dvcmtlckRlYnVnU25hcHNob3Qod29ya2VySGFuZGxlcikge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICBjbGllbnRDb3VudDogT2JqZWN0LmtleXMod29ya2VySGFuZGxlci5jbGllbnRzKS5sZW5ndGgsXG4gICAgICBzbmFwc2hvdDogd29ya2VySGFuZGxlci5jb25maWd1cmF0aW9uLmdldExvY2FsRGVidWdTbmFwc2hvdCgpLFxuICAgICAgd29ya2VyQ291bnQ6IHdvcmtlckhhbmRsZXIud29ya2VyQ291bnRcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIGFzeW5jIHN0b3BDbGllbnRzKCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gW11cblxuICAgIGZvciAoY29uc3QgY2xpZW50Q291bnQgaW4gdGhpcy5jbGllbnRzKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICAgIHByb21pc2VzLnB1c2goY2xpZW50LmVuZCgpKVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwibmV0XCIpLlNlcnZlciB8IHVuZGVmaW5lZH0gW25ldFNlcnZlcl0gLSBTZXJ2ZXIgdG8gc3RvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIHN0b3BTZXJ2ZXIobmV0U2VydmVyID0gdGhpcy5uZXRTZXJ2ZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFuZXRTZXJ2ZXIgfHwgIW5ldFNlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAobmV0U2VydmVyID09PSB0aGlzLm5ldFNlcnZlcikge1xuICAgICAgICAvLyBGb3JjZS1jbG9zZSBsaW5nZXJpbmcgc29ja2V0cyAoZS5nLiBXZWJTb2NrZXQgdXBncmFkZVxuICAgICAgICAvLyBjb25uZWN0aW9ucyBtaWQtY2xvc2UtaGFuZHNoYWtlKSBzbyB0aGUgcG9ydCBpcyByZWxlYXNlZFxuICAgICAgICAvLyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGdyYWNlZnVsIGRyYWluLlxuICAgICAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiB0aGlzLl9hY3RpdmVTb2NrZXRzKSB7XG4gICAgICAgICAgc29ja2V0LmRlc3Ryb3koKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlU29ja2V0cy5jbGVhcigpXG4gICAgICB9XG5cbiAgICAgIG5ldFNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS4gICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5fc3RvcHBpbmcgPSB0cnVlXG4gICAgYXdhaXQgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyPy5zdG9wKClcbiAgICB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIgPSB1bmRlZmluZWRcbiAgICBhd2FpdCB0aGlzLnN0b3BDbGllbnRzKClcbiAgICBhd2FpdCB0aGlzLnN0b3BTZXJ2ZXIoKVxuXG4gICAgY29uc3Qgc3RvcFRhc2tzID0gdGhpcy53b3JrZXJIYW5kbGVycy5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIuc3RvcCgpKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHN0b3BUYXNrcylcbiAgICB0aGlzLndvcmtlckhhbmRsZXJzID0gW11cbiAgICB0aGlzLnN0aWNreVdvcmtlckhhbmRsZXJzLmNsZWFyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuICAqL1xuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJjbG9zZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gU2VydmVyIHNvY2tldCBlcnJvci5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25TZXJ2ZXJFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmVycm9yKGBWZWxvY2lvdXMgSFRUUCBzZXJ2ZXIgc29ja2V0IGVycm9yIG9uICR7dGhpcy5ob3N0fToke3RoaXMucG9ydH1gLCBlcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIm5ldFwiKS5Tb2NrZXR9IHNvY2tldCAtIFNvY2tldCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgb25Db25uZWN0aW9uID0gKHNvY2tldCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gdGhpcy5jbGllbnRDb3VudFxuXG4gICAgdGhpcy5fYWN0aXZlU29ja2V0cy5hZGQoc29ja2V0KVxuICAgIHNvY2tldC5vbmNlKFwiY2xvc2VcIiwgKCkgPT4gdGhpcy5fYWN0aXZlU29ja2V0cy5kZWxldGUoc29ja2V0KSlcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIk5ldyBjbGllbnRcIiwge1xuICAgICAgY2xpZW50Q291bnQsXG4gICAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHJlbW90ZUZhbWlseTogc29ja2V0LnJlbW90ZUZhbWlseSxcbiAgICAgIHJlbW90ZVBvcnQ6IHNvY2tldC5yZW1vdGVQb3J0XG4gICAgfV0pXG4gICAgdGhpcy5jbGllbnRDb3VudCsrXG5cbiAgICB0cnkge1xuICAgICAgLy8gUGF1c2VkIFdlYlNvY2tldCBzZXNzaW9ucyBhcmUgd29ya2VyLWxvY2FsLCBzbyByZWNvbm5lY3RzIGZyb21cbiAgICAgIC8vIHRoZSBzYW1lIGNsaWVudCBhZGRyZXNzIG11c3QgcmV0dXJuIHRvIHRoZSBzYW1lIHdvcmtlci5cbiAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLndvcmtlckhhbmRsZXJUb1VzZSh7c3RpY2t5S2V5OiBzb2NrZXQucmVtb3RlQWRkcmVzc30pXG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgU2VydmVyQ2xpZW50KHtcbiAgICAgICAgY2xpZW50Q291bnQsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgc29ja2V0XG4gICAgICB9KVxuXG4gICAgICBjbGllbnQuZXZlbnRzLm9uKFwiY2xvc2VcIiwgdGhpcy5vbkNsaWVudENsb3NlKVxuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgR2F2ZSBjbGllbnQgJHtjbGllbnRDb3VudH0gdG8gd29ya2VyICR7d29ya2VySGFuZGxlci53b3JrZXJDb3VudH1gKVxuICAgICAgd29ya2VySGFuZGxlci5hZGRTb2NrZXRDb25uZWN0aW9uKGNsaWVudClcbiAgICAgIHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF0gPSBjbGllbnRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGNsaWVudCAke2NsaWVudENvdW50fSBvbiBuZXcgY29ubmVjdGlvbmAsIGVycm9yKVxuICAgICAgc29ja2V0LmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1NlcnZlckNsaWVudH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkNsaWVudENsb3NlID0gKGNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gZGlnZyhjbGllbnQsIFwiY2xpZW50Q291bnRcIilcbiAgICBjb25zdCBvbGRDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICBjb25zdCBuZXdDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGlmIChuZXdDbGllbnRzTGVuZ3RoICE9IChvbGRDbGllbnRzTGVuZ3RoIC0gMSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFeHBlY3RlZCBjbGllbnQgdG8gaGF2ZSBiZWVuIHJlbW92ZWQgYnV0IGxlbmd0aCBkaWRuJ3QgY2hhbmdlIGZyb20gJHtvbGRDbGllbnRzTGVuZ3RofSB0byAke29sZENsaWVudHNMZW5ndGggLSAxfWApXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuICAqL1xuICBhc3luYyBzcGF3bldvcmtlcigpIHtcbiAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gYXdhaXQgdGhpcy5fYnVpbGRXb3JrZXJIYW5kbGVyKClcblxuICAgIHRoaXMud29ya2VySGFuZGxlcnMucHVzaCh3b3JrZXJIYW5kbGVyKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPj59IC0gU3RhcnRlZCB3b3JrZXIgaGFuZGxlcnMuICovXG4gIGFzeW5jIF9idWlsZFdvcmtlckhhbmRsZXJzKCkge1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+fSAqL1xuICAgIGNvbnN0IHdvcmtlckhhbmRsZXJzID0gW11cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLndvcmtlcnM7IGluZGV4ICs9IDEpIHtcbiAgICAgIHdvcmtlckhhbmRsZXJzLnB1c2goYXdhaXQgdGhpcy5fYnVpbGRXb3JrZXJIYW5kbGVyKCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtlckhhbmRsZXJzXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+fSAtIFN0YXJ0ZWQgd29ya2VyIGhhbmRsZXIuICovXG4gIGFzeW5jIF9idWlsZFdvcmtlckhhbmRsZXIoKSB7XG4gICAgY29uc3Qgd29ya2VyQ291bnQgPSB0aGlzLndvcmtlckNvdW50XG5cbiAgICB0aGlzLndvcmtlckNvdW50KytcblxuICAgIGNvbnN0IEhhbmRsZXIgPSB0aGlzLmluUHJvY2VzcyA/IEluUHJvY2Vzc0hhbmRsZXIgOiBXb3JrZXJIYW5kbGVyXG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMud29ya2VySGFuZGxlckZhY3RvcnlcbiAgICAgID8gdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pXG4gICAgICA6IG5ldyBIYW5kbGVyKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICB3b3JrZXJDb3VudFxuICAgICAgfSlcblxuICAgIGF3YWl0IHdvcmtlckhhbmRsZXIuc3RhcnQoKVxuXG4gICAgcmV0dXJuIHdvcmtlckhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zdGlja3lLZXldIC0gU3RhYmxlIGtleSB0aGF0IG11c3Qga2VlcCByb3V0aW5nIHRvIHRoZSBzYW1lIHdvcmtlci5cbiAgICogQHJldHVybnMge1dvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyfSAtIFRoZSB3b3JrZXIgaGFuZGxlciB0byB1c2UuXG4gICAqL1xuICB3b3JrZXJIYW5kbGVyVG9Vc2Uoe3N0aWNreUtleX0gPSB7fSkge1xuICAgIGlmIChzdGlja3lLZXkpIHtcbiAgICAgIGNvbnN0IHN0aWNreVdvcmtlckhhbmRsZXIgPSB0aGlzLnN0aWNreVdvcmtlckhhbmRsZXJzLmdldChzdGlja3lLZXkpXG5cbiAgICAgIGlmIChzdGlja3lXb3JrZXJIYW5kbGVyICYmIHRoaXMud29ya2VySGFuZGxlcnMuaW5jbHVkZXMoc3RpY2t5V29ya2VySGFuZGxlcikpIHtcbiAgICAgICAgcmV0dXJuIHN0aWNreVdvcmtlckhhbmRsZXJcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMuX25leHRSb3VuZFJvYmluV29ya2VySGFuZGxlcigpXG5cbiAgICAgIHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuc2V0KHN0aWNreUtleSwgd29ya2VySGFuZGxlcilcblxuICAgICAgcmV0dXJuIHdvcmtlckhhbmRsZXJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbmV4dFJvdW5kUm9iaW5Xb3JrZXJIYW5kbGVyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXJ9IC0gVGhlIG5leHQgcm91bmQtcm9iaW4gd29ya2VyIGhhbmRsZXIuICovXG4gIF9uZXh0Um91bmRSb2JpbldvcmtlckhhbmRsZXIoKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFdvcmtlciBoYW5kbGVycyBsZW5ndGg6ICR7dGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGh9YClcblxuICAgIGNvbnN0IHdvcmtlckhhbmRsZXJJbmRleCA9IHRoaXMubmV4dFdvcmtlckhhbmRsZXJJbmRleCAlIHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoXG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMud29ya2VySGFuZGxlcnNbd29ya2VySGFuZGxlckluZGV4XVxuXG4gICAgaWYgKCF3b3JrZXJIYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHdvcmtlckhhbmRsZXIgYnkgdGhhdCBudW1iZXI6ICR7d29ya2VySGFuZGxlckluZGV4fWApXG4gICAgfVxuXG4gICAgdGhpcy5uZXh0V29ya2VySGFuZGxlckluZGV4ICs9IDFcblxuICAgIHJldHVybiB3b3JrZXJIYW5kbGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBkZXZlbG9wbWVudCB3b3JrZXIgaG90IHJlbG9hZCBzaG91bGQgcnVuLiAqL1xuICBzaG91bGRVc2VEZXZlbG9wbWVudEhvdFJlbG9hZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5Qcm9jZXNzICYmIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcImRldmVsb3BtZW50XCJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHdhdGNoZXIgc2V0dXAgZmluaXNoZXMuICovXG4gIGFzeW5jIF9zdGFydERldmVsb3BtZW50UmVsb2FkZXIoKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVzZURldmVsb3BtZW50SG90UmVsb2FkKCkpIHJldHVyblxuICAgIGlmICh0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIpIHJldHVyblxuXG4gICAgY29uc3QgY3JlYXRlRGV2ZWxvcG1lbnRSZWxvYWRlciA9IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnlcbiAgICAgIHx8ICgoYXJncykgPT4gbmV3IERldmVsb3BtZW50UmVsb2FkZXIoYXJncykpXG5cbiAgICB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXIgPSBjcmVhdGVEZXZlbG9wbWVudFJlbG9hZGVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgIG9uUmVsb2FkOiBhc3luYyAoe2NoYW5nZWRQYXRofSkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5pbmZvKGBEZXZlbG9wbWVudCBob3QgcmVsb2FkIGRldGVjdGVkIGNoYW5nZSBpbiAke2NoYW5nZWRQYXRofWApXG4gICAgICAgIGF3YWl0IHRoaXMucmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50KClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyLnN0YXJ0KClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHdvcmtlcnMgaGF2ZSBiZWVuIHJlZnJlc2hlZC4gKi9cbiAgYXN5bmMgcmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50KCkge1xuICAgIGlmICh0aGlzLl9zdG9wcGluZykgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fcmVsb2FkaW5nV29ya2Vyc0ZvckRldmVsb3BtZW50KSB7XG4gICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgZG8ge1xuICAgICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IG9sZFdvcmtlckhhbmRsZXJzID0gWy4uLnRoaXMud29ya2VySGFuZGxlcnNdXG4gICAgICAgIGNvbnN0IG5ld1dvcmtlckhhbmRsZXJzID0gYXdhaXQgdGhpcy5fYnVpbGRXb3JrZXJIYW5kbGVycygpXG5cbiAgICAgICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IG5ld1dvcmtlckhhbmRsZXJzXG4gICAgICAgIHRoaXMubmV4dFdvcmtlckhhbmRsZXJJbmRleCA9IDBcbiAgICAgICAgdGhpcy5zdGlja3lXb3JrZXJIYW5kbGVycy5jbGVhcigpXG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwob2xkV29ya2VySGFuZGxlcnMubWFwKCh3b3JrZXJIYW5kbGVyKSA9PiB3b3JrZXJIYW5kbGVyLnN0b3AoKSkpXG4gICAgICB9IHdoaWxlICh0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgJiYgIXRoaXMuX3N0b3BwaW5nKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQgPSBmYWxzZVxuICAgIH1cbiAgfVxufVxuIl19
487
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRCxPQUFPLFlBQVksTUFBTSwyQkFBMkIsQ0FBQTtBQUNwRCxPQUFPLGdCQUFnQixNQUFNLGdDQUFnQyxDQUFBO0FBQzdELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUE7QUFDckIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUE7QUFFckQ7OytGQUUrRjtBQUMvRjs7K0pBRStKO0FBRS9KOzs7Ozs7R0FNRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sSUFBSSxVQUFVLElBQUksQ0FBQyxDQUFBO0lBRTlDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLG1CQUFtQjtJQUN0QyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUVqQjs7MEVBRXNFO0lBQ3RFLG1CQUFtQixDQUFBO0lBRW5COztpREFFNkM7SUFDN0MsU0FBUyxDQUFBO0lBRVQ7O2lEQUU2QztJQUM3QyxvQkFBb0IsQ0FBQTtJQUVwQjs7OENBRTBDO0lBQzFDLE9B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QUFvQixDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUVqQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ25GLENBQUMsUUFBUSxJQUFJLENBQUMsa0NBQWtDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDO1FBQ3RFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUE7UUFDOUMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IERldmVsb3BtZW50UmVsb2FkZXIgZnJvbSBcIi4vZGV2ZWxvcG1lbnQtcmVsb2FkZXIuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgSW5Qcm9jZXNzSGFuZGxlciBmcm9tIFwiLi93b3JrZXItaGFuZGxlci9pbi1wcm9jZXNzLmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgTmV0IGZyb20gXCJuZXRcIlxuaW1wb3J0IFNlcnZlckNsaWVudCBmcm9tIFwiLi9zZXJ2ZXItY2xpZW50LmpzXCJcbmltcG9ydCBXb3JrZXJIYW5kbGVyIGZyb20gXCIuL3dvcmtlci1oYW5kbGVyL2luZGV4LmpzXCJcblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAgQHR5cGVkZWYge3tzdGFydDogKCkgPT4gUHJvbWlzZTx2b2lkPiwgc3RvcDogKCkgPT4gUHJvbWlzZTx2b2lkPn19IERldmVsb3BtZW50UmVsb2FkZXJMaWtlICovXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgd29ya2VyQ291bnQ6IG51bWJlcn0pIDogKFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyKX0gV29ya2VySGFuZGxlckZhY3RvcnkgKi9cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSB3b3JrZXIgY291bnQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heFdvcmtlcnNdIC0gQmFja3dhcmQtY29tcGF0aWJsZSB3b3JrZXIgY291bnQgYWxpYXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2FyZ3Mud29ya2Vyc10gLSBDb25maWd1cmVkIHdvcmtlciBjb3VudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTm9ybWFsaXplZCB3b3JrZXIgY291bnQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdvcmtlckNvdW50KHttYXhXb3JrZXJzLCB3b3JrZXJzfSkge1xuICBjb25zdCB3b3JrZXJDb3VudCA9IHdvcmtlcnMgPz8gbWF4V29ya2VycyA/PyAxXG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHdvcmtlckNvdW50KSB8fCB3b3JrZXJDb3VudCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIHNlcnZlciB3b3JrZXJzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXCIpXG4gIH1cblxuICByZXR1cm4gd29ya2VyQ291bnRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlciB7XG4gIGNsaWVudENvdW50ID0gMFxuICBfc3RhcnRpbmcgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgQHR5cGUge0RldmVsb3BtZW50UmVsb2FkZXIgfCBEZXZlbG9wbWVudFJlbG9hZGVyTGlrZSB8IHVuZGVmaW5lZH0gKi9cbiAgZGV2ZWxvcG1lbnRSZWxvYWRlclxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgQHR5cGUge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIG5ldFNlcnZlclxuXG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgQHR5cGUge1dvcmtlckhhbmRsZXJGYWN0b3J5IHwgdW5kZWZpbmVkfSAqL1xuICB3b3JrZXJIYW5kbGVyRmFjdG9yeVxuXG4gIC8qKlxuICAgKiBDbGllbnRzLlxuICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBTZXJ2ZXJDbGllbnQ+fSAgKi9cbiAgY2xpZW50cyA9IHt9XG5cbiAgLyoqXG4gICAqIEFjdGl2ZSBzb2NrZXRzLlxuICAgIEB0eXBlIHtTZXQ8aW1wb3J0KFwibmV0XCIpLlNvY2tldD59ICovXG4gIF9hY3RpdmVTb2NrZXRzID0gbmV3IFNldCgpXG5cbiAgZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIHdvcmtlckNvdW50ID0gMFxuXG4gIC8qKlxuICAgKiBXb3JrZXIgaGFuZGxlcnMuXG4gICAgQHR5cGUge0FycmF5PFdvcmtlckhhbmRsZXIgfCBJblByb2Nlc3NIYW5kbGVyPn0gKi9cbiAgd29ya2VySGFuZGxlcnMgPSBbXVxuICBuZXh0V29ya2VySGFuZGxlckluZGV4ID0gMFxuICAvKipcbiAgICogU3RpY2t5IHdvcmtlciBoYW5kbGVycy5cbiAgICBAdHlwZSB7TWFwPHN0cmluZywgV29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+fSAqL1xuICBzdGlja3lXb3JrZXJIYW5kbGVycyA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmhvc3RdIC0gSG9zdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5wb3J0XSAtIFBvcnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhXb3JrZXJzXSAtIE1heCB3b3JrZXJzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3Mud29ya2Vyc10gLSBXb3JrZXIgaGFuZGxlcnMgdG8gc3RhcnQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgb25SZWxvYWQ6IGZ1bmN0aW9uKHtjaGFuZ2VkUGF0aDogc3RyaW5nfSkgOiBQcm9taXNlPHZvaWQ+fSkgOiB7c3RhcnQ6ICgpID0+IFByb21pc2U8dm9pZD4sIHN0b3A6ICgpID0+IFByb21pc2U8dm9pZD59fSBbYXJncy5kZXZlbG9wbWVudFJlbG9hZGVyRmFjdG9yeV0gLSBEZXZlbG9wbWVudCByZWxvYWRlciBmYWN0b3J5LlxuICAgKiBAcGFyYW0ge1dvcmtlckhhbmRsZXJGYWN0b3J5fSBbYXJncy53b3JrZXJIYW5kbGVyRmFjdG9yeV0gLSBXb3JrZXIgaGFuZGxlciBmYWN0b3J5LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5LCBob3N0LCBpblByb2Nlc3MsIG1heFdvcmtlcnMsIHBvcnQsIHdvcmtlckhhbmRsZXJGYWN0b3J5LCB3b3JrZXJzfSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5ID0gZGV2ZWxvcG1lbnRSZWxvYWRlckZhY3RvcnlcbiAgICB0aGlzLndvcmtlckhhbmRsZXJGYWN0b3J5ID0gd29ya2VySGFuZGxlckZhY3RvcnlcbiAgICB0aGlzLmluUHJvY2VzcyA9IGluUHJvY2VzcyB8fCBmYWxzZVxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIHRoaXMuaG9zdCA9IGhvc3QgPz8gXCIwLjAuMC4wXCJcbiAgICB0aGlzLnBvcnQgPSBwb3J0ID8/IDMwMDZcbiAgICB0aGlzLndvcmtlcnMgPSBub3JtYWxpemVXb3JrZXJDb3VudCh7bWF4V29ya2Vycywgd29ya2Vyc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLl9zdGFydGluZykgdGhyb3cgbmV3IEVycm9yKFwiVmVsb2Npb3VzIEhUVFAgc2VydmVyIGlzIGFscmVhZHkgc3RhcnRpbmdcIilcbiAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB0aHJvdyBuZXcgRXJyb3IoXCJWZWxvY2lvdXMgSFRUUCBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nXCIpXG5cbiAgICB0aGlzLl9zdGFydGluZyA9IHRydWVcbiAgICBjb25zdCBzdGFydHVwU3RhdGUgPSB0aGlzLl9jYXB0dXJlU3RhcnR1cFN0YXRlKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVXb3JrZXJzKClcbiAgICAgIGF3YWl0IHRoaXMuX3N0YXJ0RGV2ZWxvcG1lbnRSZWxvYWRlcigpXG4gICAgICAvKipcbiAgICAgICAqIE5ldCBzZXJ2ZXIuXG4gICAgICAgIEB0eXBlIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyfSAqL1xuICAgICAgY29uc3QgbmV0U2VydmVyID0gbmV3IE5ldC5TZXJ2ZXIoKVxuICAgICAgdGhpcy5uZXRTZXJ2ZXIgPSBuZXRTZXJ2ZXJcbiAgICAgIG5ldFNlcnZlci5vbihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICAgIG5ldFNlcnZlci5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbkNvbm5lY3Rpb24pXG4gICAgICBuZXRTZXJ2ZXIub24oXCJlcnJvclwiLCB0aGlzLm9uU2VydmVyRXJyb3IpXG4gICAgICBhd2FpdCB0aGlzLl9uZXRTZXJ2ZXJMaXN0ZW4oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zdG9wU3RhcnR1cFJlc291cmNlcyhzdGFydHVwU3RhdGUpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdGFydGluZyA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2FwdHVyZSBzdGFydHVwIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7e2RldmVsb3BtZW50UmVsb2FkZXI6IERldmVsb3BtZW50UmVsb2FkZXIgfCBEZXZlbG9wbWVudFJlbG9hZGVyTGlrZSB8IHVuZGVmaW5lZCwgbmV0U2VydmVyOiBpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkLCB3b3JrZXJIYW5kbGVyczogQXJyYXk8V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+fX0gLSBTdGFydHVwIHN0YXRlLlxuICAgKi9cbiAgX2NhcHR1cmVTdGFydHVwU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmVsb3BtZW50UmVsb2FkZXI6IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlcixcbiAgICAgIG5ldFNlcnZlcjogdGhpcy5uZXRTZXJ2ZXIsXG4gICAgICB3b3JrZXJIYW5kbGVyczogWy4uLnRoaXMud29ya2VySGFuZGxlcnNdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RvcCBzdGFydHVwIHJlc291cmNlcy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPFZlbG9jaW91c0h0dHBTZXJ2ZXJbXCJfY2FwdHVyZVN0YXJ0dXBTdGF0ZVwiXT59IHN0YXJ0dXBTdGF0ZSAtIFN0YXRlIGNhcHR1cmVkIGJlZm9yZSBzdGFydHVwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNsZWFudXAgaXMgY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfc3RvcFN0YXJ0dXBSZXNvdXJjZXMoc3RhcnR1cFN0YXRlKSB7XG4gICAgLyoqXG4gICAgICogU3RhcnR1cCBuZXQgc2VydmVyLlxuICAgICAgQHR5cGUge2ltcG9ydChcIm5ldFwiKS5TZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gICAgY29uc3Qgc3RhcnR1cE5ldFNlcnZlciA9IHRoaXMubmV0U2VydmVyXG5cbiAgICBpZiAodGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyICYmIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciAhPT0gc3RhcnR1cFN0YXRlLmRldmVsb3BtZW50UmVsb2FkZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlci5zdG9wKClcbiAgICB9XG5cbiAgICBpZiAoc3RhcnR1cE5ldFNlcnZlciAmJiBzdGFydHVwTmV0U2VydmVyICE9PSBzdGFydHVwU3RhdGUubmV0U2VydmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BTZXJ2ZXIoc3RhcnR1cE5ldFNlcnZlcilcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydHVwV29ya2VySGFuZGxlcnMgPSB0aGlzLndvcmtlckhhbmRsZXJzLmZpbHRlcigod29ya2VySGFuZGxlcikgPT4gIXN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVycy5pbmNsdWRlcyh3b3JrZXJIYW5kbGVyKSlcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHN0YXJ0dXBXb3JrZXJIYW5kbGVycy5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIuc3RvcCgpKSlcblxuICAgIHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlciA9IHN0YXJ0dXBTdGF0ZS5kZXZlbG9wbWVudFJlbG9hZGVyXG4gICAgdGhpcy5uZXRTZXJ2ZXIgPSBzdGFydHVwU3RhdGUubmV0U2VydmVyXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IHN0YXJ0dXBTdGF0ZS53b3JrZXJIYW5kbGVyc1xuICAgIHRoaXMuc3RpY2t5V29ya2VySGFuZGxlcnMuY2xlYXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmV0IHNlcnZlciBsaXN0ZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBfbmV0U2VydmVyTGlzdGVuKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubmV0U2VydmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXRTZXJ2ZXJcIilcblxuICAgICAgLyoqXG4gICAgICAgKiBPbiBsaXN0ZW4gZXJyb3IuXG4gICAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIExpc3RlbiBlcnJvci5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgb25MaXN0ZW5FcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm5ldFNlcnZlcj8ub2ZmKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldFNlcnZlci5vbmNlKFwiZXJyb3JcIiwgb25MaXN0ZW5FcnJvcilcbiAgICAgICAgdGhpcy5uZXRTZXJ2ZXIubGlzdGVuKHRoaXMucG9ydCwgdGhpcy5ob3N0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZXRTZXJ2ZXI/Lm9mZihcImVycm9yXCIsIG9uTGlzdGVuRXJyb3IpXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZlbG9jaW91cyBsaXN0ZW5pbmcgb24gJHt0aGlzLmhvc3R9OiR7dGhpcy5wb3J0fWApXG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVuc3VyZSB3b3JrZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZVdvcmtlcnMoKSB7XG4gICAgd2hpbGUgKHRoaXMud29ya2VySGFuZGxlcnMubGVuZ3RoIDwgdGhpcy53b3JrZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBpcyBhY3RpdmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYWN0aXZlLlxuICAgKi9cbiAgaXNBY3RpdmUoKSB7XG4gICAgaWYgKHRoaXMubmV0U2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXRTZXJ2ZXIubGlzdGVuaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gLSBIVFRQIHNlcnZlciB3b3JrZXIgZGlhZ25vc3RpY3MuXG4gICAqL1xuICBhc3luYyBnZXREZWJ1Z1NuYXBzaG90KCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHRoaXMuaXNBY3RpdmUoKSxcbiAgICAgIGFjdGl2ZVNvY2tldENvdW50OiB0aGlzLl9hY3RpdmVTb2NrZXRzLnNpemUsXG4gICAgICBjbGllbnRDb3VudDogT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGgsXG4gICAgICBjb25maWd1cmVkV29ya2VyQ291bnQ6IHRoaXMud29ya2VycyxcbiAgICAgIGluUHJvY2VzczogdGhpcy5pblByb2Nlc3MsXG4gICAgICB3b3JrZXJDb3VudDogdGhpcy53b3JrZXJIYW5kbGVycy5sZW5ndGgsXG4gICAgICB3b3JrZXJzOiBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLndvcmtlckhhbmRsZXJzLm1hcCgoaGFuZGxlcikgPT4gdGhpcy53b3JrZXJEZWJ1Z1NuYXBzaG90KGhhbmRsZXIpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3b3JrZXIgZGVidWcgc25hcHNob3QuXG4gICAqIEBwYXJhbSB7V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXJ9IHdvcmtlckhhbmRsZXIgLSBXb3JrZXIgaGFuZGxlciB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFdvcmtlciBkZWJ1ZyBzbmFwc2hvdC5cbiAgICovXG4gIGFzeW5jIHdvcmtlckRlYnVnU25hcHNob3Qod29ya2VySGFuZGxlcikge1xuICAgIGlmICh3b3JrZXJIYW5kbGVyIGluc3RhbmNlb2YgV29ya2VySGFuZGxlcikgcmV0dXJuIGF3YWl0IHdvcmtlckhhbmRsZXIuZ2V0RGVidWdTbmFwc2hvdCgpXG4gICAgaWYgKHdvcmtlckhhbmRsZXIgaW5zdGFuY2VvZiBJblByb2Nlc3NIYW5kbGVyKSByZXR1cm4gdGhpcy5pblByb2Nlc3NXb3JrZXJEZWJ1Z1NuYXBzaG90KHdvcmtlckhhbmRsZXIpXG5cbiAgICByZXR1cm4ge2FjdGl2ZTogZmFsc2UsIGVycm9yOiBcIlVua25vd24gd29ya2VyIGhhbmRsZXIgdHlwZVwifVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW4gcHJvY2VzcyB3b3JrZXIgZGVidWcgc25hcHNob3QuXG4gICAqIEBwYXJhbSB7SW5Qcm9jZXNzSGFuZGxlcn0gd29ya2VySGFuZGxlciAtIEluLXByb2Nlc3Mgd29ya2VyIGhhbmRsZXIgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsID8+fSBXb3JrZXIgZGVidWcgc25hcHNob3QuXG4gICAqL1xuICBpblByb2Nlc3NXb3JrZXJEZWJ1Z1NuYXBzaG90KHdvcmtlckhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgY2xpZW50Q291bnQ6IE9iamVjdC5rZXlzKHdvcmtlckhhbmRsZXIuY2xpZW50cykubGVuZ3RoLFxuICAgICAgc25hcHNob3Q6IHdvcmtlckhhbmRsZXIuY29uZmlndXJhdGlvbi5nZXRMb2NhbERlYnVnU25hcHNob3QoKSxcbiAgICAgIHdvcmtlckNvdW50OiB3b3JrZXJIYW5kbGVyLndvcmtlckNvdW50XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RvcCBjbGllbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc3RvcENsaWVudHMoKSB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBjbGllbnRDb3VudCBpbiB0aGlzLmNsaWVudHMpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50c1tjbGllbnRDb3VudF1cblxuICAgICAgcHJvbWlzZXMucHVzaChjbGllbnQuZW5kKCkpXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wIHNlcnZlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJuZXRcIikuU2VydmVyIHwgdW5kZWZpbmVkfSBbbmV0U2VydmVyXSAtIFNlcnZlciB0byBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgc3RvcFNlcnZlcihuZXRTZXJ2ZXIgPSB0aGlzLm5ldFNlcnZlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIW5ldFNlcnZlciB8fCAhbmV0U2VydmVyLmxpc3RlbmluZykge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChuZXRTZXJ2ZXIgPT09IHRoaXMubmV0U2VydmVyKSB7XG4gICAgICAgIC8vIEZvcmNlLWNsb3NlIGxpbmdlcmluZyBzb2NrZXRzIChlLmcuIFdlYlNvY2tldCB1cGdyYWRlXG4gICAgICAgIC8vIGNvbm5lY3Rpb25zIG1pZC1jbG9zZS1oYW5kc2hha2UpIHNvIHRoZSBwb3J0IGlzIHJlbGVhc2VkXG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgZ3JhY2VmdWwgZHJhaW4uXG4gICAgICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIHRoaXMuX2FjdGl2ZVNvY2tldHMpIHtcbiAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmVTb2NrZXRzLmNsZWFyKClcbiAgICAgIH1cblxuICAgICAgbmV0U2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0b3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuX3N0b3BwaW5nID0gdHJ1ZVxuICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlcj8uc3RvcCgpXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgdGhpcy5zdG9wQ2xpZW50cygpXG4gICAgYXdhaXQgdGhpcy5zdG9wU2VydmVyKClcblxuICAgIGNvbnN0IHN0b3BUYXNrcyA9IHRoaXMud29ya2VySGFuZGxlcnMubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyLnN0b3AoKSlcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzdG9wVGFza3MpXG4gICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IFtdXG4gICAgdGhpcy5zdGlja3lXb3JrZXJIYW5kbGVycy5jbGVhcigpXG4gIH1cblxuICAvKipcbiAgICogT24gY2xvc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNsb3NlXCIpXG4gIH1cblxuICAvKipcbiAgICogT24gc2VydmVyIGVycm9yLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFNlcnZlciBzb2NrZXQgZXJyb3IuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgVmVsb2Npb3VzIEhUVFAgc2VydmVyIHNvY2tldCBlcnJvciBvbiAke3RoaXMuaG9zdH06JHt0aGlzLnBvcnR9YCwgZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogT24gY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJuZXRcIikuU29ja2V0fSBzb2NrZXQgLSBTb2NrZXQgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG9uQ29ubmVjdGlvbiA9IChzb2NrZXQpID0+IHtcbiAgICBjb25zdCBjbGllbnRDb3VudCA9IHRoaXMuY2xpZW50Q291bnRcblxuICAgIHRoaXMuX2FjdGl2ZVNvY2tldHMuYWRkKHNvY2tldClcbiAgICBzb2NrZXQub25jZShcImNsb3NlXCIsICgpID0+IHRoaXMuX2FjdGl2ZVNvY2tldHMuZGVsZXRlKHNvY2tldCkpXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJOZXcgY2xpZW50XCIsIHtcbiAgICAgIGNsaWVudENvdW50LFxuICAgICAgcmVtb3RlQWRkcmVzczogc29ja2V0LnJlbW90ZUFkZHJlc3MsXG4gICAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydFxuICAgIH1dKVxuICAgIHRoaXMuY2xpZW50Q291bnQrK1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFBhdXNlZCBXZWJTb2NrZXQgc2Vzc2lvbnMgYXJlIHdvcmtlci1sb2NhbCwgc28gcmVjb25uZWN0cyBmcm9tXG4gICAgICAvLyB0aGUgc2FtZSBjbGllbnQgYWRkcmVzcyBtdXN0IHJldHVybiB0byB0aGUgc2FtZSB3b3JrZXIuXG4gICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gdGhpcy53b3JrZXJIYW5kbGVyVG9Vc2Uoe3N0aWNreUtleTogc29ja2V0LnJlbW90ZUFkZHJlc3N9KVxuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFNlcnZlckNsaWVudCh7XG4gICAgICAgIGNsaWVudENvdW50LFxuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHNvY2tldFxuICAgICAgfSlcblxuICAgICAgY2xpZW50LmV2ZW50cy5vbihcImNsb3NlXCIsIHRoaXMub25DbGllbnRDbG9zZSlcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEdhdmUgY2xpZW50ICR7Y2xpZW50Q291bnR9IHRvIHdvcmtlciAke3dvcmtlckhhbmRsZXIud29ya2VyQ291bnR9YClcbiAgICAgIHdvcmtlckhhbmRsZXIuYWRkU29ja2V0Q29ubmVjdGlvbihjbGllbnQpXG4gICAgICB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdID0gY2xpZW50XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjbGllbnQgJHtjbGllbnRDb3VudH0gb24gbmV3IGNvbm5lY3Rpb25gLCBlcnJvcilcbiAgICAgIHNvY2tldC5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY2xpZW50IGNsb3NlLlxuICAgKiBAcGFyYW0ge1NlcnZlckNsaWVudH0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBvbkNsaWVudENsb3NlID0gKGNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudENvdW50ID0gZGlnZyhjbGllbnQsIFwiY2xpZW50Q291bnRcIilcbiAgICBjb25zdCBvbGRDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGRlbGV0ZSB0aGlzLmNsaWVudHNbY2xpZW50Q291bnRdXG5cbiAgICBjb25zdCBuZXdDbGllbnRzTGVuZ3RoID0gT2JqZWN0LmtleXModGhpcy5jbGllbnRzKS5sZW5ndGhcblxuICAgIGlmIChuZXdDbGllbnRzTGVuZ3RoICE9IChvbGRDbGllbnRzTGVuZ3RoIC0gMSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFeHBlY3RlZCBjbGllbnQgdG8gaGF2ZSBiZWVuIHJlbW92ZWQgYnV0IGxlbmd0aCBkaWRuJ3QgY2hhbmdlIGZyb20gJHtvbGRDbGllbnRzTGVuZ3RofSB0byAke29sZENsaWVudHNMZW5ndGggLSAxfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3Bhd24gd29ya2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgc3Bhd25Xb3JrZXIoKSB7XG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IGF3YWl0IHRoaXMuX2J1aWxkV29ya2VySGFuZGxlcigpXG5cbiAgICB0aGlzLndvcmtlckhhbmRsZXJzLnB1c2god29ya2VySGFuZGxlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHdvcmtlciBoYW5kbGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXI+Pn0gLSBTdGFydGVkIHdvcmtlciBoYW5kbGVycy5cbiAgICovXG4gIGFzeW5jIF9idWlsZFdvcmtlckhhbmRsZXJzKCkge1xuICAgIC8qKlxuICAgICAqIFdvcmtlciBoYW5kbGVycy5cbiAgICAgIEB0eXBlIHtBcnJheTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59ICovXG4gICAgY29uc3Qgd29ya2VySGFuZGxlcnMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMud29ya2VyczsgaW5kZXggKz0gMSkge1xuICAgICAgd29ya2VySGFuZGxlcnMucHVzaChhd2FpdCB0aGlzLl9idWlsZFdvcmtlckhhbmRsZXIoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya2VySGFuZGxlcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJ1aWxkIHdvcmtlciBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcj59IC0gU3RhcnRlZCB3b3JrZXIgaGFuZGxlci5cbiAgICovXG4gIGFzeW5jIF9idWlsZFdvcmtlckhhbmRsZXIoKSB7XG4gICAgY29uc3Qgd29ya2VyQ291bnQgPSB0aGlzLndvcmtlckNvdW50XG5cbiAgICB0aGlzLndvcmtlckNvdW50KytcblxuICAgIGNvbnN0IEhhbmRsZXIgPSB0aGlzLmluUHJvY2VzcyA/IEluUHJvY2Vzc0hhbmRsZXIgOiBXb3JrZXJIYW5kbGVyXG4gICAgY29uc3Qgd29ya2VySGFuZGxlciA9IHRoaXMud29ya2VySGFuZGxlckZhY3RvcnlcbiAgICAgID8gdGhpcy53b3JrZXJIYW5kbGVyRmFjdG9yeSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLCB3b3JrZXJDb3VudH0pXG4gICAgICA6IG5ldyBIYW5kbGVyKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICB3b3JrZXJDb3VudFxuICAgICAgfSlcblxuICAgIGF3YWl0IHdvcmtlckhhbmRsZXIuc3RhcnQoKVxuXG4gICAgcmV0dXJuIHdvcmtlckhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdvcmtlciBoYW5kbGVyIHRvIHVzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3RpY2t5S2V5XSAtIFN0YWJsZSBrZXkgdGhhdCBtdXN0IGtlZXAgcm91dGluZyB0byB0aGUgc2FtZSB3b3JrZXIuXG4gICAqIEByZXR1cm5zIHtXb3JrZXJIYW5kbGVyIHwgSW5Qcm9jZXNzSGFuZGxlcn0gLSBUaGUgd29ya2VyIGhhbmRsZXIgdG8gdXNlLlxuICAgKi9cbiAgd29ya2VySGFuZGxlclRvVXNlKHtzdGlja3lLZXl9ID0ge30pIHtcbiAgICBpZiAoc3RpY2t5S2V5KSB7XG4gICAgICBjb25zdCBzdGlja3lXb3JrZXJIYW5kbGVyID0gdGhpcy5zdGlja3lXb3JrZXJIYW5kbGVycy5nZXQoc3RpY2t5S2V5KVxuXG4gICAgICBpZiAoc3RpY2t5V29ya2VySGFuZGxlciAmJiB0aGlzLndvcmtlckhhbmRsZXJzLmluY2x1ZGVzKHN0aWNreVdvcmtlckhhbmRsZXIpKSB7XG4gICAgICAgIHJldHVybiBzdGlja3lXb3JrZXJIYW5kbGVyXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLl9uZXh0Um91bmRSb2JpbldvcmtlckhhbmRsZXIoKVxuXG4gICAgICB0aGlzLnN0aWNreVdvcmtlckhhbmRsZXJzLnNldChzdGlja3lLZXksIHdvcmtlckhhbmRsZXIpXG5cbiAgICAgIHJldHVybiB3b3JrZXJIYW5kbGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX25leHRSb3VuZFJvYmluV29ya2VySGFuZGxlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXh0IHJvdW5kIHJvYmluIHdvcmtlciBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7V29ya2VySGFuZGxlciB8IEluUHJvY2Vzc0hhbmRsZXJ9IC0gVGhlIG5leHQgcm91bmQtcm9iaW4gd29ya2VyIGhhbmRsZXIuXG4gICAqL1xuICBfbmV4dFJvdW5kUm9iaW5Xb3JrZXJIYW5kbGVyKCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBXb3JrZXIgaGFuZGxlcnMgbGVuZ3RoOiAke3RoaXMud29ya2VySGFuZGxlcnMubGVuZ3RofWApXG5cbiAgICBjb25zdCB3b3JrZXJIYW5kbGVySW5kZXggPSB0aGlzLm5leHRXb3JrZXJIYW5kbGVySW5kZXggJSB0aGlzLndvcmtlckhhbmRsZXJzLmxlbmd0aFxuICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSB0aGlzLndvcmtlckhhbmRsZXJzW3dvcmtlckhhbmRsZXJJbmRleF1cblxuICAgIGlmICghd29ya2VySGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB3b3JrZXJIYW5kbGVyIGJ5IHRoYXQgbnVtYmVyOiAke3dvcmtlckhhbmRsZXJJbmRleH1gKVxuICAgIH1cblxuICAgIHRoaXMubmV4dFdvcmtlckhhbmRsZXJJbmRleCArPSAxXG5cbiAgICByZXR1cm4gd29ya2VySGFuZGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2hvdWxkIHVzZSBkZXZlbG9wbWVudCBob3QgcmVsb2FkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGRldmVsb3BtZW50IHdvcmtlciBob3QgcmVsb2FkIHNob3VsZCBydW4uXG4gICAqL1xuICBzaG91bGRVc2VEZXZlbG9wbWVudEhvdFJlbG9hZCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5Qcm9jZXNzICYmIHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcImRldmVsb3BtZW50XCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0YXJ0IGRldmVsb3BtZW50IHJlbG9hZGVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHdhdGNoZXIgc2V0dXAgZmluaXNoZXMuXG4gICAqL1xuICBhc3luYyBfc3RhcnREZXZlbG9wbWVudFJlbG9hZGVyKCkge1xuICAgIGlmICghdGhpcy5zaG91bGRVc2VEZXZlbG9wbWVudEhvdFJlbG9hZCgpKSByZXR1cm5cbiAgICBpZiAodGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyKSByZXR1cm5cblxuICAgIGNvbnN0IGNyZWF0ZURldmVsb3BtZW50UmVsb2FkZXIgPSB0aGlzLmRldmVsb3BtZW50UmVsb2FkZXJGYWN0b3J5XG4gICAgICB8fCAoKGFyZ3MpID0+IG5ldyBEZXZlbG9wbWVudFJlbG9hZGVyKGFyZ3MpKVxuXG4gICAgdGhpcy5kZXZlbG9wbWVudFJlbG9hZGVyID0gY3JlYXRlRGV2ZWxvcG1lbnRSZWxvYWRlcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICBvblJlbG9hZDogYXN5bmMgKHtjaGFuZ2VkUGF0aH0pID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dnZXIuaW5mbyhgRGV2ZWxvcG1lbnQgaG90IHJlbG9hZCBkZXRlY3RlZCBjaGFuZ2UgaW4gJHtjaGFuZ2VkUGF0aH1gKVxuICAgICAgICBhd2FpdCB0aGlzLnJlbG9hZFdvcmtlcnNGb3JEZXZlbG9wbWVudCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuZGV2ZWxvcG1lbnRSZWxvYWRlci5zdGFydCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxvYWQgd29ya2VycyBmb3IgZGV2ZWxvcG1lbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gd29ya2VycyBoYXZlIGJlZW4gcmVmcmVzaGVkLlxuICAgKi9cbiAgYXN5bmMgcmVsb2FkV29ya2Vyc0ZvckRldmVsb3BtZW50KCkge1xuICAgIGlmICh0aGlzLl9zdG9wcGluZykgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fcmVsb2FkaW5nV29ya2Vyc0ZvckRldmVsb3BtZW50KSB7XG4gICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQgPSB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgZG8ge1xuICAgICAgICB0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IG9sZFdvcmtlckhhbmRsZXJzID0gWy4uLnRoaXMud29ya2VySGFuZGxlcnNdXG4gICAgICAgIGNvbnN0IG5ld1dvcmtlckhhbmRsZXJzID0gYXdhaXQgdGhpcy5fYnVpbGRXb3JrZXJIYW5kbGVycygpXG5cbiAgICAgICAgdGhpcy53b3JrZXJIYW5kbGVycyA9IG5ld1dvcmtlckhhbmRsZXJzXG4gICAgICAgIHRoaXMubmV4dFdvcmtlckhhbmRsZXJJbmRleCA9IDBcbiAgICAgICAgdGhpcy5zdGlja3lXb3JrZXJIYW5kbGVycy5jbGVhcigpXG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwob2xkV29ya2VySGFuZGxlcnMubWFwKCh3b3JrZXJIYW5kbGVyKSA9PiB3b3JrZXJIYW5kbGVyLnN0b3AoKSkpXG4gICAgICB9IHdoaWxlICh0aGlzLl9yZWxvYWRXb3JrZXJzRm9yRGV2ZWxvcG1lbnRRdWV1ZWQgJiYgIXRoaXMuX3N0b3BwaW5nKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZWxvYWRpbmdXb3JrZXJzRm9yRGV2ZWxvcG1lbnQgPSBmYWxzZVxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,4 +1,5 @@
1
1
  /**
2
+ * Runs resolve remote address.
2
3
  * @param {object} args - Options object.
3
4
  * @param {import("../configuration.js").default} args.configuration - Configuration instance.
4
5
  * @param {Record<string, string | string[]>} args.headers - Request headers.
@@ -1 +1 @@
1
- {"version":3,"file":"remote-address.d.ts","sourceRoot":"","sources":["../../../src/http-server/remote-address.js"],"names":[],"mappings":"AA4CA;;;;;;GAMG;AACH,8FALG;IAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;IACG,OAAO,EAA/C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACR,mBAAmB,EAA5C,MAAM,GAAG,SAAS;CAC1B,GAAU,MAAM,GAAG,SAAS,CAgB9B"}
1
+ {"version":3,"file":"remote-address.d.ts","sourceRoot":"","sources":["../../../src/http-server/remote-address.js"],"names":[],"mappings":"AAkDA;;;;;;;GAOG;AACH,8FALG;IAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;IACG,OAAO,EAA/C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACR,mBAAmB,EAA5C,MAAM,GAAG,SAAS;CAC1B,GAAU,MAAM,GAAG,SAAS,CAoB9B"}
@@ -1,8 +1,11 @@
1
1
  // @ts-check
2
2
  import proxyaddr from "proxy-addr";
3
- /** @type {WeakMap<import("../configuration.js").default, {source: string | string[] | undefined, trust: ((address: string, index: number) => boolean) | undefined}>} */
3
+ /**
4
+ * Trusted proxy cache.
5
+ @type {WeakMap<import("../configuration.js").default, {source: string | string[] | undefined, trust: ((address: string, index: number) => boolean) | undefined}>} */
4
6
  const trustedProxyCache = new WeakMap();
5
7
  /**
8
+ * Runs trusted proxy checker.
6
9
  * @param {import("../configuration.js").default} configuration - Configuration instance.
7
10
  * @returns {((address: string, index: number) => boolean) | undefined} - Compiled trusted proxy checker.
8
11
  */
@@ -20,11 +23,14 @@ function trustedProxyChecker(configuration) {
20
23
  return trust;
21
24
  }
22
25
  /**
26
+ * Runs node style headers.
23
27
  * @param {Record<string, string | string[]>} headers - Request headers.
24
28
  * @returns {Record<string, string | string[]>} - Headers with lowercase names.
25
29
  */
26
30
  function nodeStyleHeaders(headers) {
27
- /** @type {Record<string, string | string[]>} */
31
+ /**
32
+ * Result.
33
+ @type {Record<string, string | string[]>} */
28
34
  const result = {};
29
35
  for (const [key, value] of Object.entries(headers)) {
30
36
  result[key.toLowerCase()] = value;
@@ -32,6 +38,7 @@ function nodeStyleHeaders(headers) {
32
38
  return result;
33
39
  }
34
40
  /**
41
+ * Runs resolve remote address.
35
42
  * @param {object} args - Options object.
36
43
  * @param {import("../configuration.js").default} args.configuration - Configuration instance.
37
44
  * @param {Record<string, string | string[]>} args.headers - Request headers.
@@ -44,11 +51,15 @@ export default function resolveRemoteAddress({ configuration, headers, socketRem
44
51
  const trust = trustedProxyChecker(configuration);
45
52
  if (!trust)
46
53
  return socketRemoteAddress;
47
- const proxyRequest = /** @type {Parameters<typeof proxyaddr>[0]} */ ( /** @type {unknown} */({
54
+ const proxyRequest = /**
55
+ * Narrows the runtime value to the documented type.
56
+ @type {Parameters<typeof proxyaddr>[0]} */ ( /**
57
+ * Narrows the runtime value to the documented type.
58
+ @type {?} */({
48
59
  connection: { remoteAddress: socketRemoteAddress },
49
60
  headers: nodeStyleHeaders(headers),
50
61
  socket: { remoteAddress: socketRemoteAddress }
51
62
  }));
52
63
  return proxyaddr(proxyRequest, trust);
53
64
  }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWFkZHJlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvcmVtb3RlLWFkZHJlc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUVsQyx3S0FBd0s7QUFDeEssTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRXZDOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsYUFBYTtJQUN4QyxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUN4RCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFbkQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxjQUFjO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFBO0lBRW5FLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUNoRixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUUvQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO0lBRXJFLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsT0FBTztJQUMvQixnREFBZ0Q7SUFDaEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBRWpCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUNuQyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxvQkFBb0IsQ0FBQyxFQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUM7SUFDeEYsSUFBSSxDQUFDLG1CQUFtQjtRQUFFLE9BQU8sbUJBQW1CLENBQUE7SUFFcEQsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFaEQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLG1CQUFtQixDQUFBO0lBRXRDLE1BQU0sWUFBWSxHQUFHLDhDQUE4QyxDQUFDLEVBQUMsc0JBQXVCLENBQUM7UUFDM0YsVUFBVSxFQUFFLEVBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDO1FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEMsTUFBTSxFQUFFLEVBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDO0tBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUgsT0FBTyxTQUFTLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHByb3h5YWRkciBmcm9tIFwicHJveHktYWRkclwiXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHtzb3VyY2U6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkLCB0cnVzdDogKChhZGRyZXNzOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfT59ICovXG5jb25zdCB0cnVzdGVkUHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7KChhZGRyZXNzOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfSAtIENvbXBpbGVkIHRydXN0ZWQgcHJveHkgY2hlY2tlci5cbiAqL1xuZnVuY3Rpb24gdHJ1c3RlZFByb3h5Q2hlY2tlcihjb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IHRydXN0ZWRQcm94aWVzID0gY29uZmlndXJhdGlvbi5nZXRUcnVzdGVkUHJveGllcygpXG4gIGNvbnN0IGNhY2hlZCA9IHRydXN0ZWRQcm94eUNhY2hlLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLnNvdXJjZSA9PT0gdHJ1c3RlZFByb3hpZXMpIHJldHVybiBjYWNoZWQudHJ1c3RcblxuICBpZiAoIXRydXN0ZWRQcm94aWVzIHx8IChBcnJheS5pc0FycmF5KHRydXN0ZWRQcm94aWVzKSAmJiB0cnVzdGVkUHJveGllcy5sZW5ndGggPT09IDApKSB7XG4gICAgdHJ1c3RlZFByb3h5Q2FjaGUuc2V0KGNvbmZpZ3VyYXRpb24sIHtzb3VyY2U6IHRydXN0ZWRQcm94aWVzLCB0cnVzdDogdW5kZWZpbmVkfSlcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCB0cnVzdCA9IHByb3h5YWRkci5jb21waWxlKHRydXN0ZWRQcm94aWVzKVxuXG4gIHRydXN0ZWRQcm94eUNhY2hlLnNldChjb25maWd1cmF0aW9uLCB7c291cmNlOiB0cnVzdGVkUHJveGllcywgdHJ1c3R9KVxuXG4gIHJldHVybiB0cnVzdFxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSBoZWFkZXJzIC0gUmVxdWVzdCBoZWFkZXJzLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gLSBIZWFkZXJzIHdpdGggbG93ZXJjYXNlIG5hbWVzLlxuICovXG5mdW5jdGlvbiBub2RlU3R5bGVIZWFkZXJzKGhlYWRlcnMpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59ICovXG4gIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICByZXN1bHRba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWVcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gYXJncy5oZWFkZXJzIC0gUmVxdWVzdCBoZWFkZXJzLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGFyZ3Muc29ja2V0UmVtb3RlQWRkcmVzcyAtIFNvY2tldCBwZWVyIGFkZHJlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlc29sdmVkIGNsaWVudCByZW1vdGUgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzb2x2ZVJlbW90ZUFkZHJlc3Moe2NvbmZpZ3VyYXRpb24sIGhlYWRlcnMsIHNvY2tldFJlbW90ZUFkZHJlc3N9KSB7XG4gIGlmICghc29ja2V0UmVtb3RlQWRkcmVzcykgcmV0dXJuIHNvY2tldFJlbW90ZUFkZHJlc3NcblxuICBjb25zdCB0cnVzdCA9IHRydXN0ZWRQcm94eUNoZWNrZXIoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXRydXN0KSByZXR1cm4gc29ja2V0UmVtb3RlQWRkcmVzc1xuXG4gIGNvbnN0IHByb3h5UmVxdWVzdCA9IC8qKiBAdHlwZSB7UGFyYW1ldGVyczx0eXBlb2YgcHJveHlhZGRyPlswXX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHtcbiAgICBjb25uZWN0aW9uOiB7cmVtb3RlQWRkcmVzczogc29ja2V0UmVtb3RlQWRkcmVzc30sXG4gICAgaGVhZGVyczogbm9kZVN0eWxlSGVhZGVycyhoZWFkZXJzKSxcbiAgICBzb2NrZXQ6IHtyZW1vdGVBZGRyZXNzOiBzb2NrZXRSZW1vdGVBZGRyZXNzfVxuICB9KSlcblxuICByZXR1cm4gcHJveHlhZGRyKHByb3h5UmVxdWVzdCwgdHJ1c3QpXG59XG4iXX0=
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWFkZHJlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvcmVtb3RlLWFkZHJlc3MuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQTtBQUVsQzs7c0tBRXNLO0FBQ3RLLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUV2Qzs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxhQUFhO0lBQ3hDLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO0lBQ3hELE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUVuRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLGNBQWM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUE7SUFFbkUsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RGLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBQ2hGLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRS9DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7SUFFckUsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsT0FBTztJQUMvQjs7a0RBRThDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVqQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUE7SUFDbkMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLG9CQUFvQixDQUFDLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBQztJQUN4RixJQUFJLENBQUMsbUJBQW1CO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQTtJQUVwRCxNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUVoRCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sbUJBQW1CLENBQUE7SUFFdEMsTUFBTSxZQUFZLEdBQUc7O3FFQUU0QyxDQUFDLEVBQUM7OzhEQUVlLENBQUM7UUFDakYsVUFBVSxFQUFFLEVBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDO1FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDbEMsTUFBTSxFQUFFLEVBQUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDO0tBQzdDLENBQUMsQ0FBQyxDQUFBO0lBRUgsT0FBTyxTQUFTLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHByb3h5YWRkciBmcm9tIFwicHJveHktYWRkclwiXG5cbi8qKlxuICogVHJ1c3RlZCBwcm94eSBjYWNoZS5cbiAgQHR5cGUge1dlYWtNYXA8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCB7c291cmNlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgdHJ1c3Q6ICgoYWRkcmVzczogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZH0+fSAqL1xuY29uc3QgdHJ1c3RlZFByb3h5Q2FjaGUgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogUnVucyB0cnVzdGVkIHByb3h5IGNoZWNrZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7KChhZGRyZXNzOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfSAtIENvbXBpbGVkIHRydXN0ZWQgcHJveHkgY2hlY2tlci5cbiAqL1xuZnVuY3Rpb24gdHJ1c3RlZFByb3h5Q2hlY2tlcihjb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IHRydXN0ZWRQcm94aWVzID0gY29uZmlndXJhdGlvbi5nZXRUcnVzdGVkUHJveGllcygpXG4gIGNvbnN0IGNhY2hlZCA9IHRydXN0ZWRQcm94eUNhY2hlLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLnNvdXJjZSA9PT0gdHJ1c3RlZFByb3hpZXMpIHJldHVybiBjYWNoZWQudHJ1c3RcblxuICBpZiAoIXRydXN0ZWRQcm94aWVzIHx8IChBcnJheS5pc0FycmF5KHRydXN0ZWRQcm94aWVzKSAmJiB0cnVzdGVkUHJveGllcy5sZW5ndGggPT09IDApKSB7XG4gICAgdHJ1c3RlZFByb3h5Q2FjaGUuc2V0KGNvbmZpZ3VyYXRpb24sIHtzb3VyY2U6IHRydXN0ZWRQcm94aWVzLCB0cnVzdDogdW5kZWZpbmVkfSlcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCB0cnVzdCA9IHByb3h5YWRkci5jb21waWxlKHRydXN0ZWRQcm94aWVzKVxuXG4gIHRydXN0ZWRQcm94eUNhY2hlLnNldChjb25maWd1cmF0aW9uLCB7c291cmNlOiB0cnVzdGVkUHJveGllcywgdHJ1c3R9KVxuXG4gIHJldHVybiB0cnVzdFxufVxuXG4vKipcbiAqIFJ1bnMgbm9kZSBzdHlsZSBoZWFkZXJzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59IGhlYWRlcnMgLSBSZXF1ZXN0IGhlYWRlcnMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSAtIEhlYWRlcnMgd2l0aCBsb3dlcmNhc2UgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5vZGVTdHlsZUhlYWRlcnMoaGVhZGVycykge1xuICAvKipcbiAgICogUmVzdWx0LlxuICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59ICovXG4gIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICByZXN1bHRba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWVcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSdW5zIHJlc29sdmUgcmVtb3RlIGFkZHJlc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPn0gYXJncy5oZWFkZXJzIC0gUmVxdWVzdCBoZWFkZXJzLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGFyZ3Muc29ja2V0UmVtb3RlQWRkcmVzcyAtIFNvY2tldCBwZWVyIGFkZHJlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFJlc29sdmVkIGNsaWVudCByZW1vdGUgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzb2x2ZVJlbW90ZUFkZHJlc3Moe2NvbmZpZ3VyYXRpb24sIGhlYWRlcnMsIHNvY2tldFJlbW90ZUFkZHJlc3N9KSB7XG4gIGlmICghc29ja2V0UmVtb3RlQWRkcmVzcykgcmV0dXJuIHNvY2tldFJlbW90ZUFkZHJlc3NcblxuICBjb25zdCB0cnVzdCA9IHRydXN0ZWRQcm94eUNoZWNrZXIoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXRydXN0KSByZXR1cm4gc29ja2V0UmVtb3RlQWRkcmVzc1xuXG4gIGNvbnN0IHByb3h5UmVxdWVzdCA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1BhcmFtZXRlcnM8dHlwZW9mIHByb3h5YWRkcj5bMF19ICovICgvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUgez99ICovICh7XG4gICAgY29ubmVjdGlvbjoge3JlbW90ZUFkZHJlc3M6IHNvY2tldFJlbW90ZUFkZHJlc3N9LFxuICAgIGhlYWRlcnM6IG5vZGVTdHlsZUhlYWRlcnMoaGVhZGVycyksXG4gICAgc29ja2V0OiB7cmVtb3RlQWRkcmVzczogc29ja2V0UmVtb3RlQWRkcmVzc31cbiAgfSkpXG5cbiAgcmV0dXJuIHByb3h5YWRkcihwcm94eVJlcXVlc3QsIHRydXN0KVxufVxuIl19