@luochuanyuewu/payload-auth 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts +24 -0
  2. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts.map +1 -0
  3. package/dist/better-auth/adapter/generate-schema/generate-schema-builder.js +317 -0
  4. package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts +2 -0
  5. package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts.map +1 -0
  6. package/dist/better-auth/adapter/generate-schema/get-payload-schema.js +23 -0
  7. package/dist/better-auth/adapter/generate-schema/index.d.ts +5 -0
  8. package/dist/better-auth/adapter/generate-schema/index.d.ts.map +1 -0
  9. package/dist/better-auth/adapter/generate-schema/index.js +19 -0
  10. package/dist/better-auth/adapter/generate-schema/utils.d.ts +3 -0
  11. package/dist/better-auth/adapter/generate-schema/utils.d.ts.map +1 -0
  12. package/dist/better-auth/adapter/generate-schema/utils.js +20 -0
  13. package/dist/better-auth/adapter/index.d.ts +16 -0
  14. package/dist/better-auth/adapter/index.d.ts.map +1 -0
  15. package/dist/better-auth/adapter/index.js +717 -0
  16. package/dist/better-auth/adapter/transform/index.d.ts +31 -0
  17. package/dist/better-auth/adapter/transform/index.d.ts.map +1 -0
  18. package/dist/better-auth/adapter/transform/index.js +729 -0
  19. package/dist/better-auth/adapter/types.d.ts +11 -0
  20. package/dist/better-auth/adapter/types.d.ts.map +1 -0
  21. package/dist/better-auth/adapter/types.js +3 -0
  22. package/dist/better-auth/generated-types.d.ts +329 -0
  23. package/dist/better-auth/generated-types.d.ts.map +1 -0
  24. package/dist/better-auth/generated-types.js +4 -0
  25. package/dist/better-auth/index.d.ts +4 -0
  26. package/dist/better-auth/index.d.ts.map +1 -0
  27. package/dist/better-auth/index.js +5 -0
  28. package/dist/better-auth/plugin/constants.d.ts +231 -0
  29. package/dist/better-auth/plugin/constants.d.ts.map +1 -0
  30. package/dist/better-auth/plugin/constants.js +259 -0
  31. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts +13 -0
  32. package/dist/better-auth/plugin/helpers/check-plugin-exists.d.ts.map +1 -0
  33. package/dist/better-auth/plugin/helpers/check-plugin-exists.js +14 -0
  34. package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts +30 -0
  35. package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts.map +1 -0
  36. package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +46 -0
  37. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts +8 -0
  38. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts.map +1 -0
  39. package/dist/better-auth/plugin/helpers/get-admin-access.js +22 -0
  40. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts +6 -0
  41. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts.map +1 -0
  42. package/dist/better-auth/plugin/helpers/get-all-roles.js +20 -0
  43. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts +19 -0
  44. package/dist/better-auth/plugin/helpers/get-better-auth-schema.d.ts.map +1 -0
  45. package/dist/better-auth/plugin/helpers/get-better-auth-schema.js +75 -0
  46. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts +6 -0
  47. package/dist/better-auth/plugin/helpers/get-collection-slug.d.ts.map +1 -0
  48. package/dist/better-auth/plugin/helpers/get-collection-slug.js +20 -0
  49. package/dist/better-auth/plugin/helpers/get-collection.d.ts +28 -0
  50. package/dist/better-auth/plugin/helpers/get-collection.d.ts.map +1 -0
  51. package/dist/better-auth/plugin/helpers/get-collection.js +49 -0
  52. package/dist/better-auth/plugin/helpers/get-ip.d.ts +3 -0
  53. package/dist/better-auth/plugin/helpers/get-ip.d.ts.map +1 -0
  54. package/dist/better-auth/plugin/helpers/get-ip.js +31 -0
  55. package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts +3 -0
  56. package/dist/better-auth/plugin/helpers/get-signed-cookie.d.ts.map +1 -0
  57. package/dist/better-auth/plugin/helpers/get-signed-cookie.js +63 -0
  58. package/dist/better-auth/plugin/helpers/index.d.ts +2 -0
  59. package/dist/better-auth/plugin/helpers/index.d.ts.map +1 -0
  60. package/dist/better-auth/plugin/helpers/index.js +3 -0
  61. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts +60 -0
  62. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -0
  63. package/dist/better-auth/plugin/helpers/prepare-session-data.js +49 -0
  64. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts +21 -0
  65. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.d.ts.map +1 -0
  66. package/dist/better-auth/plugin/helpers/sync-resolved-schema-with-collection-map.js +63 -0
  67. package/dist/better-auth/plugin/index.d.ts +8 -0
  68. package/dist/better-auth/plugin/index.d.ts.map +1 -0
  69. package/dist/better-auth/plugin/index.js +103 -0
  70. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts +13 -0
  71. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.d.ts.map +1 -0
  72. package/dist/better-auth/plugin/lib/apply-disabled-default-auth-config.js +87 -0
  73. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts +4 -0
  74. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -0
  75. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +51 -0
  76. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +4 -0
  77. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -0
  78. package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +150 -0
  79. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts +6 -0
  80. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts.map +1 -0
  81. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.js +11 -0
  82. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts +3 -0
  83. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts.map +1 -0
  84. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.js +8 -0
  85. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +7 -0
  86. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -0
  87. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +117 -0
  88. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +4 -0
  89. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -0
  90. package/dist/better-auth/plugin/lib/build-collections/api-keys.js +174 -0
  91. package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts +4 -0
  92. package/dist/better-auth/plugin/lib/build-collections/device-code.d.ts.map +1 -0
  93. package/dist/better-auth/plugin/lib/build-collections/device-code.js +49 -0
  94. package/dist/better-auth/plugin/lib/build-collections/index.d.ts +11 -0
  95. package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -0
  96. package/dist/better-auth/plugin/lib/build-collections/index.js +79 -0
  97. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +4 -0
  98. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -0
  99. package/dist/better-auth/plugin/lib/build-collections/invitations.js +93 -0
  100. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +4 -0
  101. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -0
  102. package/dist/better-auth/plugin/lib/build-collections/jwks.js +58 -0
  103. package/dist/better-auth/plugin/lib/build-collections/members.d.ts +4 -0
  104. package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -0
  105. package/dist/better-auth/plugin/lib/build-collections/members.js +72 -0
  106. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +4 -0
  107. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -0
  108. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +105 -0
  109. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +4 -0
  110. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -0
  111. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +117 -0
  112. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +4 -0
  113. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -0
  114. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +87 -0
  115. package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts +4 -0
  116. package/dist/better-auth/plugin/lib/build-collections/organization-roles.d.ts.map +1 -0
  117. package/dist/better-auth/plugin/lib/build-collections/organization-roles.js +65 -0
  118. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +4 -0
  119. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -0
  120. package/dist/better-auth/plugin/lib/build-collections/organizations.js +106 -0
  121. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +4 -0
  122. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -0
  123. package/dist/better-auth/plugin/lib/build-collections/passkeys.js +115 -0
  124. package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts +4 -0
  125. package/dist/better-auth/plugin/lib/build-collections/rate-limit.d.ts.map +1 -0
  126. package/dist/better-auth/plugin/lib/build-collections/rate-limit.js +54 -0
  127. package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts +4 -0
  128. package/dist/better-auth/plugin/lib/build-collections/scim-provider.d.ts.map +1 -0
  129. package/dist/better-auth/plugin/lib/build-collections/scim-provider.js +65 -0
  130. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +4 -0
  131. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -0
  132. package/dist/better-auth/plugin/lib/build-collections/sessions.js +140 -0
  133. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +4 -0
  134. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -0
  135. package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +80 -0
  136. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts +4 -0
  137. package/dist/better-auth/plugin/lib/build-collections/subscriptions.d.ts.map +1 -0
  138. package/dist/better-auth/plugin/lib/build-collections/subscriptions.js +110 -0
  139. package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts +4 -0
  140. package/dist/better-auth/plugin/lib/build-collections/team-members.d.ts.map +1 -0
  141. package/dist/better-auth/plugin/lib/build-collections/team-members.js +63 -0
  142. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +4 -0
  143. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -0
  144. package/dist/better-auth/plugin/lib/build-collections/teams.js +74 -0
  145. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +4 -0
  146. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -0
  147. package/dist/better-auth/plugin/lib/build-collections/two-factors.js +66 -0
  148. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts +8 -0
  149. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -0
  150. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +52 -0
  151. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts +12 -0
  152. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -0
  153. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +68 -0
  154. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts +5 -0
  155. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.d.ts.map +1 -0
  156. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/index.js +6 -0
  157. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts +3 -0
  158. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -0
  159. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +114 -0
  160. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts +4 -0
  161. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -0
  162. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +64 -0
  163. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +4 -0
  164. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +1 -0
  165. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +90 -0
  166. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts +7 -0
  167. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -0
  168. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +80 -0
  169. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts +3 -0
  170. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -0
  171. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +79 -0
  172. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +3 -0
  173. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -0
  174. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +54 -0
  175. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts +7 -0
  176. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -0
  177. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +15 -0
  178. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts +7 -0
  179. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.d.ts.map +1 -0
  180. package/dist/better-auth/plugin/lib/build-collections/users/hooks/index.js +8 -0
  181. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +3 -0
  182. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -0
  183. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +17 -0
  184. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts +3 -0
  185. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -0
  186. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +90 -0
  187. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +4 -0
  188. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -0
  189. package/dist/better-auth/plugin/lib/build-collections/users/index.js +333 -0
  190. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts +16 -0
  191. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.d.ts.map +1 -0
  192. package/dist/better-auth/plugin/lib/build-collections/utils/collection-schema.js +24 -0
  193. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts +11 -0
  194. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.d.ts.map +1 -0
  195. package/dist/better-auth/plugin/lib/build-collections/utils/filter-properties.js +112 -0
  196. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +8 -0
  197. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -0
  198. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +31 -0
  199. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts +12 -0
  200. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.d.ts.map +1 -0
  201. package/dist/better-auth/plugin/lib/build-collections/utils/model-field-transformations.js +26 -0
  202. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts +18 -0
  203. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -0
  204. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +84 -0
  205. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts +21 -0
  206. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.d.ts.map +1 -0
  207. package/dist/better-auth/plugin/lib/build-collections/utils/transform-schema-fields-to-payload.js +95 -0
  208. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +4 -0
  209. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -0
  210. package/dist/better-auth/plugin/lib/build-collections/verifications.js +82 -0
  211. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +6 -0
  212. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -0
  213. package/dist/better-auth/plugin/lib/get-payload-auth.js +9 -0
  214. package/dist/better-auth/plugin/lib/init-better-auth.d.ts +8 -0
  215. package/dist/better-auth/plugin/lib/init-better-auth.d.ts.map +1 -0
  216. package/dist/better-auth/plugin/lib/init-better-auth.js +16 -0
  217. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts +3 -0
  218. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -0
  219. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +12 -0
  220. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +3 -0
  221. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -0
  222. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +10 -0
  223. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts +3 -0
  224. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.d.ts.map +1 -0
  225. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/device-authorization-plugin.js +8 -0
  226. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +12 -0
  227. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -0
  228. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +146 -0
  229. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +3 -0
  230. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -0
  231. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +18 -0
  232. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +3 -0
  233. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -0
  234. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +34 -0
  235. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +3 -0
  236. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -0
  237. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +11 -0
  238. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +3 -0
  239. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -0
  240. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +10 -0
  241. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts +3 -0
  242. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.d.ts.map +1 -0
  243. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/two-factor-plugin.js +11 -0
  244. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts +8 -0
  245. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.d.ts.map +1 -0
  246. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-after-role-middleware.js +20 -0
  247. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts +8 -0
  248. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.d.ts.map +1 -0
  249. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/admin-before-role-middleware.js +20 -0
  250. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts +14 -0
  251. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.d.ts.map +1 -0
  252. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/apply-save-to-jwt-returned.js +38 -0
  253. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts +8 -0
  254. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +1 -0
  255. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +23 -0
  256. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts +26 -0
  257. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +1 -0
  258. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +62 -0
  259. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts +10 -0
  260. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.d.ts.map +1 -0
  261. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/require-admin-invite-for-sign-up-middleware.js +42 -0
  262. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts +10 -0
  263. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.d.ts.map +1 -0
  264. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/use-admin-invite-after-email-sign-up-middleware.js +62 -0
  265. package/dist/better-auth/plugin/lib/set-login-methods.d.ts +5 -0
  266. package/dist/better-auth/plugin/lib/set-login-methods.d.ts.map +1 -0
  267. package/dist/better-auth/plugin/lib/set-login-methods.js +14 -0
  268. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts +10 -0
  269. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts.map +1 -0
  270. package/dist/better-auth/plugin/payload/components/admin-buttons/index.js +116 -0
  271. package/dist/better-auth/plugin/payload/components/admin-buttons/index.scss +36 -0
  272. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts +11 -0
  273. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts.map +1 -0
  274. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.js +213 -0
  275. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.scss +136 -0
  276. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts +4 -0
  277. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.d.ts.map +1 -0
  278. package/dist/better-auth/plugin/payload/components/login-form/alternative-methods.js +197 -0
  279. package/dist/better-auth/plugin/payload/components/login-form/context.d.ts +49 -0
  280. package/dist/better-auth/plugin/payload/components/login-form/context.d.ts.map +1 -0
  281. package/dist/better-auth/plugin/payload/components/login-form/context.js +94 -0
  282. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts +4 -0
  283. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.d.ts.map +1 -0
  284. package/dist/better-auth/plugin/payload/components/login-form/credentials-form.js +167 -0
  285. package/dist/better-auth/plugin/payload/components/login-form/index.d.ts +5 -0
  286. package/dist/better-auth/plugin/payload/components/login-form/index.d.ts.map +1 -0
  287. package/dist/better-auth/plugin/payload/components/login-form/index.js +6 -0
  288. package/dist/better-auth/plugin/payload/components/login-form/index.scss +58 -0
  289. package/dist/better-auth/plugin/payload/components/logout-button.d.ts +5 -0
  290. package/dist/better-auth/plugin/payload/components/logout-button.d.ts.map +1 -0
  291. package/dist/better-auth/plugin/payload/components/logout-button.js +24 -0
  292. package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts +9 -0
  293. package/dist/better-auth/plugin/payload/components/passkeys/add-button.d.ts.map +1 -0
  294. package/dist/better-auth/plugin/payload/components/passkeys/add-button.js +122 -0
  295. package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts +3 -0
  296. package/dist/better-auth/plugin/payload/components/passkeys/client.d.ts.map +1 -0
  297. package/dist/better-auth/plugin/payload/components/passkeys/client.js +61 -0
  298. package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts +5 -0
  299. package/dist/better-auth/plugin/payload/components/passkeys/index.d.ts.map +1 -0
  300. package/dist/better-auth/plugin/payload/components/passkeys/index.js +42 -0
  301. package/dist/better-auth/plugin/payload/components/passkeys/index.scss +98 -0
  302. package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts +9 -0
  303. package/dist/better-auth/plugin/payload/components/passkeys/list.d.ts.map +1 -0
  304. package/dist/better-auth/plugin/payload/components/passkeys/list.js +57 -0
  305. package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts +23 -0
  306. package/dist/better-auth/plugin/payload/components/passkeys/types.d.ts.map +1 -0
  307. package/dist/better-auth/plugin/payload/components/passkeys/types.js +3 -0
  308. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts +7 -0
  309. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts.map +1 -0
  310. package/dist/better-auth/plugin/payload/components/rsc-redirect.js +13 -0
  311. package/dist/better-auth/plugin/payload/components/token-field.d.ts +4 -0
  312. package/dist/better-auth/plugin/payload/components/token-field.d.ts.map +1 -0
  313. package/dist/better-auth/plugin/payload/components/token-field.js +29 -0
  314. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts +9 -0
  315. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.d.ts.map +1 -0
  316. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.js +347 -0
  317. package/dist/better-auth/plugin/payload/components/two-factor-auth/index.scss +116 -0
  318. package/dist/better-auth/plugin/payload/exports/client.d.ts +7 -0
  319. package/dist/better-auth/plugin/payload/exports/client.d.ts.map +1 -0
  320. package/dist/better-auth/plugin/payload/exports/client.js +8 -0
  321. package/dist/better-auth/plugin/payload/exports/rsc.d.ts +9 -0
  322. package/dist/better-auth/plugin/payload/exports/rsc.d.ts.map +1 -0
  323. package/dist/better-auth/plugin/payload/exports/rsc.js +10 -0
  324. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts +3 -0
  325. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts.map +1 -0
  326. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.js +9 -0
  327. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts +2 -0
  328. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts.map +1 -0
  329. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.js +22 -0
  330. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts +23 -0
  331. package/dist/better-auth/plugin/payload/views/admin-login/client.d.ts.map +1 -0
  332. package/dist/better-auth/plugin/payload/views/admin-login/client.js +24 -0
  333. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts +11 -0
  334. package/dist/better-auth/plugin/payload/views/admin-login/index.d.ts.map +1 -0
  335. package/dist/better-auth/plugin/payload/views/admin-login/index.js +143 -0
  336. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts +23 -0
  337. package/dist/better-auth/plugin/payload/views/admin-signup/client.d.ts.map +1 -0
  338. package/dist/better-auth/plugin/payload/views/admin-signup/client.js +185 -0
  339. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts +10 -0
  340. package/dist/better-auth/plugin/payload/views/admin-signup/index.d.ts.map +1 -0
  341. package/dist/better-auth/plugin/payload/views/admin-signup/index.js +92 -0
  342. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts +7 -0
  343. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts.map +1 -0
  344. package/dist/better-auth/plugin/payload/views/forgot-password/client.js +104 -0
  345. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +9 -0
  346. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -0
  347. package/dist/better-auth/plugin/payload/views/forgot-password/index.js +61 -0
  348. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts +11 -0
  349. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts.map +1 -0
  350. package/dist/better-auth/plugin/payload/views/reset-password/client.js +111 -0
  351. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts +9 -0
  352. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -0
  353. package/dist/better-auth/plugin/payload/views/reset-password/index.js +78 -0
  354. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts +9 -0
  355. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.d.ts.map +1 -0
  356. package/dist/better-auth/plugin/payload/views/two-factor-verify/client.js +79 -0
  357. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts +10 -0
  358. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.d.ts.map +1 -0
  359. package/dist/better-auth/plugin/payload/views/two-factor-verify/index.js +49 -0
  360. package/dist/better-auth/plugin/types.d.ts +448 -0
  361. package/dist/better-auth/plugin/types.d.ts.map +1 -0
  362. package/dist/better-auth/plugin/types.js +3 -0
  363. package/dist/better-auth/plugin/utils/set.d.ts +40 -0
  364. package/dist/better-auth/plugin/utils/set.d.ts.map +1 -0
  365. package/dist/better-auth/plugin/utils/set.js +84 -0
  366. package/dist/better-auth/scripts/generate-types.d.ts +2 -0
  367. package/dist/better-auth/scripts/generate-types.d.ts.map +1 -0
  368. package/dist/better-auth/scripts/generate-types.js +225 -0
  369. package/dist/better-auth/types.d.ts +3 -0
  370. package/dist/better-auth/types.d.ts.map +1 -0
  371. package/dist/better-auth/types.js +4 -0
  372. package/dist/index.d.ts +2 -0
  373. package/dist/index.d.ts.map +1 -0
  374. package/dist/index.js +4 -0
  375. package/dist/shared/components/icons.d.ts +8 -0
  376. package/dist/shared/components/icons.d.ts.map +1 -0
  377. package/dist/shared/components/icons.js +436 -0
  378. package/dist/shared/components/logo.d.ts +3 -0
  379. package/dist/shared/components/logo.d.ts.map +1 -0
  380. package/dist/shared/components/logo.js +24 -0
  381. package/dist/shared/form/components/submit.d.ts +8 -0
  382. package/dist/shared/form/components/submit.d.ts.map +1 -0
  383. package/dist/shared/form/components/submit.js +23 -0
  384. package/dist/shared/form/fields/text-field.d.ts +9 -0
  385. package/dist/shared/form/fields/text-field.d.ts.map +1 -0
  386. package/dist/shared/form/fields/text-field.js +44 -0
  387. package/dist/shared/form/index.d.ts +28 -0
  388. package/dist/shared/form/index.d.ts.map +1 -0
  389. package/dist/shared/form/index.js +17 -0
  390. package/dist/shared/form/ui/header/index.d.ts +9 -0
  391. package/dist/shared/form/ui/header/index.d.ts.map +1 -0
  392. package/dist/shared/form/ui/header/index.js +23 -0
  393. package/dist/shared/form/ui/header/index.scss +8 -0
  394. package/dist/shared/form/ui/index.d.ts +34 -0
  395. package/dist/shared/form/ui/index.d.ts.map +1 -0
  396. package/dist/shared/form/ui/index.js +70 -0
  397. package/dist/shared/form/ui/index.scss +27 -0
  398. package/dist/shared/form/validation.d.ts +65 -0
  399. package/dist/shared/form/validation.d.ts.map +1 -0
  400. package/dist/shared/form/validation.js +108 -0
  401. package/dist/shared/index.d.ts +3 -0
  402. package/dist/shared/index.d.ts.map +1 -0
  403. package/dist/shared/index.js +4 -0
  404. package/dist/shared/payload/fields/field-copy-button/index.css +47 -0
  405. package/dist/shared/payload/fields/field-copy-button/index.d.ts +4 -0
  406. package/dist/shared/payload/fields/field-copy-button/index.d.ts.map +1 -0
  407. package/dist/shared/payload/fields/field-copy-button/index.js +38 -0
  408. package/dist/shared/payload/fields/generate-uuid-button/index.css +14 -0
  409. package/dist/shared/payload/fields/generate-uuid-button/index.d.ts +4 -0
  410. package/dist/shared/payload/fields/generate-uuid-button/index.d.ts.map +1 -0
  411. package/dist/shared/payload/fields/generate-uuid-button/index.js +26 -0
  412. package/dist/shared/payload/fields/index.d.ts +3 -0
  413. package/dist/shared/payload/fields/index.d.ts.map +1 -0
  414. package/dist/shared/payload/fields/index.js +4 -0
  415. package/dist/shared/utils/regex.d.ts +3 -0
  416. package/dist/shared/utils/regex.d.ts.map +1 -0
  417. package/dist/shared/utils/regex.js +4 -0
  418. package/dist/shared/utils/try-catch.d.ts +12 -0
  419. package/dist/shared/utils/try-catch.d.ts.map +1 -0
  420. package/dist/shared/utils/try-catch.js +17 -0
  421. package/dist/shared/utils/value-or-default.d.ts +10 -0
  422. package/dist/shared/utils/value-or-default.d.ts.map +1 -0
  423. package/dist/shared/utils/value-or-default.js +12 -0
  424. package/package.json +124 -0
@@ -0,0 +1,729 @@
1
+ import { getAuthTables } from "better-auth/db";
2
+ import { flattenAllFields } from "payload";
3
+ import { getCollectionByModelKey, getCollectionFieldNameByFieldKeyUntyped, getFieldKeyByCollectionFieldName } from "../../plugin/helpers/get-collection";
4
+ export const createTransform = (options, enableDebugLogs)=>{
5
+ const schema = getAuthTables(options);
6
+ function debugLog(message) {
7
+ if (enableDebugLogs) {
8
+ console.log(`[payload-db-adapter]`, ...message);
9
+ }
10
+ }
11
+ /**
12
+ * Maps a BetterAuth schema model name to its corresponding Payload CMS collection slug.
13
+ *
14
+ * This function resolves the appropriate collection slug by:
15
+ * 1. Looking up the model in the BetterAuth schema to find its configured modelName
16
+ * 2. Falling back to the original model name if no mapping exists
17
+ *
18
+ * Collection slug resolution follows these rules:
19
+ * - For base collections: The sanitizeBetterAuthOptions function ensures the collection slug
20
+ * from plugin options is set as the model name in the schema
21
+ * - For plugins: The betterAuthPluginSlugs constant is used as the modelName
22
+ *
23
+ * @param model - The BetterAuth model name to resolve
24
+ * @returns The corresponding Payload CMS collection slug
25
+ *
26
+ * @example
27
+ * // If schema['user'].modelName is 'users'
28
+ * getCollectionSlug('user') // Returns 'users'
29
+ *
30
+ * @example
31
+ * // If model doesn't exist in schema
32
+ * getCollectionSlug('custom') // Returns 'custom'
33
+ *
34
+ * @warning If a collection is overridden using the collectionOverride option
35
+ * without updating the schema mapping, this function may return incorrect slugs
36
+ */ function getCollectionSlug(model) {
37
+ // First try to get the modelName from schema, otherwise fall back to the original model name
38
+ const collection = schema?.[model]?.modelName || model;
39
+ debugLog([
40
+ "getCollectionSlug:",
41
+ {
42
+ model,
43
+ resolvedSlug: collection
44
+ }
45
+ ]);
46
+ return collection;
47
+ }
48
+ /**
49
+ * Checks if a field in the Payload collection is a relationship or upload field.
50
+ *
51
+ * @param payload - The Payload client instance
52
+ * @param collectionSlug - The slug of the collection
53
+ * @param fieldName - The name of the field to check
54
+ * @returns True if the field is a relationship or upload field, false otherwise
55
+ */ function isPayloadRelationship(payload, collectionSlug, fieldName) {
56
+ const collection = payload.collections[collectionSlug];
57
+ if (!collection) return false;
58
+ const fields = flattenAllFields({
59
+ fields: collection.config.fields
60
+ });
61
+ const field = fields.find((f)=>f.name === fieldName);
62
+ return field?.type === "relationship" || field?.type === "upload";
63
+ }
64
+ /**
65
+ * Maps a BetterAuth schema field to its corresponding Payload CMS field name.
66
+ *
67
+ * This function resolves the appropriate field name by:
68
+ * 1. Preserving 'id' or '_id' fields as-is (special case handling)
69
+ * 2. Looking up the field in the BetterAuth schema to find its configured fieldName
70
+ * 3. Falling back to the original field name if no mapping exists
71
+ *
72
+ * @param model - The BetterAuth model name containing the field
73
+ * @param field - The original field name to resolve
74
+ * @returns The corresponding Payload CMS field name
75
+ *
76
+ * @example
77
+ * // If schema['user'].fields['email'].fieldName is 'emailAddress'
78
+ * getFieldName('user', 'email') // Returns 'emailAddress'
79
+ *
80
+ * @example
81
+ * // Special case for ID fields
82
+ * getFieldName('user', 'id') // Always returns 'id'
83
+ *
84
+ * @example
85
+ * // If field doesn't exist in schema or has no fieldName mapping
86
+ * getFieldName('user', 'custom') // Returns 'custom'
87
+ *
88
+ * @warning If a fieldName is overridden in the payload collection config using the collectionOverride option
89
+ * without updating the schema mapping, this function may return incorrect field names
90
+ */ function getFieldName(model, field) {
91
+ // Special case: 'id' or '_id' is always preserved as-is
92
+ if ([
93
+ "id",
94
+ "_id"
95
+ ].includes(field)) {
96
+ return field;
97
+ }
98
+ // Look up the field in the schema
99
+ const fieldDefinition = schema[model]?.fields[field];
100
+ // Use the configured fieldName if available, otherwise fall back to original
101
+ const fieldName = fieldDefinition?.fieldName || field;
102
+ // Log the field resolution for debugging
103
+ debugLog([
104
+ "getField: ",
105
+ {
106
+ model,
107
+ originalField: field,
108
+ fieldName
109
+ }
110
+ ]);
111
+ return fieldName;
112
+ }
113
+ /**
114
+ * Determines if a field is a relationship field by checking for a references property.
115
+ *
116
+ * Relationship fields in the schema have a 'references' property that points to another model.
117
+ * This function checks if this property exists to identify relationship fields.
118
+ *
119
+ * @param fieldKey - The key of the field to check in the schema
120
+ * @param schemaFields - Object containing all fields from the schema for a specific model
121
+ * @returns True if the field is a relationship field (has references), false otherwise
122
+ *
123
+ * @example
124
+ * // If schema.user.fields.posts has { references: {} }
125
+ * isRelationshipField('posts', schema.user.fields) // Returns true
126
+ *
127
+ * @example
128
+ * // If schema.user.fields.email has no references property
129
+ * isRelationshipField('email', schema.user.fields) // Returns false
130
+ */ function isRelationshipField(fieldKey, schemaFields) {
131
+ // A field is a relationship field if it has a 'references' property defined
132
+ return schemaFields[fieldKey]?.references !== undefined;
133
+ }
134
+ /**
135
+ * Extracts a single ID value from a Payload where clause if it represents a simple ID query.
136
+ *
137
+ * This function analyzes a Payload where clause to determine if it's a simple query for a
138
+ * single document by ID. It supports both 'id' and '_id' fields with 'equals' or 'contains'
139
+ * operators. This is useful for optimizing queries when we only need to fetch a single document.
140
+ *
141
+ * @param where - The Payload where clause to analyze
142
+ * @returns The ID value (string or number) if the where clause is a simple ID query, null otherwise
143
+ *
144
+ * @example
145
+ * // Returns '123' for a simple equals query
146
+ * singleIdQuery({ id: { equals: '123' } }) // '123'
147
+ *
148
+ * @example
149
+ * // Returns 456 for a simple equals query with number ID
150
+ * singleIdQuery({ _id: { equals: 456 } }) // 456
151
+ *
152
+ * @example
153
+ * // Returns '789' for a contains query with a single value
154
+ * singleIdQuery({ id: { contains: ['789'] } }) // '789'
155
+ *
156
+ * @example
157
+ * // Returns null for complex queries
158
+ * singleIdQuery({ and: [{ id: { equals: '123' } }] }) // null
159
+ */ function singleIdQuery(where) {
160
+ // Return null for empty where clauses or complex queries with 'and'/'or' operators
161
+ if (!where || "and" in where || "or" in where) return null;
162
+ // Check if the where clause contains either 'id' or '_id' field
163
+ if ([
164
+ "id",
165
+ "_id"
166
+ ].some((field)=>field in where)) {
167
+ // Determine which ID field is being used (support both 'id' and '_id')
168
+ const idField = "id" in where ? "id" : "_id";
169
+ const condition = where[idField];
170
+ // Process the equals operator case
171
+ if (condition && typeof condition === "object" && !Array.isArray(condition) && "equals" in condition) {
172
+ const value = condition.equals;
173
+ // Only return string or number ID values
174
+ if (typeof value === "string" || typeof value === "number") {
175
+ return value;
176
+ }
177
+ }
178
+ // Process the contains operator case with a single value
179
+ if (condition && typeof condition === "object" && !Array.isArray(condition) && "contains" in condition && Array.isArray(condition.contains) && condition.contains.length === 1) {
180
+ const value = condition.contains[0];
181
+ // Only return string or number ID values
182
+ if (typeof value === "string" || typeof value === "number") {
183
+ return value;
184
+ }
185
+ }
186
+ }
187
+ // Return null if no valid ID query was found
188
+ return null;
189
+ }
190
+ /**
191
+ * Normalizes data values based on field type and required ID type
192
+ *
193
+ * This function handles type conversion for relationship fields to ensure
194
+ * IDs are in the correct format (string or number) based on the configuration.
195
+ *
196
+ * @param key - The field key/name
197
+ * @param value - The value to normalize
198
+ * @param isRelatedField - Whether this field is a relationship field
199
+ * @param idType - The expected ID type ('number' or 'text')
200
+ * @returns The normalized value
201
+ */ function normalizeData({ key, value, isRelatedField, idType }) {
202
+ // Skip processing for null/undefined values
203
+ if (value === null || value === undefined) {
204
+ return value;
205
+ }
206
+ if ([
207
+ "id",
208
+ "_id"
209
+ ].includes(key)) {
210
+ if (typeof value === "string" && idType === "number") {
211
+ const parsed = parseInt(value, 10);
212
+ if (!isNaN(parsed)) {
213
+ debugLog([
214
+ `ID conversion: ${key} converting string ID to number`,
215
+ {
216
+ original: value,
217
+ converted: parsed
218
+ }
219
+ ]);
220
+ return parsed;
221
+ }
222
+ }
223
+ if (typeof value === "number" && idType === "text") {
224
+ const stringId = String(value);
225
+ debugLog([
226
+ `ID conversion: ${key} converting number ID to string`,
227
+ {
228
+ original: value,
229
+ converted: stringId
230
+ }
231
+ ]);
232
+ return stringId;
233
+ }
234
+ }
235
+ // Only process relationship fields that need type conversion
236
+ if (isRelatedField) {
237
+ // Handle single ID value conversion
238
+ if (typeof value === "string" && idType === "number") {
239
+ const parsed = parseInt(value, 10);
240
+ if (!isNaN(parsed)) {
241
+ debugLog([
242
+ `ID conversion: ${key} converting string ID to number`,
243
+ {
244
+ original: value,
245
+ converted: parsed
246
+ }
247
+ ]);
248
+ return parsed;
249
+ }
250
+ } else if (typeof value === "number" && idType === "text") {
251
+ const stringId = String(value);
252
+ debugLog([
253
+ `ID conversion: ${key} converting number ID to string`,
254
+ {
255
+ original: value,
256
+ converted: stringId
257
+ }
258
+ ]);
259
+ return stringId;
260
+ }
261
+ // Handle array of IDs - map each value to the correct type
262
+ if (Array.isArray(value)) {
263
+ return value.map((id)=>{
264
+ // Skip null/undefined values in arrays
265
+ if (id === null || id === undefined) return id;
266
+ if (idType === "number" && typeof id === "string") {
267
+ const parsed = parseInt(id, 10);
268
+ return !isNaN(parsed) ? parsed : id;
269
+ } else if (idType === "text" && typeof id === "number") {
270
+ return String(id);
271
+ }
272
+ return id;
273
+ });
274
+ }
275
+ }
276
+ // Handle role fields (Coming from better auth, will be a single string seperated by commas if theres multiple roles)
277
+ if (key === "role" || key === "roles") {
278
+ return value.split(",").map((role)=>role.trim().toLowerCase());
279
+ }
280
+ // Return original value if no conversion was needed or applicable
281
+ return value;
282
+ }
283
+ /**
284
+ * Transforms input data from better-auth to Payload CMS format
285
+ *
286
+ * This function handles:
287
+ * 1. Field name mapping according to schema definitions
288
+ * 2. ID type conversion for relationship fields
289
+ * 3. Proper data normalization based on field types
290
+ *
291
+ * @param data - The input data from better-auth
292
+ * @param model - The model name in the schema
293
+ * @param idType - The expected ID type ('number' or 'text')
294
+ * @returns Transformed data compatible with Payload CMS
295
+ */ function transformInput({ data, model, idType, payload }) {
296
+ const transformedData = {};
297
+ const schemaFields = schema?.[model]?.fields ?? {};
298
+ // Process each field in the input data
299
+ Object.entries(data).forEach(([key, value])=>{
300
+ // Skip null/undefined values
301
+ if (value === null || value === undefined) {
302
+ return;
303
+ }
304
+ // Get the mapped field name from schema (if any)
305
+ const schemaFieldName = schemaFields[key]?.fieldName;
306
+ const targetFieldName = schemaFieldName || key;
307
+ // Check Payload schema for relationship fields
308
+ const collectionSlug = getCollectionSlug(model);
309
+ const isPayloadRel = isPayloadRelationship(payload, collectionSlug, targetFieldName);
310
+ // Determine if this is a relationship field
311
+ const isRelatedField = isRelationshipField(key, schemaFields) || isPayloadRel;
312
+ // Normalize the data value based on field type and ID type
313
+ const normalizedData = normalizeData({
314
+ idType,
315
+ key,
316
+ value,
317
+ isRelatedField
318
+ });
319
+ const targetFieldKey = getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), targetFieldName);
320
+ transformedData[targetFieldKey] = normalizedData;
321
+ });
322
+ return transformedData;
323
+ }
324
+ /**
325
+ * Checks if a value is a Payload join result (has docs array structure)
326
+ */ function isJoinResult(value) {
327
+ return value !== null && typeof value === "object" && "docs" in value && Array.isArray(value.docs);
328
+ }
329
+ /**
330
+ * Flattens a Payload join result to just the array of documents.
331
+ * Handles both direct documents and polymorphic { relationTo, value } format.
332
+ */ function flattenJoinResult(joinResult) {
333
+ return joinResult.docs.map((item)=>{
334
+ // Handle polymorphic join format: { relationTo: string, value: doc }
335
+ if (item && typeof item === "object" && "value" in item && "relationTo" in item) {
336
+ return item.value;
337
+ }
338
+ return item;
339
+ });
340
+ }
341
+ /**
342
+ * Transforms Payload CMS document output to match BetterAuth schema expectations.
343
+ *
344
+ * This function handles several critical transformations:
345
+ *
346
+ * 1. ID Conversion: Ensures all ID fields are strings as required by BetterAuth
347
+ * (see: https://github.com/better-auth/better-auth/blob/main/packages/better-auth/src/db/schema.ts#L125)
348
+ *
349
+ * 2. Relationship Field Mapping: Aligns relationship fields with BetterAuth schema naming conventions
350
+ * and ensures proper ID type handling
351
+ *
352
+ * 3. Date Conversion: Transforms date strings from Payload into Date objects for BetterAuth
353
+ *
354
+ * 4. Join Result Flattening: Converts Payload's { docs: [...] } join format to plain arrays
355
+ *
356
+ * Note: While setting depth: 1 in Payload operations simplifies this process by avoiding
357
+ * deeply nested objects, we maintain comprehensive checks for robustness.
358
+ *
359
+ * @param doc - The document returned from Payload CMS
360
+ * @param model - The model name in the BetterAuth schema
361
+ * @returns The transformed document compatible with BetterAuth
362
+ */ function transformOutput({ doc, model, payload }) {
363
+ if (!doc || typeof doc !== "object") return doc;
364
+ const result = {
365
+ ...doc
366
+ };
367
+ const schemaFields = schema?.[model]?.fields ?? {};
368
+ // Identify relationship fields with custom field name mappings
369
+ const relationshipFields = Object.fromEntries(Object.entries(schemaFields).filter(([key])=>{
370
+ if (isRelationshipField(key, schemaFields)) return true;
371
+ // Also check payload schema
372
+ const fieldName = schemaFields[key]?.fieldName || key;
373
+ const collectionSlug = getCollectionSlug(model);
374
+ return isPayloadRelationship(payload, collectionSlug, fieldName);
375
+ }));
376
+ const dateFields = Object.fromEntries(Object.entries(schemaFields).filter(([_, value])=>value.type === "date"));
377
+ // First make sure all the fields keys are correct
378
+ Object.keys(result).forEach((key)=>{
379
+ const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
380
+ if (targetFieldKey !== key) {
381
+ result[targetFieldKey] = result[key];
382
+ delete result[key];
383
+ }
384
+ });
385
+ Object.entries(doc).forEach(([key, value])=>{
386
+ if (value === null || value === undefined) return;
387
+ const targetFieldKey = getFieldKeyByCollectionFieldName(getCollectionByModelKey(payload.collections, model), key);
388
+ // Convert ID fields to strings for BetterAuth compatibility
389
+ if ([
390
+ "id",
391
+ "_id"
392
+ ].includes(key)) {
393
+ result[targetFieldKey] = String(value);
394
+ return;
395
+ }
396
+ // Flatten join results from { docs: [...] } to plain arrays
397
+ if (isJoinResult(value)) {
398
+ debugLog([
399
+ "transformOutput: flattening join result",
400
+ {
401
+ key,
402
+ targetFieldKey,
403
+ isArray: Array.isArray(value.docs)
404
+ }
405
+ ]);
406
+ result[targetFieldKey] = flattenJoinResult(value);
407
+ return;
408
+ }
409
+ // Handle relationship fields with renamed fieldNames
410
+ const originalRelatedFieldKey = Object.keys(relationshipFields).find((k)=>relationshipFields[k].fieldName === key);
411
+ if (originalRelatedFieldKey) {
412
+ normalizeDocumentIds(result, originalRelatedFieldKey, key, value);
413
+ return;
414
+ }
415
+ const originalDateFieldKey = Object.keys(dateFields).find((k)=>dateFields[k].fieldName === key);
416
+ if (originalDateFieldKey) {
417
+ // Convert ISO date strings to Date objects for BetterAuth
418
+ result[targetFieldKey] = new Date(value);
419
+ return;
420
+ }
421
+ });
422
+ return result;
423
+ }
424
+ /**
425
+ * Normalizes ID fields for both primary and relationship documents.
426
+ *
427
+ * This function ensures consistent ID handling between BetterAuth and Payload CMS by:
428
+ * 1. Converting all IDs to strings for BetterAuth (stored in originalKey)
429
+ * 2. Preserving original ID types for Payload CMS (stored in fieldName)
430
+ *
431
+ * The function handles various ID formats:
432
+ * - Primitive values (string/number IDs)
433
+ * - Object references with ID properties
434
+ * - Arrays of either primitive IDs or object references
435
+ *
436
+ * @param result - The result object being transformed
437
+ * @param originalKey - The original field key from BetterAuth schema
438
+ * @param fieldName - The renamed field as used in Payload CMS
439
+ * @param value - The ID value to normalize (primitive, object, or array)
440
+ */ function normalizeDocumentIds(result, originalKey, fieldName, value) {
441
+ // Case 1: Primitive ID value (string or number)
442
+ if (typeof value === "string" || typeof value === "number") {
443
+ // For BetterAuth: Always use string IDs
444
+ result[originalKey] = String(value);
445
+ // For Payload: Keep original type
446
+ result[fieldName] = value;
447
+ return;
448
+ }
449
+ // Case 2: Object with ID property
450
+ if (typeof value === "object" && value !== null && !Array.isArray(value) && "id" in value) {
451
+ // For BetterAuth: Extract and stringify the ID
452
+ result[originalKey] = String(value.id);
453
+ // Preserve the populated relationship object so joins return full documents
454
+ result[fieldName] = {
455
+ ...value,
456
+ id: String(value.id)
457
+ };
458
+ return;
459
+ }
460
+ // Case 3: Array of IDs or references
461
+ if (Array.isArray(value) && value.length > 0) {
462
+ // Check if array contains objects with ID properties
463
+ if (value.every((item)=>typeof item === "object" && item !== null && "id" in item)) {
464
+ // Array of objects with IDs
465
+ result[originalKey] = value.map((item)=>String(item.id));
466
+ // Keep joined documents intact while normalizing ID type
467
+ result[fieldName] = value.map((item)=>({
468
+ ...item,
469
+ id: String(item.id)
470
+ }));
471
+ } else {
472
+ // Array of primitive IDs
473
+ result[originalKey] = value.map((item)=>String(item));
474
+ result[fieldName] = value.map((item)=>item);
475
+ }
476
+ return;
477
+ }
478
+ // Note: If value doesn't match any expected format, no changes are made
479
+ }
480
+ /**
481
+ * Converts a BetterAuth operator to the equivalent Payload CMS query operator
482
+ *
483
+ * This function maps standard query operators from BetterAuth's format to
484
+ * the specific format expected by Payload CMS's query engine.
485
+ *
486
+ * @param operator - The BetterAuth operator string (e.g., 'eq', 'gt', 'contains')
487
+ * @param value - The value to be used with the operator
488
+ * @returns An object with the Payload-compatible operator and value
489
+ *
490
+ * @example
491
+ * // Returns { equals: 'test@example.com' }
492
+ * operatorToPayload('eq', 'test@example.com')
493
+ *
494
+ * @example
495
+ * // Returns { greater_than: 100 }
496
+ * operatorToPayload('gt', 100)
497
+ */ function operatorToPayload(operator, value) {
498
+ switch(operator){
499
+ case "eq":
500
+ return {
501
+ equals: value
502
+ };
503
+ case "ne":
504
+ return {
505
+ not_equals: value
506
+ };
507
+ case "gt":
508
+ return {
509
+ greater_than: value
510
+ };
511
+ case "gte":
512
+ return {
513
+ greater_than_equal: value
514
+ };
515
+ case "lt":
516
+ return {
517
+ less_than: value
518
+ };
519
+ case "lte":
520
+ return {
521
+ less_than_equal: value
522
+ };
523
+ case "contains":
524
+ return {
525
+ contains: value
526
+ };
527
+ case "in":
528
+ return {
529
+ in: value
530
+ };
531
+ case "starts_with":
532
+ return {
533
+ like: `${value}%`
534
+ };
535
+ case "ends_with":
536
+ return {
537
+ like: `%${value}`
538
+ };
539
+ default:
540
+ // Fall back to equals for unrecognized operators
541
+ return {
542
+ equals: value
543
+ };
544
+ }
545
+ }
546
+ /**
547
+ * Converts a where clause value to the appropriate type based on field name and ID type configuration
548
+ *
549
+ * This function handles two main scenarios:
550
+ * 1. ID field conversion - ensures IDs match the database's expected type (number or string)
551
+ * 2. Object with embedded ID - extracts and converts the ID property from objects
552
+ *
553
+ * @param value - The value to convert (can be primitive, object with ID, or array)
554
+ * @param fieldName - The name of the field being queried
555
+ * @param idType - The expected ID type in the database
556
+ * @returns The converted value appropriate for the database query
557
+ */ function convertWhereValue({ value, fieldName, idType }) {
558
+ // Check if field is an ID field (supporting both MongoDB-style _id and standard id)
559
+ if ([
560
+ "id",
561
+ "_id"
562
+ ].includes(fieldName)) {
563
+ // Case 1: Value is an object containing an ID property
564
+ if (typeof value === "object" && value !== null && "id" in value) {
565
+ // Extract ID from object
566
+ const id = value.id;
567
+ // Use type conversion based on database configuration
568
+ if (idType === "number" && typeof id === "string") {
569
+ const numId = Number(id);
570
+ return !isNaN(numId) ? numId : id;
571
+ }
572
+ if (idType === "text" && typeof id === "number") {
573
+ return String(id);
574
+ }
575
+ return id;
576
+ }
577
+ // Case 2: Value is a standalone ID that needs type conversion
578
+ // Convert string ID to number if database expects numeric IDs
579
+ if (idType === "number" && typeof value === "string" && !isNaN(Number(value))) {
580
+ return Number(value);
581
+ } else if (idType === "text" && typeof value === "number") {
582
+ return String(value);
583
+ }
584
+ return value;
585
+ }
586
+ // For non-ID fields, return the value unchanged
587
+ return value;
588
+ }
589
+ /**
590
+ * Converts Better Auth where clauses to Payload CMS compatible where conditions
591
+ *
592
+ * This function transforms the Better Auth query format into Payload's query format,
593
+ * handling field name mapping, value type conversion, and logical operators (AND/OR).
594
+ *
595
+ * The function handles three main cases:
596
+ * 1. Empty or undefined where clause - returns empty object
597
+ * 2. Single condition - converts to a simple field-value pair
598
+ * 3. Multiple conditions - groups by AND/OR connectors and builds a complex query
599
+ *
600
+ * @param idType - The database ID type ('number' or 'text')
601
+ * @param model - The model/collection name to query
602
+ * @param where - Array of Better Auth where conditions
603
+ * @returns A Payload-compatible where clause object
604
+ */ function convertWhereClause({ idType, model, where, payload }) {
605
+ // Handle empty where clause
606
+ if (!where) return {};
607
+ function getPayloadFieldName(fieldKey) {
608
+ return getCollectionFieldNameByFieldKeyUntyped(getCollectionByModelKey(payload.collections, model), fieldKey);
609
+ }
610
+ // Handle single condition case for optimization
611
+ if (where.length === 1) {
612
+ const w = where[0];
613
+ if (!w) {
614
+ return {};
615
+ }
616
+ // Map field name according to schema and convert value to appropriate type
617
+ const fieldName = getFieldName(model, w.field);
618
+ const value = convertWhereValue({
619
+ value: w.value,
620
+ fieldName,
621
+ idType
622
+ });
623
+ // Create the Payload where condition with proper operator
624
+ const res = {
625
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
626
+ };
627
+ return res;
628
+ }
629
+ // Handle multiple conditions by separating AND/OR clauses
630
+ // Default to AND if no connector is specified
631
+ const and = where.filter((w)=>w.connector === "AND" || !w.connector);
632
+ const or = where.filter((w)=>w.connector === "OR");
633
+ // Process AND conditions
634
+ const andClause = and.map((w)=>{
635
+ const fieldName = getFieldName(model, w.field);
636
+ const value = convertWhereValue({
637
+ value: w.value,
638
+ fieldName,
639
+ idType
640
+ });
641
+ return {
642
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
643
+ };
644
+ });
645
+ // Process OR conditions
646
+ const orClause = or.map((w)=>{
647
+ const fieldName = getFieldName(model, w.field);
648
+ const value = convertWhereValue({
649
+ value: w.value,
650
+ fieldName,
651
+ idType
652
+ });
653
+ return {
654
+ [getPayloadFieldName(fieldName)]: operatorToPayload(w.operator ?? "", value)
655
+ };
656
+ });
657
+ // Combine AND and OR clauses into final Payload where object
658
+ // Only include non-empty clause arrays
659
+ return {
660
+ ...andClause.length ? {
661
+ AND: andClause
662
+ } : {},
663
+ ...orClause.length ? {
664
+ OR: orClause
665
+ } : {}
666
+ };
667
+ }
668
+ /**
669
+ * Converts a better-auth select array to a Payload select object
670
+ *
671
+ * This function transforms the better-auth select array (which contains field names)
672
+ * into the format expected by Payload CMS's query API (an object with field names as keys
673
+ * and boolean true as values).
674
+ *
675
+ * It also handles field name mapping between better-auth schema and Payload collections
676
+ * by using the getFieldName helper to resolve the correct field names.
677
+ *
678
+ * @param model - The model/collection name to get field mappings from
679
+ * @param select - Optional array of field names to select
680
+ * @returns A Payload-compatible select object or undefined if no fields to select
681
+ * @example
682
+ * // Input: ['email', 'name']
683
+ * // Output: { email: true, name: true }
684
+ */ function convertSelect(model, select) {
685
+ // Return undefined if select is empty or not provided
686
+ if (!select || select.length === 0) return undefined;
687
+ // Transform the array of field names into a Payload select object
688
+ // while also mapping any field names that might be different in Payload
689
+ return select.reduce((acc, field)=>({
690
+ ...acc,
691
+ [getFieldName(model, field)]: true
692
+ }), {});
693
+ }
694
+ /**
695
+ * Converts a better-auth sort object to a Payload sort string
696
+ *
697
+ * This function transforms the better-auth sort object (which contains field name and direction)
698
+ * into the format expected by Payload CMS's query API (a string with optional '-' prefix for descending order).
699
+ *
700
+ * It also handles field name mapping between better-auth schema and Payload collections
701
+ * by using the getFieldName helper to resolve the correct field names.
702
+ *
703
+ * @param model - The model/collection name to get field mappings from
704
+ * @param sortBy - Optional object containing field name and sort direction
705
+ * @returns A Payload-compatible sort string or undefined if no sort specified
706
+ * @example
707
+ * // Input: { field: 'email', direction: 'desc' }
708
+ * // Output: '-email'
709
+ * // Input: { field: 'createdAt', direction: 'asc' }
710
+ * // Output: 'createdAt'
711
+ */ function convertSort(model, sortBy) {
712
+ if (!sortBy) return undefined;
713
+ const fieldName = getFieldName(model, sortBy.field);
714
+ const prefix = sortBy.direction === "desc" ? "-" : "";
715
+ return `${prefix}${fieldName}`;
716
+ }
717
+ return {
718
+ getFieldName,
719
+ getCollectionSlug,
720
+ singleIdQuery,
721
+ transformInput,
722
+ transformOutput,
723
+ convertWhereClause,
724
+ convertSelect,
725
+ convertSort
726
+ };
727
+ };
728
+
729
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9hZGFwdGVyL3RyYW5zZm9ybS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJldHRlckF1dGhPcHRpb25zLCBXaGVyZSB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEQkZpZWxkQXR0cmlidXRlIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQgeyBnZXRBdXRoVGFibGVzIH0gZnJvbSBcImJldHRlci1hdXRoL2RiXCI7XG5pbXBvcnQge1xuICB0eXBlIEJhc2VQYXlsb2FkLFxuICB0eXBlIENvbGxlY3Rpb25TbHVnLFxuICBmbGF0dGVuQWxsRmllbGRzLFxuICB0eXBlIFdoZXJlIGFzIFBheWxvYWRXaGVyZVxufSBmcm9tIFwicGF5bG9hZFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbEtleSB9IGZyb20gXCJAL2JldHRlci1hdXRoL2dlbmVyYXRlZC10eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXksXG4gIGdldENvbGxlY3Rpb25GaWVsZE5hbWVCeUZpZWxkS2V5VW50eXBlZCxcbiAgZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWVcbn0gZnJvbSBcIkAvYmV0dGVyLWF1dGgvcGx1Z2luL2hlbHBlcnMvZ2V0LWNvbGxlY3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zZm9ybSA9IChcbiAgb3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsXG4gIGVuYWJsZURlYnVnTG9nczogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHNjaGVtYSA9IGdldEF1dGhUYWJsZXMob3B0aW9ucyk7XG5cbiAgZnVuY3Rpb24gZGVidWdMb2cobWVzc2FnZTogYW55W10pIHtcbiAgICBpZiAoZW5hYmxlRGVidWdMb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BheWxvYWQtZGItYWRhcHRlcl1gLCAuLi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIEJldHRlckF1dGggc2NoZW1hIG1vZGVsIG5hbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIHNsdWcgYnk6XG4gICAqIDEuIExvb2tpbmcgdXAgdGhlIG1vZGVsIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIG1vZGVsTmFtZVxuICAgKiAyLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1vZGVsIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQ29sbGVjdGlvbiBzbHVnIHJlc29sdXRpb24gZm9sbG93cyB0aGVzZSBydWxlczpcbiAgICogLSBGb3IgYmFzZSBjb2xsZWN0aW9uczogVGhlIHNhbml0aXplQmV0dGVyQXV0aE9wdGlvbnMgZnVuY3Rpb24gZW5zdXJlcyB0aGUgY29sbGVjdGlvbiBzbHVnXG4gICAqICAgZnJvbSBwbHVnaW4gb3B0aW9ucyBpcyBzZXQgYXMgdGhlIG1vZGVsIG5hbWUgaW4gdGhlIHNjaGVtYVxuICAgKiAtIEZvciBwbHVnaW5zOiBUaGUgYmV0dGVyQXV0aFBsdWdpblNsdWdzIGNvbnN0YW50IGlzIHVzZWQgYXMgdGhlIG1vZGVsTmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgQmV0dGVyQXV0aCBtb2RlbCBuYW1lIHRvIHJlc29sdmVcbiAgICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgUGF5bG9hZCBDTVMgY29sbGVjdGlvbiBzbHVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYVsndXNlciddLm1vZGVsTmFtZSBpcyAndXNlcnMnXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCd1c2VyJykgLy8gUmV0dXJucyAndXNlcnMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIG1vZGVsIGRvZXNuJ3QgZXhpc3QgaW4gc2NoZW1hXG4gICAqIGdldENvbGxlY3Rpb25TbHVnKCdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgY29sbGVjdGlvbiBpcyBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb2xsZWN0aW9uT3ZlcnJpZGUgb3B0aW9uXG4gICAqIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHNjaGVtYSBtYXBwaW5nLCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHNsdWdzXG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uU2x1Zyhtb2RlbDogTW9kZWxLZXkpOiBDb2xsZWN0aW9uU2x1ZyB7XG4gICAgLy8gRmlyc3QgdHJ5IHRvIGdldCB0aGUgbW9kZWxOYW1lIGZyb20gc2NoZW1hLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCBuYW1lXG4gICAgY29uc3QgY29sbGVjdGlvbiA9IHNjaGVtYT8uW21vZGVsXT8ubW9kZWxOYW1lIHx8IG1vZGVsO1xuICAgIGRlYnVnTG9nKFtcImdldENvbGxlY3Rpb25TbHVnOlwiLCB7IG1vZGVsLCByZXNvbHZlZFNsdWc6IGNvbGxlY3Rpb24gfV0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uIGFzIENvbGxlY3Rpb25TbHVnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpZWxkIGluIHRoZSBQYXlsb2FkIGNvbGxlY3Rpb24gaXMgYSByZWxhdGlvbnNoaXAgb3IgdXBsb2FkIGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBQYXlsb2FkIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gY29sbGVjdGlvblNsdWcgLSBUaGUgc2x1ZyBvZiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIG9yIHVwbG9hZCBmaWVsZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBmdW5jdGlvbiBpc1BheWxvYWRSZWxhdGlvbnNoaXAoXG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQsXG4gICAgY29sbGVjdGlvblNsdWc6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tjb2xsZWN0aW9uU2x1Z107XG4gICAgaWYgKCFjb2xsZWN0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBmaWVsZHMgPSBmbGF0dGVuQWxsRmllbGRzKHsgZmllbGRzOiBjb2xsZWN0aW9uLmNvbmZpZy5maWVsZHMgfSk7XG4gICAgY29uc3QgZmllbGQgPSBmaWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuXG4gICAgcmV0dXJuIGZpZWxkPy50eXBlID09PSBcInJlbGF0aW9uc2hpcFwiIHx8IGZpZWxkPy50eXBlID09PSBcInVwbG9hZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBCZXR0ZXJBdXRoIHNjaGVtYSBmaWVsZCB0byBpdHMgY29ycmVzcG9uZGluZyBQYXlsb2FkIENNUyBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBuYW1lIGJ5OlxuICAgKiAxLiBQcmVzZXJ2aW5nICdpZCcgb3IgJ19pZCcgZmllbGRzIGFzLWlzIChzcGVjaWFsIGNhc2UgaGFuZGxpbmcpXG4gICAqIDIuIExvb2tpbmcgdXAgdGhlIGZpZWxkIGluIHRoZSBCZXR0ZXJBdXRoIHNjaGVtYSB0byBmaW5kIGl0cyBjb25maWd1cmVkIGZpZWxkTmFtZVxuICAgKiAzLiBGYWxsaW5nIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGZpZWxkIG5hbWUgaWYgbm8gbWFwcGluZyBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIEJldHRlckF1dGggbW9kZWwgbmFtZSBjb250YWluaW5nIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgb3JpZ2luYWwgZmllbGQgbmFtZSB0byByZXNvbHZlXG4gICAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIFBheWxvYWQgQ01TIGZpZWxkIG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgc2NoZW1hWyd1c2VyJ10uZmllbGRzWydlbWFpbCddLmZpZWxkTmFtZSBpcyAnZW1haWxBZGRyZXNzJ1xuICAgKiBnZXRGaWVsZE5hbWUoJ3VzZXInLCAnZW1haWwnKSAvLyBSZXR1cm5zICdlbWFpbEFkZHJlc3MnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNwZWNpYWwgY2FzZSBmb3IgSUQgZmllbGRzXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdpZCcpIC8vIEFsd2F5cyByZXR1cm5zICdpZCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSWYgZmllbGQgZG9lc24ndCBleGlzdCBpbiBzY2hlbWEgb3IgaGFzIG5vIGZpZWxkTmFtZSBtYXBwaW5nXG4gICAqIGdldEZpZWxkTmFtZSgndXNlcicsICdjdXN0b20nKSAvLyBSZXR1cm5zICdjdXN0b20nXG4gICAqXG4gICAqIEB3YXJuaW5nIElmIGEgZmllbGROYW1lIGlzIG92ZXJyaWRkZW4gaW4gdGhlIHBheWxvYWQgY29sbGVjdGlvbiBjb25maWcgdXNpbmcgdGhlIGNvbGxlY3Rpb25PdmVycmlkZSBvcHRpb25cbiAgICogd2l0aG91dCB1cGRhdGluZyB0aGUgc2NoZW1hIG1hcHBpbmcsIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgZmllbGQgbmFtZXNcbiAgICovXG4gIGZ1bmN0aW9uIGdldEZpZWxkTmFtZShtb2RlbDogTW9kZWxLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogJ2lkJyBvciAnX2lkJyBpcyBhbHdheXMgcHJlc2VydmVkIGFzLWlzXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIGZpZWxkIGluIHRoZSBzY2hlbWFcbiAgICBjb25zdCBmaWVsZERlZmluaXRpb24gPSBzY2hlbWFbbW9kZWxdPy5maWVsZHNbZmllbGRdO1xuXG4gICAgLy8gVXNlIHRoZSBjb25maWd1cmVkIGZpZWxkTmFtZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gb3JpZ2luYWxcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZERlZmluaXRpb24/LmZpZWxkTmFtZSB8fCBmaWVsZDtcblxuICAgIC8vIExvZyB0aGUgZmllbGQgcmVzb2x1dGlvbiBmb3IgZGVidWdnaW5nXG4gICAgZGVidWdMb2coW1wiZ2V0RmllbGQ6IFwiLCB7IG1vZGVsLCBvcmlnaW5hbEZpZWxkOiBmaWVsZCwgZmllbGROYW1lIH1dKTtcblxuICAgIHJldHVybiBmaWVsZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIGJ5IGNoZWNraW5nIGZvciBhIHJlZmVyZW5jZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIFJlbGF0aW9uc2hpcCBmaWVsZHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgJ3JlZmVyZW5jZXMnIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIGFub3RoZXIgbW9kZWwuXG4gICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIHRvIGlkZW50aWZ5IHJlbGF0aW9uc2hpcCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZEtleSAtIFRoZSBrZXkgb2YgdGhlIGZpZWxkIHRvIGNoZWNrIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIHNjaGVtYUZpZWxkcyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpZWxkIGlzIGEgcmVsYXRpb25zaGlwIGZpZWxkIChoYXMgcmVmZXJlbmNlcyksIGZhbHNlIG90aGVyd2lzZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBJZiBzY2hlbWEudXNlci5maWVsZHMucG9zdHMgaGFzIHsgcmVmZXJlbmNlczoge30gfVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdwb3N0cycsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyB0cnVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHNjaGVtYS51c2VyLmZpZWxkcy5lbWFpbCBoYXMgbm8gcmVmZXJlbmNlcyBwcm9wZXJ0eVxuICAgKiBpc1JlbGF0aW9uc2hpcEZpZWxkKCdlbWFpbCcsIHNjaGVtYS51c2VyLmZpZWxkcykgLy8gUmV0dXJucyBmYWxzZVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSZWxhdGlvbnNoaXBGaWVsZChcbiAgICBmaWVsZEtleTogc3RyaW5nLFxuICAgIHNjaGVtYUZpZWxkczogUmVjb3JkPHN0cmluZywgREJGaWVsZEF0dHJpYnV0ZT5cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gQSBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZCBpZiBpdCBoYXMgYSAncmVmZXJlbmNlcycgcHJvcGVydHkgZGVmaW5lZFxuICAgIHJldHVybiBzY2hlbWFGaWVsZHNbZmllbGRLZXldPy5yZWZlcmVuY2VzICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGEgc2luZ2xlIElEIHZhbHVlIGZyb20gYSBQYXlsb2FkIHdoZXJlIGNsYXVzZSBpZiBpdCByZXByZXNlbnRzIGEgc2ltcGxlIElEIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgYSBzaW1wbGUgcXVlcnkgZm9yIGFcbiAgICogc2luZ2xlIGRvY3VtZW50IGJ5IElELiBJdCBzdXBwb3J0cyBib3RoICdpZCcgYW5kICdfaWQnIGZpZWxkcyB3aXRoICdlcXVhbHMnIG9yICdjb250YWlucydcbiAgICogb3BlcmF0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzIHdoZW4gd2Ugb25seSBuZWVkIHRvIGZldGNoIGEgc2luZ2xlIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgLSBUaGUgUGF5bG9hZCB3aGVyZSBjbGF1c2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyBUaGUgSUQgdmFsdWUgKHN0cmluZyBvciBudW1iZXIpIGlmIHRoZSB3aGVyZSBjbGF1c2UgaXMgYSBzaW1wbGUgSUQgcXVlcnksIG51bGwgb3RoZXJ3aXNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgJzEyMycgZm9yIGEgc2ltcGxlIGVxdWFscyBxdWVyeVxuICAgKiBzaW5nbGVJZFF1ZXJ5KHsgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH0pIC8vICcxMjMnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgNDU2IGZvciBhIHNpbXBsZSBlcXVhbHMgcXVlcnkgd2l0aCBudW1iZXIgSURcbiAgICogc2luZ2xlSWRRdWVyeSh7IF9pZDogeyBlcXVhbHM6IDQ1NiB9IH0pIC8vIDQ1NlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zICc3ODknIGZvciBhIGNvbnRhaW5zIHF1ZXJ5IHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICogc2luZ2xlSWRRdWVyeSh7IGlkOiB7IGNvbnRhaW5zOiBbJzc4OSddIH0gfSkgLy8gJzc4OSdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gUmV0dXJucyBudWxsIGZvciBjb21wbGV4IHF1ZXJpZXNcbiAgICogc2luZ2xlSWRRdWVyeSh7IGFuZDogW3sgaWQ6IHsgZXF1YWxzOiAnMTIzJyB9IH1dIH0pIC8vIG51bGxcbiAgICovXG4gIGZ1bmN0aW9uIHNpbmdsZUlkUXVlcnkod2hlcmU6IFBheWxvYWRXaGVyZSkge1xuICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSB3aGVyZSBjbGF1c2VzIG9yIGNvbXBsZXggcXVlcmllcyB3aXRoICdhbmQnLydvcicgb3BlcmF0b3JzXG4gICAgaWYgKCF3aGVyZSB8fCBcImFuZFwiIGluIHdoZXJlIHx8IFwib3JcIiBpbiB3aGVyZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2hlcmUgY2xhdXNlIGNvbnRhaW5zIGVpdGhlciAnaWQnIG9yICdfaWQnIGZpZWxkXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLnNvbWUoKGZpZWxkKSA9PiBmaWVsZCBpbiB3aGVyZSkpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBJRCBmaWVsZCBpcyBiZWluZyB1c2VkIChzdXBwb3J0IGJvdGggJ2lkJyBhbmQgJ19pZCcpXG4gICAgICBjb25zdCBpZEZpZWxkID0gXCJpZFwiIGluIHdoZXJlID8gXCJpZFwiIDogXCJfaWRcIjtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHdoZXJlW2lkRmllbGRdO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBlcXVhbHMgb3BlcmF0b3IgY2FzZVxuICAgICAgaWYgKFxuICAgICAgICBjb25kaXRpb24gJiZcbiAgICAgICAgdHlwZW9mIGNvbmRpdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjb25kaXRpb24pICYmXG4gICAgICAgIFwiZXF1YWxzXCIgaW4gY29uZGl0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uZXF1YWxzO1xuICAgICAgICAvLyBPbmx5IHJldHVybiBzdHJpbmcgb3IgbnVtYmVyIElEIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBjb250YWlucyBvcGVyYXRvciBjYXNlIHdpdGggYSBzaW5nbGUgdmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgY29uZGl0aW9uICYmXG4gICAgICAgIHR5cGVvZiBjb25kaXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY29uZGl0aW9uKSAmJlxuICAgICAgICBcImNvbnRhaW5zXCIgaW4gY29uZGl0aW9uICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLmNvbnRhaW5zKSAmJlxuICAgICAgICBjb25kaXRpb24uY29udGFpbnMubGVuZ3RoID09PSAxXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY29udGFpbnNbMF07XG4gICAgICAgIC8vIE9ubHkgcmV0dXJuIHN0cmluZyBvciBudW1iZXIgSUQgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gdmFsaWQgSUQgcXVlcnkgd2FzIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBkYXRhIHZhbHVlcyBiYXNlZCBvbiBmaWVsZCB0eXBlIGFuZCByZXF1aXJlZCBJRCB0eXBlXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0eXBlIGNvbnZlcnNpb24gZm9yIHJlbGF0aW9uc2hpcCBmaWVsZHMgdG8gZW5zdXJlXG4gICAqIElEcyBhcmUgaW4gdGhlIGNvcnJlY3QgZm9ybWF0IChzdHJpbmcgb3IgbnVtYmVyKSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBmaWVsZCBrZXkvbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplXG4gICAqIEBwYXJhbSBpc1JlbGF0ZWRGaWVsZCAtIFdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhIHJlbGF0aW9uc2hpcCBmaWVsZFxuICAgKiBAcGFyYW0gaWRUeXBlIC0gVGhlIGV4cGVjdGVkIElEIHR5cGUgKCdudW1iZXInIG9yICd0ZXh0JylcbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEoe1xuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICBpc1JlbGF0ZWRGaWVsZCxcbiAgICBpZFR5cGVcbiAgfToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnk7XG4gICAgaXNSZWxhdGVkRmllbGQ6IGJvb2xlYW47XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gIH0pIHtcbiAgICAvLyBTa2lwIHByb2Nlc3NpbmcgZm9yIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFtcImlkXCIsIFwiX2lkXCJdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgaWRUeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgIGRlYnVnTG9nKFtcbiAgICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBzdHJpbmcgSUQgdG8gbnVtYmVyYCxcbiAgICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHBhcnNlZCB9XG4gICAgICAgICAgXSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBpZFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ0lkID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIGBJRCBjb252ZXJzaW9uOiAke2tleX0gY29udmVydGluZyBudW1iZXIgSUQgdG8gc3RyaW5nYCxcbiAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBzdHJpbmdJZCB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gc3RyaW5nSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZXNzIHJlbGF0aW9uc2hpcCBmaWVsZHMgdGhhdCBuZWVkIHR5cGUgY29udmVyc2lvblxuICAgIGlmIChpc1JlbGF0ZWRGaWVsZCkge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBJRCB2YWx1ZSBjb252ZXJzaW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIGlkVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgICBgSUQgY29udmVyc2lvbjogJHtrZXl9IGNvbnZlcnRpbmcgc3RyaW5nIElEIHRvIG51bWJlcmAsXG4gICAgICAgICAgICB7IG9yaWdpbmFsOiB2YWx1ZSwgY29udmVydGVkOiBwYXJzZWQgfVxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIGlkVHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZyhbXG4gICAgICAgICAgYElEIGNvbnZlcnNpb246ICR7a2V5fSBjb252ZXJ0aW5nIG51bWJlciBJRCB0byBzdHJpbmdgLFxuICAgICAgICAgIHsgb3JpZ2luYWw6IHZhbHVlLCBjb252ZXJ0ZWQ6IHN0cmluZ0lkIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdJZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGFycmF5IG9mIElEcyAtIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZWN0IHR5cGVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKChpZCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgbnVsbC91bmRlZmluZWQgdmFsdWVzIGluIGFycmF5c1xuICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gaWQ7XG5cbiAgICAgICAgICBpZiAoaWRUeXBlID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoaWQsIDEwKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VkKSA/IHBhcnNlZCA6IGlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWRUeXBlID09PSBcInRleHRcIiAmJiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSByb2xlIGZpZWxkcyAoQ29taW5nIGZyb20gYmV0dGVyIGF1dGgsIHdpbGwgYmUgYSBzaW5nbGUgc3RyaW5nIHNlcGVyYXRlZCBieSBjb21tYXMgaWYgdGhlcmVzIG11bHRpcGxlIHJvbGVzKVxuICAgIGlmIChrZXkgPT09IFwicm9sZVwiIHx8IGtleSA9PT0gXCJyb2xlc1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocm9sZTogc3RyaW5nKSA9PiByb2xlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgaWYgbm8gY29udmVyc2lvbiB3YXMgbmVlZGVkIG9yIGFwcGxpY2FibGVcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBpbnB1dCBkYXRhIGZyb20gYmV0dGVyLWF1dGggdG8gUGF5bG9hZCBDTVMgZm9ybWF0XG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlczpcbiAgICogMS4gRmllbGQgbmFtZSBtYXBwaW5nIGFjY29yZGluZyB0byBzY2hlbWEgZGVmaW5pdGlvbnNcbiAgICogMi4gSUQgdHlwZSBjb252ZXJzaW9uIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAqIDMuIFByb3BlciBkYXRhIG5vcm1hbGl6YXRpb24gYmFzZWQgb24gZmllbGQgdHlwZXNcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5wdXQgZGF0YSBmcm9tIGJldHRlci1hdXRoXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBuYW1lIGluIHRoZSBzY2hlbWFcbiAgICogQHBhcmFtIGlkVHlwZSAtIFRoZSBleHBlY3RlZCBJRCB0eXBlICgnbnVtYmVyJyBvciAndGV4dCcpXG4gICAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIGRhdGEgY29tcGF0aWJsZSB3aXRoIFBheWxvYWQgQ01TXG4gICAqL1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1JbnB1dCh7XG4gICAgZGF0YSxcbiAgICBtb2RlbCxcbiAgICBpZFR5cGUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBtb2RlbDogTW9kZWxLZXk7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgcGF5bG9hZDogQmFzZVBheWxvYWQ7XG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBzY2hlbWFGaWVsZHMgPSBzY2hlbWE/Llttb2RlbF0/LmZpZWxkcyA/PyB7fTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YVxuICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gU2tpcCBudWxsL3VuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBtYXBwZWQgZmllbGQgbmFtZSBmcm9tIHNjaGVtYSAoaWYgYW55KVxuICAgICAgY29uc3Qgc2NoZW1hRmllbGROYW1lID0gc2NoZW1hRmllbGRzW2tleV0/LmZpZWxkTmFtZTtcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkTmFtZSB8fCBrZXk7XG5cbiAgICAgIC8vIENoZWNrIFBheWxvYWQgc2NoZW1hIGZvciByZWxhdGlvbnNoaXAgZmllbGRzXG4gICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgIGNvbnN0IGlzUGF5bG9hZFJlbCA9IGlzUGF5bG9hZFJlbGF0aW9uc2hpcChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgY29sbGVjdGlvblNsdWcsXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSByZWxhdGlvbnNoaXAgZmllbGRcbiAgICAgIGNvbnN0IGlzUmVsYXRlZEZpZWxkID1cbiAgICAgICAgaXNSZWxhdGlvbnNoaXBGaWVsZChrZXksIHNjaGVtYUZpZWxkcykgfHwgaXNQYXlsb2FkUmVsO1xuXG4gICAgICAvLyBOb3JtYWxpemUgdGhlIGRhdGEgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgSUQgdHlwZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVEYXRhKHtcbiAgICAgICAgaWRUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpc1JlbGF0ZWRGaWVsZFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIHRhcmdldEZpZWxkTmFtZVxuICAgICAgKTtcbiAgICAgIHRyYW5zZm9ybWVkRGF0YVt0YXJnZXRGaWVsZEtleV0gPSBub3JtYWxpemVkRGF0YTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBQYXlsb2FkIGpvaW4gcmVzdWx0IChoYXMgZG9jcyBhcnJheSBzdHJ1Y3R1cmUpXG4gICAqL1xuICBmdW5jdGlvbiBpc0pvaW5SZXN1bHQoXG4gICAgdmFsdWU6IGFueVxuICApOiB2YWx1ZSBpcyB7IGRvY3M6IGFueVtdOyBoYXNOZXh0UGFnZT86IGJvb2xlYW47IHRvdGFsRG9jcz86IG51bWJlciB9IHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJkb2NzXCIgaW4gdmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUuZG9jcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW5zIGEgUGF5bG9hZCBqb2luIHJlc3VsdCB0byBqdXN0IHRoZSBhcnJheSBvZiBkb2N1bWVudHMuXG4gICAqIEhhbmRsZXMgYm90aCBkaXJlY3QgZG9jdW1lbnRzIGFuZCBwb2x5bW9ycGhpYyB7IHJlbGF0aW9uVG8sIHZhbHVlIH0gZm9ybWF0LlxuICAgKi9cbiAgZnVuY3Rpb24gZmxhdHRlbkpvaW5SZXN1bHQoam9pblJlc3VsdDogeyBkb2NzOiBhbnlbXSB9KTogYW55W10ge1xuICAgIHJldHVybiBqb2luUmVzdWx0LmRvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgcG9seW1vcnBoaWMgam9pbiBmb3JtYXQ6IHsgcmVsYXRpb25Ubzogc3RyaW5nLCB2YWx1ZTogZG9jIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSAmJlxuICAgICAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInZhbHVlXCIgaW4gaXRlbSAmJlxuICAgICAgICBcInJlbGF0aW9uVG9cIiBpbiBpdGVtXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIFBheWxvYWQgQ01TIGRvY3VtZW50IG91dHB1dCB0byBtYXRjaCBCZXR0ZXJBdXRoIHNjaGVtYSBleHBlY3RhdGlvbnMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzZXZlcmFsIGNyaXRpY2FsIHRyYW5zZm9ybWF0aW9uczpcbiAgICpcbiAgICogMS4gSUQgQ29udmVyc2lvbjogRW5zdXJlcyBhbGwgSUQgZmllbGRzIGFyZSBzdHJpbmdzIGFzIHJlcXVpcmVkIGJ5IEJldHRlckF1dGhcbiAgICogICAgKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JldHRlci1hdXRoL2JldHRlci1hdXRoL2Jsb2IvbWFpbi9wYWNrYWdlcy9iZXR0ZXItYXV0aC9zcmMvZGIvc2NoZW1hLnRzI0wxMjUpXG4gICAqXG4gICAqIDIuIFJlbGF0aW9uc2hpcCBGaWVsZCBNYXBwaW5nOiBBbGlnbnMgcmVsYXRpb25zaGlwIGZpZWxkcyB3aXRoIEJldHRlckF1dGggc2NoZW1hIG5hbWluZyBjb252ZW50aW9uc1xuICAgKiAgICBhbmQgZW5zdXJlcyBwcm9wZXIgSUQgdHlwZSBoYW5kbGluZ1xuICAgKlxuICAgKiAzLiBEYXRlIENvbnZlcnNpb246IFRyYW5zZm9ybXMgZGF0ZSBzdHJpbmdzIGZyb20gUGF5bG9hZCBpbnRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgKlxuICAgKiA0LiBKb2luIFJlc3VsdCBGbGF0dGVuaW5nOiBDb252ZXJ0cyBQYXlsb2FkJ3MgeyBkb2NzOiBbLi4uXSB9IGpvaW4gZm9ybWF0IHRvIHBsYWluIGFycmF5c1xuICAgKlxuICAgKiBOb3RlOiBXaGlsZSBzZXR0aW5nIGRlcHRoOiAxIGluIFBheWxvYWQgb3BlcmF0aW9ucyBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBieSBhdm9pZGluZ1xuICAgKiBkZWVwbHkgbmVzdGVkIG9iamVjdHMsIHdlIG1haW50YWluIGNvbXByZWhlbnNpdmUgY2hlY2tzIGZvciByb2J1c3RuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHJldHVybmVkIGZyb20gUGF5bG9hZCBDTVNcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIG1vZGVsIG5hbWUgaW4gdGhlIEJldHRlckF1dGggc2NoZW1hXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCBjb21wYXRpYmxlIHdpdGggQmV0dGVyQXV0aFxuICAgKi9cbiAgZnVuY3Rpb24gdHJhbnNmb3JtT3V0cHV0PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4oe1xuICAgIGRvYyxcbiAgICBtb2RlbCxcbiAgICBwYXlsb2FkXG4gIH06IHtcbiAgICBkb2M6IFQ7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHBheWxvYWQ6IEJhc2VQYXlsb2FkO1xuICB9KTogVCB7XG4gICAgaWYgKCFkb2MgfHwgdHlwZW9mIGRvYyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGRvYztcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4uZG9jIH07XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gc2NoZW1hPy5bbW9kZWxdPy5maWVsZHMgPz8ge307XG5cbiAgICAvLyBJZGVudGlmeSByZWxhdGlvbnNoaXAgZmllbGRzIHdpdGggY3VzdG9tIGZpZWxkIG5hbWUgbWFwcGluZ3NcbiAgICBjb25zdCByZWxhdGlvbnNoaXBGaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFGaWVsZHMpLmZpbHRlcigoW2tleV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25zaGlwRmllbGQoa2V5LCBzY2hlbWFGaWVsZHMpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBBbHNvIGNoZWNrIHBheWxvYWQgc2NoZW1hXG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNjaGVtYUZpZWxkc1trZXldPy5maWVsZE5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uU2x1ZyA9IGdldENvbGxlY3Rpb25TbHVnKG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIGlzUGF5bG9hZFJlbGF0aW9uc2hpcChwYXlsb2FkLCBjb2xsZWN0aW9uU2x1ZywgZmllbGROYW1lKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBkYXRlRmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hRmllbGRzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICk7XG5cbiAgICAvLyBGaXJzdCBtYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMga2V5cyBhcmUgY29ycmVjdFxuICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRGaWVsZEtleSA9IGdldEZpZWxkS2V5QnlDb2xsZWN0aW9uRmllbGROYW1lKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGtleVxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXRGaWVsZEtleSAhPT0ga2V5KSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSByZXN1bHRba2V5XTtcbiAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoZG9jKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkS2V5ID0gZ2V0RmllbGRLZXlCeUNvbGxlY3Rpb25GaWVsZE5hbWUoXG4gICAgICAgIGdldENvbGxlY3Rpb25CeU1vZGVsS2V5KHBheWxvYWQuY29sbGVjdGlvbnMsIG1vZGVsKSxcbiAgICAgICAga2V5XG4gICAgICApO1xuXG4gICAgICAvLyBDb252ZXJ0IElEIGZpZWxkcyB0byBzdHJpbmdzIGZvciBCZXR0ZXJBdXRoIGNvbXBhdGliaWxpdHlcbiAgICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZsYXR0ZW4gam9pbiByZXN1bHRzIGZyb20geyBkb2NzOiBbLi4uXSB9IHRvIHBsYWluIGFycmF5c1xuICAgICAgaWYgKGlzSm9pblJlc3VsdCh2YWx1ZSkpIHtcbiAgICAgICAgZGVidWdMb2coW1xuICAgICAgICAgIFwidHJhbnNmb3JtT3V0cHV0OiBmbGF0dGVuaW5nIGpvaW4gcmVzdWx0XCIsXG4gICAgICAgICAgeyBrZXksIHRhcmdldEZpZWxkS2V5LCBpc0FycmF5OiBBcnJheS5pc0FycmF5KHZhbHVlLmRvY3MpIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJlc3VsdFt0YXJnZXRGaWVsZEtleV0gPSBmbGF0dGVuSm9pblJlc3VsdCh2YWx1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHJlbGF0aW9uc2hpcCBmaWVsZHMgd2l0aCByZW5hbWVkIGZpZWxkTmFtZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5ID0gT2JqZWN0LmtleXMocmVsYXRpb25zaGlwRmllbGRzKS5maW5kKFxuICAgICAgICAoaykgPT4gcmVsYXRpb25zaGlwRmllbGRzW2tdLmZpZWxkTmFtZSA9PT0ga2V5XG4gICAgICApO1xuICAgICAgaWYgKG9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5KSB7XG4gICAgICAgIG5vcm1hbGl6ZURvY3VtZW50SWRzKHJlc3VsdCwgb3JpZ2luYWxSZWxhdGVkRmllbGRLZXksIGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGF0ZUZpZWxkS2V5ID0gT2JqZWN0LmtleXMoZGF0ZUZpZWxkcykuZmluZChcbiAgICAgICAgKGspID0+IGRhdGVGaWVsZHNba10uZmllbGROYW1lID09PSBrZXlcbiAgICAgICk7XG4gICAgICBpZiAob3JpZ2luYWxEYXRlRmllbGRLZXkpIHtcbiAgICAgICAgLy8gQ29udmVydCBJU08gZGF0ZSBzdHJpbmdzIHRvIERhdGUgb2JqZWN0cyBmb3IgQmV0dGVyQXV0aFxuICAgICAgICByZXN1bHRbdGFyZ2V0RmllbGRLZXldID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBJRCBmaWVsZHMgZm9yIGJvdGggcHJpbWFyeSBhbmQgcmVsYXRpb25zaGlwIGRvY3VtZW50cy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIGNvbnNpc3RlbnQgSUQgaGFuZGxpbmcgYmV0d2VlbiBCZXR0ZXJBdXRoIGFuZCBQYXlsb2FkIENNUyBieTpcbiAgICogMS4gQ29udmVydGluZyBhbGwgSURzIHRvIHN0cmluZ3MgZm9yIEJldHRlckF1dGggKHN0b3JlZCBpbiBvcmlnaW5hbEtleSlcbiAgICogMi4gUHJlc2VydmluZyBvcmlnaW5hbCBJRCB0eXBlcyBmb3IgUGF5bG9hZCBDTVMgKHN0b3JlZCBpbiBmaWVsZE5hbWUpXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHZhcmlvdXMgSUQgZm9ybWF0czpcbiAgICogLSBQcmltaXRpdmUgdmFsdWVzIChzdHJpbmcvbnVtYmVyIElEcylcbiAgICogLSBPYmplY3QgcmVmZXJlbmNlcyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICogLSBBcnJheXMgb2YgZWl0aGVyIHByaW1pdGl2ZSBJRHMgb3Igb2JqZWN0IHJlZmVyZW5jZXNcbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgb2JqZWN0IGJlaW5nIHRyYW5zZm9ybWVkXG4gICAqIEBwYXJhbSBvcmlnaW5hbEtleSAtIFRoZSBvcmlnaW5hbCBmaWVsZCBrZXkgZnJvbSBCZXR0ZXJBdXRoIHNjaGVtYVxuICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIHJlbmFtZWQgZmllbGQgYXMgdXNlZCBpbiBQYXlsb2FkIENNU1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgSUQgdmFsdWUgdG8gbm9ybWFsaXplIChwcmltaXRpdmUsIG9iamVjdCwgb3IgYXJyYXkpXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVEb2N1bWVudElkcyhcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgb3JpZ2luYWxLZXk6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IHZvaWQge1xuICAgIC8vIENhc2UgMTogUHJpbWl0aXZlIElEIHZhbHVlIChzdHJpbmcgb3IgbnVtYmVyKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogQWx3YXlzIHVzZSBzdHJpbmcgSURzXG4gICAgICByZXN1bHRbb3JpZ2luYWxLZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIC8vIEZvciBQYXlsb2FkOiBLZWVwIG9yaWdpbmFsIHR5cGVcbiAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FzZSAyOiBPYmplY3Qgd2l0aCBJRCBwcm9wZXJ0eVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgXCJpZFwiIGluIHZhbHVlXG4gICAgKSB7XG4gICAgICAvLyBGb3IgQmV0dGVyQXV0aDogRXh0cmFjdCBhbmQgc3RyaW5naWZ5IHRoZSBJRFxuICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IFN0cmluZyh2YWx1ZS5pZCk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcG9wdWxhdGVkIHJlbGF0aW9uc2hpcCBvYmplY3Qgc28gam9pbnMgcmV0dXJuIGZ1bGwgZG9jdW1lbnRzXG4gICAgICByZXN1bHRbZmllbGROYW1lXSA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGlkOiBTdHJpbmcodmFsdWUuaWQpXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhc2UgMzogQXJyYXkgb2YgSURzIG9yIHJlZmVyZW5jZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ2hlY2sgaWYgYXJyYXkgY29udGFpbnMgb2JqZWN0cyB3aXRoIElEIHByb3BlcnRpZXNcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUuZXZlcnkoXG4gICAgICAgICAgKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiICYmIGl0ZW0gIT09IG51bGwgJiYgXCJpZFwiIGluIGl0ZW1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIG9iamVjdHMgd2l0aCBJRHNcbiAgICAgICAgcmVzdWx0W29yaWdpbmFsS2V5XSA9IHZhbHVlLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uaWQpKTtcbiAgICAgICAgLy8gS2VlcCBqb2luZWQgZG9jdW1lbnRzIGludGFjdCB3aGlsZSBub3JtYWxpemluZyBJRCB0eXBlXG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgaWQ6IFN0cmluZyhpdGVtLmlkKVxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcnJheSBvZiBwcmltaXRpdmUgSURzXG4gICAgICAgIHJlc3VsdFtvcmlnaW5hbEtleV0gPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IFN0cmluZyhpdGVtKSk7XG4gICAgICAgIHJlc3VsdFtmaWVsZE5hbWVdID0gdmFsdWUubWFwKChpdGVtKSA9PiBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBJZiB2YWx1ZSBkb2Vzbid0IG1hdGNoIGFueSBleHBlY3RlZCBmb3JtYXQsIG5vIGNoYW5nZXMgYXJlIG1hZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEJldHRlckF1dGggb3BlcmF0b3IgdG8gdGhlIGVxdWl2YWxlbnQgUGF5bG9hZCBDTVMgcXVlcnkgb3BlcmF0b3JcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBtYXBzIHN0YW5kYXJkIHF1ZXJ5IG9wZXJhdG9ycyBmcm9tIEJldHRlckF1dGgncyBmb3JtYXQgdG9cbiAgICogdGhlIHNwZWNpZmljIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdG9yIC0gVGhlIEJldHRlckF1dGggb3BlcmF0b3Igc3RyaW5nIChlLmcuLCAnZXEnLCAnZ3QnLCAnY29udGFpbnMnKVxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgdXNlZCB3aXRoIHRoZSBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgUGF5bG9hZC1jb21wYXRpYmxlIG9wZXJhdG9yIGFuZCB2YWx1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXR1cm5zIHsgZXF1YWxzOiAndGVzdEBleGFtcGxlLmNvbScgfVxuICAgKiBvcGVyYXRvclRvUGF5bG9hZCgnZXEnLCAndGVzdEBleGFtcGxlLmNvbScpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJldHVybnMgeyBncmVhdGVyX3RoYW46IDEwMCB9XG4gICAqIG9wZXJhdG9yVG9QYXlsb2FkKCdndCcsIDEwMClcbiAgICovXG4gIGZ1bmN0aW9uIG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIFwiZXFcIjpcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcIm5lXCI6XG4gICAgICAgIHJldHVybiB7IG5vdF9lcXVhbHM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiZ3RcIjpcbiAgICAgICAgcmV0dXJuIHsgZ3JlYXRlcl90aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImd0ZVwiOlxuICAgICAgICByZXR1cm4geyBncmVhdGVyX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwibHRcIjpcbiAgICAgICAgcmV0dXJuIHsgbGVzc190aGFuOiB2YWx1ZSB9O1xuICAgICAgY2FzZSBcImx0ZVwiOlxuICAgICAgICByZXR1cm4geyBsZXNzX3RoYW5fZXF1YWw6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiY29udGFpbnNcIjpcbiAgICAgICAgcmV0dXJuIHsgY29udGFpbnM6IHZhbHVlIH07XG4gICAgICBjYXNlIFwiaW5cIjpcbiAgICAgICAgcmV0dXJuIHsgaW46IHZhbHVlIH07XG4gICAgICBjYXNlIFwic3RhcnRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCR7dmFsdWV9JWAgfTtcbiAgICAgIGNhc2UgXCJlbmRzX3dpdGhcIjpcbiAgICAgICAgcmV0dXJuIHsgbGlrZTogYCUke3ZhbHVlfWAgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBlcXVhbHMgZm9yIHVucmVjb2duaXplZCBvcGVyYXRvcnNcbiAgICAgICAgcmV0dXJuIHsgZXF1YWxzOiB2YWx1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHdoZXJlIGNsYXVzZSB2YWx1ZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBiYXNlZCBvbiBmaWVsZCBuYW1lIGFuZCBJRCB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHR3byBtYWluIHNjZW5hcmlvczpcbiAgICogMS4gSUQgZmllbGQgY29udmVyc2lvbiAtIGVuc3VyZXMgSURzIG1hdGNoIHRoZSBkYXRhYmFzZSdzIGV4cGVjdGVkIHR5cGUgKG51bWJlciBvciBzdHJpbmcpXG4gICAqIDIuIE9iamVjdCB3aXRoIGVtYmVkZGVkIElEIC0gZXh0cmFjdHMgYW5kIGNvbnZlcnRzIHRoZSBJRCBwcm9wZXJ0eSBmcm9tIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKGNhbiBiZSBwcmltaXRpdmUsIG9iamVjdCB3aXRoIElELCBvciBhcnJheSlcbiAgICogQHBhcmFtIGZpZWxkTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBiZWluZyBxdWVyaWVkXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZXhwZWN0ZWQgSUQgdHlwZSBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGFiYXNlIHF1ZXJ5XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0V2hlcmVWYWx1ZSh7XG4gICAgdmFsdWUsXG4gICAgZmllbGROYW1lLFxuICAgIGlkVHlwZVxuICB9OiB7XG4gICAgdmFsdWU6IGFueTtcbiAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICBpZFR5cGU6IFwibnVtYmVyXCIgfCBcInRleHRcIjtcbiAgfSkge1xuICAgIC8vIENoZWNrIGlmIGZpZWxkIGlzIGFuIElEIGZpZWxkIChzdXBwb3J0aW5nIGJvdGggTW9uZ29EQi1zdHlsZSBfaWQgYW5kIHN0YW5kYXJkIGlkKVxuICAgIGlmIChbXCJpZFwiLCBcIl9pZFwiXS5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XG4gICAgICAvLyBDYXNlIDE6IFZhbHVlIGlzIGFuIG9iamVjdCBjb250YWluaW5nIGFuIElEIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwiaWRcIiBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBFeHRyYWN0IElEIGZyb20gb2JqZWN0XG4gICAgICAgIGNvbnN0IGlkID0gdmFsdWUuaWQ7XG5cbiAgICAgICAgLy8gVXNlIHR5cGUgY29udmVyc2lvbiBiYXNlZCBvbiBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgbnVtSWQgPSBOdW1iZXIoaWQpO1xuICAgICAgICAgIHJldHVybiAhaXNOYU4obnVtSWQpID8gbnVtSWQgOiBpZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZFR5cGUgPT09IFwidGV4dFwiICYmIHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfVxuICAgICAgLy8gQ2FzZSAyOiBWYWx1ZSBpcyBhIHN0YW5kYWxvbmUgSUQgdGhhdCBuZWVkcyB0eXBlIGNvbnZlcnNpb25cbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIElEIHRvIG51bWJlciBpZiBkYXRhYmFzZSBleHBlY3RzIG51bWVyaWMgSURzXG4gICAgICBpZiAoXG4gICAgICAgIGlkVHlwZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZSkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IG51bWVyaWMgSUQgdG8gc3RyaW5nIGlmIGRhdGFiYXNlIGV4cGVjdHMgdGV4dCBJRHNcbiAgICAgIGVsc2UgaWYgKGlkVHlwZSA9PT0gXCJ0ZXh0XCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIEZvciBub24tSUQgZmllbGRzLCByZXR1cm4gdGhlIHZhbHVlIHVuY2hhbmdlZFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBCZXR0ZXIgQXV0aCB3aGVyZSBjbGF1c2VzIHRvIFBheWxvYWQgQ01TIGNvbXBhdGlibGUgd2hlcmUgY29uZGl0aW9uc1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIEJldHRlciBBdXRoIHF1ZXJ5IGZvcm1hdCBpbnRvIFBheWxvYWQncyBxdWVyeSBmb3JtYXQsXG4gICAqIGhhbmRsaW5nIGZpZWxkIG5hbWUgbWFwcGluZywgdmFsdWUgdHlwZSBjb252ZXJzaW9uLCBhbmQgbG9naWNhbCBvcGVyYXRvcnMgKEFORC9PUikuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBoYW5kbGVzIHRocmVlIG1haW4gY2FzZXM6XG4gICAqIDEuIEVtcHR5IG9yIHVuZGVmaW5lZCB3aGVyZSBjbGF1c2UgLSByZXR1cm5zIGVtcHR5IG9iamVjdFxuICAgKiAyLiBTaW5nbGUgY29uZGl0aW9uIC0gY29udmVydHMgdG8gYSBzaW1wbGUgZmllbGQtdmFsdWUgcGFpclxuICAgKiAzLiBNdWx0aXBsZSBjb25kaXRpb25zIC0gZ3JvdXBzIGJ5IEFORC9PUiBjb25uZWN0b3JzIGFuZCBidWlsZHMgYSBjb21wbGV4IHF1ZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBpZFR5cGUgLSBUaGUgZGF0YWJhc2UgSUQgdHlwZSAoJ251bWJlcicgb3IgJ3RleHQnKVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIHF1ZXJ5XG4gICAqIEBwYXJhbSB3aGVyZSAtIEFycmF5IG9mIEJldHRlciBBdXRoIHdoZXJlIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgQSBQYXlsb2FkLWNvbXBhdGlibGUgd2hlcmUgY2xhdXNlIG9iamVjdFxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFdoZXJlQ2xhdXNlKHtcbiAgICBpZFR5cGUsXG4gICAgbW9kZWwsXG4gICAgd2hlcmUsXG4gICAgcGF5bG9hZFxuICB9OiB7XG4gICAgaWRUeXBlOiBcIm51bWJlclwiIHwgXCJ0ZXh0XCI7XG4gICAgbW9kZWw6IE1vZGVsS2V5O1xuICAgIHdoZXJlPzogV2hlcmVbXTtcbiAgICBwYXlsb2FkOiBCYXNlUGF5bG9hZDtcbiAgfSk6IFBheWxvYWRXaGVyZSB7XG4gICAgLy8gSGFuZGxlIGVtcHR5IHdoZXJlIGNsYXVzZVxuICAgIGlmICghd2hlcmUpIHJldHVybiB7fTtcblxuICAgIGZ1bmN0aW9uIGdldFBheWxvYWRGaWVsZE5hbWUoZmllbGRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2V0Q29sbGVjdGlvbkZpZWxkTmFtZUJ5RmllbGRLZXlVbnR5cGVkKFxuICAgICAgICBnZXRDb2xsZWN0aW9uQnlNb2RlbEtleShwYXlsb2FkLmNvbGxlY3Rpb25zLCBtb2RlbCksXG4gICAgICAgIGZpZWxkS2V5XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUgY29uZGl0aW9uIGNhc2UgZm9yIG9wdGltaXphdGlvblxuICAgIGlmICh3aGVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHcgPSB3aGVyZVswXTtcbiAgICAgIGlmICghdykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIC8vIE1hcCBmaWVsZCBuYW1lIGFjY29yZGluZyB0byBzY2hlbWEgYW5kIGNvbnZlcnQgdmFsdWUgdG8gYXBwcm9wcmlhdGUgdHlwZVxuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIFBheWxvYWQgd2hlcmUgY29uZGl0aW9uIHdpdGggcHJvcGVyIG9wZXJhdG9yXG4gICAgICBjb25zdCByZXMgPSB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgY29uZGl0aW9ucyBieSBzZXBhcmF0aW5nIEFORC9PUiBjbGF1c2VzXG4gICAgLy8gRGVmYXVsdCB0byBBTkQgaWYgbm8gY29ubmVjdG9yIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGFuZCA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiQU5EXCIgfHwgIXcuY29ubmVjdG9yKTtcbiAgICBjb25zdCBvciA9IHdoZXJlLmZpbHRlcigodykgPT4gdy5jb25uZWN0b3IgPT09IFwiT1JcIik7XG5cbiAgICAvLyBQcm9jZXNzIEFORCBjb25kaXRpb25zXG4gICAgY29uc3QgYW5kQ2xhdXNlID0gYW5kLm1hcCgodykgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCB3LmZpZWxkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydFdoZXJlVmFsdWUoe1xuICAgICAgICB2YWx1ZTogdy52YWx1ZSxcbiAgICAgICAgZmllbGROYW1lLFxuICAgICAgICBpZFR5cGVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2dldFBheWxvYWRGaWVsZE5hbWUoZmllbGROYW1lKV06IG9wZXJhdG9yVG9QYXlsb2FkKFxuICAgICAgICAgIHcub3BlcmF0b3IgPz8gXCJcIixcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBPUiBjb25kaXRpb25zXG4gICAgY29uc3Qgb3JDbGF1c2UgPSBvci5tYXAoKHcpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGdldEZpZWxkTmFtZShtb2RlbCwgdy5maWVsZCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRXaGVyZVZhbHVlKHtcbiAgICAgICAgdmFsdWU6IHcudmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgaWRUeXBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtnZXRQYXlsb2FkRmllbGROYW1lKGZpZWxkTmFtZSldOiBvcGVyYXRvclRvUGF5bG9hZChcbiAgICAgICAgICB3Lm9wZXJhdG9yID8/IFwiXCIsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIENvbWJpbmUgQU5EIGFuZCBPUiBjbGF1c2VzIGludG8gZmluYWwgUGF5bG9hZCB3aGVyZSBvYmplY3RcbiAgICAvLyBPbmx5IGluY2x1ZGUgbm9uLWVtcHR5IGNsYXVzZSBhcnJheXNcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGFuZENsYXVzZS5sZW5ndGggPyB7IEFORDogYW5kQ2xhdXNlIH0gOiB7fSksXG4gICAgICAuLi4ob3JDbGF1c2UubGVuZ3RoID8geyBPUjogb3JDbGF1c2UgfSA6IHt9KVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgdG8gYSBQYXlsb2FkIHNlbGVjdCBvYmplY3RcbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoZSBiZXR0ZXItYXV0aCBzZWxlY3QgYXJyYXkgKHdoaWNoIGNvbnRhaW5zIGZpZWxkIG5hbWVzKVxuICAgKiBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgUGF5bG9hZCBDTVMncyBxdWVyeSBBUEkgKGFuIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzIGFzIGtleXNcbiAgICogYW5kIGJvb2xlYW4gdHJ1ZSBhcyB2YWx1ZXMpLlxuICAgKlxuICAgKiBJdCBhbHNvIGhhbmRsZXMgZmllbGQgbmFtZSBtYXBwaW5nIGJldHdlZW4gYmV0dGVyLWF1dGggc2NoZW1hIGFuZCBQYXlsb2FkIGNvbGxlY3Rpb25zXG4gICAqIGJ5IHVzaW5nIHRoZSBnZXRGaWVsZE5hbWUgaGVscGVyIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgZmllbGQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbC9jb2xsZWN0aW9uIG5hbWUgdG8gZ2V0IGZpZWxkIG1hcHBpbmdzIGZyb21cbiAgICogQHBhcmFtIHNlbGVjdCAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkIG5hbWVzIHRvIHNlbGVjdFxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzZWxlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBmaWVsZHMgdG8gc2VsZWN0XG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElucHV0OiBbJ2VtYWlsJywgJ25hbWUnXVxuICAgKiAvLyBPdXRwdXQ6IHsgZW1haWw6IHRydWUsIG5hbWU6IHRydWUgfVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFNlbGVjdChtb2RlbDogTW9kZWxLZXksIHNlbGVjdD86IHN0cmluZ1tdKSB7XG4gICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBzZWxlY3QgaXMgZW1wdHkgb3Igbm90IHByb3ZpZGVkXG4gICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIFRyYW5zZm9ybSB0aGUgYXJyYXkgb2YgZmllbGQgbmFtZXMgaW50byBhIFBheWxvYWQgc2VsZWN0IG9iamVjdFxuICAgIC8vIHdoaWxlIGFsc28gbWFwcGluZyBhbnkgZmllbGQgbmFtZXMgdGhhdCBtaWdodCBiZSBkaWZmZXJlbnQgaW4gUGF5bG9hZFxuICAgIHJldHVybiBzZWxlY3QucmVkdWNlKFxuICAgICAgKGFjYywgZmllbGQpID0+ICh7IC4uLmFjYywgW2dldEZpZWxkTmFtZShtb2RlbCwgZmllbGQpXTogdHJ1ZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0IHRvIGEgUGF5bG9hZCBzb3J0IHN0cmluZ1xuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHRyYW5zZm9ybXMgdGhlIGJldHRlci1hdXRoIHNvcnQgb2JqZWN0ICh3aGljaCBjb250YWlucyBmaWVsZCBuYW1lIGFuZCBkaXJlY3Rpb24pXG4gICAqIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSBQYXlsb2FkIENNUydzIHF1ZXJ5IEFQSSAoYSBzdHJpbmcgd2l0aCBvcHRpb25hbCAnLScgcHJlZml4IGZvciBkZXNjZW5kaW5nIG9yZGVyKS5cbiAgICpcbiAgICogSXQgYWxzbyBoYW5kbGVzIGZpZWxkIG5hbWUgbWFwcGluZyBiZXR3ZWVuIGJldHRlci1hdXRoIHNjaGVtYSBhbmQgUGF5bG9hZCBjb2xsZWN0aW9uc1xuICAgKiBieSB1c2luZyB0aGUgZ2V0RmllbGROYW1lIGhlbHBlciB0byByZXNvbHZlIHRoZSBjb3JyZWN0IGZpZWxkIG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbW9kZWwvY29sbGVjdGlvbiBuYW1lIHRvIGdldCBmaWVsZCBtYXBwaW5ncyBmcm9tXG4gICAqIEBwYXJhbSBzb3J0QnkgLSBPcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBmaWVsZCBuYW1lIGFuZCBzb3J0IGRpcmVjdGlvblxuICAgKiBAcmV0dXJucyBBIFBheWxvYWQtY29tcGF0aWJsZSBzb3J0IHN0cmluZyBvciB1bmRlZmluZWQgaWYgbm8gc29ydCBzcGVjaWZpZWRcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW5wdXQ6IHsgZmllbGQ6ICdlbWFpbCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1cbiAgICogLy8gT3V0cHV0OiAnLWVtYWlsJ1xuICAgKiAvLyBJbnB1dDogeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2FzYycgfVxuICAgKiAvLyBPdXRwdXQ6ICdjcmVhdGVkQXQnXG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U29ydChcbiAgICBtb2RlbDogTW9kZWxLZXksXG4gICAgc29ydEJ5PzogeyBmaWVsZDogc3RyaW5nOyBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiB9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzb3J0QnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmllbGROYW1lID0gZ2V0RmllbGROYW1lKG1vZGVsLCBzb3J0QnkuZmllbGQpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNvcnRCeS5kaXJlY3Rpb24gPT09IFwiZGVzY1wiID8gXCItXCIgOiBcIlwiO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtmaWVsZE5hbWV9YDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0RmllbGROYW1lLFxuICAgIGdldENvbGxlY3Rpb25TbHVnLFxuICAgIHNpbmdsZUlkUXVlcnksXG4gICAgdHJhbnNmb3JtSW5wdXQsXG4gICAgdHJhbnNmb3JtT3V0cHV0LFxuICAgIGNvbnZlcnRXaGVyZUNsYXVzZSxcbiAgICBjb252ZXJ0U2VsZWN0LFxuICAgIGNvbnZlcnRTb3J0XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImdldEF1dGhUYWJsZXMiLCJmbGF0dGVuQWxsRmllbGRzIiwiZ2V0Q29sbGVjdGlvbkJ5TW9kZWxLZXkiLCJnZXRDb2xsZWN0aW9uRmllbGROYW1lQnlGaWVsZEtleVVudHlwZWQiLCJnZXRGaWVsZEtleUJ5Q29sbGVjdGlvbkZpZWxkTmFtZSIsImNyZWF0ZVRyYW5zZm9ybSIsIm9wdGlvbnMiLCJlbmFibGVEZWJ1Z0xvZ3MiLCJzY2hlbWEiLCJkZWJ1Z0xvZyIsIm1lc3NhZ2UiLCJjb25zb2xlIiwibG9nIiwiZ2V0Q29sbGVjdGlvblNsdWciLCJtb2RlbCIsImNvbGxlY3Rpb24iLCJtb2RlbE5hbWUiLCJyZXNvbHZlZFNsdWciLCJpc1BheWxvYWRSZWxhdGlvbnNoaXAiLCJwYXlsb2FkIiwiY29sbGVjdGlvblNsdWciLCJmaWVsZE5hbWUiLCJjb2xsZWN0aW9ucyIsImZpZWxkcyIsImNvbmZpZyIsImZpZWxkIiwiZmluZCIsImYiLCJuYW1lIiwidHlwZSIsImdldEZpZWxkTmFtZSIsImluY2x1ZGVzIiwiZmllbGREZWZpbml0aW9uIiwib3JpZ2luYWxGaWVsZCIsImlzUmVsYXRpb25zaGlwRmllbGQiLCJmaWVsZEtleSIsInNjaGVtYUZpZWxkcyIsInJlZmVyZW5jZXMiLCJ1bmRlZmluZWQiLCJzaW5nbGVJZFF1ZXJ5Iiwid2hlcmUiLCJzb21lIiwiaWRGaWVsZCIsImNvbmRpdGlvbiIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwiZXF1YWxzIiwiY29udGFpbnMiLCJsZW5ndGgiLCJub3JtYWxpemVEYXRhIiwia2V5IiwiaXNSZWxhdGVkRmllbGQiLCJpZFR5cGUiLCJwYXJzZWQiLCJwYXJzZUludCIsImlzTmFOIiwib3JpZ2luYWwiLCJjb252ZXJ0ZWQiLCJzdHJpbmdJZCIsIlN0cmluZyIsIm1hcCIsImlkIiwic3BsaXQiLCJyb2xlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwidHJhbnNmb3JtSW5wdXQiLCJkYXRhIiwidHJhbnNmb3JtZWREYXRhIiwiT2JqZWN0IiwiZW50cmllcyIsImZvckVhY2giLCJzY2hlbWFGaWVsZE5hbWUiLCJ0YXJnZXRGaWVsZE5hbWUiLCJpc1BheWxvYWRSZWwiLCJub3JtYWxpemVkRGF0YSIsInRhcmdldEZpZWxkS2V5IiwiaXNKb2luUmVzdWx0IiwiZG9jcyIsImZsYXR0ZW5Kb2luUmVzdWx0Iiwiam9pblJlc3VsdCIsIml0ZW0iLCJ0cmFuc2Zvcm1PdXRwdXQiLCJkb2MiLCJyZXN1bHQiLCJyZWxhdGlvbnNoaXBGaWVsZHMiLCJmcm9tRW50cmllcyIsImZpbHRlciIsImRhdGVGaWVsZHMiLCJfIiwia2V5cyIsIm9yaWdpbmFsUmVsYXRlZEZpZWxkS2V5IiwiayIsIm5vcm1hbGl6ZURvY3VtZW50SWRzIiwib3JpZ2luYWxEYXRlRmllbGRLZXkiLCJEYXRlIiwib3JpZ2luYWxLZXkiLCJldmVyeSIsIm9wZXJhdG9yVG9QYXlsb2FkIiwib3BlcmF0b3IiLCJub3RfZXF1YWxzIiwiZ3JlYXRlcl90aGFuIiwiZ3JlYXRlcl90aGFuX2VxdWFsIiwibGVzc190aGFuIiwibGVzc190aGFuX2VxdWFsIiwiaW4iLCJsaWtlIiwiY29udmVydFdoZXJlVmFsdWUiLCJudW1JZCIsIk51bWJlciIsImNvbnZlcnRXaGVyZUNsYXVzZSIsImdldFBheWxvYWRGaWVsZE5hbWUiLCJ3IiwicmVzIiwiYW5kIiwiY29ubmVjdG9yIiwib3IiLCJhbmRDbGF1c2UiLCJvckNsYXVzZSIsIkFORCIsIk9SIiwiY29udmVydFNlbGVjdCIsInNlbGVjdCIsInJlZHVjZSIsImFjYyIsImNvbnZlcnRTb3J0Iiwic29ydEJ5IiwicHJlZml4IiwiZGlyZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFFQSxTQUFTQSxhQUFhLFFBQVEsaUJBQWlCO0FBQy9DLFNBR0VDLGdCQUFnQixRQUVYLFVBQVU7QUFFakIsU0FDRUMsdUJBQXVCLEVBQ3ZCQyx1Q0FBdUMsRUFDdkNDLGdDQUFnQyxRQUMzQixzQ0FBOEM7QUFFckQsT0FBTyxNQUFNQyxrQkFBa0IsQ0FDN0JDLFNBQ0FDO0lBRUEsTUFBTUMsU0FBU1IsY0FBY007SUFFN0IsU0FBU0csU0FBU0MsT0FBYztRQUM5QixJQUFJSCxpQkFBaUI7WUFDbkJJLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUtGO1FBQ3pDO0lBQ0Y7SUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCQyxH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