velocious 1.0.643 → 1.0.645

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 (279) hide show
  1. package/README.md +21 -10
  2. package/build/authorization/ability.js +36 -13
  3. package/build/background-jobs/adapter.js +9 -0
  4. package/build/background-jobs/main.js +35 -10
  5. package/build/background-jobs/store.js +217 -38
  6. package/build/background-jobs/types.js +15 -0
  7. package/build/configuration-types.js +1 -1
  8. package/build/configuration.js +45 -9
  9. package/build/database/drivers/base-column.js +8 -0
  10. package/build/database/drivers/mssql/sql/update.js +1 -3
  11. package/build/database/drivers/mysql/sql/update.js +1 -3
  12. package/build/database/drivers/pgsql/column.js +22 -0
  13. package/build/database/drivers/pgsql/sql/update.js +1 -3
  14. package/build/database/drivers/sqlite/sql/alter-table.js +11 -1
  15. package/build/database/drivers/sqlite/sql/update.js +1 -3
  16. package/build/database/query/index.js +2 -2
  17. package/build/database/query/model-class-query.js +26 -10
  18. package/build/database/query/preloader/has-many.js +4 -1
  19. package/build/database/query/query-data.js +2 -1
  20. package/build/database/query/update-base.js +14 -0
  21. package/build/database/query/with-count.js +3 -1
  22. package/build/database/record/acts-as-list.js +37 -13
  23. package/build/database/record/attachments/store.js +336 -26
  24. package/build/database/record/auditing.js +6 -3
  25. package/build/database/record/index.js +197 -42
  26. package/build/database/record/instance-relationships/belongs-to.js +2 -1
  27. package/build/database/record/validators/uniqueness.js +8 -5
  28. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  29. package/build/frontend-model-controller.js +136 -53
  30. package/build/frontend-model-resource/base-resource.js +87 -37
  31. package/build/frontend-model-resource/velocious-attachment-resource.js +98 -31
  32. package/build/frontend-models/base.js +307 -59
  33. package/build/frontend-models/preloader.js +6 -3
  34. package/build/frontend-models/query.js +15 -6
  35. package/build/frontend-models/resource-definition.js +21 -2
  36. package/build/frontend-models/use-destroyed-event.js +1 -1
  37. package/build/frontend-models/use-model-class-event.js +2 -2
  38. package/build/frontend-models/use-updated-event.js +1 -1
  39. package/build/frontend-models/websocket-channel.js +256 -93
  40. package/build/frontend-models/websocket-publishers.js +218 -18
  41. package/build/http-server/client/websocket-session.js +13 -1
  42. package/build/http-server/websocket-channel.js +15 -2
  43. package/build/src/authorization/ability.d.ts +9 -3
  44. package/build/src/authorization/ability.d.ts.map +1 -1
  45. package/build/src/authorization/ability.js +33 -14
  46. package/build/src/background-jobs/adapter.d.ts +6 -0
  47. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  48. package/build/src/background-jobs/adapter.js +9 -1
  49. package/build/src/background-jobs/main.d.ts +6 -0
  50. package/build/src/background-jobs/main.d.ts.map +1 -1
  51. package/build/src/background-jobs/main.js +34 -11
  52. package/build/src/background-jobs/store.d.ts +66 -12
  53. package/build/src/background-jobs/store.d.ts.map +1 -1
  54. package/build/src/background-jobs/store.js +191 -35
  55. package/build/src/background-jobs/types.d.ts +55 -0
  56. package/build/src/background-jobs/types.d.ts.map +1 -1
  57. package/build/src/background-jobs/types.js +16 -1
  58. package/build/src/configuration-types.d.ts +3 -3
  59. package/build/src/configuration-types.d.ts.map +1 -1
  60. package/build/src/configuration-types.js +2 -2
  61. package/build/src/configuration.d.ts +18 -8
  62. package/build/src/configuration.d.ts.map +1 -1
  63. package/build/src/configuration.js +38 -7
  64. package/build/src/database/drivers/base-column.d.ts +5 -0
  65. package/build/src/database/drivers/base-column.d.ts.map +1 -1
  66. package/build/src/database/drivers/base-column.js +8 -1
  67. package/build/src/database/drivers/mssql/sql/update.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/sql/update.js +2 -4
  69. package/build/src/database/drivers/mysql/sql/update.d.ts.map +1 -1
  70. package/build/src/database/drivers/mysql/sql/update.js +2 -4
  71. package/build/src/database/drivers/pgsql/column.d.ts +5 -0
  72. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  73. package/build/src/database/drivers/pgsql/column.js +19 -1
  74. package/build/src/database/drivers/pgsql/sql/update.d.ts.map +1 -1
  75. package/build/src/database/drivers/pgsql/sql/update.js +2 -4
  76. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  77. package/build/src/database/drivers/sqlite/sql/alter-table.js +6 -2
  78. package/build/src/database/drivers/sqlite/sql/update.d.ts.map +1 -1
  79. package/build/src/database/drivers/sqlite/sql/update.js +2 -4
  80. package/build/src/database/query/index.d.ts +4 -4
  81. package/build/src/database/query/index.d.ts.map +1 -1
  82. package/build/src/database/query/index.js +3 -3
  83. package/build/src/database/query/model-class-query.d.ts +8 -2
  84. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  85. package/build/src/database/query/model-class-query.js +25 -11
  86. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  87. package/build/src/database/query/preloader/has-many.js +4 -2
  88. package/build/src/database/query/query-data.d.ts.map +1 -1
  89. package/build/src/database/query/query-data.js +3 -2
  90. package/build/src/database/query/update-base.d.ts +7 -0
  91. package/build/src/database/query/update-base.d.ts.map +1 -1
  92. package/build/src/database/query/update-base.js +13 -1
  93. package/build/src/database/query/with-count.d.ts.map +1 -1
  94. package/build/src/database/query/with-count.js +3 -2
  95. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  96. package/build/src/database/record/acts-as-list.js +35 -14
  97. package/build/src/database/record/attachments/store.d.ts +67 -0
  98. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  99. package/build/src/database/record/attachments/store.js +301 -25
  100. package/build/src/database/record/auditing.d.ts.map +1 -1
  101. package/build/src/database/record/auditing.js +7 -4
  102. package/build/src/database/record/index.d.ts +78 -26
  103. package/build/src/database/record/index.d.ts.map +1 -1
  104. package/build/src/database/record/index.js +171 -42
  105. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  106. package/build/src/database/record/instance-relationships/belongs-to.js +3 -2
  107. package/build/src/database/record/validators/uniqueness.d.ts.map +1 -1
  108. package/build/src/database/record/validators/uniqueness.js +8 -6
  109. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +4 -4
  110. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  111. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -12
  112. package/build/src/frontend-model-controller.d.ts +29 -8
  113. package/build/src/frontend-model-controller.d.ts.map +1 -1
  114. package/build/src/frontend-model-controller.js +122 -51
  115. package/build/src/frontend-model-resource/base-resource.d.ts +51 -24
  116. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  117. package/build/src/frontend-model-resource/base-resource.js +83 -37
  118. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts +45 -26
  119. package/build/src/frontend-model-resource/velocious-attachment-resource.d.ts.map +1 -1
  120. package/build/src/frontend-model-resource/velocious-attachment-resource.js +89 -31
  121. package/build/src/frontend-models/base.d.ts +53 -20
  122. package/build/src/frontend-models/base.d.ts.map +1 -1
  123. package/build/src/frontend-models/base.js +275 -59
  124. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  125. package/build/src/frontend-models/preloader.js +6 -4
  126. package/build/src/frontend-models/query.d.ts +2 -2
  127. package/build/src/frontend-models/query.d.ts.map +1 -1
  128. package/build/src/frontend-models/query.js +14 -7
  129. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  130. package/build/src/frontend-models/resource-definition.js +20 -3
  131. package/build/src/frontend-models/use-destroyed-event.d.ts +1 -1
  132. package/build/src/frontend-models/use-destroyed-event.d.ts.map +1 -1
  133. package/build/src/frontend-models/use-destroyed-event.js +2 -2
  134. package/build/src/frontend-models/use-model-class-event.d.ts +2 -2
  135. package/build/src/frontend-models/use-model-class-event.d.ts.map +1 -1
  136. package/build/src/frontend-models/use-model-class-event.js +3 -3
  137. package/build/src/frontend-models/use-updated-event.d.ts +1 -1
  138. package/build/src/frontend-models/use-updated-event.d.ts.map +1 -1
  139. package/build/src/frontend-models/use-updated-event.js +2 -2
  140. package/build/src/frontend-models/websocket-channel.d.ts +60 -41
  141. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  142. package/build/src/frontend-models/websocket-channel.js +225 -85
  143. package/build/src/frontend-models/websocket-publishers.d.ts +9 -0
  144. package/build/src/frontend-models/websocket-publishers.d.ts.map +1 -1
  145. package/build/src/frontend-models/websocket-publishers.js +190 -19
  146. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  147. package/build/src/http-server/client/websocket-session.js +11 -2
  148. package/build/src/http-server/websocket-channel.d.ts +20 -8
  149. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  150. package/build/src/http-server/websocket-channel.js +15 -3
  151. package/build/src/sync/assets/cache.d.ts +288 -0
  152. package/build/src/sync/assets/cache.d.ts.map +1 -0
  153. package/build/src/sync/assets/cache.js +883 -0
  154. package/build/src/sync/assets/types.d.ts +199 -0
  155. package/build/src/sync/assets/types.d.ts.map +1 -0
  156. package/build/src/sync/assets/types.js +56 -0
  157. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  158. package/build/src/sync/sync-api-client.js +4 -3
  159. package/build/src/sync/sync-client.d.ts.map +1 -1
  160. package/build/src/sync/sync-client.js +3 -2
  161. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  162. package/build/src/sync/sync-envelope-replay-service.js +6 -5
  163. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  164. package/build/src/sync/sync-publisher.js +4 -3
  165. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts +2 -2
  166. package/build/src/testing/browser-frontend-model-event-hook-scenarios.d.ts.map +1 -1
  167. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +3 -3
  168. package/build/src/testing/test-profiler.d.ts +4 -4
  169. package/build/src/testing/test-profiler.d.ts.map +1 -1
  170. package/build/src/testing/test-profiler.js +3 -3
  171. package/build/src/testing/test-runner.d.ts +279 -117
  172. package/build/src/testing/test-runner.d.ts.map +1 -1
  173. package/build/src/testing/test-runner.js +503 -933
  174. package/build/src/testing/test.d.ts +11 -72
  175. package/build/src/testing/test.d.ts.map +1 -1
  176. package/build/src/testing/test.js +131 -284
  177. package/build/src/testing/velocious-attempt-executor.d.ts +54 -0
  178. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -0
  179. package/build/src/testing/velocious-attempt-executor.js +408 -0
  180. package/build/src/testing/velocious-runner-reporter.d.ts +67 -0
  181. package/build/src/testing/velocious-runner-reporter.d.ts.map +1 -0
  182. package/build/src/testing/velocious-runner-reporter.js +240 -0
  183. package/build/src/testing/velocious-suite-hook-executor.d.ts +19 -0
  184. package/build/src/testing/velocious-suite-hook-executor.d.ts.map +1 -0
  185. package/build/src/testing/velocious-suite-hook-executor.js +41 -0
  186. package/build/src/testing/velocious-test-arguments.d.ts +39 -0
  187. package/build/src/testing/velocious-test-arguments.d.ts.map +1 -0
  188. package/build/src/testing/velocious-test-arguments.js +55 -0
  189. package/build/src/utils/model-primary-key.d.ts +73 -0
  190. package/build/src/utils/model-primary-key.d.ts.map +1 -0
  191. package/build/src/utils/model-primary-key.js +144 -0
  192. package/build/src/utils/sha256-bytes-hex.d.ts +7 -0
  193. package/build/src/utils/sha256-bytes-hex.d.ts.map +1 -0
  194. package/build/src/utils/sha256-bytes-hex.js +117 -0
  195. package/build/src/utils/sha256-hex.d.ts +2 -4
  196. package/build/src/utils/sha256-hex.d.ts.map +1 -1
  197. package/build/src/utils/sha256-hex.js +6 -120
  198. package/build/sync/assets/cache.js +998 -0
  199. package/build/sync/assets/types.js +62 -0
  200. package/build/sync/sync-api-client.js +3 -2
  201. package/build/sync/sync-client.js +2 -1
  202. package/build/sync/sync-envelope-replay-service.js +5 -4
  203. package/build/sync/sync-publisher.js +3 -2
  204. package/build/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  205. package/build/testing/test-profiler.js +2 -2
  206. package/build/testing/test-runner.js +496 -990
  207. package/build/testing/test.js +164 -306
  208. package/build/testing/velocious-attempt-executor.js +441 -0
  209. package/build/testing/velocious-runner-reporter.js +264 -0
  210. package/build/testing/velocious-suite-hook-executor.js +43 -0
  211. package/build/testing/velocious-test-arguments.js +64 -0
  212. package/build/tsconfig.tsbuildinfo +1 -1
  213. package/build/utils/model-primary-key.js +171 -0
  214. package/build/utils/sha256-bytes-hex.js +132 -0
  215. package/build/utils/sha256-hex.js +7 -135
  216. package/package.json +5 -4
  217. package/src/authorization/ability.js +36 -13
  218. package/src/background-jobs/adapter.js +9 -0
  219. package/src/background-jobs/main.js +35 -10
  220. package/src/background-jobs/store.js +217 -38
  221. package/src/background-jobs/types.js +15 -0
  222. package/src/configuration-types.js +1 -1
  223. package/src/configuration.js +45 -9
  224. package/src/database/drivers/base-column.js +8 -0
  225. package/src/database/drivers/mssql/sql/update.js +1 -3
  226. package/src/database/drivers/mysql/sql/update.js +1 -3
  227. package/src/database/drivers/pgsql/column.js +22 -0
  228. package/src/database/drivers/pgsql/sql/update.js +1 -3
  229. package/src/database/drivers/sqlite/sql/alter-table.js +11 -1
  230. package/src/database/drivers/sqlite/sql/update.js +1 -3
  231. package/src/database/query/index.js +2 -2
  232. package/src/database/query/model-class-query.js +26 -10
  233. package/src/database/query/preloader/has-many.js +4 -1
  234. package/src/database/query/query-data.js +2 -1
  235. package/src/database/query/update-base.js +14 -0
  236. package/src/database/query/with-count.js +3 -1
  237. package/src/database/record/acts-as-list.js +37 -13
  238. package/src/database/record/attachments/store.js +336 -26
  239. package/src/database/record/auditing.js +6 -3
  240. package/src/database/record/index.js +197 -42
  241. package/src/database/record/instance-relationships/belongs-to.js +2 -1
  242. package/src/database/record/validators/uniqueness.js +8 -5
  243. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +24 -8
  244. package/src/frontend-model-controller.js +136 -53
  245. package/src/frontend-model-resource/base-resource.js +87 -37
  246. package/src/frontend-model-resource/velocious-attachment-resource.js +98 -31
  247. package/src/frontend-models/base.js +307 -59
  248. package/src/frontend-models/preloader.js +6 -3
  249. package/src/frontend-models/query.js +15 -6
  250. package/src/frontend-models/resource-definition.js +21 -2
  251. package/src/frontend-models/use-destroyed-event.js +1 -1
  252. package/src/frontend-models/use-model-class-event.js +2 -2
  253. package/src/frontend-models/use-updated-event.js +1 -1
  254. package/src/frontend-models/websocket-channel.js +256 -93
  255. package/src/frontend-models/websocket-publishers.js +218 -18
  256. package/src/http-server/client/websocket-session.js +13 -1
  257. package/src/http-server/websocket-channel.js +15 -2
  258. package/src/sync/assets/cache.js +998 -0
  259. package/src/sync/assets/types.js +62 -0
  260. package/src/sync/sync-api-client.js +3 -2
  261. package/src/sync/sync-client.js +2 -1
  262. package/src/sync/sync-envelope-replay-service.js +5 -4
  263. package/src/sync/sync-publisher.js +3 -2
  264. package/src/testing/browser-frontend-model-event-hook-scenarios.js +2 -2
  265. package/src/testing/test-profiler.js +2 -2
  266. package/src/testing/test-runner.js +496 -990
  267. package/src/testing/test.js +164 -306
  268. package/src/testing/velocious-attempt-executor.js +441 -0
  269. package/src/testing/velocious-runner-reporter.js +264 -0
  270. package/src/testing/velocious-suite-hook-executor.js +43 -0
  271. package/src/testing/velocious-test-arguments.js +64 -0
  272. package/src/utils/model-primary-key.js +171 -0
  273. package/src/utils/sha256-bytes-hex.js +132 -0
  274. package/src/utils/sha256-hex.js +7 -135
  275. package/build/src/testing/testing-package-adapter.d.ts +0 -9
  276. package/build/src/testing/testing-package-adapter.d.ts.map +0 -1
  277. package/build/src/testing/testing-package-adapter.js +0 -69
  278. package/build/testing/testing-package-adapter.js +0 -76
  279. package/src/testing/testing-package-adapter.js +0 -76
@@ -0,0 +1,144 @@
1
+ // @ts-check
2
+ import isPlainObject from "./plain-object.js";
3
+ /** @typedef {string | number} ModelPrimaryKeyScalar */
4
+ /** @typedef {string | string[]} ModelPrimaryKeyDefinition */
5
+ /** @typedef {Record<string, ModelPrimaryKeyScalar>} CompositeModelPrimaryKeyValue */
6
+ /** @typedef {ModelPrimaryKeyScalar | CompositeModelPrimaryKeyValue} ModelPrimaryKeyValue */
7
+ /**
8
+ * Validates an untrusted composite identity and returns its definition-ordered values.
9
+ * @param {string[]} primaryKey - Composite primary-key definition.
10
+ * @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
11
+ * @returns {CompositeModelPrimaryKeyValue} - Validated identity.
12
+ */
13
+ export function validatedCompositePrimaryKeyValue(primaryKey, value) {
14
+ if (!isPlainObject(value)) {
15
+ throw new TypeError("Expected composite primary key identity to be a plain object.");
16
+ }
17
+ const valueKeys = Object.keys(value);
18
+ if (valueKeys.length !== primaryKey.length || primaryKey.some((key) => !Object.prototype.hasOwnProperty.call(value, key))) {
19
+ throw new TypeError(`Expected composite primary key identity fields: ${primaryKey.join(", ")}.`);
20
+ }
21
+ /** @type {CompositeModelPrimaryKeyValue} */
22
+ const validatedValue = {};
23
+ for (const key of primaryKey) {
24
+ const keyValue = value[key];
25
+ if (typeof keyValue !== "string" && typeof keyValue !== "number") {
26
+ throw new TypeError(`Expected composite primary key identity field '${key}' to be a string or number.`);
27
+ }
28
+ validatedValue[key] = keyValue;
29
+ }
30
+ return validatedValue;
31
+ }
32
+ /**
33
+ * Returns a scalar primary-key definition or fails at a feature boundary that cannot represent composite identities.
34
+ * @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
35
+ * @param {string} operation - Operation requiring a scalar identity.
36
+ * @returns {string} - Scalar primary-key column or attribute name.
37
+ */
38
+ export function scalarModelPrimaryKey(primaryKey, operation) {
39
+ if (Array.isArray(primaryKey)) {
40
+ throw new Error(`${operation} does not support composite primary keys.`);
41
+ }
42
+ return primaryKey;
43
+ }
44
+ /**
45
+ * Returns a scalar identity or fails at a feature boundary that cannot represent composite identities.
46
+ * @param {ModelPrimaryKeyValue} value - Model identity.
47
+ * @param {string} operation - Operation requiring a scalar identity.
48
+ * @returns {ModelPrimaryKeyScalar} - Scalar identity.
49
+ */
50
+ export function scalarModelPrimaryKeyValue(value, operation) {
51
+ if (typeof value !== "string" && typeof value !== "number") {
52
+ throw new Error(`${operation} does not support composite primary keys.`);
53
+ }
54
+ return value;
55
+ }
56
+ /**
57
+ * Builds query conditions from a scalar or composite model identity.
58
+ * @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
59
+ * @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
60
+ * @returns {Record<string, ModelPrimaryKeyScalar>} - Primary-key query conditions.
61
+ */
62
+ export function modelPrimaryKeyConditions(primaryKey, value) {
63
+ if (Array.isArray(primaryKey))
64
+ return validatedCompositePrimaryKeyValue(primaryKey, value);
65
+ return { [primaryKey]: /** @type {ModelPrimaryKeyScalar} */ (value) };
66
+ }
67
+ /**
68
+ * Builds a qualified SQL predicate matching any supplied composite identity.
69
+ * @param {object} args - Arguments.
70
+ * @param {typeof import("../database/record/index.js").default} args.modelClass - Model class owning the identity attributes.
71
+ * @param {string[]} args.primaryKey - Composite primary-key definition.
72
+ * @param {import("../database/query/model-class-query.js").default<typeof import("../database/record/index.js").default>} args.query - Query receiving the predicate.
73
+ * @param {ModelPrimaryKeyValue[]} args.values - Candidate identities.
74
+ * @returns {string} - Qualified SQL predicate.
75
+ */
76
+ export function compositeModelPrimaryKeyCohortSql({ modelClass, primaryKey, query, values }) {
77
+ if (values.length === 0)
78
+ return "(1 = 0)";
79
+ const tableSql = query.driver.quoteTable(query.getTableReferenceForJoin());
80
+ return `(${values.map((value) => {
81
+ const conditions = modelPrimaryKeyConditions(primaryKey, value);
82
+ const identitySql = primaryKey.map((attributeName) => {
83
+ const columnName = modelClass.getColumnNameForAttributeName(attributeName);
84
+ return `${tableSql}.${query.driver.quoteColumn(columnName)} = ${query.driver.quote(conditions[attributeName])}`;
85
+ }).join(" AND ");
86
+ return `(${identitySql})`;
87
+ }).join(" OR ")})`;
88
+ }
89
+ /**
90
+ * Reads a scalar or composite identity through the owning model's value reader.
91
+ * @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
92
+ * @param {(key: string) => ReturnType<typeof JSON.parse>} read - Primary-key value reader.
93
+ * @returns {ModelPrimaryKeyValue} - Model identity.
94
+ */
95
+ export function readModelPrimaryKeyValue(primaryKey, read) {
96
+ if (!Array.isArray(primaryKey))
97
+ return /** @type {ModelPrimaryKeyScalar} */ (read(primaryKey));
98
+ /** @type {CompositeModelPrimaryKeyValue} */
99
+ const value = {};
100
+ for (const key of primaryKey)
101
+ value[key] = /** @type {ModelPrimaryKeyScalar} */ (read(key));
102
+ return validatedCompositePrimaryKeyValue(primaryKey, value);
103
+ }
104
+ /**
105
+ * Returns an unambiguous map key while preserving legacy scalar map keys.
106
+ * @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
107
+ * @param {ReturnType<typeof JSON.parse>} value - Candidate identity.
108
+ * @returns {string} - Canonical identity key.
109
+ */
110
+ export function modelPrimaryKeyCacheKey(primaryKey, value) {
111
+ if (!Array.isArray(primaryKey))
112
+ return String(value);
113
+ const validatedValue = validatedCompositePrimaryKeyValue(primaryKey, value);
114
+ return JSON.stringify(primaryKey.map((key) => validatedValue[key]));
115
+ }
116
+ /**
117
+ * Restores a model identity from its canonical string representation.
118
+ * @param {ModelPrimaryKeyDefinition} primaryKey - Primary-key definition.
119
+ * @param {string} cacheKey - Canonical identity key.
120
+ * @returns {ModelPrimaryKeyValue} - Restored identity.
121
+ */
122
+ export function modelPrimaryKeyValueFromCacheKey(primaryKey, cacheKey) {
123
+ if (!Array.isArray(primaryKey))
124
+ return cacheKey;
125
+ let parsed;
126
+ try {
127
+ parsed = JSON.parse(cacheKey);
128
+ }
129
+ catch (error) {
130
+ if (!(error instanceof SyntaxError))
131
+ throw error;
132
+ throw new TypeError("Expected composite primary key cache value to be valid JSON.", { cause: error });
133
+ }
134
+ if (!Array.isArray(parsed) || parsed.length !== primaryKey.length) {
135
+ throw new TypeError(`Expected composite primary key cache value with ${primaryKey.length} fields.`);
136
+ }
137
+ /** @type {CompositeModelPrimaryKeyValue} */
138
+ const value = {};
139
+ for (let index = 0; index < primaryKey.length; index += 1) {
140
+ value[primaryKey[index]] = parsed[index];
141
+ }
142
+ return validatedCompositePrimaryKeyValue(primaryKey, value);
143
+ }
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcHJpbWFyeS1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sYUFBYSxNQUFNLG1CQUFtQixDQUFBO0FBRTdDLHVEQUF1RDtBQUN2RCw2REFBNkQ7QUFDN0QscUZBQXFGO0FBQ3JGLDRGQUE0RjtBQUU1Rjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxVQUFVLEVBQUUsS0FBSztJQUNqRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLFNBQVMsQ0FBQywrREFBK0QsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUgsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtREFBbUQsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEcsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUE7SUFFekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFM0IsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENB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QUM7UUFDbEUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtREFBbUQsVUFBVSxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUE7SUFDckcsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUE7SUFFaEIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFELEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUVELE9BQU8saUNBQWlDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSBcIi4vcGxhaW4tb2JqZWN0LmpzXCJcblxuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBudW1iZXJ9IE1vZGVsUHJpbWFyeUtleVNjYWxhciAqL1xuLyoqIEB0eXBlZGVmIHtzdHJpbmcgfCBzdHJpbmdbXX0gTW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFByaW1hcnlLZXlTY2FsYXI+fSBDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZSAqL1xuLyoqIEB0eXBlZGVmIHtNb2RlbFByaW1hcnlLZXlTY2FsYXIgfCBDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gTW9kZWxQcmltYXJ5S2V5VmFsdWUgKi9cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gdW50cnVzdGVkIGNvbXBvc2l0ZSBpZGVudGl0eSBhbmQgcmV0dXJucyBpdHMgZGVmaW5pdGlvbi1vcmRlcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByaW1hcnlLZXkgLSBDb21wb3NpdGUgcHJpbWFyeS1rZXkgZGVmaW5pdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHJldHVybnMge0NvbXBvc2l0ZU1vZGVsUHJpbWFyeUtleVZhbHVlfSAtIFZhbGlkYXRlZCBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlZENvbXBvc2l0ZVByaW1hcnlLZXlWYWx1ZShwcmltYXJ5S2V5LCB2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBpZGVudGl0eSB0byBiZSBhIHBsYWluIG9iamVjdC5cIilcbiAgfVxuXG4gIGNvbnN0IHZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKVxuXG4gIGlmICh2YWx1ZUtleXMubGVuZ3RoICE9PSBwcmltYXJ5S2V5Lmxlbmd0aCB8fCBwcmltYXJ5S2V5LnNvbWUoKGtleSkgPT4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgaWRlbnRpdHkgZmllbGRzOiAke3ByaW1hcnlLZXkuam9pbihcIiwgXCIpfS5gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gKi9cbiAgY29uc3QgdmFsaWRhdGVkVmFsdWUgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIHByaW1hcnlLZXkpIHtcbiAgICBjb25zdCBrZXlWYWx1ZSA9IHZhbHVlW2tleV1cblxuICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGtleVZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgaWRlbnRpdHkgZmllbGQgJyR7a2V5fScgdG8gYmUgYSBzdHJpbmcgb3IgbnVtYmVyLmApXG4gICAgfVxuXG4gICAgdmFsaWRhdGVkVmFsdWVba2V5XSA9IGtleVZhbHVlXG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkVmFsdWVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2NhbGFyIHByaW1hcnkta2V5IGRlZmluaXRpb24gb3IgZmFpbHMgYXQgYSBmZWF0dXJlIGJvdW5kYXJ5IHRoYXQgY2Fubm90IHJlcHJlc2VudCBjb21wb3NpdGUgaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7TW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbn0gcHJpbWFyeUtleSAtIFByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIHJlcXVpcmluZyBhIHNjYWxhciBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2NhbGFyIHByaW1hcnkta2V5IGNvbHVtbiBvciBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxhck1vZGVsUHJpbWFyeUtleShwcmltYXJ5S2V5LCBvcGVyYXRpb24pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJpbWFyeUtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b3BlcmF0aW9ufSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBvc2l0ZSBwcmltYXJ5IGtleXMuYClcbiAgfVxuXG4gIHJldHVybiBwcmltYXJ5S2V5XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNjYWxhciBpZGVudGl0eSBvciBmYWlscyBhdCBhIGZlYXR1cmUgYm91bmRhcnkgdGhhdCBjYW5ub3QgcmVwcmVzZW50IGNvbXBvc2l0ZSBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlWYWx1ZX0gdmFsdWUgLSBNb2RlbCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBPcGVyYXRpb24gcmVxdWlyaW5nIGEgc2NhbGFyIGlkZW50aXR5LlxuICogQHJldHVybnMge01vZGVsUHJpbWFyeUtleVNjYWxhcn0gLSBTY2FsYXIgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZSh2YWx1ZSwgb3BlcmF0aW9uKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZG9lcyBub3Qgc3VwcG9ydCBjb21wb3NpdGUgcHJpbWFyeSBrZXlzLmApXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBCdWlsZHMgcXVlcnkgY29uZGl0aW9ucyBmcm9tIGEgc2NhbGFyIG9yIGNvbXBvc2l0ZSBtb2RlbCBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbn0gcHJpbWFyeUtleSAtIFByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIENhbmRpZGF0ZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBNb2RlbFByaW1hcnlLZXlTY2FsYXI+fSAtIFByaW1hcnkta2V5IHF1ZXJ5IGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFByaW1hcnlLZXlDb25kaXRpb25zKHByaW1hcnlLZXksIHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gdmFsaWRhdGVkQ29tcG9zaXRlUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHZhbHVlKVxuXG4gIHJldHVybiB7W3ByaW1hcnlLZXldOiAvKiogQHR5cGUge01vZGVsUHJpbWFyeUtleVNjYWxhcn0gKi8gKHZhbHVlKX1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBxdWFsaWZpZWQgU1FMIHByZWRpY2F0ZSBtYXRjaGluZyBhbnkgc3VwcGxpZWQgY29tcG9zaXRlIGlkZW50aXR5LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gTW9kZWwgY2xhc3Mgb3duaW5nIHRoZSBpZGVudGl0eSBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wcmltYXJ5S2V5IC0gQ29tcG9zaXRlIHByaW1hcnkta2V5IGRlZmluaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gYXJncy5xdWVyeSAtIFF1ZXJ5IHJlY2VpdmluZyB0aGUgcHJlZGljYXRlLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlWYWx1ZVtdfSBhcmdzLnZhbHVlcyAtIENhbmRpZGF0ZSBpZGVudGl0aWVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdWFsaWZpZWQgU1FMIHByZWRpY2F0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2l0ZU1vZGVsUHJpbWFyeUtleUNvaG9ydFNxbCh7bW9kZWxDbGFzcywgcHJpbWFyeUtleSwgcXVlcnksIHZhbHVlc30pIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBcIigxID0gMClcIlxuXG4gIGNvbnN0IHRhYmxlU3FsID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUocXVlcnkuZ2V0VGFibGVSZWZlcmVuY2VGb3JKb2luKCkpXG5cbiAgcmV0dXJuIGAoJHt2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBtb2RlbFByaW1hcnlLZXlDb25kaXRpb25zKHByaW1hcnlLZXksIHZhbHVlKVxuICAgIGNvbnN0IGlkZW50aXR5U3FsID0gcHJpbWFyeUtleS5tYXAoKGF0dHJpYnV0ZU5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBtb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICAgIHJldHVybiBgJHt0YWJsZVNxbH0uJHtxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtxdWVyeS5kcml2ZXIucXVvdGUoY29uZGl0aW9uc1thdHRyaWJ1dGVOYW1lXSl9YFxuICAgIH0pLmpvaW4oXCIgQU5EIFwiKVxuXG4gICAgcmV0dXJuIGAoJHtpZGVudGl0eVNxbH0pYFxuICB9KS5qb2luKFwiIE9SIFwiKX0pYFxufVxuXG4vKipcbiAqIFJlYWRzIGEgc2NhbGFyIG9yIGNvbXBvc2l0ZSBpZGVudGl0eSB0aHJvdWdoIHRoZSBvd25pbmcgbW9kZWwncyB2YWx1ZSByZWFkZXIuXG4gKiBAcGFyYW0ge01vZGVsUHJpbWFyeUtleURlZmluaXRpb259IHByaW1hcnlLZXkgLSBQcmltYXJ5LWtleSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHsoa2V5OiBzdHJpbmcpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWFkIC0gUHJpbWFyeS1rZXkgdmFsdWUgcmVhZGVyLlxuICogQHJldHVybnMge01vZGVsUHJpbWFyeUtleVZhbHVlfSAtIE1vZGVsIGlkZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1vZGVsUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHJlYWQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gLyoqIEB0eXBlIHtNb2RlbFByaW1hcnlLZXlTY2FsYXJ9ICovIChyZWFkKHByaW1hcnlLZXkpKVxuXG4gIC8qKiBAdHlwZSB7Q29tcG9zaXRlTW9kZWxQcmltYXJ5S2V5VmFsdWV9ICovXG4gIGNvbnN0IHZhbHVlID0ge31cblxuICBmb3IgKGNvbnN0IGtleSBvZiBwcmltYXJ5S2V5KSB2YWx1ZVtrZXldID0gLyoqIEB0eXBlIHtNb2RlbFByaW1hcnlLZXlTY2FsYXJ9ICovIChyZWFkKGtleSkpXG5cbiAgcmV0dXJuIHZhbGlkYXRlZENvbXBvc2l0ZVByaW1hcnlLZXlWYWx1ZShwcmltYXJ5S2V5LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIHVuYW1iaWd1b3VzIG1hcCBrZXkgd2hpbGUgcHJlc2VydmluZyBsZWdhY3kgc2NhbGFyIG1hcCBrZXlzLlxuICogQHBhcmFtIHtNb2RlbFByaW1hcnlLZXlEZWZpbml0aW9ufSBwcmltYXJ5S2V5IC0gUHJpbWFyeS1rZXkgZGVmaW5pdGlvbi5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHJldHVybnMge3N0cmluZ30gLSBDYW5vbmljYWwgaWRlbnRpdHkga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxQcmltYXJ5S2V5Q2FjaGVLZXkocHJpbWFyeUtleSwgdmFsdWUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm4gU3RyaW5nKHZhbHVlKVxuXG4gIGNvbnN0IHZhbGlkYXRlZFZhbHVlID0gdmFsaWRhdGVkQ29tcG9zaXRlUHJpbWFyeUtleVZhbHVlKHByaW1hcnlLZXksIHZhbHVlKVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShwcmltYXJ5S2V5Lm1hcCgoa2V5KSA9PiB2YWxpZGF0ZWRWYWx1ZVtrZXldKSlcbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIG1vZGVsIGlkZW50aXR5IGZyb20gaXRzIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge01vZGVsUHJpbWFyeUtleURlZmluaXRpb259IHByaW1hcnlLZXkgLSBQcmltYXJ5LWtleSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlS2V5IC0gQ2Fub25pY2FsIGlkZW50aXR5IGtleS5cbiAqIEByZXR1cm5zIHtNb2RlbFByaW1hcnlLZXlWYWx1ZX0gLSBSZXN0b3JlZCBpZGVudGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUHJpbWFyeUtleVZhbHVlRnJvbUNhY2hlS2V5KHByaW1hcnlLZXksIGNhY2hlS2V5KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwcmltYXJ5S2V5KSkgcmV0dXJuIGNhY2hlS2V5XG5cbiAgbGV0IHBhcnNlZFxuXG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShjYWNoZUtleSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSkgdGhyb3cgZXJyb3JcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBjb21wb3NpdGUgcHJpbWFyeSBrZXkgY2FjaGUgdmFsdWUgdG8gYmUgdmFsaWQgSlNPTi5cIiwge2NhdXNlOiBlcnJvcn0pXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSB8fCBwYXJzZWQubGVuZ3RoICE9PSBwcmltYXJ5S2V5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSBjYWNoZSB2YWx1ZSB3aXRoICR7cHJpbWFyeUtleS5sZW5ndGh9IGZpZWxkcy5gKVxuICB9XG5cbiAgLyoqIEB0eXBlIHtDb21wb3NpdGVNb2RlbFByaW1hcnlLZXlWYWx1ZX0gKi9cbiAgY29uc3QgdmFsdWUgPSB7fVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcmltYXJ5S2V5Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHZhbHVlW3ByaW1hcnlLZXlbaW5kZXhdXSA9IHBhcnNlZFtpbmRleF1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWRDb21wb3NpdGVQcmltYXJ5S2V5VmFsdWUocHJpbWFyeUtleSwgdmFsdWUpXG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Computes a SHA-256 hex digest for arbitrary bytes without Node-only imports.
3
+ * @param {Uint8Array} bytes - Bytes to digest.
4
+ * @returns {string} Hex digest.
5
+ */
6
+ export default function sha256BytesHex(bytes: Uint8Array): string;
7
+ //# sourceMappingURL=sha256-bytes-hex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha256-bytes-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-bytes-hex.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,KAAK,EAHjC,UAGiC,GAF/B,MAAM,CAmFlB"}
@@ -0,0 +1,117 @@
1
+ // @ts-check
2
+ /**
3
+ * Computes a SHA-256 hex digest for arbitrary bytes without Node-only imports.
4
+ * @param {Uint8Array} bytes - Bytes to digest.
5
+ * @returns {string} Hex digest.
6
+ */
7
+ export default function sha256BytesHex(bytes) {
8
+ const bitLength = bytes.length * 8;
9
+ const blockCount = Math.ceil((bytes.length + 9) / 64);
10
+ const block = new Uint8Array(64);
11
+ const hash = SHA256_INITIAL_HASH.slice();
12
+ /** @type {number[]} */
13
+ const words = new Array(64);
14
+ const highLength = Math.floor(bitLength / 0x100000000);
15
+ const lowLength = bitLength >>> 0;
16
+ for (let blockIndex = 0; blockIndex < blockCount; blockIndex += 1) {
17
+ const offset = blockIndex * 64;
18
+ const chunkLength = Math.min(64, Math.max(0, bytes.length - offset));
19
+ block.fill(0);
20
+ if (chunkLength > 0)
21
+ block.set(bytes.subarray(offset, offset + chunkLength));
22
+ if (bytes.length >= offset && bytes.length < offset + 64)
23
+ block[bytes.length - offset] = 0x80;
24
+ if (blockIndex === blockCount - 1) {
25
+ block[56] = (highLength >>> 24) & 0xff;
26
+ block[57] = (highLength >>> 16) & 0xff;
27
+ block[58] = (highLength >>> 8) & 0xff;
28
+ block[59] = highLength & 0xff;
29
+ block[60] = (lowLength >>> 24) & 0xff;
30
+ block[61] = (lowLength >>> 16) & 0xff;
31
+ block[62] = (lowLength >>> 8) & 0xff;
32
+ block[63] = lowLength & 0xff;
33
+ }
34
+ for (let index = 0; index < 16; index++) {
35
+ const byteIndex = index * 4;
36
+ words[index] = ((block[byteIndex] << 24) | (block[byteIndex + 1] << 16) | (block[byteIndex + 2] << 8) | block[byteIndex + 3]) >>> 0;
37
+ }
38
+ for (let index = 16; index < 64; index++) {
39
+ const s0 = rotateRight(words[index - 15], 7) ^ rotateRight(words[index - 15], 18) ^ (words[index - 15] >>> 3);
40
+ const s1 = rotateRight(words[index - 2], 17) ^ rotateRight(words[index - 2], 19) ^ (words[index - 2] >>> 10);
41
+ words[index] = add32(words[index - 16], s0, words[index - 7], s1);
42
+ }
43
+ let a = hash[0];
44
+ let b = hash[1];
45
+ let c = hash[2];
46
+ let d = hash[3];
47
+ let e = hash[4];
48
+ let f = hash[5];
49
+ let g = hash[6];
50
+ let h = hash[7];
51
+ for (let index = 0; index < 64; index++) {
52
+ const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
53
+ const ch = (e & f) ^ ((~e) & g);
54
+ const temp1 = add32(h, s1, ch, SHA256_K[index], words[index]);
55
+ const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
56
+ const maj = (a & b) ^ (a & c) ^ (b & c);
57
+ const temp2 = add32(s0, maj);
58
+ h = g;
59
+ g = f;
60
+ f = e;
61
+ e = add32(d, temp1);
62
+ d = c;
63
+ c = b;
64
+ b = a;
65
+ a = add32(temp1, temp2);
66
+ }
67
+ hash[0] = add32(hash[0], a);
68
+ hash[1] = add32(hash[1], b);
69
+ hash[2] = add32(hash[2], c);
70
+ hash[3] = add32(hash[3], d);
71
+ hash[4] = add32(hash[4], e);
72
+ hash[5] = add32(hash[5], f);
73
+ hash[6] = add32(hash[6], g);
74
+ hash[7] = add32(hash[7], h);
75
+ }
76
+ return hash.map((value) => value.toString(16).padStart(8, "0")).join("");
77
+ }
78
+ const SHA256_INITIAL_HASH = [
79
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
80
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
81
+ ];
82
+ const SHA256_K = [
83
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
84
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
85
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
86
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
87
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
88
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
89
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
90
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
91
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
92
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
93
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
94
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
95
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
96
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
97
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
98
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
99
+ ];
100
+ /**
101
+ * Rotates an unsigned value right.
102
+ * @param {number} value Unsigned value.
103
+ * @param {number} bits Rotation count.
104
+ * @returns {number} Rotated value.
105
+ */
106
+ function rotateRight(value, bits) {
107
+ return (value >>> bits) | (value << (32 - bits));
108
+ }
109
+ /**
110
+ * Adds numbers with unsigned 32-bit overflow.
111
+ * @param {...number} values Values to add.
112
+ * @returns {number} Unsigned sum.
113
+ */
114
+ function add32(...values) {
115
+ return values.reduce((sum, value) => (sum + value) >>> 0, 0);
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWJ5dGVzLWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtYnl0ZXMtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxjQUFjLENBQUMsS0FBSztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNoQyxNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN4Qyx1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsU0FBUyxLQUFLLENBQUMsQ0FBQTtJQUVqQyxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsVUFBVSxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsRSxNQUFNLE1BQU0sR0FBRyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUVwRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2IsSUFBSSxXQUFXLEdBQUcsQ0FBQztZQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDNUUsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxFQUFFO1lBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTdGLElBQUksVUFBVSxLQUFLLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDdEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUNyQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQTtZQUM3QixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFBO1lBQ3JDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUE7WUFDckMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUNwQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUM5QixDQUFDO1FBRUQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7WUFFM0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JJLENBQUM7UUFFRCxLQUFLLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzdHLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUU1RyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbkUsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUVmLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUN0RSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzdELE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFFNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUMxRSxDQUFDO0FBRUQsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7Q0FDL0MsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHO0lBQ2YsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtDQUMvQyxDQUFBO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU07SUFDdEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBDb21wdXRlcyBhIFNIQS0yNTYgaGV4IGRpZ2VzdCBmb3IgYXJiaXRyYXJ5IGJ5dGVzIHdpdGhvdXQgTm9kZS1vbmx5IGltcG9ydHMuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzIC0gQnl0ZXMgdG8gZGlnZXN0LlxuICogQHJldHVybnMge3N0cmluZ30gSGV4IGRpZ2VzdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhMjU2Qnl0ZXNIZXgoYnl0ZXMpIHtcbiAgY29uc3QgYml0TGVuZ3RoID0gYnl0ZXMubGVuZ3RoICogOFxuICBjb25zdCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKChieXRlcy5sZW5ndGggKyA5KSAvIDY0KVxuICBjb25zdCBibG9jayA9IG5ldyBVaW50OEFycmF5KDY0KVxuICBjb25zdCBoYXNoID0gU0hBMjU2X0lOSVRJQUxfSEFTSC5zbGljZSgpXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IHdvcmRzID0gbmV3IEFycmF5KDY0KVxuXG4gIGNvbnN0IGhpZ2hMZW5ndGggPSBNYXRoLmZsb29yKGJpdExlbmd0aCAvIDB4MTAwMDAwMDAwKVxuICBjb25zdCBsb3dMZW5ndGggPSBiaXRMZW5ndGggPj4+IDBcblxuICBmb3IgKGxldCBibG9ja0luZGV4ID0gMDsgYmxvY2tJbmRleCA8IGJsb2NrQ291bnQ7IGJsb2NrSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGJsb2NrSW5kZXggKiA2NFxuICAgIGNvbnN0IGNodW5rTGVuZ3RoID0gTWF0aC5taW4oNjQsIE1hdGgubWF4KDAsIGJ5dGVzLmxlbmd0aCAtIG9mZnNldCkpXG5cbiAgICBibG9jay5maWxsKDApXG4gICAgaWYgKGNodW5rTGVuZ3RoID4gMCkgYmxvY2suc2V0KGJ5dGVzLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgY2h1bmtMZW5ndGgpKVxuICAgIGlmIChieXRlcy5sZW5ndGggPj0gb2Zmc2V0ICYmIGJ5dGVzLmxlbmd0aCA8IG9mZnNldCArIDY0KSBibG9ja1tieXRlcy5sZW5ndGggLSBvZmZzZXRdID0gMHg4MFxuXG4gICAgaWYgKGJsb2NrSW5kZXggPT09IGJsb2NrQ291bnQgLSAxKSB7XG4gICAgICBibG9ja1s1Nl0gPSAoaGlnaExlbmd0aCA+Pj4gMjQpICYgMHhmZlxuICAgICAgYmxvY2tbNTddID0gKGhpZ2hMZW5ndGggPj4+IDE2KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzU4XSA9IChoaWdoTGVuZ3RoID4+PiA4KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzU5XSA9IGhpZ2hMZW5ndGggJiAweGZmXG4gICAgICBibG9ja1s2MF0gPSAobG93TGVuZ3RoID4+PiAyNCkgJiAweGZmXG4gICAgICBibG9ja1s2MV0gPSAobG93TGVuZ3RoID4+PiAxNikgJiAweGZmXG4gICAgICBibG9ja1s2Ml0gPSAobG93TGVuZ3RoID4+PiA4KSAmIDB4ZmZcbiAgICAgIGJsb2NrWzYzXSA9IGxvd0xlbmd0aCAmIDB4ZmZcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMTY7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGJ5dGVJbmRleCA9IGluZGV4ICogNFxuXG4gICAgICB3b3Jkc1tpbmRleF0gPSAoKGJsb2NrW2J5dGVJbmRleF0gPDwgMjQpIHwgKGJsb2NrW2J5dGVJbmRleCArIDFdIDw8IDE2KSB8IChibG9ja1tieXRlSW5kZXggKyAyXSA8PCA4KSB8IGJsb2NrW2J5dGVJbmRleCArIDNdKSA+Pj4gMFxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMTY7IGluZGV4IDwgNjQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAxNV0sIDcpIF4gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAxNV0sIDE4KSBeICh3b3Jkc1tpbmRleCAtIDE1XSA+Pj4gMylcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAyXSwgMTcpIF4gcm90YXRlUmlnaHQod29yZHNbaW5kZXggLSAyXSwgMTkpIF4gKHdvcmRzW2luZGV4IC0gMl0gPj4+IDEwKVxuXG4gICAgICB3b3Jkc1tpbmRleF0gPSBhZGQzMih3b3Jkc1tpbmRleCAtIDE2XSwgczAsIHdvcmRzW2luZGV4IC0gN10sIHMxKVxuICAgIH1cblxuICAgIGxldCBhID0gaGFzaFswXVxuICAgIGxldCBiID0gaGFzaFsxXVxuICAgIGxldCBjID0gaGFzaFsyXVxuICAgIGxldCBkID0gaGFzaFszXVxuICAgIGxldCBlID0gaGFzaFs0XVxuICAgIGxldCBmID0gaGFzaFs1XVxuICAgIGxldCBnID0gaGFzaFs2XVxuICAgIGxldCBoID0gaGFzaFs3XVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBzMSA9IHJvdGF0ZVJpZ2h0KGUsIDYpIF4gcm90YXRlUmlnaHQoZSwgMTEpIF4gcm90YXRlUmlnaHQoZSwgMjUpXG4gICAgICBjb25zdCBjaCA9IChlICYgZikgXiAoKH5lKSAmIGcpXG4gICAgICBjb25zdCB0ZW1wMSA9IGFkZDMyKGgsIHMxLCBjaCwgU0hBMjU2X0tbaW5kZXhdLCB3b3Jkc1tpbmRleF0pXG4gICAgICBjb25zdCBzMCA9IHJvdGF0ZVJpZ2h0KGEsIDIpIF4gcm90YXRlUmlnaHQoYSwgMTMpIF4gcm90YXRlUmlnaHQoYSwgMjIpXG4gICAgICBjb25zdCBtYWogPSAoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYylcbiAgICAgIGNvbnN0IHRlbXAyID0gYWRkMzIoczAsIG1hailcblxuICAgICAgaCA9IGdcbiAgICAgIGcgPSBmXG4gICAgICBmID0gZVxuICAgICAgZSA9IGFkZDMyKGQsIHRlbXAxKVxuICAgICAgZCA9IGNcbiAgICAgIGMgPSBiXG4gICAgICBiID0gYVxuICAgICAgYSA9IGFkZDMyKHRlbXAxLCB0ZW1wMilcbiAgICB9XG5cbiAgICBoYXNoWzBdID0gYWRkMzIoaGFzaFswXSwgYSlcbiAgICBoYXNoWzFdID0gYWRkMzIoaGFzaFsxXSwgYilcbiAgICBoYXNoWzJdID0gYWRkMzIoaGFzaFsyXSwgYylcbiAgICBoYXNoWzNdID0gYWRkMzIoaGFzaFszXSwgZClcbiAgICBoYXNoWzRdID0gYWRkMzIoaGFzaFs0XSwgZSlcbiAgICBoYXNoWzVdID0gYWRkMzIoaGFzaFs1XSwgZilcbiAgICBoYXNoWzZdID0gYWRkMzIoaGFzaFs2XSwgZylcbiAgICBoYXNoWzddID0gYWRkMzIoaGFzaFs3XSwgaClcbiAgfVxuXG4gIHJldHVybiBoYXNoLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikpLmpvaW4oXCJcIilcbn1cblxuY29uc3QgU0hBMjU2X0lOSVRJQUxfSEFTSCA9IFtcbiAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXVxuXG5jb25zdCBTSEEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXVxuXG4vKipcbiAqIFJvdGF0ZXMgYW4gdW5zaWduZWQgdmFsdWUgcmlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVW5zaWduZWQgdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0cyBSb3RhdGlvbiBjb3VudC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJvdGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KHZhbHVlLCBiaXRzKSB7XG4gIHJldHVybiAodmFsdWUgPj4+IGJpdHMpIHwgKHZhbHVlIDw8ICgzMiAtIGJpdHMpKVxufVxuXG4vKipcbiAqIEFkZHMgbnVtYmVycyB3aXRoIHVuc2lnbmVkIDMyLWJpdCBvdmVyZmxvdy5cbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSB2YWx1ZXMgVmFsdWVzIHRvIGFkZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIHN1bS5cbiAqL1xuZnVuY3Rpb24gYWRkMzIoLi4udmFsdWVzKSB7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChzdW0sIHZhbHVlKSA9PiAoc3VtICsgdmFsdWUpID4+PiAwLCAwKVxufVxuIl19
@@ -1,10 +1,8 @@
1
1
  /**
2
2
  * Computes SHA-256 without importing Node-only crypto modules, keeping this
3
- * module safe for Expo/browser bundles. Implementation is a straightforward
4
- * pure-JavaScript SHA-256 derived from FIPS 180-4, using only 32-bit unsigned
5
- * integer arithmetic.
3
+ * module safe for Expo/browser bundles.
6
4
  * @param {string} message - UTF-8 message.
7
- * @returns {string} - Hex digest.
5
+ * @returns {string} Hex digest.
8
6
  */
9
7
  export default function sha256Hex(message: string): string;
10
8
  //# sourceMappingURL=sha256-hex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sha256-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-hex.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,EAH9B,MAG8B,GAF5B,MAAM,CAiElB"}
1
+ {"version":3,"file":"sha256-hex.d.ts","sourceRoot":"","sources":["../../../src/utils/sha256-hex.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,EAH9B,MAG8B,GAF5B,MAAM,CAIlB"}
@@ -1,126 +1,12 @@
1
+ // @ts-check
2
+ import sha256BytesHex from "./sha256-bytes-hex.js";
1
3
  /**
2
4
  * Computes SHA-256 without importing Node-only crypto modules, keeping this
3
- * module safe for Expo/browser bundles. Implementation is a straightforward
4
- * pure-JavaScript SHA-256 derived from FIPS 180-4, using only 32-bit unsigned
5
- * integer arithmetic.
5
+ * module safe for Expo/browser bundles.
6
6
  * @param {string} message - UTF-8 message.
7
- * @returns {string} - Hex digest.
7
+ * @returns {string} Hex digest.
8
8
  */
9
9
  export default function sha256Hex(message) {
10
- const bytes = utf8Bytes(message);
11
- const padded = [...bytes];
12
- const bitLength = bytes.length * 8;
13
- const hash = [...SHA256_INITIAL_HASH];
14
- /** @type {number[]} */
15
- const words = new Array(64);
16
- padded.push(0x80);
17
- while (padded.length % 64 !== 56)
18
- padded.push(0);
19
- const highLength = Math.floor(bitLength / 0x100000000);
20
- const lowLength = bitLength >>> 0;
21
- for (const value of [highLength, lowLength]) {
22
- padded.push((value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff);
23
- }
24
- for (let offset = 0; offset < padded.length; offset += 64) {
25
- for (let i = 0; i < 16; i++) {
26
- const index = offset + (i * 4);
27
- words[i] = (((padded[index] || 0) << 24) | ((padded[index + 1] || 0) << 16) | ((padded[index + 2] || 0) << 8) | (padded[index + 3] || 0)) >>> 0;
28
- }
29
- for (let i = 16; i < 64; i++) {
30
- const s0 = rotateRight(words[i - 15], 7) ^ rotateRight(words[i - 15], 18) ^ (words[i - 15] >>> 3);
31
- const s1 = rotateRight(words[i - 2], 17) ^ rotateRight(words[i - 2], 19) ^ (words[i - 2] >>> 10);
32
- words[i] = add32(words[i - 16], s0, words[i - 7], s1);
33
- }
34
- let [a, b, c, d, e, f, g, h] = hash;
35
- for (let i = 0; i < 64; i++) {
36
- const s1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
37
- const ch = (e & f) ^ ((~e) & g);
38
- const temp1 = add32(h, s1, ch, SHA256_K[i], words[i]);
39
- const s0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
40
- const maj = (a & b) ^ (a & c) ^ (b & c);
41
- const temp2 = add32(s0, maj);
42
- h = g;
43
- g = f;
44
- f = e;
45
- e = add32(d, temp1);
46
- d = c;
47
- c = b;
48
- b = a;
49
- a = add32(temp1, temp2);
50
- }
51
- hash[0] = add32(hash[0], a);
52
- hash[1] = add32(hash[1], b);
53
- hash[2] = add32(hash[2], c);
54
- hash[3] = add32(hash[3], d);
55
- hash[4] = add32(hash[4], e);
56
- hash[5] = add32(hash[5], f);
57
- hash[6] = add32(hash[6], g);
58
- hash[7] = add32(hash[7], h);
59
- }
60
- return hash.map((value) => value.toString(16).padStart(8, "0")).join("");
10
+ return sha256BytesHex(new TextEncoder().encode(message));
61
11
  }
62
- const SHA256_INITIAL_HASH = [
63
- 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
64
- 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
65
- ];
66
- const SHA256_K = [
67
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
68
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
69
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
70
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
71
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
72
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
73
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
74
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
75
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
76
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
77
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
78
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
79
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
80
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
81
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
82
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
83
- ];
84
- /**
85
- * Converts a string to UTF-8 bytes.
86
- * @param {string} value - String value.
87
- * @returns {number[]} - UTF-8 bytes.
88
- */
89
- function utf8Bytes(value) {
90
- /** @type {number[]} */
91
- const bytes = [];
92
- for (const character of value) {
93
- const codePoint = /** @type {number} */ (character.codePointAt(0));
94
- if (codePoint <= 0x7f) {
95
- bytes.push(codePoint);
96
- }
97
- else if (codePoint <= 0x7ff) {
98
- bytes.push(0xc0 | (codePoint >>> 6), 0x80 | (codePoint & 0x3f));
99
- }
100
- else if (codePoint <= 0xffff) {
101
- bytes.push(0xe0 | (codePoint >>> 12), 0x80 | ((codePoint >>> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
102
- }
103
- else {
104
- bytes.push(0xf0 | (codePoint >>> 18), 0x80 | ((codePoint >>> 12) & 0x3f), 0x80 | ((codePoint >>> 6) & 0x3f), 0x80 | (codePoint & 0x3f));
105
- }
106
- }
107
- return bytes;
108
- }
109
- /**
110
- * Adds unsigned 32-bit integers.
111
- * @param {...number} values - Values to add.
112
- * @returns {number} - Unsigned 32-bit result.
113
- */
114
- function add32(...values) {
115
- return values.reduce((sum, value) => (sum + value) >>> 0, 0);
116
- }
117
- /**
118
- * Rotates a 32-bit integer right.
119
- * @param {number} value - Value to rotate.
120
- * @param {number} bits - Bit count.
121
- * @returns {number} - Rotated value.
122
- */
123
- function rotateRight(value, bits) {
124
- return (value >>> bits) | (value << (32 - bits));
125
- }
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLFNBQVMsQ0FBQyxPQUFPO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7SUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUE7SUFDckMsdUJBQXVCO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRTNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakIsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFO1FBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQTtJQUN0RCxNQUFNLFNBQVMsR0FBRyxTQUFTLEtBQUssQ0FBQyxDQUFBO0lBRWpDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFFOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakosQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDakcsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBRWhHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUE7UUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUU1QixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNMLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDTCxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzFFLENBQUM7QUFFRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtDQUMvQyxDQUFBO0FBRUQsTUFBTSxRQUFRLEdBQUc7SUFDZixVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0lBQzlDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7SUFDOUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtJQUM5QyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0NBQy9DLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsS0FBSztJQUN0Qix1QkFBdUI7SUFDdkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFBO0lBRWhCLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEUsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sSUFBSSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekksQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSTtJQUM5QixPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcHV0ZXMgU0hBLTI1NiB3aXRob3V0IGltcG9ydGluZyBOb2RlLW9ubHkgY3J5cHRvIG1vZHVsZXMsIGtlZXBpbmcgdGhpc1xuICogbW9kdWxlIHNhZmUgZm9yIEV4cG8vYnJvd3NlciBidW5kbGVzLiBJbXBsZW1lbnRhdGlvbiBpcyBhIHN0cmFpZ2h0Zm9yd2FyZFxuICogcHVyZS1KYXZhU2NyaXB0IFNIQS0yNTYgZGVyaXZlZCBmcm9tIEZJUFMgMTgwLTQsIHVzaW5nIG9ubHkgMzItYml0IHVuc2lnbmVkXG4gKiBpbnRlZ2VyIGFyaXRobWV0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFVURi04IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEhleCBkaWdlc3QuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNoYTI1NkhleChtZXNzYWdlKSB7XG4gIGNvbnN0IGJ5dGVzID0gdXRmOEJ5dGVzKG1lc3NhZ2UpXG4gIGNvbnN0IHBhZGRlZCA9IFsuLi5ieXRlc11cbiAgY29uc3QgYml0TGVuZ3RoID0gYnl0ZXMubGVuZ3RoICogOFxuICBjb25zdCBoYXNoID0gWy4uLlNIQTI1Nl9JTklUSUFMX0hBU0hdXG4gIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGNvbnN0IHdvcmRzID0gbmV3IEFycmF5KDY0KVxuXG4gIHBhZGRlZC5wdXNoKDB4ODApXG4gIHdoaWxlIChwYWRkZWQubGVuZ3RoICUgNjQgIT09IDU2KSBwYWRkZWQucHVzaCgwKVxuXG4gIGNvbnN0IGhpZ2hMZW5ndGggPSBNYXRoLmZsb29yKGJpdExlbmd0aCAvIDB4MTAwMDAwMDAwKVxuICBjb25zdCBsb3dMZW5ndGggPSBiaXRMZW5ndGggPj4+IDBcblxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIFtoaWdoTGVuZ3RoLCBsb3dMZW5ndGhdKSB7XG4gICAgcGFkZGVkLnB1c2goKHZhbHVlID4+PiAyNCkgJiAweGZmLCAodmFsdWUgPj4+IDE2KSAmIDB4ZmYsICh2YWx1ZSA+Pj4gOCkgJiAweGZmLCB2YWx1ZSAmIDB4ZmYpXG4gIH1cblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwYWRkZWQubGVuZ3RoOyBvZmZzZXQgKz0gNjQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gb2Zmc2V0ICsgKGkgKiA0KVxuXG4gICAgICB3b3Jkc1tpXSA9ICgoKHBhZGRlZFtpbmRleF0gfHwgMCkgPDwgMjQpIHwgKChwYWRkZWRbaW5kZXggKyAxXSB8fCAwKSA8PCAxNikgfCAoKHBhZGRlZFtpbmRleCArIDJdIHx8IDApIDw8IDgpIHwgKHBhZGRlZFtpbmRleCArIDNdIHx8IDApKSA+Pj4gMFxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMwID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDE1XSwgNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMTVdLCAxOCkgXiAod29yZHNbaSAtIDE1XSA+Pj4gMylcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQod29yZHNbaSAtIDJdLCAxNykgXiByb3RhdGVSaWdodCh3b3Jkc1tpIC0gMl0sIDE5KSBeICh3b3Jkc1tpIC0gMl0gPj4+IDEwKVxuXG4gICAgICB3b3Jkc1tpXSA9IGFkZDMyKHdvcmRzW2kgLSAxNl0sIHMwLCB3b3Jkc1tpIC0gN10sIHMxKVxuICAgIH1cblxuICAgIGxldCBbYSwgYiwgYywgZCwgZSwgZiwgZywgaF0gPSBoYXNoXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHtcbiAgICAgIGNvbnN0IHMxID0gcm90YXRlUmlnaHQoZSwgNikgXiByb3RhdGVSaWdodChlLCAxMSkgXiByb3RhdGVSaWdodChlLCAyNSlcbiAgICAgIGNvbnN0IGNoID0gKGUgJiBmKSBeICgofmUpICYgZylcbiAgICAgIGNvbnN0IHRlbXAxID0gYWRkMzIoaCwgczEsIGNoLCBTSEEyNTZfS1tpXSwgd29yZHNbaV0pXG4gICAgICBjb25zdCBzMCA9IHJvdGF0ZVJpZ2h0KGEsIDIpIF4gcm90YXRlUmlnaHQoYSwgMTMpIF4gcm90YXRlUmlnaHQoYSwgMjIpXG4gICAgICBjb25zdCBtYWogPSAoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYylcbiAgICAgIGNvbnN0IHRlbXAyID0gYWRkMzIoczAsIG1hailcblxuICAgICAgaCA9IGdcbiAgICAgIGcgPSBmXG4gICAgICBmID0gZVxuICAgICAgZSA9IGFkZDMyKGQsIHRlbXAxKVxuICAgICAgZCA9IGNcbiAgICAgIGMgPSBiXG4gICAgICBiID0gYVxuICAgICAgYSA9IGFkZDMyKHRlbXAxLCB0ZW1wMilcbiAgICB9XG5cbiAgICBoYXNoWzBdID0gYWRkMzIoaGFzaFswXSwgYSlcbiAgICBoYXNoWzFdID0gYWRkMzIoaGFzaFsxXSwgYilcbiAgICBoYXNoWzJdID0gYWRkMzIoaGFzaFsyXSwgYylcbiAgICBoYXNoWzNdID0gYWRkMzIoaGFzaFszXSwgZClcbiAgICBoYXNoWzRdID0gYWRkMzIoaGFzaFs0XSwgZSlcbiAgICBoYXNoWzVdID0gYWRkMzIoaGFzaFs1XSwgZilcbiAgICBoYXNoWzZdID0gYWRkMzIoaGFzaFs2XSwgZylcbiAgICBoYXNoWzddID0gYWRkMzIoaGFzaFs3XSwgaClcbiAgfVxuXG4gIHJldHVybiBoYXNoLm1hcCgodmFsdWUpID0+IHZhbHVlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIikpLmpvaW4oXCJcIilcbn1cblxuY29uc3QgU0hBMjU2X0lOSVRJQUxfSEFTSCA9IFtcbiAgMHg2YTA5ZTY2NywgMHhiYjY3YWU4NSwgMHgzYzZlZjM3MiwgMHhhNTRmZjUzYSxcbiAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuXVxuXG5jb25zdCBTSEEyNTZfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSxcbiAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMyxcbiAgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCxcbiAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNyxcbiAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMyxcbiAgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSxcbiAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSxcbiAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCxcbiAgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMlxuXVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIFVURi04IGJ5dGVzLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gU3RyaW5nIHZhbHVlLlxuICogQHJldHVybnMge251bWJlcltdfSAtIFVURi04IGJ5dGVzLlxuICovXG5mdW5jdGlvbiB1dGY4Qnl0ZXModmFsdWUpIHtcbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZVBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkpXG5cbiAgICBpZiAoY29kZVBvaW50IDw9IDB4N2YpIHtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDw9IDB4N2ZmKSB7XG4gICAgICBieXRlcy5wdXNoKDB4YzAgfCAoY29kZVBvaW50ID4+PiA2KSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgIGJ5dGVzLnB1c2goMHhlMCB8IChjb2RlUG9pbnQgPj4+IDEyKSwgMHg4MCB8ICgoY29kZVBvaW50ID4+PiA2KSAmIDB4M2YpLCAweDgwIHwgKGNvZGVQb2ludCAmIDB4M2YpKVxuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcy5wdXNoKDB4ZjAgfCAoY29kZVBvaW50ID4+PiAxOCksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gMTIpICYgMHgzZiksIDB4ODAgfCAoKGNvZGVQb2ludCA+Pj4gNikgJiAweDNmKSwgMHg4MCB8IChjb2RlUG9pbnQgJiAweDNmKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuLyoqXG4gKiBBZGRzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2Vycy5cbiAqIEBwYXJhbSB7Li4ubnVtYmVyfSB2YWx1ZXMgLSBWYWx1ZXMgdG8gYWRkLlxuICogQHJldHVybnMge251bWJlcn0gLSBVbnNpZ25lZCAzMi1iaXQgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBhZGQzMiguLi52YWx1ZXMpIHtcbiAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IChzdW0gKyB2YWx1ZSkgPj4+IDAsIDApXG59XG5cbi8qKlxuICogUm90YXRlcyBhIDMyLWJpdCBpbnRlZ2VyIHJpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVmFsdWUgdG8gcm90YXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdHMgLSBCaXQgY291bnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFJvdGF0ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KHZhbHVlLCBiaXRzKSB7XG4gIHJldHVybiAodmFsdWUgPj4+IGJpdHMpIHwgKHZhbHVlIDw8ICgzMiAtIGJpdHMpKVxufVxuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhMjU2LWhleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9zaGEyNTYtaGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsU0FBUyxDQUFDLE9BQU87SUFDdkMsT0FBTyxjQUFjLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBzaGEyNTZCeXRlc0hleCBmcm9tIFwiLi9zaGEyNTYtYnl0ZXMtaGV4LmpzXCJcblxuLyoqXG4gKiBDb21wdXRlcyBTSEEtMjU2IHdpdGhvdXQgaW1wb3J0aW5nIE5vZGUtb25seSBjcnlwdG8gbW9kdWxlcywga2VlcGluZyB0aGlzXG4gKiBtb2R1bGUgc2FmZSBmb3IgRXhwby9icm93c2VyIGJ1bmRsZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFVURi04IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIZXggZGlnZXN0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGEyNTZIZXgobWVzc2FnZSkge1xuICByZXR1cm4gc2hhMjU2Qnl0ZXNIZXgobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpKVxufVxuIl19