payload-auth 1.0.2 → 1.1.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 (423) hide show
  1. package/dist/better-auth/adapter/index.d.ts +2 -2
  2. package/dist/better-auth/adapter/index.d.ts.map +1 -1
  3. package/dist/better-auth/adapter/index.js +115 -69
  4. package/dist/better-auth/adapter/transform/index.d.ts +22 -10
  5. package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
  6. package/dist/better-auth/adapter/transform/index.js +387 -96
  7. package/dist/better-auth/adapter/types.d.ts +2 -1
  8. package/dist/better-auth/adapter/types.d.ts.map +1 -1
  9. package/dist/better-auth/adapter/types.js +1 -1
  10. package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts +3 -0
  11. package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts.map +1 -0
  12. package/dist/better-auth/plugin/helpers/check-passkey-plugin.js +5 -0
  13. package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts +3 -0
  14. package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts.map +1 -0
  15. package/dist/better-auth/plugin/helpers/check-username-plugin.js +5 -0
  16. package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts.map +1 -1
  17. package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +8 -8
  18. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts +8 -0
  19. package/dist/better-auth/plugin/helpers/get-admin-access.d.ts.map +1 -0
  20. package/dist/better-auth/plugin/helpers/get-admin-access.js +22 -0
  21. package/dist/better-auth/plugin/helpers/get-admin-routes.d.ts +14 -0
  22. package/dist/better-auth/plugin/helpers/get-admin-routes.d.ts.map +1 -0
  23. package/dist/better-auth/plugin/helpers/get-admin-routes.js +6 -0
  24. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts +6 -0
  25. package/dist/better-auth/plugin/helpers/get-all-roles.d.ts.map +1 -0
  26. package/dist/better-auth/plugin/helpers/get-all-roles.js +20 -0
  27. package/dist/better-auth/plugin/helpers/get-ip.d.ts +1 -1
  28. package/dist/better-auth/plugin/helpers/get-ip.d.ts.map +1 -1
  29. package/dist/better-auth/plugin/helpers/get-ip.js +14 -14
  30. package/dist/better-auth/plugin/helpers/get-requst-collection.d.ts +3 -0
  31. package/dist/better-auth/plugin/helpers/get-requst-collection.d.ts.map +1 -0
  32. package/dist/better-auth/plugin/helpers/get-requst-collection.js +14 -0
  33. package/dist/better-auth/plugin/helpers/index.d.ts +1 -1
  34. package/dist/better-auth/plugin/helpers/index.js +2 -2
  35. package/dist/better-auth/plugin/{lib → helpers}/prepare-session-data.d.ts +3 -3
  36. package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -0
  37. package/dist/better-auth/plugin/helpers/prepare-session-data.js +42 -0
  38. package/dist/better-auth/plugin/helpers/serialize-cookie.d.ts +4 -4
  39. package/dist/better-auth/plugin/helpers/serialize-cookie.d.ts.map +1 -1
  40. package/dist/better-auth/plugin/helpers/serialize-cookie.js +34 -34
  41. package/dist/better-auth/plugin/index.d.ts +7 -7
  42. package/dist/better-auth/plugin/index.d.ts.map +1 -1
  43. package/dist/better-auth/plugin/index.js +145 -37
  44. package/dist/better-auth/plugin/{collections → lib/build-collections}/accounts/hooks/sync-password-to-user.d.ts +1 -1
  45. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -0
  46. package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +47 -0
  47. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +7 -0
  48. package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -0
  49. package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +159 -0
  50. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts +6 -0
  51. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts.map +1 -0
  52. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.js +11 -0
  53. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts +3 -0
  54. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts.map +1 -0
  55. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.js +8 -0
  56. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +7 -0
  57. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -0
  58. package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +107 -0
  59. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +6 -0
  60. package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -0
  61. package/dist/better-auth/plugin/lib/build-collections/api-keys.js +196 -0
  62. package/dist/better-auth/plugin/lib/build-collections/index.d.ts +12 -0
  63. package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -0
  64. package/dist/better-auth/plugin/lib/build-collections/index.js +96 -0
  65. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +6 -0
  66. package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -0
  67. package/dist/better-auth/plugin/lib/build-collections/invitations.js +91 -0
  68. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +6 -0
  69. package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -0
  70. package/dist/better-auth/plugin/lib/build-collections/jwks.js +43 -0
  71. package/dist/better-auth/plugin/lib/build-collections/members.d.ts +6 -0
  72. package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -0
  73. package/dist/better-auth/plugin/lib/build-collections/members.js +71 -0
  74. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +6 -0
  75. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -0
  76. package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +98 -0
  77. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +6 -0
  78. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -0
  79. package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +113 -0
  80. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +6 -0
  81. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -0
  82. package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +67 -0
  83. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +6 -0
  84. package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -0
  85. package/dist/better-auth/plugin/lib/build-collections/organizations.js +59 -0
  86. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +6 -0
  87. package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -0
  88. package/dist/better-auth/plugin/lib/build-collections/passkeys.js +108 -0
  89. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +8 -0
  90. package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -0
  91. package/dist/better-auth/plugin/lib/build-collections/sessions.js +123 -0
  92. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +6 -0
  93. package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -0
  94. package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +83 -0
  95. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +6 -0
  96. package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -0
  97. package/dist/better-auth/plugin/lib/build-collections/teams.js +45 -0
  98. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +6 -0
  99. package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -0
  100. package/dist/better-auth/plugin/lib/build-collections/two-factors.js +56 -0
  101. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts +8 -0
  102. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -0
  103. package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +52 -0
  104. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.d.ts +3 -0
  105. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.d.ts.map +1 -0
  106. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.js +96 -0
  107. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts +13 -0
  108. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -0
  109. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +67 -0
  110. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.d.ts +4 -0
  111. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.d.ts.map +1 -0
  112. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.js +115 -0
  113. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts +3 -0
  114. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -0
  115. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +110 -0
  116. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.d.ts +3 -0
  117. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.d.ts.map +1 -0
  118. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.js +62 -0
  119. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts +3 -0
  120. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -0
  121. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +42 -0
  122. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +4 -0
  123. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +1 -0
  124. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +79 -0
  125. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts +4 -0
  126. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts.map +1 -0
  127. package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.js +153 -0
  128. package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/after-login.d.ts +1 -1
  129. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -0
  130. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +75 -0
  131. package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/after-logout.d.ts +1 -1
  132. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -0
  133. package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +74 -0
  134. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +7 -0
  135. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -0
  136. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +45 -0
  137. package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/before-login.d.ts +1 -1
  138. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -0
  139. package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +18 -0
  140. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +3 -0
  141. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -0
  142. package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +14 -0
  143. package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/sync-account.d.ts +1 -1
  144. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -0
  145. package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +82 -0
  146. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +8 -0
  147. package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -0
  148. package/dist/better-auth/plugin/lib/build-collections/users/index.js +345 -0
  149. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +8 -0
  150. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -0
  151. package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +31 -0
  152. package/dist/better-auth/plugin/lib/{payload-access.d.ts → build-collections/utils/payload-access.d.ts} +1 -1
  153. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -0
  154. package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +64 -0
  155. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +7 -0
  156. package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -0
  157. package/dist/better-auth/plugin/lib/build-collections/verifications.js +63 -0
  158. package/dist/better-auth/plugin/lib/{config.d.ts → constants.d.ts} +13 -1
  159. package/dist/better-auth/plugin/lib/constants.d.ts.map +1 -0
  160. package/dist/better-auth/plugin/lib/constants.js +56 -0
  161. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +2 -2
  162. package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -1
  163. package/dist/better-auth/plugin/lib/get-payload-auth.js +2 -2
  164. package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts +4 -4
  165. package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts.map +1 -1
  166. package/dist/better-auth/plugin/lib/get-required-collection-slugs.js +26 -43
  167. package/dist/better-auth/plugin/lib/init-better-auth.d.ts +4 -3
  168. package/dist/better-auth/plugin/lib/init-better-auth.d.ts.map +1 -1
  169. package/dist/better-auth/plugin/lib/init-better-auth.js +7 -7
  170. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts +3 -0
  171. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -0
  172. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +8 -0
  173. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +2 -0
  174. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -0
  175. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +17 -0
  176. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +10 -0
  177. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -0
  178. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +118 -0
  179. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +2 -0
  180. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -0
  181. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +58 -0
  182. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +2 -0
  183. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -0
  184. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +86 -0
  185. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +2 -0
  186. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -0
  187. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +17 -0
  188. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +2 -0
  189. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -0
  190. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +17 -0
  191. package/dist/better-auth/plugin/lib/{ensure-password-set-before-create.d.ts → sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts} +1 -1
  192. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +1 -0
  193. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +23 -0
  194. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +1 -0
  195. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +62 -0
  196. package/dist/better-auth/plugin/lib/{respect-save-to-jwt-fields-middleware.d.ts → sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts} +6 -6
  197. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts.map +1 -0
  198. package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.js +30 -0
  199. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts +8 -0
  200. package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts.map +1 -0
  201. package/dist/better-auth/plugin/payload/components/admin-buttons/index.js +115 -0
  202. package/dist/better-auth/plugin/payload/components/admin-buttons/index.scss +31 -0
  203. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts +11 -0
  204. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts.map +1 -0
  205. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.js +196 -0
  206. package/dist/better-auth/plugin/payload/components/admin-invite-button/index.scss +131 -0
  207. package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.d.ts +14 -0
  208. package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.d.ts.map +1 -0
  209. package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.js +111 -0
  210. package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.scss +51 -0
  211. package/dist/better-auth/plugin/payload/components/form-header/index.d.ts +9 -0
  212. package/dist/better-auth/plugin/payload/components/form-header/index.d.ts.map +1 -0
  213. package/dist/better-auth/plugin/payload/components/form-header/index.js +23 -0
  214. package/dist/better-auth/plugin/payload/components/form-header/index.scss +8 -0
  215. package/dist/better-auth/plugin/payload/components/icons.d.ts +9 -0
  216. package/dist/better-auth/plugin/payload/components/icons.d.ts.map +1 -0
  217. package/dist/better-auth/plugin/payload/components/icons.js +437 -0
  218. package/dist/better-auth/plugin/payload/components/logo.d.ts +3 -2
  219. package/dist/better-auth/plugin/payload/components/logo.d.ts.map +1 -1
  220. package/dist/better-auth/plugin/payload/components/logo.js +22 -34
  221. package/dist/better-auth/plugin/payload/components/logout-button.d.ts +6 -0
  222. package/dist/better-auth/plugin/payload/components/logout-button.d.ts.map +1 -0
  223. package/dist/better-auth/plugin/payload/components/logout-button.js +27 -0
  224. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts +7 -0
  225. package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts.map +1 -0
  226. package/dist/better-auth/plugin/payload/components/rsc-redirect.js +8 -0
  227. package/dist/better-auth/plugin/payload/components/styles.css +2 -2
  228. package/dist/better-auth/plugin/payload/components/token-field.d.ts +5 -0
  229. package/dist/better-auth/plugin/payload/components/token-field.d.ts.map +1 -0
  230. package/dist/better-auth/plugin/payload/components/token-field.js +30 -0
  231. package/dist/better-auth/plugin/payload/exports/client.d.ts +6 -3
  232. package/dist/better-auth/plugin/payload/exports/client.d.ts.map +1 -1
  233. package/dist/better-auth/plugin/payload/exports/client.js +7 -4
  234. package/dist/better-auth/plugin/payload/exports/rsc.d.ts +9 -5
  235. package/dist/better-auth/plugin/payload/exports/rsc.d.ts.map +1 -1
  236. package/dist/better-auth/plugin/payload/exports/rsc.js +10 -6
  237. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts +3 -0
  238. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts.map +1 -0
  239. package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.js +8 -0
  240. package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts +15 -0
  241. package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts.map +1 -0
  242. package/dist/better-auth/plugin/payload/utils/generate-metadata.js +74 -0
  243. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts +2 -0
  244. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts.map +1 -0
  245. package/dist/better-auth/plugin/payload/utils/get-safe-redirect.js +23 -0
  246. package/dist/better-auth/plugin/payload/views/admin-invite/client.d.ts +12 -0
  247. package/dist/better-auth/plugin/payload/views/admin-invite/client.d.ts.map +1 -0
  248. package/dist/better-auth/plugin/payload/views/admin-invite/client.js +92 -0
  249. package/dist/better-auth/plugin/payload/views/admin-invite/index.d.ts +11 -0
  250. package/dist/better-auth/plugin/payload/views/admin-invite/index.d.ts.map +1 -0
  251. package/dist/better-auth/plugin/payload/views/admin-invite/index.js +84 -0
  252. package/dist/better-auth/plugin/payload/views/admin-invite/index.scss +25 -0
  253. package/dist/better-auth/plugin/payload/views/create-first-admin/client.d.ts +14 -0
  254. package/dist/better-auth/plugin/payload/views/create-first-admin/client.d.ts.map +1 -0
  255. package/dist/better-auth/plugin/payload/views/create-first-admin/client.js +95 -0
  256. package/dist/better-auth/plugin/payload/views/create-first-admin/index.d.ts +10 -4
  257. package/dist/better-auth/plugin/payload/views/create-first-admin/index.d.ts.map +1 -1
  258. package/dist/better-auth/plugin/payload/views/create-first-admin/index.js +124 -92
  259. package/dist/better-auth/plugin/payload/views/create-first-admin/index.scss +29 -0
  260. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts +8 -0
  261. package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts.map +1 -0
  262. package/dist/better-auth/plugin/payload/views/forgot-password/client.js +119 -0
  263. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +9 -0
  264. package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -0
  265. package/dist/better-auth/plugin/payload/views/forgot-password/index.js +69 -0
  266. package/dist/better-auth/plugin/payload/views/forgot-password/index.scss +0 -0
  267. package/dist/better-auth/plugin/payload/views/inactivity/index.d.ts +5 -0
  268. package/dist/better-auth/plugin/payload/views/inactivity/index.d.ts.map +1 -0
  269. package/dist/better-auth/plugin/payload/views/inactivity/index.js +12 -0
  270. package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.d.ts +9 -0
  271. package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.d.ts.map +1 -0
  272. package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.js +54 -0
  273. package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.d.ts +1 -0
  274. package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.d.ts.map +1 -0
  275. package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.js +121 -0
  276. package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.scss +31 -0
  277. package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.d.ts +56 -0
  278. package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.d.ts.map +1 -0
  279. package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.js +3 -0
  280. package/dist/better-auth/plugin/payload/views/login/form/index.d.ts +17 -0
  281. package/dist/better-auth/plugin/payload/views/login/form/index.d.ts.map +1 -0
  282. package/dist/better-auth/plugin/payload/views/login/form/index.js +137 -0
  283. package/dist/better-auth/plugin/payload/views/login/form/index.scss +23 -0
  284. package/dist/better-auth/plugin/payload/views/login/index.d.ts +10 -5
  285. package/dist/better-auth/plugin/payload/views/login/index.d.ts.map +1 -1
  286. package/dist/better-auth/plugin/payload/views/login/index.js +81 -61
  287. package/dist/better-auth/plugin/payload/views/login/index.scss +10 -0
  288. package/dist/better-auth/plugin/payload/views/logout/client.d.ts +8 -0
  289. package/dist/better-auth/plugin/payload/views/logout/client.d.ts.map +1 -0
  290. package/dist/better-auth/plugin/payload/views/logout/client.js +76 -0
  291. package/dist/better-auth/plugin/payload/views/logout/index.d.ts +8 -0
  292. package/dist/better-auth/plugin/payload/views/logout/index.d.ts.map +1 -0
  293. package/dist/better-auth/plugin/payload/views/logout/index.js +14 -0
  294. package/dist/better-auth/plugin/payload/views/logout/index.scss +0 -0
  295. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts +7 -0
  296. package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts.map +1 -0
  297. package/dist/better-auth/plugin/payload/views/reset-password/client.js +72 -0
  298. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts +5 -0
  299. package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -0
  300. package/dist/better-auth/plugin/payload/views/reset-password/index.js +81 -0
  301. package/dist/better-auth/plugin/payload/views/reset-password/index.scss +9 -0
  302. package/dist/better-auth/plugin/payload/views/reset-password/metadata.d.ts +3 -0
  303. package/dist/better-auth/plugin/payload/views/reset-password/metadata.d.ts.map +1 -0
  304. package/dist/better-auth/plugin/payload/views/reset-password/metadata.js +11 -0
  305. package/dist/better-auth/plugin/types.d.ts +170 -33
  306. package/dist/better-auth/plugin/types.d.ts.map +1 -1
  307. package/dist/better-auth/plugin/types.js +1 -1
  308. package/dist/clerk/plugin/components/sync-clerk-users-button.d.ts +1 -1
  309. package/dist/clerk/plugin/components/sync-clerk-users-button.d.ts.map +1 -1
  310. package/dist/clerk/utils/clerk-user.d.ts +0 -3
  311. package/dist/clerk/utils/clerk-user.d.ts.map +1 -1
  312. package/dist/clerk/utils/clerk-user.js +1 -3
  313. package/dist/clerk/utils/load-clerk-instance.d.ts +1 -1
  314. package/dist/clerk/utils/load-clerk-instance.d.ts.map +1 -1
  315. package/package.json +13 -13
  316. package/LICENSE.md +0 -17
  317. package/dist/better-auth/adapter/dev/bin/run.d.ts +0 -2
  318. package/dist/better-auth/adapter/dev/bin/run.d.ts.map +0 -1
  319. package/dist/better-auth/adapter/dev/bin/run.js +0 -64
  320. package/dist/better-auth/adapter/dev/bin/schema.d.ts +0 -23
  321. package/dist/better-auth/adapter/dev/bin/schema.d.ts.map +0 -1
  322. package/dist/better-auth/adapter/dev/bin/schema.js +0 -160
  323. package/dist/better-auth/adapter/dev/collections.d.ts +0 -4
  324. package/dist/better-auth/adapter/dev/collections.d.ts.map +0 -1
  325. package/dist/better-auth/adapter/dev/collections.js +0 -212
  326. package/dist/better-auth/adapter/dev/index.d.ts +0 -4
  327. package/dist/better-auth/adapter/dev/index.d.ts.map +0 -1
  328. package/dist/better-auth/adapter/dev/index.js +0 -168
  329. package/dist/better-auth/adapter/test/adapter.test.d.ts +0 -2
  330. package/dist/better-auth/adapter/test/adapter.test.d.ts.map +0 -1
  331. package/dist/better-auth/adapter/test/adapter.test.js +0 -181
  332. package/dist/better-auth/adapter/test/better-auth-adapter-test.d.ts +0 -8
  333. package/dist/better-auth/adapter/test/better-auth-adapter-test.d.ts.map +0 -1
  334. package/dist/better-auth/adapter/test/better-auth-adapter-test.js +0 -425
  335. package/dist/better-auth/adapter/test/schema.test.d.ts +0 -2
  336. package/dist/better-auth/adapter/test/schema.test.d.ts.map +0 -1
  337. package/dist/better-auth/adapter/test/schema.test.js +0 -796
  338. package/dist/better-auth/adapter/test/test_payload1/schema.d.ts +0 -24
  339. package/dist/better-auth/adapter/test/test_payload1/schema.d.ts.map +0 -1
  340. package/dist/better-auth/adapter/test/test_payload1/schema.js +0 -177
  341. package/dist/better-auth/adapter/test/test_payload2/schema.d.ts +0 -24
  342. package/dist/better-auth/adapter/test/test_payload2/schema.d.ts.map +0 -1
  343. package/dist/better-auth/adapter/test/test_payload2/schema.js +0 -167
  344. package/dist/better-auth/adapter/test/test_payload3/schema.d.ts +0 -24
  345. package/dist/better-auth/adapter/test/test_payload3/schema.d.ts.map +0 -1
  346. package/dist/better-auth/adapter/test/test_payload3/schema.js +0 -198
  347. package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.d.ts.map +0 -1
  348. package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.js +0 -47
  349. package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.d.ts +0 -7
  350. package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.d.ts.map +0 -1
  351. package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.js +0 -106
  352. package/dist/better-auth/plugin/collections/users/hooks/after-login.d.ts.map +0 -1
  353. package/dist/better-auth/plugin/collections/users/hooks/after-login.js +0 -71
  354. package/dist/better-auth/plugin/collections/users/hooks/after-logout.d.ts.map +0 -1
  355. package/dist/better-auth/plugin/collections/users/hooks/after-logout.js +0 -49
  356. package/dist/better-auth/plugin/collections/users/hooks/before-login.d.ts.map +0 -1
  357. package/dist/better-auth/plugin/collections/users/hooks/before-login.js +0 -18
  358. package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.d.ts +0 -6
  359. package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.d.ts.map +0 -1
  360. package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.js +0 -33
  361. package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.d.ts +0 -3
  362. package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.d.ts.map +0 -1
  363. package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.js +0 -14
  364. package/dist/better-auth/plugin/collections/users/hooks/sync-account.d.ts.map +0 -1
  365. package/dist/better-auth/plugin/collections/users/hooks/sync-account.js +0 -82
  366. package/dist/better-auth/plugin/lib/auth-strategy.d.ts +0 -9
  367. package/dist/better-auth/plugin/lib/auth-strategy.d.ts.map +0 -1
  368. package/dist/better-auth/plugin/lib/auth-strategy.js +0 -48
  369. package/dist/better-auth/plugin/lib/build-collection-configs.d.ts +0 -12
  370. package/dist/better-auth/plugin/lib/build-collection-configs.d.ts.map +0 -1
  371. package/dist/better-auth/plugin/lib/build-collection-configs.js +0 -1558
  372. package/dist/better-auth/plugin/lib/config.d.ts.map +0 -1
  373. package/dist/better-auth/plugin/lib/config.js +0 -44
  374. package/dist/better-auth/plugin/lib/ensure-password-set-before-create.d.ts.map +0 -1
  375. package/dist/better-auth/plugin/lib/ensure-password-set-before-create.js +0 -24
  376. package/dist/better-auth/plugin/lib/password.d.ts.map +0 -1
  377. package/dist/better-auth/plugin/lib/password.js +0 -63
  378. package/dist/better-auth/plugin/lib/payload-access.d.ts.map +0 -1
  379. package/dist/better-auth/plugin/lib/payload-access.js +0 -64
  380. package/dist/better-auth/plugin/lib/prepare-session-data.d.ts.map +0 -1
  381. package/dist/better-auth/plugin/lib/prepare-session-data.js +0 -42
  382. package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.d.ts.map +0 -1
  383. package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.js +0 -30
  384. package/dist/better-auth/plugin/lib/sanitize-auth-options.d.ts +0 -6
  385. package/dist/better-auth/plugin/lib/sanitize-auth-options.d.ts.map +0 -1
  386. package/dist/better-auth/plugin/lib/sanitize-auth-options.js +0 -298
  387. package/dist/better-auth/plugin/payload/components/admin-buttons.d.ts +0 -7
  388. package/dist/better-auth/plugin/payload/components/admin-buttons.d.ts.map +0 -1
  389. package/dist/better-auth/plugin/payload/components/admin-buttons.js +0 -219
  390. package/dist/better-auth/plugin/payload/components/login-redirect.d.ts +0 -2
  391. package/dist/better-auth/plugin/payload/components/login-redirect.d.ts.map +0 -1
  392. package/dist/better-auth/plugin/payload/components/login-redirect.js +0 -6
  393. package/dist/better-auth/plugin/payload/components/logout.d.ts +0 -3
  394. package/dist/better-auth/plugin/payload/components/logout.d.ts.map +0 -1
  395. package/dist/better-auth/plugin/payload/components/logout.js +0 -61
  396. package/dist/better-auth/plugin/payload/components/sign-in.d.ts +0 -4
  397. package/dist/better-auth/plugin/payload/components/sign-in.d.ts.map +0 -1
  398. package/dist/better-auth/plugin/payload/components/sign-in.js +0 -384
  399. package/dist/better-auth/plugin/payload/components/sign-up.d.ts +0 -7
  400. package/dist/better-auth/plugin/payload/components/sign-up.d.ts.map +0 -1
  401. package/dist/better-auth/plugin/payload/components/sign-up.js +0 -503
  402. package/dist/better-auth/plugin/payload/components/ui/button.d.ts +0 -11
  403. package/dist/better-auth/plugin/payload/components/ui/button.d.ts.map +0 -1
  404. package/dist/better-auth/plugin/payload/components/ui/button.js +0 -42
  405. package/dist/better-auth/plugin/payload/components/ui/card.d.ts +0 -10
  406. package/dist/better-auth/plugin/payload/components/ui/card.d.ts.map +0 -1
  407. package/dist/better-auth/plugin/payload/components/ui/card.js +0 -55
  408. package/dist/better-auth/plugin/payload/components/ui/checkbox.d.ts +0 -5
  409. package/dist/better-auth/plugin/payload/components/ui/checkbox.d.ts.map +0 -1
  410. package/dist/better-auth/plugin/payload/components/ui/checkbox.js +0 -23
  411. package/dist/better-auth/plugin/payload/components/ui/cn.d.ts +0 -3
  412. package/dist/better-auth/plugin/payload/components/ui/cn.d.ts.map +0 -1
  413. package/dist/better-auth/plugin/payload/components/ui/cn.js +0 -7
  414. package/dist/better-auth/plugin/payload/components/ui/input.d.ts +0 -4
  415. package/dist/better-auth/plugin/payload/components/ui/input.d.ts.map +0 -1
  416. package/dist/better-auth/plugin/payload/components/ui/input.js +0 -14
  417. package/dist/better-auth/plugin/payload/components/ui/label.d.ts +0 -5
  418. package/dist/better-auth/plugin/payload/components/ui/label.d.ts.map +0 -1
  419. package/dist/better-auth/plugin/payload/components/ui/label.js +0 -15
  420. package/dist/better-auth/plugin/payload/components/ui/password-input.d.ts +0 -3
  421. package/dist/better-auth/plugin/payload/components/ui/password-input.d.ts.map +0 -1
  422. package/dist/better-auth/plugin/payload/components/ui/password-input.js +0 -55
  423. /package/dist/better-auth/plugin/lib/{password.d.ts → sanitize-better-auth-options/utils/password.d.ts} +0 -0
@@ -1,1558 +0,0 @@
1
- import { baseCollectionSlugs, betterAuthPluginSlugs } from './config';
2
- import { betterAuthStrategy } from './auth-strategy';
3
- import { getAfterLogoutHook } from '../collections/users/hooks/after-logout';
4
- import { getRefreshTokenEndpoint } from '../collections/users/endpoints/refresh-token';
5
- import { isAdminOrCurrentUserUpdateWithAllowedFields, isAdminOrCurrentUserWithRoles, isAdminWithRoles } from './payload-access';
6
- import { cleanUpUserAfterDelete } from '../collections/users/hooks/clean-up-user-after-delete';
7
- import { getSyncPasswordToUserHook } from '../collections/accounts/hooks/sync-password-to-user';
8
- import { getSyncAccountHook } from '../collections/users/hooks/sync-account';
9
- import { onVerifiedChange } from '../collections/users/hooks/on-verified-change';
10
- import { getAfterLoginHook } from '../collections/users/hooks/after-login';
11
- import { getBeforeLoginHook } from '../collections/users/hooks/before-login';
12
- /**
13
- * Builds the required collections based on the BetterAuth options and plugins
14
- */ export function buildCollectionConfigs({ incomingCollections, requiredCollectionSlugs, pluginOptions, sanitizedBAOptions }) {
15
- const userSlug = pluginOptions.users?.slug ?? baseCollectionSlugs.users;
16
- const accountSlug = pluginOptions.accounts?.slug ?? baseCollectionSlugs.accounts;
17
- const sessionSlug = pluginOptions.sessions?.slug ?? baseCollectionSlugs.sessions;
18
- const verificationSlug = pluginOptions.verifications?.slug ?? baseCollectionSlugs.verifications;
19
- const baPlugins = sanitizedBAOptions.plugins ?? null;
20
- const adminRoles = pluginOptions.users?.adminRoles ?? [
21
- 'admin'
22
- ];
23
- const getTimestampFields = ({ saveUpdatedAtToJWT = true, saveCreatedAtToJWT = true } = {})=>{
24
- return [
25
- {
26
- name: 'updatedAt',
27
- type: 'date',
28
- saveToJWT: saveUpdatedAtToJWT,
29
- admin: {
30
- disableBulkEdit: true,
31
- hidden: true
32
- },
33
- index: true,
34
- label: ({ t })=>t('general:updatedAt')
35
- },
36
- {
37
- name: 'createdAt',
38
- saveToJWT: saveCreatedAtToJWT,
39
- admin: {
40
- disableBulkEdit: true,
41
- hidden: true
42
- },
43
- type: 'date',
44
- index: true,
45
- label: ({ t })=>t('general:createdAt')
46
- }
47
- ];
48
- };
49
- const enhancedCollections = [];
50
- requiredCollectionSlugs.forEach((slug)=>{
51
- switch(slug){
52
- case baseCollectionSlugs.users:
53
- const existingUserCollection = incomingCollections.find((collection)=>collection.slug === userSlug);
54
- const allowedFields = pluginOptions.users?.allowedFields ?? [
55
- 'name'
56
- ];
57
- let usersCollection = {
58
- ...existingUserCollection,
59
- slug: userSlug,
60
- admin: {
61
- defaultColumns: [
62
- 'email'
63
- ],
64
- useAsTitle: 'email',
65
- ...existingUserCollection?.admin,
66
- hidden: pluginOptions.users?.hidden ?? false
67
- },
68
- access: {
69
- admin: ({ req })=>adminRoles.includes(req.user?.role ?? 'user'),
70
- read: isAdminOrCurrentUserWithRoles({
71
- adminRoles,
72
- idField: 'id'
73
- }),
74
- create: isAdminWithRoles({
75
- adminRoles
76
- }),
77
- delete: isAdminOrCurrentUserWithRoles({
78
- adminRoles,
79
- idField: 'id'
80
- }),
81
- update: isAdminOrCurrentUserUpdateWithAllowedFields({
82
- allowedFields,
83
- adminRoles,
84
- userSlug
85
- }),
86
- ...existingUserCollection?.access ?? {}
87
- },
88
- endpoints: [
89
- ...existingUserCollection?.endpoints ? existingUserCollection.endpoints : [],
90
- getRefreshTokenEndpoint({
91
- userSlug
92
- })
93
- ],
94
- hooks: {
95
- beforeChange: [
96
- ...existingUserCollection?.hooks?.beforeChange ?? [],
97
- onVerifiedChange
98
- ],
99
- afterChange: [
100
- ...existingUserCollection?.hooks?.afterChange ?? [],
101
- getSyncAccountHook({
102
- userSlug,
103
- accountSlug
104
- })
105
- ],
106
- beforeLogin: [
107
- ...existingUserCollection?.hooks?.beforeLogin ?? [],
108
- getBeforeLoginHook()
109
- ],
110
- afterLogin: [
111
- ...existingUserCollection?.hooks?.afterLogin ?? [],
112
- getAfterLoginHook({
113
- sessionsCollectionSlug: sessionSlug,
114
- usersCollectionSlug: userSlug
115
- })
116
- ],
117
- afterLogout: [
118
- ...existingUserCollection?.hooks?.afterLogout ?? [],
119
- getAfterLogoutHook({
120
- sessionsCollectionSlug: sessionSlug
121
- })
122
- ],
123
- afterDelete: [
124
- ...existingUserCollection?.hooks?.afterDelete ?? [],
125
- (args)=>cleanUpUserAfterDelete(args)
126
- ]
127
- },
128
- auth: {
129
- ...existingUserCollection && typeof existingUserCollection.auth === 'object' ? existingUserCollection.auth : {},
130
- //disableLocalStrategy: false,
131
- strategies: [
132
- betterAuthStrategy(adminRoles, userSlug)
133
- ]
134
- },
135
- fields: [
136
- ...existingUserCollection?.fields ?? [],
137
- {
138
- name: 'betterAuthAdminButtons',
139
- type: 'ui',
140
- admin: {
141
- position: 'sidebar',
142
- components: {
143
- Field: {
144
- path: 'payload-auth/better-auth/plugin/client#AdminButtons',
145
- clientProps: ()=>{
146
- return {
147
- userSlug
148
- };
149
- }
150
- }
151
- },
152
- condition: ()=>{
153
- // Only show the impersonate button if the admin plugin is enabled
154
- return (baPlugins && baPlugins.some((plugin)=>plugin.id === 'admin')) ?? false;
155
- }
156
- }
157
- },
158
- {
159
- name: 'name',
160
- type: 'text',
161
- label: 'Name',
162
- saveToJWT: true,
163
- admin: {
164
- description: 'Users chosen display name'
165
- }
166
- },
167
- {
168
- name: 'email',
169
- type: 'text',
170
- required: true,
171
- unique: true,
172
- index: true,
173
- label: 'Email',
174
- admin: {
175
- description: 'The email of the user'
176
- }
177
- },
178
- {
179
- name: 'emailVerified',
180
- type: 'checkbox',
181
- required: true,
182
- defaultValue: false,
183
- saveToJWT: true,
184
- label: 'Email Verified',
185
- admin: {
186
- description: 'Whether the email of the user has been verified'
187
- }
188
- },
189
- {
190
- name: 'image',
191
- type: 'text',
192
- label: 'Image',
193
- saveToJWT: true,
194
- admin: {
195
- description: 'The image of the user'
196
- }
197
- },
198
- {
199
- name: 'role',
200
- type: 'select',
201
- required: true,
202
- defaultValue: 'user',
203
- saveToJWT: true,
204
- options: [
205
- ...(pluginOptions.users?.roles ?? [
206
- {
207
- label: 'Admin',
208
- value: 'admin'
209
- },
210
- {
211
- label: 'User',
212
- value: 'user'
213
- }
214
- ]).map((role)=>{
215
- if (typeof role === 'string') {
216
- return {
217
- label: role.charAt(0).toUpperCase() + role.slice(1),
218
- value: role
219
- };
220
- }
221
- return role;
222
- })
223
- ],
224
- label: 'Role',
225
- admin: {
226
- description: 'The role of the user'
227
- }
228
- },
229
- ...getTimestampFields({
230
- saveUpdatedAtToJWT: false,
231
- saveCreatedAtToJWT: false
232
- })
233
- ]
234
- };
235
- if (baPlugins) {
236
- baPlugins.forEach((plugin)=>{
237
- switch(plugin.id){
238
- case 'two-factor':
239
- usersCollection.fields.push({
240
- name: 'twoFactorEnabled',
241
- type: 'checkbox',
242
- defaultValue: false,
243
- label: 'Two Factor Enabled',
244
- admin: {
245
- description: 'Whether the user has two factor authentication enabled'
246
- }
247
- });
248
- break;
249
- case 'username':
250
- usersCollection.fields.push({
251
- name: 'username',
252
- type: 'text',
253
- unique: true,
254
- required: false,
255
- label: 'Username',
256
- admin: {
257
- description: 'The username of the user'
258
- }
259
- }, {
260
- name: 'displayUsername',
261
- type: 'text',
262
- required: true,
263
- label: 'Display Username',
264
- admin: {
265
- description: 'The display username of the user'
266
- }
267
- });
268
- break;
269
- case 'anonymous':
270
- usersCollection.fields.push({
271
- name: 'isAnonymous',
272
- type: 'checkbox',
273
- defaultValue: false,
274
- label: 'Is Anonymous',
275
- admin: {
276
- description: 'Whether the user is anonymous.'
277
- }
278
- });
279
- break;
280
- case 'phone-number':
281
- usersCollection.fields.push({
282
- name: 'phoneNumber',
283
- type: 'text',
284
- label: 'Phone Number',
285
- admin: {
286
- description: 'The phone number of the user'
287
- }
288
- }, {
289
- name: 'phoneNumberVerified',
290
- type: 'checkbox',
291
- defaultValue: false,
292
- label: 'Phone Number Verified',
293
- admin: {
294
- description: 'Whether the phone number of the user has been verified'
295
- }
296
- });
297
- break;
298
- case 'admin':
299
- usersCollection.fields.push({
300
- name: 'banned',
301
- type: 'checkbox',
302
- defaultValue: false,
303
- label: 'Banned',
304
- admin: {
305
- description: 'Whether the user is banned from the platform'
306
- }
307
- }, {
308
- name: 'banReason',
309
- type: 'text',
310
- label: 'Ban Reason',
311
- admin: {
312
- description: 'The reason for the ban'
313
- }
314
- }, {
315
- name: 'banExpires',
316
- type: 'date',
317
- label: 'Ban Expires',
318
- admin: {
319
- description: 'The date and time when the ban will expire'
320
- }
321
- });
322
- break;
323
- case 'harmony-email':
324
- usersCollection.fields.push({
325
- name: 'normalizedEmail',
326
- type: 'text',
327
- required: false,
328
- unique: true,
329
- admin: {
330
- readOnly: true,
331
- description: 'The normalized email of the user'
332
- }
333
- });
334
- break;
335
- default:
336
- break;
337
- }
338
- });
339
- }
340
- if (pluginOptions.users?.collectionOverrides) {
341
- usersCollection = pluginOptions.users.collectionOverrides({
342
- collection: usersCollection
343
- });
344
- }
345
- enhancedCollections.push(usersCollection);
346
- break;
347
- case baseCollectionSlugs.accounts:
348
- const existingAccountCollection = incomingCollections.find((collection)=>collection.slug === accountSlug);
349
- let accountCollection = {
350
- slug: accountSlug,
351
- admin: {
352
- useAsTitle: 'accountId',
353
- description: 'Accounts are used to store user accounts for authentication providers',
354
- ...existingAccountCollection?.admin,
355
- hidden: pluginOptions.accounts?.hidden
356
- },
357
- hooks: {
358
- afterChange: [
359
- ...existingAccountCollection?.hooks?.afterChange ?? [],
360
- getSyncPasswordToUserHook({
361
- userSlug,
362
- accountSlug
363
- })
364
- ]
365
- },
366
- access: {
367
- create: isAdminWithRoles({
368
- adminRoles
369
- }),
370
- delete: isAdminWithRoles({
371
- adminRoles
372
- }),
373
- read: isAdminOrCurrentUserWithRoles({
374
- adminRoles,
375
- idField: 'user'
376
- }),
377
- update: isAdminWithRoles({
378
- adminRoles
379
- }),
380
- ...existingAccountCollection?.access ?? {}
381
- },
382
- fields: [
383
- ...existingAccountCollection?.fields ?? [],
384
- {
385
- name: 'user',
386
- type: 'relationship',
387
- relationTo: userSlug,
388
- required: true,
389
- index: true,
390
- label: 'User',
391
- admin: {
392
- readOnly: true,
393
- description: 'The user that the account belongs to'
394
- }
395
- },
396
- {
397
- name: 'accountId',
398
- type: 'text',
399
- label: 'Account ID',
400
- required: true,
401
- index: true,
402
- admin: {
403
- readOnly: true,
404
- description: 'The id of the account as provided by the SSO or equal to userId for credential accounts'
405
- }
406
- },
407
- {
408
- name: 'providerId',
409
- type: 'text',
410
- required: true,
411
- label: 'Provider ID',
412
- admin: {
413
- readOnly: true,
414
- description: 'The id of the provider as provided by the SSO'
415
- }
416
- },
417
- {
418
- name: 'accessToken',
419
- type: 'text',
420
- label: 'Access Token',
421
- admin: {
422
- readOnly: true,
423
- description: 'The access token of the account. Returned by the provider'
424
- }
425
- },
426
- {
427
- name: 'refreshToken',
428
- type: 'text',
429
- label: 'Refresh Token',
430
- admin: {
431
- readOnly: true,
432
- description: 'The refresh token of the account. Returned by the provider'
433
- }
434
- },
435
- {
436
- name: 'accessTokenExpiresAt',
437
- type: 'date',
438
- label: 'Access Token Expires At',
439
- admin: {
440
- readOnly: true,
441
- description: 'The date and time when the access token will expire'
442
- }
443
- },
444
- {
445
- name: 'refreshTokenExpiresAt',
446
- type: 'date',
447
- label: 'Refresh Token Expires At',
448
- admin: {
449
- readOnly: true,
450
- description: 'The date and time when the refresh token will expire'
451
- }
452
- },
453
- {
454
- name: 'scope',
455
- type: 'text',
456
- label: 'Scope',
457
- admin: {
458
- readOnly: true,
459
- description: 'The scope of the account. Returned by the provider'
460
- }
461
- },
462
- {
463
- name: 'idToken',
464
- type: 'text',
465
- label: 'ID Token',
466
- admin: {
467
- readOnly: true,
468
- description: 'The id token for the account. Returned by the provider'
469
- }
470
- },
471
- {
472
- name: 'password',
473
- type: 'text',
474
- label: 'Password',
475
- admin: {
476
- readOnly: true,
477
- hidden: true,
478
- description: 'The hashed password of the account. Mainly used for email and password authentication'
479
- }
480
- },
481
- ...getTimestampFields()
482
- ],
483
- ...existingAccountCollection
484
- };
485
- if (pluginOptions.accounts?.collectionOverrides) {
486
- accountCollection = pluginOptions.accounts.collectionOverrides({
487
- collection: accountCollection
488
- });
489
- }
490
- enhancedCollections.push(accountCollection);
491
- break;
492
- case baseCollectionSlugs.sessions:
493
- const existingSessionCollection = incomingCollections.find((collection)=>collection.slug === sessionSlug);
494
- let sessionCollection = {
495
- slug: sessionSlug,
496
- admin: {
497
- ...existingSessionCollection?.admin,
498
- hidden: pluginOptions.sessions?.hidden,
499
- description: 'Sessions are active sessions for users. They are used to authenticate users with a session token'
500
- },
501
- fields: [
502
- ...existingSessionCollection?.fields ?? [],
503
- {
504
- name: 'user',
505
- type: 'relationship',
506
- relationTo: userSlug,
507
- required: true,
508
- saveToJWT: true,
509
- index: true,
510
- admin: {
511
- readOnly: true,
512
- description: 'The user that the session belongs to'
513
- }
514
- },
515
- {
516
- name: 'token',
517
- type: 'text',
518
- required: true,
519
- unique: true,
520
- index: true,
521
- saveToJWT: true,
522
- label: 'Token',
523
- admin: {
524
- description: 'The unique session token',
525
- readOnly: true
526
- }
527
- },
528
- {
529
- name: 'expiresAt',
530
- type: 'date',
531
- required: true,
532
- label: 'Expires At',
533
- saveToJWT: true,
534
- admin: {
535
- description: 'The date and time when the session will expire',
536
- readOnly: true
537
- }
538
- },
539
- {
540
- name: 'ipAddress',
541
- type: 'text',
542
- label: 'IP Address',
543
- saveToJWT: true,
544
- admin: {
545
- description: 'The IP address of the device',
546
- readOnly: true
547
- }
548
- },
549
- {
550
- name: 'userAgent',
551
- type: 'text',
552
- label: 'User Agent',
553
- saveToJWT: true,
554
- admin: {
555
- description: 'The user agent information of the device',
556
- readOnly: true
557
- }
558
- },
559
- ...getTimestampFields()
560
- ],
561
- ...existingSessionCollection
562
- };
563
- if (baPlugins) {
564
- baPlugins.forEach((plugin)=>{
565
- switch(plugin.id){
566
- case 'admin':
567
- sessionCollection.fields.push({
568
- name: 'impersonatedBy',
569
- type: 'relationship',
570
- relationTo: userSlug,
571
- required: false,
572
- label: 'Impersonated By',
573
- admin: {
574
- readOnly: true,
575
- description: 'The admin who is impersonating this session'
576
- }
577
- });
578
- break;
579
- case 'organization':
580
- sessionCollection.fields.push({
581
- name: 'activeOrganization',
582
- type: 'relationship',
583
- relationTo: betterAuthPluginSlugs.organizations,
584
- label: 'Active Organization',
585
- admin: {
586
- readOnly: true,
587
- description: 'The currently active organization for the session'
588
- }
589
- });
590
- break;
591
- default:
592
- break;
593
- }
594
- });
595
- }
596
- if (pluginOptions.sessions?.collectionOverrides) {
597
- sessionCollection = pluginOptions.sessions.collectionOverrides({
598
- collection: sessionCollection
599
- });
600
- }
601
- enhancedCollections.push(sessionCollection);
602
- break;
603
- case baseCollectionSlugs.verifications:
604
- const existingVerificationCollection = incomingCollections.find((collection)=>collection.slug === verificationSlug);
605
- const verificationCollection = {
606
- slug: verificationSlug,
607
- admin: {
608
- ...existingVerificationCollection?.admin,
609
- hidden: pluginOptions.verifications?.hidden,
610
- useAsTitle: 'identifier',
611
- description: 'Verifications are used to verify authentication requests'
612
- },
613
- fields: [
614
- ...existingVerificationCollection?.fields ?? [],
615
- {
616
- name: 'identifier',
617
- type: 'text',
618
- required: true,
619
- index: true,
620
- label: 'Identifier',
621
- admin: {
622
- description: 'The identifier of the verification request',
623
- readOnly: true
624
- }
625
- },
626
- {
627
- name: 'value',
628
- type: 'text',
629
- required: true,
630
- label: 'Value',
631
- admin: {
632
- description: 'The value to be verified',
633
- readOnly: true
634
- }
635
- },
636
- {
637
- name: 'expiresAt',
638
- type: 'date',
639
- required: true,
640
- label: 'Expires At',
641
- admin: {
642
- description: 'The date and time when the verification request will expire',
643
- readOnly: true
644
- }
645
- }
646
- ],
647
- timestamps: true,
648
- ...existingVerificationCollection
649
- };
650
- enhancedCollections.push(verificationCollection);
651
- break;
652
- case betterAuthPluginSlugs.organizations:
653
- const organizationCollection = {
654
- slug: betterAuthPluginSlugs.organizations,
655
- admin: {
656
- hidden: pluginOptions.hidePluginCollections ?? false,
657
- useAsTitle: 'name',
658
- description: 'Organizations are groups of users that share access to certain resources.'
659
- },
660
- fields: [
661
- {
662
- name: 'name',
663
- type: 'text',
664
- required: true,
665
- label: 'Name',
666
- admin: {
667
- description: 'The name of the organization.'
668
- }
669
- },
670
- {
671
- name: 'slug',
672
- type: 'text',
673
- unique: true,
674
- index: true,
675
- label: 'Slug',
676
- admin: {
677
- description: 'The slug of the organization.'
678
- }
679
- },
680
- {
681
- name: 'logo',
682
- type: 'text',
683
- label: 'Logo',
684
- admin: {
685
- description: 'The logo of the organization.'
686
- }
687
- },
688
- {
689
- name: 'metadata',
690
- type: 'json',
691
- label: 'Metadata',
692
- admin: {
693
- description: 'Additional metadata for the organization.'
694
- }
695
- }
696
- ],
697
- timestamps: true
698
- };
699
- enhancedCollections.push(organizationCollection);
700
- break;
701
- case betterAuthPluginSlugs.members:
702
- const memberCollection = {
703
- slug: betterAuthPluginSlugs.members,
704
- admin: {
705
- hidden: pluginOptions.hidePluginCollections ?? false,
706
- useAsTitle: 'organization',
707
- description: 'Members of an organization.'
708
- },
709
- fields: [
710
- {
711
- name: 'organization',
712
- type: 'relationship',
713
- relationTo: betterAuthPluginSlugs.organizations,
714
- required: true,
715
- index: true,
716
- label: 'Organization',
717
- admin: {
718
- readOnly: true,
719
- description: 'The organization that the member belongs to.'
720
- }
721
- },
722
- {
723
- name: 'user',
724
- type: 'relationship',
725
- relationTo: userSlug,
726
- required: true,
727
- index: true,
728
- label: 'User',
729
- admin: {
730
- readOnly: true,
731
- description: 'The user that is a member of the organization.'
732
- }
733
- },
734
- {
735
- name: 'team',
736
- type: 'relationship',
737
- relationTo: betterAuthPluginSlugs.teams,
738
- required: false,
739
- label: 'Team',
740
- admin: {
741
- description: 'The team that the member belongs to.'
742
- }
743
- },
744
- {
745
- name: 'role',
746
- type: 'text',
747
- required: true,
748
- defaultValue: 'member',
749
- label: 'Role',
750
- admin: {
751
- description: 'The role of the member in the organization.'
752
- }
753
- }
754
- ],
755
- timestamps: true
756
- };
757
- enhancedCollections.push(memberCollection);
758
- break;
759
- case betterAuthPluginSlugs.invitations:
760
- const invitationCollection = {
761
- slug: betterAuthPluginSlugs.invitations,
762
- admin: {
763
- hidden: pluginOptions.hidePluginCollections ?? false,
764
- useAsTitle: 'email',
765
- description: 'Invitations to join an organization'
766
- },
767
- fields: [
768
- {
769
- name: 'email',
770
- type: 'text',
771
- required: true,
772
- index: true,
773
- label: 'Email',
774
- admin: {
775
- description: 'The email of the user being invited.',
776
- readOnly: true
777
- }
778
- },
779
- {
780
- name: 'inviter',
781
- type: 'relationship',
782
- relationTo: userSlug,
783
- required: true,
784
- label: 'Inviter',
785
- admin: {
786
- description: 'The user who invited the user.',
787
- readOnly: true
788
- }
789
- },
790
- {
791
- name: 'organization',
792
- type: 'relationship',
793
- relationTo: betterAuthPluginSlugs.organizations,
794
- required: true,
795
- index: true,
796
- label: 'Organization',
797
- admin: {
798
- description: 'The organization that the user is being invited to.',
799
- readOnly: true
800
- }
801
- },
802
- {
803
- name: 'role',
804
- type: 'text',
805
- required: true,
806
- label: 'Role',
807
- admin: {
808
- description: 'The role of the user being invited.',
809
- readOnly: true
810
- }
811
- },
812
- {
813
- name: 'status',
814
- type: 'text',
815
- required: true,
816
- defaultValue: 'pending',
817
- label: 'Status',
818
- admin: {
819
- description: 'The status of the invitation.',
820
- readOnly: true
821
- }
822
- },
823
- {
824
- name: 'expiresAt',
825
- type: 'date',
826
- required: true,
827
- label: 'Expires At',
828
- admin: {
829
- description: 'The date and time when the invitation will expire.',
830
- readOnly: true
831
- }
832
- }
833
- ],
834
- timestamps: true
835
- };
836
- enhancedCollections.push(invitationCollection);
837
- break;
838
- case betterAuthPluginSlugs.teams:
839
- const teamCollection = {
840
- slug: betterAuthPluginSlugs.teams,
841
- admin: {
842
- hidden: pluginOptions.hidePluginCollections ?? false,
843
- useAsTitle: 'name',
844
- description: 'Teams are groups of users that share access to certain resources.'
845
- },
846
- fields: [
847
- {
848
- name: 'name',
849
- type: 'text',
850
- required: true,
851
- label: 'Name',
852
- admin: {
853
- description: 'The name of the team.'
854
- }
855
- },
856
- {
857
- name: 'organization',
858
- type: 'relationship',
859
- relationTo: betterAuthPluginSlugs.organizations,
860
- required: true,
861
- label: 'Organization',
862
- admin: {
863
- readOnly: true,
864
- description: 'The organization that the team belongs to.'
865
- }
866
- }
867
- ],
868
- timestamps: true
869
- };
870
- enhancedCollections.push(teamCollection);
871
- break;
872
- case betterAuthPluginSlugs.jwks:
873
- const jwksCollection = {
874
- slug: betterAuthPluginSlugs.jwks,
875
- admin: {
876
- hidden: pluginOptions.hidePluginCollections ?? false,
877
- useAsTitle: 'publicKey',
878
- description: 'JWKS are used to verify the signature of the JWT token'
879
- },
880
- fields: [
881
- {
882
- name: 'publicKey',
883
- type: 'text',
884
- required: true,
885
- index: true,
886
- label: 'Public Key',
887
- admin: {
888
- description: 'The public part of the web key'
889
- }
890
- },
891
- {
892
- name: 'privateKey',
893
- type: 'text',
894
- required: true,
895
- label: 'Private Key',
896
- admin: {
897
- description: 'The private part of the web key'
898
- }
899
- }
900
- ],
901
- timestamps: true
902
- };
903
- enhancedCollections.push(jwksCollection);
904
- break;
905
- case betterAuthPluginSlugs.apiKeys:
906
- const apiKeyCollection = {
907
- slug: betterAuthPluginSlugs.apiKeys,
908
- admin: {
909
- hidden: pluginOptions.hidePluginCollections ?? false,
910
- useAsTitle: 'name',
911
- description: 'API keys are used to authenticate requests to the API.'
912
- },
913
- fields: [
914
- {
915
- name: 'name',
916
- type: 'text',
917
- label: 'Name',
918
- admin: {
919
- readOnly: true,
920
- description: 'The name of the API key.'
921
- }
922
- },
923
- {
924
- name: 'start',
925
- type: 'text',
926
- label: 'Starting Characters',
927
- admin: {
928
- readOnly: true,
929
- description: 'The starting characters of the API key. Useful for showing the first few characters of the API key in the UI for the users to easily identify.'
930
- }
931
- },
932
- {
933
- name: 'prefix',
934
- type: 'text',
935
- label: 'Prefix',
936
- admin: {
937
- readOnly: true,
938
- description: 'The API Key prefix. Stored as plain text.'
939
- }
940
- },
941
- {
942
- name: 'key',
943
- type: 'text',
944
- required: true,
945
- label: 'API Key',
946
- admin: {
947
- readOnly: true,
948
- description: 'The hashed API key itself.'
949
- }
950
- },
951
- {
952
- name: 'user',
953
- type: 'relationship',
954
- relationTo: userSlug,
955
- required: true,
956
- label: 'User',
957
- admin: {
958
- readOnly: true,
959
- description: 'The user associated with the API key.'
960
- }
961
- },
962
- {
963
- name: 'refillInterval',
964
- type: 'number',
965
- label: 'Refill Interval',
966
- admin: {
967
- readOnly: true,
968
- description: 'The interval to refill the key in milliseconds.'
969
- }
970
- },
971
- {
972
- name: 'refillAmount',
973
- type: 'number',
974
- label: 'Refill Amount',
975
- admin: {
976
- readOnly: true,
977
- description: 'The amount to refill the remaining count of the key.'
978
- }
979
- },
980
- {
981
- name: 'lastRefillAt',
982
- type: 'date',
983
- label: 'Last Refill At',
984
- admin: {
985
- readOnly: true,
986
- description: 'The date and time when the key was last refilled.'
987
- }
988
- },
989
- {
990
- name: 'enabled',
991
- type: 'checkbox',
992
- defaultValue: true,
993
- label: 'Enabled',
994
- admin: {
995
- readOnly: true,
996
- description: 'Whether the API key is enabled.'
997
- }
998
- },
999
- {
1000
- name: 'rateLimitEnabled',
1001
- type: 'checkbox',
1002
- defaultValue: true,
1003
- label: 'Rate Limit Enabled',
1004
- admin: {
1005
- readOnly: true,
1006
- description: 'Whether the API key has rate limiting enabled.'
1007
- }
1008
- },
1009
- {
1010
- name: 'rateLimitTimeWindow',
1011
- type: 'number',
1012
- label: 'Rate Limit Time Window',
1013
- admin: {
1014
- readOnly: true,
1015
- description: 'The time window in milliseconds for the rate limit.'
1016
- }
1017
- },
1018
- {
1019
- name: 'rateLimitMax',
1020
- type: 'number',
1021
- label: 'The maximum number of requests allowed within the `rateLimitTimeWindow`.',
1022
- admin: {
1023
- readOnly: true,
1024
- description: 'The maximum number of requests allowed within the rate limit time window.'
1025
- }
1026
- },
1027
- {
1028
- name: 'requstCount',
1029
- type: 'number',
1030
- label: 'Request Count',
1031
- required: true,
1032
- admin: {
1033
- readOnly: true,
1034
- description: 'The number of requests made within the rate limit time window.'
1035
- }
1036
- },
1037
- {
1038
- name: 'remaining',
1039
- type: 'number',
1040
- label: 'Remaining Requests',
1041
- admin: {
1042
- readOnly: true,
1043
- description: 'The number of requests remaining.'
1044
- }
1045
- },
1046
- {
1047
- name: 'lastRequest',
1048
- type: 'date',
1049
- label: 'Last Request At',
1050
- admin: {
1051
- readOnly: true,
1052
- description: 'The date and time of the last request made to the key.'
1053
- }
1054
- },
1055
- {
1056
- name: 'expiresAt',
1057
- type: 'date',
1058
- label: 'Expires At',
1059
- admin: {
1060
- readOnly: true,
1061
- description: 'The date and time of when the API key will expire.'
1062
- }
1063
- },
1064
- {
1065
- name: 'permissions',
1066
- type: 'text',
1067
- label: 'Permissions',
1068
- admin: {
1069
- readOnly: true,
1070
- description: 'The permissions for the API key.'
1071
- }
1072
- },
1073
- {
1074
- name: 'metadata',
1075
- type: 'json',
1076
- label: 'Metadata',
1077
- admin: {
1078
- readOnly: true,
1079
- description: 'Any additional metadata you want to store with the key.'
1080
- }
1081
- }
1082
- ],
1083
- timestamps: true
1084
- };
1085
- enhancedCollections.push(apiKeyCollection);
1086
- break;
1087
- case betterAuthPluginSlugs.twoFactors:
1088
- const twoFactorCollection = {
1089
- slug: betterAuthPluginSlugs.twoFactors,
1090
- admin: {
1091
- hidden: pluginOptions.hidePluginCollections ?? false,
1092
- useAsTitle: 'secret',
1093
- description: 'Two factor authentication secrets'
1094
- },
1095
- fields: [
1096
- {
1097
- name: 'user',
1098
- type: 'relationship',
1099
- relationTo: userSlug,
1100
- required: true,
1101
- label: 'User',
1102
- admin: {
1103
- readOnly: true,
1104
- description: 'The user that the two factor authentication secret belongs to'
1105
- }
1106
- },
1107
- {
1108
- name: 'secret',
1109
- type: 'text',
1110
- label: 'Secret',
1111
- index: true,
1112
- admin: {
1113
- readOnly: true,
1114
- description: 'The secret used to generate the TOTP code.'
1115
- }
1116
- },
1117
- {
1118
- name: 'backupCodes',
1119
- type: 'text',
1120
- required: true,
1121
- label: 'Backup Codes',
1122
- admin: {
1123
- readOnly: true,
1124
- description: 'The backup codes used to recover access to the account if the user loses access to their phone or email'
1125
- }
1126
- }
1127
- ],
1128
- timestamps: true
1129
- };
1130
- enhancedCollections.push(twoFactorCollection);
1131
- break;
1132
- case betterAuthPluginSlugs.oauthAccessTokens:
1133
- const oauthAccessTokenCollection = {
1134
- slug: betterAuthPluginSlugs.oauthAccessTokens,
1135
- admin: {
1136
- hidden: pluginOptions.hidePluginCollections ?? false,
1137
- useAsTitle: 'accessToken',
1138
- description: 'OAuth access tokens for custom OAuth clients'
1139
- },
1140
- fields: [
1141
- {
1142
- name: 'accessToken',
1143
- type: 'text',
1144
- required: true,
1145
- index: true,
1146
- label: 'Access Token',
1147
- admin: {
1148
- readOnly: true,
1149
- description: 'Access token issued to the client'
1150
- }
1151
- },
1152
- {
1153
- name: 'refreshToken',
1154
- type: 'text',
1155
- required: true,
1156
- label: 'Refresh Token',
1157
- admin: {
1158
- readOnly: true,
1159
- description: 'Refresh token issued to the client'
1160
- }
1161
- },
1162
- {
1163
- name: 'accessTokenExpiresAt',
1164
- type: 'date',
1165
- required: true,
1166
- label: 'Access Token Expires At',
1167
- admin: {
1168
- readOnly: true,
1169
- description: 'Expiration date of the access token'
1170
- }
1171
- },
1172
- {
1173
- name: 'refreshTokenExpiresAt',
1174
- type: 'date',
1175
- required: true,
1176
- label: 'Refresh Token Expires At',
1177
- admin: {
1178
- readOnly: true,
1179
- description: 'Expiration date of the refresh token'
1180
- }
1181
- },
1182
- {
1183
- name: 'client',
1184
- type: 'relationship',
1185
- relationTo: betterAuthPluginSlugs.oauthApplications,
1186
- required: true,
1187
- label: 'Client',
1188
- admin: {
1189
- readOnly: true,
1190
- description: 'OAuth application associated with the access token'
1191
- }
1192
- },
1193
- {
1194
- name: 'user',
1195
- type: 'relationship',
1196
- relationTo: userSlug,
1197
- required: true,
1198
- label: 'User',
1199
- admin: {
1200
- readOnly: true,
1201
- description: 'User associated with the access token'
1202
- }
1203
- },
1204
- {
1205
- name: 'scopes',
1206
- type: 'text',
1207
- required: true,
1208
- label: 'Scopes',
1209
- admin: {
1210
- description: 'Comma-separated list of scopes granted'
1211
- }
1212
- }
1213
- ],
1214
- timestamps: true
1215
- };
1216
- enhancedCollections.push(oauthAccessTokenCollection);
1217
- break;
1218
- case betterAuthPluginSlugs.oauthApplications:
1219
- const oauthApplicationCollection = {
1220
- slug: betterAuthPluginSlugs.oauthApplications,
1221
- admin: {
1222
- hidden: pluginOptions.hidePluginCollections ?? false,
1223
- useAsTitle: 'name',
1224
- description: 'OAuth applications are custom OAuth clients'
1225
- },
1226
- fields: [
1227
- {
1228
- name: 'clientId',
1229
- type: 'text',
1230
- unique: true,
1231
- index: true,
1232
- required: true,
1233
- label: 'Client ID',
1234
- admin: {
1235
- readOnly: true,
1236
- description: 'Unique identifier for each OAuth client'
1237
- }
1238
- },
1239
- {
1240
- name: 'clientSecret',
1241
- type: 'text',
1242
- required: true,
1243
- label: 'Client Secret',
1244
- admin: {
1245
- readOnly: true,
1246
- description: 'Secret key for the OAuth client'
1247
- }
1248
- },
1249
- {
1250
- name: 'name',
1251
- type: 'text',
1252
- required: true,
1253
- index: true,
1254
- label: 'Name',
1255
- admin: {
1256
- description: 'Name of the OAuth application'
1257
- }
1258
- },
1259
- {
1260
- name: 'redirectURLs',
1261
- type: 'text',
1262
- required: true,
1263
- label: 'Redirect URLs',
1264
- admin: {
1265
- description: 'Comma-separated list of redirect URLs'
1266
- }
1267
- },
1268
- {
1269
- name: 'metadata',
1270
- type: 'json',
1271
- admin: {
1272
- readOnly: true,
1273
- description: 'Additional metadata for the OAuth application'
1274
- }
1275
- },
1276
- {
1277
- name: 'type',
1278
- type: 'text',
1279
- required: true,
1280
- label: 'Type',
1281
- admin: {
1282
- readOnly: true,
1283
- description: 'Type of OAuth client (e.g., web, mobile)'
1284
- }
1285
- },
1286
- {
1287
- name: 'disabled',
1288
- type: 'checkbox',
1289
- defaultValue: false,
1290
- required: true,
1291
- label: 'Disabled',
1292
- admin: {
1293
- description: 'Indicates if the client is disabled'
1294
- }
1295
- },
1296
- {
1297
- name: 'icon',
1298
- type: 'text',
1299
- label: 'Icon',
1300
- admin: {
1301
- description: 'Icon of the OAuth application'
1302
- }
1303
- },
1304
- {
1305
- name: 'user',
1306
- type: 'relationship',
1307
- relationTo: userSlug,
1308
- required: false,
1309
- label: 'User',
1310
- admin: {
1311
- readOnly: true,
1312
- description: 'ID of the user who owns the client. (optional)'
1313
- }
1314
- }
1315
- ],
1316
- timestamps: true
1317
- };
1318
- enhancedCollections.push(oauthApplicationCollection);
1319
- break;
1320
- case betterAuthPluginSlugs.oauthConsents:
1321
- const oauthConsentCollection = {
1322
- slug: betterAuthPluginSlugs.oauthConsents,
1323
- admin: {
1324
- hidden: pluginOptions.hidePluginCollections ?? false,
1325
- description: 'OAuth consents are used to store user consents for OAuth clients'
1326
- },
1327
- fields: [
1328
- {
1329
- name: 'client',
1330
- type: 'relationship',
1331
- relationTo: betterAuthPluginSlugs.oauthApplications,
1332
- required: true,
1333
- label: 'Client',
1334
- admin: {
1335
- readOnly: true,
1336
- description: 'OAuth client associated with the consent'
1337
- }
1338
- },
1339
- {
1340
- name: 'user',
1341
- type: 'relationship',
1342
- relationTo: userSlug,
1343
- required: true,
1344
- label: 'User',
1345
- admin: {
1346
- readOnly: true,
1347
- description: 'User associated with the consent'
1348
- }
1349
- },
1350
- {
1351
- name: 'scopes',
1352
- type: 'text',
1353
- required: true,
1354
- label: 'Scopes',
1355
- admin: {
1356
- readOnly: true,
1357
- description: 'Comma-separated list of scopes consented to'
1358
- }
1359
- },
1360
- {
1361
- name: 'consentGiven',
1362
- type: 'checkbox',
1363
- defaultValue: false,
1364
- required: true,
1365
- label: 'Consent Given',
1366
- admin: {
1367
- readOnly: true,
1368
- description: ' Indicates if consent was given'
1369
- }
1370
- }
1371
- ],
1372
- timestamps: true
1373
- };
1374
- enhancedCollections.push(oauthConsentCollection);
1375
- break;
1376
- case betterAuthPluginSlugs.passkeys:
1377
- const passkeyCollection = {
1378
- slug: betterAuthPluginSlugs.passkeys,
1379
- admin: {
1380
- hidden: pluginOptions.hidePluginCollections ?? false,
1381
- useAsTitle: 'name',
1382
- description: 'Passkeys are used to authenticate users'
1383
- },
1384
- fields: [
1385
- {
1386
- name: 'name',
1387
- type: 'text',
1388
- label: 'Name',
1389
- admin: {
1390
- readOnly: true,
1391
- description: 'The name of the passkey'
1392
- }
1393
- },
1394
- {
1395
- name: 'publicKey',
1396
- type: 'text',
1397
- required: true,
1398
- index: true,
1399
- label: 'Public Key',
1400
- admin: {
1401
- readOnly: true,
1402
- description: 'The public key of the passkey'
1403
- }
1404
- },
1405
- {
1406
- name: 'user',
1407
- type: 'relationship',
1408
- relationTo: userSlug,
1409
- required: true,
1410
- index: true,
1411
- label: 'User',
1412
- admin: {
1413
- readOnly: true,
1414
- description: 'The user that the passkey belongs to'
1415
- }
1416
- },
1417
- {
1418
- name: 'credentialID',
1419
- type: 'text',
1420
- required: true,
1421
- unique: true,
1422
- label: 'Credential ID',
1423
- admin: {
1424
- readOnly: true,
1425
- description: 'The unique identifier of the registered credential'
1426
- }
1427
- },
1428
- {
1429
- name: 'counter',
1430
- type: 'number',
1431
- required: true,
1432
- label: 'Counter',
1433
- admin: {
1434
- readOnly: true,
1435
- description: 'The counter of the passkey'
1436
- }
1437
- },
1438
- {
1439
- name: 'deviceType',
1440
- type: 'text',
1441
- required: true,
1442
- label: 'Device Type',
1443
- admin: {
1444
- readOnly: true,
1445
- description: 'The type of device used to register the passkey'
1446
- }
1447
- },
1448
- {
1449
- name: 'backedUp',
1450
- type: 'checkbox',
1451
- required: true,
1452
- label: 'Backed Up',
1453
- admin: {
1454
- readOnly: true,
1455
- description: 'Whether the passkey is backed up'
1456
- }
1457
- },
1458
- {
1459
- name: 'transports',
1460
- type: 'text',
1461
- required: true,
1462
- label: 'Transports',
1463
- admin: {
1464
- readOnly: true,
1465
- description: 'The transports used to register the passkey'
1466
- }
1467
- }
1468
- ],
1469
- timestamps: true
1470
- };
1471
- enhancedCollections.push(passkeyCollection);
1472
- break;
1473
- case betterAuthPluginSlugs.ssoProviders:
1474
- const ssoProviderCollection = {
1475
- slug: betterAuthPluginSlugs.ssoProviders,
1476
- admin: {
1477
- hidden: pluginOptions.hidePluginCollections ?? false,
1478
- useAsTitle: 'issuer',
1479
- description: 'SSO providers are used to authenticate users with an external provider'
1480
- },
1481
- fields: [
1482
- {
1483
- name: 'issuer',
1484
- type: 'text',
1485
- required: true,
1486
- index: true,
1487
- label: 'Issuer',
1488
- admin: {
1489
- description: 'The issuer of the SSO provider'
1490
- }
1491
- },
1492
- {
1493
- name: 'domain',
1494
- type: 'text',
1495
- required: true,
1496
- label: 'Domain',
1497
- admin: {
1498
- description: 'The domain of the SSO provider'
1499
- }
1500
- },
1501
- {
1502
- name: 'oidcConfig',
1503
- type: 'text',
1504
- required: true,
1505
- label: 'OIDC Config',
1506
- admin: {
1507
- description: 'The OIDC config of the SSO provider'
1508
- }
1509
- },
1510
- {
1511
- name: 'user',
1512
- type: 'relationship',
1513
- relationTo: userSlug,
1514
- required: true,
1515
- label: 'User',
1516
- admin: {
1517
- description: 'The user associated with the SSO provider'
1518
- }
1519
- },
1520
- {
1521
- name: 'providerId',
1522
- type: 'text',
1523
- required: true,
1524
- label: 'Provider ID',
1525
- admin: {
1526
- readOnly: true,
1527
- description: 'The provider id. Used to identify a provider and to generate a redirect url'
1528
- }
1529
- },
1530
- {
1531
- name: 'organizationId',
1532
- type: 'text',
1533
- required: true,
1534
- label: 'Organization ID',
1535
- admin: {
1536
- readOnly: true,
1537
- description: 'The organization Id. If provider is linked to an organization'
1538
- }
1539
- }
1540
- ],
1541
- timestamps: true
1542
- };
1543
- enhancedCollections.push(ssoProviderCollection);
1544
- break;
1545
- default:
1546
- break;
1547
- }
1548
- });
1549
- const restOfCollections = incomingCollections.filter((collection)=>{
1550
- return !enhancedCollections.some((enhancedCollection)=>enhancedCollection.slug === collection.slug);
1551
- });
1552
- return [
1553
- ...enhancedCollections,
1554
- ...restOfCollections
1555
- ];
1556
- }
1557
-
1558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9wbHVnaW4vbGliL2J1aWxkLWNvbGxlY3Rpb24tY29uZmlncy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBheWxvYWRCZXR0ZXJBdXRoUGx1Z2luT3B0aW9ucywgU2FuaXRpemVkQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tICcuLidcbmltcG9ydCB7IGJhc2VDb2xsZWN0aW9uU2x1Z3MsIGJldHRlckF1dGhQbHVnaW5TbHVncyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgYmV0dGVyQXV0aFN0cmF0ZWd5IH0gZnJvbSAnLi9hdXRoLXN0cmF0ZWd5J1xuaW1wb3J0IHsgZ2V0QWZ0ZXJMb2dvdXRIb29rIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvdXNlcnMvaG9va3MvYWZ0ZXItbG9nb3V0J1xuaW1wb3J0IHsgZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy91c2Vycy9lbmRwb2ludHMvcmVmcmVzaC10b2tlbidcbmltcG9ydCB7XG4gIGlzQWRtaW5PckN1cnJlbnRVc2VyVXBkYXRlV2l0aEFsbG93ZWRGaWVsZHMsXG4gIGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzLFxuICBpc0FkbWluV2l0aFJvbGVzLFxufSBmcm9tICcuL3BheWxvYWQtYWNjZXNzJ1xuaW1wb3J0IHsgY2xlYW5VcFVzZXJBZnRlckRlbGV0ZSB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL2NsZWFuLXVwLXVzZXItYWZ0ZXItZGVsZXRlJ1xuaW1wb3J0IHsgZ2V0U3luY1Bhc3N3b3JkVG9Vc2VySG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL2FjY291bnRzL2hvb2tzL3N5bmMtcGFzc3dvcmQtdG8tdXNlcidcbmltcG9ydCB7IGdldFN5bmNBY2NvdW50SG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL3N5bmMtYWNjb3VudCdcbmltcG9ydCB7IG9uVmVyaWZpZWRDaGFuZ2UgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy91c2Vycy9ob29rcy9vbi12ZXJpZmllZC1jaGFuZ2UnXG5pbXBvcnQgeyBnZXRBZnRlckxvZ2luSG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL2FmdGVyLWxvZ2luJ1xuaW1wb3J0IHsgZ2V0QmVmb3JlTG9naW5Ib29rIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvdXNlcnMvaG9va3MvYmVmb3JlLWxvZ2luJ1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNvbmZpZywgRmllbGQgfSBmcm9tICdwYXlsb2FkJ1xuLyoqXG4gKiBCdWlsZHMgdGhlIHJlcXVpcmVkIGNvbGxlY3Rpb25zIGJhc2VkIG9uIHRoZSBCZXR0ZXJBdXRoIG9wdGlvbnMgYW5kIHBsdWdpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvbkNvbmZpZ3Moe1xuICBpbmNvbWluZ0NvbGxlY3Rpb25zLFxuICByZXF1aXJlZENvbGxlY3Rpb25TbHVncyxcbiAgcGx1Z2luT3B0aW9ucyxcbiAgc2FuaXRpemVkQkFPcHRpb25zLFxufToge1xuICBpbmNvbWluZ0NvbGxlY3Rpb25zOiBDb2xsZWN0aW9uQ29uZmlnW11cbiAgcmVxdWlyZWRDb2xsZWN0aW9uU2x1Z3M6IFNldDxzdHJpbmc+XG4gIHBsdWdpbk9wdGlvbnM6IFBheWxvYWRCZXR0ZXJBdXRoUGx1Z2luT3B0aW9uc1xuICBzYW5pdGl6ZWRCQU9wdGlvbnM6IFNhbml0aXplZEJldHRlckF1dGhPcHRpb25zXG59KTogQ29sbGVjdGlvbkNvbmZpZ1tdIHtcbiAgY29uc3QgdXNlclNsdWcgPSBwbHVnaW5PcHRpb25zLnVzZXJzPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3MudXNlcnNcbiAgY29uc3QgYWNjb3VudFNsdWcgPSBwbHVnaW5PcHRpb25zLmFjY291bnRzPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3MuYWNjb3VudHNcbiAgY29uc3Qgc2Vzc2lvblNsdWcgPSBwbHVnaW5PcHRpb25zLnNlc3Npb25zPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3Muc2Vzc2lvbnNcbiAgY29uc3QgdmVyaWZpY2F0aW9uU2x1ZyA9IHBsdWdpbk9wdGlvbnMudmVyaWZpY2F0aW9ucz8uc2x1ZyA/PyBiYXNlQ29sbGVjdGlvblNsdWdzLnZlcmlmaWNhdGlvbnNcbiAgY29uc3QgYmFQbHVnaW5zID0gc2FuaXRpemVkQkFPcHRpb25zLnBsdWdpbnMgPz8gbnVsbFxuICBjb25zdCBhZG1pblJvbGVzID0gcGx1Z2luT3B0aW9ucy51c2Vycz8uYWRtaW5Sb2xlcyA/PyBbJ2FkbWluJ11cblxuICBjb25zdCBnZXRUaW1lc3RhbXBGaWVsZHMgPSAoe1xuICAgIHNhdmVVcGRhdGVkQXRUb0pXVCA9IHRydWUsXG4gICAgc2F2ZUNyZWF0ZWRBdFRvSldUID0gdHJ1ZSxcbiAgfToge1xuICAgIHNhdmVVcGRhdGVkQXRUb0pXVD86IGJvb2xlYW5cbiAgICBzYXZlQ3JlYXRlZEF0VG9KV1Q/OiBib29sZWFuXG4gIH0gPSB7fSk6IEZpZWxkW10gPT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd1cGRhdGVkQXQnLFxuICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgIHNhdmVUb0pXVDogc2F2ZVVwZGF0ZWRBdFRvSldULFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIGRpc2FibGVCdWxrRWRpdDogdHJ1ZSxcbiAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICBsYWJlbDogKHsgdCB9KSA9PiB0KCdnZW5lcmFsOnVwZGF0ZWRBdCcpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NyZWF0ZWRBdCcsXG4gICAgICAgIHNhdmVUb0pXVDogc2F2ZUNyZWF0ZWRBdFRvSldULFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIGRpc2FibGVCdWxrRWRpdDogdHJ1ZSxcbiAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgIGxhYmVsOiAoeyB0IH0pID0+IHQoJ2dlbmVyYWw6Y3JlYXRlZEF0JyksXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGVuaGFuY2VkQ29sbGVjdGlvbnM6IENvbGxlY3Rpb25Db25maWdbXSA9IFtdXG5cbiAgcmVxdWlyZWRDb2xsZWN0aW9uU2x1Z3MuZm9yRWFjaCgoc2x1ZykgPT4ge1xuICAgIHN3aXRjaCAoc2x1ZyBhcyBrZXlvZiB0eXBlb2YgYmFzZUNvbGxlY3Rpb25TbHVncyB8IGtleW9mIHR5cGVvZiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MpIHtcbiAgICAgIGNhc2UgYmFzZUNvbGxlY3Rpb25TbHVncy51c2VyczpcbiAgICAgICAgY29uc3QgZXhpc3RpbmdVc2VyQ29sbGVjdGlvbiA9IGluY29taW5nQ29sbGVjdGlvbnMuZmluZChcbiAgICAgICAgICAoY29sbGVjdGlvbikgPT4gY29sbGVjdGlvbi5zbHVnID09PSB1c2VyU2x1ZyxcbiAgICAgICAgKSBhcyBDb2xsZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGFsbG93ZWRGaWVsZHMgPSBwbHVnaW5PcHRpb25zLnVzZXJzPy5hbGxvd2VkRmllbGRzID8/IFsnbmFtZSddXG4gICAgICAgIGxldCB1c2Vyc0NvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgLi4uZXhpc3RpbmdVc2VyQ29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnOiB1c2VyU2x1ZyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgZGVmYXVsdENvbHVtbnM6IFsnZW1haWwnXSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdlbWFpbCcsXG4gICAgICAgICAgICAuLi5leGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5hZG1pbixcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy51c2Vycz8uaGlkZGVuID8/IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWNjZXNzOiB7XG4gICAgICAgICAgICBhZG1pbjogKHsgcmVxIH0pID0+IGFkbWluUm9sZXMuaW5jbHVkZXMoKHJlcS51c2VyPy5yb2xlIGFzIHN0cmluZykgPz8gJ3VzZXInKSxcbiAgICAgICAgICAgIHJlYWQ6IGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcywgaWRGaWVsZDogJ2lkJyB9KSxcbiAgICAgICAgICAgIGNyZWF0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICBkZWxldGU6IGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcywgaWRGaWVsZDogJ2lkJyB9KSxcbiAgICAgICAgICAgIHVwZGF0ZTogaXNBZG1pbk9yQ3VycmVudFVzZXJVcGRhdGVXaXRoQWxsb3dlZEZpZWxkcyh7XG4gICAgICAgICAgICAgIGFsbG93ZWRGaWVsZHMsXG4gICAgICAgICAgICAgIGFkbWluUm9sZXMsXG4gICAgICAgICAgICAgIHVzZXJTbHVnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uYWNjZXNzID8/IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuZHBvaW50czogW1xuICAgICAgICAgICAgLi4uKGV4aXN0aW5nVXNlckNvbGxlY3Rpb24/LmVuZHBvaW50cyA/IGV4aXN0aW5nVXNlckNvbGxlY3Rpb24uZW5kcG9pbnRzIDogW10pLFxuICAgICAgICAgICAgZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQoeyB1c2VyU2x1ZyB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmVDaGFuZ2U6IFtcbiAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nVXNlckNvbGxlY3Rpb24/Lmhvb2tzPy5iZWZvcmVDaGFuZ2UgPz8gW10pLFxuICAgICAgICAgICAgICBvblZlcmlmaWVkQ2hhbmdlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFmdGVyQ2hhbmdlOiBbXG4gICAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5ob29rcz8uYWZ0ZXJDaGFuZ2UgPz8gW10pLFxuICAgICAgICAgICAgICBnZXRTeW5jQWNjb3VudEhvb2soe1xuICAgICAgICAgICAgICAgIHVzZXJTbHVnLFxuICAgICAgICAgICAgICAgIGFjY291bnRTbHVnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBiZWZvcmVMb2dpbjogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmJlZm9yZUxvZ2luID8/IFtdKSxcbiAgICAgICAgICAgICAgZ2V0QmVmb3JlTG9naW5Ib29rKCksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYWZ0ZXJMb2dpbjogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmFmdGVyTG9naW4gPz8gW10pLFxuICAgICAgICAgICAgICBnZXRBZnRlckxvZ2luSG9vayh7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbnNDb2xsZWN0aW9uU2x1Zzogc2Vzc2lvblNsdWcsXG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uU2x1ZzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFmdGVyTG9nb3V0OiBbXG4gICAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5ob29rcz8uYWZ0ZXJMb2dvdXQgPz8gW10pLFxuICAgICAgICAgICAgICBnZXRBZnRlckxvZ291dEhvb2soeyBzZXNzaW9uc0NvbGxlY3Rpb25TbHVnOiBzZXNzaW9uU2x1ZyB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhZnRlckRlbGV0ZTogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmFmdGVyRGVsZXRlID8/IFtdKSxcbiAgICAgICAgICAgICAgKGFyZ3MpID0+IGNsZWFuVXBVc2VyQWZ0ZXJEZWxldGUoYXJncyBhcyBhbnkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGF1dGg6IHtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uICYmIHR5cGVvZiBleGlzdGluZ1VzZXJDb2xsZWN0aW9uLmF1dGggPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgID8gZXhpc3RpbmdVc2VyQ29sbGVjdGlvbi5hdXRoXG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgLy9kaXNhYmxlTG9jYWxTdHJhdGVneTogZmFsc2UsXG4gICAgICAgICAgICBzdHJhdGVnaWVzOiBbYmV0dGVyQXV0aFN0cmF0ZWd5KGFkbWluUm9sZXMsIHVzZXJTbHVnKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnYmV0dGVyQXV0aEFkbWluQnV0dG9ucycsXG4gICAgICAgICAgICAgIHR5cGU6ICd1aScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzaWRlYmFyJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgICBGaWVsZDoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAncGF5bG9hZC1hdXRoL2JldHRlci1hdXRoL3BsdWdpbi9jbGllbnQjQWRtaW5CdXR0b25zJyxcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJvcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlclNsdWcsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gT25seSBzaG93IHRoZSBpbXBlcnNvbmF0ZSBidXR0b24gaWYgdGhlIGFkbWluIHBsdWdpbiBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGJhUGx1Z2lucyAmJiBiYVBsdWdpbnMuc29tZSgocGx1Z2luKSA9PiBwbHVnaW4uaWQgPT09ICdhZG1pbicpKSA/PyBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlcnMgY2hvc2VuIGRpc3BsYXkgbmFtZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBlbWFpbCBvZiB0aGUgdXNlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZW1haWxWZXJpZmllZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICBzYXZlVG9KV1Q6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRW1haWwgVmVyaWZpZWQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgZW1haWwgb2YgdGhlIHVzZXIgaGFzIGJlZW4gdmVyaWZpZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2ltYWdlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0ltYWdlJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGltYWdlIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyb2xlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgcGx1Z2luT3B0aW9ucy51c2Vycz8ucm9sZXMgPz8gW1xuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQWRtaW4nLCB2YWx1ZTogJ2FkbWluJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVXNlcicsIHZhbHVlOiAndXNlcicgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApLm1hcCgocm9sZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb2xlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByb2xlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcm9sZS5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByb2xlIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5nZXRUaW1lc3RhbXBGaWVsZHMoeyBzYXZlVXBkYXRlZEF0VG9KV1Q6IGZhbHNlLCBzYXZlQ3JlYXRlZEF0VG9KV1Q6IGZhbHNlIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhUGx1Z2lucykge1xuICAgICAgICAgIGJhUGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAocGx1Z2luLmlkKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3R3by1mYWN0b3InOlxuICAgICAgICAgICAgICAgIHVzZXJzQ29sbGVjdGlvbi5maWVsZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAndHdvRmFjdG9yRW5hYmxlZCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVHdvIEZhY3RvciBFbmFibGVkJyxcbiAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgdXNlciBoYXMgdHdvIGZhY3RvciBhdXRoZW50aWNhdGlvbiBlbmFibGVkJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlICd1c2VybmFtZSc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcm5hbWUnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBUT0RPOiBkZWNpZGUgaWYgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQsIHdpbGwgaGF2ZSB0byB0ZWxsIHVzZXJzIHRoZXkgbmVlZCB0byBhZGQgdWkgZm9yIGl0LlxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1VzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VybmFtZSBvZiB0aGUgdXNlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGlzcGxheVVzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaXNwbGF5IFVzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkaXNwbGF5IHVzZXJuYW1lIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2Fub255bW91cyc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdpc0Fub255bW91cycsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnSXMgQW5vbnltb3VzJyxcbiAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgdXNlciBpcyBhbm9ueW1vdXMuJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlICdwaG9uZS1udW1iZXInOlxuICAgICAgICAgICAgICAgIHVzZXJzQ29sbGVjdGlvbi5maWVsZHMucHVzaChcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bob25lTnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Bob25lIE51bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGhvbmUgbnVtYmVyIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwaG9uZU51bWJlclZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQaG9uZSBOdW1iZXIgVmVyaWZpZWQnLFxuICAgICAgICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgcGhvbmUgbnVtYmVyIG9mIHRoZSB1c2VyIGhhcyBiZWVuIHZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2FkbWluJzpcbiAgICAgICAgICAgICAgICB1c2Vyc0NvbGxlY3Rpb24uZmllbGRzLnB1c2goXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdiYW5uZWQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Jhbm5lZCcsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSB1c2VyIGlzIGJhbm5lZCBmcm9tIHRoZSBwbGF0Zm9ybScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYmFuUmVhc29uJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JhbiBSZWFzb24nLFxuICAgICAgICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJlYXNvbiBmb3IgdGhlIGJhbicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYmFuRXhwaXJlcycsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCYW4gRXhwaXJlcycsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBiYW4gd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSAnaGFybW9ueS1lbWFpbCc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdub3JtYWxpemVkRW1haWwnLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5vcm1hbGl6ZWQgZW1haWwgb2YgdGhlIHVzZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsdWdpbk9wdGlvbnMudXNlcnM/LmNvbGxlY3Rpb25PdmVycmlkZXMpIHtcbiAgICAgICAgICB1c2Vyc0NvbGxlY3Rpb24gPSBwbHVnaW5PcHRpb25zLnVzZXJzLmNvbGxlY3Rpb25PdmVycmlkZXMoeyBjb2xsZWN0aW9uOiB1c2Vyc0NvbGxlY3Rpb24gfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaCh1c2Vyc0NvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3MuYWNjb3VudHM6XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudENvbGxlY3Rpb24gPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gYWNjb3VudFNsdWcsXG4gICAgICAgICkgYXMgQ29sbGVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZFxuICAgICAgICBsZXQgYWNjb3VudENvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYWNjb3VudFNsdWcsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdhY2NvdW50SWQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBY2NvdW50cyBhcmUgdXNlZCB0byBzdG9yZSB1c2VyIGFjY291bnRzIGZvciBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMnLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uYWRtaW4sXG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuYWNjb3VudHM/LmhpZGRlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBhZnRlckNoYW5nZTogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uaG9va3M/LmFmdGVyQ2hhbmdlID8/IFtdKSxcbiAgICAgICAgICAgICAgZ2V0U3luY1Bhc3N3b3JkVG9Vc2VySG9vayh7XG4gICAgICAgICAgICAgICAgdXNlclNsdWcsXG4gICAgICAgICAgICAgICAgYWNjb3VudFNsdWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFjY2Vzczoge1xuICAgICAgICAgICAgY3JlYXRlOiBpc0FkbWluV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcyB9KSxcbiAgICAgICAgICAgIGRlbGV0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICByZWFkOiBpc0FkbWluT3JDdXJyZW50VXNlcldpdGhSb2xlcyh7IGFkbWluUm9sZXMsIGlkRmllbGQ6ICd1c2VyJyB9KSxcbiAgICAgICAgICAgIHVwZGF0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uYWNjZXNzID8/IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgLi4uKGV4aXN0aW5nQWNjb3VudENvbGxlY3Rpb24/LmZpZWxkcyA/PyBbXSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBhY2NvdW50IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY291bnRJZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2NvdW50IElEJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgJ1RoZSBpZCBvZiB0aGUgYWNjb3VudCBhcyBwcm92aWRlZCBieSB0aGUgU1NPIG9yIGVxdWFsIHRvIHVzZXJJZCBmb3IgY3JlZGVudGlhbCBhY2NvdW50cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncHJvdmlkZXJJZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJvdmlkZXIgSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkIG9mIHRoZSBwcm92aWRlciBhcyBwcm92aWRlZCBieSB0aGUgU1NPJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFjY2VzcyB0b2tlbiBvZiB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyZWZyZXNoVG9rZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVmcmVzaCBUb2tlbicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcmVmcmVzaCB0b2tlbiBvZiB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbkV4cGlyZXNBdCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4gRXhwaXJlcyBBdCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBhY2Nlc3MgdG9rZW4gd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZnJlc2hUb2tlbkV4cGlyZXNBdCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuIEV4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcmVmcmVzaCB0b2tlbiB3aWxsIGV4cGlyZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnc2NvcGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU2NvcGUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNjb3BlIG9mIHRoZSBhY2NvdW50LiBSZXR1cm5lZCBieSB0aGUgcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2lkVG9rZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSUQgVG9rZW4nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkIHRva2VuIGZvciB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQYXNzd29yZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgJ1RoZSBoYXNoZWQgcGFzc3dvcmQgb2YgdGhlIGFjY291bnQuIE1haW5seSB1c2VkIGZvciBlbWFpbCBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmdldFRpbWVzdGFtcEZpZWxkcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgLi4uZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbixcbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luT3B0aW9ucy5hY2NvdW50cz8uY29sbGVjdGlvbk92ZXJyaWRlcykge1xuICAgICAgICAgIGFjY291bnRDb2xsZWN0aW9uID0gcGx1Z2luT3B0aW9ucy5hY2NvdW50cy5jb2xsZWN0aW9uT3ZlcnJpZGVzKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGFjY291bnRDb2xsZWN0aW9uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goYWNjb3VudENvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3Muc2Vzc2lvbnM6XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2Vzc2lvbkNvbGxlY3Rpb24gPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gc2Vzc2lvblNsdWcsXG4gICAgICAgICkgYXMgQ29sbGVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZFxuICAgICAgICBsZXQgc2Vzc2lvbkNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1Zzogc2Vzc2lvblNsdWcsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nU2Vzc2lvbkNvbGxlY3Rpb24/LmFkbWluLFxuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLnNlc3Npb25zPy5oaWRkZW4sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgJ1Nlc3Npb25zIGFyZSBhY3RpdmUgc2Vzc2lvbnMgZm9yIHVzZXJzLiBUaGV5IGFyZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyB3aXRoIGEgc2Vzc2lvbiB0b2tlbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1Nlc3Npb25Db2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndXNlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiB1c2VyU2x1ZyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHNhdmVUb0pXVDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBzZXNzaW9uIGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Rva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1bmlxdWUgc2Vzc2lvbiB0b2tlbicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdFeHBpcmVzIEF0JyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc2Vzc2lvbiB3aWxsIGV4cGlyZScsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaXBBZGRyZXNzJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lQIEFkZHJlc3MnLFxuICAgICAgICAgICAgICBzYXZlVG9KV1Q6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyQWdlbnQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlciBBZ2VudCcsXG4gICAgICAgICAgICAgIHNhdmVUb0pXVDogdHJ1ZSxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VyIGFnZW50IGluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UnLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmdldFRpbWVzdGFtcEZpZWxkcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgLi4uZXhpc3RpbmdTZXNzaW9uQ29sbGVjdGlvbixcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFQbHVnaW5zKSB7XG4gICAgICAgICAgYmFQbHVnaW5zLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChwbHVnaW4uaWQpIHtcbiAgICAgICAgICAgICAgY2FzZSAnYWRtaW4nOlxuICAgICAgICAgICAgICAgIHNlc3Npb25Db2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbXBlcnNvbmF0ZWRCeScsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdJbXBlcnNvbmF0ZWQgQnknLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFkbWluIHdobyBpcyBpbXBlcnNvbmF0aW5nIHRoaXMgc2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSAnb3JnYW5pemF0aW9uJzpcbiAgICAgICAgICAgICAgICBzZXNzaW9uQ29sbGVjdGlvbi5maWVsZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnYWN0aXZlT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICAgICAgcmVsYXRpb25UbzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9yZ2FuaXphdGlvbnMsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2ZSBPcmdhbml6YXRpb24nLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGN1cnJlbnRseSBhY3RpdmUgb3JnYW5pemF0aW9uIGZvciB0aGUgc2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGx1Z2luT3B0aW9ucy5zZXNzaW9ucz8uY29sbGVjdGlvbk92ZXJyaWRlcykge1xuICAgICAgICAgIHNlc3Npb25Db2xsZWN0aW9uID0gcGx1Z2luT3B0aW9ucy5zZXNzaW9ucy5jb2xsZWN0aW9uT3ZlcnJpZGVzKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHNlc3Npb25Db2xsZWN0aW9uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goc2Vzc2lvbkNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3MudmVyaWZpY2F0aW9uczpcbiAgICAgICAgY29uc3QgZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uID0gaW5jb21pbmdDb2xsZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnNsdWcgPT09IHZlcmlmaWNhdGlvblNsdWcsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiB2ZXJpZmljYXRpb25TbHVnLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1ZlcmlmaWNhdGlvbkNvbGxlY3Rpb24/LmFkbWluLFxuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLnZlcmlmaWNhdGlvbnM/LmhpZGRlbixcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdpZGVudGlmaWVyJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVmVyaWZpY2F0aW9ucyBhcmUgdXNlZCB0byB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVxdWVzdHMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaWRlbnRpZmllcicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkZW50aWZpZXIgb2YgdGhlIHZlcmlmaWNhdGlvbiByZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVmFsdWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHZhbHVlIHRvIGJlIHZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdleHBpcmVzQXQnLFxuICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0V4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgICAgLi4uZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaCh2ZXJpZmljYXRpb25Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9uczpcbiAgICAgICAgY29uc3Qgb3JnYW5pemF0aW9uQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAnT3JnYW5pemF0aW9ucyBhcmUgZ3JvdXBzIG9mIHVzZXJzIHRoYXQgc2hhcmUgYWNjZXNzIHRvIGNlcnRhaW4gcmVzb3VyY2VzLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3NsdWcnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU2x1ZycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgc2x1ZyBvZiB0aGUgb3JnYW5pemF0aW9uLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbG9nbycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdMb2dvJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBsb2dvIG9mIHRoZSBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdNZXRhZGF0YScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIG1ldGFkYXRhIGZvciB0aGUgb3JnYW5pemF0aW9uLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2gob3JnYW5pemF0aW9uQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLm1lbWJlcnM6XG4gICAgICAgIGNvbnN0IG1lbWJlckNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm1lbWJlcnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnb3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTWVtYmVycyBvZiBhbiBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnb3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IGJldHRlckF1dGhQbHVnaW5TbHVncy5vcmdhbml6YXRpb25zLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgbWVtYmVyIGJlbG9uZ3MgdG8uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd0ZWFtJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IGJldHRlckF1dGhQbHVnaW5TbHVncy50ZWFtcyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1RlYW0nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRlYW0gdGhhdCB0aGUgbWVtYmVyIGJlbG9uZ3MgdG8uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyb2xlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnbWVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByb2xlIG9mIHRoZSBtZW1iZXIgaW4gdGhlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG1lbWJlckNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5pbnZpdGF0aW9uczpcbiAgICAgICAgY29uc3QgaW52aXRhdGlvbkNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLmludml0YXRpb25zLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuaGlkZVBsdWdpbkNvbGxlY3Rpb25zID8/IGZhbHNlLFxuICAgICAgICAgICAgdXNlQXNUaXRsZTogJ2VtYWlsJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW52aXRhdGlvbnMgdG8gam9pbiBhbiBvcmdhbml6YXRpb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBlbWFpbCBvZiB0aGUgdXNlciBiZWluZyBpbnZpdGVkLicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaW52aXRlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiB1c2VyU2x1ZyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSW52aXRlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB3aG8gaW52aXRlZCB0aGUgdXNlci4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgb3JnYW5pemF0aW9uIHRoYXQgdGhlIHVzZXIgaXMgYmVpbmcgaW52aXRlZCB0by4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JvbGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JvbGUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvbGUgb2YgdGhlIHVzZXIgYmVpbmcgaW52aXRlZC4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3N0YXR1cycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgc3RhdHVzIG9mIHRoZSBpbnZpdGF0aW9uLicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdFeHBpcmVzIEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGludml0YXRpb24gd2lsbCBleHBpcmUuJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChpbnZpdGF0aW9uQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLnRlYW1zOlxuICAgICAgICBjb25zdCB0ZWFtQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudGVhbXMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnbmFtZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RlYW1zIGFyZSBncm91cHMgb2YgdXNlcnMgdGhhdCBzaGFyZSBhY2Nlc3MgdG8gY2VydGFpbiByZXNvdXJjZXMuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbmFtZSBvZiB0aGUgdGVhbS4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgdGVhbSBiZWxvbmdzIHRvLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2godGVhbUNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5qd2tzOlxuICAgICAgICBjb25zdCBqd2tzQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MuandrcyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdKV0tTIGFyZSB1c2VkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBKV1QgdG9rZW4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQdWJsaWMgS2V5JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwdWJsaWMgcGFydCBvZiB0aGUgd2ViIGtleScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncHJpdmF0ZUtleScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJpdmF0ZSBLZXknLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByaXZhdGUgcGFydCBvZiB0aGUgd2ViIGtleScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goandrc0NvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5hcGlLZXlzOlxuICAgICAgICBjb25zdCBhcGlLZXlDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5hcGlLZXlzLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuaGlkZVBsdWdpbkNvbGxlY3Rpb25zID8/IGZhbHNlLFxuICAgICAgICAgICAgdXNlQXNUaXRsZTogJ25hbWUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBUEkga2V5cyBhcmUgdXNlZCB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIEFQSS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5hbWUgb2YgdGhlIEFQSSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTdGFydGluZyBDaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICdUaGUgc3RhcnRpbmcgY2hhcmFjdGVycyBvZiB0aGUgQVBJIGtleS4gVXNlZnVsIGZvciBzaG93aW5nIHRoZSBmaXJzdCBmZXcgY2hhcmFjdGVycyBvZiB0aGUgQVBJIGtleSBpbiB0aGUgVUkgZm9yIHRoZSB1c2VycyB0byBlYXNpbHkgaWRlbnRpZnkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwcmVmaXgnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJlZml4JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBBUEkgS2V5IHByZWZpeC4gU3RvcmVkIGFzIHBsYWluIHRleHQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdrZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0FQSSBLZXknLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGhhc2hlZCBBUEkga2V5IGl0c2VsZi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBBUEkga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmaWxsSW50ZXJ2YWwnLFxuICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZpbGwgSW50ZXJ2YWwnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGludGVydmFsIHRvIHJlZmlsbCB0aGUga2V5IGluIG1pbGxpc2Vjb25kcy4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZmlsbEFtb3VudCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JlZmlsbCBBbW91bnQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFtb3VudCB0byByZWZpbGwgdGhlIHJlbWFpbmluZyBjb3VudCBvZiB0aGUga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbGFzdFJlZmlsbEF0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0xhc3QgUmVmaWxsIEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGtleSB3YXMgbGFzdCByZWZpbGxlZC4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBBUEkga2V5IGlzIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyYXRlTGltaXRFbmFibGVkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JhdGUgTGltaXQgRW5hYmxlZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBBUEkga2V5IGhhcyByYXRlIGxpbWl0aW5nIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyYXRlTGltaXRUaW1lV2luZG93JyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmF0ZSBMaW1pdCBUaW1lIFdpbmRvdycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcmF0ZSBsaW1pdC4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JhdGVMaW1pdE1heCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICBsYWJlbDogJ1RoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIHdpdGhpbiB0aGUgYHJhdGVMaW1pdFRpbWVXaW5kb3dgLicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAnVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGFsbG93ZWQgd2l0aGluIHRoZSByYXRlIGxpbWl0IHRpbWUgd2luZG93LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVxdXN0Q291bnQnLFxuICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZXF1ZXN0IENvdW50JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIG1hZGUgd2l0aGluIHRoZSByYXRlIGxpbWl0IHRpbWUgd2luZG93LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVtYWluaW5nJyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVtYWluaW5nIFJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBudW1iZXIgb2YgcmVxdWVzdHMgcmVtYWluaW5nLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbGFzdFJlcXVlc3QnLFxuICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgIGxhYmVsOiAnTGFzdCBSZXF1ZXN0IEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSB0byB0aGUga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0V4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgb2Ygd2hlbiB0aGUgQVBJIGtleSB3aWxsIGV4cGlyZS4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Blcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Blcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIEFQSSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdNZXRhZGF0YScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBbnkgYWRkaXRpb25hbCBtZXRhZGF0YSB5b3Ugd2FudCB0byBzdG9yZSB3aXRoIHRoZSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChhcGlLZXlDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudHdvRmFjdG9yczpcbiAgICAgICAgY29uc3QgdHdvRmFjdG9yQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudHdvRmFjdG9ycyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdzZWNyZXQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUd28gZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNlY3JldHMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VyIHRoYXQgdGhlIHR3byBmYWN0b3IgYXV0aGVudGljYXRpb24gc2VjcmV0IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3NlY3JldCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTZWNyZXQnLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzZWNyZXQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgVE9UUCBjb2RlLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnYmFja3VwQ29kZXMnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0JhY2t1cCBDb2RlcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAnVGhlIGJhY2t1cCBjb2RlcyB1c2VkIHRvIHJlY292ZXIgYWNjZXNzIHRvIHRoZSBhY2NvdW50IGlmIHRoZSB1c2VyIGxvc2VzIGFjY2VzcyB0byB0aGVpciBwaG9uZSBvciBlbWFpbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2godHdvRmFjdG9yQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9hdXRoQWNjZXNzVG9rZW5zOlxuICAgICAgICBjb25zdCBvYXV0aEFjY2Vzc1Rva2VuQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBY2Nlc3NUb2tlbnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnYWNjZXNzVG9rZW4nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPQXV0aCBhY2Nlc3MgdG9rZW5zIGZvciBjdXN0b20gT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnQWNjZXNzIFRva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FjY2VzcyB0b2tlbiBpc3N1ZWQgdG8gdGhlIGNsaWVudCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmcmVzaFRva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlZnJlc2ggdG9rZW4gaXNzdWVkIHRvIHRoZSBjbGllbnQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY2Vzc1Rva2VuRXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4gRXhwaXJlcyBBdCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFeHBpcmF0aW9uIGRhdGUgb2YgdGhlIGFjY2VzcyB0b2tlbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmcmVzaFRva2VuRXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuIEV4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRXhwaXJhdGlvbiBkYXRlIG9mIHRoZSByZWZyZXNoIHRva2VuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjbGllbnQnLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9hdXRoQXBwbGljYXRpb25zLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDbGllbnQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnc2NvcGVzJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTY29wZXMnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc2NvcGVzIGdyYW50ZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG9hdXRoQWNjZXNzVG9rZW5Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBcHBsaWNhdGlvbnM6XG4gICAgICAgIGNvbnN0IG9hdXRoQXBwbGljYXRpb25Db2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5vYXV0aEFwcGxpY2F0aW9ucyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggYXBwbGljYXRpb25zIGFyZSBjdXN0b20gT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NsaWVudElkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDbGllbnQgSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggT0F1dGggY2xpZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjbGllbnRTZWNyZXQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NsaWVudCBTZWNyZXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2VjcmV0IGtleSBmb3IgdGhlIE9BdXRoIGNsaWVudCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgT0F1dGggYXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZGlyZWN0VVJMcycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgVVJMcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWRpcmVjdCBVUkxzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHRoZSBPQXV0aCBhcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndHlwZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVHlwZScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUeXBlIG9mIE9BdXRoIGNsaWVudCAoZS5nLiwgd2ViLCBtb2JpbGUpJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0Rpc2FibGVkJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luZGljYXRlcyBpZiB0aGUgY2xpZW50IGlzIGRpc2FibGVkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdpY29uJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0ljb24nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSWNvbiBvZiB0aGUgT0F1dGggYXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0lEIG9mIHRoZSB1c2VyIHdobyBvd25zIHRoZSBjbGllbnQuIChvcHRpb25hbCknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG9hdXRoQXBwbGljYXRpb25Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhDb25zZW50czpcbiAgICAgICAgY29uc3Qgb2F1dGhDb25zZW50Q29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhDb25zZW50cyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggY29uc2VudHMgYXJlIHVzZWQgdG8gc3RvcmUgdXNlciBjb25zZW50cyBmb3IgT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBcHBsaWNhdGlvbnMsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NsaWVudCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPQXV0aCBjbGllbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdzY29wZXMnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Njb3BlcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgY29uc2VudGVkIHRvJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjb25zZW50R2l2ZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDb25zZW50IEdpdmVuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1x0SW5kaWNhdGVzIGlmIGNvbnNlbnQgd2FzIGdpdmVuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChvYXV0aENvbnNlbnRDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MucGFzc2tleXM6XG4gICAgICAgIGNvbnN0IHBhc3NrZXlDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5wYXNza2V5cyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGFzc2tleXMgYXJlIHVzZWQgdG8gYXV0aGVudGljYXRlIHVzZXJzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBuYW1lIG9mIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQdWJsaWMgS2V5JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwdWJsaWMga2V5IG9mIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBwYXNza2V5IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NyZWRlbnRpYWxJRCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDcmVkZW50aWFsIElEJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVnaXN0ZXJlZCBjcmVkZW50aWFsJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjb3VudGVyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NvdW50ZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNvdW50ZXIgb2YgdGhlIHBhc3NrZXknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2RldmljZVR5cGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0eXBlIG9mIGRldmljZSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdiYWNrZWRVcCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0JhY2tlZCBVcCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBwYXNza2V5IGlzIGJhY2tlZCB1cCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndHJhbnNwb3J0cycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVHJhbnNwb3J0cycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhbnNwb3J0cyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChwYXNza2V5Q29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLnNzb1Byb3ZpZGVyczpcbiAgICAgICAgY29uc3Qgc3NvUHJvdmlkZXJDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5zc29Qcm92aWRlcnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnaXNzdWVyJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU1NPIHByb3ZpZGVycyBhcmUgdXNlZCB0byBhdXRoZW50aWNhdGUgdXNlcnMgd2l0aCBhbiBleHRlcm5hbCBwcm92aWRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2lzc3VlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lzc3VlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgaXNzdWVyIG9mIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2RvbWFpbicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRG9tYWluJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkb21haW4gb2YgdGhlIFNTTyBwcm92aWRlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnb2lkY0NvbmZpZycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT0lEQyBDb25maWcnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIE9JREMgY29uZmlnIG9mIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Byb3ZpZGVySWQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Byb3ZpZGVyIElEJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICdUaGUgcHJvdmlkZXIgaWQuIFVzZWQgdG8gaWRlbnRpZnkgYSBwcm92aWRlciBhbmQgdG8gZ2VuZXJhdGUgYSByZWRpcmVjdCB1cmwnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbklkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdPcmdhbml6YXRpb24gSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG9yZ2FuaXphdGlvbiBJZC4gSWYgcHJvdmlkZXIgaXMgbGlua2VkIHRvIGFuIG9yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goc3NvUHJvdmlkZXJDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcmVzdE9mQ29sbGVjdGlvbnMgPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbHRlcigoY29sbGVjdGlvbikgPT4ge1xuICAgIHJldHVybiAhZW5oYW5jZWRDb2xsZWN0aW9ucy5zb21lKFxuICAgICAgKGVuaGFuY2VkQ29sbGVjdGlvbikgPT4gZW5oYW5jZWRDb2xsZWN0aW9uLnNsdWcgPT09IGNvbGxlY3Rpb24uc2x1ZyxcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIFsuLi5lbmhhbmNlZENvbGxlY3Rpb25zLCAuLi5yZXN0T2ZDb2xsZWN0aW9uc11cbn1cbiJdLCJuYW1lcyI6WyJiYXNlQ29sbGVjdGlvblNsdWdzIiwiYmV0dGVyQXV0aFBsdWdpblNsdWdzIiwiYmV0dGVyQXV0aFN0cmF0ZWd5IiwiZ2V0QWZ0ZXJMb2dvdXRIb29rIiwiZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQiLCJpc0FkbWluT3JDdXJyZW50VXNlclVwZGF0ZVdpdGhBbGxvd2VkRmllbGRzIiwiaXNBZG1pbk9yQ3VycmVudFVzZXJXaXRoUm9sZXMiLCJpc0FkbWluV2l0aFJvbGVzIiwiY2xlYW5VcFVzZXJBZnRlckRlbGV0ZSIsImdldFN5bmNQYXNzd29yZFRvVXNlckhvb2siLCJnZXRTeW5jQWNjb3VudEhvb2siLCJvblZlcmlmaWVkQ2hhbmdlIiwiZ2V0QWZ0ZXJMb2dpbkhvb2siLCJnZXRCZWZvcmVMb2dpbkhvb2siLCJidWlsZENvbGxlY3Rpb25Db25maWdzIiwiaW5jb21pbmdDb2xsZWN0aW9ucyIsInJlcXVpcmVkQ29sbGVjdGlvblNsdWdzIiwicGx1Z2luT3B0aW9ucyIsInNhbml0aXplZEJBT3B0aW9ucyIsInVzZXJTbHVnIiwidXNlcnMiLCJzbHVnIiwiYWNjb3VudFNsdWciLCJhY2NvdW50cyIsInNlc3Npb25TbHVnIiwic2Vzc2lvbnMiLCJ2ZXJpZmljYXRpb25TbHVnIiwidmVyaWZpY2F0aW9ucyIsImJhUGx1Z2lucyIsInBsdWdpbnMiLCJhZG1pblJvbGVzIiwiZ2V0VGltZXN0YW1wRmllbGRzIiwic2F2ZVVwZGF0ZWRBdFRvSldUIiwic2F2ZUNyZWF0ZWRBdFRvSldUIiwibmFtZSIsInR5cGUiLCJzYXZlVG9KV1QiLCJhZG1pbiIsImRpc2FibGVCdWxrRWRpdCIsImhpZGRlbiIsImluZGV4IiwibGFiZWwiLCJ0IiwiZW5oYW5jZWRDb2xsZWN0aW9ucyIsImZvckVhY2giLCJleGlzdGluZ1VzZXJDb2xsZWN0aW9uIiwiZmluZCIsImNvbGxlY3Rpb24iLCJhbGxvd2VkRmllbGRzIiwidXNlcnNDb2xsZWN0aW9uIiwiZGVmYXVsdENvbHVtbnMiLCJ1c2VBc1RpdGxlIiwiYWNjZXNzIiwicmVxIiwiaW5jbHVkZXMiLCJ1c2VyIiwicm9sZSIsInJlYWQiLCJpZEZpZWxkIiwiY3JlYXRlIiwiZGVsZXRlIiwidXBkYXRlIiwiZW5kcG9pbnRzIiwiaG9va3MiLCJiZWZvcmVDaGFuZ2UiLCJhZnRlckNoYW5nZSIsImJlZm9yZUxvZ2luIiwiYWZ0ZXJMb2dpbiIsInNlc3Npb25zQ29sbGVjdGlvblNsdWciLCJ1c2Vyc0NvbGxlY3Rpb25TbHVnIiwiYWZ0ZXJMb2dvdXQiLCJhZnRlckRlbGV0ZSIsImFyZ3MiLCJhdXRoIiwic3RyYXRlZ2llcyIsImZpZWxkcyIsInBvc2l0aW9uIiwiY29tcG9uZW50cyIsIkZpZWxkIiwicGF0aCIsImNsaWVudFByb3BzIiwiY29uZGl0aW9uIiwic29tZSIsInBsdWdpbiIsImlkIiwiZGVzY3JpcHRpb24iLCJyZXF1aXJlZCIsInVuaXF1ZSIsImRlZmF1bHRWYWx1ZSIsIm9wdGlvbnMiLCJyb2xlcyIsInZhbHVlIiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInB1c2giLCJyZWFkT25seSIsImNvbGxlY3Rpb25PdmVycmlkZXMiLCJleGlzdGluZ0FjY291bnRDb2xsZWN0aW9uIiwiYWNjb3VudENvbGxlY3Rpb24iLCJyZWxhdGlvblRvIiwiZXhpc3RpbmdTZXNzaW9uQ29sbGVjdGlvbiIsInNlc3Npb25Db2xsZWN0aW9uIiwib3JnYW5pemF0aW9ucyIsImV4aXN0aW5nVmVyaWZpY2F0aW9uQ29sbGVjdGlvbiIsInZlcmlmaWNhdGlvbkNvbGxlY3Rpb24iLCJ0aW1lc3RhbXBzIiwib3JnYW5pemF0aW9uQ29sbGVjdGlvbiIsImhpZGVQbHVnaW5Db2xsZWN0aW9ucyIsIm1lbWJlcnMiLCJtZW1iZXJDb2xsZWN0aW9uIiwidGVhbXMiLCJpbnZpdGF0aW9ucyIsImludml0YXRpb25Db2xsZWN0aW9uIiwidGVhbUNvbGxlY3Rpb24iLCJqd2tzIiwiandrc0NvbGxlY3Rpb24iLCJhcGlLZXlzIiwiYXBpS2V5Q29sbGVjdGlvbiIsInR3b0ZhY3RvcnMiLCJ0d29GYWN0b3JDb2xsZWN0aW9uIiwib2F1dGhBY2Nlc3NUb2tlbnMiLCJvYXV0aEFjY2Vzc1Rva2VuQ29sbGVjdGlvbiIsIm9hdXRoQXBwbGljYXRpb25zIiwib2F1dGhBcHBsaWNhdGlvbkNvbGxlY3Rpb24iLCJvYXV0aENvbnNlbnRzIiwib2F1dGhDb25zZW50Q29sbGVjdGlvbiIsInBhc3NrZXlzIiwicGFzc2tleUNvbGxlY3Rpb24iLCJzc29Qcm92aWRlcnMiLCJzc29Qcm92aWRlckNvbGxlY3Rpb24iLCJyZXN0T2ZDb2xsZWN0aW9ucyIsImZpbHRlciIsImVuaGFuY2VkQ29sbGVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsbUJBQW1CLEVBQUVDLHFCQUFxQixRQUFRLFdBQVU7QUFDckUsU0FBU0Msa0JBQWtCLFFBQVEsa0JBQWlCO0FBQ3BELFNBQVNDLGtCQUFrQixRQUFRLDBDQUF5QztBQUM1RSxTQUFTQyx1QkFBdUIsUUFBUSwrQ0FBOEM7QUFDdEYsU0FDRUMsMkNBQTJDLEVBQzNDQyw2QkFBNkIsRUFDN0JDLGdCQUFnQixRQUNYLG1CQUFrQjtBQUN6QixTQUFTQyxzQkFB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