@envive-ai/react-hooks 0.2.6-alpha.12 → 0.2.6
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.
- package/dist/{NewOrgConfig-BfbTlFg1.js → NewOrgConfig-BfrGpiGk.js} +2 -2
- package/dist/{NewOrgConfig-DJm6_abA.cjs → NewOrgConfig-BxSuoP9C.cjs} +2 -2
- package/dist/{SystemSettingsContext-BbTKNBvJ.js → SystemSettingsContext-B8X_Dvw2.js} +2 -2
- package/dist/{SystemSettingsContext-6ZHzQkCE.cjs → SystemSettingsContext-Bkoiobdv.cjs} +2 -2
- package/dist/{TrackComponentVisibleEvent-BRC2FTp-.cjs → TrackComponentVisibleEvent-DMuX-byo.cjs} +7 -7
- package/dist/{TrackComponentVisibleEvent-BJgNOypY.js → TrackComponentVisibleEvent-DwfGqNTx.js} +3 -3
- package/dist/{amplitudeContext-CZUzMXHl.d.ts → amplitudeContext-CiO9T9c-.d.ts} +1 -1
- package/dist/amplitudeContext-DOqL2Vn8.js +264 -0
- package/dist/amplitudeContext-ZTQMvVTV.cjs +286 -0
- package/dist/{api-DeW6rHj3.cjs → api-BvygKEiX.cjs} +3 -3
- package/dist/{api-BWSsazAG.js → api-bHEYmSiT.js} +3 -3
- package/dist/app-Aqkm_SlS.js +110 -0
- package/dist/app-BQw_-JGl.cjs +156 -0
- package/dist/application/models/graphql/index.cjs +2 -2
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/graphql/index.js +2 -2
- package/dist/application/models/guards/api/index.cjs +3 -3
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/api/index.js +3 -3
- package/dist/application/models/guards/utils.cjs +1 -1
- package/dist/application/models/guards/utils.d.ts +1 -1
- package/dist/application/models/guards/utils.js +1 -1
- package/dist/application/models/index.cjs +8 -8
- package/dist/application/models/index.d.cts +2 -2
- package/dist/application/models/index.d.ts +11 -11
- package/dist/application/models/index.js +8 -8
- package/dist/application/models/utilityTypes/index.d.ts +1 -1
- package/dist/application/models/variantInfo/index.d.ts +1 -1
- package/dist/application/utils/index.cjs +18 -16
- package/dist/application/utils/index.d.cts +4 -4
- package/dist/application/utils/index.d.ts +13 -13
- package/dist/application/utils/index.js +18 -16
- package/dist/{atomStore-DNji91Im.cjs → atomStore-CmZbgQHc.cjs} +1 -1
- package/dist/{atomStore-DXTVqiKc.js → atomStore-DEcDhiLp.js} +1 -1
- package/dist/atoms/app/index.cjs +17 -22
- package/dist/atoms/app/index.d.cts +2 -2
- package/dist/atoms/app/index.d.ts +19 -19
- package/dist/atoms/app/index.js +12 -17
- package/dist/atoms/atomStore/index.cjs +1 -1
- package/dist/atoms/atomStore/index.js +1 -1
- package/dist/atoms/chat/index.cjs +19 -18
- package/dist/atoms/chat/index.d.cts +28 -28
- package/dist/atoms/chat/index.d.ts +38 -38
- package/dist/atoms/chat/index.js +19 -18
- package/dist/atoms/globalSearch/index.cjs +1 -2
- package/dist/atoms/globalSearch/index.d.cts +5 -5
- package/dist/atoms/globalSearch/index.d.ts +6 -6
- package/dist/atoms/globalSearch/index.js +1 -2
- package/dist/atoms/org/index.cjs +8 -7
- package/dist/atoms/org/index.d.cts +19 -19
- package/dist/atoms/org/index.d.ts +29 -29
- package/dist/atoms/org/index.js +4 -3
- package/dist/atoms/search/index.cjs +26 -25
- package/dist/atoms/search/index.d.cts +3 -3
- package/dist/atoms/search/index.d.ts +13 -13
- package/dist/atoms/search/index.js +26 -25
- package/dist/atoms/search/types.cjs +1 -1
- package/dist/atoms/search/types.d.ts +1 -1
- package/dist/atoms/search/types.js +1 -1
- package/dist/atoms/search/utils.cjs +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/atoms/search/utils.js +1 -1
- package/dist/{cdnContext-DOSIofl8.cjs → cdnContext-Cd0Kvt6g.cjs} +2 -2
- package/dist/{cdnContext-CEGBVVBU.js → cdnContext-D8pHA9gh.js} +2 -2
- package/dist/{chat-DCGriB7h.cjs → chat-CJ9D8n7g.cjs} +1 -1
- package/dist/{chat-CqPuT9_V.cjs → chat-DwNALtox.cjs} +12 -11
- package/dist/{chat-ClvJ9xEj.js → chat-EJbfGWRr.js} +1 -1
- package/dist/{chat-DH70QqJp.js → chat-U1IgKNij.js} +9 -8
- package/dist/{chatElementDisplayLocation-CpgV2wR1.d.ts → chatElementDisplayLocation-DbmdwAff.d.ts} +1 -1
- package/dist/{chatSearch-C7Y-hb-6.js → chatSearch-Bb2SMr9X.js} +7 -7
- package/dist/{chatSearch-DLV4BUGA.cjs → chatSearch-DtE2cUQw.cjs} +7 -7
- package/dist/{chatState-CcFtSqJT.cjs → chatState-B3Dyrd9M.cjs} +5 -5
- package/dist/{chatState-DKnNHmwe.js → chatState-BXBN-12W.js} +3 -3
- package/dist/commerce-api-DXbnMNT8.js +311 -0
- package/dist/commerce-api-Dx02FCQ7.cjs +318 -0
- package/dist/{common-DQPvV_S_.cjs → common-CuwWqIJ1.cjs} +1 -1
- package/dist/{common-c_4eX0qn.js → common-Df2bwzd2.js} +1 -1
- package/dist/{components-DKwVHIjq.cjs → components-BCfFLf9X.cjs} +1 -1
- package/dist/{components-CDpaMUjK.js → components-QGCWJ26c.js} +1 -1
- package/dist/config/index.cjs +4 -4
- package/dist/config/index.d.ts +4 -4
- package/dist/config/index.js +4 -4
- package/dist/config/locators/components/chat/index.cjs +1 -1
- package/dist/config/locators/components/chat/index.d.ts +1 -1
- package/dist/config/locators/components/chat/index.js +1 -1
- package/dist/config/locators/components/common/index.cjs +1 -1
- package/dist/config/locators/components/common/index.d.ts +1 -1
- package/dist/config/locators/components/common/index.js +1 -1
- package/dist/config/locators/components/index.cjs +1 -1
- package/dist/config/locators/components/index.d.ts +1 -1
- package/dist/config/locators/components/index.js +1 -1
- package/dist/config/locators/components/search/index.d.ts +1 -1
- package/dist/config/locators/index.cjs +4 -4
- package/dist/config/locators/index.d.ts +4 -4
- package/dist/config/locators/index.js +4 -4
- package/dist/contexts/amplitudeContext/index.cjs +19 -19
- package/dist/contexts/amplitudeContext/index.d.ts +1 -1
- package/dist/contexts/amplitudeContext/index.js +16 -16
- package/dist/contexts/cdnContext/index.cjs +4 -4
- package/dist/contexts/cdnContext/index.js +4 -4
- package/dist/contexts/chatContext/index.cjs +42 -37
- package/dist/contexts/chatContext/index.d.cts +4 -4
- package/dist/contexts/chatContext/index.d.ts +4 -4
- package/dist/contexts/chatContext/index.js +32 -27
- package/dist/contexts/enviveConfigContext/index.cjs +4 -4
- package/dist/contexts/enviveConfigContext/index.d.cts +1 -1
- package/dist/contexts/enviveConfigContext/index.d.ts +3 -3
- package/dist/contexts/enviveConfigContext/index.js +4 -4
- package/dist/contexts/enviveCssContext/index.cjs +16 -16
- package/dist/contexts/enviveCssContext/index.js +16 -16
- package/dist/contexts/featureFlagContext/index.cjs +6 -6
- package/dist/contexts/featureFlagContext/index.d.cts +1 -1
- package/dist/contexts/featureFlagContext/index.d.ts +3 -3
- package/dist/contexts/featureFlagContext/index.js +6 -6
- package/dist/contexts/featureFlagServiceContext/index.cjs +3 -3
- package/dist/contexts/featureFlagServiceContext/index.d.cts +2 -2
- package/dist/contexts/featureFlagServiceContext/index.d.ts +4 -4
- package/dist/contexts/featureFlagServiceContext/index.js +3 -3
- package/dist/contexts/graphqlContext/index.cjs +11 -11
- package/dist/contexts/graphqlContext/index.d.cts +3 -3
- package/dist/contexts/graphqlContext/index.d.ts +13 -13
- package/dist/contexts/graphqlContext/index.js +11 -11
- package/dist/contexts/localStorageContext/index.cjs +2 -2
- package/dist/contexts/localStorageContext/index.js +2 -2
- package/dist/contexts/newOrgConfigContext/index.cjs +15 -15
- package/dist/contexts/newOrgConfigContext/index.d.cts +4 -4
- package/dist/contexts/newOrgConfigContext/index.d.ts +14 -14
- package/dist/contexts/newOrgConfigContext/index.js +15 -15
- package/dist/contexts/searchContext/index.cjs +19 -22
- package/dist/contexts/searchContext/index.d.ts +2 -2
- package/dist/contexts/searchContext/index.js +19 -22
- package/dist/contexts/sessionStorageContext/index.cjs +2 -2
- package/dist/contexts/sessionStorageContext/index.js +2 -2
- package/dist/contexts/shopifyUrlContext/index.cjs +2 -2
- package/dist/contexts/shopifyUrlContext/index.d.cts +1 -1
- package/dist/contexts/shopifyUrlContext/index.d.ts +3 -3
- package/dist/contexts/shopifyUrlContext/index.js +2 -2
- package/dist/contexts/systemSettingsContext/index.cjs +4 -4
- package/dist/contexts/systemSettingsContext/index.d.cts +6 -6
- package/dist/contexts/systemSettingsContext/index.d.ts +15 -15
- package/dist/contexts/systemSettingsContext/index.js +4 -4
- package/dist/contexts/types.cjs +1 -1
- package/dist/contexts/types.d.cts +1 -1
- package/dist/contexts/types.d.ts +3 -3
- package/dist/contexts/types.js +1 -1
- package/dist/contexts/userIdentityContext/index.cjs +24 -18
- package/dist/contexts/userIdentityContext/index.d.ts +1 -1
- package/dist/contexts/userIdentityContext/index.js +22 -16
- package/dist/{domObserver-Bqf3ooj8.cjs → domObserver-COKvTfZV.cjs} +1 -1
- package/dist/{domObserver-v9ODTyfT.js → domObserver-DEiUh0qg.js} +1 -1
- package/dist/{enviveConfig-Dv9-esGV.cjs → enviveConfig-B42OJ8bK.cjs} +3 -3
- package/dist/{enviveConfig-DZBohDpc.js → enviveConfig-BlIkxiAF.js} +3 -3
- package/dist/{enviveConfigContext-DrDjCems.js → enviveConfigContext-1_EivtCa.js} +3 -3
- package/dist/{enviveConfigContext-D2OELZDR.cjs → enviveConfigContext-Y1ahEAMe.cjs} +3 -3
- package/dist/{featureFlagServiceContext-V0J-69ty.d.ts → featureFlagServiceContext-C5U0bshi.d.ts} +2 -2
- package/dist/{featureFlagServiceContext-FBM6DdMJ.js → featureFlagServiceContext-CAPrb4e_.js} +3 -3
- package/dist/{featureFlagServiceContext-Be_LUbFf.d.cts → featureFlagServiceContext-CiKWV306.d.cts} +2 -2
- package/dist/{featureFlagServiceContext-CJyYItqu.cjs → featureFlagServiceContext-D3Ge8GH5.cjs} +3 -3
- package/dist/{featureGates-qU_ulhpC.cjs → featureGates-Bt_Y3kZ7.cjs} +1 -1
- package/dist/{featureGates-KEwAL8p_.js → featureGates-D4Me_IZH.js} +1 -1
- package/dist/frontendConfig-BiD1-j48.d.ts +856 -0
- package/dist/frontendConfig-tVg0hsWZ.d.cts +856 -0
- package/dist/{globalSearch-FBk2epe8.cjs → globalSearch-BOG3wmck.cjs} +1 -1
- package/dist/{globalSearch-Ccxq8hNF.js → globalSearch-BQEX-2Ml.js} +1 -1
- package/dist/{graphql-3PxNRFOc.js → graphql-OkhsP4ir.js} +2 -2
- package/dist/{graphql-DGYfelZp.cjs → graphql-l4dQrsA6.cjs} +2 -2
- package/dist/graphqlConfig-BnfE0ql5.cjs +39 -0
- package/dist/graphqlConfig-CZGjJ8hP.js +14 -0
- package/dist/{graphqlContext-D67VEQg3.d.cts → graphqlContext-Bf3E-V2T.d.cts} +2 -2
- package/dist/{graphqlContext-BQA6gnpH.d.ts → graphqlContext-CDeKzb46.d.ts} +3 -3
- package/dist/{graphqlContext-W0cZNBf1.cjs → graphqlContext-CpwAvnro.cjs} +5 -5
- package/dist/{graphqlContext-Ci5GRAdH.js → graphqlContext-dyWNSWNv.js} +5 -5
- package/dist/hooks/AmplitudeOperations/index.cjs +18 -18
- package/dist/hooks/AmplitudeOperations/index.d.ts +1 -1
- package/dist/hooks/AmplitudeOperations/index.js +18 -18
- package/dist/hooks/AppDetails/index.cjs +15 -20
- package/dist/hooks/AppDetails/index.d.cts +2 -2
- package/dist/hooks/AppDetails/index.d.ts +11 -11
- package/dist/hooks/AppDetails/index.js +15 -20
- package/dist/hooks/CdnOperations/index.cjs +4 -4
- package/dist/hooks/CdnOperations/index.js +4 -4
- package/dist/hooks/ChatToggle/index.cjs +23 -22
- package/dist/hooks/ChatToggle/index.d.ts +1 -1
- package/dist/hooks/ChatToggle/index.js +20 -19
- package/dist/hooks/ChatToggleAnalytics/index.cjs +19 -19
- package/dist/hooks/ChatToggleAnalytics/index.d.ts +1 -1
- package/dist/hooks/ChatToggleAnalytics/index.js +19 -19
- package/dist/hooks/CustomerSupportHandoff/index.cjs +1 -1
- package/dist/hooks/CustomerSupportHandoff/index.js +1 -1
- package/dist/hooks/Debounce/index.cjs +1 -1
- package/dist/hooks/Debounce/index.js +1 -1
- package/dist/hooks/ElementObserver/index.cjs +1 -1
- package/dist/hooks/ElementObserver/index.d.ts +1 -1
- package/dist/hooks/ElementObserver/index.js +1 -1
- package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
- package/dist/hooks/GraphQLConfig/index.cjs +12 -12
- package/dist/hooks/GraphQLConfig/index.d.cts +3 -3
- package/dist/hooks/GraphQLConfig/index.d.ts +12 -12
- package/dist/hooks/GraphQLConfig/index.js +12 -12
- package/dist/hooks/IdentifyUser/index.cjs +24 -18
- package/dist/hooks/IdentifyUser/index.js +23 -17
- package/dist/hooks/ImageResolver/index.cjs +10 -10
- package/dist/hooks/ImageResolver/index.js +10 -10
- package/dist/hooks/Intersection/index.cjs +1 -1
- package/dist/hooks/Intersection/index.js +1 -1
- package/dist/hooks/LocalStorageOperations/index.cjs +2 -2
- package/dist/hooks/LocalStorageOperations/index.js +2 -2
- package/dist/hooks/MessageFilter/index.cjs +8 -8
- package/dist/hooks/MessageFilter/index.d.cts +2 -2
- package/dist/hooks/MessageFilter/index.d.ts +11 -11
- package/dist/hooks/MessageFilter/index.js +8 -8
- package/dist/hooks/NewOrgConfig/index.cjs +16 -16
- package/dist/hooks/NewOrgConfig/index.d.cts +4 -4
- package/dist/hooks/NewOrgConfig/index.d.ts +14 -14
- package/dist/hooks/NewOrgConfig/index.js +16 -16
- package/dist/hooks/Search/index.cjs +46 -45
- package/dist/hooks/Search/index.d.cts +4 -4
- package/dist/hooks/Search/index.d.ts +15 -15
- package/dist/hooks/Search/index.js +38 -37
- package/dist/hooks/SearchOperations/index.cjs +20 -23
- package/dist/hooks/SearchOperations/index.d.ts +2 -2
- package/dist/hooks/SearchOperations/index.js +20 -23
- package/dist/hooks/SessionStorageOperations/index.cjs +2 -2
- package/dist/hooks/SessionStorageOperations/index.js +2 -2
- package/dist/hooks/ShopifyUrlOperations/index.cjs +2 -2
- package/dist/hooks/ShopifyUrlOperations/index.d.cts +3 -3
- package/dist/hooks/ShopifyUrlOperations/index.d.ts +5 -5
- package/dist/hooks/ShopifyUrlOperations/index.js +2 -2
- package/dist/hooks/SystemSettingsContext/index.cjs +5 -5
- package/dist/hooks/SystemSettingsContext/index.d.cts +4 -4
- package/dist/hooks/SystemSettingsContext/index.d.ts +13 -13
- package/dist/hooks/SystemSettingsContext/index.js +5 -5
- package/dist/hooks/TrackComponentVisibleEvent/index.cjs +18 -18
- package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +2 -2
- package/dist/hooks/TrackComponentVisibleEvent/index.js +18 -18
- package/dist/hooks/UpdateAnalyticsProps/index.cjs +21 -21
- package/dist/hooks/UpdateAnalyticsProps/index.js +16 -16
- package/dist/hooks/utils.d.cts +3 -3
- package/dist/hooks/utils.d.ts +12 -12
- package/dist/{index-DazMsEy_.d.ts → index--uHjE7L8.d.ts} +1 -1
- package/dist/{index-BeYfyZ6k.d.ts → index-B6xpW8RG.d.ts} +1 -1
- package/dist/{index-DLURqmo8.d.cts → index-Bq39XSmY.d.cts} +31 -31
- package/dist/{index-O33GSSRr.d.cts → index-CG3P8xE1.d.cts} +2 -2
- package/dist/{index-CCa4tZuO.d.ts → index-Cx9e-fRi.d.ts} +2 -2
- package/dist/{index-bjMvkcBF.d.ts → index-D2VaMPA3.d.ts} +1 -1
- package/dist/{index-xHVrsrbz.d.ts → index-D31m6bPU.d.ts} +1 -1
- package/dist/{index-h809JLbL.d.ts → index-DSRs6N6J.d.ts} +1 -1
- package/dist/{index-Dfwnna1j.d.ts → index-Dxpscrvz.d.ts} +1 -1
- package/dist/{index-DJTrxIFJ.d.ts → index-VwfWqyR_.d.ts} +1 -1
- package/dist/{index-D4c-port.d.ts → index-fUsw_Mea.d.ts} +6 -6
- package/dist/{index-BlRatkrH.d.ts → index-wFHfdr6p.d.ts} +34 -34
- package/dist/interceptors/index.d.cts +2 -2
- package/dist/interceptors/index.d.ts +12 -12
- package/dist/interceptors/types.d.cts +2 -2
- package/dist/interceptors/types.d.ts +12 -12
- package/dist/{localStorageContext-NRP-CdmF.cjs → localStorageContext-C5giszHn.cjs} +2 -2
- package/dist/{localStorageContext-BPZ82q-G.js → localStorageContext-DAOJ4be4.js} +2 -2
- package/dist/{locators-BMQGmGLq.js → locators-C2fWd-74.js} +1 -1
- package/dist/{locators-DxYdak1F.cjs → locators-Cx3q6Z_h.cjs} +1 -1
- package/dist/{logger-TBIl4uIH.cjs → logger-0D_8Ip2L.cjs} +1 -1
- package/dist/{logger-W3lqg-4b.js → logger-Co0IA3k5.js} +1 -1
- package/dist/{models-D-4db7XW.cjs → models-CkJ-wg9Q.cjs} +5 -5
- package/dist/{models-c86hYW-F.js → models-UHOY0ak5.js} +5 -5
- package/dist/{newOrgConfigAtom-DxILMn2I.cjs → newOrgConfigAtom-CPA6Gp6n.cjs} +1 -1
- package/dist/{newOrgConfigAtom-sqve6LZU.js → newOrgConfigAtom-DEUj6H-p.js} +1 -1
- package/dist/{newOrgConfigContext-DQiuf8nd.js → newOrgConfigContext-6mlrvr1w.js} +5 -5
- package/dist/{newOrgConfigContext-Cl4H9c3q.cjs → newOrgConfigContext-BMvcqPzD.cjs} +5 -5
- package/dist/{newOrgConfigContext-CS8IA5Eg.d.ts → newOrgConfigContext-BVyJExeW.d.ts} +2 -2
- package/dist/{newOrgConfigContext-5Bw7RwT-.d.cts → newOrgConfigContext-DOdUxlOE.d.cts} +2 -2
- package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-DYhDUi7v.d.ts} +1 -1
- package/dist/{org-DlAesvQ_.cjs → org-B_cWn2bt.cjs} +1 -1
- package/dist/{org-vi0njpBh.js → org-h32_LSEb.js} +1 -1
- package/dist/orgAnalyticsConfig-Bm23fw4s.cjs +39 -0
- package/dist/orgAnalyticsConfig-CpBmga08.js +14 -0
- package/dist/{search-1NQLQD9d.d.ts → search-B1OtJe8Z.d.ts} +2 -2
- package/dist/{search-CXXslzAO.cjs → search-D-UfTjB7.cjs} +5 -5
- package/dist/{search-filter-types-DPgeG8FS.d.ts → search-filter-types-OI9zH3E_.d.ts} +1 -1
- package/dist/{search-DBSMrXWv.js → search-yawhMv22.js} +5 -5
- package/dist/{searchContext-DXW6xvXv.cjs → searchContext-CFuwIIW-.cjs} +9 -9
- package/dist/{searchContext-mvwUJncR.js → searchContext-CiqOqTJL.js} +7 -7
- package/dist/{searchServiceAdapter-DEv1tTn0.cjs → searchServiceAdapter-BGlvoZFE.cjs} +1 -1
- package/dist/{searchServiceAdapter-WyCU55NV.js → searchServiceAdapter-Db6jEcJs.js} +1 -1
- package/dist/{sessionStorageContext-1Ks_d4Z0.cjs → sessionStorageContext-BmCW091C.cjs} +2 -2
- package/dist/{sessionStorageContext-CDcl7NVl.js → sessionStorageContext-CNxkqJi1.js} +2 -2
- package/dist/{shopifyUrlContext-CejRZfj7.js → shopifyUrlContext-BXbI0PIG.js} +2 -2
- package/dist/{shopifyUrlContext-lnHoAOEf.cjs → shopifyUrlContext-aZMwCfbJ.cjs} +2 -2
- package/dist/{spiffyWidgets-B1uc84_g.d.ts → spiffyWidgets-CvEJIuJx.d.ts} +1 -1
- package/dist/{systemSettingsContext-B0Kyq7nA.cjs → systemSettingsContext-SozpUezn.cjs} +2 -2
- package/dist/{systemSettingsContext-CVUxEcsU.js → systemSettingsContext-kz6yyiFF.js} +2 -2
- package/dist/{test-types-y6kp-tiw.d.ts → test-types-DRhqHXw-.d.ts} +1 -1
- package/dist/types/index.cjs +1 -16
- package/dist/types/index.d.cts +1 -15
- package/dist/types/index.d.ts +3 -17
- package/dist/types/index.js +2 -16
- package/dist/{types-CxObxLKs.cjs → types-BuvXXGxE.cjs} +1 -1
- package/dist/types-BwNrLPSZ.cjs +106 -0
- package/dist/types-D3uOF0Oy.js +76 -0
- package/dist/{types-CS0Hrzja.js → types-DXnG1tV0.js} +1 -1
- package/dist/{types-BCz-hOvv.d.ts → types-DZPuBnHe.d.ts} +1 -1
- package/dist/{types-Db5Eux6K.d.ts → types-r0Z6CwyF.d.ts} +2 -2
- package/dist/types.d.cts +2 -21
- package/dist/types.d.ts +4 -23
- package/dist/unsupportedProductExceptions-B4f9aLjr.cjs +32 -0
- package/dist/unsupportedProductExceptions-DlmraJm8.js +20 -0
- package/dist/{urlsParser-DxjoLj98.js → urlsParser-DLCzibqU.js} +1 -1
- package/dist/{urlsParser-COzMdJaX.cjs → urlsParser-DhcEZLc_.cjs} +1 -1
- package/dist/{useAmplitudeOperations-jqa7K9dH.cjs → useAmplitudeOperations-D0nvIYlt.cjs} +3 -3
- package/dist/{useAmplitudeOperations-DYs1h8a_.js → useAmplitudeOperations-Dhks3PgF.js} +2 -2
- package/dist/{useAppDetails-C71k0brz.cjs → useAppDetails-B9sGmpJ3.cjs} +7 -7
- package/dist/{useAppDetails-BRUqZEyt.js → useAppDetails-qyaQIbWE.js} +4 -4
- package/dist/{useDebounce-DZ8Cgiwc.cjs → useDebounce-BZDtUAQ8.cjs} +1 -1
- package/dist/{useDebounce-v9cezyjn.js → useDebounce-ueblXZI-.js} +1 -1
- package/dist/{useGraphQLConfig-5VwS9Q_Z.js → useGraphQLConfig-BccQUaeW.js} +2 -2
- package/dist/{useGraphQLConfig-Cj26_J9I.cjs → useGraphQLConfig-CgKEfVYc.cjs} +2 -2
- package/dist/{useIntersection-Cncgxdmy.js → useIntersection-CZSEBUbv.js} +1 -1
- package/dist/{useIntersection-m4PEpvG7.cjs → useIntersection-DSDREfj6.cjs} +1 -1
- package/dist/{userIdentityContext-BVODeTlN.d.ts → userIdentityContext-BKLedN4R.d.ts} +1 -1
- package/dist/userIdentityContext-Cb6lLv6t.cjs +132 -0
- package/dist/userIdentityContext-O_DHHPTN.js +115 -0
- package/dist/{utils-Covisryh.d.ts → utils-B1v0iXs3.d.ts} +4 -4
- package/dist/{utils-BxPPugeP.d.cts → utils-B7PAzB_M.d.cts} +2 -2
- package/dist/{utils-DpneNSJf.d.ts → utils-BhyZiDrE.d.ts} +1 -1
- package/dist/{utils-DIvMgPe8.js → utils-C4ci_t0-.js} +1 -1
- package/dist/{utils-CDw74BCO.cjs → utils-C6imnLBo.cjs} +1 -1
- package/dist/utils-Cazq8Q3q.cjs +715 -0
- package/dist/{utils-2SWrJ12w.cjs → utils-CvLmSsUj.cjs} +1 -1
- package/dist/{utils-CqBxIpEV.js → utils-D82gfbgU.js} +1 -1
- package/dist/utils-DFPt3FSw.js +606 -0
- package/package.json +14 -13
- package/src/application/utils/__tests__/divideArrays.test.ts +12 -13
- package/src/atoms/app/index.ts +1 -2
- package/src/contexts/enviveConfigContext/__tests__/enviveConfigContext.test.tsx +411 -0
- package/src/contexts/types.ts +13 -14
- package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +663 -0
- package/src/contexts/userIdentityContext/userIdentityContext.tsx +6 -0
- package/src/hooks/Search/useSearch.tsx +2 -2
- package/src/types/index.ts +0 -1
- package/src/types.ts +0 -14
- package/dist/frontendConfig-CeWhVevA.d.ts +0 -857
- package/dist/frontendConfig-OWWJmuPc.d.cts +0 -857
- package/dist/globalSearch-B9DRBxSM.cjs +0 -0
- package/dist/globalSearch-BpGfkuXz.js +0 -1
- package/dist/graphqlConfig-GHZ1UgCw.cjs +0 -73
- package/dist/graphqlConfig-mDg6J44N.js +0 -24
- package/dist/hooks/FloatingButtonVisibility/index.cjs +0 -73
- package/dist/hooks/FloatingButtonVisibility/index.d.cts +0 -7
- package/dist/hooks/FloatingButtonVisibility/index.d.ts +0 -7
- package/dist/hooks/FloatingButtonVisibility/index.js +0 -69
- package/dist/hooks/LastInteraction/index.cjs +0 -34
- package/dist/hooks/LastInteraction/index.d.cts +0 -17
- package/dist/hooks/LastInteraction/index.d.ts +0 -17
- package/dist/hooks/LastInteraction/index.js +0 -32
- package/dist/types-CtUb63bt.js +0 -76
- package/dist/types-UUvB6h05.cjs +0 -106
- package/dist/utils-CLGXsOwE.cjs +0 -1591
- package/dist/utils-jYtD3hmA.js +0 -1385
- package/src/hooks/FloatingButtonVisibility/index.ts +0 -1
- package/src/hooks/FloatingButtonVisibility/useFloatingButtonVisibility.ts +0 -99
- package/src/hooks/LastInteraction/index.ts +0 -1
- package/src/hooks/LastInteraction/useLastInteraction.ts +0 -42
- package/src/types/floatingbuttonoverrides-types.ts +0 -10
- /package/dist/{AmplitudeOperations-ni7wVevx.js → AmplitudeOperations-ChZWcSsc.js} +0 -0
- /package/dist/{AmplitudeOperations-DxQnurSG.cjs → AmplitudeOperations-JggIc1zD.cjs} +0 -0
- /package/dist/{index-CgAfoNpB.d.ts → index-mHc9_XC3.d.ts} +0 -0
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
import { logger_default } from "./logger-Co0IA3k5.js";
|
|
2
|
+
import { MessageRole, MessageType, isBaseEcommerceEvent, isGA4EcommerceEvent, isLegacyUAEcommerceEvent } from "./models-UHOY0ak5.js";
|
|
3
|
+
import { SpiffyMetricsEventName } from "./amplitudeContext-DOqL2Vn8.js";
|
|
4
|
+
import { PLPAttributeCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
|
|
5
|
+
|
|
6
|
+
//#region src/application/utils/analyticsUtils.ts
|
|
7
|
+
const NORMALIZED_ADD_TO_CART_EVENT_NAMES = ["addtocart", "addedtocart"];
|
|
8
|
+
const CHECK_DATA_LAYER_INTERVAL_MS = 500;
|
|
9
|
+
const CHECK_DATA_LAYER_MAX_ATTEMPTS = 10;
|
|
10
|
+
/**
|
|
11
|
+
* Checks if a Google Analytics event is an add_to_cart event.
|
|
12
|
+
*
|
|
13
|
+
* @param event The event name to check.
|
|
14
|
+
*
|
|
15
|
+
* @returns True if the event is an add_to_cart event, false otherwise.
|
|
16
|
+
*/
|
|
17
|
+
const isAddToCartEvent = (event) => {
|
|
18
|
+
const normalizedEvent = event.replace(/[-_]/g, "").toLowerCase();
|
|
19
|
+
return NORMALIZED_ADD_TO_CART_EVENT_NAMES.some((name) => normalizedEvent.includes(name));
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Tracks an add_to_cart event in Amplitude.
|
|
23
|
+
*
|
|
24
|
+
* @param event The event to track.
|
|
25
|
+
*/
|
|
26
|
+
const handleAddToCartEvent = (event, track) => {
|
|
27
|
+
let eventProps;
|
|
28
|
+
if (isLegacyUAEcommerceEvent(event)) eventProps = {
|
|
29
|
+
items: event.ecommerce.add.products.map((product) => ({
|
|
30
|
+
item_name: product.name,
|
|
31
|
+
item_category: product.category,
|
|
32
|
+
price: product.price,
|
|
33
|
+
quantity: product.quantity
|
|
34
|
+
})),
|
|
35
|
+
currency: event.ecommerce.add.currencyCode,
|
|
36
|
+
event_format_version: "legacy_universal_analytics"
|
|
37
|
+
};
|
|
38
|
+
else if (isGA4EcommerceEvent(event)) eventProps = {
|
|
39
|
+
items: event.ecommerce.items.map((item) => ({
|
|
40
|
+
item_name: item.item_name,
|
|
41
|
+
item_category: item.item_category,
|
|
42
|
+
price: item.price,
|
|
43
|
+
quantity: item.quantity
|
|
44
|
+
})),
|
|
45
|
+
currency: event.ecommerce.currency,
|
|
46
|
+
event_format_version: "google_analytics_4"
|
|
47
|
+
};
|
|
48
|
+
else eventProps = {
|
|
49
|
+
event_properties: { ...event },
|
|
50
|
+
event_format_version: "unknown"
|
|
51
|
+
};
|
|
52
|
+
track(SpiffyMetricsEventName.AddToCartClicked, { eventProps });
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Wraps the window.dataLayer.push method to intercept add_to_cart events and send them to Amplitude.
|
|
56
|
+
* This function runs on an interval until the dataLayer is available.
|
|
57
|
+
*/
|
|
58
|
+
const initDataLayerWrapper = (track) => {
|
|
59
|
+
let attempts = 0;
|
|
60
|
+
const checkAndInitialize = () => {
|
|
61
|
+
if (!window.dataLayer || !window.dataLayer.push) {
|
|
62
|
+
attempts += 1;
|
|
63
|
+
if (attempts >= CHECK_DATA_LAYER_MAX_ATTEMPTS) {
|
|
64
|
+
logger_default.logDebug(`[spiffy-ai] dataLayer not available after ${CHECK_DATA_LAYER_MAX_ATTEMPTS} attempts`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
setTimeout(checkAndInitialize, CHECK_DATA_LAYER_INTERVAL_MS);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
logger_default.logDebug("[spiffy-ai] dataLayer is available, wrapping push function...");
|
|
71
|
+
const originalPush = window.dataLayer.push;
|
|
72
|
+
window.dataLayer.push = (...args) => {
|
|
73
|
+
if (isBaseEcommerceEvent(args[0]) && isAddToCartEvent(args[0].event)) handleAddToCartEvent(args[0], track);
|
|
74
|
+
return originalPush.apply(window.dataLayer, args);
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
checkAndInitialize();
|
|
78
|
+
};
|
|
79
|
+
const initAmplitude = (track) => {
|
|
80
|
+
track(SpiffyMetricsEventName.BundleLoaded);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/application/utils/coreContextToApiContext.ts
|
|
85
|
+
const coreContextToApiContext = (context) => ({
|
|
86
|
+
chat_id: context.chatId,
|
|
87
|
+
org_id: context.orgId,
|
|
88
|
+
user_id: context.userId,
|
|
89
|
+
org_short_name: context.orgShortName,
|
|
90
|
+
source: context.source,
|
|
91
|
+
env: context.env
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
//#region src/application/utils/coreUserEventToApiUserEvent.ts
|
|
96
|
+
const coreUserEventToApiUserEvent = (data) => {
|
|
97
|
+
if (data.category === UserEventCategory.PdpVisit || data.category === UserEventCategory.AddToCart) return {
|
|
98
|
+
event_id: data.eventId,
|
|
99
|
+
created_at: data.createdAt,
|
|
100
|
+
category: data.category,
|
|
101
|
+
attributes: {
|
|
102
|
+
product_id: data.attributes.productId,
|
|
103
|
+
parent_product_id: data.attributes.parentProductId,
|
|
104
|
+
url: data.attributes.url
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
if (data.category === UserEventCategory.PlpVisit) return {
|
|
108
|
+
event_id: data.eventId,
|
|
109
|
+
created_at: data.createdAt,
|
|
110
|
+
category: data.category,
|
|
111
|
+
attributes: {
|
|
112
|
+
category: PLPAttributeCategory.Id,
|
|
113
|
+
attributes: { id: data.attributes.attributes.id }
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
if (data.category === UserEventCategory.QueryTyped) return {
|
|
117
|
+
event_id: data.eventId,
|
|
118
|
+
created_at: data.createdAt,
|
|
119
|
+
category: data.category,
|
|
120
|
+
attributes: { query: data.attributes.query }
|
|
121
|
+
};
|
|
122
|
+
if (data.category === UserEventCategory.Search) return {
|
|
123
|
+
event_id: data.eventId,
|
|
124
|
+
created_at: data.createdAt,
|
|
125
|
+
category: data.category,
|
|
126
|
+
attributes: {
|
|
127
|
+
search_term: data.attributes.searchTerm,
|
|
128
|
+
selected_filters: data.attributes.selectedFilters
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
if (data.category === UserEventCategory.SuggestionClicked) return {
|
|
132
|
+
event_id: data.eventId,
|
|
133
|
+
created_at: data.createdAt,
|
|
134
|
+
category: data.category,
|
|
135
|
+
attributes: { suggestion_id: data.attributes.suggestionId }
|
|
136
|
+
};
|
|
137
|
+
if (data.category === UserEventCategory.PageVisit) return {
|
|
138
|
+
event_id: data.eventId,
|
|
139
|
+
created_at: data.createdAt,
|
|
140
|
+
category: data.category,
|
|
141
|
+
attributes: {
|
|
142
|
+
url: data.attributes.url,
|
|
143
|
+
page_visit_category: data.attributes.pageVisitCategory
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
if (data.category === UserEventCategory.FormSubmitted) return {
|
|
147
|
+
event_id: data.eventId,
|
|
148
|
+
created_at: data.createdAt,
|
|
149
|
+
category: data.category,
|
|
150
|
+
attributes: {
|
|
151
|
+
filled_schema: { ...data.attributes.filledSchema },
|
|
152
|
+
form_response_id: data.attributes.formResponseId,
|
|
153
|
+
form_type: data.attributes.formType
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
event_id: data.eventId,
|
|
158
|
+
created_at: data.createdAt,
|
|
159
|
+
category: data.category
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
//#region src/application/utils/divideArray.ts
|
|
165
|
+
const divideArray = (array, size) => {
|
|
166
|
+
const rows = [];
|
|
167
|
+
for (let i = 0; i < size; i += 1) rows.push(array.filter((_, index) => index % size === i));
|
|
168
|
+
return rows;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
//#endregion
|
|
172
|
+
//#region src/application/utils/imageFilter.ts
|
|
173
|
+
const getRecentProductImageUrls = (lastMessages, currentProductId) => {
|
|
174
|
+
const productMessages = lastMessages.filter((message) => message.type === MessageType.Product && message.metadata?.imageUrl).map((m) => m);
|
|
175
|
+
return [...productMessages.filter((m) => m.metadata?.id === currentProductId), ...productMessages.filter((m) => m.metadata?.id !== currentProductId)].map((m) => m.metadata.imageUrl);
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/application/utils/merchantUtils.ts
|
|
180
|
+
const prepareMerchantPage = () => {
|
|
181
|
+
let metaViewport = document.querySelector("meta[name='viewport']");
|
|
182
|
+
if (metaViewport) {
|
|
183
|
+
const content = metaViewport.getAttribute("content");
|
|
184
|
+
if (!content?.includes("maximum-scale=1")) metaViewport.setAttribute("content", `${content}, maximum-scale=1`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
metaViewport = document.createElement("meta");
|
|
188
|
+
metaViewport.setAttribute("name", "viewport");
|
|
189
|
+
metaViewport.setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1");
|
|
190
|
+
document.head.appendChild(metaViewport);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
//#endregion
|
|
194
|
+
//#region src/application/utils/messageFromFormSubmittedEvent.ts
|
|
195
|
+
const messageFromFormSubmittedEvent = (event, formResponseAttributes) => {
|
|
196
|
+
if (event.category !== UserEventCategory.FormSubmitted) return;
|
|
197
|
+
const formStringContents = Object.entries(formResponseAttributes.schema.properties).map(([key, value]) => `${value.title}: ${event.attributes.filledSchema[key]}`).join("\n");
|
|
198
|
+
return {
|
|
199
|
+
id: event.eventId,
|
|
200
|
+
role: MessageRole.User,
|
|
201
|
+
type: MessageType.QueryTyped,
|
|
202
|
+
createdAt: event.createdAt,
|
|
203
|
+
metadata: { content: formStringContents }
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
//#endregion
|
|
208
|
+
//#region src/application/utils/messageFromQueryEvent.ts
|
|
209
|
+
/**
|
|
210
|
+
* Transforms a query UserEvent object into a Message object for presentation.
|
|
211
|
+
*
|
|
212
|
+
* @param event The user event object received from the server
|
|
213
|
+
*
|
|
214
|
+
* @returns A Message if the event is a query event, otherwise undefined
|
|
215
|
+
*/
|
|
216
|
+
const messageFromQueryEvent = (event) => {
|
|
217
|
+
if (event.category === UserEventCategory.QueryTyped) return {
|
|
218
|
+
id: event.eventId,
|
|
219
|
+
role: MessageRole.User,
|
|
220
|
+
type: MessageType.QueryTyped,
|
|
221
|
+
createdAt: event.createdAt,
|
|
222
|
+
metadata: { content: event.attributes.query }
|
|
223
|
+
};
|
|
224
|
+
if (event.category === UserEventCategory.Search) return {
|
|
225
|
+
id: event.eventId,
|
|
226
|
+
role: MessageRole.User,
|
|
227
|
+
type: MessageType.Search,
|
|
228
|
+
createdAt: event.createdAt,
|
|
229
|
+
metadata: {
|
|
230
|
+
searchTerm: event.attributes.searchTerm || "",
|
|
231
|
+
selectedFilters: event.attributes.selectedFilters || []
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
//#endregion
|
|
237
|
+
//#region src/application/utils/messageFromResponse.ts
|
|
238
|
+
/**
|
|
239
|
+
* Transforms a server Response object into a Message object for presentation.
|
|
240
|
+
*
|
|
241
|
+
* @param response The response object received from the server containing model generated content
|
|
242
|
+
*
|
|
243
|
+
* @returns A Message if the response contains known attributes, undefined otherwise
|
|
244
|
+
*/
|
|
245
|
+
const messageFromResponse = (response) => {
|
|
246
|
+
if (response == null) return;
|
|
247
|
+
if (response.category === ResponseCategory.Text) return {
|
|
248
|
+
id: response.id,
|
|
249
|
+
createdAt: response.createdAt,
|
|
250
|
+
type: MessageType.Text,
|
|
251
|
+
role: MessageRole.Assistant,
|
|
252
|
+
metadata: { content: response.attributes.content }
|
|
253
|
+
};
|
|
254
|
+
if (response.category === ResponseCategory.Product) return {
|
|
255
|
+
id: response.id,
|
|
256
|
+
createdAt: response.createdAt,
|
|
257
|
+
role: MessageRole.Assistant,
|
|
258
|
+
type: MessageType.Product,
|
|
259
|
+
metadata: { ...response.attributes }
|
|
260
|
+
};
|
|
261
|
+
if (response.category === ResponseCategory.Review) return {
|
|
262
|
+
id: response.id,
|
|
263
|
+
createdAt: response.createdAt,
|
|
264
|
+
type: MessageType.Review,
|
|
265
|
+
role: MessageRole.Assistant,
|
|
266
|
+
metadata: {
|
|
267
|
+
review: response.attributes.review,
|
|
268
|
+
reviewer: response.attributes.reviewer,
|
|
269
|
+
stars: response.attributes.stars,
|
|
270
|
+
title: response.attributes.title,
|
|
271
|
+
richInformation: response.attributes.richInformation
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
if (response.category === ResponseCategory.Separator) return {
|
|
275
|
+
id: response.id,
|
|
276
|
+
createdAt: response.createdAt,
|
|
277
|
+
type: MessageType.Separator,
|
|
278
|
+
role: MessageRole.Assistant
|
|
279
|
+
};
|
|
280
|
+
if (response.category === ResponseCategory.Page) return {
|
|
281
|
+
id: response.id,
|
|
282
|
+
createdAt: response.createdAt,
|
|
283
|
+
role: MessageRole.Assistant,
|
|
284
|
+
type: MessageType.Page,
|
|
285
|
+
metadata: { ...response.attributes }
|
|
286
|
+
};
|
|
287
|
+
if (response.category === ResponseCategory.ProductSearch) return {
|
|
288
|
+
id: response.id,
|
|
289
|
+
createdAt: response.createdAt,
|
|
290
|
+
role: MessageRole.Assistant,
|
|
291
|
+
type: MessageType.ProductSearch,
|
|
292
|
+
metadata: { ...response.attributes }
|
|
293
|
+
};
|
|
294
|
+
if (response.category === ResponseCategory.ProductSearchFilter) return {
|
|
295
|
+
id: response.id,
|
|
296
|
+
createdAt: response.createdAt,
|
|
297
|
+
role: MessageRole.Assistant,
|
|
298
|
+
type: MessageType.ProductSearchFilter,
|
|
299
|
+
metadata: { ...response.attributes }
|
|
300
|
+
};
|
|
301
|
+
if (response.category === ResponseCategory.Form) return {
|
|
302
|
+
id: response.id,
|
|
303
|
+
createdAt: response.createdAt,
|
|
304
|
+
role: MessageRole.Assistant,
|
|
305
|
+
type: MessageType.Form,
|
|
306
|
+
metadata: {
|
|
307
|
+
formType: response.attributes.formCategory?.formType,
|
|
308
|
+
fields: Object.entries(response.attributes.schema.properties).map(([key, value]) => ({
|
|
309
|
+
key,
|
|
310
|
+
title: value.title,
|
|
311
|
+
type: value.type,
|
|
312
|
+
format: value.format,
|
|
313
|
+
required: response.attributes.schema.required.includes(key)
|
|
314
|
+
}))
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
if (response.category === ResponseCategory.Order) return {
|
|
318
|
+
id: response.id,
|
|
319
|
+
createdAt: response.createdAt,
|
|
320
|
+
role: MessageRole.Assistant,
|
|
321
|
+
type: MessageType.Order,
|
|
322
|
+
metadata: { ...response.attributes }
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
//#endregion
|
|
327
|
+
//#region src/application/utils/messageFromSuggestionEvent.ts
|
|
328
|
+
/**
|
|
329
|
+
* Transforms a UserEvent object into a Message object for presentation.
|
|
330
|
+
*
|
|
331
|
+
* @param event The UserEvent object received from the server
|
|
332
|
+
* @param suggestions A list of generated suggestions to match the event to
|
|
333
|
+
*
|
|
334
|
+
* @returns A Message if the event is a suggestion click event, undefined otherwise
|
|
335
|
+
*/
|
|
336
|
+
const messageFromSuggestionEvent = (event, suggestions) => {
|
|
337
|
+
if (event.category === UserEventCategory.SuggestionClicked) {
|
|
338
|
+
const { suggestionId } = event.attributes;
|
|
339
|
+
return {
|
|
340
|
+
id: event.eventId,
|
|
341
|
+
role: MessageRole.User,
|
|
342
|
+
type: MessageType.SuggestionClicked,
|
|
343
|
+
createdAt: event.createdAt,
|
|
344
|
+
metadata: {
|
|
345
|
+
suggestionId,
|
|
346
|
+
suggestionContent: suggestions.find((s) => s.id === suggestionId)?.content ?? ""
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region src/application/utils/nextMessageRequestToApiRequest.ts
|
|
354
|
+
const messageRequestToCommerceMessageRequest = (data) => ({
|
|
355
|
+
context: {
|
|
356
|
+
chat_id: data.context.chatId,
|
|
357
|
+
org_id: data.context.orgId,
|
|
358
|
+
org_short_name: data.context.orgShortName,
|
|
359
|
+
user_id: data.context.userId,
|
|
360
|
+
source: data.context.source,
|
|
361
|
+
env: data.context.env
|
|
362
|
+
},
|
|
363
|
+
id: data.id,
|
|
364
|
+
feature_flags: data.featureFlags,
|
|
365
|
+
user_events: data.userEvents?.map((userEvent) => coreUserEventToApiUserEvent(userEvent)),
|
|
366
|
+
generation_params: {
|
|
367
|
+
model: data.generationParams?.model,
|
|
368
|
+
max_tokens: data.generationParams?.maxTokens,
|
|
369
|
+
stop: data.generationParams?.stop,
|
|
370
|
+
stream: data.generationParams?.stream,
|
|
371
|
+
temperature: data.generationParams?.temperature,
|
|
372
|
+
top_p: data.generationParams?.topP,
|
|
373
|
+
num_suggestions: data.generationParams?.numSuggestions,
|
|
374
|
+
response_system_prompt: data.generationParams?.responseSystemPrompt,
|
|
375
|
+
suggestion_system_prompt: data.generationParams?.suggestionSystemPrompt,
|
|
376
|
+
response_caching: data.generationParams?.responseCaching
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
//#endregion
|
|
381
|
+
//#region src/application/utils/nodeSelector.ts
|
|
382
|
+
var NodeSelector = class {
|
|
383
|
+
constructor(pattern) {
|
|
384
|
+
this.pattern = pattern;
|
|
385
|
+
this.root = document;
|
|
386
|
+
}
|
|
387
|
+
getPattern() {
|
|
388
|
+
return this.pattern;
|
|
389
|
+
}
|
|
390
|
+
setRoot(root) {
|
|
391
|
+
this.root = root;
|
|
392
|
+
}
|
|
393
|
+
getRoot() {
|
|
394
|
+
return this.root;
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
var QuerySelector = class extends NodeSelector {
|
|
398
|
+
parse() {
|
|
399
|
+
return this.getRoot().querySelector(this.getPattern());
|
|
400
|
+
}
|
|
401
|
+
};
|
|
402
|
+
var IDSelector = class extends NodeSelector {
|
|
403
|
+
parse() {
|
|
404
|
+
return this.getRoot().getElementById(this.getPattern());
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
var XpathSelector = class extends NodeSelector {
|
|
408
|
+
parse() {
|
|
409
|
+
return this.getRoot()?.evaluate(this.getPattern(), this.getRoot(), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)?.singleNodeValue;
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
var ChainSelector = class extends NodeSelector {
|
|
413
|
+
parse() {
|
|
414
|
+
let selectorIndex = 0;
|
|
415
|
+
const selectors = this.getPattern().split("@");
|
|
416
|
+
const lastIndex = selectors.length - 1;
|
|
417
|
+
const parseChain = (pattern, prevNode) => {
|
|
418
|
+
const selector = SelectorFactory.parse(pattern);
|
|
419
|
+
if (prevNode) selector.setRoot(prevNode);
|
|
420
|
+
const currentNode = selector.parse();
|
|
421
|
+
if (selectorIndex === lastIndex) return currentNode;
|
|
422
|
+
let node = currentNode || document;
|
|
423
|
+
if (currentNode?.shadowRoot) node = currentNode.shadowRoot;
|
|
424
|
+
if (currentNode?.contentWindow) node = currentNode.contentWindow?.document;
|
|
425
|
+
return parseChain(selectors[++selectorIndex].trim(), node);
|
|
426
|
+
};
|
|
427
|
+
return parseChain(selectors[selectorIndex].trim());
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
var Empty = class extends NodeSelector {
|
|
431
|
+
constructor() {
|
|
432
|
+
super("");
|
|
433
|
+
}
|
|
434
|
+
parse() {
|
|
435
|
+
return null;
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
var SelectorFactory = class {
|
|
439
|
+
static parse(composedSelector) {
|
|
440
|
+
if (!composedSelector) return new Empty();
|
|
441
|
+
const split = composedSelector.split("|");
|
|
442
|
+
const type = split[0];
|
|
443
|
+
const selector = split[1];
|
|
444
|
+
switch (type) {
|
|
445
|
+
case "id": return this.id(selector);
|
|
446
|
+
case "query": return this.query(selector);
|
|
447
|
+
case "xpath": return this.xpath(selector);
|
|
448
|
+
default: return new Empty();
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
static check(selector) {
|
|
452
|
+
return selector ?? new Empty();
|
|
453
|
+
}
|
|
454
|
+
static chain(pattern) {
|
|
455
|
+
return pattern ? new ChainSelector(pattern) : new Empty();
|
|
456
|
+
}
|
|
457
|
+
static id(pattern) {
|
|
458
|
+
return pattern ? new IDSelector(pattern) : new Empty();
|
|
459
|
+
}
|
|
460
|
+
static query(pattern) {
|
|
461
|
+
return pattern ? new QuerySelector(pattern) : new Empty();
|
|
462
|
+
}
|
|
463
|
+
static xpath(pattern) {
|
|
464
|
+
return pattern ? new XpathSelector(pattern) : new Empty();
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
//#endregion
|
|
469
|
+
//#region src/application/utils/overrides.ts
|
|
470
|
+
function isPlainObject(x) {
|
|
471
|
+
return !!x && typeof x === "object" && !Array.isArray(x) && !(x instanceof Date) && !(x instanceof RegExp);
|
|
472
|
+
}
|
|
473
|
+
function isReplace(x) {
|
|
474
|
+
return !!x && typeof x === "object" && "$replace" in x;
|
|
475
|
+
}
|
|
476
|
+
function isDelete(x) {
|
|
477
|
+
return !!x && typeof x === "object" && x.$delete === true;
|
|
478
|
+
}
|
|
479
|
+
function isPrimitiveValue(x) {
|
|
480
|
+
const t = typeof x;
|
|
481
|
+
return x === null || t === "string" || t === "number" || t === "boolean" || t === "bigint" || t === "symbol" || t === "undefined";
|
|
482
|
+
}
|
|
483
|
+
function isArrayOfPrimitives(arr) {
|
|
484
|
+
if (arr.length === 0) return false;
|
|
485
|
+
for (let i = 0; i < arr.length; i += 1) {
|
|
486
|
+
const v = arr[i];
|
|
487
|
+
if (v !== void 0 && !isPrimitiveValue(v)) return false;
|
|
488
|
+
}
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
function mergeAny(baseAny, patchAny, opts) {
|
|
492
|
+
if (isReplace(patchAny)) return patchAny.$replace;
|
|
493
|
+
if (isDelete(patchAny)) return void 0;
|
|
494
|
+
if (Array.isArray(baseAny)) {
|
|
495
|
+
if (Array.isArray(patchAny)) {
|
|
496
|
+
const baseArr = baseAny;
|
|
497
|
+
const patchArr = patchAny;
|
|
498
|
+
if (opts.arrayStrategy === "replace" || isArrayOfPrimitives(baseArr) || isArrayOfPrimitives(patchArr)) return patchAny;
|
|
499
|
+
const out = baseArr.slice();
|
|
500
|
+
const max = Math.max(out.length, patchArr.length);
|
|
501
|
+
for (let i = 0; i < max; i += 1) {
|
|
502
|
+
const pVal = patchArr[i];
|
|
503
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
504
|
+
}
|
|
505
|
+
return out;
|
|
506
|
+
}
|
|
507
|
+
return baseAny;
|
|
508
|
+
}
|
|
509
|
+
if (isPlainObject(baseAny) && isPlainObject(patchAny)) {
|
|
510
|
+
const baseObj = baseAny;
|
|
511
|
+
const patchObj = patchAny;
|
|
512
|
+
const out = { ...baseObj };
|
|
513
|
+
for (const key of Object.keys(patchObj)) {
|
|
514
|
+
const pVal = patchObj[key];
|
|
515
|
+
if (pVal === void 0) {} else if (opts.nullDeletes && pVal === null) delete out[key];
|
|
516
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
517
|
+
else if (isDelete(pVal)) delete out[key];
|
|
518
|
+
else out[key] = mergeAny(baseObj?.[key], pVal, opts);
|
|
519
|
+
}
|
|
520
|
+
return out;
|
|
521
|
+
}
|
|
522
|
+
return patchAny ?? baseAny;
|
|
523
|
+
}
|
|
524
|
+
function applyOverrides(base, patch, opts = {}) {
|
|
525
|
+
const { arrayStrategy = "mergeByIndex", nullDeletes = false } = opts;
|
|
526
|
+
if (isReplace(patch)) return patch.$replace;
|
|
527
|
+
if (isDelete(patch)) return void 0;
|
|
528
|
+
if (Array.isArray(base)) {
|
|
529
|
+
if (isReplace(patch)) return patch.$replace;
|
|
530
|
+
if (Array.isArray(patch)) {
|
|
531
|
+
if (arrayStrategy === "replace") return patch;
|
|
532
|
+
const out = base.slice();
|
|
533
|
+
const max = Math.max(out.length, patch.length);
|
|
534
|
+
for (let i = 0; i < max; i += 1) {
|
|
535
|
+
const pVal = patch[i];
|
|
536
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
537
|
+
}
|
|
538
|
+
return out;
|
|
539
|
+
}
|
|
540
|
+
return base;
|
|
541
|
+
}
|
|
542
|
+
if (isPlainObject(base) && isPlainObject(patch)) {
|
|
543
|
+
const out = { ...base };
|
|
544
|
+
const patchObj = patch;
|
|
545
|
+
for (const key of Object.keys(patchObj)) {
|
|
546
|
+
const pVal = patchObj[key];
|
|
547
|
+
if (pVal === void 0) {} else if (nullDeletes && pVal === null) delete out[key];
|
|
548
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
549
|
+
else if (isDelete(pVal)) delete out[key];
|
|
550
|
+
else {
|
|
551
|
+
const bVal = base[key];
|
|
552
|
+
out[key] = mergeAny(bVal, pVal, opts);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
return out;
|
|
556
|
+
}
|
|
557
|
+
return patch ?? base;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
//#endregion
|
|
561
|
+
//#region src/application/utils/stringUtils.ts
|
|
562
|
+
var StringUtils = class StringUtils {
|
|
563
|
+
static isNullOrEmpty(value) {
|
|
564
|
+
const valueTrimmed = value?.trim();
|
|
565
|
+
return value === void 0 || valueTrimmed === "";
|
|
566
|
+
}
|
|
567
|
+
static trimToNull(value) {
|
|
568
|
+
const valueTrimmed = value?.trim();
|
|
569
|
+
return StringUtils.isNullOrEmpty(valueTrimmed) ? void 0 : valueTrimmed;
|
|
570
|
+
}
|
|
571
|
+
static capitalize(type) {
|
|
572
|
+
if (type === void 0) return "";
|
|
573
|
+
return type.charAt(0).toUpperCase() + type.substring(1);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Finds the first pattern in an array that matches a given URL.
|
|
577
|
+
* Patterns can include a single wildcard '*' which matches any sequence of characters.
|
|
578
|
+
*
|
|
579
|
+
* @param patterns
|
|
580
|
+
* @param urlToTest
|
|
581
|
+
* @returns
|
|
582
|
+
*/
|
|
583
|
+
static findMatchingPattern(patterns, urlToTest) {
|
|
584
|
+
if (!urlToTest) return;
|
|
585
|
+
for (const pattern of patterns) if (urlToTest.pathname !== "/") {
|
|
586
|
+
const regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
587
|
+
if ((/* @__PURE__ */ new RegExp(`^${regexPattern}$`)).test(urlToTest.pathname)) return pattern;
|
|
588
|
+
} else if (pattern.startsWith(urlToTest.hostname)) return pattern;
|
|
589
|
+
}
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
//#endregion
|
|
593
|
+
//#region src/application/utils/supportedEventRequestToApiRequest.ts
|
|
594
|
+
const coreSupportedEventRequestToApiRequest = (coreSupportedEventRequest) => ({
|
|
595
|
+
id: coreSupportedEventRequest.id,
|
|
596
|
+
user_event: coreUserEventToApiUserEvent(coreSupportedEventRequest.userEvent),
|
|
597
|
+
context: coreContextToApiContext(coreSupportedEventRequest.context)
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
//#endregion
|
|
601
|
+
//#region src/application/utils/validation.ts
|
|
602
|
+
const validateEmail = (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|
|
603
|
+
|
|
604
|
+
//#endregion
|
|
605
|
+
export { NodeSelector, SelectorFactory, StringUtils, applyOverrides, coreContextToApiContext, coreSupportedEventRequestToApiRequest, coreUserEventToApiUserEvent, divideArray, getRecentProductImageUrls, initAmplitude, initDataLayerWrapper, messageFromFormSubmittedEvent, messageFromQueryEvent, messageFromResponse, messageFromSuggestionEvent, messageRequestToCommerceMessageRequest, prepareMerchantPage, validateEmail };
|
|
606
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtREZQdDNGU3cuanMiLCJuYW1lcyI6WyJldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkIiwib3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9hbmFseXRpY3NVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlQ29udGV4dFRvQXBpQ29udGV4dC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvZGl2aWRlQXJyYXkudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvaW1hZ2VGaWx0ZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVyY2hhbnRVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbVF1ZXJ5RXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21SZXNwb25zZS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9uZXh0TWVzc2FnZVJlcXVlc3RUb0FwaVJlcXVlc3QudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbm9kZVNlbGVjdG9yLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL292ZXJyaWRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9zdHJpbmdVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9zdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvdmFsaWRhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nZ2VyIGZyb20gXCJzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXJcIjtcbmltcG9ydCB7XG4gIGlzTGVnYWN5VUFFY29tbWVyY2VFdmVudCxcbiAgaXNHQTRFY29tbWVyY2VFdmVudCxcbiAgaXNCYXNlRWNvbW1lcmNlRXZlbnQsXG4gIEJhc2VFY29tbWVyY2VFdmVudCxcbn0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUgfSBmcm9tIFwic3JjL2NvbnRleHRzL2FtcGxpdHVkZUNvbnRleHQvYW1wbGl0dWRlQ29udGV4dFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGRhdGFMYXllcjogYW55W107XG4gIH1cbn1cblxuY29uc3QgTk9STUFMSVpFRF9BRERfVE9fQ0FSVF9FVkVOVF9OQU1FUyA9IFtcImFkZHRvY2FydFwiLCBcImFkZGVkdG9jYXJ0XCJdO1xuY29uc3QgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyA9IDUwMDtcbmNvbnN0IENIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTID0gMTA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgR29vZ2xlIEFuYWx5dGljcyBldmVudCBpcyBhbiBhZGRfdG9fY2FydCBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG5hbWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYW4gYWRkX3RvX2NhcnQgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuY29uc3QgaXNBZGRUb0NhcnRFdmVudCA9IChldmVudDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFdmVudCA9IGV2ZW50LnJlcGxhY2UoL1stX10vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIE5PUk1BTElaRURfQUREX1RPX0NBUlRfRVZFTlRfTkFNRVMuc29tZSgobmFtZSkgPT5cbiAgICBub3JtYWxpemVkRXZlbnQuaW5jbHVkZXMobmFtZSlcbiAgKTtcbn07XG5cbi8qKlxuICogVHJhY2tzIGFuIGFkZF90b19jYXJ0IGV2ZW50IGluIEFtcGxpdHVkZS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyYWNrLlxuICovXG5jb25zdCBoYW5kbGVBZGRUb0NhcnRFdmVudCA9IChcbiAgZXZlbnQ6IEJhc2VFY29tbWVyY2VFdmVudCxcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAoaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50KGV2ZW50KSkge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBpdGVtczogZXZlbnQuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICBpdGVtX2NhdGVnb3J5OiBwcm9kdWN0LmNhdGVnb3J5LFxuICAgICAgICBwcmljZTogcHJvZHVjdC5wcmljZSxcbiAgICAgICAgcXVhbnRpdHk6IHByb2R1Y3QucXVhbnRpdHksXG4gICAgICB9KSksXG4gICAgICBjdXJyZW5jeTogZXZlbnQuZWNvbW1lcmNlLmFkZC5jdXJyZW5jeUNvZGUsXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJsZWdhY3lfdW5pdmVyc2FsX2FuYWx5dGljc1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNHQTRFY29tbWVyY2VFdmVudChldmVudCkpIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgaXRlbXM6IGV2ZW50LmVjb21tZXJjZS5pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogaXRlbS5pdGVtX25hbWUsXG4gICAgICAgIGl0ZW1fY2F0ZWdvcnk6IGl0ZW0uaXRlbV9jYXRlZ29yeSxcbiAgICAgICAgcHJpY2U6IGl0ZW0ucHJpY2UsXG4gICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgfSkpLFxuICAgICAgY3VycmVuY3k6IGV2ZW50LmVjb21tZXJjZS5jdXJyZW5jeSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcImdvb2dsZV9hbmFseXRpY3NfNFwiLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IHsgLi4uZXZlbnQgfSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcInVua25vd25cIixcbiAgICB9O1xuICB9XG5cbiAgdHJhY2soU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5BZGRUb0NhcnRDbGlja2VkLCB7XG4gICAgZXZlbnRQcm9wcyxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFdyYXBzIHRoZSB3aW5kb3cuZGF0YUxheWVyLnB1c2ggbWV0aG9kIHRvIGludGVyY2VwdCBhZGRfdG9fY2FydCBldmVudHMgYW5kIHNlbmQgdGhlbSB0byBBbXBsaXR1ZGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgb24gYW4gaW50ZXJ2YWwgdW50aWwgdGhlIGRhdGFMYXllciBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0RGF0YUxheWVyV3JhcHBlciA9IChcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgLy8gY3VycmVudGx5LCBvdXIgYnVuZGxlIGlzIGFsd2F5cyBsb2FkZWQgYWZ0ZXIgR1RNIGhhcyBpbml0aWFsaXplZCBHQS9kYXRhTGF5ZXJcbiAgLy8gd2UnbGwgbmVlZCB0aGlzIGNoZWNrIGhlcmUgaWYvd2hlbiB3ZSBsb2FkIHNwaWZmeSBiZWZvcmUvb3V0c2lkZSBvZiBHVE1cbiAgY29uc3QgY2hlY2tBbmRJbml0aWFsaXplID0gKCkgPT4ge1xuICAgIGlmICghd2luZG93LmRhdGFMYXllciB8fCAhKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55KS5wdXNoKSB7XG4gICAgICBhdHRlbXB0cyArPSAxO1xuXG4gICAgICBpZiAoYXR0ZW1wdHMgPj0gQ0hFQ0tfREFUQV9MQVlFUl9NQVhfQVRURU1QVFMpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICAgIGBbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgbm90IGF2YWlsYWJsZSBhZnRlciAke0NIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTfSBhdHRlbXB0c2BcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGNoZWNrQW5kSW5pdGlhbGl6ZSwgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgXCJbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgaXMgYXZhaWxhYmxlLCB3cmFwcGluZyBwdXNoIGZ1bmN0aW9uLi4uXCJcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsUHVzaCA9IHdpbmRvdy5kYXRhTGF5ZXIucHVzaDtcbiAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2ggPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzQmFzZUVjb21tZXJjZUV2ZW50KGFyZ3NbMF0pICYmXG4gICAgICAgIGlzQWRkVG9DYXJ0RXZlbnQoKGFyZ3NbMF0gYXMgYW55KS5ldmVudClcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVBZGRUb0NhcnRFdmVudChhcmdzWzBdIGFzIEJhc2VFY29tbWVyY2VFdmVudCwgdHJhY2spO1xuICAgICAgfVxuXG4gICAgICAvLyBJTVBPUlRBTlQ6IGNhbGwgdGhlIG9yaWdpbmFsIHB1c2ggbWV0aG9kIHNvIHRoYXQgdGhlIGV2ZW50IGlzIHN0aWxsIGxvZ2dlZCB0byBHQVxuICAgICAgcmV0dXJuIG9yaWdpbmFsUHVzaC5hcHBseSh3aW5kb3cuZGF0YUxheWVyLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIGNoZWNrQW5kSW5pdGlhbGl6ZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRBbXBsaXR1ZGUgPSAoXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICAvLyBUaGlzIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZSBuZWVkZWQgYW55bW9yZSBpZiBBbXBsaXR1ZGUgaXMgaW5pdGlhbGl6ZWQgdmlhIGNvbnRleHQuXG4gIC8vIEZvciBub3csIHdlJ2xsIGtlZXAgaXQgYW5kIHBhc3MgdGhlIHRyYWNrIGZ1bmN0aW9uLlxuICAvLyBJZiBpdCdzIHRydWx5IHJlZHVuZGFudCwgaXQgY2FuIGJlIHJlbW92ZWQgbGF0ZXIuXG4gIHRyYWNrKFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuQnVuZGxlTG9hZGVkKTsgLy8gRXhhbXBsZSB1c2FnZSwgYWRqdXN0IGFzIG5lZWRlZFxufTtcbiIsImltcG9ydCB7IENvbnRleHQgYXMgQXBpQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBDb250ZXh0IGFzIENvcmVDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVDb250ZXh0VG9BcGlDb250ZXh0ID0gKGNvbnRleHQ6IENvcmVDb250ZXh0KTogQXBpQ29udGV4dCA9PiAoe1xuICBjaGF0X2lkOiBjb250ZXh0LmNoYXRJZCxcbiAgb3JnX2lkOiBjb250ZXh0Lm9yZ0lkLFxuICB1c2VyX2lkOiBjb250ZXh0LnVzZXJJZCxcbiAgb3JnX3Nob3J0X25hbWU6IGNvbnRleHQub3JnU2hvcnROYW1lLFxuICBzb3VyY2U6IGNvbnRleHQuc291cmNlLFxuICBlbnY6IGNvbnRleHQuZW52LFxufSk7XG4iLCJpbXBvcnQge1xuICBVc2VyRXZlbnQgYXMgQXBpVXNlckV2ZW50LFxuICBQTFBBdHRyaWJ1dGVDYXRlZ29yeSxcbiAgUExQSWRBdHRyaWJ1dGVzLFxuICBVc2VyRXZlbnRDYXRlZ29yeSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCBhcyBDb3JlVXNlckV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCA9IChkYXRhOiBDb3JlVXNlckV2ZW50KTogQXBpVXNlckV2ZW50ID0+IHtcbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0IHx8XG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuQWRkVG9DYXJ0XG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgcGFyZW50X3Byb2R1Y3RfaWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRQcm9kdWN0SWQsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2F0ZWdvcnk6IFBMUEF0dHJpYnV0ZUNhdGVnb3J5LklkLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLy8gd2UncmUgb25seSBoYW5kbGluZyBpZCBhdHRyaWJ1dGVzIGZvciBub3dcbiAgICAgICAgICBpZDogKGRhdGEuYXR0cmlidXRlcy5hdHRyaWJ1dGVzIGFzIFBMUElkQXR0cmlidXRlcykuaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcXVlcnk6IGRhdGEuYXR0cmlidXRlcy5xdWVyeSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaF90ZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoVGVybSxcbiAgICAgICAgc2VsZWN0ZWRfZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkRmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbl9pZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25JZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QYWdlVmlzaXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgcGFnZV92aXNpdF9jYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLnBhZ2VWaXNpdENhdGVnb3J5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZF9zY2hlbWE6IHsgLi4uZGF0YS5hdHRyaWJ1dGVzLmZpbGxlZFNjaGVtYSB9LFxuICAgICAgICBmb3JtX3Jlc3BvbnNlX2lkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQsXG4gICAgICAgIGZvcm1fdHlwZTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1UeXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBhcHBfbG9hZGVkIGV2ZW50LCB3aGVuIHdlIHN0YXJ0IHRvIHVzZSBhcHBfdW5sb2FkZWQgd2UgbmVlZCB0byBoYW5kbGUgaXQgaGVyZVxuICByZXR1cm4ge1xuICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gIH07XG59O1xuIiwiZXhwb3J0IGNvbnN0IGRpdmlkZUFycmF5ID0gPFQ+KGFycmF5OiBUW10sIHNpemU6IG51bWJlcikgPT4ge1xuICBjb25zdCByb3dzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgcm93cy5wdXNoKGFycmF5LmZpbHRlcigoXzogVCwgaW5kZXg6IG51bWJlcikgPT4gaW5kZXggJSBzaXplID09PSBpKSk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59O1xuIiwiaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVR5cGUsIFByb2R1Y3RNZXNzYWdlTWV0YWRhdGEgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGdldFJlY2VudFByb2R1Y3RJbWFnZVVybHMgPSAobGFzdE1lc3NhZ2VzOiBNZXNzYWdlW10sIGN1cnJlbnRQcm9kdWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBwcm9kdWN0TWVzc2FnZXMgPSBsYXN0TWVzc2FnZXNcbiAgICAuZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlByb2R1Y3QgJiYgbWVzc2FnZS5tZXRhZGF0YT8uaW1hZ2VVcmwpXG4gICAgLm1hcCgobSkgPT4gbSBhcyBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhKTtcbiAgLy8gcHV0IGFkZGVkIHByb2R1Y3QgaW1hZ2UgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICByZXR1cm4gW1xuICAgIC4uLnByb2R1Y3RNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ubWV0YWRhdGE/LmlkID09PSBjdXJyZW50UHJvZHVjdElkKSxcbiAgICAuLi5wcm9kdWN0TWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLm1ldGFkYXRhPy5pZCAhPT0gY3VycmVudFByb2R1Y3RJZCksXG4gIF0ubWFwKChtKSA9PiBtLm1ldGFkYXRhIS5pbWFnZVVybCEpO1xufTtcbiIsImV4cG9ydCBjb25zdCBwcmVwYXJlTWVyY2hhbnRQYWdlID0gKCkgPT4ge1xuICBsZXQgbWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0ndmlld3BvcnQnXVwiKTtcbiAgaWYgKG1ldGFWaWV3cG9ydCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBtZXRhVmlld3BvcnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxuICAgIGNvbnN0IGhhc01heGltdW1TY2FsZSA9IGNvbnRlbnQ/LmluY2x1ZGVzKFwibWF4aW11bS1zY2FsZT0xXCIpXG4gICAgaWYgKCFoYXNNYXhpbXVtU2NhbGUpIHtcbiAgICAgIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIGAke2NvbnRlbnR9LCBtYXhpbXVtLXNjYWxlPTFgKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJtZXRhXCIpO1xuICBtZXRhVmlld3BvcnQuc2V0QXR0cmlidXRlKFwibmFtZVwiLCBcInZpZXdwb3J0XCIpXG4gIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIFwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MVwiKVxuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG1ldGFWaWV3cG9ydCk7XG59XG4iLCJpbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQge1xuICBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlUm9sZSxcbiAgTWVzc2FnZVR5cGUsXG4gIFVzZXJFdmVudCxcbn0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCA9IChcbiAgZXZlbnQ6IFVzZXJFdmVudCxcbiAgZm9ybVJlc3BvbnNlQXR0cmlidXRlczogRm9ybVJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddLFxuKTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSAhPT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBmb3JtU3RyaW5nQ29udGVudHMgPSBPYmplY3QuZW50cmllcyhmb3JtUmVzcG9uc2VBdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7dmFsdWUudGl0bGV9OiAke2V2ZW50LmF0dHJpYnV0ZXMuZmlsbGVkU2NoZW1hW2tleV19YClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQsXG4gICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIGNvbnRlbnQ6IGZvcm1TdHJpbmdDb250ZW50cyxcbiAgICB9LFxuICB9O1xufTtcbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHF1ZXJ5IFVzZXJFdmVudCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSB1c2VyIGV2ZW50IG9iamVjdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgcXVlcnkgZXZlbnQsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tUXVlcnlFdmVudCA9IChldmVudDogVXNlckV2ZW50KTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5RdWVyeVR5cGVkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjb250ZW50OiBldmVudC5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzZWFyY2hUZXJtOiBldmVudC5hdHRyaWJ1dGVzLnNlYXJjaFRlcm0gfHwgJycsXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZXZlbnQuYXR0cmlidXRlcy5zZWxlY3RlZEZpbHRlcnMgfHwgW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IFJlc3BvbnNlQ2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBSZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBzZXJ2ZXIgUmVzcG9uc2Ugb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBjb250YWluaW5nIG1vZGVsIGdlbmVyYXRlZCBjb250ZW50XG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSByZXNwb25zZSBjb250YWlucyBrbm93biBhdHRyaWJ1dGVzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbVJlc3BvbnNlID0gKHJlc3BvbnNlPzogUmVzcG9uc2UpOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgY29udGVudDogcmVzcG9uc2UuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXcsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByZXZpZXc6IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmV2aWV3LFxuICAgICAgICByZXZpZXdlcjogcmVzcG9uc2UuYXR0cmlidXRlcy5yZXZpZXdlcixcbiAgICAgICAgc3RhcnM6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHRpdGxlOiByZXNwb25zZS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByaWNoSW5mb3JtYXRpb246IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmljaEluZm9ybWF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlcGFyYXRvcixcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5QYWdlLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2hGaWx0ZXIsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICAuLi5yZXNwb25zZS5hdHRyaWJ1dGVzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgZm9ybVR5cGU6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuZm9ybUNhdGVnb3J5Py5mb3JtVHlwZSxcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdGl0bGU6IHZhbHVlLnRpdGxlLFxuICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgZm9ybWF0OiB2YWx1ZS5mb3JtYXQsXG4gICAgICAgICAgcmVxdWlyZWQ6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKGtleSksXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5PcmRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVJvbGUsIE1lc3NhZ2VUeXBlLCBTdWdnZXN0aW9uLCBVc2VyRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgVXNlckV2ZW50IG9iamVjdCBpbnRvIGEgTWVzc2FnZSBvYmplY3QgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIFVzZXJFdmVudCBvYmplY3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0gc3VnZ2VzdGlvbnMgQSBsaXN0IG9mIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBtYXRjaCB0aGUgZXZlbnQgdG9cbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgc3VnZ2VzdGlvbiBjbGljayBldmVudCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQgPSAoXG4gIGV2ZW50OiBVc2VyRXZlbnQsXG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10sXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIGNvbnN0IHsgc3VnZ2VzdGlvbklkIH0gPSBldmVudC5hdHRyaWJ1dGVzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuVXNlcixcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzdWdnZXN0aW9uSWQsXG4gICAgICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzdWdnZXN0aW9uSWQpPy5jb250ZW50ID8/ICcnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyBOZXh0TWVzc2FnZVJlcXVlc3QgYXMgQXBpTmV4dE1lc3NhZ2VSZXF1ZXN0IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE5leHRNZXNzYWdlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBjb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQgfSBmcm9tICcuL2NvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCc7XG5cbmV4cG9ydCBjb25zdCBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdCA9IChcbiAgZGF0YTogTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuKTogQXBpTmV4dE1lc3NhZ2VSZXF1ZXN0ID0+ICh7XG4gIGNvbnRleHQ6IHtcbiAgICBjaGF0X2lkOiBkYXRhLmNvbnRleHQuY2hhdElkLFxuICAgIG9yZ19pZDogZGF0YS5jb250ZXh0Lm9yZ0lkLFxuICAgIG9yZ19zaG9ydF9uYW1lOiBkYXRhLmNvbnRleHQub3JnU2hvcnROYW1lLFxuICAgIHVzZXJfaWQ6IGRhdGEuY29udGV4dC51c2VySWQsXG4gICAgc291cmNlOiBkYXRhLmNvbnRleHQuc291cmNlLFxuICAgIGVudjogZGF0YS5jb250ZXh0LmVudixcbiAgfSxcbiAgaWQ6IGRhdGEuaWQsXG4gIGZlYXR1cmVfZmxhZ3M6IGRhdGEuZmVhdHVyZUZsYWdzLFxuICB1c2VyX2V2ZW50czogZGF0YS51c2VyRXZlbnRzPy5tYXAoKHVzZXJFdmVudCkgPT4gY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50KHVzZXJFdmVudCkpLFxuICBnZW5lcmF0aW9uX3BhcmFtczoge1xuICAgIG1vZGVsOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm1vZGVsLFxuICAgIG1heF90b2tlbnM6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ubWF4VG9rZW5zLFxuICAgIHN0b3A6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8uc3RvcCxcbiAgICBzdHJlYW06IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8uc3RyZWFtLFxuICAgIHRlbXBlcmF0dXJlOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnRlbXBlcmF0dXJlLFxuICAgIHRvcF9wOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnRvcFAsXG4gICAgbnVtX3N1Z2dlc3Rpb25zOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm51bVN1Z2dlc3Rpb25zLFxuICAgIHJlc3BvbnNlX3N5c3RlbV9wcm9tcHQ6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ucmVzcG9uc2VTeXN0ZW1Qcm9tcHQsXG4gICAgc3VnZ2VzdGlvbl9zeXN0ZW1fcHJvbXB0OiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN1Z2dlc3Rpb25TeXN0ZW1Qcm9tcHQsXG4gICAgcmVzcG9uc2VfY2FjaGluZzogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5yZXNwb25zZUNhY2hpbmcsXG4gIH0sXG59KTtcbiIsImV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOb2RlU2VsZWN0b3Ige1xuICBwcml2YXRlIHBhdHRlcm46IHN0cmluZztcbiAgcHJpdmF0ZSByb290OiBEb2N1bWVudDtcblxuICBjb25zdHJ1Y3RvcihwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgIHRoaXMucm9vdCA9IGRvY3VtZW50O1xuICB9XG5cbiAgZ2V0UGF0dGVybigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXR0ZXJuO1xuICB9XG5cbiAgc2V0Um9vdChyb290OiBEb2N1bWVudCkge1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gIH1cblxuICBnZXRSb290KCkge1xuICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gIH1cblxuICBhYnN0cmFjdCBwYXJzZSgpOiBOb2RlIHwgbnVsbDtcbn1cblxuY2xhc3MgUXVlcnlTZWxlY3RvciBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIHBhcnNlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb290KCkucXVlcnlTZWxlY3Rvcih0aGlzLmdldFBhdHRlcm4oKSk7XG4gIH1cbn1cblxuY2xhc3MgSURTZWxlY3RvciBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIHBhcnNlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb290KCkuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRQYXR0ZXJuKCkpIGFzIE5vZGU7XG4gIH1cbn1cblxuY2xhc3MgWHBhdGhTZWxlY3RvciBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIHBhcnNlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSb290KCk/LmV2YWx1YXRlKFxuICAgICAgdGhpcy5nZXRQYXR0ZXJuKCksXG4gICAgICB0aGlzLmdldFJvb3QoKSxcbiAgICAgIG51bGwsXG4gICAgICBYUGF0aFJlc3VsdC5GSVJTVF9PUkRFUkVEX05PREVfVFlQRSxcbiAgICAgIG51bGwsXG4gICAgKT8uc2luZ2xlTm9kZVZhbHVlIGFzIE5vZGU7XG4gIH1cbn1cblxuY2xhc3MgQ2hhaW5TZWxlY3RvciBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIHBhcnNlKCk6IE5vZGUgfCBudWxsIHtcbiAgICBsZXQgc2VsZWN0b3JJbmRleCA9IDA7XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gdGhpcy5nZXRQYXR0ZXJuKCkuc3BsaXQoJ0AnKTtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzZWxlY3RvcnMubGVuZ3RoIC0gMTtcblxuICAgIGNvbnN0IHBhcnNlQ2hhaW4gPSAocGF0dGVybjogc3RyaW5nLCBwcmV2Tm9kZT86IE5vZGUgfCBudWxsKTogTm9kZSB8IG51bGwgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBTZWxlY3RvckZhY3RvcnkucGFyc2UocGF0dGVybik7XG5cbiAgICAgIGlmIChwcmV2Tm9kZSkge1xuICAgICAgICBzZWxlY3Rvci5zZXRSb290KHByZXZOb2RlIGFzIERvY3VtZW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBzZWxlY3Rvci5wYXJzZSgpO1xuICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IGN1cnJlbnROb2RlIHx8IGRvY3VtZW50O1xuICAgICAgaWYgKChjdXJyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCk/LnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgbm9kZSA9IChjdXJyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuc2hhZG93Um9vdDtcbiAgICAgIH1cblxuICAgICAgaWYgKChjdXJyZW50Tm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk/LmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgbm9kZSA9IChjdXJyZW50Tm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCkuY29udGVudFdpbmRvdz8uZG9jdW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZUNoYWluKHNlbGVjdG9yc1srK3NlbGVjdG9ySW5kZXhdLnRyaW0oKSwgbm9kZSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwYXJzZUNoYWluKHNlbGVjdG9yc1tzZWxlY3RvckluZGV4XS50cmltKCkpO1xuICB9XG59XG5cbmNsYXNzIEVtcHR5IGV4dGVuZHMgTm9kZVNlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJycpO1xuICB9XG4gIHBhcnNlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JGYWN0b3J5IHtcbiAgc3RhdGljIHBhcnNlKGNvbXBvc2VkU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWNvbXBvc2VkU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBuZXcgRW1wdHkoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdCA9IGNvbXBvc2VkU2VsZWN0b3Iuc3BsaXQoJ3wnKTtcbiAgICBjb25zdCB0eXBlID0gc3BsaXRbMF07XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBzcGxpdFsxXTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaWQnOlxuICAgICAgICByZXR1cm4gdGhpcy5pZChzZWxlY3Rvcik7XG4gICAgICBjYXNlICdxdWVyeSc6XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICAgIGNhc2UgJ3hwYXRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMueHBhdGgoc2VsZWN0b3IpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBFbXB0eSgpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVjayhzZWxlY3Rvcj86IE5vZGVTZWxlY3Rvcikge1xuICAgIHJldHVybiBzZWxlY3RvciA/PyBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBjaGFpbihwYXR0ZXJuPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgQ2hhaW5TZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG5cbiAgc3RhdGljIGlkKHBhdHRlcm4/OiBzdHJpbmcpOiBOb2RlU2VsZWN0b3Ige1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IElEU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBxdWVyeShwYXR0ZXJuPzogc3RyaW5nKTogTm9kZVNlbGVjdG9yIHtcbiAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBRdWVyeVNlbGVjdG9yKHBhdHRlcm4pIDogbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgeHBhdGgocGF0dGVybj86IHN0cmluZyk6IE5vZGVTZWxlY3RvciB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgWHBhdGhTZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG59XG4iLCJleHBvcnQgdHlwZSBSZXBsYWNlT3A8VD4gPSB7ICRyZXBsYWNlOiBUIH07XG5leHBvcnQgdHlwZSBEZWxldGVPcCA9IHsgJGRlbGV0ZTogdHJ1ZSB9O1xuXG4vLyBUcmVhdCB0aGVzZSBhcyBhdG9taWMgdmFsdWVzIChub3QgcmVjdXJzZWQgaW50bylcbnR5cGUgQnVpbHRpbiA9IERhdGUgfCBSZWdFeHAgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik7XG5cbnR5cGUgUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogT3ZlcnJpZGU8VD4gaXMgYSBEZWVwUGFydGlhbC1saWtlIHR5cGUgd2l0aCBzcGVjaWFsIG9wZXJhdG9yczpcbiAqIC0geyAkcmVwbGFjZTogVCB9IHRvIHJlcGxhY2UgYW4gZW50aXJlIHN1YnRyZWUvYXJyYXlcbiAqIC0geyAkZGVsZXRlOiB0cnVlIH0gdG8gZGVsZXRlIGFuIG9iamVjdCBrZXlcbiAqXG4gKiBBcnJheXMgYmVoYXZpb3I6XG4gKiAtIEFycmF5cyBvZiBvYmplY3RzOiBtZXJnZS1ieS1pbmRleCBieSBkZWZhdWx0ICh1bmxlc3MgYGFycmF5U3RyYXRlZ3k6ICdyZXBsYWNlJ2Agb3IgYCRyZXBsYWNlYCBpcyB1c2VkKVxuICogLSBBcnJheXMgb2YgcHJpbWl0aXZlcyAoc3RyaW5nL251bWJlci9ib29sZWFuLy4uLik6IHJlcGxhY2VkIGJ5IGRlZmF1bHQgd2hlbiBhIHBhdGNoIGFycmF5IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJyaWRlPFQ+ID1cbiAgLy8gYXRvbWljXG4gIFQgZXh0ZW5kcyBQcmltaXRpdmUgfCBCdWlsdGluXG4gICAgPyBUIHwgUmVwbGFjZU9wPFQ+IHwgRGVsZXRlT3BcbiAgICA6IC8vIGFycmF5c1xuICAgICAgVCBleHRlbmRzIChpbmZlciBVKVtdXG4gICAgICA/IEFycmF5PE92ZXJyaWRlPFU+IHwgdW5kZWZpbmVkPiB8IFJlcGxhY2VPcDxUPlxuICAgICAgOiAvLyBtYXBzL3NldHMg4oCTIGtlZXAgc2ltcGxlOiBvbmx5IGFsbG93IGZ1bGwgcmVwbGFjZVxuICAgICAgICBUIGV4dGVuZHMgTWFwPHVua25vd24sIHVua25vd24+IHwgU2V0PHVua25vd24+XG4gICAgICAgID8gUmVwbGFjZU9wPFQ+XG4gICAgICAgIDogLy8gb2JqZWN0c1xuICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgICA/IHsgW0sgaW4ga2V5b2YgVF0/OiBPdmVycmlkZTxUW0tdPiB8IERlbGV0ZU9wIHwgbnVsbCB9IHwgUmVwbGFjZU9wPFQ+XG4gICAgICAgICAgOiBUO1xuXG5leHBvcnQgdHlwZSBNZXJnZU9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBIb3cgdG8gdHJlYXQgYXJyYXlzIHdoZW4gcGF0Y2ggcHJvdmlkZXMgYW4gYXJyYXkgKG5vdCAkcmVwbGFjZSk6XG4gICAqIC0gJ3JlcGxhY2UnOiBhbHdheXMgdXNlIHBhdGNoIGFycmF5IGFzIHdob2xlIHZhbHVlXG4gICAqIC0gJ21lcmdlQnlJbmRleCc6IG1lcmdlIGVhY2ggaW5kZXggcmVjdXJzaXZlbHkgKGRlZmF1bHQgZm9yIGFycmF5cyBvZiBvYmplY3RzKVxuICAgKiBOb3RlOiBBcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUgcmVwbGFjZWQgYnkgZGVmYXVsdCByZWdhcmRsZXNzIG9mIHRoaXMgb3B0aW9uLlxuICAgKi9cbiAgYXJyYXlTdHJhdGVneT86ICdyZXBsYWNlJyB8ICdtZXJnZUJ5SW5kZXgnO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgYSBgbnVsbGAgcGF0Y2ggdmFsdWUgZGVsZXRlcyB0aGUga2V5IGZyb20gYW4gb2JqZWN0IChSRkMgNzM5Ni1pc2gpXG4gICAqL1xuICBudWxsRGVsZXRlcz86IGJvb2xlYW47XG59O1xuXG4vLyBQcmV2ZW50cyBUIGZyb20gYmVpbmcgaW5mZXJyZWQgZnJvbSB0aGUgJ3BhdGNoJyBwYXJhbWV0ZXI7IGl0IG11c3QgYmUgaW5mZXJyZWQgZnJvbSAnYmFzZScuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTQ4MjkjaXNzdWVjb21tZW50LTUwNDA0MjU0NlxudHlwZSBOb0luZmVyPFQ+ID0gW1RdW1QgZXh0ZW5kcyB1bmtub3duID8gMCA6IG5ldmVyXTtcblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh4OiB1bmtub3duKTogeCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgISF4ICYmXG4gICAgdHlwZW9mIHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoeCkgJiZcbiAgICAhKHggaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgICEoeCBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNSZXBsYWNlKHg6IHVua25vd24pOiB4IGlzIFJlcGxhY2VPcDx1bmtub3duPiB7XG4gIHJldHVybiAhIXggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmICckcmVwbGFjZScgaW4gKHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xufVxuZnVuY3Rpb24gaXNEZWxldGUoeDogdW5rbm93bik6IHggaXMgRGVsZXRlT3Age1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAoeCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJGRlbGV0ZSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNQcmltaXRpdmVWYWx1ZSh4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IHQgPSB0eXBlb2YgeDtcbiAgcmV0dXJuIChcbiAgICB4ID09PSBudWxsIHx8XG4gICAgdCA9PT0gJ3N0cmluZycgfHxcbiAgICB0ID09PSAnbnVtYmVyJyB8fFxuICAgIHQgPT09ICdib29sZWFuJyB8fFxuICAgIHQgPT09ICdiaWdpbnQnIHx8XG4gICAgdCA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0ID09PSAndW5kZWZpbmVkJ1xuICApO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5T2ZQcmltaXRpdmVzKGFycjogdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIGlmIChhcnIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7IC8vIGFtYmlndW91cywgZGVmYXVsdCB0byBtZXJnZS1ieS1pbmRleCBvbiBlbXB0eVxuICAvLyBJZiBldmVyeSBkZWZpbmVkIGVsZW1lbnQgaXMgcHJpbWl0aXZlLCB0cmVhdCBhcyBwcmltaXRpdmVzXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgdiA9IGFycltpXTtcbiAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmICFpc1ByaW1pdGl2ZVZhbHVlKHYpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQW55KGJhc2VBbnk6IHVua25vd24sIHBhdGNoQW55OiB1bmtub3duLCBvcHRzOiBNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgaWYgKGlzUmVwbGFjZShwYXRjaEFueSkpIHJldHVybiBwYXRjaEFueS4kcmVwbGFjZSBhcyB1bmtub3duO1xuICBpZiAoaXNEZWxldGUocGF0Y2hBbnkpKSByZXR1cm4gdW5kZWZpbmVkOyAvLyBjYWxsZXIgZGVsZXRlcyB0aGUga2V5XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZUFueSkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaEFueSkpIHtcbiAgICAgIGNvbnN0IGJhc2VBcnIgPSBiYXNlQW55IGFzIHVua25vd25bXTtcbiAgICAgIGNvbnN0IHBhdGNoQXJyID0gcGF0Y2hBbnkgYXMgdW5rbm93bltdO1xuICAgICAgY29uc3Qgc2hvdWxkUmVwbGFjZSA9XG4gICAgICAgIG9wdHMuYXJyYXlTdHJhdGVneSA9PT0gJ3JlcGxhY2UnIHx8XG4gICAgICAgIGlzQXJyYXlPZlByaW1pdGl2ZXMoYmFzZUFycikgfHxcbiAgICAgICAgaXNBcnJheU9mUHJpbWl0aXZlcyhwYXRjaEFycik7XG4gICAgICBpZiAoc2hvdWxkUmVwbGFjZSkgcmV0dXJuIHBhdGNoQW55IGFzIHVua25vd247XG4gICAgICBjb25zdCBvdXQgPSBiYXNlQXJyLnNsaWNlKCk7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heChvdXQubGVuZ3RoLCBwYXRjaEFyci5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBwVmFsID0gcGF0Y2hBcnJbaV07XG4gICAgICAgIGlmIChwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdXRbaV0gPSBtZXJnZUFueShvdXRbaV0sIHBWYWwsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0IGFzIHVua25vd247XG4gICAgfVxuICAgIHJldHVybiBiYXNlQW55IGFzIHVua25vd247XG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdChiYXNlQW55KSAmJiBpc1BsYWluT2JqZWN0KHBhdGNoQW55KSkge1xuICAgIGNvbnN0IGJhc2VPYmogPSBiYXNlQW55IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHBhdGNoT2JqID0gcGF0Y2hBbnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYmFzZU9iaiB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhdGNoT2JqKSkge1xuICAgICAgY29uc3QgcFZhbCA9IHBhdGNoT2JqW2tleV07XG4gICAgICBpZiAocFZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGxlYXZlIGFzLWlzXG4gICAgICB9IGVsc2UgaWYgKG9wdHMubnVsbERlbGV0ZXMgJiYgcFZhbCA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVwbGFjZShwVmFsKSkge1xuICAgICAgICBvdXRba2V5XSA9IHBWYWwuJHJlcGxhY2U7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVsZXRlKHBWYWwpKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFtrZXldID0gbWVyZ2VBbnkoYmFzZU9iaj8uW2tleV0sIHBWYWwsIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIHVua25vd247XG4gIH1cblxuICByZXR1cm4gKHBhdGNoQW55IGFzIHVua25vd24pID8/IGJhc2VBbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU92ZXJyaWRlczxUPihcbiAgYmFzZTogVCxcbiAgcGF0Y2g6IE92ZXJyaWRlPE5vSW5mZXI8VD4+LFxuICBvcHRzOiBNZXJnZU9wdGlvbnMgPSB7fSxcbik6IFQge1xuICBjb25zdCB7IGFycmF5U3RyYXRlZ3kgPSAnbWVyZ2VCeUluZGV4JywgbnVsbERlbGV0ZXMgPSBmYWxzZSB9ID0gb3B0cztcblxuICAvLyBIYW5kbGUgd2hvbGUtbm9kZSBjb250cm9sIG9wZXJhdG9ycyBvbiBwYXRjaCBpdHNlbGZcbiAgaWYgKGlzUmVwbGFjZShwYXRjaCkpIHJldHVybiBwYXRjaC4kcmVwbGFjZSBhcyBUO1xuICBpZiAoaXNEZWxldGUocGF0Y2gpKSByZXR1cm4gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVDtcblxuICAvLyBBcnJheXNcbiAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZSkpIHtcbiAgICBpZiAoaXNSZXBsYWNlKHBhdGNoKSkgcmV0dXJuIHBhdGNoLiRyZXBsYWNlIGFzIFQ7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2gpKSB7XG4gICAgICBpZiAoYXJyYXlTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSByZXR1cm4gcGF0Y2ggYXMgdW5rbm93biBhcyBUO1xuICAgICAgLy8gbWVyZ2UgYnkgaW5kZXhcbiAgICAgIGNvbnN0IG91dCA9IChiYXNlIGFzIHVua25vd25bXSkuc2xpY2UoKTtcbiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KG91dC5sZW5ndGgsIHBhdGNoLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IHBWYWwgPSAocGF0Y2ggYXMgdW5rbm93bltdKVtpXTtcbiAgICAgICAgaWYgKHBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG91dFtpXSA9IG1lcmdlQW55KG91dFtpXSwgcFZhbCwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQgYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICAvLyBpbnZhbGlkIHBhdGNoIHR5cGUgZm9yIGFuIGFycmF5IOKGkiBpZ25vcmUgYW5kIHJldHVybiBiYXNlXG4gICAgcmV0dXJuIGJhc2UgYXMgVDtcbiAgfVxuXG4gIC8vIFBsYWluIG9iamVjdHNcbiAgaWYgKGlzUGxhaW5PYmplY3QoYmFzZSkgJiYgaXNQbGFpbk9iamVjdChwYXRjaCkpIHtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi4oYmFzZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICBjb25zdCBwYXRjaE9iaiA9IHBhdGNoIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhdGNoT2JqKSkge1xuICAgICAgY29uc3QgcFZhbCA9IHBhdGNoT2JqW2tleV07XG4gICAgICBpZiAocFZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGxlYXZlIGV4aXN0aW5nIHZhbHVlXG4gICAgICB9IGVsc2UgaWYgKG51bGxEZWxldGVzICYmIHBWYWwgPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIGlmIChpc1JlcGxhY2UocFZhbCkpIHtcbiAgICAgICAgb3V0W2tleV0gPSBwVmFsLiRyZXBsYWNlO1xuICAgICAgfSBlbHNlIGlmIChpc0RlbGV0ZShwVmFsKSkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiVmFsID0gKGJhc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgIG91dFtrZXldID0gbWVyZ2VBbnkoYlZhbCwgcFZhbCwgb3B0cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLy8gRm9yIHByaW1pdGl2ZXMgb3Igd2hlbiBwYXRjaCBpcyBwcmltaXRpdmUsIHBhdGNoIHdpbnMgaWYgZGVmaW5lZFxuICByZXR1cm4gKChwYXRjaCBhcyB1bmtub3duKSA/PyBiYXNlKSBhcyBUO1xufVxuIiwiXG5jbGFzcyBTdHJpbmdVdGlscyB7XG4gIHN0YXRpYyBpc051bGxPckVtcHR5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZVRyaW1tZWQgPSB2YWx1ZT8udHJpbSgpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlVHJpbW1lZCA9PT0gJyc7XG4gIH1cblxuICBzdGF0aWMgdHJpbVRvTnVsbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZVRyaW1tZWQgPSB2YWx1ZT8udHJpbSgpO1xuICAgIHJldHVybiBTdHJpbmdVdGlscy5pc051bGxPckVtcHR5KHZhbHVlVHJpbW1lZCkgPyB1bmRlZmluZWQgOiB2YWx1ZVRyaW1tZWQ7XG4gIH1cblxuICBzdGF0aWMgY2FwaXRhbGl6ZSh0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGZpcnN0IHBhdHRlcm4gaW4gYW4gYXJyYXkgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gVVJMLlxuICAgKiBQYXR0ZXJucyBjYW4gaW5jbHVkZSBhIHNpbmdsZSB3aWxkY2FyZCAnKicgd2hpY2ggbWF0Y2hlcyBhbnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdHRlcm5zXG4gICAqIEBwYXJhbSB1cmxUb1Rlc3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmaW5kTWF0Y2hpbmdQYXR0ZXJuKHBhdHRlcm5zOiBzdHJpbmdbXSwgdXJsVG9UZXN0OiBMb2NhdGlvbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF1cmxUb1Rlc3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAvLyBUZXN0IG9ubHkgaWYgYSBwYXRobmFtZSBpcyBwcmVzZW50LlxuICAgICAgaWYgKHVybFRvVGVzdC5wYXRobmFtZSAhPT0gJy8nKSB7XG4gICAgICAgIC8vIEVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJhY3RlcnMgaW4gdGhlIHBhdHRlcm5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgY2hhcmFjdGVycyBsaWtlICcuJywgJysnLCAnPycsICcoJywgZXRjLiwgaW4gdGhlIHBhdHRlcm4gYXJlIHRyZWF0ZWQgbGl0ZXJhbGx5LlxuICAgICAgICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvWy4rP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIHdpbGRjYXJkICcqJyB3aXRoIGl0cyByZWdleCBlcXVpdmFsZW50ICcuKicgKG1hdGNoZXMgYW55IGNoYXJhY3RlciB6ZXJvIG9yIG1vcmUgdGltZXMpXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IGVzY2FwZWRQYXR0ZXJuLnJlcGxhY2UoL1xcKi9nLCAnLionKTtcblxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4UGF0dGVybn0kYCk7XG4gICAgICAgIGlmIChyZWdleC50ZXN0KHVybFRvVGVzdC5wYXRobmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCh1cmxUb1Rlc3QuaG9zdG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBTdHJpbmdVdGlscyB9O1xuIiwiaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0IGFzIEFwaVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFdmVudFJlcXVlc3QgYXMgQ29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJy4uL21vZGVscy9hcGkvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0JztcbmltcG9ydCB7IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCB9IGZyb20gJy4vY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IGNvcmVDb250ZXh0VG9BcGlDb250ZXh0IH0gZnJvbSAnLi9jb3JlQ29udGV4dFRvQXBpQ29udGV4dCc7XG5cbmV4cG9ydCBjb25zdCBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0ID0gKFxuICBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0OiBDb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuKTogQXBpU3VwcG9ydGVkRXZlbnRSZXF1ZXN0ID0+ICh7XG4gIGlkOiBjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmlkLFxuICB1c2VyX2V2ZW50OiBjb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQoY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC51c2VyRXZlbnQpLFxuICBjb250ZXh0OiBjb3JlQ29udGV4dFRvQXBpQ29udGV4dChjb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LmNvbnRleHQpLFxufSk7XG4iLCIvLyBUaGlzIGVtYWlsIHZhbGlkYXRlcyB0aGF0IHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgYEBgIHN5bWJvbCxcbi8vIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgYEBgIHN5bWJvbCBhbmQgdGhlIGAuYCBzeW1ib2wsXG4vLyBhbmQgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBhZnRlciB0aGUgYC5gIHN5bWJvbFxuLy8gSXQgZG9lcyBOT1QgdmFsaWRhdGUgYWxsIHBvc3NpYmxlIGVtYWlsIGZvcm1hdHMsIGJ1dCBpdCBpcyBhIGRlY2VudCBwbGFjZSB0byBzdGFydC5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUVtYWlsID0gKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuID0+IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodmFsdWUpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFlQSxNQUFNLHFDQUFxQyxDQUFDLGFBQWEsY0FBYztBQUN2RSxNQUFNLCtCQUErQjtBQUNyQyxNQUFNLGdDQUFnQzs7Ozs7Ozs7QUFTdEMsTUFBTSxvQkFBb0IsVUFBMkI7Q0FDbkQsTUFBTSxrQkFBa0IsTUFBTSxRQUFRLFNBQVMsR0FBRyxDQUFDLGFBQWE7QUFDaEUsUUFBTyxtQ0FBbUMsTUFBTSxTQUM5QyxnQkFBZ0IsU0FBUyxLQUFLLENBQy9COzs7Ozs7O0FBUUgsTUFBTSx3QkFDSixPQUNBLFVBSUc7Q0FDSCxJQUFJQTtBQUVKLEtBQUkseUJBQXlCLE1BQU0sQ0FDakMsY0FBYTtFQUNYLE9BQU8sTUFBTSxVQUFVLElBQUksU0FBUyxLQUFLLGFBQWE7R0FDcEQsV0FBVyxRQUFRO0dBQ25CLGVBQWUsUUFBUTtHQUN2QixPQUFPLFFBQVE7R0FDZixVQUFVLFFBQVE7R0FDbkIsRUFBRTtFQUNILFVBQVUsTUFBTSxVQUFVLElBQUk7RUFDOUIsc0JBQXNCO0VBQ3ZCO1VBQ1Esb0JBQW9CLE1BQU0sQ0FDbkMsY0FBYTtFQUNYLE9BQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxVQUFVO0dBQzFDLFdBQVcsS0FBSztHQUNoQixlQUFlLEtBQUs7R0FDcEIsT0FBTyxLQUFLO0dBQ1osVUFBVSxLQUFLO0dBQ2hCLEVBQUU7RUFDSCxVQUFVLE1BQU0sVUFBVTtFQUMxQixzQkFBc0I7RUFDdkI7S0FFRCxjQUFhO0VBQ1gs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
|