@envive-ai/react-hooks 0.2.6-alpha.13 → 0.2.7-arthur-1

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 (376) hide show
  1. package/dist/{NewOrgConfig-DJm6_abA.cjs → NewOrgConfig-Bo1seKr6.cjs} +2 -2
  2. package/dist/{NewOrgConfig-BfbTlFg1.js → NewOrgConfig-yptI2imS.js} +2 -2
  3. package/dist/{SystemSettingsContext-BbTKNBvJ.js → SystemSettingsContext-BY1BFgAQ.js} +2 -2
  4. package/dist/{SystemSettingsContext-6ZHzQkCE.cjs → SystemSettingsContext-EDpRMMt2.cjs} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-BJgNOypY.js → TrackComponentVisibleEvent-CXhKOwKQ.js} +3 -3
  6. package/dist/{TrackComponentVisibleEvent-BRC2FTp-.cjs → TrackComponentVisibleEvent-CgxCqrIt.cjs} +7 -7
  7. package/dist/amplitudeContext-C8tT74Mi.cjs +286 -0
  8. package/dist/{amplitudeContext-B73xamNe.d.cts → amplitudeContext-CCVyp5RU.d.cts} +1 -1
  9. package/dist/amplitudeContext-DCk6Va-j.js +264 -0
  10. package/dist/{amplitudeContext-CZUzMXHl.d.ts → amplitudeContext-DcRur97Z.d.ts} +1 -1
  11. package/dist/app-BbPSHefQ.cjs +156 -0
  12. package/dist/app-CflxT_xI.js +110 -0
  13. package/dist/application/models/graphql/index.cjs +3 -2
  14. package/dist/application/models/graphql/index.d.cts +2 -2
  15. package/dist/application/models/graphql/index.d.ts +2 -2
  16. package/dist/application/models/graphql/index.js +2 -2
  17. package/dist/application/models/guards/api/index.d.cts +2 -1
  18. package/dist/application/models/guards/api/index.d.ts +3 -2
  19. package/dist/application/models/guards/utils.d.cts +1 -1
  20. package/dist/application/models/guards/utils.d.ts +1 -1
  21. package/dist/application/models/index.cjs +3 -3
  22. package/dist/application/models/index.d.cts +11 -10
  23. package/dist/application/models/index.d.ts +12 -11
  24. package/dist/application/models/index.js +2 -2
  25. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  26. package/dist/application/models/variantInfo/index.d.cts +1 -1
  27. package/dist/application/models/variantInfo/index.d.ts +1 -1
  28. package/dist/application/utils/index.cjs +8 -6
  29. package/dist/application/utils/index.d.cts +14 -13
  30. package/dist/application/utils/index.d.ts +17 -16
  31. package/dist/application/utils/index.js +8 -6
  32. package/dist/{atomStore-DNji91Im.cjs → atomStore-CmZbgQHc.cjs} +1 -1
  33. package/dist/{atomStore-DXTVqiKc.js → atomStore-DEcDhiLp.js} +1 -1
  34. package/dist/atoms/app/index.cjs +9 -14
  35. package/dist/atoms/app/index.d.cts +19 -18
  36. package/dist/atoms/app/index.d.ts +20 -19
  37. package/dist/atoms/app/index.js +4 -9
  38. package/dist/atoms/atomStore/index.cjs +1 -1
  39. package/dist/atoms/atomStore/index.js +1 -1
  40. package/dist/atoms/chat/index.cjs +9 -8
  41. package/dist/atoms/chat/index.d.cts +39 -38
  42. package/dist/atoms/chat/index.d.ts +40 -39
  43. package/dist/atoms/chat/index.js +9 -8
  44. package/dist/atoms/globalSearch/index.cjs +1 -2
  45. package/dist/atoms/globalSearch/index.d.cts +5 -5
  46. package/dist/atoms/globalSearch/index.d.ts +6 -6
  47. package/dist/atoms/globalSearch/index.js +1 -2
  48. package/dist/atoms/org/index.cjs +8 -7
  49. package/dist/atoms/org/index.d.cts +30 -29
  50. package/dist/atoms/org/index.d.ts +31 -30
  51. package/dist/atoms/org/index.js +4 -3
  52. package/dist/atoms/search/index.cjs +16 -15
  53. package/dist/atoms/search/index.d.cts +13 -12
  54. package/dist/atoms/search/index.d.ts +14 -13
  55. package/dist/atoms/search/index.js +16 -15
  56. package/dist/atoms/search/types.cjs +1 -1
  57. package/dist/atoms/search/types.d.cts +4 -2
  58. package/dist/atoms/search/types.d.ts +4 -2
  59. package/dist/atoms/search/types.js +1 -1
  60. package/dist/atoms/search/utils.cjs +1 -1
  61. package/dist/atoms/search/utils.d.ts +1 -1
  62. package/dist/atoms/search/utils.js +1 -1
  63. package/dist/{cdnContext-DOSIofl8.cjs → cdnContext-CaDyQ_5p.cjs} +1 -1
  64. package/dist/{cdnContext-CEGBVVBU.js → cdnContext-CtrIlAqX.js} +1 -1
  65. package/dist/{chat-DH70QqJp.js → chat-BjhQCyW_.js} +8 -7
  66. package/dist/{chat-CqPuT9_V.cjs → chat-BkPax29G.cjs} +16 -9
  67. package/dist/{chatElementDisplayLocation-DWmfNX_u.d.cts → chatElementDisplayLocation-B7vr33eG.d.cts} +1 -1
  68. package/dist/{chatElementDisplayLocation-CpgV2wR1.d.ts → chatElementDisplayLocation-D4XF0UfI.d.ts} +1 -1
  69. package/dist/{chatSearch-C7Y-hb-6.js → chatSearch-BsYlFvpv.js} +7 -7
  70. package/dist/{chatSearch-DLV4BUGA.cjs → chatSearch-C3N3iIxu.cjs} +7 -7
  71. package/dist/{chatState-CcFtSqJT.cjs → chatState-CJ52Ag_7.cjs} +5 -5
  72. package/dist/{chatState-DKnNHmwe.js → chatState-CXA1vF16.js} +3 -3
  73. package/dist/commerce-api-DA1QGGMK.cjs +319 -0
  74. package/dist/commerce-api-rgj30eEp.js +312 -0
  75. package/dist/config/index.d.cts +4 -4
  76. package/dist/config/index.d.ts +4 -4
  77. package/dist/config/locators/components/chat/index.d.cts +1 -1
  78. package/dist/config/locators/components/chat/index.d.ts +1 -1
  79. package/dist/config/locators/components/common/index.d.cts +1 -1
  80. package/dist/config/locators/components/common/index.d.ts +1 -1
  81. package/dist/config/locators/components/index.d.cts +1 -1
  82. package/dist/config/locators/components/index.d.ts +1 -1
  83. package/dist/config/locators/index.d.cts +4 -4
  84. package/dist/config/locators/index.d.ts +4 -4
  85. package/dist/contexts/amplitudeContext/index.cjs +10 -9
  86. package/dist/contexts/amplitudeContext/index.d.cts +1 -1
  87. package/dist/contexts/amplitudeContext/index.d.ts +1 -1
  88. package/dist/contexts/amplitudeContext/index.js +7 -6
  89. package/dist/contexts/cdnContext/index.cjs +1 -1
  90. package/dist/contexts/cdnContext/index.js +1 -1
  91. package/dist/contexts/chatContext/index.cjs +32 -27
  92. package/dist/contexts/chatContext/index.d.cts +2 -2
  93. package/dist/contexts/chatContext/index.d.ts +4 -4
  94. package/dist/contexts/chatContext/index.js +22 -17
  95. package/dist/contexts/enviveConfigContext/index.d.cts +3 -3
  96. package/dist/contexts/enviveConfigContext/index.d.ts +3 -3
  97. package/dist/contexts/enviveCssContext/index.cjs +7 -7
  98. package/dist/contexts/enviveCssContext/index.js +7 -7
  99. package/dist/contexts/featureFlagContext/index.cjs +1 -1
  100. package/dist/contexts/featureFlagContext/index.d.cts +3 -3
  101. package/dist/contexts/featureFlagContext/index.d.ts +3 -3
  102. package/dist/contexts/featureFlagContext/index.js +1 -1
  103. package/dist/contexts/featureFlagServiceContext/index.d.cts +4 -4
  104. package/dist/contexts/featureFlagServiceContext/index.d.ts +4 -4
  105. package/dist/contexts/graphqlContext/index.cjs +3 -3
  106. package/dist/contexts/graphqlContext/index.d.cts +13 -12
  107. package/dist/contexts/graphqlContext/index.d.ts +14 -13
  108. package/dist/contexts/graphqlContext/index.js +3 -3
  109. package/dist/contexts/newOrgConfigContext/index.cjs +6 -6
  110. package/dist/contexts/newOrgConfigContext/index.d.cts +14 -13
  111. package/dist/contexts/newOrgConfigContext/index.d.ts +15 -14
  112. package/dist/contexts/newOrgConfigContext/index.js +6 -6
  113. package/dist/contexts/searchContext/index.cjs +10 -13
  114. package/dist/contexts/searchContext/index.d.cts +1 -1
  115. package/dist/contexts/searchContext/index.d.ts +2 -2
  116. package/dist/contexts/searchContext/index.js +10 -13
  117. package/dist/contexts/sessionStorageContext/index.cjs +1 -1
  118. package/dist/contexts/sessionStorageContext/index.js +1 -1
  119. package/dist/contexts/shopifyUrlContext/index.cjs +1 -1
  120. package/dist/contexts/shopifyUrlContext/index.d.cts +3 -3
  121. package/dist/contexts/shopifyUrlContext/index.d.ts +3 -3
  122. package/dist/contexts/shopifyUrlContext/index.js +1 -1
  123. package/dist/contexts/systemSettingsContext/index.cjs +1 -1
  124. package/dist/contexts/systemSettingsContext/index.d.cts +14 -13
  125. package/dist/contexts/systemSettingsContext/index.d.ts +15 -14
  126. package/dist/contexts/systemSettingsContext/index.js +1 -1
  127. package/dist/contexts/types.d.cts +3 -3
  128. package/dist/contexts/types.d.ts +3 -3
  129. package/dist/contexts/userIdentityContext/index.cjs +14 -8
  130. package/dist/contexts/userIdentityContext/index.d.cts +1 -1
  131. package/dist/contexts/userIdentityContext/index.d.ts +1 -1
  132. package/dist/contexts/userIdentityContext/index.js +12 -6
  133. package/dist/{domObserver-Bqf3ooj8.cjs → domObserver-COKvTfZV.cjs} +1 -1
  134. package/dist/{domObserver-v9ODTyfT.js → domObserver-DEiUh0qg.js} +1 -1
  135. package/dist/{featureFlagServiceContext-V0J-69ty.d.ts → featureFlagServiceContext-CpxlOkI9.d.ts} +2 -2
  136. package/dist/{featureFlagServiceContext-Be_LUbFf.d.cts → featureFlagServiceContext-p5UBwPM3.d.cts} +2 -2
  137. package/dist/frontendConfig-Cawh5iqv.d.ts +859 -0
  138. package/dist/frontendConfig-iZipB5FG.d.cts +859 -0
  139. package/dist/{globalSearch-FBk2epe8.cjs → globalSearch-BOG3wmck.cjs} +1 -1
  140. package/dist/{globalSearch-Ccxq8hNF.js → globalSearch-BQEX-2Ml.js} +1 -1
  141. package/dist/graphql-CkxgqsXP.js +48 -0
  142. package/dist/graphql-i3dtpVTl.cjs +71 -0
  143. package/dist/graphqlConfig-BnfE0ql5.cjs +39 -0
  144. package/dist/graphqlConfig-CZGjJ8hP.js +14 -0
  145. package/dist/{graphqlContext-D67VEQg3.d.cts → graphqlContext-BeyKU1Dr.d.cts} +2 -2
  146. package/dist/{graphqlContext-BQA6gnpH.d.ts → graphqlContext-CXQl0hq2.d.ts} +3 -3
  147. package/dist/{graphqlContext-W0cZNBf1.cjs → graphqlContext-DP8T3-Kd.cjs} +4 -4
  148. package/dist/{graphqlContext-Ci5GRAdH.js → graphqlContext-czH0kIZg.js} +3 -3
  149. package/dist/hooks/AmplitudeOperations/index.cjs +8 -8
  150. package/dist/hooks/AmplitudeOperations/index.d.cts +1 -1
  151. package/dist/hooks/AmplitudeOperations/index.d.ts +1 -1
  152. package/dist/hooks/AmplitudeOperations/index.js +8 -8
  153. package/dist/hooks/AppDetails/index.cjs +7 -12
  154. package/dist/hooks/AppDetails/index.d.cts +12 -11
  155. package/dist/hooks/AppDetails/index.d.ts +13 -12
  156. package/dist/hooks/AppDetails/index.js +7 -12
  157. package/dist/hooks/CdnOperations/index.cjs +1 -1
  158. package/dist/hooks/CdnOperations/index.js +1 -1
  159. package/dist/hooks/ChatToggle/index.cjs +13 -12
  160. package/dist/hooks/ChatToggle/index.d.cts +1 -1
  161. package/dist/hooks/ChatToggle/index.d.ts +1 -1
  162. package/dist/hooks/ChatToggle/index.js +10 -9
  163. package/dist/hooks/ChatToggleAnalytics/index.cjs +9 -9
  164. package/dist/hooks/ChatToggleAnalytics/index.d.cts +1 -1
  165. package/dist/hooks/ChatToggleAnalytics/index.d.ts +1 -1
  166. package/dist/hooks/ChatToggleAnalytics/index.js +9 -9
  167. package/dist/hooks/Debounce/index.cjs +20 -2
  168. package/dist/hooks/Debounce/index.js +18 -2
  169. package/dist/hooks/ElementObserver/index.cjs +1 -1
  170. package/dist/hooks/ElementObserver/index.d.cts +1 -1
  171. package/dist/hooks/ElementObserver/index.d.ts +1 -1
  172. package/dist/hooks/ElementObserver/index.js +1 -1
  173. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  174. package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
  175. package/dist/hooks/GraphQLConfig/index.cjs +4 -4
  176. package/dist/hooks/GraphQLConfig/index.d.cts +13 -12
  177. package/dist/hooks/GraphQLConfig/index.d.ts +14 -13
  178. package/dist/hooks/GraphQLConfig/index.js +4 -4
  179. package/dist/hooks/IdentifyUser/index.cjs +14 -8
  180. package/dist/hooks/IdentifyUser/index.js +13 -7
  181. package/dist/hooks/ImageResolver/index.cjs +2 -2
  182. package/dist/hooks/ImageResolver/index.js +2 -2
  183. package/dist/hooks/Intersection/index.cjs +1 -1
  184. package/dist/hooks/Intersection/index.js +1 -1
  185. package/dist/hooks/MessageFilter/index.cjs +2 -2
  186. package/dist/hooks/MessageFilter/index.d.cts +12 -11
  187. package/dist/hooks/MessageFilter/index.d.ts +13 -12
  188. package/dist/hooks/MessageFilter/index.js +2 -2
  189. package/dist/hooks/NewOrgConfig/index.cjs +7 -7
  190. package/dist/hooks/NewOrgConfig/index.d.cts +14 -13
  191. package/dist/hooks/NewOrgConfig/index.d.ts +15 -14
  192. package/dist/hooks/NewOrgConfig/index.js +7 -7
  193. package/dist/hooks/Search/index.cjs +1469 -159
  194. package/dist/hooks/Search/index.d.cts +21 -17
  195. package/dist/hooks/Search/index.d.ts +22 -18
  196. package/dist/hooks/Search/index.js +1464 -154
  197. package/dist/hooks/SearchOperations/index.cjs +11 -14
  198. package/dist/hooks/SearchOperations/index.d.cts +1 -1
  199. package/dist/hooks/SearchOperations/index.d.ts +2 -2
  200. package/dist/hooks/SearchOperations/index.js +11 -14
  201. package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
  202. package/dist/hooks/SessionStorageOperations/index.js +1 -1
  203. package/dist/hooks/ShopifyUrlOperations/index.cjs +1 -1
  204. package/dist/hooks/ShopifyUrlOperations/index.d.cts +5 -5
  205. package/dist/hooks/ShopifyUrlOperations/index.d.ts +5 -5
  206. package/dist/hooks/ShopifyUrlOperations/index.js +1 -1
  207. package/dist/hooks/SystemSettingsContext/index.cjs +2 -2
  208. package/dist/hooks/SystemSettingsContext/index.d.cts +14 -13
  209. package/dist/hooks/SystemSettingsContext/index.d.ts +15 -14
  210. package/dist/hooks/SystemSettingsContext/index.js +2 -2
  211. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +8 -8
  212. package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +2 -2
  213. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +2 -2
  214. package/dist/hooks/TrackComponentVisibleEvent/index.js +8 -8
  215. package/dist/hooks/UpdateAnalyticsProps/index.cjs +11 -11
  216. package/dist/hooks/UpdateAnalyticsProps/index.js +6 -6
  217. package/dist/hooks/utils.d.cts +12 -11
  218. package/dist/hooks/utils.d.ts +13 -12
  219. package/dist/{index-BeYfyZ6k.d.ts → index--9_c4tze.d.ts} +1 -1
  220. package/dist/index-BEpDGqnz.d.cts +41 -0
  221. package/dist/{index-xHVrsrbz.d.ts → index-BKvFVPUX.d.ts} +1 -1
  222. package/dist/{index-DJTrxIFJ.d.ts → index-BNHIIgYk.d.ts} +1 -1
  223. package/dist/{index-BeGt0Aw3.d.cts → index-BSd8767K.d.cts} +5 -5
  224. package/dist/index-BUDrAxnl.d.ts +673 -0
  225. package/dist/{index-DzbkQtaK.d.cts → index-CCboEuTO.d.cts} +1 -1
  226. package/dist/{index-FQjyuD3D.d.cts → index-COXkY78t.d.cts} +1 -1
  227. package/dist/{index-xhBQ1HBx.d.ts → index-CUO68KG3.d.ts} +34 -34
  228. package/dist/{index-DazMsEy_.d.ts → index-D7htGSQC.d.ts} +1 -1
  229. package/dist/index-DM_5fh8c.d.ts +101 -0
  230. package/dist/index-DU7uw0ba.d.cts +101 -0
  231. package/dist/{index-Da1s8h5C.d.cts → index-DZtnHhlr.d.cts} +1 -1
  232. package/dist/{index-h809JLbL.d.ts → index-Dtw-hJdt.d.ts} +1 -1
  233. package/dist/{index-Dfwnna1j.d.ts → index-Dxpscrvz.d.ts} +1 -1
  234. package/dist/index-Dy3TTIOm.d.cts +673 -0
  235. package/dist/index-ErVcwUnR.d.ts +41 -0
  236. package/dist/{index-Cyq5HiC0.d.cts → index-OkKEOL6H.d.cts} +1 -1
  237. package/dist/{index-9NE86em3.d.cts → index-hAqp0oYb.d.cts} +1 -1
  238. package/dist/interceptors/index.d.cts +13 -12
  239. package/dist/interceptors/index.d.ts +14 -13
  240. package/dist/interceptors/types.d.cts +12 -11
  241. package/dist/interceptors/types.d.ts +13 -12
  242. package/dist/models-CWOgrLCm.js +1284 -0
  243. package/dist/models-DqdLOi2I.cjs +1519 -0
  244. package/dist/{newOrgConfigAtom-DxILMn2I.cjs → newOrgConfigAtom-CPA6Gp6n.cjs} +1 -1
  245. package/dist/{newOrgConfigAtom-sqve6LZU.js → newOrgConfigAtom-DEUj6H-p.js} +1 -1
  246. package/dist/{newOrgConfigContext-Cl4H9c3q.cjs → newOrgConfigContext-Bet9CgKP.cjs} +3 -3
  247. package/dist/{newOrgConfigContext-DQiuf8nd.js → newOrgConfigContext-Bi_dBNe5.js} +3 -3
  248. package/dist/{newOrgConfigContext-5Bw7RwT-.d.cts → newOrgConfigContext-CJI3tsVV.d.cts} +2 -2
  249. package/dist/{newOrgConfigContext-CS8IA5Eg.d.ts → newOrgConfigContext-I2qceBB4.d.ts} +2 -2
  250. package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-B5NfnUHv.d.ts} +1 -1
  251. package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-vKB44CDB.d.cts} +1 -1
  252. package/dist/{org-DlAesvQ_.cjs → org-B_cWn2bt.cjs} +1 -1
  253. package/dist/{org-vi0njpBh.js → org-h32_LSEb.js} +1 -1
  254. package/dist/orgAnalyticsConfig-Bm23fw4s.cjs +39 -0
  255. package/dist/orgAnalyticsConfig-CpBmga08.js +14 -0
  256. package/dist/responseGenerics-D9bS-Dd6.d.ts +148 -0
  257. package/dist/{index-CCa4tZuO.d.ts → responseGenerics-DWLV09cQ.d.cts} +4 -40
  258. package/dist/{search-y-ioX5Mz.d.cts → search-6RrxBXD6.d.cts} +1 -1
  259. package/dist/{search-CXXslzAO.cjs → search-Csh2n66W.cjs} +5 -5
  260. package/dist/{search-DBSMrXWv.js → search-DkiqkogN.js} +5 -5
  261. package/dist/{search-1NQLQD9d.d.ts → search-DrJiCT7d.d.ts} +2 -2
  262. package/dist/{search-filter-types-BxaNSLs_.d.cts → search-filter-types-BItKtezf.d.cts} +1 -1
  263. package/dist/{search-filter-types-DPgeG8FS.d.ts → search-filter-types-CGFhksO3.d.ts} +1 -1
  264. package/dist/{searchContext-mvwUJncR.js → searchContext-BmgoAFMF.js} +4 -4
  265. package/dist/{searchContext-DXW6xvXv.cjs → searchContext-DksJfC1s.cjs} +6 -6
  266. package/dist/{searchServiceAdapter-DEv1tTn0.cjs → searchServiceAdapter-BGlvoZFE.cjs} +1 -1
  267. package/dist/{searchServiceAdapter-WyCU55NV.js → searchServiceAdapter-Db6jEcJs.js} +1 -1
  268. package/dist/{sessionStorageContext-1Ks_d4Z0.cjs → sessionStorageContext-B6FsNKjj.cjs} +1 -1
  269. package/dist/{sessionStorageContext-CDcl7NVl.js → sessionStorageContext-CLYCm83p.js} +1 -1
  270. package/dist/{shopifyUrlContext-CejRZfj7.js → shopifyUrlContext-C-PkSgNC.js} +1 -1
  271. package/dist/{shopifyUrlContext-lnHoAOEf.cjs → shopifyUrlContext-ZOcARiMR.cjs} +1 -1
  272. package/dist/{spiffyWidgets-B1uc84_g.d.ts → spiffyWidgets-CR6F7FRE.d.ts} +1 -1
  273. package/dist/{spiffyWidgets-BuS00VaQ.d.cts → spiffyWidgets-eNbU1gMc.d.cts} +1 -1
  274. package/dist/{systemSettingsContext-CVUxEcsU.js → systemSettingsContext-DF0jSq9m.js} +1 -1
  275. package/dist/{systemSettingsContext-B0Kyq7nA.cjs → systemSettingsContext-dmE1v6w8.cjs} +1 -1
  276. package/dist/{test-types-y6kp-tiw.d.ts → test-types-BEml_bm3.d.ts} +1 -1
  277. package/dist/{test-types-ThQiO_cc.d.cts → test-types-Dsu8RJZu.d.cts} +1 -1
  278. package/dist/types/index.cjs +1 -16
  279. package/dist/types/index.d.cts +3 -17
  280. package/dist/types/index.d.ts +3 -17
  281. package/dist/types/index.js +2 -16
  282. package/dist/{types-Db5Eux6K.d.ts → types-4LQ7LUCk.d.ts} +2 -2
  283. package/dist/types-BegmH0S1.d.ts +60 -0
  284. package/dist/types-BuvXXGxE.cjs +48 -0
  285. package/dist/types-CtUb63bt.js +1 -1
  286. package/dist/{types-zQGBI-Yo.d.cts → types-DFsSqmWx.d.cts} +2 -2
  287. package/dist/types-DWorwfS-.d.cts +60 -0
  288. package/dist/types-DXnG1tV0.js +30 -0
  289. package/dist/types-UUvB6h05.cjs +1 -1
  290. package/dist/types.d.cts +4 -23
  291. package/dist/types.d.ts +4 -23
  292. package/dist/unsupportedProductExceptions-DGENUnEA.cjs +32 -0
  293. package/dist/unsupportedProductExceptions-uQuuelOs.js +20 -0
  294. package/dist/{useAmplitudeOperations-jqa7K9dH.cjs → useAmplitudeOperations-Bo6YNbTV.cjs} +3 -3
  295. package/dist/{useAmplitudeOperations-DYs1h8a_.js → useAmplitudeOperations-zIRSqmMW.js} +2 -2
  296. package/dist/{useAppDetails-BRUqZEyt.js → useAppDetails-B584gkCs.js} +3 -3
  297. package/dist/{useAppDetails-C71k0brz.cjs → useAppDetails-DczgqeLG.cjs} +6 -6
  298. package/dist/{useGraphQLConfig-5VwS9Q_Z.js → useGraphQLConfig-7UxACM4n.js} +2 -2
  299. package/dist/{useGraphQLConfig-Cj26_J9I.cjs → useGraphQLConfig-D_rF2Sun.cjs} +2 -2
  300. package/dist/{useIntersection-Cncgxdmy.js → useIntersection-CZSEBUbv.js} +1 -1
  301. package/dist/{useIntersection-m4PEpvG7.cjs → useIntersection-DSDREfj6.cjs} +1 -1
  302. package/dist/userIdentityContext-BqbNu7xu.cjs +132 -0
  303. package/dist/userIdentityContext-BxFH9FNQ.js +115 -0
  304. package/dist/{userIdentityContext-BVODeTlN.d.ts → userIdentityContext-C6kApbuk.d.ts} +1 -1
  305. package/dist/{userIdentityContext-D2oFVFzo.d.cts → userIdentityContext-kU1PIo8K.d.cts} +1 -1
  306. package/dist/{utils-DpneNSJf.d.ts → utils-BRkGP1eb.d.ts} +1 -1
  307. package/dist/utils-C1ErYSoW.js +606 -0
  308. package/dist/{utils-BxPPugeP.d.cts → utils-CBD4g2Nc.d.cts} +4 -4
  309. package/dist/{utils-2SWrJ12w.cjs → utils-CvLmSsUj.cjs} +1 -1
  310. package/dist/{utils-CqBxIpEV.js → utils-D82gfbgU.js} +1 -1
  311. package/dist/{utils-B3x_9JTY.d.cts → utils-DCrwX6FT.d.cts} +1 -1
  312. package/dist/{utils-Covisryh.d.ts → utils-QKFAbPT6.d.ts} +4 -4
  313. package/dist/utils-mqfncrhI.cjs +715 -0
  314. package/package.json +18 -13
  315. package/src/application/commerce-api.ts +2 -0
  316. package/src/application/models/graphql/index.ts +1 -0
  317. package/src/application/utils/__tests__/divideArrays.test.ts +12 -13
  318. package/src/atoms/app/index.ts +1 -2
  319. package/src/atoms/search/productRetrievalAPI.ts +70 -0
  320. package/src/atoms/search/productRetrievalAdapter.ts +25 -0
  321. package/src/atoms/search/types.ts +13 -0
  322. package/src/contexts/enviveConfigContext/__tests__/enviveConfigContext.test.tsx +411 -0
  323. package/src/contexts/graphqlContext/__tests__/graphqlContext.test.tsx +790 -0
  324. package/src/contexts/localStorageContext/__tests__/localStorageContext.test.tsx +775 -0
  325. package/src/contexts/newOrgConfigContext/__tests__/newOrgConfigContext.test.tsx +495 -0
  326. package/src/contexts/searchContext/__tests__/searchContext.test.tsx +806 -0
  327. package/src/contexts/systemSettingsContext/__tests__/systemSettingsContext.test.tsx +506 -0
  328. package/src/contexts/types.ts +16 -14
  329. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +663 -0
  330. package/src/contexts/userIdentityContext/userIdentityContext.tsx +6 -0
  331. package/src/hooks/Search/useRecommendedProducts.ts +48 -0
  332. package/src/hooks/Search/useSearch.tsx +89 -182
  333. package/src/hooks/Search/useSearchInput.ts +263 -0
  334. package/src/types/FilterAttribute.ts +35 -0
  335. package/src/types/index.ts +0 -1
  336. package/src/types.ts +0 -16
  337. package/dist/frontendConfig-CeWhVevA.d.ts +0 -857
  338. package/dist/frontendConfig-OWWJmuPc.d.cts +0 -857
  339. package/dist/graphql-3PxNRFOc.js +0 -36
  340. package/dist/graphql-DGYfelZp.cjs +0 -53
  341. package/dist/graphqlConfig-GHZ1UgCw.cjs +0 -73
  342. package/dist/graphqlConfig-mDg6J44N.js +0 -24
  343. package/dist/hooks/FloatingButtonVisibility/index.cjs +0 -73
  344. package/dist/hooks/FloatingButtonVisibility/index.d.cts +0 -7
  345. package/dist/hooks/FloatingButtonVisibility/index.d.ts +0 -7
  346. package/dist/hooks/FloatingButtonVisibility/index.js +0 -69
  347. package/dist/hooks/LastInteraction/index.cjs +0 -34
  348. package/dist/hooks/LastInteraction/index.d.cts +0 -17
  349. package/dist/hooks/LastInteraction/index.d.ts +0 -17
  350. package/dist/hooks/LastInteraction/index.js +0 -32
  351. package/dist/index-Bmub8e38.d.cts +0 -98
  352. package/dist/index-CiWEYzXl.d.cts +0 -184
  353. package/dist/index-D4c-port.d.ts +0 -676
  354. package/dist/index-O33GSSRr.d.cts +0 -676
  355. package/dist/index-bjMvkcBF.d.ts +0 -98
  356. package/dist/models-D-4db7XW.cjs +0 -1537
  357. package/dist/models-c86hYW-F.js +0 -1296
  358. package/dist/types-BCz-hOvv.d.ts +0 -51
  359. package/dist/types-CKMMb_gX.d.cts +0 -51
  360. package/dist/types-CS0Hrzja.js +0 -30
  361. package/dist/types-CxObxLKs.cjs +0 -48
  362. package/dist/useDebounce-DZ8Cgiwc.cjs +0 -26
  363. package/dist/useDebounce-v9cezyjn.js +0 -19
  364. package/dist/utils-CLGXsOwE.cjs +0 -1591
  365. package/dist/utils-jYtD3hmA.js +0 -1385
  366. package/src/hooks/FloatingButtonVisibility/index.ts +0 -1
  367. package/src/hooks/FloatingButtonVisibility/useFloatingButtonVisibility.ts +0 -99
  368. package/src/hooks/LastInteraction/index.ts +0 -1
  369. package/src/hooks/LastInteraction/useLastInteraction.ts +0 -42
  370. package/src/types/floatingbuttonoverrides-types.ts +0 -10
  371. /package/dist/{AmplitudeOperations-ni7wVevx.js → AmplitudeOperations-ChZWcSsc.js} +0 -0
  372. /package/dist/{AmplitudeOperations-DxQnurSG.cjs → AmplitudeOperations-JggIc1zD.cjs} +0 -0
  373. /package/dist/{globalSearch-BpGfkuXz.js → amplitudeContext-BItT9HmT.js} +0 -0
  374. /package/dist/{globalSearch-B9DRBxSM.cjs → amplitudeContext-DPtyVv3Q.cjs} +0 -0
  375. /package/dist/{index-CgAfoNpB.d.ts → index-A0HvA68Y.d.cts} +0 -0
  376. /package/dist/{index-RcVcRKH7.d.cts → index-DNVvRcKu.d.ts} +0 -0
@@ -0,0 +1,1284 @@
1
+ import { PageVariantTestType } from "./types-CtUb63bt.js";
2
+ import { hasPropertyOfType } from "./utils-DIvMgPe8.js";
3
+ import { isApiPDPAttributes, isApiProductResponseAttributes, isApiProductSearchResponseAttributes, isApiQueryTypedAttributes, isApiResponse, isApiReviewResponseAttributes, isApiSearchAttributes, isApiSuggestionClickedAttributes, isApiTextResponseAttributes, isApiUserEvent, isSuggestion } from "./api-BWSsazAG.js";
4
+ import { logger_default } from "./logger-W3lqg-4b.js";
5
+ import { FormType, FulfillmentDisplayStatus, OrganizationStatusEnum, PLPAttributeCategory, PageVisitCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
6
+
7
+ //#region src/application/models/chatElementDisplayLocation.ts
8
+ let ChatElementDisplayLocation = /* @__PURE__ */ function(ChatElementDisplayLocation$1) {
9
+ ChatElementDisplayLocation$1["IN_CHAT"] = "in_chat";
10
+ ChatElementDisplayLocation$1["CHAT_PREVIEW"] = "chat_preview";
11
+ ChatElementDisplayLocation$1["FLOATING_BUTTON"] = "floating_button";
12
+ ChatElementDisplayLocation$1["HELP_ME_CHOOSE"] = "help_me_choose";
13
+ ChatElementDisplayLocation$1["PLP_IMAGE_BANNER"] = "plp_image_banner";
14
+ ChatElementDisplayLocation$1["TOP_REVIEWS_SNIPPET"] = "top_reviews_snippet";
15
+ ChatElementDisplayLocation$1["BOTTOM_REVIEWS_SNIPPET"] = "bottom_reviews_snippet";
16
+ ChatElementDisplayLocation$1["BLOCK_BACK_BUTTON"] = "block_back_button";
17
+ ChatElementDisplayLocation$1["SWITCH_TO_AGENT"] = "switch_to_agent";
18
+ ChatElementDisplayLocation$1["CONVERSATIONAL_SEARCH"] = "conversational_search";
19
+ ChatElementDisplayLocation$1["GLOBAL_SEARCH_ENTRYPOINT"] = "global_search_entrypoint";
20
+ ChatElementDisplayLocation$1["SEARCH_NAV_ENTRYPOINT"] = "search_nav_entrypoint";
21
+ ChatElementDisplayLocation$1["SEARCH_PROMPT"] = "search_prompt";
22
+ ChatElementDisplayLocation$1["SEARCH_PROMPT_BUTTON"] = "search_prompt_button";
23
+ ChatElementDisplayLocation$1["PRODUCT_GRID"] = "product_grid";
24
+ ChatElementDisplayLocation$1["UNSPECIFIED"] = "unspecified";
25
+ ChatElementDisplayLocation$1["FILTER_MODAL"] = "filter_modal";
26
+ ChatElementDisplayLocation$1["PROMPT_CARD"] = "prompt_card";
27
+ ChatElementDisplayLocation$1["WINDOW_API_CALL"] = "window_api_call";
28
+ return ChatElementDisplayLocation$1;
29
+ }({});
30
+
31
+ //#endregion
32
+ //#region src/application/models/events.ts
33
+ let SpiffyEventName = /* @__PURE__ */ function(SpiffyEventName$1) {
34
+ SpiffyEventName$1["WidgetOpen"] = "spiffy:widgetopen";
35
+ SpiffyEventName$1["WidgetClose"] = "spiffy:widgetclose";
36
+ return SpiffyEventName$1;
37
+ }({});
38
+
39
+ //#endregion
40
+ //#region src/application/models/googleAnalyticsEvents.ts
41
+ var GoogleAnalyticsEvents = /* @__PURE__ */ function(GoogleAnalyticsEvents$1) {
42
+ GoogleAnalyticsEvents$1["ADD_TO_CART_v1"] = "add_to_cart";
43
+ GoogleAnalyticsEvents$1["ADD_TO_CART_v2"] = "addToCart";
44
+ return GoogleAnalyticsEvents$1;
45
+ }(GoogleAnalyticsEvents || {});
46
+
47
+ //#endregion
48
+ //#region src/application/models/message.ts
49
+ let MessageRole = /* @__PURE__ */ function(MessageRole$1) {
50
+ MessageRole$1["User"] = "user";
51
+ MessageRole$1["Assistant"] = "assistant";
52
+ return MessageRole$1;
53
+ }({});
54
+ let MessageType = /* @__PURE__ */ function(MessageType$1) {
55
+ MessageType$1["Text"] = "text";
56
+ MessageType$1["SuggestionClicked"] = "suggestion_clicked";
57
+ MessageType$1["Product"] = "product";
58
+ MessageType$1["ProductSearch"] = "product_search";
59
+ MessageType$1["Review"] = "review";
60
+ MessageType$1["QueryTyped"] = "query_typed";
61
+ MessageType$1["Separator"] = "separator";
62
+ MessageType$1["Page"] = "page";
63
+ MessageType$1["Search"] = "search";
64
+ MessageType$1["Attachment"] = "attachment";
65
+ MessageType$1["CXAgentResponse"] = "cx_agent_response";
66
+ MessageType$1["Form"] = "form";
67
+ MessageType$1["Order"] = "order";
68
+ MessageType$1["ProductSearchFilter"] = "product_search_filter";
69
+ return MessageType$1;
70
+ }({});
71
+
72
+ //#endregion
73
+ //#region src/application/models/orgsEnum.ts
74
+ const OrgShortName = {
75
+ Coterie: "coterie",
76
+ ForLoveAndLemons: "for-love-and-lemons",
77
+ Greenpan: "greenpan",
78
+ JordanCraig: "jordan-craig",
79
+ LarryAndSerges: "larry_and_serges",
80
+ LeapsAndRebounds: "leaps-and-rebounds",
81
+ MantraBrand: "mantra-brand",
82
+ Spanx: "spanx",
83
+ SpanxStaging: "staging-spanx",
84
+ Supergoop: "supergoop",
85
+ UniqueVintage: "unique-vintage",
86
+ JackArcher: "jack-archer",
87
+ SkinPerfection: "skin-perfection",
88
+ LookOptic: "look-optic",
89
+ FiveCbd: "five-cbd",
90
+ SnapSupplements: "snap-supplements",
91
+ Longevityrx: "longevityrx",
92
+ VenaCbd: "vena-cbd",
93
+ Medterra: "medterra",
94
+ Modells: "modells",
95
+ PressedFloral: "pressed-floral",
96
+ KindredBravely: "kindred-bravely",
97
+ WineEnthusiast: "wine-enthusiast",
98
+ HomegrownCannabis: "homegrown-cannabis",
99
+ DreamlandBaby: "dreamland-baby",
100
+ Bandolier: "bandolier",
101
+ WestonJonBoucher: "weston-jon-boucher",
102
+ KutFromTheKloth: "kut-from-the-kloth",
103
+ GrooveLife: "groove-life",
104
+ Carpe: "carpe",
105
+ WolfTactical: "wolf-tactical",
106
+ WolfMattress: "wolfmattress",
107
+ Default: "default"
108
+ };
109
+
110
+ //#endregion
111
+ //#region src/application/models/productExperiment.ts
112
+ let ProductExperiment = /* @__PURE__ */ function(ProductExperiment$1) {
113
+ ProductExperiment$1["Default"] = "default";
114
+ return ProductExperiment$1;
115
+ }({});
116
+
117
+ //#endregion
118
+ //#region src/application/models/spiffyWidgets.ts
119
+ /**
120
+ * Enum of all widget names. These are widgets that are rendered and integrated into
121
+ * a merchant's website.
122
+ */
123
+ let SpiffyWidgets = /* @__PURE__ */ function(SpiffyWidgets$1) {
124
+ SpiffyWidgets$1["ImageBanner"] = "image_banner";
125
+ SpiffyWidgets$1["ImagePromptCard"] = "image_prompt_card";
126
+ SpiffyWidgets$1["SingleImagePrompt"] = "single_image_prompt";
127
+ SpiffyWidgets$1["EmbeddedWidget"] = "embedded_widget";
128
+ SpiffyWidgets$1["FloatingButton"] = "floating_button";
129
+ SpiffyWidgets$1["SuggestionBar"] = "suggestion_bar";
130
+ SpiffyWidgets$1["SearchPrompt"] = "search_prompt";
131
+ SpiffyWidgets$1["GlobalSearch"] = "global_search";
132
+ SpiffyWidgets$1["SearchResults"] = "search_results";
133
+ SpiffyWidgets$1["GlobalSearchEntryPoint"] = "global_search_entry_point";
134
+ return SpiffyWidgets$1;
135
+ }({});
136
+
137
+ //#endregion
138
+ //#region src/application/models/guards/isBaseEcommerceEvent.ts
139
+ /**
140
+ * Checks if an event is a base Google Analytics ecommerce event.
141
+ *
142
+ * @param data The event to check.
143
+ *
144
+ * @returns True if the event is a base ecommerce event, false otherwise.
145
+ */
146
+ const isBaseEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "event" in data && typeof data.event === "string";
147
+
148
+ //#endregion
149
+ //#region src/application/models/guards/isGA4EcommerceEvent.ts
150
+ /**
151
+ * Checks if an event is a Google Analytics 4 ecommerce event.
152
+ *
153
+ * @param data The event to check.
154
+ *
155
+ * @returns True if the event is a GA4 ecommerce event, false otherwise.
156
+ */
157
+ const isGA4EcommerceEvent = (data) => typeof data === "object" && data != null && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "items" in data.ecommerce && Array.isArray(data.ecommerce.items);
158
+
159
+ //#endregion
160
+ //#region src/application/models/guards/isLegacyUAEcommerceEvent.ts
161
+ /**
162
+ * Checks if an event is a legacy Universal Analytics ecommerce event.
163
+ *
164
+ * @param data The event to check.
165
+ *
166
+ * @returns True if the event is a legacy UA ecommerce event, false otherwise.
167
+ */
168
+ const isLegacyUAEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "add" in data.ecommerce && typeof data.ecommerce.add === "object";
169
+
170
+ //#endregion
171
+ //#region src/application/models/guards/isMobilePLPChatPlacementParameter.ts
172
+ const isMobilePLPChatPlacementParameter = (value) => value != null && typeof value === "object" && "row_index" in value && typeof value.row_index === "number";
173
+
174
+ //#endregion
175
+ //#region src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts
176
+ const isSpanxTakeAQuizCtaParameter = (value) => value != null && typeof value === "object" && "text" in value && typeof value.text === "string";
177
+
178
+ //#endregion
179
+ //#region src/application/models/guards/isVariantInfo.ts
180
+ const isPDPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "pdp" && "productId" in variantInfo && typeof variantInfo.productId === "string";
181
+ const isPLPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "plp" && "plpId" in variantInfo && typeof variantInfo.plpId === "string";
182
+ const isPageVisitVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "page_visit" && "url" in variantInfo && typeof variantInfo.url === "string" && "pageVisitCategory" in variantInfo && Object.values(PageVisitCategory).includes(variantInfo.pageVisitCategory);
183
+ /**
184
+ * Type guard to check if an object is a valid VariantInfo.
185
+ *
186
+ * @param variantInfo - The unknown object to check.
187
+ *
188
+ * @returns True if the data is a valid VariantInfo object, false otherwise.
189
+ */
190
+ const isVariantInfo = (variantInfo) => variantInfo != null && typeof variantInfo === "object" && "variantId" in variantInfo && (isPDPVariantInfo(variantInfo) || isPLPVariantInfo(variantInfo) || isPageVisitVariantInfo(variantInfo));
191
+
192
+ //#endregion
193
+ //#region src/application/models/guards/api/isApiFormResponse.ts
194
+ /**
195
+ * Type guard to check if the provided data has the all of the properties (with the correct types) of
196
+ * a FormResponseAttribute
197
+ *
198
+ * @param data - The data to check
199
+ *
200
+ * @returns true if the data has the correct properties, false otherwise
201
+ */
202
+ const isApiFormResponseAttributes = (data) => {
203
+ if (data == null || typeof data !== "object") {
204
+ logger_default.logError("isApiFormResponseAttributes: data is null or not an object", void 0, { data });
205
+ return false;
206
+ }
207
+ if ("form_category" in data && typeof data.form_category !== "object") {
208
+ logger_default.logError("isApiFormResponseAttributes: form_category is not an object", void 0, { data });
209
+ return false;
210
+ }
211
+ if ("form_category" in data && typeof data.form_category === "object") {
212
+ if (!hasPropertyOfType(data.form_category, "form_type", "string") || !Object.values(FormType).includes(data.form_category.form_type)) {
213
+ logger_default.logError("isApiFormResponseAttributes: form_type is missing or not a valid form type", void 0, { data });
214
+ return false;
215
+ }
216
+ }
217
+ if (!hasPropertyOfType(data, "schema", "object")) {
218
+ logger_default.logError("isApiFormResponseAttributes: schema is missing or not an object", void 0, { data });
219
+ return false;
220
+ }
221
+ if (!hasPropertyOfType(data.schema, "properties", "object")) {
222
+ logger_default.logError("isApiFormResponseAttributes: schema.properties is missing or not an object", void 0, { data });
223
+ return false;
224
+ }
225
+ if (!hasPropertyOfType(data.schema, "required", "array")) {
226
+ logger_default.logError("isApiFormResponseAttributes: schema.required is missing or not an array", void 0, { data });
227
+ return false;
228
+ }
229
+ if (!data.schema.required.every((key) => typeof key === "string" && key in data.schema.properties)) {
230
+ logger_default.logError("isApiFormResponseAttributes: schema.required contains invalid property keys", void 0, { data });
231
+ return false;
232
+ }
233
+ return true;
234
+ };
235
+
236
+ //#endregion
237
+ //#region src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts
238
+ const isApiFormSubmittedResponseAttributes = (data) => {
239
+ if (data == null || typeof data !== "object") {
240
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "data is null or not an object", data);
241
+ return false;
242
+ }
243
+ if (!hasPropertyOfType(data, "filled_schema", "object")) {
244
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "filled_schema is not an object", data);
245
+ return false;
246
+ }
247
+ if (!hasPropertyOfType(data, "form_response_id", "string")) {
248
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "form_response_id is not a string", data);
249
+ return false;
250
+ }
251
+ if (!("form_type" in data) || !Object.values(FormType).includes(data.form_type)) {
252
+ logger_default.logError("isApiFormSubmittedResponseAttributes", "form_type is not a valid form type enum", data);
253
+ return false;
254
+ }
255
+ return true;
256
+ };
257
+
258
+ //#endregion
259
+ //#region src/application/models/guards/api/isApiOrderResponseAttributes.ts
260
+ const isApiOrderItemInfo = (data) => {
261
+ if (data == null || typeof data !== "object") {
262
+ logger_default.logError("OrderItemInfo must be an object", void 0, { data });
263
+ return false;
264
+ }
265
+ if (!hasPropertyOfType(data, "order_item_id", "string")) {
266
+ logger_default.logError("OrderItemInfo must have an order_item_id property", void 0, { data });
267
+ return false;
268
+ }
269
+ if (!hasPropertyOfType(data, "item_title", "string")) {
270
+ logger_default.logError("OrderItemInfo must have an item_title property", void 0, { data });
271
+ return false;
272
+ }
273
+ if (!hasPropertyOfType(data, "item_price", "number")) {
274
+ logger_default.logError("OrderItemInfo must have an item_price property", void 0, { data });
275
+ return false;
276
+ }
277
+ if (!hasPropertyOfType(data, "item_quantity", "number")) {
278
+ logger_default.logError("OrderItemInfo must have an item_quantity property", void 0, { data });
279
+ return false;
280
+ }
281
+ if (!hasPropertyOfType(data, "image", "string", true)) {
282
+ logger_default.logError("OrderItemInfo.image must be a string or null", void 0, { data });
283
+ return false;
284
+ }
285
+ if (!hasPropertyOfType(data, "fulfillment_display_status", "string", true)) {
286
+ logger_default.logError("OrderItemInfo.fulfillment_display_status must be a string or null", void 0, { data });
287
+ return false;
288
+ }
289
+ if (!hasPropertyOfType(data, "tracking_url", "string", true)) {
290
+ logger_default.logError("OrderItemInfo.tracking_url must be a string or null", void 0, { data });
291
+ return false;
292
+ }
293
+ if (!hasPropertyOfType(data, "delivered_at", "string", true)) {
294
+ logger_default.logError("OrderItemInfo.delivered_at must be a string or null", void 0, { data });
295
+ return false;
296
+ }
297
+ if (!hasPropertyOfType(data, "estimated_delivery_at", "string", true)) {
298
+ logger_default.logError("OrderItemInfo.estimated_delivery_at must be a string or null", void 0, { data });
299
+ return false;
300
+ }
301
+ if (!hasPropertyOfType(data, "in_transit_at", "string", true)) {
302
+ logger_default.logError("OrderItemInfo.in_transit_at must be a string or null", void 0, { data });
303
+ return false;
304
+ }
305
+ return true;
306
+ };
307
+ const isApiOrderResponseAttributes = (data) => {
308
+ if (data == null || typeof data !== "object") {
309
+ logger_default.logError("Order response attributes must be an object", void 0, { data });
310
+ return false;
311
+ }
312
+ if (!hasPropertyOfType(data, "created_at", "string")) {
313
+ logger_default.logError("Order response attributes must have a created_at property and have type string", void 0, { data });
314
+ return false;
315
+ }
316
+ if (!hasPropertyOfType(data, "latest_event_date", "string")) {
317
+ logger_default.logError("Order response attributes must have a latest_event_date property and have type string", void 0, { data });
318
+ return false;
319
+ }
320
+ if (!hasPropertyOfType(data, "line_items", "array") || !data.line_items.every((item) => isApiOrderItemInfo(item))) {
321
+ logger_default.logError("Order response attributes must have a line_items property with at least one order item", void 0, { data });
322
+ return false;
323
+ }
324
+ if (!hasPropertyOfType(data, "order_id", "string")) {
325
+ logger_default.logError("Order response attributes must have an order_id property and have type string", void 0, { data });
326
+ return false;
327
+ }
328
+ if (!hasPropertyOfType(data, "order_number", "string")) {
329
+ logger_default.logError("Order response attributes must have an order_number property and have type string", void 0, { data });
330
+ return false;
331
+ }
332
+ return true;
333
+ };
334
+
335
+ //#endregion
336
+ //#region src/application/models/guards/api/isApiOrganizationConfig.ts
337
+ const isApiOrgAnalyticsConfigAmplitude = (data) => {
338
+ if (data == null || typeof data !== "object") {
339
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: data is not an object", data);
340
+ return false;
341
+ }
342
+ if (!("session_replay_enabled" in data) || typeof data.session_replay_enabled !== "boolean") {
343
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_enabled is not a boolean", data);
344
+ return false;
345
+ }
346
+ if (!("session_replay_sample_rate" in data) || typeof data.session_replay_sample_rate !== "number") {
347
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_sample_rate is not a number", data);
348
+ return false;
349
+ }
350
+ if (!("tracking_enabled" in data) || typeof data.tracking_enabled !== "boolean") {
351
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: tracking_enabled is not a boolean", data);
352
+ return false;
353
+ }
354
+ return true;
355
+ };
356
+ const isApiOrgAnalyticsConfigCustomerService = (data) => {
357
+ if (data == null || typeof data !== "object") {
358
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: data is not an object", data);
359
+ return false;
360
+ }
361
+ if (!("provider" in data) || typeof data.provider !== "string") {
362
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: provider is not a string", data);
363
+ return false;
364
+ }
365
+ return true;
366
+ };
367
+ const isApiOrgAnalyticsConfigGoogleAnalytics = (data) => {
368
+ if (data == null || typeof data !== "object") {
369
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: data is not an object", data);
370
+ return false;
371
+ }
372
+ if (!("measurement_id" in data) || typeof data.measurement_id !== "string") {
373
+ logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: measurement_id is not a string", data);
374
+ return false;
375
+ }
376
+ return true;
377
+ };
378
+ /**
379
+ *
380
+ * @param data
381
+ * @returns
382
+ */
383
+ const isApiOrgAnalyticsConfig = (data) => {
384
+ if (data == null || typeof data !== "object") {
385
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: data is not an object", data);
386
+ return false;
387
+ }
388
+ if ("amplitude" in data && !isApiOrgAnalyticsConfigAmplitude(data.amplitude)) {
389
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: amplitude is not an object", data);
390
+ return false;
391
+ }
392
+ if ("customer_service" in data && !isApiOrgAnalyticsConfigCustomerService(data.customer_service)) {
393
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: customer_service is not an object", data);
394
+ return false;
395
+ }
396
+ if ("google_analytics" in data && !isApiOrgAnalyticsConfigGoogleAnalytics(data.google_analytics)) {
397
+ logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: google_analytics is not an object", data);
398
+ return false;
399
+ }
400
+ return true;
401
+ };
402
+ /**
403
+ *
404
+ * @param data
405
+ * @returns
406
+ */
407
+ const isApiOrganizationConfig = (data) => {
408
+ if (data == null || typeof data !== "object") {
409
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: data is not an object", data);
410
+ return false;
411
+ }
412
+ if (!("created_at" in data)) {
413
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: created_at is not defined", data);
414
+ return false;
415
+ }
416
+ if (!("namespace" in data) || typeof data.namespace !== "string") {
417
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: namespace is not a string", data);
418
+ return false;
419
+ }
420
+ if (!("is_latest" in data) || typeof data.is_latest !== "boolean") {
421
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: is_latest is not a boolean", data);
422
+ return false;
423
+ }
424
+ if (!("version" in data) || typeof data.version !== "string") {
425
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: version is not a string", data);
426
+ return false;
427
+ }
428
+ if (!("updated_at" in data)) {
429
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: updated_at is not defined", data);
430
+ return false;
431
+ }
432
+ if (!("config" in data) || typeof data.config !== "object" || !isApiOrgAnalyticsConfig(data.config)) {
433
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: config is not an object", data);
434
+ return false;
435
+ }
436
+ if ("organization_id" in data && typeof data.organization_id !== "string") {
437
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: organization_id is not a string", data);
438
+ return false;
439
+ }
440
+ if ("id" in data && typeof data.id !== "string") {
441
+ logger_default.logDebug("[spiffy-ai] isOrgConfig: id is not a string", data);
442
+ return false;
443
+ }
444
+ return true;
445
+ };
446
+
447
+ //#endregion
448
+ //#region src/application/models/guards/api/isApiOrgConfigResults.ts
449
+ const isApiOrgConfigExperiment = (data) => {
450
+ if (data == null || typeof data !== "object") {
451
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: data is not an object", void 0, { data });
452
+ return false;
453
+ }
454
+ if ("group" in data && typeof data.group !== "string" && data.group !== void 0) {
455
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group is not a string or undefined", void 0, { data });
456
+ return false;
457
+ }
458
+ if ("group_name" in data && typeof data.group_name !== "string" && data.group_name !== void 0) {
459
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group_name is not a string", void 0, { data });
460
+ return false;
461
+ }
462
+ if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
463
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: name is not a string", void 0, { data });
464
+ return false;
465
+ }
466
+ if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
467
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: rule_id is not a string", void 0, { data });
468
+ return false;
469
+ }
470
+ if ("value" in data && typeof data.value !== "object" && data.value !== void 0) {
471
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: value is not an object", void 0, { data });
472
+ return false;
473
+ }
474
+ return true;
475
+ };
476
+ const isApiOrgConfigFeatureGate = (data) => {
477
+ if (data == null || typeof data !== "object") {
478
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: data is not an object", void 0, { data });
479
+ return false;
480
+ }
481
+ if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
482
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: name is not a string", void 0, { data });
483
+ return false;
484
+ }
485
+ if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
486
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: rule_id is not a string", void 0, { data });
487
+ return false;
488
+ }
489
+ if ("value" in data && typeof data.value !== "boolean" && data.value !== void 0) {
490
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: value is not a boolean", void 0, { data });
491
+ return false;
492
+ }
493
+ return true;
494
+ };
495
+ const isApiOrganization = (data) => {
496
+ if (data == null || typeof data !== "object") {
497
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: data is not an object", void 0, { data });
498
+ return false;
499
+ }
500
+ if (!("id" in data) || typeof data.id !== "string") {
501
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: id is not a string", void 0, { data });
502
+ return false;
503
+ }
504
+ if (!("display_name" in data) || typeof data.display_name !== "string") {
505
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: display_name is not a string", void 0, { data });
506
+ return false;
507
+ }
508
+ if (!("domain" in data) || typeof data.domain !== "string") {
509
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: domain is not a string", void 0, { data });
510
+ return false;
511
+ }
512
+ if (!("short_name" in data) || typeof data.short_name !== "string") {
513
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: short_name is not a string", void 0, { data });
514
+ return false;
515
+ }
516
+ if (!("status" in data) || !Object.values(OrganizationStatusEnum).includes(data.status)) {
517
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: status is not a valid OrganizationStatusEnum value", void 0, { data });
518
+ return false;
519
+ }
520
+ if ("created_at" in data && !(data.created_at instanceof Date) && typeof data.created_at !== "string" && data.created_at !== void 0) {
521
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: created_at is not a Date", void 0, { data });
522
+ return false;
523
+ }
524
+ if ("updated_at" in data && !(data.updated_at instanceof Date) && typeof data.updated_at !== "string" && data.updated_at !== void 0) {
525
+ logger_default.logDebug("[spiffy-ai] isApiOrganization: updated_at is not a Date", void 0, { data });
526
+ return false;
527
+ }
528
+ return true;
529
+ };
530
+ const isApiOrgConfigOrganizationSettings = (data) => {
531
+ if (data == null || typeof data !== "object") {
532
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: data is not an object", void 0, { data });
533
+ return false;
534
+ }
535
+ if (!("org" in data) || !isApiOrganization(data.org)) {
536
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: org is not an object", void 0, { data });
537
+ return false;
538
+ }
539
+ return true;
540
+ };
541
+ /**
542
+ *
543
+ * @param data
544
+ * @returns
545
+ */
546
+ const isApiOrgConfigResults = (data) => {
547
+ if (data == null || typeof data !== "object") {
548
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: data is not an object", void 0, { data });
549
+ return false;
550
+ }
551
+ if (!("configs" in data) || !Array.isArray(data.configs) || !data.configs.every((config) => isApiOrganizationConfig(config))) {
552
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: configs is not an array", void 0, { data });
553
+ return false;
554
+ }
555
+ if ("experiments" in data && data.experiments !== void 0 && (!Array.isArray(data.experiments) || !data.experiments.every((exp) => isApiOrgConfigExperiment(exp)))) {
556
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: experiments is not an array or contains invalid items", void 0, { data });
557
+ return false;
558
+ }
559
+ if (!("gates" in data) || !Array.isArray(data.gates) || !data.gates.every((gate) => isApiOrgConfigFeatureGate(gate))) {
560
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: gates is not an array or contains invalid items", void 0, { data });
561
+ return false;
562
+ }
563
+ if (!("org" in data) || !isApiOrgConfigOrganizationSettings(data.org)) {
564
+ logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: org is not an object or has invalid fields", void 0, { data });
565
+ return false;
566
+ }
567
+ return true;
568
+ };
569
+
570
+ //#endregion
571
+ //#region src/application/models/guards/api/isApiPageResponseAttributes.ts
572
+ const isApiPageResponseAttributes = (obj) => {
573
+ if (obj == null || typeof obj !== "object") return false;
574
+ if ("title" in obj && obj.title != null && typeof obj.title !== "string") return false;
575
+ if ("description" in obj && typeof obj.description !== "string") return false;
576
+ if ("url" in obj && typeof obj.url !== "string") return false;
577
+ return true;
578
+ };
579
+
580
+ //#endregion
581
+ //#region src/application/models/guards/api/isApiPLPEventAttributes.ts
582
+ const isApiPLPIdAttribute = (data) => {
583
+ if (data == null || typeof data !== "object") return false;
584
+ if (!("id" in data) || typeof data.id !== "string") return false;
585
+ return true;
586
+ };
587
+ const isApiPLPEventAttributes = (data) => {
588
+ if (data == null || typeof data !== "object") return false;
589
+ if (!("category" in data) || typeof data.category !== "string" || !Object.values(PLPAttributeCategory).includes(data.category)) return false;
590
+ if (!("attributes" in data) || typeof data.attributes !== "object" || !isApiPLPIdAttribute(data.attributes)) return false;
591
+ return true;
592
+ };
593
+
594
+ //#endregion
595
+ //#region src/application/models/guards/api/isApiProductSearchFilterAttributes.ts
596
+ const isApiProductSearchFilterResponseAttributes = (attributes) => {
597
+ if (attributes == null || typeof attributes !== "object") return false;
598
+ if ("filter_name" in attributes && typeof attributes.filter_name !== "string") return false;
599
+ return true;
600
+ };
601
+
602
+ //#endregion
603
+ //#region src/application/models/guards/graphQL/isGraphQLColorsConfig.ts
604
+ const REQUIRED_COLOR_FIELDS = [
605
+ "accent_primary",
606
+ "accent_secondary",
607
+ "background_dark",
608
+ "background_light",
609
+ "background_primary",
610
+ "background_saturated",
611
+ "background_secondary",
612
+ "background_secondary_dark",
613
+ "background_tertiary",
614
+ "border_dark",
615
+ "border_light",
616
+ "border_medium",
617
+ "border_outline",
618
+ "text_accent",
619
+ "text_light",
620
+ "text_link",
621
+ "text_primary",
622
+ "text_secondary"
623
+ ];
624
+ const isGraphQLColorsConfig = (data) => {
625
+ if (typeof data !== "object" || data === null) {
626
+ logger_default.logError("Invalid graphql response for colors config", void 0, { data });
627
+ return false;
628
+ }
629
+ const missingFields = REQUIRED_COLOR_FIELDS.filter((field) => !(field in data) || typeof data[field] !== "string");
630
+ if (missingFields.length === REQUIRED_COLOR_FIELDS.length) {
631
+ logger_default.logError("All color fields are missing or null", void 0);
632
+ return false;
633
+ }
634
+ if (missingFields.length > 0) {
635
+ logger_default.logError("Missing or invalid color fields", void 0, {
636
+ data,
637
+ missingFields
638
+ });
639
+ return false;
640
+ }
641
+ return true;
642
+ };
643
+
644
+ //#endregion
645
+ //#region src/application/models/utils/snakeToCamelTransformer.ts
646
+ /**
647
+ * Generic utility to transform snake_case object keys to camelCase at runtime.
648
+ * This is the runtime equivalent of the CamelCasedPropertiesDeep type utility.
649
+ */
650
+ const PRESERVED_ACRONYMS = [
651
+ "PLP",
652
+ "PDP",
653
+ "SVG"
654
+ ];
655
+ /**
656
+ * Converts a snake_case string to camelCase
657
+ * Handles specific acronyms like PLP and PDP correctly
658
+ */
659
+ const toCamelCase = (str) => {
660
+ let processedStr = str;
661
+ for (const acronym of PRESERVED_ACRONYMS) {
662
+ const regex = new RegExp(`_${acronym}_?`, "gi");
663
+ if (processedStr.match(regex)) processedStr = processedStr.replace(regex, (v) => v.endsWith("_") ? `${acronym}_` : `${acronym}`);
664
+ }
665
+ return processedStr.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
666
+ };
667
+ /**
668
+ * Converts a camelCase string to snake_case
669
+ * Handles consecutive capital letters correctly (e.g., "PDP" -> "pdp", not "p_d_p")
670
+ * Preserves specific acronyms like PLP and PDP as lowercase in snake_case
671
+ */
672
+ const toSnakeCase = (str) => str.replace(/([A-Z])(?=[a-z])/g, "_$1").replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/^_/, "");
673
+ /**
674
+ * Recursively transforms all object keys from snake_case to camelCase
675
+ */
676
+ const transformSnakeToCamel = (obj) => {
677
+ if (obj === null || obj === void 0) return obj;
678
+ if (Array.isArray(obj)) return obj.map((val) => transformSnakeToCamel(val));
679
+ if (typeof obj === "object") {
680
+ const result = {};
681
+ for (const [key, value] of Object.entries(obj)) {
682
+ const camelKey = toCamelCase(key);
683
+ result[camelKey] = transformSnakeToCamel(value);
684
+ }
685
+ return result;
686
+ }
687
+ return obj;
688
+ };
689
+ /**
690
+ * Recursively transforms all object keys from camelCase to snake_case
691
+ */
692
+ const transformCamelToSnake = (obj) => {
693
+ if (obj === null || obj === void 0) return obj;
694
+ if (Array.isArray(obj)) return obj.map(transformCamelToSnake);
695
+ if (typeof obj === "object") {
696
+ const result = {};
697
+ for (const [key, value] of Object.entries(obj)) {
698
+ const snakeKey = toSnakeCase(key);
699
+ result[snakeKey] = transformCamelToSnake(value);
700
+ }
701
+ return result;
702
+ }
703
+ return obj;
704
+ };
705
+
706
+ //#endregion
707
+ //#region src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts
708
+ /**
709
+ * Converts a string to a FulfillmentDisplayStatus enum value.
710
+ *
711
+ * @param status - The string to convert.
712
+ *
713
+ * @returns The FulfillmentDisplayStatus enum value or undefined if the string
714
+ * does not map to a valid enum
715
+ */
716
+ const stringToFulfillmentDisplayStatusEnumValue = (status) => {
717
+ switch (status) {
718
+ case "ATTEMPTED_DELIVERY": return FulfillmentDisplayStatus.ATTEMPTED_DELIVERY;
719
+ case "CANCELED": return FulfillmentDisplayStatus.CANCELED;
720
+ case "CONFIRMED": return FulfillmentDisplayStatus.CONFIRMED;
721
+ case "DELIVERED": return FulfillmentDisplayStatus.DELIVERED;
722
+ case "FAILURE": return FulfillmentDisplayStatus.FAILURE;
723
+ case "FULFILLED": return FulfillmentDisplayStatus.FULFILLED;
724
+ case "IN_TRANSIT": return FulfillmentDisplayStatus.IN_TRANSIT;
725
+ case "LABEL_PRINTED": return FulfillmentDisplayStatus.LABEL_PRINTED;
726
+ case "LABEL_PURCHASED": return FulfillmentDisplayStatus.LABEL_PURCHASED;
727
+ case "LABEL_VOIDED": return FulfillmentDisplayStatus.LABEL_VOIDED;
728
+ case "MARKED_AS_FULFILLED": return FulfillmentDisplayStatus.MARKED_AS_FULFILLED;
729
+ case "NOT_DELIVERED": return FulfillmentDisplayStatus.NOT_DELIVERED;
730
+ case "OUT_FOR_DELIVERY": return FulfillmentDisplayStatus.OUT_FOR_DELIVERY;
731
+ case "PICKED_UP": return FulfillmentDisplayStatus.PICKED_UP;
732
+ case "READY_FOR_PICKUP": return FulfillmentDisplayStatus.READY_FOR_PICKUP;
733
+ case "SUBMITTED": return FulfillmentDisplayStatus.SUBMITTED;
734
+ case "IN_PROGRESS": return FulfillmentDisplayStatus.IN_PROGRESS;
735
+ case "ON_HOLD": return FulfillmentDisplayStatus.ON_HOLD;
736
+ case "OPEN": return FulfillmentDisplayStatus.OPEN;
737
+ case "PARTIALLY_FULFILLED": return FulfillmentDisplayStatus.PARTIALLY_FULFILLED;
738
+ case "PENDING_FULFILLMENT": return FulfillmentDisplayStatus.PENDING_FULFILLMENT;
739
+ case "REQUEST_DECLINED": return FulfillmentDisplayStatus.REQUEST_DECLINED;
740
+ case "RESTOCKED": return FulfillmentDisplayStatus.RESTOCKED;
741
+ case "SCHEDULED": return FulfillmentDisplayStatus.SCHEDULED;
742
+ case "UNFULFILLED": return FulfillmentDisplayStatus.UNFULFILLED;
743
+ default: return;
744
+ }
745
+ };
746
+
747
+ //#endregion
748
+ //#region src/application/models/validators/validateGraphQLColorsConfig.ts
749
+ const validateGraphQLColorsConfig = (data) => {
750
+ if (!isGraphQLColorsConfig(data)) return;
751
+ };
752
+
753
+ //#endregion
754
+ //#region src/merchants/domInsertion.ts
755
+ var DOMInsertionType = /* @__PURE__ */ function(DOMInsertionType$1) {
756
+ DOMInsertionType$1["AFTER"] = "after";
757
+ DOMInsertionType$1["BEFORE"] = "before";
758
+ DOMInsertionType$1["ADJACENT_AFTER_BEGIN"] = "adjacent-after-begin";
759
+ DOMInsertionType$1["ADJACENT_BEFORE_BEGIN"] = "adjacent-before-begin";
760
+ DOMInsertionType$1["ADJACENT_AFTER_END"] = "adjacent-after-end";
761
+ DOMInsertionType$1["ADJACENT_BEFORE_END"] = "adjacent-before-end";
762
+ DOMInsertionType$1["APPEND_CHILD"] = "append-child";
763
+ DOMInsertionType$1["NONE"] = "none";
764
+ return DOMInsertionType$1;
765
+ }(DOMInsertionType || {});
766
+
767
+ //#endregion
768
+ //#region src/merchants/gridInsertion.ts
769
+ var GridInsertionType = /* @__PURE__ */ function(GridInsertionType$1) {
770
+ GridInsertionType$1["FIXED_1"] = "fixed-1";
771
+ GridInsertionType$1["FIXED_2"] = "fixed-2";
772
+ GridInsertionType$1["FIXED_3"] = "fixed-3";
773
+ GridInsertionType$1["FIXED_4"] = "fixed-4";
774
+ GridInsertionType$1["FIXED_5"] = "fixed-5";
775
+ GridInsertionType$1["FIXED_6"] = "fixed-6";
776
+ GridInsertionType$1["FIXED_7"] = "fixed-7";
777
+ GridInsertionType$1["FIXED_8"] = "fixed-8";
778
+ GridInsertionType$1["FIXED_9"] = "fixed-9";
779
+ GridInsertionType$1["FIXED_12"] = "fixed-12";
780
+ GridInsertionType$1["FIXED_13"] = "fixed-13";
781
+ GridInsertionType$1["ROW_1"] = "row-1";
782
+ GridInsertionType$1["ROW_2"] = "row-2";
783
+ GridInsertionType$1["ROW_3"] = "row-3";
784
+ GridInsertionType$1["ROW_4"] = "row-4";
785
+ return GridInsertionType$1;
786
+ }(GridInsertionType || {});
787
+
788
+ //#endregion
789
+ //#region src/application/models/validators/validateGraphQLFrontendConfig.ts
790
+ const validateAndTransformPageVariants = (config) => {
791
+ const { variantChecks, widgetMounting,...rest } = transformSnakeToCamel(config);
792
+ const variantTests = Array.isArray(variantChecks) ? variantChecks.map(({ checkType,...restCheck }) => ({
793
+ ...restCheck,
794
+ testType: checkType
795
+ })) : [];
796
+ const normalizedWidgetMounting = Array.isArray(widgetMounting) ? widgetMounting.map(({ mountingPointWidgets,...restMounting }) => ({
797
+ ...restMounting,
798
+ ...Array.isArray(mountingPointWidgets) ? { mountingPointWidgets: mountingPointWidgets.map(({ checks,...restWidget }) => ({
799
+ ...restWidget,
800
+ tests: Array.isArray(checks) ? checks.map(({ checkType,...restCheck }) => ({
801
+ ...restCheck,
802
+ testType: checkType
803
+ })) : []
804
+ })) } : {}
805
+ })) : [];
806
+ const normalizedConfig = {
807
+ ...rest,
808
+ ...variantTests ? { variantTests } : {},
809
+ ...normalizedWidgetMounting ? { widgetMounting: normalizedWidgetMounting } : {}
810
+ };
811
+ const variantId = normalizedConfig.variantId;
812
+ const variantType = normalizedConfig.variantType;
813
+ if (typeof variantId !== "string" || !variantId) throw new Error(`Missing or invalid variantId for pageVariant`);
814
+ if (typeof variantType !== "string" || !variantType) throw new Error(`Missing or invalid variantType for pageVariant '${variantId}'`);
815
+ if (!Array.isArray(variantTests)) throw new Error(`Missing or invalid variantTests for pageVariant '${variantId}'. Must be an array`);
816
+ for (const test of variantTests) {
817
+ if (!test.testType || typeof test.testType !== "string") throw new Error(`Invalid variantTest.testType for pageVariant '${variantId}'`);
818
+ if (!Object.values(PageVariantTestType).includes(test.testType)) throw new Error(`Invalid testType '${test.testType}' for pageVariant '${variantId}'. Valid types: ${Object.values(PageVariantTestType).join(", ")}`);
819
+ }
820
+ if (!Array.isArray(normalizedWidgetMounting)) throw new Error(`Missing or invalid widgetMounting for pageVariant '${variantId}'. Must be an array`);
821
+ for (const mounting of normalizedWidgetMounting) {
822
+ if (typeof mounting.mountingConfigId !== "string" || !mounting.mountingConfigId) throw new Error(`Invalid mountingConfigId in widgetMounting for pageVariant '${variantId}'`);
823
+ if (mounting.widgetConfigId && typeof mounting.widgetConfigId !== "string") throw new Error(`Invalid widgetConfigId in widgetMounting for pageVariant '${variantId}'`);
824
+ if (mounting.mountingPointWidgets) for (const widget of mounting.mountingPointWidgets) {
825
+ if (typeof widget.widgetConfigId !== "string" || !widget.widgetConfigId) throw new Error(`Invalid widgetConfigId in mountingPointWidgets for pageVariant '${variantId}'`);
826
+ if (!Array.isArray(widget.tests)) throw new Error(`Invalid or missing tests in mountingPointWidgets for pageVariant '${variantId}'`);
827
+ }
828
+ }
829
+ if (variantType === "plp") {
830
+ if (typeof normalizedConfig.plpIdExtractor !== "string" || !normalizedConfig.plpIdExtractor) throw new Error(`Missing or invalid plpIdExtractor for PLP pageVariant '${variantId}'`);
831
+ }
832
+ if (variantType === "pdp") {
833
+ if (typeof normalizedConfig.productIdExtractor !== "string" || !normalizedConfig.productIdExtractor) throw new Error(`Missing or invalid productIdExtractor for PDP pageVariant '${variantId}'`);
834
+ if (normalizedConfig.parentProductIdExtractor && typeof normalizedConfig.parentProductIdExtractor !== "string") throw new Error(`Invalid parentProductIdExtractor for PDP pageVariant '${variantId}'. Must be string if provided`);
835
+ }
836
+ return normalizedConfig;
837
+ };
838
+ const validateAndTransformMountingConfig = (config, configKey) => {
839
+ const normalizedConfig = { ...config };
840
+ if (normalizedConfig.checkId && !normalizedConfig.testId) {
841
+ normalizedConfig.testId = normalizedConfig.checkId;
842
+ delete normalizedConfig.checkId;
843
+ }
844
+ if (typeof normalizedConfig.mountingConfigId !== "string" || !normalizedConfig.mountingConfigId) throw new Error(`Missing or invalid mountingConfigId for config '${configKey}'`);
845
+ if (typeof normalizedConfig.containerId !== "string" || !normalizedConfig.containerId) throw new Error(`Missing or invalid containerId for config '${configKey}'`);
846
+ if (typeof normalizedConfig.testId !== "string" || !normalizedConfig.testId) throw new Error(`Missing or invalid testId for config '${configKey}'`);
847
+ if (!normalizedConfig.insertionPoint || typeof normalizedConfig.insertionPoint !== "object" || Array.isArray(normalizedConfig.insertionPoint)) throw new Error(`Missing or invalid insertionPoint for config '${configKey}'`);
848
+ const insertionPoint = normalizedConfig.insertionPoint;
849
+ if (typeof insertionPoint.selector !== "string" || !insertionPoint.selector) throw new Error(`Missing or invalid insertionPoint.selector for config '${configKey}'`);
850
+ if (typeof insertionPoint.insertionType !== "string" || !insertionPoint.insertionType) throw new Error(`Missing or invalid insertionPoint.insertionType for config '${configKey}'`);
851
+ if (!Object.values(DOMInsertionType).includes(insertionPoint.insertionType)) throw new Error(`Invalid insertionPoint.insertionType '${insertionPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
852
+ if (insertionPoint.selectionIndex != null && typeof insertionPoint.selectionIndex !== "number") throw new Error(`Invalid insertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
853
+ let parentInsertionPoint;
854
+ if (normalizedConfig.parentInsertionPoint) {
855
+ if (typeof normalizedConfig.parentInsertionPoint !== "object" || Array.isArray(normalizedConfig.parentInsertionPoint)) throw new Error(`Invalid parentInsertionPoint for config '${configKey}'. Must be an object`);
856
+ const parentPoint = normalizedConfig.parentInsertionPoint;
857
+ if (typeof parentPoint.selector !== "string" || !parentPoint.selector) throw new Error(`Missing or invalid parentInsertionPoint.selector for config '${configKey}'`);
858
+ if (typeof parentPoint.insertionType !== "string" || !parentPoint.insertionType) throw new Error(`Missing or invalid parentInsertionPoint.insertionType for config '${configKey}'`);
859
+ if (!Object.values(DOMInsertionType).includes(parentPoint.insertionType)) throw new Error(`Invalid parentInsertionPoint.insertionType '${parentPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
860
+ if (parentPoint.selectionIndex != null && typeof parentPoint.selectionIndex !== "number") throw new Error(`Invalid parentInsertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
861
+ parentInsertionPoint = {
862
+ selector: parentPoint.selector,
863
+ insertionType: parentPoint.insertionType,
864
+ selectionIndex: parentPoint.selectionIndex
865
+ };
866
+ }
867
+ let wrappingElement;
868
+ if (normalizedConfig.wrappingElement) {
869
+ if (typeof normalizedConfig.wrappingElement !== "object" || Array.isArray(normalizedConfig.wrappingElement)) throw new Error(`Invalid wrappingElement for config '${configKey}'. Must be an object`);
870
+ const wrapping = normalizedConfig.wrappingElement;
871
+ if (typeof wrapping.className !== "string" || !wrapping.className) throw new Error(`Missing or invalid wrappingElement.className for config '${configKey}'`);
872
+ if (typeof wrapping.element !== "string" || !wrapping.element) throw new Error(`Missing or invalid wrappingElement.element for config '${configKey}'`);
873
+ if (typeof wrapping.insertionType !== "string" || !wrapping.insertionType) throw new Error(`Missing or invalid wrappingElement.insertionType for config '${configKey}'`);
874
+ if (!Object.values(DOMInsertionType).includes(wrapping.insertionType)) throw new Error(`Invalid wrappingElement.insertionType '${wrapping.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
875
+ wrappingElement = {
876
+ className: wrapping.className,
877
+ element: wrapping.element,
878
+ insertionType: wrapping.insertionType
879
+ };
880
+ }
881
+ if (normalizedConfig.divCheckSelector != null && typeof normalizedConfig.divCheckSelector !== "string") throw new Error(`Invalid divCheckSelector for config '${configKey}'. Must be a string or null/undefined`);
882
+ if (normalizedConfig.className != null && typeof normalizedConfig.className !== "string") throw new Error(`Invalid className for config '${configKey}'. Must be a string or null/undefined`);
883
+ if (normalizedConfig.suppressionSelector != null && typeof normalizedConfig.suppressionSelector !== "string") throw new Error(`Invalid suppressionSelector for config '${configKey}'. Must be a string or null/undefined`);
884
+ if (normalizedConfig.dataAttributes != null && (typeof normalizedConfig.dataAttributes !== "object" || Array.isArray(normalizedConfig.dataAttributes))) throw new Error(`Invalid dataAttributes for config '${configKey}'. Must be an object or null/undefined`);
885
+ if (normalizedConfig.style != null && (typeof normalizedConfig.style !== "object" || Array.isArray(normalizedConfig.style))) throw new Error(`Invalid style for config '${configKey}'. Must be an object or null/undefined`);
886
+ let gridInsertionType;
887
+ if (normalizedConfig.gridInsertionType) {
888
+ if (typeof normalizedConfig.gridInsertionType !== "string" || !normalizedConfig.gridInsertionType) throw new Error(`Invalid gridInsertionType for config '${configKey}'. Must be a string`);
889
+ if (!Object.values(GridInsertionType).includes(normalizedConfig.gridInsertionType)) throw new Error(`Invalid gridInsertionType '${normalizedConfig.gridInsertionType}' for config '${configKey}'. Valid types: ${Object.values(GridInsertionType).join(", ")}`);
890
+ gridInsertionType = normalizedConfig.gridInsertionType;
891
+ }
892
+ const result = {
893
+ mountingConfigId: normalizedConfig.mountingConfigId,
894
+ containerId: normalizedConfig.containerId,
895
+ testId: normalizedConfig.testId,
896
+ insertionPoint: {
897
+ selector: insertionPoint.selector,
898
+ insertionType: insertionPoint.insertionType,
899
+ ...insertionPoint.selectionIndex != null && { selectionIndex: insertionPoint.selectionIndex }
900
+ }
901
+ };
902
+ if (parentInsertionPoint) result.parentInsertionPoint = parentInsertionPoint;
903
+ if (gridInsertionType) result.gridInsertionType = gridInsertionType;
904
+ if (wrappingElement) result.wrappingElement = wrappingElement;
905
+ if (normalizedConfig.divCheckSelector) result.divCheckSelector = normalizedConfig.divCheckSelector;
906
+ if (normalizedConfig.className) result.className = normalizedConfig.className;
907
+ if (normalizedConfig.suppressionSelector) result.suppressionSelector = normalizedConfig.suppressionSelector;
908
+ if (normalizedConfig.dataAttributes) result.dataAttributes = normalizedConfig.dataAttributes;
909
+ if (normalizedConfig.style) result.style = normalizedConfig.style;
910
+ return result;
911
+ };
912
+ const validateAndTransformWidgetConfig = (config, configKey) => {
913
+ const normalizedConfig = transformSnakeToCamel(config);
914
+ if (typeof normalizedConfig.widgetConfigId !== "string" || !normalizedConfig.widgetConfigId) throw new Error(`Missing or invalid widgetConfigId for widget config '${configKey}'`);
915
+ if (typeof normalizedConfig.type !== "string" || !normalizedConfig.type) throw new Error(`Missing or invalid type for widget config '${configKey}'`);
916
+ if (normalizedConfig.contentId != null && typeof normalizedConfig.contentId !== "string") throw new Error(`Invalid contentId for widget config '${configKey}'. Must be a string or null/undefined`);
917
+ return normalizedConfig;
918
+ };
919
+ const validateGraphQLFrontendConfig = (data) => {
920
+ if (data === null || data === void 0) return;
921
+ if (typeof data !== "object" || Array.isArray(data)) {
922
+ logger_default.logWarn("Invalid GraphQL frontend config data: not an object", void 0, { data });
923
+ return;
924
+ }
925
+ const obj = data;
926
+ if ("merchant_override_css" in obj && typeof obj.merchant_override_css !== "string" && obj.merchant_override_css !== null) {
927
+ logger_default.logWarn("Invalid GraphQL frontend config data: merchant_override_css must be a string or null", void 0, { data });
928
+ return;
929
+ }
930
+ if ("page_variants" in obj) {
931
+ if (obj.page_variants !== void 0 && obj.page_variants !== null && !Array.isArray(obj.page_variants)) {
932
+ logger_default.logWarn("Invalid GraphQL frontend config data: page_variants must be an array or null/undefined", void 0, { data });
933
+ return;
934
+ }
935
+ }
936
+ if ("mounting_configs" in obj) {
937
+ if (obj.mounting_configs !== void 0 && obj.mounting_configs !== null && !Array.isArray(obj.mounting_configs)) {
938
+ logger_default.logWarn("Invalid GraphQL frontend config data: mounting_configs must be an array or null/undefined", void 0, { data });
939
+ return;
940
+ }
941
+ }
942
+ if ("widget_configs" in obj) {
943
+ if (obj.widget_configs !== void 0 && obj.widget_configs !== null && !Array.isArray(obj.widget_configs)) {
944
+ logger_default.logWarn("Invalid GraphQL frontend config data: widget_configs must be an array or null/undefined", void 0, { data });
945
+ return;
946
+ }
947
+ }
948
+ if ("ui_configs" in obj && typeof obj.ui_configs !== "object" && obj.ui_configs !== null) {
949
+ logger_default.logWarn("Invalid GraphQL frontend config data: ui_configs must be an object or null/undefined", void 0, { data });
950
+ return;
951
+ }
952
+ try {
953
+ const transformedData = transformSnakeToCamel(obj);
954
+ if (transformedData.pageVariants && Array.isArray(transformedData.pageVariants)) {
955
+ const pageVariantsArray = transformedData.pageVariants;
956
+ const validatedPageVariants = [];
957
+ for (const variant of pageVariantsArray) if (variant && typeof variant === "object" && typeof variant.variantId === "string") try {
958
+ const validatedVariant = validateAndTransformPageVariants(variant);
959
+ validatedPageVariants.push(validatedVariant);
960
+ } catch (error) {
961
+ logger_default.logWarn("Invalid page variant, skipping", error, {
962
+ variantId: variant.variantId,
963
+ variant
964
+ });
965
+ }
966
+ else logger_default.logWarn("Invalid page variant structure, skipping", void 0, { variant });
967
+ transformedData.pageVariants = validatedPageVariants;
968
+ }
969
+ if (transformedData.mountingConfigs && Array.isArray(transformedData.mountingConfigs)) {
970
+ const mountingConfigsArray = transformedData.mountingConfigs;
971
+ const mountingConfigsRecord = {};
972
+ for (const item of mountingConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
973
+ const config = item.config;
974
+ const validatedConfig = validateAndTransformMountingConfig(config, item.key);
975
+ mountingConfigsRecord[item.key] = validatedConfig;
976
+ } catch (error) {
977
+ logger_default.logWarn("Invalid mounting config, skipping", error, {
978
+ configKey: item.key,
979
+ config: item.config
980
+ });
981
+ }
982
+ else logger_default.logWarn("Invalid mounting config item structure, skipping", void 0, { item });
983
+ transformedData.mountingConfigs = mountingConfigsRecord;
984
+ }
985
+ if (transformedData.widgetConfigs && Array.isArray(transformedData.widgetConfigs)) {
986
+ const widgetConfigsArray = transformedData.widgetConfigs;
987
+ const widgetConfigsRecord = {};
988
+ for (const item of widgetConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
989
+ const config = item.config;
990
+ const validatedConfig = validateAndTransformWidgetConfig(config, item.key);
991
+ widgetConfigsRecord[item.key] = validatedConfig;
992
+ } catch (error) {
993
+ logger_default.logWarn("Invalid widget config, skipping", error, {
994
+ configKey: item.key,
995
+ config: item.config
996
+ });
997
+ }
998
+ else logger_default.logWarn("Invalid widget config item structure, skipping", void 0, { item });
999
+ transformedData.widgetConfigs = widgetConfigsRecord;
1000
+ }
1001
+ return transformedData;
1002
+ } catch (error) {
1003
+ logger_default.logWarn("Failed to validate and transform GraphQL frontend config data", error, { data });
1004
+ return;
1005
+ }
1006
+ };
1007
+
1008
+ //#endregion
1009
+ //#region src/application/models/validators/validateGraphQLOrgId.ts
1010
+ const validateGraphQLOrgId = (data) => {
1011
+ if (typeof data !== "string" || data === "") return;
1012
+ return data;
1013
+ };
1014
+
1015
+ //#endregion
1016
+ //#region src/application/models/validators/validateMobilePLPChatPlacementParameter.ts
1017
+ const validateMobilePLPChatPlacementParameter = (value) => {
1018
+ if (!isMobilePLPChatPlacementParameter(value)) return;
1019
+ return { rowIndex: value.row_index };
1020
+ };
1021
+
1022
+ //#endregion
1023
+ //#region src/application/models/validators/validateOrganizationConfig.ts
1024
+ const validateOrganizationConfig = (data) => {
1025
+ if (!isApiOrganizationConfig(data)) return;
1026
+ return {
1027
+ id: data.id,
1028
+ createdAt: data.created_at.toISOString(),
1029
+ namespace: data.namespace,
1030
+ organizationId: data.organization_id,
1031
+ isLatest: data.is_latest,
1032
+ version: data.version,
1033
+ updatedAt: data.updated_at.toISOString(),
1034
+ config: {
1035
+ amplitude: data.config.amplitude ? {
1036
+ sessionReplayEnabled: data.config.amplitude.session_replay_enabled,
1037
+ sessionReplaySampleRate: data.config.amplitude.session_replay_sample_rate,
1038
+ trackingEnabled: data.config.amplitude.tracking_enabled
1039
+ } : void 0,
1040
+ customerService: data.config.customer_service ? { provider: data.config.customer_service.provider } : void 0,
1041
+ googleAnalytics: data.config.google_analytics ? { measurementId: data.config.google_analytics.measurement_id } : void 0
1042
+ }
1043
+ };
1044
+ };
1045
+
1046
+ //#endregion
1047
+ //#region src/application/models/validators/validateOrgConfigResults.ts
1048
+ /**
1049
+ *
1050
+ * @param data
1051
+ * @returns
1052
+ */
1053
+ const validateOrgConfigResults = (data) => {
1054
+ if (!isApiOrgConfigResults(data)) return;
1055
+ return {
1056
+ configs: data.configs.map((config) => validateOrganizationConfig(config)).filter((config) => config != null),
1057
+ experiments: data.experiments.map((experiment) => ({
1058
+ group: experiment.group,
1059
+ groupName: experiment.group_name,
1060
+ name: experiment.name,
1061
+ ruleId: experiment.rule_id,
1062
+ value: experiment.value
1063
+ })),
1064
+ gates: data.gates.map((gate) => ({
1065
+ groupName: gate.group_name,
1066
+ name: gate.name,
1067
+ ruleId: gate.rule_id,
1068
+ value: gate.value
1069
+ })),
1070
+ org: {
1071
+ org: {
1072
+ id: data.org.org.id,
1073
+ displayName: data.org.org.display_name,
1074
+ domain: data.org.org.domain,
1075
+ shortName: data.org.org.short_name,
1076
+ status: data.org.org.status,
1077
+ createdAt: data.org.org.created_at?.toISOString(),
1078
+ updatedAt: data.org.org.updated_at?.toISOString()
1079
+ },
1080
+ settings: {}
1081
+ }
1082
+ };
1083
+ };
1084
+
1085
+ //#endregion
1086
+ //#region src/application/models/validators/validateResponse.ts
1087
+ const richInformationFromCommerceRichInformation = (data) => ({
1088
+ cons: data.cons,
1089
+ pros: data.pros,
1090
+ reviewDate: data.review_date,
1091
+ reviewerTitle: data.reviewer_title,
1092
+ productFamiliarity: data.product_familiarity
1093
+ });
1094
+ const validateResponse = (data) => {
1095
+ if (!isApiResponse(data)) return;
1096
+ if (data.category === ResponseCategory.Text && isApiTextResponseAttributes(data.attributes)) return {
1097
+ id: data.id,
1098
+ createdAt: data.created_at,
1099
+ category: ResponseCategory.Text,
1100
+ attributes: { content: data.attributes.content }
1101
+ };
1102
+ if (data.category === ResponseCategory.Product && isApiProductResponseAttributes(data.attributes)) return {
1103
+ id: data.id,
1104
+ createdAt: data.created_at,
1105
+ category: ResponseCategory.Product,
1106
+ attributes: {
1107
+ id: data.attributes.id,
1108
+ description: data.attributes.description,
1109
+ imageUrl: data.attributes.image_url,
1110
+ imageUrls: data.attributes.image_urls,
1111
+ title: data.attributes.title,
1112
+ url: data.attributes.url,
1113
+ originalPrice: data.attributes.original_price,
1114
+ salePrice: data.attributes.sale_price,
1115
+ averageRating: data.attributes.average_rating,
1116
+ numberReviews: data.attributes.number_reviews,
1117
+ metadata: data.attributes.metadata,
1118
+ isForGrid: data.attributes.is_for_grid,
1119
+ colors: data.attributes.colors,
1120
+ sizes: data.attributes.sizes,
1121
+ filters: data.attributes.filters
1122
+ }
1123
+ };
1124
+ if (data.category === ResponseCategory.Review && isApiReviewResponseAttributes(data.attributes)) return {
1125
+ id: data.id,
1126
+ createdAt: data.created_at,
1127
+ category: ResponseCategory.Review,
1128
+ attributes: {
1129
+ id: data.attributes.id,
1130
+ productId: data.attributes.product_id,
1131
+ title: data.attributes.title,
1132
+ reviewer: data.attributes.reviewer,
1133
+ review: data.attributes.review,
1134
+ stars: data.attributes.stars,
1135
+ richInformation: data.attributes.rich_information ? richInformationFromCommerceRichInformation(data.attributes.rich_information) : void 0
1136
+ }
1137
+ };
1138
+ if (data.category === ResponseCategory.Separator) return {
1139
+ id: data.id,
1140
+ createdAt: data.created_at,
1141
+ category: ResponseCategory.Separator
1142
+ };
1143
+ if (data.category === ResponseCategory.Page && isApiPageResponseAttributes(data.attributes)) return {
1144
+ id: data.id,
1145
+ createdAt: data.created_at,
1146
+ category: ResponseCategory.Page,
1147
+ attributes: {
1148
+ id: data.attributes.id,
1149
+ title: data.attributes.title,
1150
+ description: data.attributes.description,
1151
+ url: data.attributes.url
1152
+ }
1153
+ };
1154
+ if (data.category === ResponseCategory.Form && isApiFormResponseAttributes(data.attributes)) return {
1155
+ id: data.id,
1156
+ createdAt: data.created_at,
1157
+ category: ResponseCategory.Form,
1158
+ attributes: {
1159
+ formCategory: data.attributes.form_category ? { formType: data.attributes.form_category.form_type } : void 0,
1160
+ schema: {
1161
+ properties: data.attributes.schema.properties,
1162
+ required: data.attributes.schema.required.map(String)
1163
+ }
1164
+ }
1165
+ };
1166
+ if (data.category === ResponseCategory.ProductSearch && isApiProductSearchResponseAttributes(data.attributes)) return {
1167
+ id: data.id,
1168
+ createdAt: data.created_at,
1169
+ category: ResponseCategory.ProductSearch,
1170
+ attributes: {
1171
+ generatedQuery: data.attributes.generated_query,
1172
+ productCount: data.attributes.product_count
1173
+ }
1174
+ };
1175
+ if (data.category === ResponseCategory.ProductSearchFilter && isApiProductSearchFilterResponseAttributes(data.attributes)) return {
1176
+ id: data.id,
1177
+ createdAt: data.created_at,
1178
+ category: ResponseCategory.ProductSearchFilter,
1179
+ attributes: { filterName: data.attributes.filter_name }
1180
+ };
1181
+ if (data.category === ResponseCategory.Order && isApiOrderResponseAttributes(data.attributes)) return {
1182
+ id: data.id,
1183
+ createdAt: data.created_at,
1184
+ category: ResponseCategory.Order,
1185
+ attributes: {
1186
+ orderId: data.attributes.order_id,
1187
+ orderNumber: data.attributes.order_number,
1188
+ createdAt: data.attributes.created_at,
1189
+ latestEventDate: data.attributes.latest_event_date,
1190
+ lineItems: data.attributes.line_items.map((item) => ({
1191
+ itemTitle: item.item_title,
1192
+ itemPrice: item.item_price,
1193
+ itemQuantity: item.item_quantity,
1194
+ orderItemId: item.order_item_id,
1195
+ image: item.image ?? void 0,
1196
+ inTransitAt: item.in_transit_at ?? void 0,
1197
+ deliveredAt: item.delivered_at ?? void 0,
1198
+ estimatedDeliveryAt: item.estimated_delivery_at ?? void 0,
1199
+ fulfillmentDisplayStatus: item.fulfillment_display_status ? stringToFulfillmentDisplayStatusEnumValue(item.fulfillment_display_status) : void 0,
1200
+ trackingUrl: item.tracking_url ?? void 0
1201
+ }))
1202
+ }
1203
+ };
1204
+ };
1205
+
1206
+ //#endregion
1207
+ //#region src/application/models/validators/validateSuggestion.ts
1208
+ const validateSuggestion = (data) => {
1209
+ if (!isSuggestion(data)) return;
1210
+ return {
1211
+ id: data.id,
1212
+ category: data.category,
1213
+ content: data.content,
1214
+ createdAt: data.created_at,
1215
+ isAnswer: data.is_answer
1216
+ };
1217
+ };
1218
+
1219
+ //#endregion
1220
+ //#region src/application/models/validators/validateUserEvent.ts
1221
+ const validateUserEvent = (data) => {
1222
+ if (!isApiUserEvent(data)) return;
1223
+ if (data.category === UserEventCategory.PdpVisit && isApiPDPAttributes(data.attributes)) return {
1224
+ eventId: data.event_id,
1225
+ createdAt: data.created_at,
1226
+ category: UserEventCategory.PdpVisit,
1227
+ attributes: {
1228
+ productId: data.attributes.product_id,
1229
+ parentProductId: data.attributes.parent_product_id,
1230
+ url: data.attributes.url
1231
+ }
1232
+ };
1233
+ if (data.category === UserEventCategory.QueryTyped && isApiQueryTypedAttributes(data.attributes)) return {
1234
+ eventId: data.event_id,
1235
+ createdAt: data.created_at,
1236
+ category: UserEventCategory.QueryTyped,
1237
+ attributes: { query: data.attributes.query }
1238
+ };
1239
+ if (data.category === UserEventCategory.Search && isApiSearchAttributes(data.attributes)) return {
1240
+ eventId: data.event_id,
1241
+ createdAt: data.created_at,
1242
+ category: UserEventCategory.Search,
1243
+ attributes: {
1244
+ searchTerm: data.attributes.search_term,
1245
+ selectedFilters: data.attributes.selected_filters
1246
+ }
1247
+ };
1248
+ if (data.category === UserEventCategory.SuggestionClicked && isApiSuggestionClickedAttributes(data.attributes)) return {
1249
+ eventId: data.event_id,
1250
+ createdAt: data.created_at,
1251
+ category: UserEventCategory.SuggestionClicked,
1252
+ attributes: { suggestionId: data.attributes.suggestion_id }
1253
+ };
1254
+ if (data.category === UserEventCategory.PlpVisit && isApiPLPEventAttributes(data.attributes)) {
1255
+ if (isApiPLPIdAttribute(data.attributes)) return {
1256
+ eventId: data.event_id,
1257
+ createdAt: data.created_at,
1258
+ category: UserEventCategory.PlpVisit,
1259
+ attributes: {
1260
+ category: data.attributes.category,
1261
+ attributes: { id: data.attributes.id }
1262
+ }
1263
+ };
1264
+ }
1265
+ if (data.category === UserEventCategory.FormSubmitted && isApiFormSubmittedResponseAttributes(data.attributes)) return {
1266
+ eventId: data.event_id,
1267
+ createdAt: data.created_at,
1268
+ category: UserEventCategory.FormSubmitted,
1269
+ attributes: {
1270
+ filledSchema: { ...data.attributes.filled_schema },
1271
+ formResponseId: data.attributes.form_response_id,
1272
+ formType: data.attributes.form_type
1273
+ }
1274
+ };
1275
+ return {
1276
+ eventId: data.event_id,
1277
+ createdAt: data.created_at,
1278
+ category: UserEventCategory.AppLoaded
1279
+ };
1280
+ };
1281
+
1282
+ //#endregion
1283
+ export { ChatElementDisplayLocation, GoogleAnalyticsEvents, MessageRole, MessageType, OrgShortName, ProductExperiment, SpiffyEventName, SpiffyWidgets, isApiFormResponseAttributes, isApiFormSubmittedResponseAttributes, isApiOrderResponseAttributes, isApiOrgConfigResults, isApiOrganizationConfig, isApiPLPEventAttributes, isApiPLPIdAttribute, isApiPageResponseAttributes, isApiProductSearchFilterResponseAttributes, isBaseEcommerceEvent, isGA4EcommerceEvent, isGraphQLColorsConfig, isLegacyUAEcommerceEvent, isMobilePLPChatPlacementParameter, isSpanxTakeAQuizCtaParameter, isVariantInfo, stringToFulfillmentDisplayStatusEnumValue, transformCamelToSnake, transformSnakeToCamel, validateAndTransformMountingConfig, validateAndTransformPageVariants, validateAndTransformWidgetConfig, validateGraphQLColorsConfig, validateGraphQLFrontendConfig, validateGraphQLOrgId, validateMobilePLPChatPlacementParameter, validateOrgConfigResults, validateOrganizationConfig, validateResponse, validateSuggestion, validateUserEvent };
1284
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLUNXT2dyTENtLmpzIiwibmFtZXMiOlsicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyIsInZhbGlkYXRlZFBhZ2VWYXJpYW50czogUGFnZVZhcmlhbnRDb25maWdbXSIsIm1vdW50aW5nQ29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgV2lkZ2V0TW91bnRpbmdDb25maWc+Iiwid2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2NoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ldmVudHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2dvb2dsZUFuYWx5dGljc0V2ZW50cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvbWVzc2FnZS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvb3Jnc0VudW0udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3Byb2R1Y3RFeHBlcmltZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9zcGlmZnlXaWRnZXRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNCYXNlRWNvbW1lcmNlRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9pc0dBNEVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzVmFyaWFudEluZm8udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdhbml6YXRpb25Db25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdDb25maWdSZXN1bHRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBMUEV2ZW50QXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVByb2R1Y3RTZWFyY2hGaWx0ZXJBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvZ3JhcGhRTC9pc0dyYXBoUUxDb2xvcnNDb25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3V0aWxzL3NuYWtlVG9DYW1lbFRyYW5zZm9ybWVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxDb2xvcnNDb25maWcudHMiLCIuLi9zcmMvbWVyY2hhbnRzL2RvbUluc2VydGlvbi50cyIsIi4uL3NyYy9tZXJjaGFudHMvZ3JpZEluc2VydGlvbi50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxGcm9udGVuZENvbmZpZy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZUdyYXBoUUxPcmdJZC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZU1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVTdWdnZXN0aW9uLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlVXNlckV2ZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENoYXQgZWxlbWVudCBkaXNwbGF5IGxvY2F0aW9uIGVudW1cbmV4cG9ydCBlbnVtIENoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uIHtcbiAgSU5fQ0hBVCA9ICdpbl9jaGF0JyxcbiAgQ0hBVF9QUkVWSUVXID0gJ2NoYXRfcHJldmlldycsXG4gIEZMT0FUSU5HX0JVVFRPTiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBIRUxQX01FX0NIT09TRSA9ICdoZWxwX21lX2Nob29zZScsXG4gIFBMUF9JTUFHRV9CQU5ORVIgPSAncGxwX2ltYWdlX2Jhbm5lcicsXG4gIFRPUF9SRVZJRVdTX1NOSVBQRVQgPSAndG9wX3Jldmlld3Nfc25pcHBldCcsXG4gIEJPVFRPTV9SRVZJRVdTX1NOSVBQRVQgPSAnYm90dG9tX3Jldmlld3Nfc25pcHBldCcsXG4gIEJMT0NLX0JBQ0tfQlVUVE9OID0gJ2Jsb2NrX2JhY2tfYnV0dG9uJyxcbiAgU1dJVENIX1RPX0FHRU5UID0gJ3N3aXRjaF90b19hZ2VudCcsXG4gIENPTlZFUlNBVElPTkFMX1NFQVJDSCA9ICdjb252ZXJzYXRpb25hbF9zZWFyY2gnLFxuICBHTE9CQUxfU0VBUkNIX0VOVFJZUE9JTlQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeXBvaW50JyxcbiAgU0VBUkNIX05BVl9FTlRSWVBPSU5UID0gJ3NlYXJjaF9uYXZfZW50cnlwb2ludCcsXG4gIFNFQVJDSF9QUk9NUFQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIFNFQVJDSF9QUk9NUFRfQlVUVE9OID0gJ3NlYXJjaF9wcm9tcHRfYnV0dG9uJyxcbiAgUFJPRFVDVF9HUklEID0gJ3Byb2R1Y3RfZ3JpZCcsXG4gIFVOU1BFQ0lGSUVEID0gJ3Vuc3BlY2lmaWVkJyxcbiAgRklMVEVSX01PREFMID0gJ2ZpbHRlcl9tb2RhbCcsXG4gIFBST01QVF9DQVJEID0gJ3Byb21wdF9jYXJkJyxcbiAgV0lORE9XX0FQSV9DQUxMID0gJ3dpbmRvd19hcGlfY2FsbCcsXG59XG4iLCIvLyBuYW1lcyBvZiBTcGlmZnkgc3BlY2lmaWMgSFRNTCBldmVudHNcbmV4cG9ydCBlbnVtIFNwaWZmeUV2ZW50TmFtZSB7XG4gIFdpZGdldE9wZW4gPSAnc3BpZmZ5OndpZGdldG9wZW4nLFxuICBXaWRnZXRDbG9zZSA9ICdzcGlmZnk6d2lkZ2V0Y2xvc2UnLFxufVxuIiwiZW51bSBHb29nbGVBbmFseXRpY3NFdmVudHMge1xuICBBRERfVE9fQ0FSVF92MSA9ICdhZGRfdG9fY2FydCcsXG4gIEFERF9UT19DQVJUX3YyID0gJ2FkZFRvQ2FydCcsXG59XG5cbmV4cG9ydCB7XG4gIEdvb2dsZUFuYWx5dGljc0V2ZW50c1xufSIsImltcG9ydCB7IEN1c3RTZXJ2aWNlQXR0YWNobWVudCwgRm9ybVR5cGUgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyxcbiAgUGFnZVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgVGV4dFJlc3BvbnNlQXR0cmlidXRlcyxcbiAgU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBTZWFyY2hQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZSxcbiAgU2VhcmNoUHJvZHVjdEZpbHRlckF0dHJpYnV0ZXMsXG59IGZyb20gJy4vYXBpL3Jlc3BvbnNlJztcblxuZXhwb3J0IGVudW0gTWVzc2FnZVJvbGUge1xuICBVc2VyID0gJ3VzZXInLFxuICBBc3Npc3RhbnQgPSAnYXNzaXN0YW50Jyxcbn1cblxuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBUZXh0ID0gJ3RleHQnLFxuICBTdWdnZXN0aW9uQ2xpY2tlZCA9ICdzdWdnZXN0aW9uX2NsaWNrZWQnLFxuICBQcm9kdWN0ID0gJ3Byb2R1Y3QnLFxuICBQcm9kdWN0U2VhcmNoID0gJ3Byb2R1Y3Rfc2VhcmNoJyxcbiAgUmV2aWV3ID0gJ3JldmlldycsXG4gIFF1ZXJ5VHlwZWQgPSAncXVlcnlfdHlwZWQnLFxuICBTZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbiAgUGFnZSA9ICdwYWdlJyxcbiAgU2VhcmNoID0gJ3NlYXJjaCcsXG4gIEF0dGFjaG1lbnQgPSAnYXR0YWNobWVudCcsXG4gIENYQWdlbnRSZXNwb25zZSA9ICdjeF9hZ2VudF9yZXNwb25zZScsXG4gIEZvcm0gPSAnZm9ybScsXG4gIE9yZGVyID0gJ29yZGVyJyxcbiAgUHJvZHVjdFNlYXJjaEZpbHRlciA9ICdwcm9kdWN0X3NlYXJjaF9maWx0ZXInLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBpZDogc3RyaW5nO1xuICByb2xlOiBNZXNzYWdlUm9sZTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59ICYgKFxuICB8IFRleHRNZXNzYWdlTWV0YWRhdGFcbiAgfCBRdWVyeVR5cGVkTWV0YWRhdGFcbiAgfCBTdWdnZXN0aW9uTWVzc2FnZU1ldGFkYXRhXG4gIHwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YVxuICB8IFByb2R1Y3RTZWFyY2hNZXNzYWdlTWV0YWRhdGFcbiAgfCBSZXZpZXdNZXNzYWdlTWV0YWRhdGFcbiAgfCBTZXBhcmF0b3JNZXNzYWdlTWV0YWRhdGFcbiAgfCBQYWdlTWVzc2FnZU1ldGFkYXRhXG4gIHwgU2VhcmNoTWVzc2FnZU1ldGFkYXRhXG4gIHwgQXR0YWNobWVudE1ldGFkYXRhXG4gIHwgQ1hBZ2VudFJlc3BvbnNlTWV0YWRhdGFcbiAgfCBGb3JtTWVzc2FnZU1ldGFkYXRhXG4gIHwgT3JkZXJNZXNzYWdlTWV0YWRhdGFcbiAgfCBQcm9kdWN0U2VhcmNoRmlsdGVyTWV0YWRhdGFcbik7XG5cbnR5cGUgQXR0YWNobWVudE1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5BdHRhY2htZW50O1xuICBtZXRhZGF0YToge1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgYXR0YWNobWVudDogQ3VzdFNlcnZpY2VBdHRhY2htZW50W107XG4gIH07XG59O1xuXG50eXBlIENYQWdlbnRSZXNwb25zZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5DWEFnZW50UmVzcG9uc2U7XG4gIG1ldGFkYXRhOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICB9O1xufTtcblxudHlwZSBUZXh0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0O1xuICBtZXRhZGF0YTogVGV4dFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxudHlwZSBRdWVyeVR5cGVkTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQ7XG4gIG1ldGFkYXRhOiBUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFN1Z2dlc3Rpb25NZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkO1xuICBtZXRhZGF0YToge1xuICAgIHN1Z2dlc3Rpb25JZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0O1xuICBtZXRhZGF0YTogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZHVjdFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaDtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgUmV2aWV3TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXc7XG4gIG1ldGFkYXRhOiBSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgU2VwYXJhdG9yTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5TZXBhcmF0b3I7XG59O1xuXG50eXBlIFBhZ2VNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlBhZ2U7XG4gIG1ldGFkYXRhOiBQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoO1xuICBtZXRhZGF0YTogU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFByb2R1Y3RTZWFyY2hGaWx0ZXJNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaEZpbHRlcjtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RGaWx0ZXJBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG5leHBvcnQgdHlwZSBGb3JtRmllbGQgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8vIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHdlIGN1cnJlbnRseSBzdXBwb3J0XG4gIGZvcm1hdD86ICdlbWFpbCc7XG4gIHZhbHVlPzogc3RyaW5nO1xufTtcblxudHlwZSBGb3JtTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtO1xuICBtZXRhZGF0YToge1xuICAgIGZvcm1UeXBlPzogRm9ybVR5cGU7XG4gICAgZmllbGRzOiBGb3JtRmllbGRbXTtcbiAgfTtcbn07XG5cbnR5cGUgT3JkZXJNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyO1xuICBtZXRhZGF0YTogT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG4iLCJleHBvcnQgY29uc3QgT3JnU2hvcnROYW1lID0ge1xuICBDb3RlcmllOiAnY290ZXJpZScsXG4gIEZvckxvdmVBbmRMZW1vbnM6ICdmb3ItbG92ZS1hbmQtbGVtb25zJyxcbiAgR3JlZW5wYW46ICdncmVlbnBhbicsXG4gIEpvcmRhbkNyYWlnOiAnam9yZGFuLWNyYWlnJyxcbiAgTGFycnlBbmRTZXJnZXM6ICdsYXJyeV9hbmRfc2VyZ2VzJyxcbiAgTGVhcHNBbmRSZWJvdW5kczogJ2xlYXBzLWFuZC1yZWJvdW5kcycsXG4gIE1hbnRyYUJyYW5kOiAnbWFudHJhLWJyYW5kJyxcbiAgU3Bhbng6ICdzcGFueCcsXG4gIFNwYW54U3RhZ2luZzogJ3N0YWdpbmctc3BhbngnLFxuICBTdXBlcmdvb3A6ICdzdXBlcmdvb3AnLFxuICBVbmlxdWVWaW50YWdlOiAndW5pcXVlLXZpbnRhZ2UnLFxuICBKYWNrQXJjaGVyOiAnamFjay1hcmNoZXInLFxuICAvKiAtLSBCZWxvdyBpdGVtcyBhcmUgZ2VuZXJhdGVkIGJ5IHBsb3AgLS0gKi9cbiAgU2tpblBlcmZlY3Rpb246ICdza2luLXBlcmZlY3Rpb24nLFxuICBMb29rT3B0aWM6ICdsb29rLW9wdGljJyxcbiAgRml2ZUNiZDogJ2ZpdmUtY2JkJyxcbiAgU25hcFN1cHBsZW1lbnRzOiAnc25hcC1zdXBwbGVtZW50cycsXG4gIExvbmdldml0eXJ4OiAnbG9uZ2V2aXR5cngnLFxuICBWZW5hQ2JkOiAndmVuYS1jYmQnLFxuICBNZWR0ZXJyYTogJ21lZHRlcnJhJyxcbiAgTW9kZWxsczogJ21vZGVsbHMnLFxuICBQcmVzc2VkRmxvcmFsOiAncHJlc3NlZC1mbG9yYWwnLFxuICBLaW5kcmVkQnJhdmVseTogJ2tpbmRyZWQtYnJhdmVseScsXG4gIFdpbmVFbnRodXNpYXN0OiAnd2luZS1lbnRodXNpYXN0JyxcbiAgSG9tZWdyb3duQ2FubmFiaXM6ICdob21lZ3Jvd24tY2FubmFiaXMnLFxuICBEcmVhbWxhbmRCYWJ5OiAnZHJlYW1sYW5kLWJhYnknLFxuICBCYW5kb2xpZXI6ICdiYW5kb2xpZXInLFxuICBXZXN0b25Kb25Cb3VjaGVyOiAnd2VzdG9uLWpvbi1ib3VjaGVyJyxcbiAgS3V0RnJvbVRoZUtsb3RoOiAna3V0LWZyb20tdGhlLWtsb3RoJyxcbiAgR3Jvb3ZlTGlmZTogJ2dyb292ZS1saWZlJyxcbiAgQ2FycGU6ICdjYXJwZScsXG4gIFdvbGZUYWN0aWNhbDogJ3dvbGYtdGFjdGljYWwnLFxuICBXb2xmTWF0dHJlc3M6ICd3b2xmbWF0dHJlc3MnLFxuICBEZWZhdWx0OiAnZGVmYXVsdCcsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IGVudW0gUHJvZHVjdEV4cGVyaW1lbnQge1xuICAvLyBEZWZhdWx0IGlzIG9ubHkgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgZW51bSBpcyBub24tZW1wdHksIG90aGVyd2lzZVxuICAvLyBjYWxsZXJzIHRoYXQgdHJ5IHRvIHVzZSB0aGlzIGVudW0gd2lsbCBnZW5lcmF0ZSBhIHR5cGVzY3JpcHQgZXJyb3JcbiAgRGVmYXVsdCA9ICdkZWZhdWx0Jyxcbn1cbiIsIi8qKlxuICogRW51bSBvZiBhbGwgd2lkZ2V0IG5hbWVzLiBUaGVzZSBhcmUgd2lkZ2V0cyB0aGF0IGFyZSByZW5kZXJlZCBhbmQgaW50ZWdyYXRlZCBpbnRvXG4gKiBhIG1lcmNoYW50J3Mgd2Vic2l0ZS5cbiAqL1xuZXhwb3J0IGVudW0gU3BpZmZ5V2lkZ2V0cyB7XG4gIEltYWdlQmFubmVyID0gJ2ltYWdlX2Jhbm5lcicsXG4gIEltYWdlUHJvbXB0Q2FyZCA9ICdpbWFnZV9wcm9tcHRfY2FyZCcsXG4gIFNpbmdsZUltYWdlUHJvbXB0ID0gJ3NpbmdsZV9pbWFnZV9wcm9tcHQnLFxuICBFbWJlZGRlZFdpZGdldCA9ICdlbWJlZGRlZF93aWRnZXQnLFxuICBGbG9hdGluZ0J1dHRvbiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBTdWdnZXN0aW9uQmFyID0gJ3N1Z2dlc3Rpb25fYmFyJyxcbiAgU2VhcmNoUHJvbXB0ID0gJ3NlYXJjaF9wcm9tcHQnLFxuICBHbG9iYWxTZWFyY2ggPSAnZ2xvYmFsX3NlYXJjaCcsXG4gIFNlYXJjaFJlc3VsdHMgPSAnc2VhcmNoX3Jlc3VsdHMnLFxuICBHbG9iYWxTZWFyY2hFbnRyeVBvaW50ID0gJ2dsb2JhbF9zZWFyY2hfZW50cnlfcG9pbnQnLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBCYXNlRWNvbW1lcmNlRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgYSBiYXNlIEdvb2dsZSBBbmFseXRpY3MgZWNvbW1lcmNlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBkYXRhIFRoZSBldmVudCB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBldmVudCBpcyBhIGJhc2UgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Jhc2VFY29tbWVyY2VFdmVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBCYXNlRWNvbW1lcmNlRXZlbnQgPT5cbiAgZGF0YSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAnZWNvbW1lcmNlJyBpbiBkYXRhICYmXG4gIGRhdGEuZWNvbW1lcmNlICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEuZWNvbW1lcmNlID09PSAnb2JqZWN0JyAmJlxuICAnZXZlbnQnIGluIGRhdGEgJiZcbiAgdHlwZW9mIGRhdGEuZXZlbnQgPT09ICdzdHJpbmcnO1xuIiwiaW1wb3J0IHR5cGUgeyBHQTRFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIEdvb2dsZSBBbmFseXRpY3MgNCBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgR0E0IGVjb21tZXJjZSBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNHQTRFY29tbWVyY2VFdmVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBHQTRFY29tbWVyY2VFdmVudCA9PlxuICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgZGF0YSAhPSBudWxsICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdpdGVtcycgaW4gZGF0YS5lY29tbWVyY2UgJiZcbiAgQXJyYXkuaXNBcnJheShkYXRhLmVjb21tZXJjZS5pdGVtcyk7XG4iLCJpbXBvcnQgdHlwZSB7IFVBRWNvbW1lcmNlRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgYSBsZWdhY3kgVW5pdmVyc2FsIEFuYWx5dGljcyBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgbGVnYWN5IFVBIGVjb21tZXJjZSBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFVBRWNvbW1lcmNlRXZlbnQgPT5cbiAgZGF0YSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICAnZWNvbW1lcmNlJyBpbiBkYXRhICYmXG4gIGRhdGEuZWNvbW1lcmNlICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEuZWNvbW1lcmNlID09PSAnb2JqZWN0JyAmJlxuICAnYWRkJyBpbiBkYXRhLmVjb21tZXJjZSAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UuYWRkID09PSAnb2JqZWN0JztcbiIsImludGVyZmFjZSBNb2JpbGVQbHBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIHtcbiAgcm93X2luZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgTW9iaWxlUGxwQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgJ3Jvd19pbmRleCcgaW4gdmFsdWUgJiZcbiAgdHlwZW9mIHZhbHVlLnJvd19pbmRleCA9PT0gJ251bWJlcic7XG4iLCJpbXBvcnQgeyBTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciB9IGZyb20gJy4uL3NwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyJztcblxuZXhwb3J0IGNvbnN0IGlzU3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXIgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciA9PlxuICB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ3RleHQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50ZXh0ID09PSAnc3RyaW5nJzsiLCJpbXBvcnQgeyBQYWdlVmlzaXRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBQRFBWYXJpYW50SW5mbywgUExQVmFyaWFudEluZm8sIFBhZ2VWaXNpdFZhcmlhbnRJbmZvLCBWYXJpYW50SW5mbyB9IGZyb20gJy4uL3ZhcmlhbnRJbmZvJztcblxuY29uc3QgaXNQRFBWYXJpYW50SW5mbyA9ICh2YXJpYW50SW5mbzogb2JqZWN0KTogdmFyaWFudEluZm8gaXMgUERQVmFyaWFudEluZm8gPT5cbiAgJ3ZhcmlhbnQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHZhcmlhbnRJbmZvLnZhcmlhbnQgPT09ICdwZHAnICYmXG4gICdwcm9kdWN0SWQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby5wcm9kdWN0SWQgPT09ICdzdHJpbmcnO1xuXG5jb25zdCBpc1BMUFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQTFBWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BscCcgJiZcbiAgJ3BscElkJyBpbiB2YXJpYW50SW5mbyAmJlxuICB0eXBlb2YgdmFyaWFudEluZm8ucGxwSWQgPT09ICdzdHJpbmcnO1xuXG5jb25zdCBpc1BhZ2VWaXNpdFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQYWdlVmlzaXRWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BhZ2VfdmlzaXQnICYmXG4gICd1cmwnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby51cmwgPT09ICdzdHJpbmcnICYmXG4gICdwYWdlVmlzaXRDYXRlZ29yeScgaW4gdmFyaWFudEluZm8gJiZcbiAgT2JqZWN0LnZhbHVlcyhQYWdlVmlzaXRDYXRlZ29yeSkuaW5jbHVkZXModmFyaWFudEluZm8ucGFnZVZpc2l0Q2F0ZWdvcnkgYXMgUGFnZVZpc2l0Q2F0ZWdvcnkpO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgVmFyaWFudEluZm8uXG4gKlxuICogQHBhcmFtIHZhcmlhbnRJbmZvIC0gVGhlIHVua25vd24gb2JqZWN0IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGEgaXMgYSB2YWxpZCBWYXJpYW50SW5mbyBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IHVua25vd24pOiB2YXJpYW50SW5mbyBpcyBWYXJpYW50SW5mbyA9PlxuICB2YXJpYW50SW5mbyAhPSBudWxsICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mbyA9PT0gJ29iamVjdCcgJiZcbiAgJ3ZhcmlhbnRJZCcgaW4gdmFyaWFudEluZm8gJiZcbiAgKGlzUERQVmFyaWFudEluZm8odmFyaWFudEluZm8pIHx8XG4gICAgaXNQTFBWYXJpYW50SW5mbyh2YXJpYW50SW5mbykgfHxcbiAgICBpc1BhZ2VWaXNpdFZhcmlhbnRJbmZvKHZhcmlhbnRJbmZvKSk7XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBGb3JtVHlwZSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIHRoZSBwcm92aWRlZCBkYXRhIGhhcyB0aGUgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzICh3aXRoIHRoZSBjb3JyZWN0IHR5cGVzKSBvZlxuICogYSBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVcbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZGF0YSBoYXMgdGhlIGNvcnJlY3QgcHJvcGVydGllcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGRhdGEgaXMgbnVsbCBvciBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZm9ybV9jYXRlZ29yeScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5mb3JtX2NhdGVnb3J5ICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBmb3JtX2NhdGVnb3J5IGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmb3JtX2NhdGVnb3J5JyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmZvcm1fY2F0ZWdvcnkgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKFxuICAgICAgIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEuZm9ybV9jYXRlZ29yeSwgJ2Zvcm1fdHlwZScsICdzdHJpbmcnKSB8fFxuICAgICAgIU9iamVjdC52YWx1ZXMoRm9ybVR5cGUpLmluY2x1ZGVzKGRhdGEuZm9ybV9jYXRlZ29yeS5mb3JtX3R5cGUgYXMgRm9ybVR5cGUpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGZvcm1fdHlwZSBpcyBtaXNzaW5nIG9yIG5vdCBhIHZhbGlkIGZvcm0gdHlwZScsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ3NjaGVtYScsICdvYmplY3QnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBzY2hlbWEgaXMgbWlzc2luZyBvciBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRPRE86IGFsc28gd2FubmEgdmFsaWRhdGUgdGhlIGZpZWxkcyBvZiBkYXRhLnNjaGVtYS5wcm9wZXJ0aWVzIGJ1dCBtaWdodCB3YW5uYSBjaGFuZ2UgdGhlIHNjaGVtYVxuICAvLyB0byBub3QgaGF2ZSB0aGUgcHJvcGVydHkgbmFtZSBhcyBhIGtleSBpbiB0aGUgb2JqZWN0XG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5zY2hlbWEsICdwcm9wZXJ0aWVzJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnByb3BlcnRpZXMgaXMgbWlzc2luZyBvciBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEuc2NoZW1hLCAncmVxdWlyZWQnLCAnYXJyYXknKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYS5yZXF1aXJlZCBpcyBtaXNzaW5nIG9yIG5vdCBhbiBhcnJheScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhZGF0YS5zY2hlbWEucmVxdWlyZWQuZXZlcnkoXG4gICAgICAoa2V5OiB1bmtub3duKSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgaW4gZGF0YS5zY2hlbWEucHJvcGVydGllcyxcbiAgICApXG4gICkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYS5yZXF1aXJlZCBjb250YWlucyBpbnZhbGlkIHByb3BlcnR5IGtleXMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEZvcm1TdWJtaXR0ZWRBdHRyaWJ1dGVzLCBGb3JtVHlwZSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGlzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgRm9ybVN1Ym1pdHRlZEF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJywgJ2RhdGEgaXMgbnVsbCBvciBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZmlsbGVkX3NjaGVtYScsICdvYmplY3QnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJywgJ2ZpbGxlZF9zY2hlbWEgaXMgbm90IGFuIG9iamVjdCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2Zvcm1fcmVzcG9uc2VfaWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJyxcbiAgICAgICdmb3JtX3Jlc3BvbnNlX2lkIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2Zvcm1fdHlwZScgaW4gZGF0YSkgfHwgIU9iamVjdC52YWx1ZXMoRm9ybVR5cGUpLmluY2x1ZGVzKGRhdGEuZm9ybV90eXBlIGFzIEZvcm1UeXBlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLFxuICAgICAgJ2Zvcm1fdHlwZSBpcyBub3QgYSB2YWxpZCBmb3JtIHR5cGUgZW51bScsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHsgT3JkZXJJdGVtSW5mbywgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgaGFzUHJvcGVydHlPZlR5cGUgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy91dGlscyc7XG5cbi8vIHRoZSBjbGllbnQgU0RLIGdlbmVyYXRlcyBkYXRlLXRpbWUgZm9ybWF0IHR5cGVzIGFzIGBEYXRlYCBidXQgdGhlIG9wZW5hcGkgdHlwZXNjcmlwdCBnZW5lcmF0b3Jcbi8vIGRvZXMgbm90IGNvcnJlY3RseSBkZXNlcmlhbGl6ZSBkYXRlLXRpbWUgdmFsdWVzIHNvIHRoZXkgYXJlIGFsd2F5cyBgc3RyaW5nYCBhdCBydW50aW1lIGluc3RlYWQgb2Zcbi8vIGBEYXRlYCBvYmplY3RzLiBUaGVzZSBpbnRlcmZhY2VzIG92ZXJyaWRlIHRoZSBTREsgdHlwZXMgc28gdGhhdCB3ZSBjYW4gdmFsaWRhdGUgYWdhaW5zdCB0aGUgYWN0dWFsXG4vLyBgc3RyaW5nYCB2YWx1ZXMuIGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IvaXNzdWVzLzkyNlxuZXhwb3J0IGludGVyZmFjZSBBcGlPcmRlckl0ZW1JbmZvXG4gIGV4dGVuZHMgT21pdDxPcmRlckl0ZW1JbmZvLCAnZGVsaXZlcmVkX2F0JyB8ICdlc3RpbWF0ZWRfZGVsaXZlcnlfYXQnIHwgJ2luX3RyYW5zaXRfYXQnPiB7XG4gIGRlbGl2ZXJlZF9hdD86IHN0cmluZztcbiAgZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0Pzogc3RyaW5nO1xuICBpbl90cmFuc2l0X2F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzXG4gIGV4dGVuZHMgT21pdDxPcmRlclJlc3BvbnNlQXR0cmlidXRlcywgJ2NyZWF0ZWRfYXQnIHwgJ2xhdGVzdF9ldmVudF9kYXRlJyB8ICdsaW5lX2l0ZW1zJz4ge1xuICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gIGxhdGVzdF9ldmVudF9kYXRlOiBzdHJpbmc7XG4gIGxpbmVfaXRlbXM6IEFwaU9yZGVySXRlbUluZm9bXTtcbn1cblxuY29uc3QgaXNBcGlPcmRlckl0ZW1JbmZvID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZGVySXRlbUluZm8gPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGJlIGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX2l0ZW1faWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIG9yZGVyX2l0ZW1faWQgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpdGVtX3RpdGxlJywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgaGF2ZSBhbiBpdGVtX3RpdGxlIHByb3BlcnR5JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaXRlbV9wcmljZScsICdudW1iZXInKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gaXRlbV9wcmljZSBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2l0ZW1fcXVhbnRpdHknLCAnbnVtYmVyJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIGl0ZW1fcXVhbnRpdHkgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpbWFnZScsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5pbWFnZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdmdWxmaWxsbWVudF9kaXNwbGF5X3N0YXR1cycsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlckl0ZW1JbmZvLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAndHJhY2tpbmdfdXJsJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLnRyYWNraW5nX3VybCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdkZWxpdmVyZWRfYXQnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8uZGVsaXZlcmVkX2F0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2VzdGltYXRlZF9kZWxpdmVyeV9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5lc3RpbWF0ZWRfZGVsaXZlcnlfYXQgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2luX3RyYW5zaXRfYXQnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8uaW5fdHJhbnNpdF9hdCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBiZSBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdjcmVhdGVkX2F0JywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY3JlYXRlZF9hdCBwcm9wZXJ0eSBhbmQgaGF2ZSB0eXBlIHN0cmluZycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnbGF0ZXN0X2V2ZW50X2RhdGUnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBsYXRlc3RfZXZlbnRfZGF0ZSBwcm9wZXJ0eSBhbmQgaGF2ZSB0eXBlIHN0cmluZycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnbGluZV9pdGVtcycsICdhcnJheScpIHx8XG4gICAgIWRhdGEubGluZV9pdGVtcy5ldmVyeSgoaXRlbTogdW5rbm93bikgPT4gaXNBcGlPcmRlckl0ZW1JbmZvKGl0ZW0pKVxuICApIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBsaW5lX2l0ZW1zIHByb3BlcnR5IHdpdGggYXQgbGVhc3Qgb25lIG9yZGVyIGl0ZW0nLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX2lkJywgJ3N0cmluZycpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVyIHJlc3BvbnNlIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGFuIG9yZGVyX2lkIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdvcmRlcl9udW1iZXInLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYW4gb3JkZXJfbnVtYmVyIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuXG4vLyB0aGUgXCJjb25maWdcIiBwcm9wZXJ0eSBpcyBhIGdlbmVyaWMgb2JqZWN0IGluIHRoZSBjb21tZXJjZSBhcGkgc3BlYywgdGhlc2UgaW50ZXJmYWNlc1xuLy8gYXJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHN0cnVjdHVyZSBvZiB0aGF0IG9iamVjdCBhbmQgdG8gdHJhbnNmb3JtIHRoZSBhcGkgcmVzcG9uc2Vcbi8vIGludG8gYSB0eXBlZCBvYmplY3QgZm9yIHRoZSBmcm9udGVuZC4gRG8gbm90IHVzZSB0aGVzZSBpbnRlcmZhY2VzIGZvciBhbnl0aGluZyBlbHNlLlxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSB7XG4gIHNlc3Npb25fcmVwbGF5X2VuYWJsZWQ6IGJvb2xlYW47XG4gIHNlc3Npb25fcmVwbGF5X3NhbXBsZV9yYXRlOiBudW1iZXI7XG4gIHRyYWNraW5nX2VuYWJsZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2Uge1xuICBwcm92aWRlcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzIHtcbiAgbWVhc3VyZW1lbnRfaWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZyB7XG4gIGFtcGxpdHVkZT86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTtcbiAgY3VzdG9tZXJfc2VydmljZT86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZTtcbiAgZ29vZ2xlX2FuYWx5dGljcz86IEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlPcmdhbml6YXRpb25Db25maWcgZXh0ZW5kcyBPcmdhbml6YXRpb25Db25maWcge1xuICBjb25maWc6IEFwaU9yZ0FuYWx5dGljc0NvbmZpZztcbn1cblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGUgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Nlc3Npb25fcmVwbGF5X2VuYWJsZWQnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnNlc3Npb25fcmVwbGF5X2VuYWJsZWQgIT09ICdib29sZWFuJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCBpcyBub3QgYSBib29sZWFuJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUgIT09ICdudW1iZXInXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZTogc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUgaXMgbm90IGEgbnVtYmVyJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgndHJhY2tpbmdfZW5hYmxlZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEudHJhY2tpbmdfZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiB0cmFja2luZ19lbmFibGVkIGlzIG5vdCBhIGJvb2xlYW4nLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2UgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdwcm92aWRlcicgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEucHJvdmlkZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlOiBwcm92aWRlciBpcyBub3QgYSBzdHJpbmcnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3MgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdtZWFzdXJlbWVudF9pZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEubWVhc3VyZW1lbnRfaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzOiBtZWFzdXJlbWVudF9pZCBpcyBub3QgYSBzdHJpbmcnLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmNvbnN0IGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0FuYWx5dGljc0NvbmZpZyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdhbXBsaXR1ZGUnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGUoZGF0YS5hbXBsaXR1ZGUpXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdBbmFseXRpY3NDb25maWc6IGFtcGxpdHVkZSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdjdXN0b21lcl9zZXJ2aWNlJyBpbiBkYXRhICYmXG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlKGRhdGEuY3VzdG9tZXJfc2VydmljZSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogY3VzdG9tZXJfc2VydmljZSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdnb29nbGVfYW5hbHl0aWNzJyBpbiBkYXRhICYmXG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzKGRhdGEuZ29vZ2xlX2FuYWx5dGljcylcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogZ29vZ2xlX2FuYWx5dGljcyBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpT3JnYW5pemF0aW9uQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ2FuaXphdGlvbkNvbmZpZyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2NyZWF0ZWRfYXQnIGluIGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogY3JlYXRlZF9hdCBpcyBub3QgZGVmaW5lZCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCduYW1lc3BhY2UnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLm5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBuYW1lc3BhY2UgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lzX2xhdGVzdCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuaXNfbGF0ZXN0ICE9PSAnYm9vbGVhbicpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBpc19sYXRlc3QgaXMgbm90IGEgYm9vbGVhbicsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCd2ZXJzaW9uJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS52ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IHZlcnNpb24gaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3VwZGF0ZWRfYXQnIGluIGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogdXBkYXRlZF9hdCBpcyBub3QgZGVmaW5lZCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdjb25maWcnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuY29uZmlnICE9PSAnb2JqZWN0JyB8fFxuICAgICFpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZyhkYXRhLmNvbmZpZylcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogY29uZmlnIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ29yZ2FuaXphdGlvbl9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5vcmdhbml6YXRpb25faWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogb3JnYW5pemF0aW9uX2lkIGlzIG5vdCBhIHN0cmluZycsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnaWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogaWQgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHtcbiAgU3RhdHNpZ0V4cGVyaW1lbnQgYXMgQXBpT3JnQ29uZmlnRXhwZXJpbWVudCxcbiAgU3RhdHNpZ0ZlYXR1cmVHYXRlIGFzIEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlLFxuICBPcmdhbml6YXRpb25TZXR0aW5ncyBhcyBBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyxcbiAgT3JnYW5pemF0aW9uIGFzIEFwaU9yZ2FuaXphdGlvbixcbiAgT3JnYW5pemF0aW9uU3RhdHVzRW51bSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IEFwaU9yZ2FuaXphdGlvbkNvbmZpZywgaXNBcGlPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICcuL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnJztcblxuaW50ZXJmYWNlIEFwaU9yZ0NvbmZpZ1Jlc3VsdHMge1xuICBjb25maWdzOiBBcGlPcmdhbml6YXRpb25Db25maWdbXTtcbiAgZXhwZXJpbWVudHM6IEFwaU9yZ0NvbmZpZ0V4cGVyaW1lbnRbXTtcbiAgZ2F0ZXM6IEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlW107XG4gIG9yZzogQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3M7XG59XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudCA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBBcGlPcmdDb25maWdFeHBlcmltZW50ID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZ3JvdXAnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuZ3JvdXAgIT09ICdzdHJpbmcnICYmIGRhdGEuZ3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IGdyb3VwIGlzIG5vdCBhIHN0cmluZyBvciB1bmRlZmluZWQnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAnZ3JvdXBfbmFtZScgaW4gZGF0YSAmJlxuICAgIHR5cGVvZiBkYXRhLmdyb3VwX25hbWUgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS5ncm91cF9uYW1lICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IGdyb3VwX25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnbmFtZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyAmJiBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBuYW1lIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3J1bGVfaWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEucnVsZV9pZCAhPT0gJ3N0cmluZycgJiYgZGF0YS5ydWxlX2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogcnVsZV9pZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS52YWx1ZSAhPT0gJ29iamVjdCcgJiYgZGF0YS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IHZhbHVlIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGU6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ25hbWUnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEubmFtZSAhPT0gJ3N0cmluZycgJiYgZGF0YS5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGU6IG5hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgncnVsZV9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ydWxlX2lkICE9PSAnc3RyaW5nJyAmJiBkYXRhLnJ1bGVfaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogcnVsZV9pZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCd2YWx1ZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS52YWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIGRhdGEudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogdmFsdWUgaXMgbm90IGEgYm9vbGVhbicsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnYW5pemF0aW9uID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ2FuaXphdGlvbiA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdpZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogaWQgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdkaXNwbGF5X25hbWUnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmRpc3BsYXlfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkaXNwbGF5X25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdkb21haW4nIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmRvbWFpbiAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkb21haW4gaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdzaG9ydF9uYW1lJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5zaG9ydF9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHNob3J0X25hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdzdGF0dXMnIGluIGRhdGEpIHx8XG4gICAgIU9iamVjdC52YWx1ZXMoT3JnYW5pemF0aW9uU3RhdHVzRW51bSkuaW5jbHVkZXMoZGF0YS5zdGF0dXMgYXMgT3JnYW5pemF0aW9uU3RhdHVzRW51bSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBzdGF0dXMgaXMgbm90IGEgdmFsaWQgT3JnYW5pemF0aW9uU3RhdHVzRW51bSB2YWx1ZScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdjcmVhdGVkX2F0JyBpbiBkYXRhICYmXG4gICAgIShkYXRhLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgIHR5cGVvZiBkYXRhLmNyZWF0ZWRfYXQgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS5jcmVhdGVkX2F0ICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogY3JlYXRlZF9hdCBpcyBub3QgYSBEYXRlJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAndXBkYXRlZF9hdCcgaW4gZGF0YSAmJlxuICAgICEoZGF0YS51cGRhdGVkX2F0IGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICB0eXBlb2YgZGF0YS51cGRhdGVkX2F0ICE9PSAnc3RyaW5nJyAmJlxuICAgIGRhdGEudXBkYXRlZF9hdCAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHVwZGF0ZWRfYXQgaXMgbm90IGEgRGF0ZScsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MgPSAoXG4gIGRhdGE6IHVua25vd24sXG4pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5nczogZGF0YSBpcyBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnb3JnJyBpbiBkYXRhKSB8fCAhaXNBcGlPcmdhbml6YXRpb24oZGF0YS5vcmcpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3M6IG9yZyBpcyBub3QgYW4gb2JqZWN0JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBza2lwIHZhbGlkYXRpb24gZm9yICdzZXR0aW5ncycgZm9yIG5vd1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgUmVxdWlyZWQ8QXBpT3JnQ29uZmlnUmVzdWx0cz4gPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2NvbmZpZ3MnIGluIGRhdGEpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoZGF0YS5jb25maWdzKSB8fFxuICAgICFkYXRhLmNvbmZpZ3MuZXZlcnkoKGNvbmZpZykgPT4gaXNBcGlPcmdhbml6YXRpb25Db25maWcoY29uZmlnKSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGNvbmZpZ3MgaXMgbm90IGFuIGFycmF5JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAnZXhwZXJpbWVudHMnIGluIGRhdGEgJiZcbiAgICBkYXRhLmV4cGVyaW1lbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoZGF0YS5leHBlcmltZW50cykgfHxcbiAgICAgICFkYXRhLmV4cGVyaW1lbnRzLmV2ZXJ5KChleHApID0+IGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudChleHApKSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogZXhwZXJpbWVudHMgaXMgbm90IGFuIGFycmF5IG9yIGNvbnRhaW5zIGludmFsaWQgaXRlbXMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdnYXRlcycgaW4gZGF0YSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmdhdGVzKSB8fFxuICAgICFkYXRhLmdhdGVzLmV2ZXJ5KChnYXRlKSA9PiBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlKGdhdGUpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBnYXRlcyBpcyBub3QgYW4gYXJyYXkgb3IgY29udGFpbnMgaW52YWxpZCBpdGVtcycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ29yZycgaW4gZGF0YSkgfHwgIWlzQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MoZGF0YS5vcmcpKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogb3JnIGlzIG5vdCBhbiBvYmplY3Qgb3IgaGFzIGludmFsaWQgZmllbGRzJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgeyBBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIEFwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgPT4ge1xuICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3RpdGxlJyBpbiBvYmogJiYgb2JqLnRpdGxlICE9IG51bGwgJiYgdHlwZW9mIG9iai50aXRsZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2Rlc2NyaXB0aW9uJyBpbiBvYmogJiYgdHlwZW9mIG9iai5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3VybCcgaW4gb2JqICYmIHR5cGVvZiBvYmoudXJsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7XG4gIFBMUEF0dHJpYnV0ZUNhdGVnb3J5LFxuICBQTFBBdHRyaWJ1dGVzLFxuICBQTFBJZEF0dHJpYnV0ZXMsXG59IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBMUElkQXR0cmlidXRlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFBMUElkQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0FwaVBMUEV2ZW50QXR0cmlidXRlcyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBQTFBBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnY2F0ZWdvcnknIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuY2F0ZWdvcnkgIT09ICdzdHJpbmcnIHx8XG4gICAgIU9iamVjdC52YWx1ZXMoUExQQXR0cmlidXRlQ2F0ZWdvcnkpLmluY2x1ZGVzKGRhdGEuY2F0ZWdvcnkgYXMgUExQQXR0cmlidXRlQ2F0ZWdvcnkpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdhdHRyaWJ1dGVzJyBpbiBkYXRhKSB8fFxuICAgIHR5cGVvZiBkYXRhLmF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8XG4gICAgIWlzQXBpUExQSWRBdHRyaWJ1dGUoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgeyBQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyA9IChcbiAgYXR0cmlidXRlczogdW5rbm93bixcbik6IGF0dHJpYnV0ZXMgaXMgUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgdHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmaWx0ZXJfbmFtZScgaW4gYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcy5maWx0ZXJfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBHZXRNZXJjaGFudENvbG9yc1F1ZXJ5RGF0YSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3JhcGhxbCc7XG5cbmNvbnN0IFJFUVVJUkVEX0NPTE9SX0ZJRUxEUyA9IFtcbiAgJ2FjY2VudF9wcmltYXJ5JyxcbiAgJ2FjY2VudF9zZWNvbmRhcnknLFxuICAnYmFja2dyb3VuZF9kYXJrJyxcbiAgJ2JhY2tncm91bmRfbGlnaHQnLFxuICAnYmFja2dyb3VuZF9wcmltYXJ5JyxcbiAgJ2JhY2tncm91bmRfc2F0dXJhdGVkJyxcbiAgJ2JhY2tncm91bmRfc2Vjb25kYXJ5JyxcbiAgJ2JhY2tncm91bmRfc2Vjb25kYXJ5X2RhcmsnLFxuICAnYmFja2dyb3VuZF90ZXJ0aWFyeScsXG4gICdib3JkZXJfZGFyaycsXG4gICdib3JkZXJfbGlnaHQnLFxuICAnYm9yZGVyX21lZGl1bScsXG4gICdib3JkZXJfb3V0bGluZScsXG4gICd0ZXh0X2FjY2VudCcsXG4gICd0ZXh0X2xpZ2h0JyxcbiAgJ3RleHRfbGluaycsXG4gICd0ZXh0X3ByaW1hcnknLFxuICAndGV4dF9zZWNvbmRhcnknLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGlzR3JhcGhRTENvbG9yc0NvbmZpZyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBHZXRNZXJjaGFudENvbG9yc1F1ZXJ5RGF0YSA9PiB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgIExvZ2dlci5sb2dFcnJvcignSW52YWxpZCBncmFwaHFsIHJlc3BvbnNlIGZvciBjb2xvcnMgY29uZmlnJywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgZWFjaCByZXF1aXJlZCBmaWVsZFxuICBjb25zdCBtaXNzaW5nRmllbGRzID0gUkVRVUlSRURfQ09MT1JfRklFTERTLmZpbHRlcihcbiAgICAoZmllbGQpID0+ICEoZmllbGQgaW4gZGF0YSkgfHwgdHlwZW9mIChkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtmaWVsZF0gIT09ICdzdHJpbmcnLFxuICApO1xuXG4gIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA9PT0gUkVRVUlSRURfQ09MT1JfRklFTERTLmxlbmd0aCkge1xuICAgIExvZ2dlci5sb2dFcnJvcignQWxsIGNvbG9yIGZpZWxkcyBhcmUgbWlzc2luZyBvciBudWxsJywgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobWlzc2luZ0ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgY29sb3IgZmllbGRzJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgICAgbWlzc2luZ0ZpZWxkcyxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvKipcbiAqIEdlbmVyaWMgdXRpbGl0eSB0byB0cmFuc2Zvcm0gc25ha2VfY2FzZSBvYmplY3Qga2V5cyB0byBjYW1lbENhc2UgYXQgcnVudGltZS5cbiAqIFRoaXMgaXMgdGhlIHJ1bnRpbWUgZXF1aXZhbGVudCBvZiB0aGUgQ2FtZWxDYXNlZFByb3BlcnRpZXNEZWVwIHR5cGUgdXRpbGl0eS5cbiAqL1xuXG4vLyBMaXN0IG9mIGFjcm9ueW1zIHRoYXQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcyB1cHBlcmNhc2UgaW4gY2FtZWxDYXNlIGFuZCBsb3dlcmNhc2UgaW4gc25ha2VfY2FzZVxuY29uc3QgUFJFU0VSVkVEX0FDUk9OWU1TID0gW1wiUExQXCIsIFwiUERQXCIsIFwiU1ZHXCJdO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc25ha2VfY2FzZSBzdHJpbmcgdG8gY2FtZWxDYXNlXG4gKiBIYW5kbGVzIHNwZWNpZmljIGFjcm9ueW1zIGxpa2UgUExQIGFuZCBQRFAgY29ycmVjdGx5XG4gKi9cbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gUHJlLXByb2Nlc3M6IGNvbnZlcnQgYWxsIHdvcmRzIHRoYXQgbWF0Y2ggdGhlIFBSRVNFUlZFRF9BQ1JPTllNUyByZWdleCB0byB1cHBlcmNhc2VcbiAgbGV0IHByb2Nlc3NlZFN0ciA9IHN0cjtcbiAgZm9yIChjb25zdCBhY3JvbnltIG9mIFBSRVNFUlZFRF9BQ1JPTllNUykge1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXyR7YWNyb255bX1fP2AsIFwiZ2lcIik7XG5cbiAgICBpZiAocHJvY2Vzc2VkU3RyLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgcHJvY2Vzc2VkU3RyID0gcHJvY2Vzc2VkU3RyLnJlcGxhY2UocmVnZXgsICh2KSA9PlxuICAgICAgICB2LmVuZHNXaXRoKFwiX1wiKSA/IGAke2Fjcm9ueW19X2AgOiBgJHthY3JvbnltfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWRTdHIucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGxldHRlcikgPT4gbGV0dGVyLnRvVXBwZXJDYXNlKCkpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNhbWVsQ2FzZSBzdHJpbmcgdG8gc25ha2VfY2FzZVxuICogSGFuZGxlcyBjb25zZWN1dGl2ZSBjYXBpdGFsIGxldHRlcnMgY29ycmVjdGx5IChlLmcuLCBcIlBEUFwiIC0+IFwicGRwXCIsIG5vdCBcInBfZF9wXCIpXG4gKiBQcmVzZXJ2ZXMgc3BlY2lmaWMgYWNyb255bXMgbGlrZSBQTFAgYW5kIFBEUCBhcyBsb3dlcmNhc2UgaW4gc25ha2VfY2FzZVxuICovXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyXG4gICAgLnJlcGxhY2UoLyhbQS1aXSkoPz1bYS16XSkvZywgXCJfJDFcIilcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL15fLywgXCJcIik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdHJhbnNmb3JtcyBhbGwgb2JqZWN0IGtleXMgZnJvbSBzbmFrZV9jYXNlIHRvIGNhbWVsQ2FzZVxuICovXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtU25ha2VUb0NhbWVsID0gKG9iajogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLm1hcCgodmFsKSA9PiB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwodmFsKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IGNhbWVsS2V5ID0gdG9DYW1lbENhc2Uoa2V5KTtcbiAgICAgIHJlc3VsdFtjYW1lbEtleV0gPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmFuc2Zvcm1zIGFsbCBvYmplY3Qga2V5cyBmcm9tIGNhbWVsQ2FzZSB0byBzbmFrZV9jYXNlXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1DYW1lbFRvU25ha2UgPSAob2JqOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKHRyYW5zZm9ybUNhbWVsVG9TbmFrZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGNvbnN0IHNuYWtlS2V5ID0gdG9TbmFrZUNhc2Uoa2V5KTtcbiAgICAgIHJlc3VsdFtzbmFrZUtleV0gPSB0cmFuc2Zvcm1DYW1lbFRvU25ha2UodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcbiIsImltcG9ydCB7IEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgZW51bSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc3RhdHVzIC0gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgZW51bSB2YWx1ZSBvciB1bmRlZmluZWQgaWYgdGhlIHN0cmluZ1xuICogZG9lcyBub3QgbWFwIHRvIGEgdmFsaWQgZW51bVxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUgPSAoXG4gIHN0YXR1czogc3RyaW5nLFxuKTogRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzIHwgdW5kZWZpbmVkID0+IHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlICdBVFRFTVBURURfREVMSVZFUlknOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5BVFRFTVBURURfREVMSVZFUlk7XG4gICAgY2FzZSAnQ0FOQ0VMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5DQU5DRUxFRDtcbiAgICBjYXNlICdDT05GSVJNRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5DT05GSVJNRUQ7XG4gICAgY2FzZSAnREVMSVZFUkVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuREVMSVZFUkVEO1xuICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5GQUlMVVJFO1xuICAgIGNhc2UgJ0ZVTEZJTExFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkZVTEZJTExFRDtcbiAgICBjYXNlICdJTl9UUkFOU0lUJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuSU5fVFJBTlNJVDtcbiAgICBjYXNlICdMQUJFTF9QUklOVEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuTEFCRUxfUFJJTlRFRDtcbiAgICBjYXNlICdMQUJFTF9QVVJDSEFTRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9QVVJDSEFTRUQ7XG4gICAgY2FzZSAnTEFCRUxfVk9JREVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuTEFCRUxfVk9JREVEO1xuICAgIGNhc2UgJ01BUktFRF9BU19GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5NQVJLRURfQVNfRlVMRklMTEVEO1xuICAgIGNhc2UgJ05PVF9ERUxJVkVSRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5OT1RfREVMSVZFUkVEO1xuICAgIGNhc2UgJ09VVF9GT1JfREVMSVZFUlknOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PVVRfRk9SX0RFTElWRVJZO1xuICAgIGNhc2UgJ1BJQ0tFRF9VUCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlBJQ0tFRF9VUDtcbiAgICBjYXNlICdSRUFEWV9GT1JfUElDS1VQJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUkVBRFlfRk9SX1BJQ0tVUDtcbiAgICBjYXNlICdTVUJNSVRURUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5TVUJNSVRURUQ7XG4gICAgY2FzZSAnSU5fUFJPR1JFU1MnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5JTl9QUk9HUkVTUztcbiAgICBjYXNlICdPTl9IT0xEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuT05fSE9MRDtcbiAgICBjYXNlICdPUEVOJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuT1BFTjtcbiAgICBjYXNlICdQQVJUSUFMTFlfRlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUEFSVElBTExZX0ZVTEZJTExFRDtcbiAgICBjYXNlICdQRU5ESU5HX0ZVTEZJTExNRU5UJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUEVORElOR19GVUxGSUxMTUVOVDtcbiAgICBjYXNlICdSRVFVRVNUX0RFQ0xJTkVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUkVRVUVTVF9ERUNMSU5FRDtcbiAgICBjYXNlICdSRVNUT0NLRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRVNUT0NLRUQ7XG4gICAgY2FzZSAnU0NIRURVTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuU0NIRURVTEVEO1xuICAgIGNhc2UgJ1VORlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuVU5GVUxGSUxMRUQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBDb2xvck1hcHBpbmcsIENvbG9yTmFtZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9jb2xvcnNDb25maWdcIjtcbmltcG9ydCB7IGlzR3JhcGhRTENvbG9yc0NvbmZpZyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9ncmFwaFFML2lzR3JhcGhRTENvbG9yc0NvbmZpZ1wiO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVHcmFwaFFMQ29sb3JzQ29uZmlnID0gKFxuICBkYXRhOiB1bmtub3duXG4pOiBDb2xvck1hcHBpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzR3JhcGhRTENvbG9yc0NvbmZpZyhkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJlbnVtIERPTUluc2VydGlvblR5cGUge1xuICBBRlRFUiA9IFwiYWZ0ZXJcIixcbiAgQkVGT1JFID0gXCJiZWZvcmVcIixcbiAgQURKQUNFTlRfQUZURVJfQkVHSU4gPSBcImFkamFjZW50LWFmdGVyLWJlZ2luXCIsXG4gIEFESkFDRU5UX0JFRk9SRV9CRUdJTiA9IFwiYWRqYWNlbnQtYmVmb3JlLWJlZ2luXCIsXG4gIEFESkFDRU5UX0FGVEVSX0VORCA9IFwiYWRqYWNlbnQtYWZ0ZXItZW5kXCIsXG4gIEFESkFDRU5UX0JFRk9SRV9FTkQgPSBcImFkamFjZW50LWJlZm9yZS1lbmRcIixcbiAgQVBQRU5EX0NISUxEID0gXCJhcHBlbmQtY2hpbGRcIixcbiAgTk9ORSA9IFwibm9uZVwiLFxufVxuXG5leHBvcnQgY29uc3QgRE9NSW5zZXJ0aW9uVHlwZVRvSW5zZXJ0UG9zaXRpb24gPSAoXG4gIHR5cGU6IERPTUluc2VydGlvblR5cGVcbik6IEluc2VydFBvc2l0aW9uID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0FGVEVSX0JFR0lOOlxuICAgICAgcmV0dXJuIFwiYWZ0ZXJiZWdpblwiO1xuICAgIGNhc2UgRE9NSW5zZXJ0aW9uVHlwZS5CRUZPUkU6XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0JFRk9SRV9CRUdJTjpcbiAgICAgIHJldHVybiBcImJlZm9yZWJlZ2luXCI7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0JFRk9SRV9FTkQ6XG4gICAgICByZXR1cm4gXCJiZWZvcmVlbmRcIjtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQUZURVI6XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkFESkFDRU5UX0FGVEVSX0VORDpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiYWZ0ZXJlbmRcIjtcbiAgfVxufTtcblxuZXhwb3J0IHsgRE9NSW5zZXJ0aW9uVHlwZSB9O1xuIiwiZW51bSBHcmlkSW5zZXJ0aW9uVHlwZSB7XG4gIEZJWEVEXzEgPSBcImZpeGVkLTFcIixcbiAgRklYRURfMiA9IFwiZml4ZWQtMlwiLFxuICBGSVhFRF8zID0gXCJmaXhlZC0zXCIsXG4gIEZJWEVEXzQgPSBcImZpeGVkLTRcIixcbiAgRklYRURfNSA9IFwiZml4ZWQtNVwiLFxuICBGSVhFRF82ID0gXCJmaXhlZC02XCIsXG4gIEZJWEVEXzcgPSBcImZpeGVkLTdcIixcbiAgRklYRURfOCA9IFwiZml4ZWQtOFwiLFxuICBGSVhFRF85ID0gXCJmaXhlZC05XCIsXG4gIEZJWEVEXzEyID0gXCJmaXhlZC0xMlwiLFxuICBGSVhFRF8xMyA9IFwiZml4ZWQtMTNcIixcbiAgUk9XXzEgPSBcInJvdy0xXCIsXG4gIFJPV18yID0gXCJyb3ctMlwiLFxuICBST1dfMyA9IFwicm93LTNcIixcbiAgUk9XXzQgPSBcInJvdy00XCIsXG59XG5cbmV4cG9ydCB7IEdyaWRJbnNlcnRpb25UeXBlIH07XG4iLCJpbXBvcnQgeyBGcm9udGVuZENvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZnJvbnRlbmRDb25maWcnO1xuaW1wb3J0IHsgdHJhbnNmb3JtU25ha2VUb0NhbWVsIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zbmFrZVRvQ2FtZWxUcmFuc2Zvcm1lcic7XG5pbXBvcnQge1xuICBXaWRnZXRDb25maWcsXG4gIFBhZ2VWYXJpYW50Q29uZmlnLFxuICBQYWdlVmFyaWFudFRlc3RUeXBlLFxuICBXaWRnZXRNb3VudGluZ0NvbmZpZyxcbn0gZnJvbSAnc3JjL2NvbnRleHRzL3R5cGVzJztcbmltcG9ydCB7IERPTUluc2VydGlvblR5cGUgfSBmcm9tICdzcmMvbWVyY2hhbnRzL2RvbUluc2VydGlvbic7XG5pbXBvcnQgeyBHcmlkSW5zZXJ0aW9uVHlwZSB9IGZyb20gJ3NyYy9tZXJjaGFudHMvZ3JpZEluc2VydGlvbic7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbmQgdHJhbnNmb3JtIFBhZ2VWYXJpYW50UXVlcnlEYXRhIHRvIFBhZ2VWYXJpYW50Q29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1QYWdlVmFyaWFudHMgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBQYWdlVmFyaWFudENvbmZpZyA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtU25ha2VUb0NhbWVsKGNvbmZpZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgY29uc3QgeyB2YXJpYW50Q2hlY2tzLCB3aWRnZXRNb3VudGluZywgLi4ucmVzdCB9ID0gdHJhbnNmb3JtZWQ7XG5cbiAgLy8gQ29udmVydCB2YXJpYW50Q2hlY2tzIHRvIHZhcmlhbnRUZXN0cyB3aXRoIHRlc3RUeXBlIG5vcm1hbGl6YXRpb25cbiAgY29uc3QgdmFyaWFudFRlc3RzID0gQXJyYXkuaXNBcnJheSh2YXJpYW50Q2hlY2tzKVxuICAgID8gdmFyaWFudENoZWNrcy5tYXAoKHsgY2hlY2tUeXBlLCAuLi5yZXN0Q2hlY2sgfSkgPT4gKHtcbiAgICAgICAgLi4ucmVzdENoZWNrLFxuICAgICAgICB0ZXN0VHlwZTogY2hlY2tUeXBlLFxuICAgICAgfSkpXG4gICAgOiBbXTtcblxuICAvLyBOb3JtYWxpemUgd2lkZ2V0TW91bnRpbmc6IGNoZWNrcyAtPiB0ZXN0cywgY2hlY2tUeXBlIC0+IHRlc3RUeXBlXG4gIGNvbnN0IG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyA9IEFycmF5LmlzQXJyYXkod2lkZ2V0TW91bnRpbmcpXG4gICAgPyB3aWRnZXRNb3VudGluZy5tYXAoKHsgbW91bnRpbmdQb2ludFdpZGdldHMsIC4uLnJlc3RNb3VudGluZyB9KSA9PiAoe1xuICAgICAgICAuLi5yZXN0TW91bnRpbmcsXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KG1vdW50aW5nUG9pbnRXaWRnZXRzKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBtb3VudGluZ1BvaW50V2lkZ2V0czogbW91bnRpbmdQb2ludFdpZGdldHMubWFwKCh7IGNoZWNrcywgLi4ucmVzdFdpZGdldCB9KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnJlc3RXaWRnZXQsXG4gICAgICAgICAgICAgICAgdGVzdHM6IEFycmF5LmlzQXJyYXkoY2hlY2tzKVxuICAgICAgICAgICAgICAgICAgPyBjaGVja3MubWFwKCh7IGNoZWNrVHlwZSwgLi4ucmVzdENoZWNrIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucmVzdENoZWNrLFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3RUeXBlOiBjaGVja1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSkpXG4gICAgOiBbXTtcblxuICBjb25zdCBub3JtYWxpemVkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAuLi5yZXN0LFxuICAgIC4uLih2YXJpYW50VGVzdHMgPyB7IHZhcmlhbnRUZXN0cyB9IDoge30pLFxuICAgIC4uLihub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcgPyB7IHdpZGdldE1vdW50aW5nOiBub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcgfSA6IHt9KSxcbiAgfTtcblxuICBjb25zdCB2YXJpYW50SWQgPSBub3JtYWxpemVkQ29uZmlnLnZhcmlhbnRJZCBhcyBzdHJpbmc7XG4gIGNvbnN0IHZhcmlhbnRUeXBlID0gbm9ybWFsaXplZENvbmZpZy52YXJpYW50VHlwZSBhcyBzdHJpbmc7XG5cbiAgaWYgKHR5cGVvZiB2YXJpYW50SWQgIT09ICdzdHJpbmcnIHx8ICF2YXJpYW50SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50SWQgZm9yIHBhZ2VWYXJpYW50YCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhcmlhbnRUeXBlICE9PSAnc3RyaW5nJyB8fCAhdmFyaWFudFR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50VHlwZSBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YXJpYW50VGVzdHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1pc3Npbmcgb3IgaW52YWxpZCB2YXJpYW50VGVzdHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBNdXN0IGJlIGFuIGFycmF5YCxcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCB0ZXN0IG9mIHZhcmlhbnRUZXN0cykge1xuICAgIGlmICghdGVzdC50ZXN0VHlwZSB8fCB0eXBlb2YgdGVzdC50ZXN0VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YXJpYW50VGVzdC50ZXN0VHlwZSBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKFBhZ2VWYXJpYW50VGVzdFR5cGUpLmluY2x1ZGVzKHRlc3QudGVzdFR5cGUgYXMgUGFnZVZhcmlhbnRUZXN0VHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgdGVzdFR5cGUgJyR7dGVzdC50ZXN0VHlwZX0nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICBQYWdlVmFyaWFudFRlc3RUeXBlLFxuICAgICAgICApLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHdpZGdldE1vdW50aW5nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gTXVzdCBiZSBhbiBhcnJheWAsXG4gICAgKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbW91bnRpbmcgb2Ygbm9ybWFsaXplZFdpZGdldE1vdW50aW5nKSB7XG4gICAgaWYgKHR5cGVvZiBtb3VudGluZy5tb3VudGluZ0NvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhbW91bnRpbmcubW91bnRpbmdDb25maWdJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1vdW50aW5nQ29uZmlnSWQgaW4gd2lkZ2V0TW91bnRpbmcgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCk7XG4gICAgfVxuXG4gICAgaWYgKG1vdW50aW5nLndpZGdldENvbmZpZ0lkICYmIHR5cGVvZiBtb3VudGluZy53aWRnZXRDb25maWdJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aWRnZXRDb25maWdJZCBpbiB3aWRnZXRNb3VudGluZyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG5cbiAgICBpZiAobW91bnRpbmcubW91bnRpbmdQb2ludFdpZGdldHMpIHtcbiAgICAgIGZvciAoY29uc3Qgd2lkZ2V0IG9mIG1vdW50aW5nLm1vdW50aW5nUG9pbnRXaWRnZXRzKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2lkZ2V0LndpZGdldENvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhd2lkZ2V0LndpZGdldENvbmZpZ0lkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgd2lkZ2V0Q29uZmlnSWQgaW4gbW91bnRpbmdQb2ludFdpZGdldHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHdpZGdldC50ZXN0cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBvciBtaXNzaW5nIHRlc3RzIGluIG1vdW50aW5nUG9pbnRXaWRnZXRzIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh2YXJpYW50VHlwZSA9PT0gJ3BscCcpIHtcbiAgICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucGxwSWRFeHRyYWN0b3IgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLnBscElkRXh0cmFjdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBwbHBJZEV4dHJhY3RvciBmb3IgUExQIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhcmlhbnRUeXBlID09PSAncGRwJykge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnByb2R1Y3RJZEV4dHJhY3RvciAhPT0gJ3N0cmluZycgfHxcbiAgICAgICFub3JtYWxpemVkQ29uZmlnLnByb2R1Y3RJZEV4dHJhY3RvclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgcHJvZHVjdElkRXh0cmFjdG9yIGZvciBQRFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbm9ybWFsaXplZENvbmZpZy5wYXJlbnRQcm9kdWN0SWRFeHRyYWN0b3IgJiZcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnBhcmVudFByb2R1Y3RJZEV4dHJhY3RvciAhPT0gJ3N0cmluZydcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50UHJvZHVjdElkRXh0cmFjdG9yIGZvciBQRFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfScuIE11c3QgYmUgc3RyaW5nIGlmIHByb3ZpZGVkYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDb25maWcgYXMgUGFnZVZhcmlhbnRDb25maWc7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBNb3VudGluZ0NvbmZpZ1F1ZXJ5RGF0YSB0byBXaWRnZXRNb3VudGluZ0NvbmZpZ1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQW5kVHJhbnNmb3JtTW91bnRpbmdDb25maWcgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZ0tleTogc3RyaW5nLFxuKTogV2lkZ2V0TW91bnRpbmdDb25maWcgPT4ge1xuICAvLyBSRU5BTUlORyBMT0dJQzogQ29udmVydCBiYWNrZW5kIFwiQ2hlY2tcIiB0ZXJtaW5vbG9neSB0byBmcm9udGVuZCBcIlRlc3RcIiB0ZXJtaW5vbG9neVxuICBjb25zdCBub3JtYWxpemVkQ29uZmlnID0geyAuLi5jb25maWcgfTtcblxuICAvLyBDb252ZXJ0IGNoZWNrSWQgdG8gdGVzdElkIGZvciBmcm9udGVuZCBjb21wYXRpYmlsaXR5IChkYXRhIGlzIGFscmVhZHkgY2FtZWxDYXNlKVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5jaGVja0lkICYmICFub3JtYWxpemVkQ29uZmlnLnRlc3RJZCkge1xuICAgIG5vcm1hbGl6ZWRDb25maWcudGVzdElkID0gbm9ybWFsaXplZENvbmZpZy5jaGVja0lkO1xuICAgIGRlbGV0ZSBub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQ7XG4gIH1cblxuICAvLyBSZXF1aXJlZCBmaWVsZHMgLSB0aGVzZSBtdXN0IGJlIHByZXNlbnQgYW5kIHZhbGlkXG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5tb3VudGluZ0NvbmZpZ0lkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy5tb3VudGluZ0NvbmZpZ0lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgbW91bnRpbmdDb25maWdJZCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNvbnRhaW5lcklkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy5jb250YWluZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGNvbnRhaW5lcklkIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcudGVzdElkICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy50ZXN0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB0ZXN0SWQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG5cbiAgLy8gUmVxdWlyZWQgaW5zZXJ0aW9uUG9pbnRcbiAgaWYgKFxuICAgICFub3JtYWxpemVkQ29uZmlnLmluc2VydGlvblBvaW50IHx8XG4gICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLmluc2VydGlvblBvaW50KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBpbnNlcnRpb25Qb2ludCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gVmFsaWRhdGUgaW5zZXJ0aW9uUG9pbnQgcmVxdWlyZWQgZmllbGRzXG4gIGlmICh0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgIT09ICdzdHJpbmcnIHx8ICFpbnNlcnRpb25Qb2ludC5zZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGluc2VydGlvblBvaW50LnNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIGluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICFpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpbnNlcnRpb25UeXBlIGlzIGEgdmFsaWQgRE9NSW5zZXJ0aW9uVHlwZVxuICBpZiAoIU9iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuaW5jbHVkZXMoaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgJyR7aW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBpbnNlcnRpb25Qb2ludCBmaWVsZHNcbiAgaWYgKGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9IG51bGwgJiYgdHlwZW9mIGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBudW1iZXIgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBwYXJlbnRJbnNlcnRpb25Qb2ludCBpZiBwcmVzZW50XG4gIGxldCBwYXJlbnRJbnNlcnRpb25Qb2ludDtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcucGFyZW50SW5zZXJ0aW9uUG9pbnQpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXJlbnRJbnNlcnRpb25Qb2ludCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGFuIG9iamVjdGApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFBvaW50ID0gbm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHBhcmVudFBvaW50LnNlbGVjdG9yICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50UG9pbnQuc2VsZWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50LnNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlICE9PSAnc3RyaW5nJyB8fCAhcGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUgJyR7cGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50UG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50UG9pbnQuc2VsZWN0aW9uSW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBudW1iZXIgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwYXJlbnRJbnNlcnRpb25Qb2ludCA9IHtcbiAgICAgIHNlbGVjdG9yOiBwYXJlbnRQb2ludC5zZWxlY3RvcixcbiAgICAgIGluc2VydGlvblR5cGU6IHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSxcbiAgICAgIHNlbGVjdGlvbkluZGV4OiBwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHdyYXBwaW5nRWxlbWVudCBpZiBwcmVzZW50XG4gIGxldCB3cmFwcGluZ0VsZW1lbnQ7XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy53cmFwcGluZ0VsZW1lbnQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd3JhcHBpbmdFbGVtZW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBpbmcgPSBub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIHdyYXBwaW5nLmNsYXNzTmFtZSAhPT0gJ3N0cmluZycgfHwgIXdyYXBwaW5nLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50LmNsYXNzTmFtZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd3JhcHBpbmcuZWxlbWVudCAhPT0gJ3N0cmluZycgfHwgIXdyYXBwaW5nLmVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHdyYXBwaW5nRWxlbWVudC5lbGVtZW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3cmFwcGluZy5pbnNlcnRpb25UeXBlICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuaW5zZXJ0aW9uVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50Lmluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyh3cmFwcGluZy5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHdyYXBwaW5nRWxlbWVudC5pbnNlcnRpb25UeXBlICcke3dyYXBwaW5nLmluc2VydGlvblR5cGV9JyBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgd3JhcHBpbmdFbGVtZW50ID0ge1xuICAgICAgY2xhc3NOYW1lOiB3cmFwcGluZy5jbGFzc05hbWUsXG4gICAgICBlbGVtZW50OiB3cmFwcGluZy5lbGVtZW50LFxuICAgICAgaW5zZXJ0aW9uVHlwZTogd3JhcHBpbmcuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgIH07XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBvcHRpb25hbCBmaWVsZHNcbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciAhPSBudWxsICYmXG4gICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciAhPT0gJ3N0cmluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZGl2Q2hlY2tTZWxlY3RvciBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNsYXNzTmFtZSAhPSBudWxsICYmIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjbGFzc05hbWUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzdXBwcmVzc2lvblNlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMgIT0gbnVsbCAmJlxuICAgICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcyAhPT0gJ29iamVjdCcgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcykpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGRhdGFBdHRyaWJ1dGVzIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBub3JtYWxpemVkQ29uZmlnLnN0eWxlICE9IG51bGwgJiZcbiAgICAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobm9ybWFsaXplZENvbmZpZy5zdHlsZSkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdHlsZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGFuIG9iamVjdCBvciBudWxsL3VuZGVmaW5lZGApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgZ3JpZEluc2VydGlvblR5cGUgaWYgcHJlc2VudFxuICBsZXQgZ3JpZEluc2VydGlvblR5cGU7XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmdyaWRJbnNlcnRpb25UeXBlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyaWRJbnNlcnRpb25UeXBlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmdgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhT2JqZWN0LnZhbHVlcyhHcmlkSW5zZXJ0aW9uVHlwZSkuaW5jbHVkZXMoXG4gICAgICAgIG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgYXMgR3JpZEluc2VydGlvblR5cGUsXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdyaWRJbnNlcnRpb25UeXBlICcke25vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGV9JyBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEdyaWRJbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBncmlkSW5zZXJ0aW9uVHlwZSA9IG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUgYXMgR3JpZEluc2VydGlvblR5cGU7XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcmV0dXJuIG9iamVjdCwgb25seSBpbmNsdWRpbmcgb3B0aW9uYWwgZmllbGRzIGlmIHRoZXkgaGF2ZSB2YWx1ZXNcbiAgY29uc3QgcmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyA9IHtcbiAgICBtb3VudGluZ0NvbmZpZ0lkOiBub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQsXG4gICAgY29udGFpbmVySWQ6IG5vcm1hbGl6ZWRDb25maWcuY29udGFpbmVySWQsXG4gICAgdGVzdElkOiBub3JtYWxpemVkQ29uZmlnLnRlc3RJZCxcbiAgICBpbnNlcnRpb25Qb2ludDoge1xuICAgICAgc2VsZWN0b3I6IGluc2VydGlvblBvaW50LnNlbGVjdG9yLFxuICAgICAgaW5zZXJ0aW9uVHlwZTogaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgICAgLi4uKGluc2VydGlvblBvaW50LnNlbGVjdGlvbkluZGV4ICE9IG51bGwgJiYge1xuICAgICAgICBzZWxlY3Rpb25JbmRleDogaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXgsXG4gICAgICB9KSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIE9ubHkgYWRkIG9wdGlvbmFsIGZpZWxkcyBpZiB0aGV5IGhhdmUgdmFsdWVzXG4gIGlmIChwYXJlbnRJbnNlcnRpb25Qb2ludCkge1xuICAgIHJlc3VsdC5wYXJlbnRJbnNlcnRpb25Qb2ludCA9IHBhcmVudEluc2VydGlvblBvaW50O1xuICB9XG4gIGlmIChncmlkSW5zZXJ0aW9uVHlwZSkge1xuICAgIHJlc3VsdC5ncmlkSW5zZXJ0aW9uVHlwZSA9IGdyaWRJbnNlcnRpb25UeXBlO1xuICB9XG4gIGlmICh3cmFwcGluZ0VsZW1lbnQpIHtcbiAgICByZXN1bHQud3JhcHBpbmdFbGVtZW50ID0gd3JhcHBpbmdFbGVtZW50O1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmRpdkNoZWNrU2VsZWN0b3IpIHtcbiAgICByZXN1bHQuZGl2Q2hlY2tTZWxlY3RvciA9IG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3RvciBhcyBzdHJpbmc7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lKSB7XG4gICAgcmVzdWx0LmNsYXNzTmFtZSA9IG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lIGFzIHN0cmluZztcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5zdXBwcmVzc2lvblNlbGVjdG9yKSB7XG4gICAgcmVzdWx0LnN1cHByZXNzaW9uU2VsZWN0b3IgPSBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3I7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMpIHtcbiAgICByZXN1bHQuZGF0YUF0dHJpYnV0ZXMgPSBub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuc3R5bGUpIHtcbiAgICByZXN1bHQuc3R5bGUgPSBub3JtYWxpemVkQ29uZmlnLnN0eWxlIGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gV2lkZ2V0Q29uZmlnUXVlcnlEYXRhIHRvIFdpZGdldENvbmZpZ1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQW5kVHJhbnNmb3JtV2lkZ2V0Q29uZmlnID0gKFxuICBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWdLZXk6IHN0cmluZyxcbik6IFdpZGdldENvbmZpZyA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwoY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcud2lkZ2V0Q29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLndpZGdldENvbmZpZ0lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd2lkZ2V0Q29uZmlnSWQgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcudHlwZSAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcudHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHR5cGUgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNvbnRlbnRJZCAhPSBudWxsICYmIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmNvbnRlbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb250ZW50SWQgZm9yIHdpZGdldCBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cblxuICAvLyBOb3RlOiBXaWRnZXQgY29uZmlncyBhcmUgY29tcGxleCB1bmlvbnMgd2l0aCB0eXBlLXNwZWNpZmljIHByb3BlcnRpZXMuXG5cbiAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIGNvbmZpZyBhcyBXaWRnZXRDb25maWdcbiAgLy8gVXNlIGludGVybWVkaWF0ZSAndW5rbm93bicgY2FzdCBmb3IgY29tcGxleCB1bmlvbiB0eXBlc1xuICByZXR1cm4gbm9ybWFsaXplZENvbmZpZyBhcyB1bmtub3duIGFzIFdpZGdldENvbmZpZztcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxGcm9udGVuZENvbmZpZyA9IChkYXRhOiB1bmtub3duKTogRnJvbnRlbmRDb25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvYmogPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFZhbGlkYXRlIG1lcmNoYW50X292ZXJyaWRlX2NzcyBpZiBwcmVzZW50XG4gIGlmIChcbiAgICAnbWVyY2hhbnRfb3ZlcnJpZGVfY3NzJyBpbiBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLm1lcmNoYW50X292ZXJyaWRlX2NzcyAhPT0gJ3N0cmluZycgJiZcbiAgICBvYmoubWVyY2hhbnRfb3ZlcnJpZGVfY3NzICE9PSBudWxsXG4gICkge1xuICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogbWVyY2hhbnRfb3ZlcnJpZGVfY3NzIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBwYWdlX3ZhcmlhbnRzIGlmIHByZXNlbnRcbiAgaWYgKCdwYWdlX3ZhcmlhbnRzJyBpbiBvYmopIHtcbiAgICBpZiAoXG4gICAgICBvYmoucGFnZV92YXJpYW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvYmoucGFnZV92YXJpYW50cyAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkob2JqLnBhZ2VfdmFyaWFudHMpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogcGFnZV92YXJpYW50cyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IGRhdGEgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG1vdW50aW5nX2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ21vdW50aW5nX2NvbmZpZ3MnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai5tb3VudGluZ19jb25maWdzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9iai5tb3VudGluZ19jb25maWdzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoubW91bnRpbmdfY29uZmlncylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBtb3VudGluZ19jb25maWdzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC91bmRlZmluZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgZGF0YSB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgd2lkZ2V0X2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ3dpZGdldF9jb25maWdzJyBpbiBvYmopIHtcbiAgICBpZiAoXG4gICAgICBvYmoud2lkZ2V0X2NvbmZpZ3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb2JqLndpZGdldF9jb25maWdzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoud2lkZ2V0X2NvbmZpZ3MpXG4gICAgKSB7XG4gICAgICBMb2dnZXIubG9nV2FybihcbiAgICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogd2lkZ2V0X2NvbmZpZ3MgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyBkYXRhIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB1aV9jb25maWdzIGlmIHByZXNlbnRcbiAgaWYgKCd1aV9jb25maWdzJyBpbiBvYmogJiYgdHlwZW9mIG9iai51aV9jb25maWdzICE9PSAnb2JqZWN0JyAmJiBvYmoudWlfY29uZmlncyAhPT0gbnVsbCkge1xuICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgJ0ludmFsaWQgR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YTogdWlfY29uZmlncyBtdXN0IGJlIGFuIG9iamVjdCBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRhdGEgfSxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRyYW5zZm9ybSB0aGUgZGF0YSB0byBjYW1lbENhc2VcbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwob2JqKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIENvbnZlcnQgcGFnZV92YXJpYW50cyBmcm9tIGFycmF5IHRvIHZhbGlkYXRlZCBhcnJheSBpZiBwcmVzZW50XG4gICAgaWYgKHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzKSkge1xuICAgICAgY29uc3QgcGFnZVZhcmlhbnRzQXJyYXkgPSB0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzO1xuICAgICAgY29uc3QgdmFsaWRhdGVkUGFnZVZhcmlhbnRzOiBQYWdlVmFyaWFudENvbmZpZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwYWdlVmFyaWFudHNBcnJheSkge1xuICAgICAgICBpZiAodmFyaWFudCAmJiB0eXBlb2YgdmFyaWFudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhcmlhbnQudmFyaWFudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRWYXJpYW50ID0gdmFsaWRhdGVBbmRUcmFuc2Zvcm1QYWdlVmFyaWFudHModmFyaWFudCk7XG4gICAgICAgICAgICB2YWxpZGF0ZWRQYWdlVmFyaWFudHMucHVzaCh2YWxpZGF0ZWRWYXJpYW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgcGFnZSB2YXJpYW50LCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIHZhcmlhbnRJZDogdmFyaWFudC52YXJpYW50SWQsXG4gICAgICAgICAgICAgIHZhcmlhbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgdmFyaWFudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgcGFnZSB2YXJpYW50IHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgdmFyaWFudCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEucGFnZVZhcmlhbnRzID0gdmFsaWRhdGVkUGFnZVZhcmlhbnRzO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgbW91bnRpbmdfY29uZmlncyBmcm9tIGFycmF5IHRvIFJlY29yZCBpZiBwcmVzZW50XG4gICAgaWYgKHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzKSkge1xuICAgICAgY29uc3QgbW91bnRpbmdDb25maWdzQXJyYXkgPSB0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzIGFzIEFycmF5PHtcbiAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZzogdW5rbm93bjtcbiAgICAgIH0+O1xuICAgICAgY29uc3QgbW91bnRpbmdDb25maWdzUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBXaWRnZXRNb3VudGluZ0NvbmZpZz4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vdW50aW5nQ29uZmlnc0FycmF5KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0ua2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGl0ZW0uY29uZmlnICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0uY29uZmlnID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHRyYW5zZm9ybSB0aGUgY29uZmlnIHN0cnVjdHVyZVxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaXRlbS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRDb25maWcgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybU1vdW50aW5nQ29uZmlnKGNvbmZpZywgaXRlbS5rZXkpO1xuICAgICAgICAgICAgbW91bnRpbmdDb25maWdzUmVjb3JkW2l0ZW0ua2V5XSA9IHZhbGlkYXRlZENvbmZpZztcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgbW91bnRpbmcgY29uZmlnLCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ0tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgIGNvbmZpZzogaXRlbS5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgY29uZmlnc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBtb3VudGluZyBjb25maWcgaXRlbSBzdHJ1Y3R1cmUsIHNraXBwaW5nJywgdW5kZWZpbmVkLCB7IGl0ZW0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJhbnNmb3JtZWREYXRhLm1vdW50aW5nQ29uZmlncyA9IG1vdW50aW5nQ29uZmlnc1JlY29yZDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHdpZGdldF9jb25maWdzIGZyb20gYXJyYXkgdG8gUmVjb3JkIGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLndpZGdldENvbmZpZ3MgJiYgQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncykpIHtcbiAgICAgIGNvbnN0IHdpZGdldENvbmZpZ3NBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzIGFzIEFycmF5PHtcbiAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZzogdW5rbm93bjtcbiAgICAgIH0+O1xuICAgICAgY29uc3Qgd2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHdpZGdldENvbmZpZ3NBcnJheSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXRlbSAmJlxuICAgICAgICAgIHR5cGVvZiBpdGVtLmtleSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBpdGVtLmNvbmZpZyAmJlxuICAgICAgICAgIHR5cGVvZiBpdGVtLmNvbmZpZyA9PT0gJ29iamVjdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gd2lkZ2V0IGNvbmZpZyB1c2luZyB0aGUgZGVkaWNhdGVkIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVkQ29uZmlnID0gdmFsaWRhdGVBbmRUcmFuc2Zvcm1XaWRnZXRDb25maWcoY29uZmlnLCBpdGVtLmtleSk7XG4gICAgICAgICAgICB3aWRnZXRDb25maWdzUmVjb3JkW2l0ZW0ua2V5XSA9IHZhbGlkYXRlZENvbmZpZztcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgd2lkZ2V0IGNvbmZpZywgc2tpcHBpbmcnLCBlcnJvciwge1xuICAgICAgICAgICAgICBjb25maWdLZXk6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICBjb25maWc6IGl0ZW0uY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIGNvbmZpZ3NcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ0ludmFsaWQgd2lkZ2V0IGNvbmZpZyBpdGVtIHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncyA9IHdpZGdldENvbmZpZ3NSZWNvcmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YSBhcyBGcm9udGVuZENvbmZpZztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBMb2dnZXIubG9nV2FybignRmFpbGVkIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gR3JhcGhRTCBmcm9udGVuZCBjb25maWcgZGF0YScsIGVycm9yLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG4iLCJleHBvcnQgY29uc3QgdmFsaWRhdGVHcmFwaFFMT3JnSWQgPSAoZGF0YTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycgfHwgZGF0YSA9PT0gJycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuIiwiaW1wb3J0IHsgaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIH0gZnJvbSAnLi4vZ3VhcmRzL2lzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlcic7XG5pbXBvcnQgeyBNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIH0gZnJvbSAnLi4vbW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlcic7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyKHZhbHVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJvd0luZGV4OiB2YWx1ZS5yb3dfaW5kZXgsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnYW5pemF0aW9uQ29uZmlnJztcbmltcG9ydCB7IGlzQXBpT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBPcmdhbml6YXRpb25Db25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpT3JnYW5pemF0aW9uQ29uZmlnKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaWQ6IGRhdGEuaWQsXG4gICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQudG9JU09TdHJpbmcoKSxcbiAgICBuYW1lc3BhY2U6IGRhdGEubmFtZXNwYWNlLFxuICAgIG9yZ2FuaXphdGlvbklkOiBkYXRhLm9yZ2FuaXphdGlvbl9pZCxcbiAgICBpc0xhdGVzdDogZGF0YS5pc19sYXRlc3QsXG4gICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uLFxuICAgIHVwZGF0ZWRBdDogZGF0YS51cGRhdGVkX2F0LnRvSVNPU3RyaW5nKCksXG4gICAgY29uZmlnOiB7XG4gICAgICBhbXBsaXR1ZGU6IGRhdGEuY29uZmlnLmFtcGxpdHVkZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNlc3Npb25SZXBsYXlFbmFibGVkOiBkYXRhLmNvbmZpZy5hbXBsaXR1ZGUuc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCxcbiAgICAgICAgICAgIHNlc3Npb25SZXBsYXlTYW1wbGVSYXRlOiBkYXRhLmNvbmZpZy5hbXBsaXR1ZGUuc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGUsXG4gICAgICAgICAgICB0cmFja2luZ0VuYWJsZWQ6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS50cmFja2luZ19lbmFibGVkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBjdXN0b21lclNlcnZpY2U6IGRhdGEuY29uZmlnLmN1c3RvbWVyX3NlcnZpY2VcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm92aWRlcjogZGF0YS5jb25maWcuY3VzdG9tZXJfc2VydmljZS5wcm92aWRlcixcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZ29vZ2xlQW5hbHl0aWNzOiBkYXRhLmNvbmZpZy5nb29nbGVfYW5hbHl0aWNzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWVhc3VyZW1lbnRJZDogZGF0YS5jb25maWcuZ29vZ2xlX2FuYWx5dGljcy5tZWFzdXJlbWVudF9pZCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgaXNBcGlPcmdDb25maWdSZXN1bHRzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnQ29uZmlnUmVzdWx0cyc7XG5pbXBvcnQgeyBPcmdDb25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL29yZ2FuaXphdGlvbkNvbmZpZyc7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPcmdDb25maWdSZXN1bHRzID0gKGRhdGE6IHVua25vd24pOiBPcmdDb25maWcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpT3JnQ29uZmlnUmVzdWx0cyhkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbmZpZ3M6IGRhdGEuY29uZmlnc1xuICAgICAgLm1hcCgoY29uZmlnKSA9PiB2YWxpZGF0ZU9yZ2FuaXphdGlvbkNvbmZpZyhjb25maWcpKVxuICAgICAgLmZpbHRlcigoY29uZmlnKTogY29uZmlnIGlzIE9yZ2FuaXphdGlvbkNvbmZpZyA9PiBjb25maWcgIT0gbnVsbCksXG4gICAgZXhwZXJpbWVudHM6IGRhdGEuZXhwZXJpbWVudHMubWFwKChleHBlcmltZW50KSA9PiAoe1xuICAgICAgZ3JvdXA6IGV4cGVyaW1lbnQuZ3JvdXAsXG4gICAgICBncm91cE5hbWU6IGV4cGVyaW1lbnQuZ3JvdXBfbmFtZSxcbiAgICAgIG5hbWU6IGV4cGVyaW1lbnQubmFtZSxcbiAgICAgIHJ1bGVJZDogZXhwZXJpbWVudC5ydWxlX2lkLFxuICAgICAgLy8gVE9ETyB0aGlzIG5lZWRzIHRvIGJlIHN0cm9uZ2x5IHR5cGVkIGJ1dCB3ZSdyZSBub3QgcnVubmluZyBhbnkgZXhwZXJpbWVudHMgYXQgdGhlIG1vbWVudFxuICAgICAgdmFsdWU6IGV4cGVyaW1lbnQudmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgfSkpLFxuICAgIGdhdGVzOiBkYXRhLmdhdGVzLm1hcCgoZ2F0ZSkgPT4gKHtcbiAgICAgIGdyb3VwTmFtZTogZ2F0ZS5ncm91cF9uYW1lLFxuICAgICAgbmFtZTogZ2F0ZS5uYW1lLFxuICAgICAgcnVsZUlkOiBnYXRlLnJ1bGVfaWQsXG4gICAgICB2YWx1ZTogZ2F0ZS52YWx1ZSxcbiAgICB9KSksXG4gICAgb3JnOiB7XG4gICAgICBvcmc6IHtcbiAgICAgICAgaWQ6IGRhdGEub3JnLm9yZy5pZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGRhdGEub3JnLm9yZy5kaXNwbGF5X25hbWUsXG4gICAgICAgIGRvbWFpbjogZGF0YS5vcmcub3JnLmRvbWFpbixcbiAgICAgICAgc2hvcnROYW1lOiBkYXRhLm9yZy5vcmcuc2hvcnRfbmFtZSxcbiAgICAgICAgc3RhdHVzOiBkYXRhLm9yZy5vcmcuc3RhdHVzLFxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGEub3JnLm9yZy5jcmVhdGVkX2F0Py50b0lTT1N0cmluZygpLFxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGEub3JnLm9yZy51cGRhdGVkX2F0Py50b0lTT1N0cmluZygpLFxuICAgICAgfSxcbiAgICAgIHNldHRpbmdzOiB7fSxcbiAgICB9LFxuICB9O1xufTtcbiIsImltcG9ydCB7IFJlc3BvbnNlQ2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgUmVzcG9uc2UsIFJldmlld1JpY2hJbmZvcm1hdGlvbiB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgQXBpUmV2aWV3UmljaEluZm9ybWF0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvcmVzcG9uc2VHZW5lcmljcyc7XG5pbXBvcnQgeyBpc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlSZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVJlc3BvbnNlJztcbmltcG9ydCB7IGlzQXBpUmV2aWV3UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUmV2aWV3UmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpVGV4dFJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVRleHRSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0U2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFNlYXJjaEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVJlc3BvbnNlJztcbmltcG9ydCB7IGlzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdXRpbHMvc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFNlYXJjaEZpbHRlckF0dHJpYnV0ZXMnO1xuXG5jb25zdCByaWNoSW5mb3JtYXRpb25Gcm9tQ29tbWVyY2VSaWNoSW5mb3JtYXRpb24gPSAoXG4gIGRhdGE6IEFwaVJldmlld1JpY2hJbmZvcm1hdGlvbixcbik6IFJldmlld1JpY2hJbmZvcm1hdGlvbiA9PiAoe1xuICBjb25zOiBkYXRhLmNvbnMsXG4gIHByb3M6IGRhdGEucHJvcyxcbiAgcmV2aWV3RGF0ZTogZGF0YS5yZXZpZXdfZGF0ZSxcbiAgcmV2aWV3ZXJUaXRsZTogZGF0YS5yZXZpZXdlcl90aXRsZSxcbiAgcHJvZHVjdEZhbWlsaWFyaXR5OiBkYXRhLnByb2R1Y3RfZmFtaWxpYXJpdHksXG59KTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUmVzcG9uc2UgPSAoZGF0YTogdW5rbm93bik6IFJlc3BvbnNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc0FwaVJlc3BvbnNlKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQgJiYgaXNBcGlUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlRleHQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGNvbnRlbnQ6IGRhdGEuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCAmJlxuICAgIGlzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgaWQ6IGRhdGEuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuYXR0cmlidXRlcy5kZXNjcmlwdGlvbixcbiAgICAgICAgaW1hZ2VVcmw6IGRhdGEuYXR0cmlidXRlcy5pbWFnZV91cmwsXG4gICAgICAgIGltYWdlVXJsczogZGF0YS5hdHRyaWJ1dGVzLmltYWdlX3VybHMsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgb3JpZ2luYWxQcmljZTogZGF0YS5hdHRyaWJ1dGVzLm9yaWdpbmFsX3ByaWNlLFxuICAgICAgICBzYWxlUHJpY2U6IGRhdGEuYXR0cmlidXRlcy5zYWxlX3ByaWNlLFxuICAgICAgICBhdmVyYWdlUmF0aW5nOiBkYXRhLmF0dHJpYnV0ZXMuYXZlcmFnZV9yYXRpbmcsXG4gICAgICAgIG51bWJlclJldmlld3M6IGRhdGEuYXR0cmlidXRlcy5udW1iZXJfcmV2aWV3cyxcbiAgICAgICAgbWV0YWRhdGE6IGRhdGEuYXR0cmlidXRlcy5tZXRhZGF0YSxcbiAgICAgICAgaXNGb3JHcmlkOiBkYXRhLmF0dHJpYnV0ZXMuaXNfZm9yX2dyaWQsXG4gICAgICAgIGNvbG9yczogZGF0YS5hdHRyaWJ1dGVzLmNvbG9ycyxcbiAgICAgICAgc2l6ZXM6IGRhdGEuYXR0cmlidXRlcy5zaXplcyxcbiAgICAgICAgZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLmZpbHRlcnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcgJiYgaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUmV2aWV3LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICBwcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2lkLFxuICAgICAgICB0aXRsZTogZGF0YS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByZXZpZXdlcjogZGF0YS5hdHRyaWJ1dGVzLnJldmlld2VyLFxuICAgICAgICByZXZpZXc6IGRhdGEuYXR0cmlidXRlcy5yZXZpZXcsXG4gICAgICAgIHN0YXJzOiBkYXRhLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHJpY2hJbmZvcm1hdGlvbjogZGF0YS5hdHRyaWJ1dGVzLnJpY2hfaW5mb3JtYXRpb25cbiAgICAgICAgICA/IHJpY2hJbmZvcm1hdGlvbkZyb21Db21tZXJjZVJpY2hJbmZvcm1hdGlvbihkYXRhLmF0dHJpYnV0ZXMucmljaF9pbmZvcm1hdGlvbilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuU2VwYXJhdG9yLFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5QYWdlICYmIGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5QYWdlLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICB0aXRsZTogZGF0YS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uLFxuICAgICAgICB1cmw6IGRhdGEuYXR0cmlidXRlcy51cmwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Gb3JtICYmIGlzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Gb3JtLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBmb3JtQ2F0ZWdvcnk6IGRhdGEuYXR0cmlidXRlcy5mb3JtX2NhdGVnb3J5XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZvcm1UeXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV9jYXRlZ29yeS5mb3JtX3R5cGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHByb3BlcnRpZXM6IGRhdGEuYXR0cmlidXRlcy5zY2hlbWEucHJvcGVydGllcyxcbiAgICAgICAgICByZXF1aXJlZDogZGF0YS5hdHRyaWJ1dGVzLnNjaGVtYS5yZXF1aXJlZC5tYXAoU3RyaW5nKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RTZWFyY2ggJiZcbiAgICBpc0FwaVByb2R1Y3RTZWFyY2hSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RTZWFyY2gsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGdlbmVyYXRlZFF1ZXJ5OiBkYXRhLmF0dHJpYnV0ZXMuZ2VuZXJhdGVkX3F1ZXJ5LFxuICAgICAgICBwcm9kdWN0Q291bnQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2NvdW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlciAmJlxuICAgIGlzQXBpUHJvZHVjdFNlYXJjaEZpbHRlclJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsdGVyTmFtZTogZGF0YS5hdHRyaWJ1dGVzLmZpbHRlcl9uYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuT3JkZXIgJiYgaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5PcmRlcixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgb3JkZXJJZDogZGF0YS5hdHRyaWJ1dGVzLm9yZGVyX2lkLFxuICAgICAgICBvcmRlck51bWJlcjogZGF0YS5hdHRyaWJ1dGVzLm9yZGVyX251bWJlcixcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRhLmF0dHJpYnV0ZXMuY3JlYXRlZF9hdCxcbiAgICAgICAgbGF0ZXN0RXZlbnREYXRlOiBkYXRhLmF0dHJpYnV0ZXMubGF0ZXN0X2V2ZW50X2RhdGUsXG4gICAgICAgIGxpbmVJdGVtczogZGF0YS5hdHRyaWJ1dGVzLmxpbmVfaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgIGl0ZW1UaXRsZTogaXRlbS5pdGVtX3RpdGxlLFxuICAgICAgICAgIGl0ZW1QcmljZTogaXRlbS5pdGVtX3ByaWNlLFxuICAgICAgICAgIGl0ZW1RdWFudGl0eTogaXRlbS5pdGVtX3F1YW50aXR5LFxuICAgICAgICAgIG9yZGVySXRlbUlkOiBpdGVtLm9yZGVyX2l0ZW1faWQsXG4gICAgICAgICAgaW1hZ2U6IGl0ZW0uaW1hZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGluVHJhbnNpdEF0OiBpdGVtLmluX3RyYW5zaXRfYXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGRlbGl2ZXJlZEF0OiBpdGVtLmRlbGl2ZXJlZF9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZXN0aW1hdGVkRGVsaXZlcnlBdDogaXRlbS5lc3RpbWF0ZWRfZGVsaXZlcnlfYXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1bGZpbGxtZW50RGlzcGxheVN0YXR1czogaXRlbS5mdWxmaWxsbWVudF9kaXNwbGF5X3N0YXR1c1xuICAgICAgICAgICAgPyBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZShpdGVtLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHJhY2tpbmdVcmw6IGl0ZW0udHJhY2tpbmdfdXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyBpc1N1Z2dlc3Rpb24gfSBmcm9tICcuLi9ndWFyZHMvYXBpL2lzQXBpU3VnZ2VzdGlvbic7XG5pbXBvcnQgeyBTdWdnZXN0aW9uIH0gZnJvbSAnLi4vYXBpL3N1Z2dlc3Rpb24nO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTdWdnZXN0aW9uID0gKGRhdGE6IHVua25vd24pOiBTdWdnZXN0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1N1Z2dlc3Rpb24oZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZGF0YS5pZCxcbiAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgaXNBbnN3ZXI6IGRhdGEuaXNfYW5zd2VyLFxuICB9O1xufTtcbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IGlzQXBpVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvaW5kZXgnO1xuaW1wb3J0IHsgaXNBcGlQRFBBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUERQRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpUXVlcnlUeXBlZEF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlRdWVyeVR5cGVkRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpU2VhcmNoQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVNlYXJjaEV2ZW50QXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVN1Z2dlc3Rpb25DbGlja2VkQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVN1Z2dlc3Rpb25DbGlja2VkRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7XG4gIGlzQXBpUExQRXZlbnRBdHRyaWJ1dGVzLFxuICBpc0FwaVBMUElkQXR0cmlidXRlLFxufSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyc7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVVzZXJFdmVudCA9IChkYXRhOiB1bmtub3duKTogVXNlckV2ZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc0FwaVVzZXJFdmVudChkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQgJiYgaXNBcGlQRFBBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wcm9kdWN0X2lkLFxuICAgICAgICBwYXJlbnRQcm9kdWN0SWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRfcHJvZHVjdF9pZCxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQgJiZcbiAgICBpc0FwaVF1ZXJ5VHlwZWRBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5RdWVyeVR5cGVkLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBxdWVyeTogZGF0YS5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCAmJiBpc0FwaVNlYXJjaEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBzZWFyY2hUZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoX3Rlcm0sXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkX2ZpbHRlcnMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQgJiZcbiAgICBpc0FwaVN1Z2dlc3Rpb25DbGlja2VkQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHN1Z2dlc3Rpb25JZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25faWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGxwVmlzaXQgJiYgaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIGlmIChpc0FwaVBMUElkQXR0cmlidXRlKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuUGxwVmlzaXQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBjYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLmNhdGVnb3J5LFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQgJiZcbiAgICBpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZFNjaGVtYTogeyAuLi5kYXRhLmF0dHJpYnV0ZXMuZmlsbGVkX3NjaGVtYSB9LFxuICAgICAgICBmb3JtUmVzcG9uc2VJZDogZGF0YS5hdHRyaWJ1dGVzLmZvcm1fcmVzcG9uc2VfaWQsXG4gICAgICAgIGZvcm1UeXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV90eXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gd2UncmUgbm90IHVzaW5nIGFwcF91bmxvYWRlZCBhdCB0aGUgbW9tZW50IHNvIHJldHVybiB0aGUgYXBwX2xvYWRlZCBldmVudCBhcyBkZWZhdWx0XG4gIHJldHVybiB7XG4gICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuQXBwTG9hZGVkLFxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBLElBQVksb0ZBQUw7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkJGLElBQVksOERBQUw7QUFDTDtBQUNBOzs7Ozs7QUNIRixJQUFLLDBFQUFMO0FBQ0U7QUFDQTs7RUFGRzs7OztBQ2FMLElBQVksc0RBQUw7QUFDTDtBQUNBOzs7QUFHRixJQUFZLHNEQUFMO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDaENGLE1BQWEsZUFBZTtDQUMxQixTQUFTO0NBQ1Qsa0JBQWtCO0NBQ2xCLFVBQVU7Q0FDVixhQUFhO0NBQ2IsZ0JBQWdCO0NBQ2hCLGtCQUFrQjtDQUNsQixhQUFhO0NBQ2IsT0FBTztDQUNQLGNBQWM7Q0FDZCxXQUFXO0NBQ1gsZUFBZTtDQUNmLFlBQVk7Q0FFWixnQkFBZ0I7Q0FDaEIsV0FBVztDQUNYLFNBQVM7Q0FDVCxpQkFBaUI7Q0FDakIsYUFBYTtDQUNiLFNBQVM7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