@envive-ai/react-hooks 0.1.4 → 0.1.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/amplitudeContext-CHzas7Cf.d.cts +52 -0
- package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
- package/dist/amplitudeContext-hY3caPC6.js +322 -0
- package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
- package/dist/api-DjeZXxl_.js +207 -0
- package/dist/api-_JaUnIUj.cjs +292 -0
- package/dist/app-CjsQ2_n-.js +132 -0
- package/dist/app-CnKRZ9RW.cjs +178 -0
- package/dist/application/models/graphql/index.cjs +3 -12
- package/dist/application/models/graphql/index.d.cts +1 -1
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/graphql/index.js +1 -10
- package/dist/application/models/guards/api/index.cjs +1 -2
- package/dist/application/models/guards/api/index.d.cts +2 -2
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/api/index.js +1 -2
- package/dist/application/models/index.cjs +48 -54
- package/dist/application/models/index.d.cts +7 -9
- package/dist/application/models/index.d.ts +7 -9
- package/dist/application/models/index.js +7 -11
- package/dist/application/models/utilityTypes/index.cjs +1 -1
- package/dist/application/models/utilityTypes/index.d.cts +1 -1
- package/dist/application/models/utilityTypes/index.d.ts +1 -1
- package/dist/application/models/utilityTypes/index.js +1 -1
- package/dist/application/models/variantInfo/index.cjs +1 -1
- package/dist/application/models/variantInfo/index.d.cts +1 -1
- package/dist/application/models/variantInfo/index.d.ts +1 -1
- package/dist/application/models/variantInfo/index.js +1 -1
- package/dist/application/utils/index.cjs +40 -37
- package/dist/application/utils/index.d.cts +18 -14
- package/dist/application/utils/index.d.ts +17 -13
- package/dist/application/utils/index.js +13 -10
- package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
- package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
- package/dist/atoms/app/index.cjs +14 -16
- package/dist/atoms/app/index.d.cts +20 -19
- package/dist/atoms/app/index.d.ts +20 -19
- package/dist/atoms/app/index.js +10 -11
- package/dist/atoms/atomStore/index.cjs +2 -1
- package/dist/atoms/atomStore/index.d.cts +1 -1
- package/dist/atoms/atomStore/index.js +2 -1
- package/dist/atoms/chat/index.cjs +44 -40
- package/dist/atoms/chat/index.d.cts +35 -36
- package/dist/atoms/chat/index.d.ts +35 -36
- package/dist/atoms/chat/index.js +14 -10
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +5 -5
- package/dist/atoms/globalSearch/index.d.ts +5 -5
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +26 -37
- package/dist/atoms/org/index.d.cts +37 -47
- package/dist/atoms/org/index.d.ts +37 -47
- package/dist/atoms/org/index.js +11 -11
- package/dist/atoms/search/index.cjs +47 -41
- package/dist/atoms/search/index.d.cts +7 -9
- package/dist/atoms/search/index.d.ts +7 -9
- package/dist/atoms/search/index.js +16 -10
- package/dist/bandolier-DYEz4-8C.js +1229 -0
- package/dist/bandolier-o_-xrbOV.cjs +1229 -0
- package/dist/carpe-CsG5jCcl.cjs +607 -0
- package/dist/carpe-DONk00bZ.js +605 -0
- package/dist/cdnUtils-32v8bDX9.cjs +16 -0
- package/dist/cdnUtils-E4tLBt2g.js +11 -0
- package/dist/{chat-BgONoYU7.cjs → chat-BubCW1as.cjs} +1 -1
- package/dist/chat-CO7cRkaq.cjs +506 -0
- package/dist/{chat-CLJ4NWcN.js → chat-CV6MXeID.js} +1 -1
- package/dist/chat-hcRc4RRd.js +285 -0
- package/dist/{components-CV1fhAkj.js → components-B4T3Uzth.js} +1 -1
- package/dist/{components-BKZbet67.cjs → components-Cw9WjA6g.cjs} +1 -1
- package/dist/config/locators/components/chat/index.cjs +1 -1
- package/dist/config/locators/components/chat/index.d.cts +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/chat/variants/index.d.ts +1 -1
- package/dist/config/locators/components/index.cjs +1 -1
- package/dist/config/locators/components/index.d.cts +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/index.cjs +4 -4
- package/dist/config/locators/index.d.cts +2 -2
- package/dist/config/locators/index.d.ts +3 -3
- package/dist/config/locators/index.js +4 -4
- package/dist/contexts/index.cjs +45 -14
- package/dist/contexts/index.d.cts +10 -78
- package/dist/contexts/index.d.ts +10 -78
- package/dist/contexts/index.js +22 -11
- package/dist/contexts-B4ihTBsV.cjs +2980 -0
- package/dist/contexts-DGlr7M1o.js +2596 -0
- package/dist/coterie-CKB93qfz.cjs +239 -0
- package/dist/{coterie-yQ-_JXSw.cjs → coterie-DHcj2fRE.js} +64 -65
- package/dist/{custservice-types-C83itZmy.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
- package/dist/{custservice-types-DPQ-4TI6.js → custservice-types-mnIunabv.js} +1 -1
- package/dist/default-BnB4p0Se.cjs +234 -0
- package/dist/default-D6f5Dyt7.js +199 -0
- package/dist/default-ZKkE5zT4.cjs +4 -0
- package/dist/default-legGZJwI.js +4 -0
- package/dist/{divIds-DEL_-qU0.cjs → divIds-2dJlU3z8.cjs} +1 -15
- package/dist/{divIds-CWkntTsx.js → divIds-BUrN2vY-.js} +2 -4
- package/dist/dreamlandBaby-BiRYYFav.js +346 -0
- package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
- package/dist/{embedded-C5uJqmuD.js → embedded-BJLWIriJ.js} +1 -1
- package/dist/{embedded--2L0F4b5.cjs → embedded-Dl79TJLC.cjs} +1 -1
- package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
- package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
- package/dist/enviveConfig-BccuzS2a.cjs +240 -0
- package/dist/enviveConfig-CzhTz8Aa.js +152 -0
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.d.cts +1 -1
- package/dist/events/index.js +1 -1
- package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
- package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
- package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
- package/dist/fiveCbd-Dz2NouOF.js +613 -0
- package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
- package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
- package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
- package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
- package/dist/graphql-BNW60InJ.cjs +128 -0
- package/dist/graphql-CjB8wHzm.js +74 -0
- package/dist/graphqlConfig-CYt6tWII.js +30 -0
- package/dist/graphqlConfig-DicykC-o.cjs +61 -0
- package/dist/greenpan-B_EbPkSP.js +397 -0
- package/dist/greenpan-kPE4fJgd.cjs +397 -0
- package/dist/grooveLife-Ckuir319.js +342 -0
- package/dist/grooveLife-DKSEQp1F.cjs +342 -0
- package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
- package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
- package/dist/hooks/index.cjs +40 -16
- package/dist/hooks/index.d.cts +122 -95
- package/dist/hooks/index.d.ts +122 -95
- package/dist/hooks/index.js +22 -11
- package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
- package/dist/{index-jBATkcc_.d.cts → index-BDPWBU3h.d.cts} +1 -1
- package/dist/index-BMPtlgac.d.ts +191 -0
- package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
- package/dist/{index-C62lPpy4.d.cts → index-Byb45OPg.d.cts} +1 -1
- package/dist/{index-DPx8s5YH.d.ts → index-C6KdON7d.d.ts} +1 -1
- package/dist/index-C7pGDl1A.d.ts +1609 -0
- package/dist/{index-CYtsPztZ.d.cts → index-C9lgsCWp.d.cts} +32 -32
- package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
- package/dist/{index-C_C0tLeD.d.ts → index-Cc-wBCn6.d.ts} +32 -32
- package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
- package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
- package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
- package/dist/{index-CExtydIH.d.ts → index-DOii3C6b.d.ts} +1 -1
- package/dist/index-DTu2X-YS.d.cts +1609 -0
- package/dist/index-OEifcBsm.d.cts +191 -0
- package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
- package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
- package/dist/interceptors/index.cjs +2 -12
- package/dist/interceptors/index.d.cts +8 -13
- package/dist/interceptors/index.d.ts +8 -13
- package/dist/interceptors/index.js +2 -11
- package/dist/jackArcher-B39OEIj6.cjs +727 -0
- package/dist/{jackArcher-CXf_IAmC.js → jackArcher-BwkWGybC.js} +24 -25
- package/dist/jordanCraig-CxRH_jLi.js +1786 -0
- package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
- package/dist/kindredBravely-D78VwL20.cjs +490 -0
- package/dist/kindredBravely-DQDpAzdl.js +490 -0
- package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
- package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
- package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
- package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
- package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
- package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
- package/dist/longevityrx-DdV3v26F.cjs +320 -0
- package/dist/longevityrx-DfPDfvAt.js +320 -0
- package/dist/lookOptic-DgXFGBPP.cjs +282 -0
- package/dist/{lookOptic-BGhU4910.js → lookOptic-FgVW1afF.js} +19 -20
- package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
- package/dist/{mantraBrand-DrqG9uqO.js → mantraBrand-uV8HCDR8.js} +22 -23
- package/dist/medterra-BtDpr1Hw.cjs +583 -0
- package/dist/medterra-DgzE7-mj.js +583 -0
- package/dist/modells-CJjsxOIR.js +484 -0
- package/dist/modells-Ck5KbRFj.cjs +484 -0
- package/dist/models-BkXg5eIP.cjs +1534 -0
- package/dist/models-UZ6HszfZ.js +1281 -0
- package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
- package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
- package/dist/org-C2RrBVQR.cjs +81 -0
- package/dist/org-xMytX--e.js +38 -0
- package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
- package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
- package/dist/pressedFloral-Bteoboms.js +661 -0
- package/dist/pressedFloral-CexgV-xy.cjs +661 -0
- package/dist/search-BMOAmrmY.js +459 -0
- package/dist/search-Df0Ifneg.cjs +672 -0
- package/dist/{search-filter-types-BNTLVXqQ.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
- package/dist/{search-filter-types-DkmH1TxJ.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
- package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
- package/dist/skinPerfection-BlvcEcUE.js +334 -0
- package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
- package/dist/snapSupplements-kcsPAOm9.js +285 -0
- package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
- package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
- package/dist/spanx-B4WFA_rI.js +661 -0
- package/dist/spanx-BWoE4F8b.cjs +663 -0
- package/dist/spanxStaging-BOrOjhXn.js +845 -0
- package/dist/spanxStaging-BfdfIug4.cjs +848 -0
- package/dist/{suggestionBarV2-types-CwOXzIKq.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
- package/dist/{suggestionBarV2-types-Dc4-zJlV.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
- package/dist/supergoop-22dd5_BS.js +323 -0
- package/dist/supergoop-B-a4cku2.cjs +323 -0
- package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
- package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
- package/dist/types/index.cjs +2 -2
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +2 -2
- package/dist/types--pr1GQQx.js +154 -0
- package/dist/types-BVSyY3Hk.cjs +196 -0
- package/dist/{uniqueVintage-Cui74mlJ.js → uniqueVintage-CJXiNNe7.js} +19 -20
- package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
- package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
- package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
- package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
- package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
- package/dist/utils-C9ZSCx12.js +888 -0
- package/dist/utils-D5HO61hG.cjs +1016 -0
- package/dist/variantInfo-DbVxA1yE.js +1 -0
- package/dist/variantInfo-orXoPBCU.cjs +0 -0
- package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
- package/dist/venaCbd-CanovPS_.js +365 -0
- package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
- package/dist/{westonJonBoucher-C95EuCl-.js → westonJonBoucher-BUu1_wP1.js} +19 -20
- package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
- package/dist/{wineEnthusiast-DeTFY8Gm.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
- package/dist/wolfMattress-D9Mjq-HP.js +372 -0
- package/dist/wolfMattress-JssghhC-.cjs +372 -0
- package/dist/wolfTactical-C6exYhL7.cjs +349 -0
- package/dist/wolfTactical-CnV3KQdI.js +349 -0
- package/package.json +101 -19
- package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
- package/src/application/models/colorsConfig.ts +18 -18
- package/src/application/models/frontendConfig.ts +3 -3
- package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
- package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
- package/src/application/models/index.ts +0 -2
- package/src/application/models/localStorageEventListener.ts +2 -2
- package/src/application/models/supportedOrgs.ts +1 -1
- package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
- package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
- package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
- package/src/application/utils/analyticsUtils.ts +53 -22
- package/src/application/utils/cdnUtils.ts +11 -0
- package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
- package/src/atoms/app/index.ts +7 -17
- package/src/atoms/app/variant.ts +13 -4
- package/src/atoms/chat/chatState.ts +28 -18
- package/src/atoms/chat/messageQueue.ts +36 -5
- package/src/atoms/chat/replies.ts +45 -37
- package/src/atoms/envive/enviveConfig.ts +10 -6
- package/src/atoms/org/graphqlConfig.ts +21 -4
- package/src/atoms/org/index.ts +7 -7
- package/src/atoms/org/newOrgConfigAtom.ts +8 -0
- package/src/atoms/org/orgPageConfig.ts +6 -5
- package/src/atoms/search/chatSearch.ts +11 -5
- package/src/atoms/search/searchAPI.ts +68 -48
- package/src/atoms/search/searchServiceAdapter.ts +25 -0
- package/src/contexts/amplitudeContext.tsx +466 -0
- package/src/contexts/cdnContext.tsx +48 -0
- package/src/contexts/chatContext.tsx +15 -12
- package/src/contexts/enviveConfigContext.tsx +22 -17
- package/src/contexts/enviveCssContext.tsx +34 -5
- package/src/contexts/featureFlagContext.tsx +193 -0
- package/src/contexts/featureFlagServiceContext.tsx +87 -0
- package/src/contexts/graphqlContext.tsx +165 -0
- package/src/contexts/index.ts +13 -3
- package/src/contexts/localStorageContext.tsx +159 -0
- package/src/contexts/newOrgConfigContext.tsx +104 -0
- package/src/contexts/orgConfigContext.tsx +92 -92
- package/src/contexts/searchContext.tsx +187 -0
- package/src/contexts/sessionStorageContext.tsx +80 -0
- package/src/contexts/shopifyUrlContext.tsx +97 -0
- package/src/contexts/types.ts +12 -8
- package/src/contexts/userIdentityContext.tsx +197 -0
- package/src/events/registerAnalyticsListeners.ts +32 -38
- package/src/hooks/index.ts +10 -6
- package/src/hooks/useAmplitudeOperations.ts +35 -0
- package/src/hooks/useAppDetails.ts +49 -0
- package/src/hooks/useCdnOperations.ts +16 -0
- package/src/hooks/useChatToggle.ts +5 -4
- package/src/hooks/useChatToggleAnalytics.ts +15 -0
- package/src/hooks/useGraphQLConfig.ts +63 -0
- package/src/hooks/useIdentifyUser.ts +33 -0
- package/src/hooks/useImageResolver.ts +18 -10
- package/src/hooks/useLocalStorageOperations.ts +92 -0
- package/src/hooks/useNewOrgConfig.ts +7 -0
- package/src/hooks/useSearch.tsx +21 -18
- package/src/hooks/useSearchOperations.ts +97 -0
- package/src/hooks/useSessionStorageOperations.ts +28 -0
- package/src/hooks/useShopifyUrlOperations.ts +45 -0
- package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
- package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
- package/src/interceptors/index.ts +0 -1
- package/src/interceptors/useMessageInterceptor.ts +5 -8
- package/src/merchants/bandolier/bandolier.ts +10 -28
- package/src/merchants/carpe/carpe.ts +5 -8
- package/src/merchants/coterie/coterie.ts +3 -6
- package/src/merchants/default.ts +73 -70
- package/src/merchants/domInsertion.ts +30 -0
- package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
- package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
- package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
- package/src/merchants/greenpan/greenpan.ts +6 -12
- package/src/merchants/gridInsertion.ts +19 -0
- package/src/merchants/grooveLife/grooveLife.ts +13 -7
- package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
- package/src/merchants/jackArcher/jackArcher.ts +26 -11
- package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
- package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
- package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
- package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
- package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
- package/src/merchants/longevityrx/longevityrx.ts +14 -8
- package/src/merchants/lookOptic/lookOptic.ts +6 -6
- package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
- package/src/merchants/medterra/medterra.ts +14 -11
- package/src/merchants/modells/modells.ts +6 -9
- package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
- package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
- package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
- package/src/merchants/spanx/spanx.ts +6 -6
- package/src/merchants/spanx/spanxStaging.ts +6 -12
- package/src/merchants/supergoop/supergoop.ts +11 -12
- package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
- package/src/merchants/venaCbd/venaCbd.ts +6 -9
- package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
- package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
- package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
- package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
- package/src/types/config-versions.ts +6 -0
- package/src/types.ts +0 -53
- package/dist/adapters/amplitude/index.cjs +0 -14
- package/dist/adapters/amplitude/index.d.cts +0 -6
- package/dist/adapters/amplitude/index.d.ts +0 -6
- package/dist/adapters/amplitude/index.js +0 -12
- package/dist/api-B2euFL-5.cjs +0 -269
- package/dist/api-XRr_lAG6.js +0 -190
- package/dist/application/config/index.cjs +0 -43
- package/dist/application/config/index.d.cts +0 -15
- package/dist/application/config/index.d.ts +0 -15
- package/dist/application/config/index.js +0 -41
- package/dist/application/service/customerService/index.cjs +0 -4
- package/dist/application/service/customerService/index.d.cts +0 -3
- package/dist/application/service/customerService/index.d.ts +0 -3
- package/dist/application/service/customerService/index.js +0 -4
- package/dist/application/service/index.cjs +0 -41
- package/dist/application/service/index.d.cts +0 -399
- package/dist/application/service/index.d.ts +0 -399
- package/dist/application/service/index.js +0 -12
- package/dist/bandolier-B76-OE75.cjs +0 -1230
- package/dist/bandolier-DRn_x1g1.js +0 -1230
- package/dist/carpe-kHi4RLB5.cjs +0 -608
- package/dist/carpe-qrSU99gq.js +0 -606
- package/dist/contexts-CQDwe3rK.cjs +0 -14333
- package/dist/contexts-e2sM-B9g.js +0 -12919
- package/dist/coterie-mMirPcHP.js +0 -240
- package/dist/customerService-BG1uNZZ1.cjs +0 -36
- package/dist/customerService-BHQRnLhC.js +0 -23
- package/dist/default-8Jfv8ehQ.cjs +0 -199
- package/dist/default-C8PQf-38.js +0 -176
- package/dist/default-LukSiCz1.js +0 -4
- package/dist/default-rJSJ887P.cjs +0 -4
- package/dist/dreamlandBaby-DHltv12Z.cjs +0 -347
- package/dist/dreamlandBaby-cG0HM9bt.js +0 -347
- package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
- package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
- package/dist/fiveCbd-Cvnwh03g.cjs +0 -614
- package/dist/fiveCbd-DhYMlsf9.js +0 -614
- package/dist/forLoveAndLemons-C8DuUexW.js +0 -666
- package/dist/forLoveAndLemons-DR6a1zjJ.cjs +0 -668
- package/dist/greenpan-B4Pu65kV.js +0 -398
- package/dist/greenpan-BL5p6j7f.cjs +0 -398
- package/dist/grooveLife-DjKWHoN3.cjs +0 -343
- package/dist/grooveLife-JK0TyaPz.js +0 -343
- package/dist/homegrownCannabis-DxqSDkmS.js +0 -411
- package/dist/homegrownCannabis-ZnfCqW-m.cjs +0 -411
- package/dist/index-BfuO9b0Q.d.ts +0 -749
- package/dist/index-CNsGWfS6.d.cts +0 -749
- package/dist/index-DFL1dIT_.d.ts +0 -7
- package/dist/index-MFbPQ8Ji.d.ts +0 -95
- package/dist/index-VSFakgAI.d.cts +0 -95
- package/dist/index-zZjcds15.d.cts +0 -7
- package/dist/jackArcher-mGkojXek.cjs +0 -728
- package/dist/jordanCraig-BvCvPRoR.js +0 -1787
- package/dist/jordanCraig-Dv8pVCiS.cjs +0 -1787
- package/dist/kindredBravely-UQP7wiNu.cjs +0 -491
- package/dist/kindredBravely-X8F_LNph.js +0 -491
- package/dist/kutFromTheKloth-BhYKk3CN.cjs +0 -370
- package/dist/kutFromTheKloth-D1xsTSJr.js +0 -370
- package/dist/larryAndSerges-1411NuZa.cjs +0 -262
- package/dist/larryAndSerges-DVIRLItu.js +0 -262
- package/dist/leapsAndRebounds-BJ8mwr33.js +0 -361
- package/dist/leapsAndRebounds-UcP9EJVO.cjs +0 -361
- package/dist/logger-Dln20ans.cjs +0 -26
- package/dist/logger-pdEEY8T2.js +0 -20
- package/dist/longevityrx-BFSv9GF5.cjs +0 -321
- package/dist/longevityrx-Cp6wleWr.js +0 -321
- package/dist/lookOptic-KieSqskd.cjs +0 -283
- package/dist/mantraBrand-CHQw-0nw.cjs +0 -751
- package/dist/medterra-CLG6Co1C.cjs +0 -584
- package/dist/medterra-D8ZX9NZC.js +0 -584
- package/dist/modells-BzyPwN2m.cjs +0 -485
- package/dist/modells-CAfqOCW4.js +0 -485
- package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
- package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
- package/dist/pressedFloral-DULBuQwR.cjs +0 -662
- package/dist/pressedFloral-Dp-7Fk3S.js +0 -662
- package/dist/skinPerfection-BxuYCeJX.js +0 -335
- package/dist/skinPerfection-Cd3XZ6By.cjs +0 -335
- package/dist/snapSupplements-Bf6htPM0.js +0 -286
- package/dist/snapSupplements-ZFnXyMuZ.cjs +0 -286
- package/dist/spanx-CwDPQaGj.js +0 -662
- package/dist/spanx-Cyd4qDlK.cjs +0 -664
- package/dist/spanxStaging-D43nyAGy.js +0 -846
- package/dist/spanxStaging-ijbYnHzr.cjs +0 -849
- package/dist/supergoop-BnbFG7hm.cjs +0 -338
- package/dist/supergoop-CY043wIg.js +0 -336
- package/dist/types-BF_CJeck.js +0 -177
- package/dist/types-CD4LFta-.d.cts +0 -33
- package/dist/types-CNH4sfF-.cjs +0 -231
- package/dist/types-DBdI0j89.d.ts +0 -33
- package/dist/uniqueVintage-R2Jcu1y1.cjs +0 -1214
- package/dist/variant-CKVRF2-W.d.ts +0 -13
- package/dist/variant-raYuOP4L.d.cts +0 -13
- package/dist/venaCbd-o5_vOp4e.js +0 -366
- package/dist/venaCbd-r-IxEVc1.cjs +0 -366
- package/dist/westonJonBoucher-DjGEW3ZB.cjs +0 -423
- package/dist/wineEnthusiast-DvfcV5B3.cjs +0 -941
- package/dist/wolfMattress-6xPfOJt3.js +0 -373
- package/dist/wolfMattress-BjGnGKjP.cjs +0 -373
- package/dist/wolfTactical-Bi3WZu0m.cjs +0 -350
- package/dist/wolfTactical-C_F9-oPX.js +0 -350
- package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
- package/src/adapters/amplitude/index.ts +0 -2
- package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
- package/src/adapters/spiffy/commerce/graphql.ts +0 -219
- package/src/application/config/generalStaticConfig.ts +0 -40
- package/src/application/config/index.ts +0 -1
- package/src/application/models/domMutationContinuation.ts +0 -7
- package/src/application/models/domObservationStrategy.ts +0 -9
- package/src/application/service/cachingService.ts +0 -84
- package/src/application/service/cdnService.ts +0 -20
- package/src/application/service/customerService/index.ts +0 -8
- package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
- package/src/application/service/domMutationObserver.ts +0 -320
- package/src/application/service/domMutations/GridInsertionService.ts +0 -123
- package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
- package/src/application/service/domMutations/domInsertionService.ts +0 -90
- package/src/application/service/domMutations/domMutationListener.ts +0 -15
- package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
- package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
- package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
- package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
- package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
- package/src/application/service/featureFlagService.ts +0 -130
- package/src/application/service/index.ts +0 -31
- package/src/application/service/kustomerIntegrationService.ts +0 -111
- package/src/application/service/localStorageService.ts +0 -77
- package/src/application/service/pageVariantService.ts +0 -866
- package/src/application/service/searchService.ts +0 -147
- package/src/application/service/sessionStorageService.ts +0 -27
- package/src/application/service/shopifyUrlService.ts +0 -63
- package/src/application/service/userIdentityService.ts +0 -114
- package/src/application/service/windowChatToggleService.ts +0 -80
- package/src/application/service/windowDataLayerService.ts +0 -181
- package/src/application/service/windowFrontendConfigService.ts +0 -129
- package/src/atoms/org/merchantCss.ts +0 -158
- package/src/atoms/org/org.ts +0 -291
- package/src/atoms/org/orgUIConfig.ts +0 -142
- package/src/enabled-features.ts +0 -83
- package/src/hooks/useDynamicVariants.ts +0 -210
- package/src/hooks/useFileUpload.ts +0 -63
- package/src/hooks/useHideElements.ts +0 -82
- package/src/hooks/useHorizontalScrollAnimation.ts +0 -115
- package/src/hooks/useReducedMotionWithOverride.ts +0 -15
- package/src/hooks/useSnapControl.ts +0 -155
- package/src/interceptors/useFormEscalation.ts +0 -57
- /package/dist/{variantInfo-CzhR5W6h.js → atomStore-CZnUUsrr.js} +0 -0
- /package/dist/{variantInfo-CNRTY0gH.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
- /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
- /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
- /package/dist/{locators-Dc5ZT0aF.js → utilityTypes-8sETsYPk.js} +0 -0
- /package/dist/{locators-lQMJj830.cjs → utilityTypes-COShxVir.cjs} +0 -0
- /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
|
@@ -0,0 +1,888 @@
|
|
|
1
|
+
import { MessageRole, MessageType, isBaseEcommerceEvent, isGA4EcommerceEvent, isLegacyUAEcommerceEvent } from "./models-UZ6HszfZ.js";
|
|
2
|
+
import { logger_default } from "./api-DjeZXxl_.js";
|
|
3
|
+
import { SpiffyMetricsEventName } from "./amplitudeContext-hY3caPC6.js";
|
|
4
|
+
import { PLPAttributeCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
|
|
5
|
+
import { createPortal } from "react-dom";
|
|
6
|
+
|
|
7
|
+
//#region src/application/utils/analyticsUtils.ts
|
|
8
|
+
const NORMALIZED_ADD_TO_CART_EVENT_NAMES = ["addtocart", "addedtocart"];
|
|
9
|
+
const CHECK_DATA_LAYER_INTERVAL_MS = 500;
|
|
10
|
+
const CHECK_DATA_LAYER_MAX_ATTEMPTS = 10;
|
|
11
|
+
/**
|
|
12
|
+
* Checks if a Google Analytics event is an add_to_cart event.
|
|
13
|
+
*
|
|
14
|
+
* @param event The event name to check.
|
|
15
|
+
*
|
|
16
|
+
* @returns True if the event is an add_to_cart event, false otherwise.
|
|
17
|
+
*/
|
|
18
|
+
const isAddToCartEvent = (event) => {
|
|
19
|
+
const normalizedEvent = event.replace(/[-_]/g, "").toLowerCase();
|
|
20
|
+
return NORMALIZED_ADD_TO_CART_EVENT_NAMES.some((name) => normalizedEvent.includes(name));
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Tracks an add_to_cart event in Amplitude.
|
|
24
|
+
*
|
|
25
|
+
* @param event The event to track.
|
|
26
|
+
*/
|
|
27
|
+
const handleAddToCartEvent = (event, track) => {
|
|
28
|
+
let eventProps;
|
|
29
|
+
if (isLegacyUAEcommerceEvent(event)) eventProps = {
|
|
30
|
+
items: event.ecommerce.add.products.map((product) => ({
|
|
31
|
+
item_name: product.name,
|
|
32
|
+
item_category: product.category,
|
|
33
|
+
price: product.price,
|
|
34
|
+
quantity: product.quantity
|
|
35
|
+
})),
|
|
36
|
+
currency: event.ecommerce.add.currencyCode,
|
|
37
|
+
event_format_version: "legacy_universal_analytics"
|
|
38
|
+
};
|
|
39
|
+
else if (isGA4EcommerceEvent(event)) eventProps = {
|
|
40
|
+
items: event.ecommerce.items.map((item) => ({
|
|
41
|
+
item_name: item.item_name,
|
|
42
|
+
item_category: item.item_category,
|
|
43
|
+
price: item.price,
|
|
44
|
+
quantity: item.quantity
|
|
45
|
+
})),
|
|
46
|
+
currency: event.ecommerce.currency,
|
|
47
|
+
event_format_version: "google_analytics_4"
|
|
48
|
+
};
|
|
49
|
+
else eventProps = {
|
|
50
|
+
event_properties: { ...event },
|
|
51
|
+
event_format_version: "unknown"
|
|
52
|
+
};
|
|
53
|
+
track(SpiffyMetricsEventName.AddToCartClicked, { eventProps });
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Wraps the window.dataLayer.push method to intercept add_to_cart events and send them to Amplitude.
|
|
57
|
+
* This function runs on an interval until the dataLayer is available.
|
|
58
|
+
*/
|
|
59
|
+
const initDataLayerWrapper = (track) => {
|
|
60
|
+
let attempts = 0;
|
|
61
|
+
const checkAndInitialize = () => {
|
|
62
|
+
if (!window.dataLayer || !window.dataLayer.push) {
|
|
63
|
+
attempts += 1;
|
|
64
|
+
if (attempts >= CHECK_DATA_LAYER_MAX_ATTEMPTS) {
|
|
65
|
+
logger_default.logDebug(`[spiffy-ai] dataLayer not available after ${CHECK_DATA_LAYER_MAX_ATTEMPTS} attempts`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setTimeout(checkAndInitialize, CHECK_DATA_LAYER_INTERVAL_MS);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
logger_default.logDebug("[spiffy-ai] dataLayer is available, wrapping push function...");
|
|
72
|
+
const originalPush = window.dataLayer.push;
|
|
73
|
+
window.dataLayer.push = (...args) => {
|
|
74
|
+
if (isBaseEcommerceEvent(args[0]) && isAddToCartEvent(args[0].event)) handleAddToCartEvent(args[0], track);
|
|
75
|
+
return originalPush.apply(window.dataLayer, args);
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
checkAndInitialize();
|
|
79
|
+
};
|
|
80
|
+
const initAmplitude = (track) => {
|
|
81
|
+
track(SpiffyMetricsEventName.BundleLoaded);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/application/utils/coreContextToApiContext.ts
|
|
86
|
+
const coreContextToApiContext = (context) => ({
|
|
87
|
+
chat_id: context.chatId,
|
|
88
|
+
org_id: context.orgId,
|
|
89
|
+
user_id: context.userId,
|
|
90
|
+
org_short_name: context.orgShortName,
|
|
91
|
+
source: context.source,
|
|
92
|
+
env: context.env
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/application/utils/coreUserEventToApiUserEvent.ts
|
|
97
|
+
const coreUserEventToApiUserEvent = (data) => {
|
|
98
|
+
if (data.category === UserEventCategory.PdpVisit || data.category === UserEventCategory.AddToCart) return {
|
|
99
|
+
event_id: data.eventId,
|
|
100
|
+
created_at: data.createdAt,
|
|
101
|
+
category: data.category,
|
|
102
|
+
attributes: {
|
|
103
|
+
product_id: data.attributes.productId,
|
|
104
|
+
parent_product_id: data.attributes.parentProductId,
|
|
105
|
+
url: data.attributes.url
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
if (data.category === UserEventCategory.PlpVisit) return {
|
|
109
|
+
event_id: data.eventId,
|
|
110
|
+
created_at: data.createdAt,
|
|
111
|
+
category: data.category,
|
|
112
|
+
attributes: {
|
|
113
|
+
category: PLPAttributeCategory.Id,
|
|
114
|
+
attributes: { id: data.attributes.attributes.id }
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
if (data.category === UserEventCategory.QueryTyped) return {
|
|
118
|
+
event_id: data.eventId,
|
|
119
|
+
created_at: data.createdAt,
|
|
120
|
+
category: data.category,
|
|
121
|
+
attributes: { query: data.attributes.query }
|
|
122
|
+
};
|
|
123
|
+
if (data.category === UserEventCategory.Search) return {
|
|
124
|
+
event_id: data.eventId,
|
|
125
|
+
created_at: data.createdAt,
|
|
126
|
+
category: data.category,
|
|
127
|
+
attributes: {
|
|
128
|
+
search_term: data.attributes.searchTerm,
|
|
129
|
+
selected_filters: data.attributes.selectedFilters
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
if (data.category === UserEventCategory.SuggestionClicked) return {
|
|
133
|
+
event_id: data.eventId,
|
|
134
|
+
created_at: data.createdAt,
|
|
135
|
+
category: data.category,
|
|
136
|
+
attributes: { suggestion_id: data.attributes.suggestionId }
|
|
137
|
+
};
|
|
138
|
+
if (data.category === UserEventCategory.PageVisit) return {
|
|
139
|
+
event_id: data.eventId,
|
|
140
|
+
created_at: data.createdAt,
|
|
141
|
+
category: data.category,
|
|
142
|
+
attributes: {
|
|
143
|
+
url: data.attributes.url,
|
|
144
|
+
page_visit_category: data.attributes.pageVisitCategory
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
if (data.category === UserEventCategory.FormSubmitted) return {
|
|
148
|
+
event_id: data.eventId,
|
|
149
|
+
created_at: data.createdAt,
|
|
150
|
+
category: data.category,
|
|
151
|
+
attributes: {
|
|
152
|
+
filled_schema: { ...data.attributes.filledSchema },
|
|
153
|
+
form_response_id: data.attributes.formResponseId,
|
|
154
|
+
form_type: data.attributes.formType
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
event_id: data.eventId,
|
|
159
|
+
created_at: data.createdAt,
|
|
160
|
+
category: data.category
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/application/utils/divideArray.ts
|
|
166
|
+
const divideArray = (array, size) => {
|
|
167
|
+
const rows = [];
|
|
168
|
+
for (let i = 0; i < size; i += 1) rows.push(array.filter((_, index) => index % size === i));
|
|
169
|
+
return rows;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region src/application/utils/mutationHelper.ts
|
|
174
|
+
const compareTokens = (original, comparison) => {
|
|
175
|
+
const originalTokens = new Set(original.split(" "));
|
|
176
|
+
const comparisonTokens = new Set(comparison.split(" "));
|
|
177
|
+
return [...originalTokens].filter((token) => !comparisonTokens.has(token));
|
|
178
|
+
};
|
|
179
|
+
var MutationHelper = class {
|
|
180
|
+
static fireClassChange(record, node, fn) {
|
|
181
|
+
if (node && record.oldValue !== node?.classList.value) fn(node?.classList);
|
|
182
|
+
}
|
|
183
|
+
static fireClassAdded(record, node, classMap) {
|
|
184
|
+
if (node && record.oldValue) compareTokens(node?.classList.value, record.oldValue).forEach((className) => classMap.get(className)?.());
|
|
185
|
+
}
|
|
186
|
+
static fireClassRemoved(record, node, classMap) {
|
|
187
|
+
if (node && record.oldValue) compareTokens(record.oldValue, node?.classList.value).forEach((className) => classMap.get(className)?.());
|
|
188
|
+
}
|
|
189
|
+
static fireSubtreeChange(nodes, fn) {
|
|
190
|
+
nodes.length && fn?.(nodes);
|
|
191
|
+
}
|
|
192
|
+
static isClass(mutation) {
|
|
193
|
+
return mutation.type === "attributes" && mutation.attributeName === "class";
|
|
194
|
+
}
|
|
195
|
+
static isChildList(mutation) {
|
|
196
|
+
return mutation.type === "childList";
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
//#endregion
|
|
201
|
+
//#region src/application/utils/elementObserver.ts
|
|
202
|
+
/**
|
|
203
|
+
* The `ElementObserver` class monitors all changes related to the specific element it is responsible for.
|
|
204
|
+
* It is automatically instantiated by the `useElementObserver` hook, which manages all instances of this class.
|
|
205
|
+
*
|
|
206
|
+
* How it works:
|
|
207
|
+
*
|
|
208
|
+
* Each instance of `ElementObserver` holds several pieces of information related to the node it is monitoring,
|
|
209
|
+
* such as the node's selector and its `MutationObserver`. This class is responsible for translating raw node
|
|
210
|
+
* changes into a more user-friendly format. For example, when the node is added to the DOM, the `ElementObserver`
|
|
211
|
+
* is notified by the `DOMObserver`, which triggers the `onAdd` callback function on the respective `useElementObserver`
|
|
212
|
+
* instance.
|
|
213
|
+
*
|
|
214
|
+
* Instances of `ElementObserver` are fully managed by the `useElementObserver` hook, requiring no additional configuration.
|
|
215
|
+
* When the hook is destroyed, its corresponding `ElementObserver` instance is automatically removed.
|
|
216
|
+
*
|
|
217
|
+
*/
|
|
218
|
+
var ElementObserver = class {
|
|
219
|
+
constructor(selector) {
|
|
220
|
+
this.selector = selector;
|
|
221
|
+
this.mutation = null;
|
|
222
|
+
this.node = null;
|
|
223
|
+
this.eventListeners = /* @__PURE__ */ new Map();
|
|
224
|
+
this.classAdded = /* @__PURE__ */ new Map();
|
|
225
|
+
this.classRemoved = /* @__PURE__ */ new Map();
|
|
226
|
+
this.nodeDisplay = "block";
|
|
227
|
+
this.addFn = () => {};
|
|
228
|
+
this.removeFn = () => {};
|
|
229
|
+
this.changeFn = () => {};
|
|
230
|
+
this.classChangeFn = () => {};
|
|
231
|
+
this.addChildFn = void 0;
|
|
232
|
+
this.removeChildFn = void 0;
|
|
233
|
+
this.resetFn = () => {};
|
|
234
|
+
}
|
|
235
|
+
handleAttributes(mutationRecord) {
|
|
236
|
+
mutationRecord.filter(MutationHelper.isClass).forEach((mutation) => {
|
|
237
|
+
MutationHelper.fireClassChange(mutation, this.node, this.classChangeFn);
|
|
238
|
+
MutationHelper.fireClassAdded(mutation, this.node, this.classAdded);
|
|
239
|
+
MutationHelper.fireClassRemoved(mutation, this.node, this.classRemoved);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
handleChildList(mutationRecord) {
|
|
243
|
+
if (!this.addChildFn && !this.removeChildFn) return;
|
|
244
|
+
mutationRecord.filter(MutationHelper.isChildList).forEach((mutation) => {
|
|
245
|
+
MutationHelper.fireSubtreeChange(mutation.addedNodes, this.addChildFn);
|
|
246
|
+
MutationHelper.fireSubtreeChange(mutation.removedNodes, this.removeChildFn);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
addInitialListeners() {
|
|
250
|
+
this.eventListeners.forEach((v, k) => this.node?.addEventListener(k, v));
|
|
251
|
+
}
|
|
252
|
+
clearEventListeners() {
|
|
253
|
+
this.eventListeners.forEach((v, k) => this.node?.removeEventListener(k, v));
|
|
254
|
+
this.eventListeners.clear();
|
|
255
|
+
}
|
|
256
|
+
renew(newNode) {
|
|
257
|
+
if (newNode) {
|
|
258
|
+
this.destroy();
|
|
259
|
+
this.watch(newNode);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
getSelector() {
|
|
263
|
+
return this.selector;
|
|
264
|
+
}
|
|
265
|
+
getNode() {
|
|
266
|
+
return this.node;
|
|
267
|
+
}
|
|
268
|
+
synchronize() {
|
|
269
|
+
const parsedNode = this.getSelector().parse();
|
|
270
|
+
if (this.getNode() !== parsedNode) {
|
|
271
|
+
this.renew(parsedNode);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (!this.getNode() && parsedNode) {
|
|
275
|
+
this.watch(parsedNode);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (this.getNode() && !parsedNode) this.destroy();
|
|
279
|
+
}
|
|
280
|
+
init() {
|
|
281
|
+
const node = this.getSelector().parse();
|
|
282
|
+
if (node) this.watch(node);
|
|
283
|
+
}
|
|
284
|
+
watch(node) {
|
|
285
|
+
if (!this.mutation) {
|
|
286
|
+
this.mutation = new MutationObserver((mutationRecord) => {
|
|
287
|
+
this.handleAttributes(mutationRecord);
|
|
288
|
+
this.handleChildList(mutationRecord);
|
|
289
|
+
this.changeFn(this.node);
|
|
290
|
+
});
|
|
291
|
+
this.mutation.observe(node, {
|
|
292
|
+
childList: true,
|
|
293
|
+
subtree: true,
|
|
294
|
+
attributes: true,
|
|
295
|
+
attributeOldValue: true
|
|
296
|
+
});
|
|
297
|
+
this.node = node;
|
|
298
|
+
this.addFn(this.node);
|
|
299
|
+
this.addInitialListeners();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
destroy() {
|
|
303
|
+
this.resetFn();
|
|
304
|
+
this.removeFn(this.node);
|
|
305
|
+
this.mutation?.disconnect();
|
|
306
|
+
this.clearEventListeners();
|
|
307
|
+
this.classAdded.clear();
|
|
308
|
+
this.classRemoved.clear();
|
|
309
|
+
this.mutation = null;
|
|
310
|
+
this.node = null;
|
|
311
|
+
}
|
|
312
|
+
render(fn) {
|
|
313
|
+
if (this.node) return createPortal(fn(), this.node);
|
|
314
|
+
}
|
|
315
|
+
fire(event) {
|
|
316
|
+
if (this.node) this.node.dispatchEvent(new MouseEvent(event, {
|
|
317
|
+
bubbles: true,
|
|
318
|
+
cancelable: true,
|
|
319
|
+
view: window
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
show() {
|
|
323
|
+
const display = this.node?.style.display;
|
|
324
|
+
if (this.node && display === "none") this.node.style.display = this.nodeDisplay || "block";
|
|
325
|
+
}
|
|
326
|
+
hide() {
|
|
327
|
+
const display = this.node?.style.display;
|
|
328
|
+
if (this.node && display !== "none") {
|
|
329
|
+
this.nodeDisplay = display || "block";
|
|
330
|
+
this.node.style.display = "none";
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
registerEvent(event, fn) {
|
|
334
|
+
if (this.node) {
|
|
335
|
+
const previousFn = this.eventListeners.get(event);
|
|
336
|
+
if (previousFn) this.node.removeEventListener(event, previousFn);
|
|
337
|
+
this.node.addEventListener(event, fn);
|
|
338
|
+
}
|
|
339
|
+
this.eventListeners.set(event, fn);
|
|
340
|
+
}
|
|
341
|
+
registerOnReset(fn) {
|
|
342
|
+
this.resetFn = fn;
|
|
343
|
+
}
|
|
344
|
+
registerOnChange(fn) {
|
|
345
|
+
this.changeFn = fn;
|
|
346
|
+
}
|
|
347
|
+
registerOnAdd(fn) {
|
|
348
|
+
this.addFn = fn;
|
|
349
|
+
}
|
|
350
|
+
registerOnRemove(fn) {
|
|
351
|
+
this.removeFn = fn;
|
|
352
|
+
}
|
|
353
|
+
registerOnclassChange(fn) {
|
|
354
|
+
this.classChangeFn = fn;
|
|
355
|
+
}
|
|
356
|
+
registerOnAddChild(fn) {
|
|
357
|
+
this.addChildFn = fn;
|
|
358
|
+
}
|
|
359
|
+
registerOnRemoveChild(fn) {
|
|
360
|
+
this.removeChildFn = fn;
|
|
361
|
+
}
|
|
362
|
+
registerOnClassAdded(className, fn) {
|
|
363
|
+
this.classAdded.set(className, fn);
|
|
364
|
+
}
|
|
365
|
+
registerOnClassRemoved(className, fn) {
|
|
366
|
+
this.classRemoved.set(className, fn);
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
//#endregion
|
|
371
|
+
//#region src/application/utils/domObserver.ts
|
|
372
|
+
/**
|
|
373
|
+
* This class manages a `MutationObserver` for the `document.body`. It monitors nodes that are
|
|
374
|
+
* added or removed from the DOM and notifies the observers for each observable element
|
|
375
|
+
* when they are ready to be watched.
|
|
376
|
+
*
|
|
377
|
+
* How that works:
|
|
378
|
+
*
|
|
379
|
+
* When the `observe` function is called, it attaches a `MutationObserver` to the `document.body` element.
|
|
380
|
+
* All changes to `document.body` are tracked by this observer. When changes are detected, the `MutationObserver`
|
|
381
|
+
* iterates through all added and removed nodes and checks if each node exists in the main map of observable elements.
|
|
382
|
+
*
|
|
383
|
+
* If a match is found, it notifies the corresponding `ElementObserver` instance to start monitoring changes for that element.
|
|
384
|
+
*
|
|
385
|
+
* The primary `MutationObserver` remains active until the `destroy` function is called. Calling `destroy` will disconnect all
|
|
386
|
+
* individual element observers and release any associated resources.
|
|
387
|
+
*
|
|
388
|
+
* There is no need to explicitly call the `observe` function. It is automatically invoked when a `useElementObserver` hook is instantiated.
|
|
389
|
+
*
|
|
390
|
+
*/
|
|
391
|
+
var DOMObserver = class {
|
|
392
|
+
static {
|
|
393
|
+
this.listeners = /* @__PURE__ */ new Map();
|
|
394
|
+
}
|
|
395
|
+
static notifyAdition(records, nodeMapping) {
|
|
396
|
+
records.forEach((record) => record.addedNodes.forEach((node) => {
|
|
397
|
+
nodeMapping.get(node)?.watch(node);
|
|
398
|
+
nodeMapping.delete(node);
|
|
399
|
+
}));
|
|
400
|
+
}
|
|
401
|
+
static notifyRemoval(records, nodeMapping) {
|
|
402
|
+
records.forEach((record) => record.removedNodes.forEach((node) => {
|
|
403
|
+
nodeMapping.get(node)?.destroy();
|
|
404
|
+
nodeMapping.delete(node);
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
407
|
+
static notifyChildrenChanges(nodeMapping) {
|
|
408
|
+
Array.from(nodeMapping.values()).forEach((observer) => observer.synchronize());
|
|
409
|
+
}
|
|
410
|
+
static mapNodeInstancesToListeners() {
|
|
411
|
+
const nodeMapping = /* @__PURE__ */ new Map();
|
|
412
|
+
this.listeners.forEach((observer) => {
|
|
413
|
+
const node = observer.getNode() || observer.getSelector()?.parse();
|
|
414
|
+
if (node) nodeMapping.set(node, observer);
|
|
415
|
+
});
|
|
416
|
+
return nodeMapping;
|
|
417
|
+
}
|
|
418
|
+
static add(selector) {
|
|
419
|
+
const node = selector.getPattern();
|
|
420
|
+
let elementObserver = this.listeners.get(node);
|
|
421
|
+
if (elementObserver) return elementObserver;
|
|
422
|
+
elementObserver = new ElementObserver(selector);
|
|
423
|
+
this.listeners.set(node, elementObserver);
|
|
424
|
+
return elementObserver;
|
|
425
|
+
}
|
|
426
|
+
static remove(selector) {
|
|
427
|
+
const node = selector.getPattern();
|
|
428
|
+
this.listeners.get(node)?.destroy();
|
|
429
|
+
this.listeners.delete(node);
|
|
430
|
+
}
|
|
431
|
+
static observe() {
|
|
432
|
+
if (!this.documentObserver) {
|
|
433
|
+
this.documentObserver = new MutationObserver((mutations) => {
|
|
434
|
+
const nodeMapping = this.mapNodeInstancesToListeners();
|
|
435
|
+
this.notifyAdition(mutations, nodeMapping);
|
|
436
|
+
this.notifyRemoval(mutations, nodeMapping);
|
|
437
|
+
this.notifyChildrenChanges(nodeMapping);
|
|
438
|
+
});
|
|
439
|
+
this.documentObserver.observe(document.body, {
|
|
440
|
+
childList: true,
|
|
441
|
+
subtree: true
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
static destroy() {
|
|
446
|
+
this.documentObserver?.disconnect();
|
|
447
|
+
this.listeners.forEach((listener) => listener.destroy());
|
|
448
|
+
this.listeners.clear();
|
|
449
|
+
this.documentObserver = null;
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
//#endregion
|
|
454
|
+
//#region src/application/utils/imageFilter.ts
|
|
455
|
+
const getRecentProductImageUrls = (lastMessages, currentProductId) => {
|
|
456
|
+
const productMessages = lastMessages.filter((message) => message.type === MessageType.Product && message.metadata?.imageUrl).map((m) => m);
|
|
457
|
+
return [...productMessages.filter((m) => m.metadata?.id === currentProductId), ...productMessages.filter((m) => m.metadata?.id !== currentProductId)].map((m) => m.metadata.imageUrl);
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
//#endregion
|
|
461
|
+
//#region src/application/utils/merchantUtils.ts
|
|
462
|
+
const prepareMerchantPage = () => {
|
|
463
|
+
let metaViewport = document.querySelector("meta[name='viewport']");
|
|
464
|
+
if (metaViewport) {
|
|
465
|
+
const content = metaViewport.getAttribute("content");
|
|
466
|
+
if (!content?.includes("maximum-scale=1")) metaViewport.setAttribute("content", `${content}, maximum-scale=1`);
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
metaViewport = document.createElement("meta");
|
|
470
|
+
metaViewport.setAttribute("name", "viewport");
|
|
471
|
+
metaViewport.setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1");
|
|
472
|
+
document.head.appendChild(metaViewport);
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
//#endregion
|
|
476
|
+
//#region src/application/utils/messageFromFormSubmittedEvent.ts
|
|
477
|
+
const messageFromFormSubmittedEvent = (event, formResponseAttributes) => {
|
|
478
|
+
if (event.category !== UserEventCategory.FormSubmitted) return;
|
|
479
|
+
const formStringContents = Object.entries(formResponseAttributes.schema.properties).map(([key, value]) => `${value.title}: ${event.attributes.filledSchema[key]}`).join("\n");
|
|
480
|
+
return {
|
|
481
|
+
id: event.eventId,
|
|
482
|
+
role: MessageRole.User,
|
|
483
|
+
type: MessageType.QueryTyped,
|
|
484
|
+
createdAt: event.createdAt,
|
|
485
|
+
metadata: { content: formStringContents }
|
|
486
|
+
};
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region src/application/utils/messageFromQueryEvent.ts
|
|
491
|
+
/**
|
|
492
|
+
* Transforms a query UserEvent object into a Message object for presentation.
|
|
493
|
+
*
|
|
494
|
+
* @param event The user event object received from the server
|
|
495
|
+
*
|
|
496
|
+
* @returns A Message if the event is a query event, otherwise undefined
|
|
497
|
+
*/
|
|
498
|
+
const messageFromQueryEvent = (event) => {
|
|
499
|
+
if (event.category === UserEventCategory.QueryTyped) return {
|
|
500
|
+
id: event.eventId,
|
|
501
|
+
role: MessageRole.User,
|
|
502
|
+
type: MessageType.QueryTyped,
|
|
503
|
+
createdAt: event.createdAt,
|
|
504
|
+
metadata: { content: event.attributes.query }
|
|
505
|
+
};
|
|
506
|
+
if (event.category === UserEventCategory.Search) return {
|
|
507
|
+
id: event.eventId,
|
|
508
|
+
role: MessageRole.User,
|
|
509
|
+
type: MessageType.Search,
|
|
510
|
+
createdAt: event.createdAt,
|
|
511
|
+
metadata: {
|
|
512
|
+
searchTerm: event.attributes.searchTerm || "",
|
|
513
|
+
selectedFilters: event.attributes.selectedFilters || []
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
//#endregion
|
|
519
|
+
//#region src/application/utils/messageFromResponse.ts
|
|
520
|
+
/**
|
|
521
|
+
* Transforms a server Response object into a Message object for presentation.
|
|
522
|
+
*
|
|
523
|
+
* @param response The response object received from the server containing model generated content
|
|
524
|
+
*
|
|
525
|
+
* @returns A Message if the response contains known attributes, undefined otherwise
|
|
526
|
+
*/
|
|
527
|
+
const messageFromResponse = (response) => {
|
|
528
|
+
if (response == null) return;
|
|
529
|
+
if (response.category === ResponseCategory.Text) return {
|
|
530
|
+
id: response.id,
|
|
531
|
+
createdAt: response.createdAt,
|
|
532
|
+
type: MessageType.Text,
|
|
533
|
+
role: MessageRole.Assistant,
|
|
534
|
+
metadata: { content: response.attributes.content }
|
|
535
|
+
};
|
|
536
|
+
if (response.category === ResponseCategory.Product) return {
|
|
537
|
+
id: response.id,
|
|
538
|
+
createdAt: response.createdAt,
|
|
539
|
+
role: MessageRole.Assistant,
|
|
540
|
+
type: MessageType.Product,
|
|
541
|
+
metadata: { ...response.attributes }
|
|
542
|
+
};
|
|
543
|
+
if (response.category === ResponseCategory.Review) return {
|
|
544
|
+
id: response.id,
|
|
545
|
+
createdAt: response.createdAt,
|
|
546
|
+
type: MessageType.Review,
|
|
547
|
+
role: MessageRole.Assistant,
|
|
548
|
+
metadata: {
|
|
549
|
+
review: response.attributes.review,
|
|
550
|
+
reviewer: response.attributes.reviewer,
|
|
551
|
+
stars: response.attributes.stars,
|
|
552
|
+
title: response.attributes.title,
|
|
553
|
+
richInformation: response.attributes.richInformation
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
if (response.category === ResponseCategory.Separator) return {
|
|
557
|
+
id: response.id,
|
|
558
|
+
createdAt: response.createdAt,
|
|
559
|
+
type: MessageType.Separator,
|
|
560
|
+
role: MessageRole.Assistant
|
|
561
|
+
};
|
|
562
|
+
if (response.category === ResponseCategory.Page) return {
|
|
563
|
+
id: response.id,
|
|
564
|
+
createdAt: response.createdAt,
|
|
565
|
+
role: MessageRole.Assistant,
|
|
566
|
+
type: MessageType.Page,
|
|
567
|
+
metadata: { ...response.attributes }
|
|
568
|
+
};
|
|
569
|
+
if (response.category === ResponseCategory.ProductSearch) return {
|
|
570
|
+
id: response.id,
|
|
571
|
+
createdAt: response.createdAt,
|
|
572
|
+
role: MessageRole.Assistant,
|
|
573
|
+
type: MessageType.ProductSearch,
|
|
574
|
+
metadata: { ...response.attributes }
|
|
575
|
+
};
|
|
576
|
+
if (response.category === ResponseCategory.ProductSearchFilter) return {
|
|
577
|
+
id: response.id,
|
|
578
|
+
createdAt: response.createdAt,
|
|
579
|
+
role: MessageRole.Assistant,
|
|
580
|
+
type: MessageType.ProductSearchFilter,
|
|
581
|
+
metadata: { ...response.attributes }
|
|
582
|
+
};
|
|
583
|
+
if (response.category === ResponseCategory.Form) return {
|
|
584
|
+
id: response.id,
|
|
585
|
+
createdAt: response.createdAt,
|
|
586
|
+
role: MessageRole.Assistant,
|
|
587
|
+
type: MessageType.Form,
|
|
588
|
+
metadata: {
|
|
589
|
+
formType: response.attributes.formCategory?.formType,
|
|
590
|
+
fields: Object.entries(response.attributes.schema.properties).map(([key, value]) => ({
|
|
591
|
+
key,
|
|
592
|
+
title: value.title,
|
|
593
|
+
type: value.type,
|
|
594
|
+
format: value.format,
|
|
595
|
+
required: response.attributes.schema.required.includes(key)
|
|
596
|
+
}))
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
if (response.category === ResponseCategory.Order) return {
|
|
600
|
+
id: response.id,
|
|
601
|
+
createdAt: response.createdAt,
|
|
602
|
+
role: MessageRole.Assistant,
|
|
603
|
+
type: MessageType.Order,
|
|
604
|
+
metadata: { ...response.attributes }
|
|
605
|
+
};
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
//#endregion
|
|
609
|
+
//#region src/application/utils/messageFromSuggestionEvent.ts
|
|
610
|
+
/**
|
|
611
|
+
* Transforms a UserEvent object into a Message object for presentation.
|
|
612
|
+
*
|
|
613
|
+
* @param event The UserEvent object received from the server
|
|
614
|
+
* @param suggestions A list of generated suggestions to match the event to
|
|
615
|
+
*
|
|
616
|
+
* @returns A Message if the event is a suggestion click event, undefined otherwise
|
|
617
|
+
*/
|
|
618
|
+
const messageFromSuggestionEvent = (event, suggestions) => {
|
|
619
|
+
if (event.category === UserEventCategory.SuggestionClicked) {
|
|
620
|
+
const { suggestionId } = event.attributes;
|
|
621
|
+
return {
|
|
622
|
+
id: event.eventId,
|
|
623
|
+
role: MessageRole.User,
|
|
624
|
+
type: MessageType.SuggestionClicked,
|
|
625
|
+
createdAt: event.createdAt,
|
|
626
|
+
metadata: {
|
|
627
|
+
suggestionId,
|
|
628
|
+
suggestionContent: suggestions.find((s) => s.id === suggestionId)?.content ?? ""
|
|
629
|
+
}
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
//#endregion
|
|
635
|
+
//#region src/application/utils/nextMessageRequestToApiRequest.ts
|
|
636
|
+
const messageRequestToCommerceMessageRequest = (data) => ({
|
|
637
|
+
context: {
|
|
638
|
+
chat_id: data.context.chatId,
|
|
639
|
+
org_id: data.context.orgId,
|
|
640
|
+
org_short_name: data.context.orgShortName,
|
|
641
|
+
user_id: data.context.userId,
|
|
642
|
+
source: data.context.source,
|
|
643
|
+
env: data.context.env
|
|
644
|
+
},
|
|
645
|
+
id: data.id,
|
|
646
|
+
feature_flags: data.featureFlags,
|
|
647
|
+
user_events: data.userEvents?.map((userEvent) => coreUserEventToApiUserEvent(userEvent)),
|
|
648
|
+
generation_params: {
|
|
649
|
+
model: data.generationParams?.model,
|
|
650
|
+
max_tokens: data.generationParams?.maxTokens,
|
|
651
|
+
stop: data.generationParams?.stop,
|
|
652
|
+
stream: data.generationParams?.stream,
|
|
653
|
+
temperature: data.generationParams?.temperature,
|
|
654
|
+
top_p: data.generationParams?.topP,
|
|
655
|
+
num_suggestions: data.generationParams?.numSuggestions,
|
|
656
|
+
response_system_prompt: data.generationParams?.responseSystemPrompt,
|
|
657
|
+
suggestion_system_prompt: data.generationParams?.suggestionSystemPrompt,
|
|
658
|
+
response_caching: data.generationParams?.responseCaching
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
|
|
662
|
+
//#endregion
|
|
663
|
+
//#region src/application/utils/nodeSelector.ts
|
|
664
|
+
var NodeSelector = class {
|
|
665
|
+
constructor(pattern) {
|
|
666
|
+
this.pattern = pattern;
|
|
667
|
+
this.root = document;
|
|
668
|
+
}
|
|
669
|
+
getPattern() {
|
|
670
|
+
return this.pattern;
|
|
671
|
+
}
|
|
672
|
+
setRoot(root) {
|
|
673
|
+
this.root = root;
|
|
674
|
+
}
|
|
675
|
+
getRoot() {
|
|
676
|
+
return this.root;
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
var QuerySelector = class extends NodeSelector {
|
|
680
|
+
parse() {
|
|
681
|
+
return this.getRoot().querySelector(this.getPattern());
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
var IDSelector = class extends NodeSelector {
|
|
685
|
+
parse() {
|
|
686
|
+
return this.getRoot().getElementById(this.getPattern());
|
|
687
|
+
}
|
|
688
|
+
};
|
|
689
|
+
var XpathSelector = class extends NodeSelector {
|
|
690
|
+
parse() {
|
|
691
|
+
return this.getRoot()?.evaluate(this.getPattern(), this.getRoot(), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)?.singleNodeValue;
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
var ChainSelector = class extends NodeSelector {
|
|
695
|
+
parse() {
|
|
696
|
+
let selectorIndex = 0;
|
|
697
|
+
const selectors = this.getPattern().split("@");
|
|
698
|
+
const lastIndex = selectors.length - 1;
|
|
699
|
+
const parseChain = (pattern, prevNode) => {
|
|
700
|
+
const selector = SelectorFactory.parse(pattern);
|
|
701
|
+
if (prevNode) selector.setRoot(prevNode);
|
|
702
|
+
const currentNode = selector.parse();
|
|
703
|
+
if (selectorIndex === lastIndex) return currentNode;
|
|
704
|
+
let node = currentNode || document;
|
|
705
|
+
if (currentNode?.shadowRoot) node = currentNode.shadowRoot;
|
|
706
|
+
if (currentNode?.contentWindow) node = currentNode.contentWindow?.document;
|
|
707
|
+
return parseChain(selectors[++selectorIndex].trim(), node);
|
|
708
|
+
};
|
|
709
|
+
return parseChain(selectors[selectorIndex].trim());
|
|
710
|
+
}
|
|
711
|
+
};
|
|
712
|
+
var Empty = class extends NodeSelector {
|
|
713
|
+
constructor() {
|
|
714
|
+
super("");
|
|
715
|
+
}
|
|
716
|
+
parse() {
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
};
|
|
720
|
+
var SelectorFactory = class {
|
|
721
|
+
static parse(composedSelector) {
|
|
722
|
+
if (!composedSelector) return new Empty();
|
|
723
|
+
const split = composedSelector.split("|");
|
|
724
|
+
const type = split[0];
|
|
725
|
+
const selector = split[1];
|
|
726
|
+
switch (type) {
|
|
727
|
+
case "id": return this.id(selector);
|
|
728
|
+
case "query": return this.query(selector);
|
|
729
|
+
case "xpath": return this.xpath(selector);
|
|
730
|
+
default: return new Empty();
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
static check(selector) {
|
|
734
|
+
return selector ?? new Empty();
|
|
735
|
+
}
|
|
736
|
+
static chain(pattern) {
|
|
737
|
+
return pattern ? new ChainSelector(pattern) : new Empty();
|
|
738
|
+
}
|
|
739
|
+
static id(pattern) {
|
|
740
|
+
return pattern ? new IDSelector(pattern) : new Empty();
|
|
741
|
+
}
|
|
742
|
+
static query(pattern) {
|
|
743
|
+
return pattern ? new QuerySelector(pattern) : new Empty();
|
|
744
|
+
}
|
|
745
|
+
static xpath(pattern) {
|
|
746
|
+
return pattern ? new XpathSelector(pattern) : new Empty();
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
//#endregion
|
|
751
|
+
//#region src/application/utils/overrides.ts
|
|
752
|
+
function isPlainObject(x) {
|
|
753
|
+
return !!x && typeof x === "object" && !Array.isArray(x) && !(x instanceof Date) && !(x instanceof RegExp);
|
|
754
|
+
}
|
|
755
|
+
function isReplace(x) {
|
|
756
|
+
return !!x && typeof x === "object" && "$replace" in x;
|
|
757
|
+
}
|
|
758
|
+
function isDelete(x) {
|
|
759
|
+
return !!x && typeof x === "object" && x.$delete === true;
|
|
760
|
+
}
|
|
761
|
+
function isPrimitiveValue(x) {
|
|
762
|
+
const t = typeof x;
|
|
763
|
+
return x === null || t === "string" || t === "number" || t === "boolean" || t === "bigint" || t === "symbol" || t === "undefined";
|
|
764
|
+
}
|
|
765
|
+
function isArrayOfPrimitives(arr) {
|
|
766
|
+
if (arr.length === 0) return false;
|
|
767
|
+
for (let i = 0; i < arr.length; i += 1) {
|
|
768
|
+
const v = arr[i];
|
|
769
|
+
if (v !== void 0 && !isPrimitiveValue(v)) return false;
|
|
770
|
+
}
|
|
771
|
+
return true;
|
|
772
|
+
}
|
|
773
|
+
function mergeAny(baseAny, patchAny, opts) {
|
|
774
|
+
if (isReplace(patchAny)) return patchAny.$replace;
|
|
775
|
+
if (isDelete(patchAny)) return void 0;
|
|
776
|
+
if (Array.isArray(baseAny)) {
|
|
777
|
+
if (Array.isArray(patchAny)) {
|
|
778
|
+
const baseArr = baseAny;
|
|
779
|
+
const patchArr = patchAny;
|
|
780
|
+
if (opts.arrayStrategy === "replace" || isArrayOfPrimitives(baseArr) || isArrayOfPrimitives(patchArr)) return patchAny;
|
|
781
|
+
const out = baseArr.slice();
|
|
782
|
+
const max = Math.max(out.length, patchArr.length);
|
|
783
|
+
for (let i = 0; i < max; i += 1) {
|
|
784
|
+
const pVal = patchArr[i];
|
|
785
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
786
|
+
}
|
|
787
|
+
return out;
|
|
788
|
+
}
|
|
789
|
+
return baseAny;
|
|
790
|
+
}
|
|
791
|
+
if (isPlainObject(baseAny) && isPlainObject(patchAny)) {
|
|
792
|
+
const baseObj = baseAny;
|
|
793
|
+
const patchObj = patchAny;
|
|
794
|
+
const out = { ...baseObj };
|
|
795
|
+
for (const key of Object.keys(patchObj)) {
|
|
796
|
+
const pVal = patchObj[key];
|
|
797
|
+
if (pVal === void 0) {} else if (opts.nullDeletes && pVal === null) delete out[key];
|
|
798
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
799
|
+
else if (isDelete(pVal)) delete out[key];
|
|
800
|
+
else out[key] = mergeAny(baseObj?.[key], pVal, opts);
|
|
801
|
+
}
|
|
802
|
+
return out;
|
|
803
|
+
}
|
|
804
|
+
return patchAny ?? baseAny;
|
|
805
|
+
}
|
|
806
|
+
function applyOverrides(base, patch, opts = {}) {
|
|
807
|
+
const { arrayStrategy = "mergeByIndex", nullDeletes = false } = opts;
|
|
808
|
+
if (isReplace(patch)) return patch.$replace;
|
|
809
|
+
if (isDelete(patch)) return void 0;
|
|
810
|
+
if (Array.isArray(base)) {
|
|
811
|
+
if (isReplace(patch)) return patch.$replace;
|
|
812
|
+
if (Array.isArray(patch)) {
|
|
813
|
+
if (arrayStrategy === "replace") return patch;
|
|
814
|
+
const out = base.slice();
|
|
815
|
+
const max = Math.max(out.length, patch.length);
|
|
816
|
+
for (let i = 0; i < max; i += 1) {
|
|
817
|
+
const pVal = patch[i];
|
|
818
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
819
|
+
}
|
|
820
|
+
return out;
|
|
821
|
+
}
|
|
822
|
+
return base;
|
|
823
|
+
}
|
|
824
|
+
if (isPlainObject(base) && isPlainObject(patch)) {
|
|
825
|
+
const out = { ...base };
|
|
826
|
+
const patchObj = patch;
|
|
827
|
+
for (const key of Object.keys(patchObj)) {
|
|
828
|
+
const pVal = patchObj[key];
|
|
829
|
+
if (pVal === void 0) {} else if (nullDeletes && pVal === null) delete out[key];
|
|
830
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
831
|
+
else if (isDelete(pVal)) delete out[key];
|
|
832
|
+
else {
|
|
833
|
+
const bVal = base[key];
|
|
834
|
+
out[key] = mergeAny(bVal, pVal, opts);
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
return out;
|
|
838
|
+
}
|
|
839
|
+
return patch ?? base;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
//#endregion
|
|
843
|
+
//#region src/application/utils/stringUtils.ts
|
|
844
|
+
var StringUtils = class StringUtils {
|
|
845
|
+
static isNullOrEmpty(value) {
|
|
846
|
+
const valueTrimmed = value?.trim();
|
|
847
|
+
return value === void 0 || valueTrimmed === "";
|
|
848
|
+
}
|
|
849
|
+
static trimToNull(value) {
|
|
850
|
+
const valueTrimmed = value?.trim();
|
|
851
|
+
return StringUtils.isNullOrEmpty(valueTrimmed) ? void 0 : valueTrimmed;
|
|
852
|
+
}
|
|
853
|
+
static capitalize(type) {
|
|
854
|
+
if (type === void 0) return "";
|
|
855
|
+
return type.charAt(0).toUpperCase() + type.substring(1);
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* Finds the first pattern in an array that matches a given URL.
|
|
859
|
+
* Patterns can include a single wildcard '*' which matches any sequence of characters.
|
|
860
|
+
*
|
|
861
|
+
* @param patterns
|
|
862
|
+
* @param urlToTest
|
|
863
|
+
* @returns
|
|
864
|
+
*/
|
|
865
|
+
static findMatchingPattern(patterns, urlToTest) {
|
|
866
|
+
if (!urlToTest) return;
|
|
867
|
+
for (const pattern of patterns) if (urlToTest.pathname !== "/") {
|
|
868
|
+
const regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
869
|
+
if ((/* @__PURE__ */ new RegExp(`^${regexPattern}$`)).test(urlToTest.pathname)) return pattern;
|
|
870
|
+
} else if (pattern.startsWith(urlToTest.hostname)) return pattern;
|
|
871
|
+
}
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
//#endregion
|
|
875
|
+
//#region src/application/utils/supportedEventRequestToApiRequest.ts
|
|
876
|
+
const coreSupportedEventRequestToApiRequest = (coreSupportedEventRequest) => ({
|
|
877
|
+
id: coreSupportedEventRequest.id,
|
|
878
|
+
user_event: coreUserEventToApiUserEvent(coreSupportedEventRequest.userEvent),
|
|
879
|
+
context: coreContextToApiContext(coreSupportedEventRequest.context)
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
//#endregion
|
|
883
|
+
//#region src/application/utils/validation.ts
|
|
884
|
+
const validateEmail = (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|
|
885
|
+
|
|
886
|
+
//#endregion
|
|
887
|
+
export { DOMObserver, ElementObserver, MutationHelper, NodeSelector, SelectorFactory, StringUtils, applyOverrides, coreContextToApiContext, coreSupportedEventRequestToApiRequest, coreUserEventToApiUserEvent, divideArray, getRecentProductImageUrls, initAmplitude, initDataLayerWrapper, messageFromFormSubmittedEvent, messageFromQueryEvent, messageFromResponse, messageFromSuggestionEvent, messageRequestToCommerceMessageRequest, prepareMerchantPage, validateEmail };
|
|
888
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtQzlaU0N4MTIuanMiLCJuYW1lcyI6WyJldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vZGU6IE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkIiwib3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9hbmFseXRpY3NVdGlscy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlQ29udGV4dFRvQXBpQ29udGV4dC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvZGl2aWRlQXJyYXkudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbXV0YXRpb25IZWxwZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvZWxlbWVudE9ic2VydmVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2RvbU9ic2VydmVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2ltYWdlRmlsdGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lcmNoYW50VXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21RdWVyeUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL25vZGVTZWxlY3Rvci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9vdmVycmlkZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3RyaW5nVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3ZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQsXG4gIGlzR0E0RWNvbW1lcmNlRXZlbnQsXG4gIGlzQmFzZUVjb21tZXJjZUV2ZW50LFxuICBCYXNlRWNvbW1lcmNlRXZlbnQsXG59IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzXCI7XG5pbXBvcnQgeyBTcGlmZnlNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSBcInNyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0XCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZGF0YUxheWVyOiBhbnlbXTtcbiAgfVxufVxuXG5jb25zdCBOT1JNQUxJWkVEX0FERF9UT19DQVJUX0VWRU5UX05BTUVTID0gW1wiYWRkdG9jYXJ0XCIsIFwiYWRkZWR0b2NhcnRcIl07XG5jb25zdCBDSEVDS19EQVRBX0xBWUVSX0lOVEVSVkFMX01TID0gNTAwO1xuY29uc3QgQ0hFQ0tfREFUQV9MQVlFUl9NQVhfQVRURU1QVFMgPSAxMDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBHb29nbGUgQW5hbHl0aWNzIGV2ZW50IGlzIGFuIGFkZF90b19jYXJ0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgbmFtZSB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBldmVudCBpcyBhbiBhZGRfdG9fY2FydCBldmVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5jb25zdCBpc0FkZFRvQ2FydEV2ZW50ID0gKGV2ZW50OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEV2ZW50ID0gZXZlbnQucmVwbGFjZSgvWy1fXS9nLCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gTk9STUFMSVpFRF9BRERfVE9fQ0FSVF9FVkVOVF9OQU1FUy5zb21lKChuYW1lKSA9PlxuICAgIG5vcm1hbGl6ZWRFdmVudC5pbmNsdWRlcyhuYW1lKVxuICApO1xufTtcblxuLyoqXG4gKiBUcmFja3MgYW4gYWRkX3RvX2NhcnQgZXZlbnQgaW4gQW1wbGl0dWRlLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gdHJhY2suXG4gKi9cbmNvbnN0IGhhbmRsZUFkZFRvQ2FydEV2ZW50ID0gKFxuICBldmVudDogQmFzZUVjb21tZXJjZUV2ZW50LFxuICB0cmFjazogKFxuICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiB2b2lkXG4pID0+IHtcbiAgbGV0IGV2ZW50UHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGlmIChpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQoZXZlbnQpKSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGl0ZW1zOiBldmVudC5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4gKHtcbiAgICAgICAgaXRlbV9uYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgIGl0ZW1fY2F0ZWdvcnk6IHByb2R1Y3QuY2F0ZWdvcnksXG4gICAgICAgIHByaWNlOiBwcm9kdWN0LnByaWNlLFxuICAgICAgICBxdWFudGl0eTogcHJvZHVjdC5xdWFudGl0eSxcbiAgICAgIH0pKSxcbiAgICAgIGN1cnJlbmN5OiBldmVudC5lY29tbWVyY2UuYWRkLmN1cnJlbmN5Q29kZSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcImxlZ2FjeV91bml2ZXJzYWxfYW5hbHl0aWNzXCIsXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc0dBNEVjb21tZXJjZUV2ZW50KGV2ZW50KSkge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBpdGVtczogZXZlbnQuZWNvbW1lcmNlLml0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgaXRlbV9uYW1lOiBpdGVtLml0ZW1fbmFtZSxcbiAgICAgICAgaXRlbV9jYXRlZ29yeTogaXRlbS5pdGVtX2NhdGVnb3J5LFxuICAgICAgICBwcmljZTogaXRlbS5wcmljZSxcbiAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICB9KSksXG4gICAgICBjdXJyZW5jeTogZXZlbnQuZWNvbW1lcmNlLmN1cnJlbmN5LFxuICAgICAgZXZlbnRfZm9ybWF0X3ZlcnNpb246IFwiZ29vZ2xlX2FuYWx5dGljc180XCIsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgZXZlbnRfcHJvcGVydGllczogeyAuLi5ldmVudCB9LFxuICAgICAgZXZlbnRfZm9ybWF0X3ZlcnNpb246IFwidW5rbm93blwiLFxuICAgIH07XG4gIH1cblxuICB0cmFjayhTcGlmZnlNZXRyaWNzRXZlbnROYW1lLkFkZFRvQ2FydENsaWNrZWQsIHtcbiAgICBldmVudFByb3BzLFxuICB9KTtcbn07XG5cbi8qKlxuICogV3JhcHMgdGhlIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCBtZXRob2QgdG8gaW50ZXJjZXB0IGFkZF90b19jYXJ0IGV2ZW50cyBhbmQgc2VuZCB0aGVtIHRvIEFtcGxpdHVkZS5cbiAqIFRoaXMgZnVuY3Rpb24gcnVucyBvbiBhbiBpbnRlcnZhbCB1bnRpbCB0aGUgZGF0YUxheWVyIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluaXREYXRhTGF5ZXJXcmFwcGVyID0gKFxuICB0cmFjazogKFxuICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgICBldmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSA9PiB2b2lkXG4pID0+IHtcbiAgbGV0IGF0dGVtcHRzID0gMDtcblxuICAvLyBjdXJyZW50bHksIG91ciBidW5kbGUgaXMgYWx3YXlzIGxvYWRlZCBhZnRlciBHVE0gaGFzIGluaXRpYWxpemVkIEdBL2RhdGFMYXllclxuICAvLyB3ZSdsbCBuZWVkIHRoaXMgY2hlY2sgaGVyZSBpZi93aGVuIHdlIGxvYWQgc3BpZmZ5IGJlZm9yZS9vdXRzaWRlIG9mIEdUTVxuICBjb25zdCBjaGVja0FuZEluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgaWYgKCF3aW5kb3cuZGF0YUxheWVyIHx8ICEod2luZG93LmRhdGFMYXllciBhcyBhbnkpLnB1c2gpIHtcbiAgICAgIGF0dGVtcHRzICs9IDE7XG5cbiAgICAgIGlmIChhdHRlbXB0cyA+PSBDSEVDS19EQVRBX0xBWUVSX01BWF9BVFRFTVBUUykge1xuICAgICAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAgICAgYFtzcGlmZnktYWldIGRhdGFMYXllciBub3QgYXZhaWxhYmxlIGFmdGVyICR7Q0hFQ0tfREFUQV9MQVlFUl9NQVhfQVRURU1QVFN9IGF0dGVtcHRzYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoY2hlY2tBbmRJbml0aWFsaXplLCBDSEVDS19EQVRBX0xBWUVSX0lOVEVSVkFMX01TKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICBcIltzcGlmZnktYWldIGRhdGFMYXllciBpcyBhdmFpbGFibGUsIHdyYXBwaW5nIHB1c2ggZnVuY3Rpb24uLi5cIlxuICAgICk7XG4gICAgY29uc3Qgb3JpZ2luYWxQdXNoID0gd2luZG93LmRhdGFMYXllci5wdXNoO1xuICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNCYXNlRWNvbW1lcmNlRXZlbnQoYXJnc1swXSkgJiZcbiAgICAgICAgaXNBZGRUb0NhcnRFdmVudCgoYXJnc1swXSBhcyBhbnkpLmV2ZW50KVxuICAgICAgKSB7XG4gICAgICAgIGhhbmRsZUFkZFRvQ2FydEV2ZW50KGFyZ3NbMF0gYXMgQmFzZUVjb21tZXJjZUV2ZW50LCB0cmFjayk7XG4gICAgICB9XG5cbiAgICAgIC8vIElNUE9SVEFOVDogY2FsbCB0aGUgb3JpZ2luYWwgcHVzaCBtZXRob2Qgc28gdGhhdCB0aGUgZXZlbnQgaXMgc3RpbGwgbG9nZ2VkIHRvIEdBXG4gICAgICByZXR1cm4gb3JpZ2luYWxQdXNoLmFwcGx5KHdpbmRvdy5kYXRhTGF5ZXIsIGFyZ3MpO1xuICAgIH07XG4gIH07XG5cbiAgY2hlY2tBbmRJbml0aWFsaXplKCk7XG59O1xuXG5leHBvcnQgY29uc3QgaW5pdEFtcGxpdHVkZSA9IChcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gbWlnaHQgbm90IGJlIG5lZWRlZCBhbnltb3JlIGlmIEFtcGxpdHVkZSBpcyBpbml0aWFsaXplZCB2aWEgY29udGV4dC5cbiAgLy8gRm9yIG5vdywgd2UnbGwga2VlcCBpdCBhbmQgcGFzcyB0aGUgdHJhY2sgZnVuY3Rpb24uXG4gIC8vIElmIGl0J3MgdHJ1bHkgcmVkdW5kYW50LCBpdCBjYW4gYmUgcmVtb3ZlZCBsYXRlci5cbiAgdHJhY2soU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5CdW5kbGVMb2FkZWQpOyAvLyBFeGFtcGxlIHVzYWdlLCBhZGp1c3QgYXMgbmVlZGVkXG59O1xuIiwiaW1wb3J0IHsgQ29udGV4dCBhcyBBcGlDb250ZXh0IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IENvbnRleHQgYXMgQ29yZUNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgY29yZUNvbnRleHRUb0FwaUNvbnRleHQgPSAoY29udGV4dDogQ29yZUNvbnRleHQpOiBBcGlDb250ZXh0ID0+ICh7XG4gIGNoYXRfaWQ6IGNvbnRleHQuY2hhdElkLFxuICBvcmdfaWQ6IGNvbnRleHQub3JnSWQsXG4gIHVzZXJfaWQ6IGNvbnRleHQudXNlcklkLFxuICBvcmdfc2hvcnRfbmFtZTogY29udGV4dC5vcmdTaG9ydE5hbWUsXG4gIHNvdXJjZTogY29udGV4dC5zb3VyY2UsXG4gIGVudjogY29udGV4dC5lbnYsXG59KTtcbiIsImltcG9ydCB7XG4gIFVzZXJFdmVudCBhcyBBcGlVc2VyRXZlbnQsXG4gIFBMUEF0dHJpYnV0ZUNhdGVnb3J5LFxuICBQTFBJZEF0dHJpYnV0ZXMsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxufSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgVXNlckV2ZW50IGFzIENvcmVVc2VyRXZlbnQgfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50ID0gKGRhdGE6IENvcmVVc2VyRXZlbnQpOiBBcGlVc2VyRXZlbnQgPT4ge1xuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQgfHxcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnRcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwcm9kdWN0X2lkOiBkYXRhLmF0dHJpYnV0ZXMucHJvZHVjdElkLFxuICAgICAgICBwYXJlbnRfcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnBhcmVudFByb2R1Y3RJZCxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBscFZpc2l0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBjYXRlZ29yeTogUExQQXR0cmlidXRlQ2F0ZWdvcnkuSWQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAvLyB3ZSdyZSBvbmx5IGhhbmRsaW5nIGlkIGF0dHJpYnV0ZXMgZm9yIG5vd1xuICAgICAgICAgIGlkOiAoZGF0YS5hdHRyaWJ1dGVzLmF0dHJpYnV0ZXMgYXMgUExQSWRBdHRyaWJ1dGVzKS5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5RdWVyeVR5cGVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBxdWVyeTogZGF0YS5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoX3Rlcm06IGRhdGEuYXR0cmlidXRlcy5zZWFyY2hUZXJtLFxuICAgICAgICBzZWxlY3RlZF9maWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuc2VsZWN0ZWRGaWx0ZXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlN1Z2dlc3Rpb25DbGlja2VkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBzdWdnZXN0aW9uX2lkOiBkYXRhLmF0dHJpYnV0ZXMuc3VnZ2VzdGlvbklkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBhZ2VWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgICBwYWdlX3Zpc2l0X2NhdGVnb3J5OiBkYXRhLmF0dHJpYnV0ZXMucGFnZVZpc2l0Q2F0ZWdvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsbGVkX3NjaGVtYTogeyAuLi5kYXRhLmF0dHJpYnV0ZXMuZmlsbGVkU2NoZW1hIH0sXG4gICAgICAgIGZvcm1fcmVzcG9uc2VfaWQ6IGRhdGEuYXR0cmlidXRlcy5mb3JtUmVzcG9uc2VJZCxcbiAgICAgICAgZm9ybV90eXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVR5cGUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGFwcF9sb2FkZWQgZXZlbnQsIHdoZW4gd2Ugc3RhcnQgdG8gdXNlIGFwcF91bmxvYWRlZCB3ZSBuZWVkIHRvIGhhbmRsZSBpdCBoZXJlXG4gIHJldHVybiB7XG4gICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgfTtcbn07XG4iLCJleHBvcnQgY29uc3QgZGl2aWRlQXJyYXkgPSA8VD4oYXJyYXk6IFRbXSwgc2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHJvd3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICByb3dzLnB1c2goYXJyYXkuZmlsdGVyKChfOiBULCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIHNpemUgPT09IGkpKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn07XG4iLCJjb25zdCBjb21wYXJlVG9rZW5zID0gKG9yaWdpbmFsOiBzdHJpbmcsIGNvbXBhcmlzb246IHN0cmluZykgPT4ge1xuICBjb25zdCBvcmlnaW5hbFRva2VucyA9IG5ldyBTZXQob3JpZ2luYWwuc3BsaXQoJyAnKSk7XG4gIGNvbnN0IGNvbXBhcmlzb25Ub2tlbnMgPSBuZXcgU2V0KGNvbXBhcmlzb24uc3BsaXQoJyAnKSk7XG4gIHJldHVybiBbLi4ub3JpZ2luYWxUb2tlbnNdLmZpbHRlcigodG9rZW4pID0+ICFjb21wYXJpc29uVG9rZW5zLmhhcyh0b2tlbikpO1xufTtcblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uSGVscGVyIHtcbiAgc3RhdGljIGZpcmVDbGFzc0NoYW5nZShcbiAgICByZWNvcmQ6IE11dGF0aW9uUmVjb3JkLFxuICAgIG5vZGU6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgICBmbjogKGNsYXNzZXM6IERPTVRva2VuTGlzdCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgaWYgKG5vZGUgJiYgcmVjb3JkLm9sZFZhbHVlICE9PSBub2RlPy5jbGFzc0xpc3QudmFsdWUpIHtcbiAgICAgIGZuKG5vZGU/LmNsYXNzTGlzdCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZpcmVDbGFzc0FkZGVkKFxuICAgIHJlY29yZDogTXV0YXRpb25SZWNvcmQsXG4gICAgbm9kZTogSFRNTEVsZW1lbnQgfCBudWxsLFxuICAgIGNsYXNzTWFwOiBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPixcbiAgKSB7XG4gICAgaWYgKG5vZGUgJiYgcmVjb3JkLm9sZFZhbHVlKSB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBjb21wYXJlVG9rZW5zKG5vZGU/LmNsYXNzTGlzdC52YWx1ZSwgcmVjb3JkLm9sZFZhbHVlKTtcbiAgICAgIHRva2Vucy5mb3JFYWNoKChjbGFzc05hbWUpID0+IGNsYXNzTWFwLmdldChjbGFzc05hbWUpPy4oKSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZpcmVDbGFzc1JlbW92ZWQoXG4gICAgcmVjb3JkOiBNdXRhdGlvblJlY29yZCxcbiAgICBub2RlOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgY2xhc3NNYXA6IE1hcDxzdHJpbmcsICgpID0+IHZvaWQ+LFxuICApIHtcbiAgICBpZiAobm9kZSAmJiByZWNvcmQub2xkVmFsdWUpIHtcbiAgICAgIGNvbnN0IHRva2VucyA9IGNvbXBhcmVUb2tlbnMocmVjb3JkLm9sZFZhbHVlLCBub2RlPy5jbGFzc0xpc3QudmFsdWUpO1xuICAgICAgdG9rZW5zLmZvckVhY2goKGNsYXNzTmFtZSkgPT4gY2xhc3NNYXAuZ2V0KGNsYXNzTmFtZSk/LigpKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmlyZVN1YnRyZWVDaGFuZ2Uobm9kZXM6IE5vZGVMaXN0LCBmbj86IChub2RlczogTm9kZUxpc3QpID0+IHZvaWQpIHtcbiAgICBub2Rlcy5sZW5ndGggJiYgZm4/Lihub2Rlcyk7XG4gIH1cblxuICBzdGF0aWMgaXNDbGFzcyhtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQpIHtcbiAgICByZXR1cm4gbXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdjbGFzcyc7XG4gIH1cblxuICBzdGF0aWMgaXNDaGlsZExpc3QobXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSB7XG4gICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZWFjdEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgTW91c2VFdmVudFR5cGVzIH0gZnJvbSAnLi9tb3VzZUV2ZW50VHlwZXMnO1xuaW1wb3J0IHsgTXV0YXRpb25IZWxwZXIgfSBmcm9tICcuL211dGF0aW9uSGVscGVyJztcbmltcG9ydCB7IE5vZGVTZWxlY3RvciB9IGZyb20gJy4vbm9kZVNlbGVjdG9yJztcblxuLyoqXG4gKiBUaGUgYEVsZW1lbnRPYnNlcnZlcmAgY2xhc3MgbW9uaXRvcnMgYWxsIGNoYW5nZXMgcmVsYXRlZCB0byB0aGUgc3BlY2lmaWMgZWxlbWVudCBpdCBpcyByZXNwb25zaWJsZSBmb3IuXG4gKiBJdCBpcyBhdXRvbWF0aWNhbGx5IGluc3RhbnRpYXRlZCBieSB0aGUgYHVzZUVsZW1lbnRPYnNlcnZlcmAgaG9vaywgd2hpY2ggbWFuYWdlcyBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICpcbiAqIEVhY2ggaW5zdGFuY2Ugb2YgYEVsZW1lbnRPYnNlcnZlcmAgaG9sZHMgc2V2ZXJhbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgbm9kZSBpdCBpcyBtb25pdG9yaW5nLFxuICogc3VjaCBhcyB0aGUgbm9kZSdzIHNlbGVjdG9yIGFuZCBpdHMgYE11dGF0aW9uT2JzZXJ2ZXJgLiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2xhdGluZyByYXcgbm9kZVxuICogY2hhbmdlcyBpbnRvIGEgbW9yZSB1c2VyLWZyaWVuZGx5IGZvcm1hdC4gRm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5vZGUgaXMgYWRkZWQgdG8gdGhlIERPTSwgdGhlIGBFbGVtZW50T2JzZXJ2ZXJgXG4gKiBpcyBub3RpZmllZCBieSB0aGUgYERPTU9ic2VydmVyYCwgd2hpY2ggdHJpZ2dlcnMgdGhlIGBvbkFkZGAgY2FsbGJhY2sgZnVuY3Rpb24gb24gdGhlIHJlc3BlY3RpdmUgYHVzZUVsZW1lbnRPYnNlcnZlcmBcbiAqIGluc3RhbmNlLlxuICpcbiAqIEluc3RhbmNlcyBvZiBgRWxlbWVudE9ic2VydmVyYCBhcmUgZnVsbHkgbWFuYWdlZCBieSB0aGUgYHVzZUVsZW1lbnRPYnNlcnZlcmAgaG9vaywgcmVxdWlyaW5nIG5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbi5cbiAqIFdoZW4gdGhlIGhvb2sgaXMgZGVzdHJveWVkLCBpdHMgY29ycmVzcG9uZGluZyBgRWxlbWVudE9ic2VydmVyYCBpbnN0YW5jZSBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgRWxlbWVudE9ic2VydmVyIHtcbiAgcHJpdmF0ZSBtdXRhdGlvbjogTXV0YXRpb25PYnNlcnZlciB8IG51bGw7XG5cbiAgcHJpdmF0ZSBub2RlOiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgcHJpdmF0ZSBzZWxlY3RvcjogTm9kZVNlbGVjdG9yO1xuXG4gIHByaXZhdGUgZXZlbnRMaXN0ZW5lcnM6IE1hcDxrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwLCBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0PjtcblxuICBwcml2YXRlIGNsYXNzQWRkZWQ6IE1hcDxzdHJpbmcsICgpID0+IHZvaWQ+O1xuXG4gIHByaXZhdGUgY2xhc3NSZW1vdmVkOiBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPjtcblxuICBwcml2YXRlIG5vZGVEaXNwbGF5OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBhZGRGbjogKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSByZW1vdmVGbjogKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBjaGFuZ2VGbjogKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBjbGFzc0NoYW5nZUZuOiAoY2xhc3Nlcz86IERPTVRva2VuTGlzdCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGFkZENoaWxkRm4/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgcmVtb3ZlQ2hpbGRGbj86ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSByZXNldEZuOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yOiBOb2RlU2VsZWN0b3IpIHtcbiAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgdGhpcy5tdXRhdGlvbiA9IG51bGw7XG4gICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY2xhc3NBZGRlZCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmNsYXNzUmVtb3ZlZCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm5vZGVEaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmFkZEZuID0gKCkgPT4ge307XG4gICAgdGhpcy5yZW1vdmVGbiA9ICgpID0+IHt9O1xuICAgIHRoaXMuY2hhbmdlRm4gPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNsYXNzQ2hhbmdlRm4gPSAoKSA9PiB7fTtcbiAgICB0aGlzLmFkZENoaWxkRm4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZW1vdmVDaGlsZEZuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzZXRGbiA9ICgpID0+IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdHRyaWJ1dGVzKG11dGF0aW9uUmVjb3JkOiBNdXRhdGlvblJlY29yZFtdKSB7XG4gICAgbXV0YXRpb25SZWNvcmQuZmlsdGVyKE11dGF0aW9uSGVscGVyLmlzQ2xhc3MpLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICBNdXRhdGlvbkhlbHBlci5maXJlQ2xhc3NDaGFuZ2UobXV0YXRpb24sIHRoaXMubm9kZSwgdGhpcy5jbGFzc0NoYW5nZUZuKTtcbiAgICAgIE11dGF0aW9uSGVscGVyLmZpcmVDbGFzc0FkZGVkKG11dGF0aW9uLCB0aGlzLm5vZGUsIHRoaXMuY2xhc3NBZGRlZCk7XG4gICAgICBNdXRhdGlvbkhlbHBlci5maXJlQ2xhc3NSZW1vdmVkKG11dGF0aW9uLCB0aGlzLm5vZGUsIHRoaXMuY2xhc3NSZW1vdmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hpbGRMaXN0KG11dGF0aW9uUmVjb3JkOiBNdXRhdGlvblJlY29yZFtdKSB7XG4gICAgaWYgKCF0aGlzLmFkZENoaWxkRm4gJiYgIXRoaXMucmVtb3ZlQ2hpbGRGbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG11dGF0aW9uUmVjb3JkLmZpbHRlcihNdXRhdGlvbkhlbHBlci5pc0NoaWxkTGlzdCkuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcbiAgICAgIE11dGF0aW9uSGVscGVyLmZpcmVTdWJ0cmVlQ2hhbmdlKG11dGF0aW9uLmFkZGVkTm9kZXMsIHRoaXMuYWRkQ2hpbGRGbik7XG4gICAgICBNdXRhdGlvbkhlbHBlci5maXJlU3VidHJlZUNoYW5nZShtdXRhdGlvbi5yZW1vdmVkTm9kZXMsIHRoaXMucmVtb3ZlQ2hpbGRGbik7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEluaXRpYWxMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5mb3JFYWNoKCh2LCBrKSA9PiB0aGlzLm5vZGU/LmFkZEV2ZW50TGlzdGVuZXIoaywgdikpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgodiwgaykgPT4gdGhpcy5ub2RlPy5yZW1vdmVFdmVudExpc3RlbmVyKGssIHYpKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbmV3KG5ld05vZGU6IE5vZGUgfCBudWxsKSB7XG4gICAgaWYgKG5ld05vZGUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgdGhpcy53YXRjaChuZXdOb2RlKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RvcjtcbiAgfVxuXG4gIGdldE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgfVxuXG4gIHN5bmNocm9uaXplKCkge1xuICAgIGNvbnN0IHBhcnNlZE5vZGUgPSB0aGlzLmdldFNlbGVjdG9yKCkucGFyc2UoKTtcblxuICAgIGlmICh0aGlzLmdldE5vZGUoKSAhPT0gcGFyc2VkTm9kZSkge1xuICAgICAgdGhpcy5yZW5ldyhwYXJzZWROb2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0Tm9kZSgpICYmIHBhcnNlZE5vZGUpIHtcbiAgICAgIHRoaXMud2F0Y2gocGFyc2VkTm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0Tm9kZSgpICYmICFwYXJzZWROb2RlKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFNlbGVjdG9yKCkucGFyc2UoKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgdGhpcy53YXRjaChub2RlKTtcbiAgICB9XG4gIH1cblxuICB3YXRjaChub2RlOiBOb2RlKSB7XG4gICAgaWYgKCF0aGlzLm11dGF0aW9uKSB7XG4gICAgICB0aGlzLm11dGF0aW9uID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uUmVjb3JkKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlQXR0cmlidXRlcyhtdXRhdGlvblJlY29yZCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2hpbGRMaXN0KG11dGF0aW9uUmVjb3JkKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VGbih0aGlzLm5vZGUpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm11dGF0aW9uLm9ic2VydmUobm9kZSwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm5vZGUgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGhpcy5hZGRGbih0aGlzLm5vZGUpO1xuICAgICAgdGhpcy5hZGRJbml0aWFsTGlzdGVuZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlc2V0Rm4oKTtcbiAgICB0aGlzLnJlbW92ZUZuKHRoaXMubm9kZSk7XG4gICAgdGhpcy5tdXRhdGlvbj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuY2xlYXJFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuY2xhc3NBZGRlZC5jbGVhcigpO1xuICAgIHRoaXMuY2xhc3NSZW1vdmVkLmNsZWFyKCk7XG4gICAgdGhpcy5tdXRhdGlvbiA9IG51bGw7XG4gICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgfVxuXG4gIHJlbmRlcihmbjogKCkgPT4gUmVhY3RFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRhbChmbigpLCB0aGlzLm5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZpcmUoZXZlbnQ6IE1vdXNlRXZlbnRUeXBlcykge1xuICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgIHRoaXMubm9kZS5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgTW91c2VFdmVudChldmVudCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2aWV3OiB3aW5kb3csXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzaG93KCkge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLm5vZGU/LnN0eWxlLmRpc3BsYXk7XG4gICAgaWYgKHRoaXMubm9kZSAmJiBkaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5ub2RlRGlzcGxheSB8fCAnYmxvY2snO1xuICAgIH1cbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgY29uc3QgZGlzcGxheSA9IHRoaXMubm9kZT8uc3R5bGUuZGlzcGxheTtcbiAgICBpZiAodGhpcy5ub2RlICYmIGRpc3BsYXkgIT09ICdub25lJykge1xuICAgICAgdGhpcy5ub2RlRGlzcGxheSA9IGRpc3BsYXkgfHwgJ2Jsb2NrJztcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnQoZXZlbnQ6IGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAsIGZuOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0KSB7XG4gICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgY29uc3QgcHJldmlvdXNGbiA9IHRoaXMuZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50KTtcbiAgICAgIGlmIChwcmV2aW91c0ZuKSB7XG4gICAgICAgIHRoaXMubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBwcmV2aW91c0ZuKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbik7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50LCBmbik7XG4gIH1cblxuICByZWdpc3Rlck9uUmVzZXQoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnJlc2V0Rm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChlbDogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5jaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkFkZChmbjogKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLmFkZEZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uUmVtb3ZlKGZuOiAoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRoaXMucmVtb3ZlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25jbGFzc0NoYW5nZShmbjogKGNsYXNzZXM/OiBET01Ub2tlbkxpc3QpID0+IHZvaWQpIHtcbiAgICB0aGlzLmNsYXNzQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25BZGRDaGlsZChmbjogKGNsYXNzZXM/OiBET01Ub2tlbkxpc3QpID0+IHZvaWQpIHtcbiAgICB0aGlzLmFkZENoaWxkRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25SZW1vdmVDaGlsZChmbjogKGNsYXNzZXM/OiBET01Ub2tlbkxpc3QpID0+IHZvaWQpIHtcbiAgICB0aGlzLnJlbW92ZUNoaWxkRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DbGFzc0FkZGVkKGNsYXNzTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuY2xhc3NBZGRlZC5zZXQoY2xhc3NOYW1lLCBmbik7XG4gIH1cblxuICByZWdpc3Rlck9uQ2xhc3NSZW1vdmVkKGNsYXNzTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuY2xhc3NSZW1vdmVkLnNldChjbGFzc05hbWUsIGZuKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9ic2VydmVyIH0gZnJvbSAnLi9lbGVtZW50T2JzZXJ2ZXInO1xuaW1wb3J0IHsgTm9kZVNlbGVjdG9yIH0gZnJvbSAnLi9ub2RlU2VsZWN0b3InO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGBNdXRhdGlvbk9ic2VydmVyYCBmb3IgdGhlIGBkb2N1bWVudC5ib2R5YC4gSXQgbW9uaXRvcnMgbm9kZXMgdGhhdCBhcmVcbiAqIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCBub3RpZmllcyB0aGUgb2JzZXJ2ZXJzIGZvciBlYWNoIG9ic2VydmFibGUgZWxlbWVudFxuICogd2hlbiB0aGV5IGFyZSByZWFkeSB0byBiZSB3YXRjaGVkLlxuICpcbiAqIEhvdyB0aGF0IHdvcmtzOlxuICpcbiAqIFdoZW4gdGhlIGBvYnNlcnZlYCBmdW5jdGlvbiBpcyBjYWxsZWQsIGl0IGF0dGFjaGVzIGEgYE11dGF0aW9uT2JzZXJ2ZXJgIHRvIHRoZSBgZG9jdW1lbnQuYm9keWAgZWxlbWVudC5cbiAqIEFsbCBjaGFuZ2VzIHRvIGBkb2N1bWVudC5ib2R5YCBhcmUgdHJhY2tlZCBieSB0aGlzIG9ic2VydmVyLiBXaGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLCB0aGUgYE11dGF0aW9uT2JzZXJ2ZXJgXG4gKiBpdGVyYXRlcyB0aHJvdWdoIGFsbCBhZGRlZCBhbmQgcmVtb3ZlZCBub2RlcyBhbmQgY2hlY2tzIGlmIGVhY2ggbm9kZSBleGlzdHMgaW4gdGhlIG1haW4gbWFwIG9mIG9ic2VydmFibGUgZWxlbWVudHMuXG4gKlxuICogSWYgYSBtYXRjaCBpcyBmb3VuZCwgaXQgbm90aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgYEVsZW1lbnRPYnNlcnZlcmAgaW5zdGFuY2UgdG8gc3RhcnQgbW9uaXRvcmluZyBjaGFuZ2VzIGZvciB0aGF0IGVsZW1lbnQuXG4gKlxuICogVGhlIHByaW1hcnkgYE11dGF0aW9uT2JzZXJ2ZXJgIHJlbWFpbnMgYWN0aXZlIHVudGlsIHRoZSBgZGVzdHJveWAgZnVuY3Rpb24gaXMgY2FsbGVkLiBDYWxsaW5nIGBkZXN0cm95YCB3aWxsIGRpc2Nvbm5lY3QgYWxsXG4gKiBpbmRpdmlkdWFsIGVsZW1lbnQgb2JzZXJ2ZXJzIGFuZCByZWxlYXNlIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcy5cbiAqXG4gKiBUaGVyZSBpcyBubyBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCB0aGUgYG9ic2VydmVgIGZ1bmN0aW9uLiBJdCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiBhIGB1c2VFbGVtZW50T2JzZXJ2ZXJgIGhvb2sgaXMgaW5zdGFudGlhdGVkLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIERPTU9ic2VydmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZG9jdW1lbnRPYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGxpc3RlbmVyczogTWFwPHN0cmluZywgRWxlbWVudE9ic2VydmVyPiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHN0YXRpYyBub3RpZnlBZGl0aW9uKHJlY29yZHM6IE11dGF0aW9uUmVjb3JkW10sIG5vZGVNYXBwaW5nOiBNYXA8Tm9kZSwgRWxlbWVudE9ic2VydmVyPikge1xuICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PlxuICAgICAgcmVjb3JkLmFkZGVkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBub2RlTWFwcGluZy5nZXQobm9kZSk/LndhdGNoKG5vZGUpO1xuICAgICAgICBub2RlTWFwcGluZy5kZWxldGUobm9kZSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm90aWZ5UmVtb3ZhbChyZWNvcmRzOiBNdXRhdGlvblJlY29yZFtdLCBub2RlTWFwcGluZzogTWFwPE5vZGUsIEVsZW1lbnRPYnNlcnZlcj4pIHtcbiAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT5cbiAgICAgIHJlY29yZC5yZW1vdmVkTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBub2RlTWFwcGluZy5nZXQobm9kZSk/LmRlc3Ryb3koKTtcbiAgICAgICAgbm9kZU1hcHBpbmcuZGVsZXRlKG5vZGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vdGlmeUNoaWxkcmVuQ2hhbmdlcyhub2RlTWFwcGluZzogTWFwPE5vZGUsIEVsZW1lbnRPYnNlcnZlcj4pIHtcbiAgICBBcnJheS5mcm9tKG5vZGVNYXBwaW5nLnZhbHVlcygpKS5mb3JFYWNoKChvYnNlcnZlcikgPT4gb2JzZXJ2ZXIuc3luY2hyb25pemUoKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXBOb2RlSW5zdGFuY2VzVG9MaXN0ZW5lcnMoKTogTWFwPE5vZGUsIEVsZW1lbnRPYnNlcnZlcj4ge1xuICAgIGNvbnN0IG5vZGVNYXBwaW5nID0gbmV3IE1hcDxOb2RlLCBFbGVtZW50T2JzZXJ2ZXI+KCk7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBvYnNlcnZlci5nZXROb2RlKCkgfHwgb2JzZXJ2ZXIuZ2V0U2VsZWN0b3IoKT8ucGFyc2UoKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIG5vZGVNYXBwaW5nLnNldChub2RlLCBvYnNlcnZlcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGVNYXBwaW5nO1xuICB9XG5cbiAgc3RhdGljIGFkZChzZWxlY3RvcjogTm9kZVNlbGVjdG9yKTogRWxlbWVudE9ic2VydmVyIHtcbiAgICBjb25zdCBub2RlID0gc2VsZWN0b3IuZ2V0UGF0dGVybigpO1xuICAgIGxldCBlbGVtZW50T2JzZXJ2ZXIgPSB0aGlzLmxpc3RlbmVycy5nZXQobm9kZSk7XG4gICAgaWYgKGVsZW1lbnRPYnNlcnZlcikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRPYnNlcnZlcjtcbiAgICB9XG5cbiAgICBlbGVtZW50T2JzZXJ2ZXIgPSBuZXcgRWxlbWVudE9ic2VydmVyKHNlbGVjdG9yKTtcbiAgICB0aGlzLmxpc3RlbmVycy5zZXQobm9kZSwgZWxlbWVudE9ic2VydmVyKTtcbiAgICByZXR1cm4gZWxlbWVudE9ic2VydmVyO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZShzZWxlY3RvcjogTm9kZVNlbGVjdG9yKSB7XG4gICAgY29uc3Qgbm9kZSA9IHNlbGVjdG9yLmdldFBhdHRlcm4oKTtcbiAgICB0aGlzLmxpc3RlbmVycy5nZXQobm9kZSk/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUobm9kZSk7XG4gIH1cblxuICBzdGF0aWMgb2JzZXJ2ZSgpIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRPYnNlcnZlcikge1xuICAgICAgdGhpcy5kb2N1bWVudE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBub2RlTWFwcGluZyA9IHRoaXMubWFwTm9kZUluc3RhbmNlc1RvTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMubm90aWZ5QWRpdGlvbihtdXRhdGlvbnMsIG5vZGVNYXBwaW5nKTtcbiAgICAgICAgdGhpcy5ub3RpZnlSZW1vdmFsKG11dGF0aW9ucywgbm9kZU1hcHBpbmcpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoaWxkcmVuQ2hhbmdlcyhub2RlTWFwcGluZyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG9jdW1lbnRPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZG9jdW1lbnRPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lci5kZXN0cm95KCkpO1xuICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5kb2N1bWVudE9ic2VydmVyID0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZVR5cGUsIFByb2R1Y3RNZXNzYWdlTWV0YWRhdGEgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGdldFJlY2VudFByb2R1Y3RJbWFnZVVybHMgPSAobGFzdE1lc3NhZ2VzOiBNZXNzYWdlW10sIGN1cnJlbnRQcm9kdWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBwcm9kdWN0TWVzc2FnZXMgPSBsYXN0TWVzc2FnZXNcbiAgICAuZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlByb2R1Y3QgJiYgbWVzc2FnZS5tZXRhZGF0YT8uaW1hZ2VVcmwpXG4gICAgLm1hcCgobSkgPT4gbSBhcyBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhKTtcbiAgLy8gcHV0IGFkZGVkIHByb2R1Y3QgaW1hZ2UgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICByZXR1cm4gW1xuICAgIC4uLnByb2R1Y3RNZXNzYWdlcy5maWx0ZXIoKG0pID0+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+IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodmFsdWUpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBZUEsTUFBTSxxQ0FBcUMsQ0FBQyxhQUFhLGNBQWM7QUFDdkUsTUFBTSwrQkFBK0I7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
|