tango-app-ui-shared 3.7.3-dev6-demo6 → 3.7.3-dev6-demo7
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/.eslintrc.json +37 -0
- package/ng-package.json +7 -0
- package/package.json +12 -25
- package/src/lib/guards/auth.guard.ts +20 -0
- package/src/lib/guards/lead.guard.ts +16 -0
- package/src/lib/guards/stores.guard.ts +16 -0
- package/src/lib/guards/tickets.guard.ts +16 -0
- package/{lib/i18n/index.d.ts → src/lib/i18n/index.ts} +2 -2
- package/src/lib/i18n/translation.module.ts +9 -0
- package/src/lib/i18n/translation.service.ts +61 -0
- package/src/lib/i18n/vocabs/ch.ts +105 -0
- package/src/lib/i18n/vocabs/de.ts +105 -0
- package/src/lib/i18n/vocabs/en.ts +105 -0
- package/src/lib/i18n/vocabs/es.ts +105 -0
- package/src/lib/i18n/vocabs/fr.ts +105 -0
- package/src/lib/i18n/vocabs/jp.ts +105 -0
- package/src/lib/interceptors/http-auth-interceptor.ts +225 -0
- package/src/lib/interfaces/global-state.ts +6 -0
- package/src/lib/modules/common/common-shared.module.ts +20 -0
- package/src/lib/modules/common/custom-select/custom-select.component.html +42 -0
- package/src/lib/modules/common/custom-select/custom-select.component.scss +131 -0
- package/src/lib/modules/common/custom-select/custom-select.component.spec.ts +23 -0
- package/src/lib/modules/common/custom-select/custom-select.component.ts +149 -0
- package/src/lib/modules/common/filters/filters.component.html +76 -0
- package/src/lib/modules/common/filters/filters.component.scss +131 -0
- package/src/lib/modules/common/filters/filters.component.spec.ts +23 -0
- package/src/lib/modules/common/filters/filters.component.ts +181 -0
- package/src/lib/modules/common/pagination/pagination.component.html +26 -0
- package/src/lib/modules/common/pagination/pagination.component.scss +63 -0
- package/src/lib/modules/common/pagination/pagination.component.spec.ts +23 -0
- package/src/lib/modules/common/pagination/pagination.component.ts +46 -0
- package/src/lib/modules/errors/error403/error403.component.html +25 -0
- package/src/lib/modules/errors/error403/error403.component.scss +0 -0
- package/src/lib/modules/errors/error403/error403.component.spec.ts +23 -0
- package/src/lib/modules/errors/error403/error403.component.ts +28 -0
- package/src/lib/modules/errors/error404/error404.component.html +24 -0
- package/src/lib/modules/errors/error404/error404.component.scss +0 -0
- package/src/lib/modules/errors/error404/error404.component.spec.ts +25 -0
- package/src/lib/modules/errors/error404/error404.component.ts +50 -0
- package/src/lib/modules/errors/error500/error500.component.html +24 -0
- package/src/lib/modules/errors/error500/error500.component.scss +0 -0
- package/src/lib/modules/errors/error500/error500.component.spec.ts +25 -0
- package/src/lib/modules/errors/error500/error500.component.ts +50 -0
- package/src/lib/modules/errors/errors-routing.module.ts +40 -0
- package/src/lib/modules/errors/errors.component.html +15 -0
- package/src/lib/modules/errors/errors.component.scss +4 -0
- package/src/lib/modules/errors/errors.component.spec.ts +25 -0
- package/src/lib/modules/errors/errors.component.ts +42 -0
- package/src/lib/modules/errors/errors.module.ts +25 -0
- package/src/lib/modules/errors/invalid-ip/invalid-ip.component.html +16 -0
- package/src/lib/modules/errors/invalid-ip/invalid-ip.component.scss +0 -0
- package/src/lib/modules/errors/invalid-ip/invalid-ip.component.spec.ts +23 -0
- package/src/lib/modules/errors/invalid-ip/invalid-ip.component.ts +43 -0
- package/src/lib/modules/intro/contact-support/contact-support.component.html +30 -0
- package/src/lib/modules/intro/contact-support/contact-support.component.scss +60 -0
- package/src/lib/modules/intro/contact-support/contact-support.component.spec.ts +23 -0
- package/src/lib/modules/intro/contact-support/contact-support.component.ts +17 -0
- package/src/lib/modules/intro/intro-routing.module.ts +16 -0
- package/src/lib/modules/intro/intro.module.ts +21 -0
- package/src/lib/modules/intro/lead-intro/lead-intro.component.html +325 -0
- package/src/lib/modules/intro/lead-intro/lead-intro.component.scss +185 -0
- package/src/lib/modules/intro/lead-intro/lead-intro.component.spec.ts +23 -0
- package/src/lib/modules/intro/lead-intro/lead-intro.component.ts +120 -0
- package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.html +44 -0
- package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.scss +28 -0
- package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.spec.ts +23 -0
- package/src/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.ts +24 -0
- package/src/lib/modules/layout/content/content.component.html +12 -0
- package/src/lib/modules/layout/content/content.component.scss +0 -0
- package/src/lib/modules/layout/content/content.component.ts +102 -0
- package/src/lib/modules/layout/footer/footer.component.html +29 -0
- package/src/lib/modules/layout/footer/footer.component.scss +7 -0
- package/src/lib/modules/layout/footer/footer.component.spec.ts +25 -0
- package/src/lib/modules/layout/footer/footer.component.ts +13 -0
- package/src/lib/modules/layout/header/header-menu/header-menu.component.html +27 -0
- package/src/lib/modules/layout/header/header-menu/header-menu.component.scss +4 -0
- package/src/lib/modules/layout/header/header-menu/header-menu.component.spec.ts +25 -0
- package/src/lib/modules/layout/header/header-menu/header-menu.component.ts +38 -0
- package/src/lib/modules/layout/header/header.component.html +90 -0
- package/src/lib/modules/layout/header/header.component.scss +7 -0
- package/src/lib/modules/layout/header/header.component.spec.ts +25 -0
- package/src/lib/modules/layout/header/header.component.ts +139 -0
- package/src/lib/modules/layout/header/navbar/navbar.component.html +156 -0
- package/src/lib/modules/layout/header/navbar/navbar.component.scss +223 -0
- package/src/lib/modules/layout/header/navbar/navbar.component.spec.ts +23 -0
- package/src/lib/modules/layout/header/navbar/navbar.component.ts +255 -0
- package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.html +200 -0
- package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.scss +139 -0
- package/src/lib/modules/layout/header/notifications-inner/notifications-inner.component.ts +76 -0
- package/src/lib/modules/layout/header/page-title/page-title.component.html +32 -0
- package/src/lib/modules/layout/header/page-title/page-title.component.scss +11 -0
- package/src/lib/modules/layout/header/page-title/page-title.component.ts +47 -0
- package/src/lib/modules/layout/keenicon/icons.json +1 -0
- package/src/lib/modules/layout/keenicon/keenicon.component.html +4 -0
- package/src/lib/modules/layout/keenicon/keenicon.component.scss +0 -0
- package/src/lib/modules/layout/keenicon/keenicon.component.spec.ts +23 -0
- package/src/lib/modules/layout/keenicon/keenicon.component.ts +30 -0
- package/src/lib/modules/layout/layout/layout.component.html +71 -0
- package/src/lib/modules/layout/layout/layout.component.scss +23 -0
- package/src/lib/modules/layout/layout/layout.component.ts +425 -0
- package/src/lib/modules/layout/layout.module.ts +129 -0
- package/src/lib/modules/layout/scripts-init/scripts-init.component.html +0 -0
- package/src/lib/modules/layout/scripts-init/scripts-init.component.ts +81 -0
- package/src/lib/modules/layout/scroll-top/scroll-top.component.html +1 -0
- package/src/lib/modules/layout/scroll-top/scroll-top.component.ts +75 -0
- package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.html +70 -0
- package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.scss +57 -0
- package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.spec.ts +23 -0
- package/src/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.ts +136 -0
- package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.html +26 -0
- package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.scss +0 -0
- package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.spec.ts +23 -0
- package/src/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.ts +36 -0
- package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.html +761 -0
- package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.scss +38 -0
- package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.spec.ts +23 -0
- package/src/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.ts +130 -0
- package/src/lib/modules/layout/sidebar/sidebar.component.html +16 -0
- package/src/lib/modules/layout/sidebar/sidebar.component.scss +3 -0
- package/src/lib/modules/layout/sidebar/sidebar.component.spec.ts +23 -0
- package/src/lib/modules/layout/sidebar/sidebar.component.ts +203 -0
- package/src/lib/modules/layout/toolbar/accounting/accounting.component.html +84 -0
- package/src/lib/modules/layout/toolbar/accounting/accounting.component.scss +0 -0
- package/src/lib/modules/layout/toolbar/accounting/accounting.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/accounting/accounting.component.ts +14 -0
- package/src/lib/modules/layout/toolbar/classic/classic.component.html +69 -0
- package/src/lib/modules/layout/toolbar/classic/classic.component.scss +238 -0
- package/src/lib/modules/layout/toolbar/classic/classic.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/classic/classic.component.ts +389 -0
- package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.html +4 -0
- package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.scss +3 -0
- package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/client-settings/client-settings.component.ts +91 -0
- package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.html +22 -0
- package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.scss +156 -0
- package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/date-single-select/date-single-select.component.ts +238 -0
- package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.html +14 -0
- package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.scss +149 -0
- package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/datepicker/datepicker.component.ts +183 -0
- package/src/lib/modules/layout/toolbar/extended/extended.component.html +100 -0
- package/src/lib/modules/layout/toolbar/extended/extended.component.scss +0 -0
- package/src/lib/modules/layout/toolbar/extended/extended.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/extended/extended.component.ts +12 -0
- package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.html +311 -0
- package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.scss +311 -0
- package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/metrics-header/metrics-header.component.ts +1555 -0
- package/src/lib/modules/layout/toolbar/reports/reports.component.html +62 -0
- package/src/lib/modules/layout/toolbar/reports/reports.component.scss +0 -0
- package/src/lib/modules/layout/toolbar/reports/reports.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/reports/reports.component.ts +14 -0
- package/src/lib/modules/layout/toolbar/saas/saas.component.html +77 -0
- package/src/lib/modules/layout/toolbar/saas/saas.component.scss +0 -0
- package/src/lib/modules/layout/toolbar/saas/saas.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/saas/saas.component.ts +14 -0
- package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.html +26 -0
- package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.scss +176 -0
- package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.ts +235 -0
- package/src/lib/modules/layout/toolbar/single-store/single-store.component.html +39 -0
- package/src/lib/modules/layout/toolbar/single-store/single-store.component.scss +176 -0
- package/src/lib/modules/layout/toolbar/single-store/single-store.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/single-store/single-store.component.ts +188 -0
- package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.html +17 -0
- package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.scss +172 -0
- package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/single-storedate/single-storedate.component.ts +179 -0
- package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.html +4 -0
- package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.scss +19 -0
- package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/storesingle/storesingle.component.ts +105 -0
- package/src/lib/modules/layout/toolbar/toolbar.component.html +64 -0
- package/src/lib/modules/layout/toolbar/toolbar.component.scss +0 -0
- package/src/lib/modules/layout/toolbar/toolbar.component.spec.ts +25 -0
- package/src/lib/modules/layout/toolbar/toolbar.component.ts +400 -0
- package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.html +259 -0
- package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.scss +305 -0
- package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.ts +1202 -0
- package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.html +199 -0
- package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.scss +311 -0
- package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.ts +899 -0
- package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.html +204 -0
- package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.scss +311 -0
- package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/trax-header/trax-header.component.ts +1045 -0
- package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.html +190 -0
- package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.scss +311 -0
- package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.ts +825 -0
- package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.html +259 -0
- package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.scss +305 -0
- package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.spec.ts +23 -0
- package/src/lib/modules/layout/toolbar/zone-header/zone-header.component.ts +1242 -0
- package/src/lib/modules/notification/conformation/conformation.component.html +25 -0
- package/src/lib/modules/notification/conformation/conformation.component.scss +0 -0
- package/src/lib/modules/notification/conformation/conformation.component.spec.ts +23 -0
- package/src/lib/modules/notification/conformation/conformation.component.ts +23 -0
- package/src/lib/modules/notification/notification/notification.component.html +209 -0
- package/src/lib/modules/notification/notification/notification.component.scss +211 -0
- package/src/lib/modules/notification/notification/notification.component.spec.ts +23 -0
- package/src/lib/modules/notification/notification/notification.component.ts +310 -0
- package/src/lib/modules/notification/notification-routing.module.ts +20 -0
- package/src/lib/modules/notification/notification.module.ts +21 -0
- package/src/lib/pipes/customDate.pipe.ts +18 -0
- package/src/lib/routes/route-wraper-modules/analyse-wrapper.module.ts +12 -0
- package/src/lib/routes/route-wraper-modules/edge-wrapper.module.ts +11 -0
- package/src/lib/routes/route-wraper-modules/manage-wrapper.module.ts +11 -0
- package/src/lib/routes/route-wraper-modules/profile-wrapper.module.ts +12 -0
- package/src/lib/routes/route-wraper-modules/store-wrapper.module.ts +11 -0
- package/src/lib/routes/route-wraper-modules/ticket-wrapper.module.ts +10 -0
- package/src/lib/routes/routing.ts +56 -0
- package/src/lib/services/auth.service.ts +178 -0
- package/src/lib/services/notification.service.spec.ts +16 -0
- package/src/lib/services/notification.service.ts +73 -0
- package/src/lib/services/toast.service.ts +82 -0
- package/{public-api.d.ts → src/public-api.ts} +71 -44
- package/tsconfig.lib.json +14 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/esm2022/lib/guards/auth.guard.mjs +0 -26
- package/esm2022/lib/guards/lead.guard.mjs +0 -16
- package/esm2022/lib/guards/stores.guard.mjs +0 -16
- package/esm2022/lib/guards/tickets.guard.mjs +0 -16
- package/esm2022/lib/i18n/index.mjs +0 -3
- package/esm2022/lib/i18n/translation.module.mjs +0 -17
- package/esm2022/lib/i18n/translation.service.mjs +0 -53
- package/esm2022/lib/i18n/vocabs/ch.mjs +0 -106
- package/esm2022/lib/i18n/vocabs/de.mjs +0 -106
- package/esm2022/lib/i18n/vocabs/en.mjs +0 -106
- package/esm2022/lib/i18n/vocabs/es.mjs +0 -106
- package/esm2022/lib/i18n/vocabs/fr.mjs +0 -106
- package/esm2022/lib/i18n/vocabs/jp.mjs +0 -106
- package/esm2022/lib/interceptors/http-auth-interceptor.mjs +0 -124
- package/esm2022/lib/interfaces/global-state.mjs +0 -2
- package/esm2022/lib/modules/common/common-shared.module.mjs +0 -31
- package/esm2022/lib/modules/common/custom-select/custom-select.component.mjs +0 -155
- package/esm2022/lib/modules/common/filters/filters.component.mjs +0 -179
- package/esm2022/lib/modules/common/pagination/pagination.component.mjs +0 -49
- package/esm2022/lib/modules/errors/error403/error403.component.mjs +0 -33
- package/esm2022/lib/modules/errors/error404/error404.component.mjs +0 -44
- package/esm2022/lib/modules/errors/error500/error500.component.mjs +0 -45
- package/esm2022/lib/modules/errors/errors-routing.module.mjs +0 -48
- package/esm2022/lib/modules/errors/errors.component.mjs +0 -39
- package/esm2022/lib/modules/errors/errors.module.mjs +0 -37
- package/esm2022/lib/modules/errors/invalid-ip/invalid-ip.component.mjs +0 -44
- package/esm2022/lib/modules/intro/contact-support/contact-support.component.mjs +0 -19
- package/esm2022/lib/modules/intro/intro-routing.module.mjs +0 -24
- package/esm2022/lib/modules/intro/intro.module.mjs +0 -32
- package/esm2022/lib/modules/intro/lead-intro/lead-intro.component.mjs +0 -110
- package/esm2022/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.mjs +0 -31
- package/esm2022/lib/modules/layout/content/content.component.mjs +0 -107
- package/esm2022/lib/modules/layout/footer/footer.component.mjs +0 -17
- package/esm2022/lib/modules/layout/header/header-menu/header-menu.component.mjs +0 -41
- package/esm2022/lib/modules/layout/header/header.component.mjs +0 -100
- package/esm2022/lib/modules/layout/header/navbar/navbar.component.mjs +0 -256
- package/esm2022/lib/modules/layout/header/notifications-inner/notifications-inner.component.mjs +0 -79
- package/esm2022/lib/modules/layout/header/page-title/page-title.component.mjs +0 -56
- package/esm2022/lib/modules/layout/keenicon/icons.json +0 -1
- package/esm2022/lib/modules/layout/keenicon/keenicon.component.mjs +0 -37
- package/esm2022/lib/modules/layout/layout/layout.component.mjs +0 -314
- package/esm2022/lib/modules/layout/layout.module.mjs +0 -198
- package/esm2022/lib/modules/layout/scripts-init/scripts-init.component.mjs +0 -74
- package/esm2022/lib/modules/layout/scroll-top/scroll-top.component.mjs +0 -74
- package/esm2022/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -159
- package/esm2022/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.mjs +0 -45
- package/esm2022/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.mjs +0 -122
- package/esm2022/lib/modules/layout/sidebar/sidebar.component.mjs +0 -134
- package/esm2022/lib/modules/layout/toolbar/accounting/accounting.component.mjs +0 -16
- package/esm2022/lib/modules/layout/toolbar/classic/classic.component.mjs +0 -331
- package/esm2022/lib/modules/layout/toolbar/client-settings/client-settings.component.mjs +0 -88
- package/esm2022/lib/modules/layout/toolbar/date-single-select/date-single-select.component.mjs +0 -207
- package/esm2022/lib/modules/layout/toolbar/datepicker/datepicker.component.mjs +0 -158
- package/esm2022/lib/modules/layout/toolbar/extended/extended.component.mjs +0 -15
- package/esm2022/lib/modules/layout/toolbar/metrics-header/metrics-header.component.mjs +0 -1321
- package/esm2022/lib/modules/layout/toolbar/reports/reports.component.mjs +0 -18
- package/esm2022/lib/modules/layout/toolbar/saas/saas.component.mjs +0 -18
- package/esm2022/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.mjs +0 -216
- package/esm2022/lib/modules/layout/toolbar/single-store/single-store.component.mjs +0 -178
- package/esm2022/lib/modules/layout/toolbar/single-storedate/single-storedate.component.mjs +0 -166
- package/esm2022/lib/modules/layout/toolbar/storesingle/storesingle.component.mjs +0 -105
- package/esm2022/lib/modules/layout/toolbar/toolbar.component.mjs +0 -372
- package/esm2022/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.mjs +0 -1062
- package/esm2022/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.mjs +0 -795
- package/esm2022/lib/modules/layout/toolbar/trax-header/trax-header.component.mjs +0 -880
- package/esm2022/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.mjs +0 -729
- package/esm2022/lib/modules/layout/toolbar/zone-header/zone-header.component.mjs +0 -1088
- package/esm2022/lib/modules/notification/conformation/conformation.component.mjs +0 -22
- package/esm2022/lib/modules/notification/notification/notification.component.mjs +0 -317
- package/esm2022/lib/modules/notification/notification-routing.module.mjs +0 -28
- package/esm2022/lib/modules/notification/notification.module.mjs +0 -32
- package/esm2022/lib/pipes/customDate.pipe.mjs +0 -22
- package/esm2022/lib/routes/route-wraper-modules/edge-wrapper.module.mjs +0 -18
- package/esm2022/lib/routes/route-wraper-modules/manage-wrapper.module.mjs +0 -18
- package/esm2022/lib/routes/route-wraper-modules/profile-wrapper.module.mjs +0 -18
- package/esm2022/lib/routes/route-wraper-modules/store-wrapper.module.mjs +0 -18
- package/esm2022/lib/routes/route-wraper-modules/ticket-wrapper.module.mjs +0 -18
- package/esm2022/lib/routes/routing.mjs +0 -53
- package/esm2022/lib/services/auth.service.mjs +0 -141
- package/esm2022/lib/services/notification.service.mjs +0 -74
- package/esm2022/lib/services/toast.service.mjs +0 -83
- package/esm2022/public-api.mjs +0 -56
- package/esm2022/tango-app-ui-shared.mjs +0 -5
- package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs +0 -21
- package/fesm2022/tango-app-ui-shared-edge-wrapper.module-CFDk0tvS.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs +0 -188
- package/fesm2022/tango-app-ui-shared-intro.module-DYh4ZRha.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs +0 -21
- package/fesm2022/tango-app-ui-shared-manage-wrapper.module-BHyh4Njw.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs +0 -400
- package/fesm2022/tango-app-ui-shared-notification.module-C5ZmCf8U.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs +0 -21
- package/fesm2022/tango-app-ui-shared-profile-wrapper.module-BNC1AGOk.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs +0 -21
- package/fesm2022/tango-app-ui-shared-store-wrapper.module-DdaCYHdv.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs +0 -21
- package/fesm2022/tango-app-ui-shared-ticket-wrapper.module-r32uKkDO.mjs.map +0 -1
- package/fesm2022/tango-app-ui-shared.mjs +0 -12438
- package/fesm2022/tango-app-ui-shared.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/guards/auth.guard.d.ts +0 -10
- package/lib/guards/lead.guard.d.ts +0 -2
- package/lib/guards/stores.guard.d.ts +0 -2
- package/lib/guards/tickets.guard.d.ts +0 -2
- package/lib/i18n/translation.module.d.ts +0 -8
- package/lib/i18n/translation.service.d.ts +0 -19
- package/lib/i18n/vocabs/ch.d.ts +0 -104
- package/lib/i18n/vocabs/de.d.ts +0 -104
- package/lib/i18n/vocabs/en.d.ts +0 -104
- package/lib/i18n/vocabs/es.d.ts +0 -104
- package/lib/i18n/vocabs/fr.d.ts +0 -104
- package/lib/i18n/vocabs/jp.d.ts +0 -104
- package/lib/interceptors/http-auth-interceptor.d.ts +0 -19
- package/lib/interfaces/global-state.d.ts +0 -5
- package/lib/modules/common/common-shared.module.d.ts +0 -13
- package/lib/modules/common/custom-select/custom-select.component.d.ts +0 -33
- package/lib/modules/common/filters/filters.component.d.ts +0 -38
- package/lib/modules/common/pagination/pagination.component.d.ts +0 -18
- package/lib/modules/errors/error403/error403.component.d.ts +0 -14
- package/lib/modules/errors/error404/error404.component.d.ts +0 -15
- package/lib/modules/errors/error500/error500.component.d.ts +0 -15
- package/lib/modules/errors/errors-routing.module.d.ts +0 -7
- package/lib/modules/errors/errors.component.d.ts +0 -13
- package/lib/modules/errors/errors.module.d.ts +0 -13
- package/lib/modules/errors/invalid-ip/invalid-ip.component.d.ts +0 -17
- package/lib/modules/intro/contact-support/contact-support.component.d.ts +0 -9
- package/lib/modules/intro/intro-routing.module.d.ts +0 -7
- package/lib/modules/intro/intro.module.d.ts +0 -11
- package/lib/modules/intro/lead-intro/lead-intro.component.d.ts +0 -31
- package/lib/modules/layout/components/csm-assign-confirmation/csm-assign-confirmation.component.d.ts +0 -13
- package/lib/modules/layout/content/content.component.d.ts +0 -25
- package/lib/modules/layout/footer/footer.component.d.ts +0 -8
- package/lib/modules/layout/header/header-menu/header-menu.component.d.ts +0 -18
- package/lib/modules/layout/header/header.component.d.ts +0 -30
- package/lib/modules/layout/header/navbar/navbar.component.d.ts +0 -45
- package/lib/modules/layout/header/notifications-inner/notifications-inner.component.d.ts +0 -25
- package/lib/modules/layout/header/page-title/page-title.component.d.ts +0 -23
- package/lib/modules/layout/keenicon/keenicon.component.d.ts +0 -13
- package/lib/modules/layout/layout/layout.component.d.ts +0 -82
- package/lib/modules/layout/layout.module.d.ts +0 -50
- package/lib/modules/layout/scripts-init/scripts-init.component.d.ts +0 -19
- package/lib/modules/layout/scroll-top/scroll-top.component.d.ts +0 -19
- package/lib/modules/layout/sidebar/sidebar-footer/sidebar-footer.component.d.ts +0 -45
- package/lib/modules/layout/sidebar/sidebar-logo/sidebar-logo.component.d.ts +0 -19
- package/lib/modules/layout/sidebar/sidebar-menu/sidebar-menu.component.d.ts +0 -26
- package/lib/modules/layout/sidebar/sidebar.component.d.ts +0 -36
- package/lib/modules/layout/toolbar/accounting/accounting.component.d.ts +0 -8
- package/lib/modules/layout/toolbar/classic/classic.component.d.ts +0 -48
- package/lib/modules/layout/toolbar/client-settings/client-settings.component.d.ts +0 -16
- package/lib/modules/layout/toolbar/date-single-select/date-single-select.component.d.ts +0 -28
- package/lib/modules/layout/toolbar/datepicker/datepicker.component.d.ts +0 -28
- package/lib/modules/layout/toolbar/extended/extended.component.d.ts +0 -8
- package/lib/modules/layout/toolbar/metrics-header/metrics-header.component.d.ts +0 -103
- package/lib/modules/layout/toolbar/reports/reports.component.d.ts +0 -9
- package/lib/modules/layout/toolbar/saas/saas.component.d.ts +0 -9
- package/lib/modules/layout/toolbar/single-clientstore-date/single-clientstore-date.component.d.ts +0 -32
- package/lib/modules/layout/toolbar/single-store/single-store.component.d.ts +0 -33
- package/lib/modules/layout/toolbar/single-storedate/single-storedate.component.d.ts +0 -34
- package/lib/modules/layout/toolbar/storesingle/storesingle.component.d.ts +0 -24
- package/lib/modules/layout/toolbar/toolbar.component.d.ts +0 -57
- package/lib/modules/layout/toolbar/traffic-header/traffic-header/traffic-header.component.d.ts +0 -93
- package/lib/modules/layout/toolbar/traffic-nob/traffic-nob.component.d.ts +0 -80
- package/lib/modules/layout/toolbar/trax-header/trax-header.component.d.ts +0 -83
- package/lib/modules/layout/toolbar/trax-withoutdate/trax-withoutdate.component.d.ts +0 -74
- package/lib/modules/layout/toolbar/zone-header/zone-header.component.d.ts +0 -97
- package/lib/modules/notification/conformation/conformation.component.d.ts +0 -10
- package/lib/modules/notification/notification/notification.component.d.ts +0 -63
- package/lib/modules/notification/notification-routing.module.d.ts +0 -7
- package/lib/modules/notification/notification.module.d.ts +0 -11
- package/lib/pipes/customDate.pipe.d.ts +0 -7
- package/lib/routes/route-wraper-modules/edge-wrapper.module.d.ts +0 -7
- package/lib/routes/route-wraper-modules/manage-wrapper.module.d.ts +0 -7
- package/lib/routes/route-wraper-modules/profile-wrapper.module.d.ts +0 -7
- package/lib/routes/route-wraper-modules/store-wrapper.module.d.ts +0 -7
- package/lib/routes/route-wraper-modules/ticket-wrapper.module.d.ts +0 -7
- package/lib/routes/routing.d.ts +0 -3
- package/lib/services/auth.service.d.ts +0 -49
- package/lib/services/notification.service.d.ts +0 -30
- package/lib/services/toast.service.d.ts +0 -10
|
@@ -1,1062 +0,0 @@
|
|
|
1
|
-
import { Component, HostListener, } from "@angular/core";
|
|
2
|
-
import dayjs from "dayjs";
|
|
3
|
-
import "dayjs/locale/en";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../../../../../services/auth.service";
|
|
6
|
-
import * as i2 from "@angular/router";
|
|
7
|
-
import * as i3 from "tango-app-ui-global";
|
|
8
|
-
import * as i4 from "@angular/common";
|
|
9
|
-
import * as i5 from "../../../../common/custom-select/custom-select.component";
|
|
10
|
-
import * as i6 from "@angular/forms";
|
|
11
|
-
export class TrafficHeaderComponent {
|
|
12
|
-
auth;
|
|
13
|
-
router;
|
|
14
|
-
gs;
|
|
15
|
-
cd;
|
|
16
|
-
dayjs = dayjs;
|
|
17
|
-
isCustomDate = (m) => {
|
|
18
|
-
if (m.isSame(this.dayjs(), "day")) {
|
|
19
|
-
return "invalid-date"; // disable today
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
22
|
-
};
|
|
23
|
-
selectedDateRange = { startDate: dayjs().subtract(30, 'days'),
|
|
24
|
-
endDate: dayjs().subtract(1, "days"), };
|
|
25
|
-
selectedFilters = {
|
|
26
|
-
client: null,
|
|
27
|
-
clientName: null,
|
|
28
|
-
clients: [],
|
|
29
|
-
store: null,
|
|
30
|
-
stores: [],
|
|
31
|
-
date: null,
|
|
32
|
-
group: [],
|
|
33
|
-
location: [],
|
|
34
|
-
country: [],
|
|
35
|
-
};
|
|
36
|
-
Opendropdown = false;
|
|
37
|
-
dropdownOpen = null; // 'location' or 'group'
|
|
38
|
-
searchLocationText = "";
|
|
39
|
-
searchGroupText = "";
|
|
40
|
-
locations = [];
|
|
41
|
-
filteredLocations = [];
|
|
42
|
-
groupsData = [];
|
|
43
|
-
filteredGroups = [];
|
|
44
|
-
filteredStores = [];
|
|
45
|
-
stores = [];
|
|
46
|
-
searchStoreText = '';
|
|
47
|
-
clientList = [];
|
|
48
|
-
selectedClient;
|
|
49
|
-
locationLabel = [];
|
|
50
|
-
groupLabel = [];
|
|
51
|
-
users;
|
|
52
|
-
url;
|
|
53
|
-
filteredCountries = [];
|
|
54
|
-
countryLabel = [];
|
|
55
|
-
searchCountryText = "";
|
|
56
|
-
countries = [];
|
|
57
|
-
constructor(auth, router, gs, cd) {
|
|
58
|
-
this.auth = auth;
|
|
59
|
-
this.router = router;
|
|
60
|
-
this.gs = gs;
|
|
61
|
-
this.cd = cd;
|
|
62
|
-
}
|
|
63
|
-
onClick(event) {
|
|
64
|
-
const target = event.target;
|
|
65
|
-
if (!target.closest('.dropdown2')) {
|
|
66
|
-
this.Opendropdown = false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
closeDropdown1() {
|
|
70
|
-
this.Opendropdown = false;
|
|
71
|
-
}
|
|
72
|
-
ngOnInit() {
|
|
73
|
-
// this.setRangesBasedOnRoute();
|
|
74
|
-
// Listen for route changes to update ranges
|
|
75
|
-
// this.router?.events?.subscribe((event) => {
|
|
76
|
-
// if (event instanceof NavigationEnd) {
|
|
77
|
-
// this.setRangesBasedOnRoute();
|
|
78
|
-
// }
|
|
79
|
-
// });
|
|
80
|
-
this.url = this.router.url.split("?")[0].split('/');
|
|
81
|
-
const user = JSON.parse(localStorage.getItem('user-info'));
|
|
82
|
-
this.users = user;
|
|
83
|
-
this.gs?.manageRefreshTrigger?.subscribe((e) => {
|
|
84
|
-
if (e) {
|
|
85
|
-
if (user.userType === 'tango') {
|
|
86
|
-
this.getClient();
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const storedFilters = localStorage.getItem("header-filters");
|
|
90
|
-
if (storedFilters) {
|
|
91
|
-
const headerFilters = JSON.parse(storedFilters);
|
|
92
|
-
this.filteredStores = headerFilters?.stores.map((store) => ({
|
|
93
|
-
...store,
|
|
94
|
-
checked: store.checked
|
|
95
|
-
}));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
// Fetch client data if the user is of type 'tango'
|
|
101
|
-
if (user.userType === 'tango') {
|
|
102
|
-
this.getClient();
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
this.getCountry();
|
|
106
|
-
this.getLocations();
|
|
107
|
-
this.getGroups();
|
|
108
|
-
this.getStore();
|
|
109
|
-
const clientFilters = localStorage.getItem("client-details");
|
|
110
|
-
if (clientFilters) {
|
|
111
|
-
const headerclientFilters = JSON.parse(clientFilters);
|
|
112
|
-
this.selectedClient = {
|
|
113
|
-
trafficDateRange: headerclientFilters.trafficDateRange
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Load filters from localStorage if they exist
|
|
118
|
-
const storedFilters = localStorage.getItem("header-filters");
|
|
119
|
-
if (storedFilters) {
|
|
120
|
-
const headerFilters = JSON.parse(storedFilters);
|
|
121
|
-
// Initialize selectedFilters with defaults or existing values
|
|
122
|
-
this.selectedFilters = {
|
|
123
|
-
client: headerFilters.client || this.users.client,
|
|
124
|
-
clientName: headerFilters.clientName || '',
|
|
125
|
-
clients: headerFilters.clients || [],
|
|
126
|
-
store: headerFilters.store || null,
|
|
127
|
-
date: headerFilters.date || {},
|
|
128
|
-
stores: headerFilters.stores || [],
|
|
129
|
-
group: headerFilters.group || [],
|
|
130
|
-
location: headerFilters.location || [],
|
|
131
|
-
country: headerFilters.country || []
|
|
132
|
-
};
|
|
133
|
-
// Sync filtered data with stored selections
|
|
134
|
-
this.filteredCountries = this.syncWithLocalStorage(headerFilters.country);
|
|
135
|
-
this.filteredLocations = this.syncWithLocalStorage(headerFilters.location);
|
|
136
|
-
this.filteredGroups = this.syncWithLocalStorage(headerFilters.group);
|
|
137
|
-
this.filteredStores = this.syncWithLocalStorage(headerFilters.stores);
|
|
138
|
-
// Format date range if it exists
|
|
139
|
-
if (headerFilters.date) {
|
|
140
|
-
this.selectedDateRange = {
|
|
141
|
-
startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
142
|
-
endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
this.selectedDateRange = {
|
|
147
|
-
startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
148
|
-
endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
// console.log("3")
|
|
152
|
-
// Emit data via service and update localStorage
|
|
153
|
-
this.emitAndStoreFilters();
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
// Initialize empty states if no header filters are present in localStorage
|
|
157
|
-
this.resetFilters();
|
|
158
|
-
// console.log("2")
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
syncWithLocalStorage(items) {
|
|
162
|
-
return items
|
|
163
|
-
? items.map((item) => ({
|
|
164
|
-
...item,
|
|
165
|
-
checked: item.checked === true
|
|
166
|
-
}))
|
|
167
|
-
: [];
|
|
168
|
-
}
|
|
169
|
-
emitAndStoreFilters() {
|
|
170
|
-
this.gs.dataRangeValue.next(this.selectedFilters);
|
|
171
|
-
localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
|
|
172
|
-
// console.log("1")
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Reset selectedFilters and all related arrays to empty states
|
|
176
|
-
*/
|
|
177
|
-
resetFilters() {
|
|
178
|
-
this.selectedFilters = {
|
|
179
|
-
client: null,
|
|
180
|
-
clientName: '',
|
|
181
|
-
clients: [],
|
|
182
|
-
store: null,
|
|
183
|
-
date: {},
|
|
184
|
-
stores: [],
|
|
185
|
-
group: [],
|
|
186
|
-
location: [],
|
|
187
|
-
country: []
|
|
188
|
-
};
|
|
189
|
-
this.filteredLocations = [];
|
|
190
|
-
this.filteredGroups = [];
|
|
191
|
-
this.filteredStores = [];
|
|
192
|
-
this.filteredCountries = [];
|
|
193
|
-
}
|
|
194
|
-
getClient() {
|
|
195
|
-
this.auth.getClients().subscribe({
|
|
196
|
-
next: (e) => {
|
|
197
|
-
if (e) {
|
|
198
|
-
this.clientList = e.data.result;
|
|
199
|
-
const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
|
|
200
|
-
if (headerFilters.client) {
|
|
201
|
-
this.clientList.find((obj) => {
|
|
202
|
-
if (obj.clientId === headerFilters.client) {
|
|
203
|
-
this.selectedClient = obj;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
// const startDate = this.dayjs(headerFilters.date.startDate);
|
|
207
|
-
// const endDate = this.dayjs(headerFilters.date.endDate);
|
|
208
|
-
// const differenceInDays = endDate.diff(startDate, 'days');
|
|
209
|
-
// if (differenceInDays >= 90 && this.selectedClient?.trafficDateRange === 90) {
|
|
210
|
-
// this.selectedDateRange = {
|
|
211
|
-
// startDate: this.dayjs(headerFilters.date.startDate, "YYYY-MM-DD").subtract(-90, 'days').format("DD-MM-YYYY"),
|
|
212
|
-
// endDate: this.dayjs(headerFilters.date.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
213
|
-
// };
|
|
214
|
-
// } else {
|
|
215
|
-
// this.selectedDateRange = {
|
|
216
|
-
// startDate: this.dayjs(this.selectedDateRange.startDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
217
|
-
// endDate: this.dayjs(this.selectedDateRange.endDate, "YYYY-MM-DD").format("DD-MM-YYYY"),
|
|
218
|
-
// };
|
|
219
|
-
// }
|
|
220
|
-
this.selectedFilters.client = headerFilters.client;
|
|
221
|
-
this.selectedFilters.clientName = headerFilters.clientName;
|
|
222
|
-
this.selectedFilters.clients = headerFilters.clients;
|
|
223
|
-
this.selectedFilters.store = headerFilters.store;
|
|
224
|
-
this.selectedFilters.date = headerFilters.date;
|
|
225
|
-
this.selectedFilters.stores = headerFilters.stores;
|
|
226
|
-
this.selectedFilters.group = headerFilters.group;
|
|
227
|
-
this.selectedFilters.location = headerFilters.location;
|
|
228
|
-
this.selectedFilters.country = headerFilters.country;
|
|
229
|
-
this.gs.dataRangeValue.next(this.selectedFilters);
|
|
230
|
-
// console.log("2")
|
|
231
|
-
// Ensure locations and groups are loaded before fetching stores
|
|
232
|
-
this.getCountry();
|
|
233
|
-
this.getLocations();
|
|
234
|
-
this.getGroups();
|
|
235
|
-
// Fetch stores only after locations and groups are set
|
|
236
|
-
this.getStore();
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
this.selectedClient = this.clientList[0];
|
|
240
|
-
this.selectedFilters.client = this.selectedClient.clientId;
|
|
241
|
-
this.selectedFilters.clientName = this.selectedClient.clientName;
|
|
242
|
-
this.selectedFilters.clients = headerFilters.clients;
|
|
243
|
-
this.selectedFilters.store = headerFilters.store;
|
|
244
|
-
this.selectedFilters.date = headerFilters.date;
|
|
245
|
-
this.selectedFilters.stores = headerFilters.stores;
|
|
246
|
-
this.selectedFilters.group = headerFilters.group;
|
|
247
|
-
this.selectedFilters.location = headerFilters.location;
|
|
248
|
-
this.selectedFilters.country = headerFilters.country;
|
|
249
|
-
localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
|
|
250
|
-
this.gs.dataRangeValue.next(this.selectedFilters);
|
|
251
|
-
// console.log("3")
|
|
252
|
-
this.cd.detectChanges();
|
|
253
|
-
// Ensure locations and groups are loaded before fetching stores
|
|
254
|
-
this.getCountry();
|
|
255
|
-
this.getLocations();
|
|
256
|
-
this.getGroups();
|
|
257
|
-
// Fetch stores only after locations and groups are set
|
|
258
|
-
this.getStore();
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
this.selectedClient = this.clientList[0];
|
|
263
|
-
this.selectedFilters.client = this.selectedClient.clientId;
|
|
264
|
-
this.selectedFilters.clientName = this.selectedClient.clientName;
|
|
265
|
-
// Ensure locations and groups are loaded before fetching stores
|
|
266
|
-
this.getCountry();
|
|
267
|
-
this.getLocations();
|
|
268
|
-
this.getGroups();
|
|
269
|
-
// Fetch stores only after locations and groups are set
|
|
270
|
-
this.getStore();
|
|
271
|
-
localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
|
|
272
|
-
this.gs.dataRangeValue.next(this.selectedFilters);
|
|
273
|
-
// console.log("4")
|
|
274
|
-
this.cd.detectChanges();
|
|
275
|
-
}
|
|
276
|
-
this.getUserInfo(this.selectedFilters.client);
|
|
277
|
-
},
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
getUserInfo(client) {
|
|
281
|
-
let obj = {
|
|
282
|
-
clientId: client ? client : ''
|
|
283
|
-
};
|
|
284
|
-
if (client) {
|
|
285
|
-
this.auth.getHeaderUsers(obj).subscribe({
|
|
286
|
-
next: (e) => {
|
|
287
|
-
localStorage.setItem("usersEmail-info", JSON.stringify(e?.data?.userEmailData || []));
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
onClientSelect(event) {
|
|
293
|
-
// Update the selected client
|
|
294
|
-
this.selectedClient = event;
|
|
295
|
-
// Clear previous filtered data and selections
|
|
296
|
-
this.filteredGroups = [];
|
|
297
|
-
this.filteredStores = [];
|
|
298
|
-
this.filteredLocations = [];
|
|
299
|
-
this.selectedFilters.stores = [];
|
|
300
|
-
this.selectedFilters.group = [];
|
|
301
|
-
this.selectedFilters.location = [];
|
|
302
|
-
this.selectedFilters.country = [];
|
|
303
|
-
// Fetch header filters from localStorage
|
|
304
|
-
const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
|
|
305
|
-
// Update the selected filters with the new client
|
|
306
|
-
this.selectedFilters.client = this.selectedClient.clientId;
|
|
307
|
-
this.selectedFilters.clientName = this.selectedClient.clientName;
|
|
308
|
-
// Remove old store, group, and location data from the header filters
|
|
309
|
-
delete headerFilters.stores;
|
|
310
|
-
delete headerFilters.groups;
|
|
311
|
-
delete headerFilters.location;
|
|
312
|
-
delete headerFilters.country;
|
|
313
|
-
// Fetch new data based on the new client
|
|
314
|
-
this.getCountry();
|
|
315
|
-
this.getLocations();
|
|
316
|
-
this.getStore();
|
|
317
|
-
this.getGroups();
|
|
318
|
-
// Update localStorage with the new client selection and empty filter data
|
|
319
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
320
|
-
window.location.reload();
|
|
321
|
-
// Emit data to the global service
|
|
322
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
323
|
-
// Trigger change detection to reflect UI changes
|
|
324
|
-
this.cd.detectChanges();
|
|
325
|
-
}
|
|
326
|
-
ranges = {
|
|
327
|
-
// Today: [dayjs(), dayjs()],
|
|
328
|
-
Yesterday: [dayjs().subtract(1, 'days'), dayjs().subtract(1, 'days')],
|
|
329
|
-
'This Week': [dayjs().subtract(7, 'days'), dayjs().subtract(1, 'days')],
|
|
330
|
-
'Last Week': [
|
|
331
|
-
dayjs().subtract(14, 'days').startOf('day'),
|
|
332
|
-
dayjs().subtract(8, 'days').endOf('day'),
|
|
333
|
-
],
|
|
334
|
-
'This Month': [dayjs().subtract(30, 'days'), dayjs().subtract(1, 'days')],
|
|
335
|
-
'Last Month': [
|
|
336
|
-
dayjs().subtract(1, 'month').startOf('month'),
|
|
337
|
-
dayjs().subtract(1, 'month').endOf('month'),
|
|
338
|
-
],
|
|
339
|
-
};
|
|
340
|
-
onStartDateChange(event) {
|
|
341
|
-
if (this.dayjs(event.startDate).isValid()) {
|
|
342
|
-
if (this.selectedClient?.traxDateRange === 90) {
|
|
343
|
-
this.isCustomDate = (m) => {
|
|
344
|
-
const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(90, "days"));
|
|
345
|
-
return isValidDate ? "invalid-date" : false;
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
this.isCustomDate = (m) => {
|
|
350
|
-
const isValidDate = m > this.dayjs() || m > this.dayjs(event.startDate.add(180, "days"));
|
|
351
|
-
return isValidDate ? "invalid-date" : false;
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
datechange(event) {
|
|
357
|
-
if (event && event.startDate && event.endDate) {
|
|
358
|
-
if (this.dayjs(event.startDate).isValid() &&
|
|
359
|
-
this.dayjs(event.endDate).isValid()) {
|
|
360
|
-
this.selectedDateRange.startDate = event.startDate;
|
|
361
|
-
this.selectedDateRange.endDate = event.endDate;
|
|
362
|
-
var datetime = {
|
|
363
|
-
startDate: this.dayjs(event.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
364
|
-
endDate: this.dayjs(event.endDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
|
|
365
|
-
};
|
|
366
|
-
this.selectedFilters.date = datetime;
|
|
367
|
-
localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
|
|
368
|
-
window.location.reload();
|
|
369
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
opendropdown(e) {
|
|
374
|
-
e.stopPropagation();
|
|
375
|
-
this.Opendropdown = !this.Opendropdown;
|
|
376
|
-
}
|
|
377
|
-
getLocations() {
|
|
378
|
-
const country = this.countries
|
|
379
|
-
.filter(country => country.checked)
|
|
380
|
-
.map(country => country.country);
|
|
381
|
-
// const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
|
|
382
|
-
let obj = {
|
|
383
|
-
clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
|
|
384
|
-
country,
|
|
385
|
-
city: [],
|
|
386
|
-
group: [],
|
|
387
|
-
};
|
|
388
|
-
this.auth.getLocation(obj).subscribe({
|
|
389
|
-
next: (res) => {
|
|
390
|
-
let cityList = this.selectedFilters?.location?.filter((location) => location.checked).map((loc) => loc.city);
|
|
391
|
-
// Map the fetched locations with default unchecked state
|
|
392
|
-
this.locations = res?.data?.locationData.map((city) => ({
|
|
393
|
-
city: city.city,
|
|
394
|
-
// checked: cityList?.length ? cityList.includes(city.city) : true,
|
|
395
|
-
checked: cityList?.includes(city.city) ? true : false,
|
|
396
|
-
}));
|
|
397
|
-
// Sync the fetched locations with any stored checked values in localStorage
|
|
398
|
-
if (this.selectedFilters.location && Array.isArray(this.selectedFilters.location)) {
|
|
399
|
-
this.filteredLocations = this.locations.map(location => {
|
|
400
|
-
const matchedLocation = this.selectedFilters.location.find((loc) => loc.city === location.city);
|
|
401
|
-
return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
this.filteredLocations = this.locations;
|
|
406
|
-
}
|
|
407
|
-
if (this.searchLocationText) {
|
|
408
|
-
this.filteredLocations = this.locations.filter((location) => location.city.toLowerCase().includes(this.searchLocationText.toLowerCase()));
|
|
409
|
-
}
|
|
410
|
-
const selectedLocations = this.locations.filter((location) => location.checked).map((location) => location.city);
|
|
411
|
-
if (selectedLocations.length > 0) {
|
|
412
|
-
setTimeout(() => {
|
|
413
|
-
this.getGroups();
|
|
414
|
-
this.getStore(); // Fetch stores based on selected groups
|
|
415
|
-
}, 1000);
|
|
416
|
-
}
|
|
417
|
-
if (!selectedLocations.length && country.length) {
|
|
418
|
-
this.getGroups();
|
|
419
|
-
}
|
|
420
|
-
},
|
|
421
|
-
error: (err) => {
|
|
422
|
-
console.error("Failed to fetch locations", err);
|
|
423
|
-
},
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
isAllLocationsSelected() {
|
|
427
|
-
return this.filteredLocations.every(location => location.checked);
|
|
428
|
-
}
|
|
429
|
-
selectedLocationsLabel() {
|
|
430
|
-
const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
|
|
431
|
-
.filter(location => location.checked).map(location => location.city) : this.filteredLocations
|
|
432
|
-
.filter(location => location.checked).map(location => location.city);
|
|
433
|
-
return selectedLocations.length === 0
|
|
434
|
-
? ''
|
|
435
|
-
: selectedLocations.length === 1
|
|
436
|
-
? selectedLocations[0]
|
|
437
|
-
: `${selectedLocations.length} Regions`;
|
|
438
|
-
}
|
|
439
|
-
removeLocation() {
|
|
440
|
-
this.Reset();
|
|
441
|
-
}
|
|
442
|
-
getGroups() {
|
|
443
|
-
const country = this.countries
|
|
444
|
-
.filter(country => country.checked)
|
|
445
|
-
.map(country => country.country);
|
|
446
|
-
let city;
|
|
447
|
-
city = this.locations
|
|
448
|
-
.filter(location => location.checked)
|
|
449
|
-
.map(location => location.city);
|
|
450
|
-
if (!city.length && country.length) {
|
|
451
|
-
city = this.locations.map((loc) => loc.city);
|
|
452
|
-
}
|
|
453
|
-
const obj = { country, city, clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId, group: [] };
|
|
454
|
-
this.auth.getGroups(obj).subscribe({
|
|
455
|
-
next: (res) => {
|
|
456
|
-
let checkedGroup = this.selectedFilters?.group?.filter((group) => group.checked).map((group) => group.groupName);
|
|
457
|
-
const combinedGroups = res?.data?.groupData?.map((groupName) => ({
|
|
458
|
-
groupName: groupName.groupName,
|
|
459
|
-
checked: checkedGroup?.includes(groupName.groupName) ? true : false,
|
|
460
|
-
// checked: checkedGroup?.length ? checkedGroup.includes(groupName.groupName) : true,
|
|
461
|
-
}));
|
|
462
|
-
this.groupsData = combinedGroups;
|
|
463
|
-
if (this.searchGroupText.length) {
|
|
464
|
-
this.filteredGroups = combinedGroups.filter((item) => item.groupName.toLowerCase().includes(this.searchGroupText));
|
|
465
|
-
}
|
|
466
|
-
else {
|
|
467
|
-
this.filteredGroups = combinedGroups;
|
|
468
|
-
}
|
|
469
|
-
// Auto-fetch stores when groups are selected
|
|
470
|
-
const selectedGroups = this.groupsData.filter((group) => group.checked).map((group) => group.groupName);
|
|
471
|
-
if (selectedGroups.length > 0) {
|
|
472
|
-
setTimeout(() => {
|
|
473
|
-
this.getStore(); // Fetch stores based on selected groups
|
|
474
|
-
}, 1000);
|
|
475
|
-
}
|
|
476
|
-
},
|
|
477
|
-
error: (err) => {
|
|
478
|
-
console.error("Failed to fetch groups", err);
|
|
479
|
-
},
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
toggleDropdown(type) {
|
|
483
|
-
if (this.dropdownOpen === type) {
|
|
484
|
-
// If the dropdown is open, close it and avoid resetting the selected values unnecessarily
|
|
485
|
-
this.dropdownOpen = null;
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
// Open the specific dropdown and handle data fetching only if necessary
|
|
489
|
-
this.dropdownOpen = type;
|
|
490
|
-
if (type === 'country') {
|
|
491
|
-
// Fetch countries only if not already fetched and no search text exists
|
|
492
|
-
if ((!this.filteredCountries || this.filteredCountries.length === 0) && !this.searchCountryText.trim()) {
|
|
493
|
-
this.getCountry();
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
if (type === 'group') {
|
|
497
|
-
// Fetch groups only if there are selected cities and no active search text
|
|
498
|
-
const selectedCities = this.locations
|
|
499
|
-
.filter((location) => location.checked)
|
|
500
|
-
.map((location) => location.city);
|
|
501
|
-
// Fetch groups only if locations are selected, no search text exists, and dropdown is opened
|
|
502
|
-
if (this.filteredLocations.length > 0 || (selectedCities.length > 0 && !this.searchGroupText.trim())) {
|
|
503
|
-
this.getGroups();
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
this.filteredGroups = []; // Clear groups if no locations are selected
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
if (type === 'store') {
|
|
510
|
-
// Fetch stores only if not already fetched and no search text is active
|
|
511
|
-
if ((!this.filteredStores || this.filteredStores.length === 0) && !this.searchStoreText.trim()) {
|
|
512
|
-
this.getStore();
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
handleGroupDropdownClick() {
|
|
518
|
-
if (this.dropdownOpen === 'group') {
|
|
519
|
-
this.resetSelectedGroups();
|
|
520
|
-
}
|
|
521
|
-
this.toggleDropdown('group');
|
|
522
|
-
}
|
|
523
|
-
resetSelectedGroups() {
|
|
524
|
-
this.filteredGroups.forEach((group) => (group.checked = false));
|
|
525
|
-
this.searchGroupText = "";
|
|
526
|
-
}
|
|
527
|
-
selectedGroupsLabel() {
|
|
528
|
-
const selectedGroups = this.groupLabel = this.searchGroupText.length ? this.groupsData.filter((group) => group.checked) : this.filteredGroups.filter((group) => group.checked);
|
|
529
|
-
return selectedGroups.length === 0
|
|
530
|
-
? ""
|
|
531
|
-
: selectedGroups.length === 1
|
|
532
|
-
? selectedGroups[0].groupName
|
|
533
|
-
: `${selectedGroups.length} Clusters`;
|
|
534
|
-
}
|
|
535
|
-
removeGroup() {
|
|
536
|
-
this.Reset();
|
|
537
|
-
}
|
|
538
|
-
isAllGroupsSelected() {
|
|
539
|
-
return this.filteredGroups.length ? this.filteredGroups.every((group) => group.checked) : false;
|
|
540
|
-
}
|
|
541
|
-
getStore() {
|
|
542
|
-
const country = this.countries
|
|
543
|
-
.filter(country => country.checked)
|
|
544
|
-
.map(country => country.country);
|
|
545
|
-
const city = this.locations
|
|
546
|
-
.filter(location => location.checked)
|
|
547
|
-
.map(location => location.city);
|
|
548
|
-
const group = this.groupsData
|
|
549
|
-
.filter(group => group.checked)
|
|
550
|
-
.map(group => group.groupName);
|
|
551
|
-
const data = {
|
|
552
|
-
country,
|
|
553
|
-
city,
|
|
554
|
-
clusters: group,
|
|
555
|
-
clientId: this.users.clientId || this.selectedFilters.client
|
|
556
|
-
};
|
|
557
|
-
this.auth.getHeaderStores(data).subscribe({
|
|
558
|
-
next: (res) => {
|
|
559
|
-
if (res && res.code === 200) {
|
|
560
|
-
// Initialize stores from API response
|
|
561
|
-
this.stores = res.data.storesData;
|
|
562
|
-
// Check if there are previously selected stores
|
|
563
|
-
const checkedStoreIds = this.selectedFilters?.stores
|
|
564
|
-
? this.selectedFilters.stores.filter((store) => store.checked).map((store) => store.storeId)
|
|
565
|
-
: [];
|
|
566
|
-
// Sync the `checked` state
|
|
567
|
-
this.stores.forEach(store => {
|
|
568
|
-
store.checked = checkedStoreIds.length
|
|
569
|
-
? checkedStoreIds.includes(store.storeId) // Use previous selection
|
|
570
|
-
: true; // Default to true if no previous selection
|
|
571
|
-
});
|
|
572
|
-
// Apply search filter if search text is present
|
|
573
|
-
if (this.searchStoreText.length) {
|
|
574
|
-
this.filteredStores = this.stores.filter(store => store.storeName.toLowerCase().includes(this.searchStoreText.toLowerCase()));
|
|
575
|
-
}
|
|
576
|
-
else {
|
|
577
|
-
this.filteredStores = [...this.stores];
|
|
578
|
-
}
|
|
579
|
-
// Update `selectedFilters.stores` to reflect the current state
|
|
580
|
-
this.selectedFilters.stores = this.filteredStores.map(store => ({
|
|
581
|
-
storeId: store.storeId,
|
|
582
|
-
storeName: store.storeName,
|
|
583
|
-
checked: store.checked
|
|
584
|
-
}));
|
|
585
|
-
// this.selectedFilters.country = country;
|
|
586
|
-
// Save updated filters to localStorage
|
|
587
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
588
|
-
// Trigger UI change detection
|
|
589
|
-
this.cd.detectChanges();
|
|
590
|
-
}
|
|
591
|
-
else {
|
|
592
|
-
// Handle empty or error response
|
|
593
|
-
this.clearStoresState();
|
|
594
|
-
}
|
|
595
|
-
},
|
|
596
|
-
error: (err) => {
|
|
597
|
-
console.error("Failed to fetch stores", err);
|
|
598
|
-
this.clearStoresState();
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
// Clear stores state and reset filters
|
|
603
|
-
clearStoresState() {
|
|
604
|
-
this.stores = [];
|
|
605
|
-
this.filteredStores = [];
|
|
606
|
-
this.selectedFilters.stores = [];
|
|
607
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
608
|
-
}
|
|
609
|
-
resetSelectedStores() {
|
|
610
|
-
this.filteredStores.forEach((store) => (store.checked = false));
|
|
611
|
-
this.searchStoreText = "";
|
|
612
|
-
}
|
|
613
|
-
selectedStoresLabel() {
|
|
614
|
-
const selectedStores = this.searchStoreText.length ? this.stores.filter((store) => store.checked) : this.filteredStores.filter((store) => store.checked);
|
|
615
|
-
return selectedStores.length === 0
|
|
616
|
-
? "0 Stores"
|
|
617
|
-
: selectedStores.length === 1
|
|
618
|
-
? selectedStores[0].storeName
|
|
619
|
-
: `${selectedStores.length} Stores`;
|
|
620
|
-
}
|
|
621
|
-
isAllStoresSelected() {
|
|
622
|
-
return this.filteredStores.length > 0 && this.filteredStores.every(store => store.checked);
|
|
623
|
-
}
|
|
624
|
-
// Method to handle dropdown item selection
|
|
625
|
-
updateSelectedStores() {
|
|
626
|
-
this.filteredStores.forEach(store => {
|
|
627
|
-
const filteredStore = this.stores.findIndex(fStore => fStore.storeId === store.storeId);
|
|
628
|
-
if (filteredStore != -1) {
|
|
629
|
-
this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
|
|
630
|
-
}
|
|
631
|
-
});
|
|
632
|
-
// Update selectedFilters based on the current store selection
|
|
633
|
-
this.selectedFilters.stores = this.stores.filter(store => store.checked);
|
|
634
|
-
// Update localStorage with the latest selection
|
|
635
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
636
|
-
// Emit updated filters via service
|
|
637
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
638
|
-
// Trigger change detection if necessary
|
|
639
|
-
this.cd.detectChanges();
|
|
640
|
-
}
|
|
641
|
-
toggleSelectAllLocations(event) {
|
|
642
|
-
const isChecked = event.target.checked;
|
|
643
|
-
this.filteredLocations.forEach((location) => (location.checked = isChecked));
|
|
644
|
-
this.updateSelectedLocations();
|
|
645
|
-
}
|
|
646
|
-
toggleSelectAllStores(event) {
|
|
647
|
-
const checked = event.target.checked;
|
|
648
|
-
// Apply the selection to both filtered and full list of stores
|
|
649
|
-
this.filteredStores.forEach(store => store.checked = checked);
|
|
650
|
-
this.stores.forEach(store => {
|
|
651
|
-
const filteredStore = this.filteredStores.find(fStore => fStore.storeId === store.storeId);
|
|
652
|
-
if (filteredStore) {
|
|
653
|
-
store.checked = checked; // Sync the checked state with full store list
|
|
654
|
-
}
|
|
655
|
-
});
|
|
656
|
-
// Update the selected stores and persist the selection
|
|
657
|
-
this.updateSelectedStores();
|
|
658
|
-
}
|
|
659
|
-
updateSelectedLocations() {
|
|
660
|
-
// When locations are selected, fetch the related groups
|
|
661
|
-
const selectedCities = this.filteredLocations
|
|
662
|
-
.filter((location) => location.checked)
|
|
663
|
-
.map((location) => location.city);
|
|
664
|
-
this.filteredLocations.forEach((location) => {
|
|
665
|
-
let findLocationIndex = this.locations.findIndex((loc) => loc.city == location.city);
|
|
666
|
-
if (findLocationIndex != -1) {
|
|
667
|
-
this.locations[findLocationIndex].checked = location.checked;
|
|
668
|
-
}
|
|
669
|
-
});
|
|
670
|
-
if (selectedCities.length > 0 || !selectedCities.length) {
|
|
671
|
-
this.selectedFilters.stores = [];
|
|
672
|
-
this.groupsData = [];
|
|
673
|
-
this.getGroups(); // Fetch groups based on selected cities
|
|
674
|
-
// If there are selected groups, fetch the stores based on selected groups
|
|
675
|
-
this.getStore();
|
|
676
|
-
this.selectedFilters.location = this.locations;
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
this.filteredGroups = []; // Clear groups if no locations are selected
|
|
680
|
-
this.selectedFilters.location = [];
|
|
681
|
-
}
|
|
682
|
-
this.selectedFilters.group = [];
|
|
683
|
-
this.filteredStores = []; // Reset stores as well
|
|
684
|
-
this.searchGroupText = '';
|
|
685
|
-
this.searchStoreText = '';
|
|
686
|
-
// this.Opendropdown = false;
|
|
687
|
-
}
|
|
688
|
-
toggleSelectAllGroups(event) {
|
|
689
|
-
const isChecked = event.target.checked;
|
|
690
|
-
this.filteredGroups.forEach((group) => (group.checked = isChecked));
|
|
691
|
-
this.updateSelectedGroups();
|
|
692
|
-
}
|
|
693
|
-
updateSelectedGroups() {
|
|
694
|
-
// Fetch the relevant stores after groups are selected
|
|
695
|
-
const selectedGroups = this.filteredGroups
|
|
696
|
-
.filter((group) => group.checked)
|
|
697
|
-
.map((group) => group.groupName);
|
|
698
|
-
this.filteredGroups.forEach((group) => {
|
|
699
|
-
let findGroupIndex = this.groupsData.findIndex((item) => item.groupName == group.groupName);
|
|
700
|
-
if (findGroupIndex != -1) {
|
|
701
|
-
this.groupsData[findGroupIndex].checked = group.checked;
|
|
702
|
-
}
|
|
703
|
-
});
|
|
704
|
-
if (selectedGroups.length > 0 || !selectedGroups.length) {
|
|
705
|
-
this.selectedFilters.stores = [];
|
|
706
|
-
// If there are selected groups, fetch the stores based on selected groups
|
|
707
|
-
this.getStore();
|
|
708
|
-
this.selectedFilters.group = this.groupsData;
|
|
709
|
-
}
|
|
710
|
-
else {
|
|
711
|
-
// If no groups are selected, clear the stores list
|
|
712
|
-
this.filteredStores = [];
|
|
713
|
-
// Also, update localStorage to reflect the cleared store selection
|
|
714
|
-
this.selectedFilters.stores = [];
|
|
715
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
716
|
-
// Emit data via service
|
|
717
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
718
|
-
}
|
|
719
|
-
// Clear the search store text when groups are updated
|
|
720
|
-
this.searchStoreText = '';
|
|
721
|
-
}
|
|
722
|
-
Reset() {
|
|
723
|
-
setTimeout(() => {
|
|
724
|
-
// Clear selected groups, stores, and locations
|
|
725
|
-
this.filteredCountries = [];
|
|
726
|
-
this.filteredGroups = [];
|
|
727
|
-
this.filteredStores = [];
|
|
728
|
-
this.filteredLocations = []; // Reset locations as well
|
|
729
|
-
this.locations = [];
|
|
730
|
-
this.groupsData = [];
|
|
731
|
-
this.stores = [];
|
|
732
|
-
this.countries = [];
|
|
733
|
-
// Clear search input fields
|
|
734
|
-
this.searchLocationText = "";
|
|
735
|
-
this.searchGroupText = "";
|
|
736
|
-
this.searchStoreText = "";
|
|
737
|
-
this.selectedFilters.stores = [];
|
|
738
|
-
this.selectedFilters.group = [];
|
|
739
|
-
this.selectedFilters.location = [];
|
|
740
|
-
this.selectedFilters.country = [];
|
|
741
|
-
// Fetch locations, groups, and stores again
|
|
742
|
-
this.getCountry();
|
|
743
|
-
this.getLocations();
|
|
744
|
-
this.getStore();
|
|
745
|
-
this.getGroups();
|
|
746
|
-
// Reset the filters in selectedFilters
|
|
747
|
-
// // Once stores are fetched, mark all as checked
|
|
748
|
-
// setTimeout(() => {
|
|
749
|
-
// this.filteredStores = this.stores.map(store => ({
|
|
750
|
-
// ...store,
|
|
751
|
-
// checked: true // Mark all stores as checked
|
|
752
|
-
// }));
|
|
753
|
-
// // Sync selectedFilters with the updated store state
|
|
754
|
-
// this.selectedFilters.stores = this.filteredStores.map(store => ({
|
|
755
|
-
// ...store,
|
|
756
|
-
// checked: true
|
|
757
|
-
// }));
|
|
758
|
-
// Update localStorage with the latest selectedFilters
|
|
759
|
-
localStorage.setItem('header-filters', JSON.stringify(this.selectedFilters));
|
|
760
|
-
window.location.reload();
|
|
761
|
-
// Emit the reset filters to update other components if needed
|
|
762
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
763
|
-
// Trigger change detection
|
|
764
|
-
this.cd.detectChanges();
|
|
765
|
-
// Adding a slight delay to ensure stores are fetched first
|
|
766
|
-
// Close dropdown after reset if necessary
|
|
767
|
-
this.Opendropdown = false;
|
|
768
|
-
}, 100);
|
|
769
|
-
}
|
|
770
|
-
filterLocations() {
|
|
771
|
-
const searchText = this.searchLocationText.toLowerCase();
|
|
772
|
-
if (searchText) {
|
|
773
|
-
// Preserve the checked state during filtering
|
|
774
|
-
this.filteredLocations = this.locations
|
|
775
|
-
.map(location => ({
|
|
776
|
-
...location,
|
|
777
|
-
checked: this.filteredLocations.find(l => l.city === location.city)?.checked || false
|
|
778
|
-
}))
|
|
779
|
-
.filter(location => location?.city?.toLowerCase().includes(searchText));
|
|
780
|
-
}
|
|
781
|
-
else {
|
|
782
|
-
// Restore the original checked state when search text is cleared
|
|
783
|
-
this.filteredLocations = this.locations.map(location => ({
|
|
784
|
-
...location,
|
|
785
|
-
checked: this.selectedFilters.location.find((l) => l.city === location.city)?.checked || false
|
|
786
|
-
}));
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
filterGroups() {
|
|
790
|
-
const searchText = this.searchGroupText.toLowerCase();
|
|
791
|
-
if (searchText) {
|
|
792
|
-
// Preserve the checked state during filtering
|
|
793
|
-
this.filteredGroups = this.groupsData
|
|
794
|
-
.map(group => ({
|
|
795
|
-
...group,
|
|
796
|
-
checked: this.filteredGroups.find(g => g.groupName === group.groupName)?.checked || false
|
|
797
|
-
}))
|
|
798
|
-
.filter(group => group?.groupName?.toLowerCase().includes(searchText));
|
|
799
|
-
}
|
|
800
|
-
else {
|
|
801
|
-
// Restore the original checked state when search text is cleared
|
|
802
|
-
this.filteredGroups = this.groupsData.map(group => ({
|
|
803
|
-
...group,
|
|
804
|
-
checked: this.selectedFilters.group.find((g) => g.groupName === group.groupName)?.checked || false
|
|
805
|
-
}));
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
filterStores() {
|
|
809
|
-
const searchText = this.searchStoreText.toLowerCase();
|
|
810
|
-
// Preserve checked states during filtering
|
|
811
|
-
if (searchText) {
|
|
812
|
-
// Filter based on search text while preserving checked state
|
|
813
|
-
this.filteredStores = this.stores
|
|
814
|
-
.map(store => ({
|
|
815
|
-
...store,
|
|
816
|
-
// Check if the store is already checked in filteredStores, fallback to original stores' checked state
|
|
817
|
-
checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
|
|
818
|
-
}))
|
|
819
|
-
.filter(store => store.storeName.toLowerCase().includes(searchText));
|
|
820
|
-
}
|
|
821
|
-
else {
|
|
822
|
-
// When the search text is cleared, restore the original list with preserved checked states
|
|
823
|
-
this.filteredStores = this.stores.map(store => ({
|
|
824
|
-
...store,
|
|
825
|
-
// Preserve the checked state based on the selected filters
|
|
826
|
-
checked: this.selectedFilters.stores.find((s) => s.storeId === store.storeId)?.checked || store.checked || false
|
|
827
|
-
}));
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
closeDropdown() {
|
|
831
|
-
this.dropdownOpen = null;
|
|
832
|
-
}
|
|
833
|
-
clickOutside(event) {
|
|
834
|
-
const clickedInside = event.target.closest(".dropdown-container");
|
|
835
|
-
const clickedoutSide = event.target.closest(".dropdown2");
|
|
836
|
-
if (!clickedInside) {
|
|
837
|
-
this.closeDropdown();
|
|
838
|
-
}
|
|
839
|
-
if (!clickedoutSide) {
|
|
840
|
-
this.closeDropdown1();
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
// getCountry(): void {
|
|
844
|
-
// // const headerFilters: any = JSON.parse(localStorage.getItem("header-filters") || "{}");
|
|
845
|
-
// let obj ={
|
|
846
|
-
// clientId: this.selectedFilters.client ? this.selectedFilters.client :this.users.clientId,
|
|
847
|
-
// }
|
|
848
|
-
// this.auth.getCountry(obj).subscribe({
|
|
849
|
-
// next: (res: any) => {
|
|
850
|
-
// let countryList = this.selectedFilters?.country?.filter((country:any) => country.checked).map((loc:any) => loc.allCountry);
|
|
851
|
-
// // Map the fetched countries with default unchecked state
|
|
852
|
-
// this.countires = res?.data?.countryData.map((allCountry: any) => ({
|
|
853
|
-
// allCountry: allCountry.allCountry,
|
|
854
|
-
// checked: countryList?.includes(allCountry.allCountry) ? true : false,
|
|
855
|
-
// }));
|
|
856
|
-
// // Sync the fetched countries with any stored checked values in localStorage
|
|
857
|
-
// if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
|
|
858
|
-
// this.filteredCountries = this.countries.map(country => {
|
|
859
|
-
// const matchedLocation = this.selectedFilters.country.find((loc: any) => loc.allCountry === country.allCountry);
|
|
860
|
-
// return matchedLocation ? { ...country, checked: matchedLocation.checked } : country;
|
|
861
|
-
// });
|
|
862
|
-
// } else {
|
|
863
|
-
// this.filteredCountries = this.countries;
|
|
864
|
-
// }
|
|
865
|
-
// if(this.searchLocationText) {
|
|
866
|
-
// this.filteredCountries = this.countries.filter((country:any) => country.city.toLowerCase().includes(this.searchLocationText.toLowerCase()))
|
|
867
|
-
// }
|
|
868
|
-
// const selectedCountries = this.countries.filter((country) => country.checked).map((country) => country.allCountry);
|
|
869
|
-
// if (selectedCountries.length > 0) {
|
|
870
|
-
// setTimeout(()=>{
|
|
871
|
-
// this.getStore(); // Fetch stores based on selected groups
|
|
872
|
-
// },1000)
|
|
873
|
-
// }
|
|
874
|
-
// },
|
|
875
|
-
// error: (err) => {
|
|
876
|
-
// console.error("Failed to fetch countries", err);
|
|
877
|
-
// },
|
|
878
|
-
// });
|
|
879
|
-
// }
|
|
880
|
-
// selectedCountriesLabel(): string {
|
|
881
|
-
// const selectedCountries = this.countryLabel = this.searchLocationText.length ? this.countries
|
|
882
|
-
// .filter(country => country.checked).map(country => country.allCountry) : this.filteredCountries
|
|
883
|
-
// .filter(country => country.checked).map(country => country.allCountry);
|
|
884
|
-
// return selectedCountries.length === 0
|
|
885
|
-
// ? ''
|
|
886
|
-
// : selectedCountries.length === 1
|
|
887
|
-
// ? selectedCountries[0]
|
|
888
|
-
// : `${selectedCountries.length} countries`;
|
|
889
|
-
// }
|
|
890
|
-
// isAllCountriesSelected(): boolean {
|
|
891
|
-
// return this.filteredCountries.every(country => country.checked);
|
|
892
|
-
// }
|
|
893
|
-
// filterCountries(): void {
|
|
894
|
-
// const searchText = this.searchCountryText.toLowerCase();
|
|
895
|
-
// if (searchText) {
|
|
896
|
-
// // Preserve the checked state during filtering
|
|
897
|
-
// this.filteredCountries = this.countires
|
|
898
|
-
// .map(country => ({
|
|
899
|
-
// ...country,
|
|
900
|
-
// checked: this.filteredCountries.find(l => l.allCountry === country.allCountry)?.checked || false
|
|
901
|
-
// }))
|
|
902
|
-
// .filter(location =>
|
|
903
|
-
// location?.allCountry?.toLowerCase().includes(searchText)
|
|
904
|
-
// );
|
|
905
|
-
// } else {
|
|
906
|
-
// // Restore the original checked state when search text is cleared
|
|
907
|
-
// this.filteredCountries = this.countires.map(country => ({
|
|
908
|
-
// ...country,
|
|
909
|
-
// checked: this.selectedFilters.country.find((l:any) => l.allCountry === country.allCountry)?.checked || false
|
|
910
|
-
// }));
|
|
911
|
-
// }
|
|
912
|
-
// }
|
|
913
|
-
getCountry() {
|
|
914
|
-
let obj = {
|
|
915
|
-
clientId: this.selectedFilters.client ? this.selectedFilters.client : this.users.clientId,
|
|
916
|
-
};
|
|
917
|
-
this.auth.getCountry(obj).subscribe({
|
|
918
|
-
next: (res) => {
|
|
919
|
-
// Extract selected countries from existing filters (if any)
|
|
920
|
-
let countryList = this.selectedFilters?.country?.filter((country) => country.checked).map((loc) => loc.country);
|
|
921
|
-
// Map API response to frontend model
|
|
922
|
-
this.countries = res?.data?.countryData.map((item) => ({
|
|
923
|
-
country: item.country,
|
|
924
|
-
// checked: countryList?.length ? countryList.includes(item.country) : true,
|
|
925
|
-
// checked: cityList?.length ? cityList.includes(city.city) : true,
|
|
926
|
-
checked: countryList?.includes(item.country) ? true : false,
|
|
927
|
-
}));
|
|
928
|
-
if (this.selectedFilters.country && Array.isArray(this.selectedFilters.country)) {
|
|
929
|
-
this.filteredCountries = this.countries.map(location => {
|
|
930
|
-
const matchedLocation = this.selectedFilters.country.find((loc) => loc.country === location.country);
|
|
931
|
-
return matchedLocation ? { ...location, checked: matchedLocation.checked } : location;
|
|
932
|
-
});
|
|
933
|
-
}
|
|
934
|
-
else {
|
|
935
|
-
this.filteredCountries = this.countries;
|
|
936
|
-
}
|
|
937
|
-
// Initially, all countries are visible
|
|
938
|
-
this.filteredCountries = [...this.countries];
|
|
939
|
-
// If a search text already exists, filter immediately
|
|
940
|
-
if (this.searchCountryText) {
|
|
941
|
-
this.filterCountries();
|
|
942
|
-
}
|
|
943
|
-
// Fetch stores if at least one country is selected
|
|
944
|
-
let selectedCountries = this.countries.filter((country) => country.checked);
|
|
945
|
-
if (selectedCountries.length > 0) {
|
|
946
|
-
setTimeout(() => {
|
|
947
|
-
this.getLocations();
|
|
948
|
-
this.getStore(); // fetch stores
|
|
949
|
-
}, 1000);
|
|
950
|
-
}
|
|
951
|
-
},
|
|
952
|
-
error: (err) => {
|
|
953
|
-
console.error("Failed to fetch countries", err);
|
|
954
|
-
},
|
|
955
|
-
});
|
|
956
|
-
}
|
|
957
|
-
selectedCountriesLabel() {
|
|
958
|
-
const selectedCountries = this.searchCountryText.length
|
|
959
|
-
? this.filteredCountries.filter(country => country.checked).map(country => country.country)
|
|
960
|
-
: this.countries.filter(country => country.checked).map(country => country.country);
|
|
961
|
-
return selectedCountries.length === 0
|
|
962
|
-
? ''
|
|
963
|
-
: selectedCountries.length === 1
|
|
964
|
-
? selectedCountries[0]
|
|
965
|
-
: `${selectedCountries.length} countries`;
|
|
966
|
-
}
|
|
967
|
-
filterCountries() {
|
|
968
|
-
const searchText = this.searchCountryText.toLowerCase();
|
|
969
|
-
if (searchText) {
|
|
970
|
-
// Filter and preserve checked state
|
|
971
|
-
this.filteredCountries = this.countries
|
|
972
|
-
.map(country => ({
|
|
973
|
-
...country,
|
|
974
|
-
checked: this.filteredCountries.find(c => c.country === country.country)?.checked || false
|
|
975
|
-
}))
|
|
976
|
-
.filter(country => country.country.toLowerCase().includes(searchText));
|
|
977
|
-
}
|
|
978
|
-
else {
|
|
979
|
-
// Reset to full list
|
|
980
|
-
this.filteredCountries = this.countries.map((country) => ({
|
|
981
|
-
...country,
|
|
982
|
-
checked: this.selectedFilters.country?.find((c) => c.country === country.country)?.checked || false
|
|
983
|
-
}));
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
isAllCountriesSelected() {
|
|
987
|
-
return this.filteredCountries.length > 0 && this.filteredCountries.every(country => country.checked);
|
|
988
|
-
}
|
|
989
|
-
toggleSelectAllCountries(event) {
|
|
990
|
-
const isChecked = event.target.checked;
|
|
991
|
-
this.filteredCountries.forEach((country) => (country.checked = isChecked));
|
|
992
|
-
this.updateSelectedCountries();
|
|
993
|
-
}
|
|
994
|
-
updateSelectedCountries() {
|
|
995
|
-
// When locations are selected, fetch the related groups
|
|
996
|
-
const selectedCountries = this.filteredCountries
|
|
997
|
-
.filter((country) => country.checked)
|
|
998
|
-
.map((country) => country.country);
|
|
999
|
-
this.filteredCountries.forEach((country) => {
|
|
1000
|
-
let findCountryIndex = this.countries.findIndex((loc) => loc.country == country.country);
|
|
1001
|
-
if (findCountryIndex != -1) {
|
|
1002
|
-
this.countries[findCountryIndex].checked = country.checked;
|
|
1003
|
-
}
|
|
1004
|
-
});
|
|
1005
|
-
if (selectedCountries.length > 0 || !selectedCountries.length) {
|
|
1006
|
-
this.selectedFilters.stores = [];
|
|
1007
|
-
this.groupsData = [];
|
|
1008
|
-
this.locations = [];
|
|
1009
|
-
this.getLocations();
|
|
1010
|
-
this.getGroups(); // Fetch groups based on selected cities
|
|
1011
|
-
// If there are selected groups, fetch the stores based on selected groups
|
|
1012
|
-
this.getStore();
|
|
1013
|
-
this.selectedFilters.country = this.filteredCountries;
|
|
1014
|
-
}
|
|
1015
|
-
else {
|
|
1016
|
-
this.filteredGroups = []; // Clear groups if no locations are selected
|
|
1017
|
-
this.selectedFilters.country = [];
|
|
1018
|
-
}
|
|
1019
|
-
this.selectedFilters.group = [];
|
|
1020
|
-
this.filteredStores = []; // Reset stores as well
|
|
1021
|
-
this.searchGroupText = '';
|
|
1022
|
-
this.searchStoreText = '';
|
|
1023
|
-
// this.Opendropdown = false;
|
|
1024
|
-
}
|
|
1025
|
-
removeCountry() {
|
|
1026
|
-
this.Reset();
|
|
1027
|
-
}
|
|
1028
|
-
Apply() {
|
|
1029
|
-
// Close the dropdown
|
|
1030
|
-
this.Opendropdown = false;
|
|
1031
|
-
// Fetch existing filters from localStorage
|
|
1032
|
-
const headerFilters = JSON.parse(localStorage.getItem("header-filters") || "{}");
|
|
1033
|
-
this.selectedFilters.store = null;
|
|
1034
|
-
// Ensure current selections are reflected
|
|
1035
|
-
this.selectedFilters.country = this.filteredCountries;
|
|
1036
|
-
this.selectedFilters.location = this.locations;
|
|
1037
|
-
this.selectedFilters.group = this.groupsData;
|
|
1038
|
-
this.selectedFilters.stores = headerFilters.stores ? headerFilters.stores : this.stores;
|
|
1039
|
-
// Store updated filters back in localStorage
|
|
1040
|
-
localStorage.setItem("header-filters", JSON.stringify(this.selectedFilters));
|
|
1041
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
1042
|
-
window.location.reload();
|
|
1043
|
-
// Emit the updated filters via the service
|
|
1044
|
-
// this.gs.dataRangeValue.next(this.selectedFilters);
|
|
1045
|
-
// Trigger refresh if necessary
|
|
1046
|
-
// this.gs.manageRefreshTrigger.next(true);
|
|
1047
|
-
this.cd.detectChanges();
|
|
1048
|
-
}
|
|
1049
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficHeaderComponent, deps: [{ token: i1.AuthService }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1050
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TrafficHeaderComponent, selector: "lib-traffic-header", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<!-- <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div> -->\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.today{pointer-events:none;text-decoration:line-through;color:#a9a9a9}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
|
|
1051
|
-
}
|
|
1052
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficHeaderComponent, decorators: [{
|
|
1053
|
-
type: Component,
|
|
1054
|
-
args: [{ selector: "lib-traffic-header", template: "<div class=\"\">\r\n <label *ngIf=\"selectedCountriesLabel()\" class=\"badge badge-light-default mx-2\">{{selectedCountriesLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeCountry()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n<!-- <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" style=\"min-width: 260px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [drops]=\"'down'\" [opens]=\"'right'\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [autoApply]=\"true\"\r\n [alwaysShowCalendars]=\"false\" [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\" autocomplete=\"off\"\r\n [(ngModel)]=\"selectedDateRange\" (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n</div> -->\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-default mx-2 rounded-3 text-nowrap border-val\">\r\n <!-- <span class=\"me-2\">Filter</span> -->\r\n <svg class=\"pl-3\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div *ngIf=\"Opendropdown\" class=\"card p-5 dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important;\" (clickOutside)=\"closeDropdown1()\">\r\n <div class=\"dropdown-title d-flex justify-content-between mb-2\">Filter Options\r\n <button class=\"btn btn-outline w-25 ms-3 btn-resize\" (click)=\"Reset()\"> Reset </button>\r\n <button class=\"btn btn-primary w-25 btn-resize\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n\r\n <!-- Country Dropdown -->\r\n<div class=\"dropdown-container\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('country')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedCountriesLabel()\"\r\n readonly\r\n placeholder=\"Select country\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'country'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search country\" \r\n [(ngModel)]=\"searchCountryText\" \r\n (ngModelChange)=\"filterCountries()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllCountries\" \r\n [checked]=\"isAllCountriesSelected()\" \r\n (change)=\"toggleSelectAllCountries($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllCountries\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let country of filteredCountries\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"country.country\" \r\n [(ngModel)]=\"country.checked\"\r\n (change)=\"updateSelectedCountries()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"country.country\">\r\n {{ country.country }}\r\n </label>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n\r\n <!-- Location Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('location')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedLocationsLabel()\"\r\n readonly\r\n placeholder=\"Select Region\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'location'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search Region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocations\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocations\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let location of filteredLocations\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Group Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('group')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\" \r\n [value]=\"selectedGroupsLabel()\" readonly\r\n placeholder=\"Select clusters\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'group'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroups\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroups\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let group of filteredGroups\"\r\n >\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"group.groupName\"\r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- Store Dropdown -->\r\n<div class=\"dropdown-container mt-3\" (clickOutside)=\"closeDropdown()\">\r\n <div class=\"dropdown-header\" (click)=\"toggleDropdown('store')\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control dropdown-input cursor-pointer\"\r\n [value]=\"selectedStoresLabel()\"\r\n readonly\r\n placeholder=\"Select stores\"\r\n />\r\n </div>\r\n <div class=\"dropdown-menu custom-dropdown-menu\" *ngIf=\"dropdownOpen === 'store'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control mb-2 dropdown-search \" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n <div class=\"form-check mb-2 dropdown-item custom-dropdown-item\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStores\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStores\">\r\n Select All\r\n </label>\r\n </div>\r\n <div \r\n class=\"dropdown-item form-check custom-dropdown-item\" \r\n *ngFor=\"let store of filteredStores\"\r\n >\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"store.storeId\"\r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label\" [for]=\"store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker td.available.today{pointer-events:none;text-decoration:line-through;color:#a9a9a9}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.dropdown2{position:absolute;top:70px;min-width:270px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:0 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}\n"] }]
|
|
1055
|
-
}], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { onClick: [{
|
|
1056
|
-
type: HostListener,
|
|
1057
|
-
args: ['document:click', ['$event']]
|
|
1058
|
-
}], clickOutside: [{
|
|
1059
|
-
type: HostListener,
|
|
1060
|
-
args: ["document:click", ["$event"]]
|
|
1061
|
-
}] } });
|
|
1062
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIvdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8saUJBQWlCLENBQUM7Ozs7Ozs7O0FBU3pCLE1BQU0sT0FBTyxzQkFBc0I7SUE0Q3ZCO0lBQThCO0lBQy9CO0lBQ0M7SUE3Q1YsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNoQixZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtRQUNoQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sY0FBYyxDQUFDLENBQUMsZ0JBQWdCO1NBQ3hDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFQSxpQkFBaUIsR0FBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRSxD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LHNCQUFzQiw2SENoQm5DLHlrWUFrUU07OzRGRGxQTyxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usb0JBQW9CO3NLQXNEOUIsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXkyQjFDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPbkluaXQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xyXG5pbXBvcnQgXCJkYXlqcy9sb2NhbGUvZW5cIjtcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLXRyYWZmaWMtaGVhZGVyXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi90cmFmZmljLWhlYWRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vdHJhZmZpYy1oZWFkZXIuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYWZmaWNIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGRheWpzID0gZGF5anM7XHJcbmlzQ3VzdG9tRGF0ZSA9IChtOiBkYXlqcy5EYXlqcykgPT4ge1xyXG4gIGlmIChtLmlzU2FtZSh0aGlzLmRheWpzKCksIFwiZGF5XCIpKSB7XHJcbiAgICByZXR1cm4gXCJpbnZhbGlkLWRhdGVcIjsgLy8gZGlzYWJsZSB0b2RheVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG4gIHNlbGVjdGVkRGF0ZVJhbmdlOiBhbnkgPSB7IHN0YXJ0RGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgzMCwgJ2RheXMnKSxcclxuICAgIGVuZERhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgXCJkYXlzXCIpLH07XHJcbiAgc2VsZWN0ZWRGaWx0ZXJzOiBhbnkgPSB7XHJcbiAgICBjbGllbnQ6IG51bGwsXHJcbiAgICBjbGllbnROYW1lOiBudWxsLFxyXG4gICAgY2xpZW50czogW10sXHJcbiAgICBzdG9yZTogbnVsbCxcclxuICAgIHN0b3JlczogW10sXHJcbiAgICBkYXRlOiBudWxsLFxyXG4gICAgZ3JvdXA6IFtdLFxyXG4gICAgbG9jYXRpb246IFtdLFxyXG4gICAgY291bnRyeTogW10sXHJcbiAgfTtcclxuICBPcGVuZHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bk9wZW46IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyAnbG9jYXRpb24nIG9yICdncm91cCdcclxuICBzZWFyY2hMb2NhdGlvblRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgc2VhcmNoR3JvdXBUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIGxvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZExvY2F0aW9uczogYW55W10gPSBbXTtcclxuICBncm91cHNEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkR3JvdXBzOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkU3RvcmVzOiBhbnlbXSA9IFtdO1xyXG4gIHN0b3JlczphbnlbXSA9IFtdXHJcbiAgc2VhcmNoU3RvcmVUZXh0OnN0cmluZyA9ICcnO1xyXG4gIGNsaWVudExpc3Q6YW55ID0gW11cclxuICBzZWxlY3RlZENsaWVudDphbnlcclxuICBsb2NhdGlvbkxhYmVsOiBhbnlbXT1bXTtcclxuICBncm91cExhYmVsOiBhbnlbXT1bXTtcclxuICB1c2VyczogYW55O1xyXG4gIHVybDogYW55O1xyXG4gIGZpbHRlcmVkQ291bnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGNvdW50cnlMYWJlbDogYW55W109W107XHJcbiAgc2VhcmNoQ291bnRyeVRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgY291bnRyaWVzOiBhbnlbXSA9IFtdO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSwgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7fVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmKCF0YXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duMicpKSB7XHJcbiAgICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNsb3NlRHJvcGRvd24xKCl7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMuc2V0UmFuZ2VzQmFzZWRPblJvdXRlKCk7XHJcblxyXG4gICAgLy8gTGlzdGVuIGZvciByb3V0ZSBjaGFuZ2VzIHRvIHVwZGF0ZSByYW5nZXNcclxuICAgIC8vIHRoaXMucm91dGVyPy5ldmVudHM/LnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgIC8vICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG4gICAgLy8gICAgIHRoaXMuc2V0UmFuZ2VzQmFzZWRPblJvdXRlKCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG4gICAgdGhpcy51cmwgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KCcvJyk7XHJcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgYXMgc3RyaW5nKTtcclxuICAgIHRoaXMudXNlcnMgPSB1c2VyO1xyXG4gICAgdGhpcy5ncz8ubWFuYWdlUmVmcmVzaFRyaWdnZXI/LnN1YnNjcmliZSgoZSkgPT4geyAgICAgIFxyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIGlmICh1c2VyLnVzZXJUeXBlID09PSAndGFuZ28nKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnQoKTtcclxuICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICBjb25zdCBzdG9yZWRGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKTtcclxuICAgICAgICAgIGlmIChzdG9yZWRGaWx0ZXJzKSB7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShzdG9yZWRGaWx0ZXJzKTtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBoZWFkZXJGaWx0ZXJzPy5zdG9yZXMubWFwKChzdG9yZTphbnkpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiBcclxuICAgIC8vIEZldGNoIGNsaWVudCBkYXRhIGlmIHRoZSB1c2VyIGlzIG9mIHR5cGUgJ3RhbmdvJ1xyXG4gICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgdGhpcy5nZXRDbGllbnQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gICAgICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gICAgICB0aGlzLmdldEdyb3VwcygpO1xyXG4gICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIGNvbnN0IGNsaWVudEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNsaWVudC1kZXRhaWxzXCIpO1xyXG4gICAgICBpZiAoY2xpZW50RmlsdGVycykge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcmNsaWVudEZpbHRlcnMgPSBKU09OLnBhcnNlKGNsaWVudEZpbHRlcnMpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0ge1xyXG4gICAgICB0cmFmZmljRGF0ZVJhbmdlIDogaGVhZGVyY2xpZW50RmlsdGVycy50cmFmZmljRGF0ZVJhbmdlXHJcbiAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICBcclxuICAgIC8vIExvYWQgZmlsdGVycyBmcm9tIGxvY2FsU3RvcmFnZSBpZiB0aGV5IGV4aXN0XHJcbiAgICBjb25zdCBzdG9yZWRGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKTtcclxuICAgIGlmIChzdG9yZWRGaWx0ZXJzKSB7XHJcbiAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gIFxyXG4gICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGVkRmlsdGVycyB3aXRoIGRlZmF1bHRzIG9yIGV4aXN0aW5nIHZhbHVlc1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgICBjbGllbnQ6IGhlYWRlckZpbHRlcnMuY2xpZW50IHx8IHRoaXMudXNlcnMuY2xpZW50LFxyXG4gICAgICAgIGNsaWVudE5hbWU6IGhlYWRlckZpbHRlcnMuY2xpZW50TmFtZSB8fCAnJyxcclxuICAgICAgICBjbGllbnRzOiBoZWFkZXJGaWx0ZXJzLmNsaWVudHMgfHwgW10sXHJcbiAgICAgICAgc3RvcmU6IGhlYWRlckZpbHRlcnMuc3RvcmUgfHwgbnVsbCxcclxuICAgICAgICBkYXRlOiBoZWFkZXJGaWx0ZXJzLmRhdGUgfHwge30sXHJcbiAgICAgICAgc3RvcmVzOiBoZWFkZXJGaWx0ZXJzLnN0b3JlcyB8fCBbXSxcclxuICAgICAgICBncm91cDogaGVhZGVyRmlsdGVycy5ncm91cCB8fCBbXSxcclxuICAgICAgICBsb2NhdGlvbjogaGVhZGVyRmlsdGVycy5sb2NhdGlvbiB8fCBbXSxcclxuICAgICAgICBjb3VudHJ5OiBoZWFkZXJGaWx0ZXJzLmNvdW50cnkgfHwgW11cclxuICAgICAgfTtcclxuICBcclxuICAgICAgLy8gU3luYyBmaWx0ZXJlZCBkYXRhIHdpdGggc3RvcmVkIHNlbGVjdGlvbnNcclxuICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5jb3VudHJ5KTtcclxuICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5sb2NhdGlvbik7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLnN0b3Jlcyk7XHJcbiAgXHJcbiAgICAgIC8vIEZvcm1hdCBkYXRlIHJhbmdlIGlmIGl0IGV4aXN0c1xyXG4gICAgICBpZiAoaGVhZGVyRmlsdGVycy5kYXRlKSB7XHJcbiAgICBcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGUsIFwiWVlZWS1NTS1ERFwiKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxyXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyhoZWFkZXJGaWx0ZXJzLmRhdGUuZW5kRGF0ZSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0ge1xyXG4gICAgICAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2Uuc3RhcnREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICAgIGVuZERhdGU6IHRoaXMuZGF5anModGhpcy5zZWxlY3RlZERhdGVSYW5nZS5lbmREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiM1wiKVxyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2UgYW5kIHVwZGF0ZSBsb2NhbFN0b3JhZ2VcclxudGhpcy5lbWl0QW5kU3RvcmVGaWx0ZXJzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJbml0aWFsaXplIGVtcHR5IHN0YXRlcyBpZiBubyBoZWFkZXIgZmlsdGVycyBhcmUgcHJlc2VudCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgdGhpcy5yZXNldEZpbHRlcnMoKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCIyXCIpXHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgc3luY1dpdGhMb2NhbFN0b3JhZ2UoaXRlbXM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIGl0ZW1zXHJcbiAgICAgID8gaXRlbXMubWFwKChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgY2hlY2tlZDogaXRlbS5jaGVja2VkID09PSB0cnVlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgIDogW107XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgZW1pdEFuZFN0b3JlRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIjFcIilcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgc2VsZWN0ZWRGaWx0ZXJzIGFuZCBhbGwgcmVsYXRlZCBhcnJheXMgdG8gZW1wdHkgc3RhdGVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgY2xpZW50OiBudWxsLFxyXG4gICAgICBjbGllbnROYW1lOiAnJyxcclxuICAgICAgY2xpZW50czogW10sXHJcbiAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICBkYXRlOiB7fSxcclxuICAgICAgc3RvcmVzOiBbXSxcclxuICAgICAgZ3JvdXA6IFtdLFxyXG4gICAgICBsb2NhdGlvbjogW10sXHJcbiAgICAgIGNvdW50cnk6IFtdXHJcbiAgICB9O1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFtdO1xyXG4gIH1cclxuZ2V0Q2xpZW50KCl7XHJcbiAgdGhpcy5hdXRoLmdldENsaWVudHMoKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogKGUpID0+IHtcclxuICAgICAgaWYgKGUpIHtcclxuICAgICAgICB0aGlzLmNsaWVudExpc3QgPSBlLmRhdGEucmVzdWx0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGhlYWRlckZpbHRlcnMuY2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmNsaWVudExpc3QuZmluZCgob2JqOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iai5jbGllbnRJZCA9PT0gaGVhZGVyRmlsdGVycy5jbGllbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuZGF5anMoaGVhZGVyRmlsdGVycy5kYXRlLnN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAvLyBjb25zdCBlbmREYXRlID0gdGhpcy5kYXlqcyhoZWFkZXJGaWx0ZXJzLmRhdGUuZW5kRGF0ZSk7XHJcbiAgICAgICAgICAvLyBjb25zdCBkaWZmZXJlbmNlSW5EYXlzID0gZW5kRGF0ZS5kaWZmKHN0YXJ0RGF0ZSwgJ2RheXMnKTtcclxuICAgICAgICAgIC8vIGlmIChkaWZmZXJlbmNlSW5EYXlzID49IDkwICYmIHRoaXMuc2VsZWN0ZWRDbGllbnQ/LnRyYWZmaWNEYXRlUmFuZ2UgPT09IDkwKSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB7XHJcbiAgICAgICAgICAvLyAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGUsIFwiWVlZWS1NTS1ERFwiKS5zdWJ0cmFjdCgtOTAsICdkYXlzJykuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICAgIC8vICAgICBlbmREYXRlOiB0aGlzLmRheWpzKGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICAgIC8vICAgfTtcclxuICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB7XHJcbiAgICAgICAgICAvLyAgICAgc3RhcnREYXRlOiB0aGlzLmRheWpzKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2Uuc3RhcnREYXRlLCBcIllZWVktTU0tRERcIikuZm9ybWF0KFwiREQtTU0tWVlZWVwiKSxcclxuICAgICAgICAgIC8vICAgICBlbmREYXRlOiB0aGlzLmRheWpzKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UuZW5kRGF0ZSwgXCJZWVlZLU1NLUREXCIpLmZvcm1hdChcIkRELU1NLVlZWVlcIiksXHJcbiAgICAgICAgICAvLyAgIH07XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSBoZWFkZXJGaWx0ZXJzLmNsaWVudDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSBoZWFkZXJGaWx0ZXJzLmNsaWVudE5hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnRzID0gaGVhZGVyRmlsdGVycy5jbGllbnRzO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IGhlYWRlckZpbHRlcnMuc3RvcmVzO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBoZWFkZXJGaWx0ZXJzLmdyb3VwO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IGhlYWRlckZpbHRlcnMuY291bnRyeTtcclxuICAgICAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjJcIilcclxuICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldENvdW50cnkoKTsgIFxyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgYWZ0ZXIgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIHNldFxyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gdGhpcy5jbGllbnRMaXN0WzBdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWVcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBoZWFkZXJGaWx0ZXJzLmdyb3VwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBoZWFkZXJGaWx0ZXJzLmNvdW50cnk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcImhlYWRlci1maWx0ZXJzXCIsXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM1wiKVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldENvdW50cnkoKTtcclxuIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiB0aGlzLmdldEdyb3VwcygpO1xyXG4gIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENsaWVudCA9IHRoaXMuY2xpZW50TGlzdFswXTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID0gIHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQ7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWVcclxuICAgICAgIC8vIEVuc3VyZSBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgbG9hZGVkIGJlZm9yZSBmZXRjaGluZyBzdG9yZXNcclxuIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgIFwiaGVhZGVyLWZpbHRlcnNcIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiNFwiKVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB0aGlzLmdldFVzZXJJbmZvKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCk7XHJcblxyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5nZXRVc2VySW5mbyhjbGllbnQ6YW55KXtcclxuICBsZXQgb2JqID17XHJcbiAgICAgIGNsaWVudElkOiBjbGllbnQgPyBjbGllbnQgOicnXHJcbiAgfVxyXG4gIGlmKGNsaWVudCl7XHJcbiAgICB0aGlzLmF1dGguZ2V0SGVhZGVyVXNlcnMob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgXCJ1c2Vyc0VtYWlsLWluZm9cIixcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGU/LmRhdGE/LnVzZXJFbWFpbERhdGEgfHwgW10pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbm9uQ2xpZW50U2VsZWN0KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIGNsaWVudFxyXG4gIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSBldmVudDtcclxuICAvLyBDbGVhciBwcmV2aW91cyBmaWx0ZXJlZCBkYXRhIGFuZCBzZWxlY3Rpb25zXHJcbiAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBbXTtcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBbXTtcclxuXHJcblxyXG4gIC8vIEZldGNoIGhlYWRlciBmaWx0ZXJzIGZyb20gbG9jYWxTdG9yYWdlXHJcbiAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgXHJcbiAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBmaWx0ZXJzIHdpdGggdGhlIG5ldyBjbGllbnRcclxuICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWU7XHJcbiAgXHJcbiAgLy8gUmVtb3ZlIG9sZCBzdG9yZSwgZ3JvdXAsIGFuZCBsb2NhdGlvbiBkYXRhIGZyb20gdGhlIGhlYWRlciBmaWx0ZXJzXHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuc3RvcmVzO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmdyb3VwcztcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5jb3VudHJ5O1xyXG5cclxuICBcclxuICAvLyBGZXRjaCBuZXcgZGF0YSBiYXNlZCBvbiB0aGUgbmV3IGNsaWVudFxyXG4gIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gIHRoaXMuZ2V0R3JvdXBzKCk7XHJcblxyXG4gIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbmV3IGNsaWVudCBzZWxlY3Rpb24gYW5kIGVtcHR5IGZpbHRlciBkYXRhXHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAvLyBFbWl0IGRhdGEgdG8gdGhlIGdsb2JhbCBzZXJ2aWNlXHJcbiAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gcmVmbGVjdCBVSSBjaGFuZ2VzXHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbn1cclxuXHJcblxyXG5cclxucmFuZ2VzOmFueSA9IHtcclxuICAvLyBUb2RheTogW2RheWpzKCksIGRheWpzKCldLFxyXG4gIFllc3RlcmRheTogW2RheWpzKCkuc3VidHJhY3QoMSwgJ2RheXMnKSwgZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5cycpXSxcclxuICAnVGhpcyBXZWVrJzogW2RheWpzKCkuc3VidHJhY3QoNywgJ2RheXMnKSwgZGF5anMoKS5zdWJ0cmFjdCgxLCAnZGF5cycpXSxcclxuICAnTGFzdCBXZWVrJzogW1xyXG4gICAgZGF5anMoKS5zdWJ0cmFjdCgxNCwgJ2RheXMnKS5zdGFydE9mKCdkYXknKSxcclxuICAgIGRheWpzKCkuc3VidHJhY3QoOCwgJ2RheXMnKS5lbmRPZignZGF5JyksXHJcbiAgXSxcclxuICAnVGhpcyBNb250aCc6IFtkYXlqcygpLnN1YnRyYWN0KDMwLCAnZGF5cycpLCBkYXlqcygpLnN1YnRyYWN0KDEsICdkYXlzJyldLFxyXG4gICdMYXN0IE1vbnRoJzogW1xyXG4gICAgZGF5anMoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5zdGFydE9mKCdtb250aCcpLFxyXG4gICAgZGF5anMoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKSxcclxuICBdLFxyXG59O1xyXG5cclxuICBvblN0YXJ0RGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUpLmlzVmFsaWQoKSkge1xyXG4gICAgICAgICBpZih0aGlzLnNlbGVjdGVkQ2xpZW50Py50cmF4RGF0ZVJhbmdlID09PSA5MCl7XHJcbiAgICAgICAgICAgICB0aGlzLmlzQ3VzdG9tRGF0ZSA9IChtOiBkYXlqcy5EYXlqcykgPT4ge1xyXG4gICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9XHJcbiAgICAgICAgICAgICAgICAgbSA+IHRoaXMuZGF5anMoKSB8fCBtID4gdGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUuYWRkKDkwLCBcImRheXNcIikpO1xyXG4gICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZERhdGUgPyBcImludmFsaWQtZGF0ZVwiIDogZmFsc2U7XHJcbiAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXNWYWxpZERhdGUgPVxyXG4gICAgICAgICAgbSA+IHRoaXMuZGF5anMoKSB8fCBtID4gdGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUuYWRkKDE4MCwgXCJkYXlzXCIpKTtcclxuICAgICAgICByZXR1cm4gaXNWYWxpZERhdGUgPyBcImludmFsaWQtZGF0ZVwiIDogZmFsc2U7XHJcbiAgICAgIH07XHJcbiAgICAgICAgIH1cclxuICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF0ZWNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuc3RhcnREYXRlICYmIGV2ZW50LmVuZERhdGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZGF5anMoZXZlbnQuc3RhcnREYXRlKS5pc1ZhbGlkKCkgJiZcclxuICAgICAgICB0aGlzLmRheWpzKGV2ZW50LmVuZERhdGUpLmlzVmFsaWQoKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLnN0YXJ0RGF0ZSA9IGV2ZW50LnN0YXJ0RGF0ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLmVuZERhdGUgPSBldmVudC5lbmREYXRlO1xyXG4gICAgICAgIHZhciBkYXRldGltZSA9IHtcclxuICAgICAgICAgIHN0YXJ0RGF0ZTogdGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXHJcbiAgICAgICAgICAgIFwiWVlZWS1NTS1ERFwiXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgZW5kRGF0ZTogdGhpcy5kYXlqcyhldmVudC5lbmREYXRlLCBcIkRELU1NLVlZWVlcIikuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGUgPSBkYXRldGltZTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgIFwiaGVhZGVyLWZpbHRlcnNcIixcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgIH1cclxuICAgIH0gXHJcbiAgfVxyXG4gIG9wZW5kcm9wZG93bihlOk1vdXNlRXZlbnQpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9ICF0aGlzLk9wZW5kcm9wZG93bjtcclxuICB9XHJcbiAgZ2V0TG9jYXRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY291bnRyeSA9IHRoaXMuY291bnRyaWVzXHJcbiAgICAuZmlsdGVyKGNvdW50cnkgPT4gY291bnRyeS5jaGVja2VkKVxyXG4gICAgLm1hcChjb3VudHJ5ID0+IGNvdW50cnkuY291bnRyeSk7ICBcclxuICAgIC8vIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgbGV0IG9iaiA9e1xyXG4gICAgIGNsaWVudElkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgOnRoaXMudXNlcnMuY2xpZW50SWQsXHJcbiAgICAgY291bnRyeSxcclxuICAgICBjaXR5OiBbXSxcclxuICAgICBncm91cDogW10sXHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dGguZ2V0TG9jYXRpb24ob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2l0eUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8ubG9jYXRpb24/LmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvYzphbnkpID0+IGxvYy5jaXR5KTtcclxuICAgICAgICAvLyBNYXAgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggZGVmYXVsdCB1bmNoZWNrZWQgc3RhdGVcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHJlcz8uZGF0YT8ubG9jYXRpb25EYXRhLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY2l0eTogY2l0eS5jaXR5LFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2l0eUxpc3Q/Lmxlbmd0aCA/IGNpdHlMaXN0LmluY2x1ZGVzKGNpdHkuY2l0eSkgOiB0cnVlLFxyXG4gICAgICAgICAgY2hlY2tlZDogY2l0eUxpc3Q/LmluY2x1ZGVzKGNpdHkuY2l0eSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gIFxyXG4gICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsb2M6IGFueSkgPT4gbG9jLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5sb2NhdGlvbiwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGxvY2F0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIEZldGNoIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgICAgIH0sMTAwMClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggJiYgY291bnRyeS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggbG9jYXRpb25zXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgaXNBbGxMb2NhdGlvbnNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmV2ZXJ5KGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgc2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uTGFiZWwgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC5sZW5ndGggPyB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KSA6ICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRMb2NhdGlvbnNbMF1cclxuICAgICAgOiBgJHtzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGh9IFJlZ2lvbnNgO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTG9jYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlc2V0KCk7XHJcbiAgfVxyXG4gIFxyXG4gIGdldEdyb3VwcygpOiB2b2lkIHsgIFxyXG4gICAgY29uc3QgY291bnRyeSA9IHRoaXMuY291bnRyaWVzXHJcbiAgICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpOyAgXHJcbiAgICBsZXQgY2l0eTtcclxuICAgIGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcblxyXG4gICAgICBpZighY2l0eS5sZW5ndGggJiYgY291bnRyeS5sZW5ndGgpIHtcclxuICAgICAgICBjaXR5ID0gdGhpcy5sb2NhdGlvbnMubWFwKChsb2MpID0+IGxvYy5jaXR5KTtcclxuICAgICAgfVxyXG4gICAgY29uc3Qgb2JqID0geyBjb3VudHJ5LGNpdHksY2xpZW50SWQ6dGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDp0aGlzLnVzZXJzLmNsaWVudElkLGdyb3VwOltdIH07XHJcbiAgICB0aGlzLmF1dGguZ2V0R3JvdXBzKG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGNoZWNrZWRHcm91cCA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzPy5ncm91cD8uZmlsdGVyKChncm91cDphbnkpID0+IGdyb3VwLmNoZWNrZWQpLm1hcCgoZ3JvdXA6YW55KSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkR3JvdXBzID0gcmVzPy5kYXRhPy5ncm91cERhdGE/Lm1hcCgoZ3JvdXBOYW1lOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBncm91cE5hbWU6IGdyb3VwTmFtZS5ncm91cE5hbWUsXHJcbiAgICAgICAgICBjaGVja2VkOiBjaGVja2VkR3JvdXA/LmluY2x1ZGVzKGdyb3VwTmFtZS5ncm91cE5hbWUpID8gdHJ1ZSA6IGZhbHNlLFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2hlY2tlZEdyb3VwPy5sZW5ndGggPyBjaGVja2VkR3JvdXAuaW5jbHVkZXMoZ3JvdXBOYW1lLmdyb3VwTmFtZSkgOiB0cnVlLFxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICB0aGlzLmdyb3Vwc0RhdGEgPSBjb21iaW5lZEdyb3VwcztcclxuICAgICAgICBpZih0aGlzLnNlYXJjaEdyb3VwVGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBjb21iaW5lZEdyb3Vwcy5maWx0ZXIoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc2VhcmNoR3JvdXBUZXh0KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IGNvbWJpbmVkR3JvdXBzO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICAvLyBBdXRvLWZldGNoIHN0b3JlcyB3aGVuIGdyb3VwcyBhcmUgc2VsZWN0ZWRcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKS5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICAgIGlmIChzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICAgICAgfSwxMDAwKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIGdyb3Vwc1wiLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEcm9wZG93bih0eXBlOiAnY291bnRyeScgfCAnbG9jYXRpb24nIHwgJ2dyb3VwJyB8ICdzdG9yZScpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyb3Bkb3duT3BlbiA9PT0gdHlwZSkge1xyXG4gICAgICAvLyBJZiB0aGUgZHJvcGRvd24gaXMgb3BlbiwgY2xvc2UgaXQgYW5kIGF2b2lkIHJlc2V0dGluZyB0aGUgc2VsZWN0ZWQgdmFsdWVzIHVubmVjZXNzYXJpbHlcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gT3BlbiB0aGUgc3BlY2lmaWMgZHJvcGRvd24gYW5kIGhhbmRsZSBkYXRhIGZldGNoaW5nIG9ubHkgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHlwZTtcclxuXHJcbiAgICAgIGlmICh0eXBlID09PSAnY291bnRyeScpIHtcclxuICAgICAgICAvLyBGZXRjaCBjb3VudHJpZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBleGlzdHNcclxuICAgICAgICBpZiAoKCF0aGlzLmZpbHRlcmVkQ291bnRyaWVzIHx8IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMubGVuZ3RoID09PSAwKSAmJiAhdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC50cmltKCkpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0Q291bnRyeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIHRoZXJlIGFyZSBzZWxlY3RlZCBjaXRpZXMgYW5kIG5vIGFjdGl2ZSBzZWFyY2ggdGV4dFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2l0aWVzID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgobG9jYXRpb24pID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gIFxyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIG5vIHNlYXJjaCB0ZXh0IGV4aXN0cywgYW5kIGRyb3Bkb3duIGlzIG9wZW5lZFxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJlZExvY2F0aW9ucy5sZW5ndGggPiAwIHx8IChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwICYmICF0aGlzLnNlYXJjaEdyb3VwVGV4dC50cmltKCkpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAvLyBGZXRjaCBzdG9yZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBpcyBhY3RpdmVcclxuICAgICAgaWYgKCghdGhpcy5maWx0ZXJlZFN0b3JlcyB8fCB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMuc2VhcmNoU3RvcmVUZXh0LnRyaW0oKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgaGFuZGxlR3JvdXBEcm9wZG93bkNsaWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2dnbGVEcm9wZG93bignZ3JvdXAnKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRHcm91cHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiAoZ3JvdXAuY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9IFwiXCI7XHJcbiAgfVxyXG4gIHNlbGVjdGVkR3JvdXBzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cExhYmVsID0gdGhpcy5zZWFyY2hHcm91cFRleHQubGVuZ3RoID8gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpIDogdGhpcy5maWx0ZXJlZEdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPT09IDBcclxuICAgICAgPyBcIlwiXHJcbiAgICAgIDogc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRHcm91cHNbMF0uZ3JvdXBOYW1lXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRHcm91cHMubGVuZ3RofSBDbHVzdGVyc2A7XHJcbiAgfVxyXG4gIHJlbW92ZUdyb3VwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gICBcclxuICB9XHJcbiAgXHJcblxyXG4gIGlzQWxsR3JvdXBzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkR3JvdXBzLmxlbmd0aCA/IHRoaXMuZmlsdGVyZWRHcm91cHMuZXZlcnkoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IGZhbHNlO1xyXG4gIH1cclxuICAgICAgICBcclxuICBnZXRTdG9yZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmNvdW50cmllc1xyXG4gICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZClcclxuICAgIC5tYXAoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkpO1xyXG4gICAgY29uc3QgY2l0eSA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHNEYXRhXHJcbiAgICAgIC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAuY2hlY2tlZClcclxuICAgICAgLm1hcChncm91cCA9PiBncm91cC5ncm91cE5hbWUpO1xyXG4gIFxyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgY291bnRyeSxcclxuICAgICAgY2l0eSxcclxuICAgICAgY2x1c3RlcnM6IGdyb3VwLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy51c2Vycy5jbGllbnRJZCB8fCB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnRcclxuICAgIH07XHJcbiAgXHJcbiAgICB0aGlzLmF1dGguZ2V0SGVhZGVyU3RvcmVzKGRhdGEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdG9yZXMgZnJvbSBBUEkgcmVzcG9uc2VcclxuICAgICAgICAgIHRoaXMuc3RvcmVzID0gcmVzLmRhdGEuc3RvcmVzRGF0YTtcclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwcmV2aW91c2x5IHNlbGVjdGVkIHN0b3Jlc1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tlZFN0b3JlSWRzID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LnN0b3Jlc1xyXG4gICAgICAgICAgICA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlOmFueSkgPT4gc3RvcmUuY2hlY2tlZCkubWFwKChzdG9yZTphbnkpID0+IHN0b3JlLnN0b3JlSWQpXHJcbiAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgICAvLyBTeW5jIHRoZSBgY2hlY2tlZGAgc3RhdGVcclxuICAgICAgICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICAgICAgICBzdG9yZS5jaGVja2VkID0gY2hlY2tlZFN0b3JlSWRzLmxlbmd0aFxyXG4gICAgICAgICAgICAgID8gY2hlY2tlZFN0b3JlSWRzLmluY2x1ZGVzKHN0b3JlLnN0b3JlSWQpIC8vIFVzZSBwcmV2aW91cyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICA6IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBpZiBubyBwcmV2aW91cyBzZWxlY3Rpb25cclxuICAgICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgICAgLy8gQXBwbHkgc2VhcmNoIGZpbHRlciBpZiBzZWFyY2ggdGV4dCBpcyBwcmVzZW50XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5maWx0ZXIoc3RvcmUgPT5cclxuICAgICAgICAgICAgICBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFN0b3JlVGV4dC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFsuLi50aGlzLnN0b3Jlc107XHJcbiAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICAvLyBVcGRhdGUgYHNlbGVjdGVkRmlsdGVycy5zdG9yZXNgIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgICAgIHN0b3JlTmFtZTogc3RvcmUuc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID0gY291bnRyeTtcclxuICBcclxuICAgICAgICAgIC8vIFNhdmUgdXBkYXRlZCBmaWx0ZXJzIHRvIGxvY2FsU3RvcmFnZVxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICBcclxuICAgICAgICAgIC8vIFRyaWdnZXIgVUkgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBlbXB0eSBvciBlcnJvciByZXNwb25zZVxyXG4gICAgICAgICAgdGhpcy5jbGVhclN0b3Jlc1N0YXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggc3RvcmVzXCIsIGVycik7XHJcbiAgICAgICAgdGhpcy5jbGVhclN0b3Jlc1N0YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICAvLyBDbGVhciBzdG9yZXMgc3RhdGUgYW5kIHJlc2V0IGZpbHRlcnNcclxuICBwcml2YXRlIGNsZWFyU3RvcmVzU3RhdGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gW107XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIH1cclxuICBcclxuICByZXNldFNlbGVjdGVkU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKChzdG9yZSkgPT4gKHN0b3JlLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSBcIlwiO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRTdG9yZXNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRTdG9yZXMgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC5sZW5ndGggPyB0aGlzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlKSA9PiBzdG9yZS5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCIwIFN0b3Jlc1wiXHJcbiAgICAgIDogc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRTdG9yZXNbMF0uc3RvcmVOYW1lXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRTdG9yZXMubGVuZ3RofSBTdG9yZXNgO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxTdG9yZXNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5maWx0ZXJlZFN0b3Jlcy5ldmVyeShzdG9yZSA9PiBzdG9yZS5jaGVja2VkKTtcclxuICB9XHJcbi8vIE1ldGhvZCB0byBoYW5kbGUgZHJvcGRvd24gaXRlbSBzZWxlY3Rpb25cclxudXBkYXRlU2VsZWN0ZWRTdG9yZXMoKTogdm9pZCB7XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgIGNvbnN0IGZpbHRlcmVkU3RvcmUgPSB0aGlzLnN0b3Jlcy5maW5kSW5kZXgoZlN0b3JlID0+IGZTdG9yZS5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKTtcclxuICAgIGlmIChmaWx0ZXJlZFN0b3JlICE9IC0xKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVzW2ZpbHRlcmVkU3RvcmVdLmNoZWNrZWQgPSBzdG9yZS5jaGVja2VkOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICB9XHJcbiAgfSk7ICBcclxuICAvLyBVcGRhdGUgc2VsZWN0ZWRGaWx0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0b3JlIHNlbGVjdGlvblxyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuc3RvcmVzLmZpbHRlcihzdG9yZSA9PiBzdG9yZS5jaGVja2VkKTtcclxuXHJcbiAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBsYXRlc3Qgc2VsZWN0aW9uXHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuXHJcbiAgLy8gRW1pdCB1cGRhdGVkIGZpbHRlcnMgdmlhIHNlcnZpY2VcclxuICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG5cclxuICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVjZXNzYXJ5XHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbn1cclxuICB0b2dnbGVTZWxlY3RBbGxMb2NhdGlvbnMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiAobG9jYXRpb24uY2hlY2tlZCA9IGlzQ2hlY2tlZCkpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICBcclxuICAgIC8vIEFwcGx5IHRoZSBzZWxlY3Rpb24gdG8gYm90aCBmaWx0ZXJlZCBhbmQgZnVsbCBsaXN0IG9mIHN0b3Jlc1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkKTtcclxuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5maW5kKGZTdG9yZSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICAgIGlmIChmaWx0ZXJlZFN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUuY2hlY2tlZCA9IGNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHN0b3JlcyBhbmQgcGVyc2lzdCB0aGUgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb24pID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb246YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kTG9jYXRpb25JbmRleCA9IHRoaXMubG9jYXRpb25zLmZpbmRJbmRleCgobG9jOmFueSkgPT4gbG9jLmNpdHkgPT0gbG9jYXRpb24uY2l0eSk7XHJcbiAgICAgIGlmKGZpbmRMb2NhdGlvbkluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbnNbZmluZExvY2F0aW9uSW5kZXhdLmNoZWNrZWQgPSBsb2NhdGlvbi5jaGVja2VkO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKHNlbGVjdGVkQ2l0aWVzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkQ2l0aWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICB0aGlzLmdyb3Vwc0RhdGEgPVtdXHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7IC8vIEZldGNoIGdyb3VwcyBiYXNlZCBvbiBzZWxlY3RlZCBjaXRpZXNcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdOyAvLyBDbGVhciBncm91cHMgaWYgbm8gbG9jYXRpb25zIGFyZSBzZWxlY3RlZFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdOyAvLyBSZXNldCBzdG9yZXMgYXMgd2VsbFxyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSAnJztcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgICAvLyB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsR3JvdXBzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gKGdyb3VwLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRHcm91cHMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgLy8gRmV0Y2ggdGhlIHJlbGV2YW50IHN0b3JlcyBhZnRlciBncm91cHMgYXJlIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZmlsdGVyZWRHcm91cHNcclxuICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRHcm91cHMuZm9yRWFjaCgoZ3JvdXA6YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kR3JvdXBJbmRleCA9IHRoaXMuZ3JvdXBzRGF0YS5maW5kSW5kZXgoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZSA9PSBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICBpZihmaW5kR3JvdXBJbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzRGF0YVtmaW5kR3JvdXBJbmRleF0uY2hlY2tlZCA9IGdyb3VwLmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pIFxyXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkR3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gdGhpcy5ncm91cHNEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gZ3JvdXBzIGFyZSBzZWxlY3RlZCwgY2xlYXIgdGhlIHN0b3JlcyBsaXN0XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFsc28sIHVwZGF0ZSBsb2NhbFN0b3JhZ2UgdG8gcmVmbGVjdCB0aGUgY2xlYXJlZCBzdG9yZSBzZWxlY3Rpb25cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gW107XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgIC8vIEVtaXQgZGF0YSB2aWEgc2VydmljZVxyXG4gICAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gQ2xlYXIgdGhlIHNlYXJjaCBzdG9yZSB0ZXh0IHdoZW4gZ3JvdXBzIGFyZSB1cGRhdGVkXHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gIH1cclxuICBcclxuXHJcbiAgUmVzZXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgLy8gQ2xlYXIgc2VsZWN0ZWQgZ3JvdXBzLCBzdG9yZXMsIGFuZCBsb2NhdGlvbnNcclxuICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gW11cclxuICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSBbXTsgLy8gUmVzZXQgbG9jYXRpb25zIGFzIHdlbGxcclxudGhpcy5sb2NhdGlvbnMgPVtdO3RoaXMuZ3JvdXBzRGF0YSA9W107IHRoaXMuc3RvcmVzID1bXTsgdGhpcy5jb3VudHJpZXMgPVtdO1xyXG4gIC8vIENsZWFyIHNlYXJjaCBpbnB1dCBmaWVsZHNcclxuICB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dCA9IFwiXCI7XHJcbiAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSBcIlwiO1xyXG4gIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gXCJcIjtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPVtdO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9W107XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPVtdO1xyXG5cclxuIFxyXG4gIC8vIEZldGNoIGxvY2F0aW9ucywgZ3JvdXBzLCBhbmQgc3RvcmVzIGFnYWluXHJcbiAgdGhpcy5nZXRDb3VudHJ5KCk7XHJcbiAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBSZXNldCB0aGUgZmlsdGVycyBpbiBzZWxlY3RlZEZpbHRlcnNcclxuXHJcblxyXG4gIC8vIC8vIE9uY2Ugc3RvcmVzIGFyZSBmZXRjaGVkLCBtYXJrIGFsbCBhcyBjaGVja2VkXHJcbiAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgLy8gICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgLy8gICAgIC4uLnN0b3JlLFxyXG4gIC8vICAgICBjaGVja2VkOiB0cnVlICAvLyBNYXJrIGFsbCBzdG9yZXMgYXMgY2hlY2tlZFxyXG4gIC8vICAgfSkpO1xyXG5cclxuICAvLyAgIC8vIFN5bmMgc2VsZWN0ZWRGaWx0ZXJzIHdpdGggdGhlIHVwZGF0ZWQgc3RvcmUgc3RhdGVcclxuICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgLy8gICAgIC4uLnN0b3JlLFxyXG4gIC8vICAgICBjaGVja2VkOiB0cnVlXHJcbiAgLy8gICB9KSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBsYXRlc3Qgc2VsZWN0ZWRGaWx0ZXJzXHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAvLyBFbWl0IHRoZSByZXNldCBmaWx0ZXJzIHRvIHVwZGF0ZSBvdGhlciBjb21wb25lbnRzIGlmIG5lZWRlZFxyXG4gICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgIC8vIEFkZGluZyBhIHNsaWdodCBkZWxheSB0byBlbnN1cmUgc3RvcmVzIGFyZSBmZXRjaGVkIGZpcnN0XHJcbiBcclxuICBcclxuICAgIC8vIENsb3NlIGRyb3Bkb3duIGFmdGVyIHJlc2V0IGlmIG5lY2Vzc2FyeVxyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9LDEwMClcclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgXHJcblxyXG4gIGZpbHRlckxvY2F0aW9ucygpOiB2b2lkIHsgICAgXHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hMb2NhdGlvblRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAubWFwKGxvY2F0aW9uID0+ICh7XHJcbiAgICAgICAgICAuLi5sb2NhdGlvbixcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZmluZChsID0+IGwuY2l0eSA9PT0gbG9jYXRpb24uY2l0eSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKGxvY2F0aW9uID0+XHJcbiAgICAgICAgICBsb2NhdGlvbj8uY2l0eT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMubWFwKGxvY2F0aW9uID0+ICh7XHJcbiAgICAgICAgLi4ubG9jYXRpb24sXHJcbiAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24uZmluZCgobDphbnkpID0+IGwuY2l0eSA9PT0gbG9jYXRpb24uY2l0eSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgZmlsdGVyR3JvdXBzKCk6IHZvaWQgeyAgXHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hHcm91cFRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhXHJcbiAgICAgICAgLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgICAgLi4uZ3JvdXAsXHJcbiAgICAgICAgICBjaGVja2VkOiB0aGlzLmZpbHRlcmVkR3JvdXBzLmZpbmQoZyA9PiBnLmdyb3VwTmFtZSA9PT0gZ3JvdXAuZ3JvdXBOYW1lKT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoZ3JvdXAgPT5cclxuICAgICAgICAgIGdyb3VwPy5ncm91cE5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGV4dClcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY2hlY2tlZCBzdGF0ZSB3aGVuIHNlYXJjaCB0ZXh0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YS5tYXAoZ3JvdXAgPT4gKHtcclxuICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cC5maW5kKChnOmFueSkgPT4gZy5ncm91cE5hbWUgPT09IGdyb3VwLmdyb3VwTmFtZSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBmaWx0ZXJTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hTdG9yZVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIC8vIFByZXNlcnZlIGNoZWNrZWQgc3RhdGVzIGR1cmluZyBmaWx0ZXJpbmdcclxuICAgIGlmIChzZWFyY2hUZXh0KSB7XHJcbiAgICAgIC8vIEZpbHRlciBiYXNlZCBvbiBzZWFyY2ggdGV4dCB3aGlsZSBwcmVzZXJ2aW5nIGNoZWNrZWQgc3RhdGVcclxuICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzXHJcbiAgICAgICAgLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RvcmUgaXMgYWxyZWFkeSBjaGVja2VkIGluIGZpbHRlcmVkU3RvcmVzLCBmYWxsYmFjayB0byBvcmlnaW5hbCBzdG9yZXMnIGNoZWNrZWQgc3RhdGVcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maW5kKChzOiBhbnkpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk/LmNoZWNrZWQgfHwgc3RvcmUuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoc3RvcmUgPT4gc3RvcmUuc3RvcmVOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGV4dCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV2hlbiB0aGUgc2VhcmNoIHRleHQgaXMgY2xlYXJlZCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbGlzdCB3aXRoIHByZXNlcnZlZCBjaGVja2VkIHN0YXRlc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGZpbHRlcnNcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmluZCgoczogYW55KSA9PiBzLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpPy5jaGVja2VkIHx8IHN0b3JlLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gbnVsbDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgY2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgXCIuZHJvcGRvd24tY29udGFpbmVyXCJcclxuICAgICk7XHJcbiAgICBjb25zdCBjbGlja2Vkb3V0U2lkZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXHJcbiAgICAgIFwiLmRyb3Bkb3duMlwiXHJcbiAgICApO1xyXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xyXG4gICAgfVxyXG4gICAgaWYoIWNsaWNrZWRvdXRTaWRlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bjEoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvLyBnZXRDb3VudHJ5KCk6IHZvaWQge1xyXG4gIC8vICAgLy8gY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgLy8gICBsZXQgb2JqID17XHJcbiAgLy8gICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXV0aC5nZXRDb3VudHJ5KG9iaikuc3Vic2NyaWJlKHtcclxuICAvLyAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgbGV0IGNvdW50cnlMaXN0ID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LmNvdW50cnk/LmZpbHRlcigoY291bnRyeTphbnkpID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKChsb2M6YW55KSA9PiBsb2MuYWxsQ291bnRyeSk7XHJcbiAgLy8gICAgICAgLy8gTWFwIHRoZSBmZXRjaGVkIGNvdW50cmllcyB3aXRoIGRlZmF1bHQgdW5jaGVja2VkIHN0YXRlXHJcbiAgLy8gICAgICAgdGhpcy5jb3VudGlyZXMgPSByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoYWxsQ291bnRyeTogYW55KSA9PiAoe1xyXG4gIC8vICAgICAgICAgYWxsQ291bnRyeTogYWxsQ291bnRyeS5hbGxDb3VudHJ5LFxyXG4gIC8vICAgICAgICAgY2hlY2tlZDogY291bnRyeUxpc3Q/LmluY2x1ZGVzKGFsbENvdW50cnkuYWxsQ291bnRyeSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgLy8gICAgICAgfSkpO1xyXG4gIFxyXG4gIC8vICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgY291bnRyaWVzIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAvLyAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkpKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXMubWFwKGNvdW50cnkgPT4ge1xyXG4gIC8vICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5LmZpbmQoKGxvYzogYW55KSA9PiBsb2MuYWxsQ291bnRyeSA9PT0gY291bnRyeS5hbGxDb3VudHJ5KTtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMb2NhdGlvbiA/IHsgLi4uY291bnRyeSwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGNvdW50cnk7XHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzO1xyXG4gIC8vICAgICAgIH1cclxuXHJcbiAgLy8gICAgICAgaWYodGhpcy5zZWFyY2hMb2NhdGlvblRleHQpIHtcclxuICAvLyAgICAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnk6YW55KSA9PiBjb3VudHJ5LmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnkpID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmFsbENvdW50cnkpO1xyXG4gIC8vICAgICAgIGlmIChzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpPT57XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZ2V0U3RvcmUoKTsgLy8gRmV0Y2ggc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gIC8vICAgICAgICAgfSwxMDAwKVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSxcclxuICAvLyAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAvLyAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIGNvdW50cmllc1wiLCBlcnIpO1xyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZWxlY3RlZENvdW50cmllc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuY291bnRyeUxhYmVsID0gdGhpcy5zZWFyY2hMb2NhdGlvblRleHQubGVuZ3RoID8gdGhpcy5jb3VudHJpZXNcclxuICAvLyAgICAgLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5hbGxDb3VudHJ5KSA6ICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzXHJcbiAgLy8gICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpLm1hcChjb3VudHJ5ID0+IGNvdW50cnkuYWxsQ291bnRyeSk7XHJcbiAgLy8gICByZXR1cm4gc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID09PSAwXHJcbiAgLy8gICAgID8gJydcclxuICAvLyAgICAgOiBzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPT09IDFcclxuICAvLyAgICAgPyBzZWxlY3RlZENvdW50cmllc1swXVxyXG4gIC8vICAgICA6IGAke3NlbGVjdGVkQ291bnRyaWVzLmxlbmd0aH0gY291bnRyaWVzYDtcclxuICAvLyB9XHJcblxyXG4gIC8vIGlzQWxsQ291bnRyaWVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5maWx0ZXJlZENvdW50cmllcy5ldmVyeShjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCk7XHJcblxyXG4gIC8vIH1cclxuICAvLyBmaWx0ZXJDb3VudHJpZXMoKTogdm9pZCB7ICAgIFxyXG4gIC8vICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoQ291bnRyeVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gIC8vICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAvLyAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gIC8vICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudGlyZXNcclxuICAvLyAgICAgICAubWFwKGNvdW50cnkgPT4gKHtcclxuICAvLyAgICAgICAgIC4uLmNvdW50cnksXHJcbiAgLy8gICAgICAgICBjaGVja2VkOiB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZpbmQobCA9PiBsLmFsbENvdW50cnkgPT09IGNvdW50cnkuYWxsQ291bnRyeSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAvLyAgICAgICB9KSlcclxuICAvLyAgICAgICAuZmlsdGVyKGxvY2F0aW9uID0+XHJcbiAgLy8gICAgICAgICBsb2NhdGlvbj8uYWxsQ291bnRyeT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gIC8vICAgICAgICk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gIC8vICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudGlyZXMubWFwKGNvdW50cnkgPT4gKHtcclxuICAvLyAgICAgICAuLi5jb3VudHJ5LFxyXG4gIC8vICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkuZmluZCgobDphbnkpID0+IGwuYWxsQ291bnRyeSA9PT0gY291bnRyeS5hbGxDb3VudHJ5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gIC8vICAgICB9KSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIFxyXG5cclxuICAgIGdldENvdW50cnkoKTogdm9pZCB7XHJcbiAgICBsZXQgb2JqID0ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID8gdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50IDogdGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAgIH07XHJcbiAgICBcclxuICAgIHRoaXMuYXV0aC5nZXRDb3VudHJ5KG9iaikuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gRXh0cmFjdCBzZWxlY3RlZCBjb3VudHJpZXMgZnJvbSBleGlzdGluZyBmaWx0ZXJzIChpZiBhbnkpXHJcbiAgICAgICAgbGV0IGNvdW50cnlMaXN0ID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LmNvdW50cnk/LmZpbHRlcigoY291bnRyeTogYW55KSA9PiBjb3VudHJ5LmNoZWNrZWQpLm1hcCgobG9jOiBhbnkpID0+IGxvYy5jb3VudHJ5KTtcclxuICBcclxuICAgICAgICAvLyBNYXAgQVBJIHJlc3BvbnNlIHRvIGZyb250ZW5kIG1vZGVsXHJcbiAgICAgICAgdGhpcy5jb3VudHJpZXMgPSByZXM/LmRhdGE/LmNvdW50cnlEYXRhLm1hcCgoaXRlbTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY291bnRyeTogaXRlbS5jb3VudHJ5LFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY291bnRyeUxpc3Q/Lmxlbmd0aCA/IGNvdW50cnlMaXN0LmluY2x1ZGVzKGl0ZW0uY291bnRyeSkgOiB0cnVlLFxyXG4gICAgICAgICAgLy8gY2hlY2tlZDogY2l0eUxpc3Q/Lmxlbmd0aCA/IGNpdHlMaXN0LmluY2x1ZGVzKGNpdHkuY2l0eSkgOiB0cnVlLFxyXG4gICAgICAgICAgY2hlY2tlZDogY291bnRyeUxpc3Q/LmluY2x1ZGVzKGl0ZW0uY291bnRyeSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgICBcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5KSkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLm1hcChsb2NhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMb2NhdGlvbiA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkuZmluZCgobG9jOiBhbnkpID0+IGxvYy5jb3VudHJ5ID09PSBsb2NhdGlvbi5jb3VudHJ5KTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRMb2NhdGlvbiA/IHsgLi4ubG9jYXRpb24sIGNoZWNrZWQ6IG1hdGNoZWRMb2NhdGlvbi5jaGVja2VkIH0gOiBsb2NhdGlvbjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzID0gdGhpcy5jb3VudHJpZXM7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGx5LCBhbGwgY291bnRyaWVzIGFyZSB2aXNpYmxlXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IFsuLi50aGlzLmNvdW50cmllc107XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIC8vIElmIGEgc2VhcmNoIHRleHQgYWxyZWFkeSBleGlzdHMsIGZpbHRlciBpbW1lZGlhdGVseVxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaENvdW50cnlUZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlckNvdW50cmllcygpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICAvLyBGZXRjaCBzdG9yZXMgaWYgYXQgbGVhc3Qgb25lIGNvdW50cnkgaXMgc2VsZWN0ZWRcclxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5maWx0ZXIoKGNvdW50cnkpID0+IGNvdW50cnkuY2hlY2tlZCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIGZldGNoIHN0b3Jlc1xyXG4gICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggY291bnRyaWVzXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzID0gdGhpcy5zZWFyY2hDb3VudHJ5VGV4dC5sZW5ndGhcclxuICAgICAgPyB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KVxyXG4gICAgICA6IHRoaXMuY291bnRyaWVzLmZpbHRlcihjb3VudHJ5ID0+IGNvdW50cnkuY2hlY2tlZCkubWFwKGNvdW50cnkgPT4gY291bnRyeS5jb3VudHJ5KTtcclxuICBcclxuICAgIHJldHVybiBzZWxlY3RlZENvdW50cmllcy5sZW5ndGggPT09IDBcclxuICAgICAgPyAnJ1xyXG4gICAgICA6IHNlbGVjdGVkQ291bnRyaWVzLmxlbmd0aCA9PT0gMVxyXG4gICAgICA/IHNlbGVjdGVkQ291bnRyaWVzWzBdXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RofSBjb3VudHJpZXNgO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQ291bnRyaWVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoQ291bnRyeVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gRmlsdGVyIGFuZCBwcmVzZXJ2ZSBjaGVja2VkIHN0YXRlXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMgPSB0aGlzLmNvdW50cmllc1xyXG4gICAgICAgIC5tYXAoY291bnRyeSA9PiAoe1xyXG4gICAgICAgICAgLi4uY291bnRyeSxcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZmluZChjID0+IGMuY291bnRyeSA9PT0gY291bnRyeS5jb3VudHJ5KT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoY291bnRyeSA9PiBjb3VudHJ5LmNvdW50cnkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXNldCB0byBmdWxsIGxpc3RcclxuICAgICAgdGhpcy5maWx0ZXJlZENvdW50cmllcyA9IHRoaXMuY291bnRyaWVzLm1hcCgoY291bnRyeTogQ291bnRyeSkgPT4gKHtcclxuICAgICAgICAuLi5jb3VudHJ5LFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnk/LmZpbmQoKGM6IGFueSkgPT4gYy5jb3VudHJ5ID09PSBjb3VudHJ5LmNvdW50cnkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQWxsQ291bnRyaWVzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENvdW50cmllcy5sZW5ndGggPiAwICYmIHRoaXMuZmlsdGVyZWRDb3VudHJpZXMuZXZlcnkoY291bnRyeSA9PiBjb3VudHJ5LmNoZWNrZWQpO1xyXG4gIH1cclxuICB0b2dnbGVTZWxlY3RBbGxDb3VudHJpZXMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ291bnRyaWVzLmZvckVhY2goKGNvdW50cnkpID0+IChjb3VudHJ5LmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb3VudHJpZXMoKTtcclxuICAgIFxyXG4gIH1cclxuICBcclxuICB1cGRhdGVTZWxlY3RlZENvdW50cmllcygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENvdW50cmllcyA9IHRoaXMuZmlsdGVyZWRDb3VudHJpZXNcclxuICAgICAgLmZpbHRlcigoY291bnRyeSkgPT4gY291bnRyeS5jaGVja2VkKVxyXG4gICAgICAubWFwKChjb3VudHJ5KSA9PiBjb3VudHJ5LmNvdW50cnkpO1xyXG4gICAgdGhpcy5maWx0ZXJlZENvdW50cmllcy5mb3JFYWNoKChjb3VudHJ5OmFueSkgPT4ge1xyXG4gICAgICBsZXQgZmluZENvdW50cnlJbmRleCA9IHRoaXMuY291bnRyaWVzLmZpbmRJbmRleCgobG9jOmFueSkgPT4gbG9jLmNvdW50cnkgPT0gY291bnRyeS5jb3VudHJ5KTtcclxuICAgICAgaWYoZmluZENvdW50cnlJbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuY291bnRyaWVzW2ZpbmRDb3VudHJ5SW5kZXhdLmNoZWNrZWQgPSBjb3VudHJ5LmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoID4gMCB8fCAhc2VsZWN0ZWRDb3VudHJpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAgIHRoaXMuZ3JvdXBzRGF0YSA9W11cclxuICAgICAgdGhpcy5sb2NhdGlvbnMgPVtdO1xyXG4gICAgICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gICAgICB0aGlzLmdldEdyb3VwcygpOyAvLyBGZXRjaCBncm91cHMgYmFzZWQgb24gc2VsZWN0ZWQgY2l0aWVzXHJcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBncm91cHMsIGZldGNoIHRoZSBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY291bnRyeSA9IHRoaXMuZmlsdGVyZWRDb3VudHJpZXM7XHJcbiAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNvdW50cnkgPSBbXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBbXTtcclxuICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTsgLy8gUmVzZXQgc3RvcmVzIGFzIHdlbGxcclxuICAgIHRoaXMuc2VhcmNoR3JvdXBUZXh0ID0gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gICAgLy8gdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNvdW50cnkoKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBBcHBseSgpOiB2b2lkIHtcclxuICAgIC8vIENsb3NlIHRoZSBkcm9wZG93blxyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICBcclxuICAgIC8vIEZldGNoIGV4aXN0aW5nIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSAgbnVsbFxyXG4gIFxyXG4gICAgLy8gRW5zdXJlIGN1cnJlbnQgc2VsZWN0aW9ucyBhcmUgcmVmbGVjdGVkXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jb3VudHJ5ID0gdGhpcy5maWx0ZXJlZENvdW50cmllcztcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnM7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IHRoaXMuZ3JvdXBzRGF0YTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IGhlYWRlckZpbHRlcnMuc3RvcmVzID8gaGVhZGVyRmlsdGVycy5zdG9yZXMgOiB0aGlzLnN0b3JlcztcclxuICAgIC8vIFN0b3JlIHVwZGF0ZWQgZmlsdGVycyBiYWNrIGluIGxvY2FsU3RvcmFnZVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBmaWx0ZXJzIHZpYSB0aGUgc2VydmljZVxyXG4gICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIC8vIFRyaWdnZXIgcmVmcmVzaCBpZiBuZWNlc3NhcnlcclxuICAgIC8vIHRoaXMuZ3MubWFuYWdlUmVmcmVzaFRyaWdnZXIubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBcclxuXHJcblxyXG59XHJcbmludGVyZmFjZSBDaXR5IHtcclxuICBjaXR5OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMb2NhdGlvbiB7XHJcbiAgY2l0eTogQ2l0eTtcclxuICBjaGVja2VkOiBib29sZWFuO1xyXG59XHJcbmludGVyZmFjZSBDb3VudHJ5IHtcclxuICBjb3VudHJ5OiBzdHJpbmc7XHJcbiAgY2hlY2tlZDogYm9vbGVhbjtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCJzZWxlY3RlZENvdW50cmllc0xhYmVsKClcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgbXgtMlwiPnt7c2VsZWN0ZWRDb3VudHJpZXNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVDb3VudHJ5KClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwoKVwiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yXCI+e3tzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUxvY2F0aW9uKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkR3JvdXBzTGFiZWwoKVwiICBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgbXgtMlwiPnt7c2VsZWN0ZWRHcm91cHNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVHcm91cCgpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8bGFiZWwgIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdFwiPnt7c2VsZWN0ZWRTdG9yZXNMYWJlbCgpfX08L2xhYmVsPlxyXG48L2Rpdj5cclxuXHJcblxyXG48ZGl2IGNsYXNzPVwid3JhcHBlciBtZS0zXCIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIj5cclxuPGxpYi1zZWxlY3QgW2l0ZW1zXT1cImNsaWVudExpc3RcIiBbbXVsdGldPVwiZmFsc2VcIiBbc2VhcmNoRmllbGRdPVwiJ2NsaWVudE5hbWUnXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW2lkRmllbGRdPVwiJ2NsaWVudElkJ1wiXHJcbihzZWxlY3RlZCk9XCJvbkNsaWVudFNlbGVjdCgkZXZlbnQpXCIgW3NlbGVjdGVkVmFsdWVzXT1cIltzZWxlY3RlZENsaWVudF1cIj48L2xpYi1zZWxlY3Q+XHJcbjwvZGl2PlxyXG48IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtcy0zXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTEzLjMzMzMgMS42NjY2M1Y0Ljk5OTk2TTYuNjY2NjcgMS42NjY2M1Y0Ljk5OTk2TTIuNSA4LjMzMzI5SDE3LjVNNC4xNjY2NyAzLjMzMzI5SDE1LjgzMzNDMTYuNzUzOCAzLjMzMzI5IDE3LjUgNC4wNzk0OCAxNy41IDQuOTk5OTZWMTYuNjY2NkMxNy41IDE3LjU4NzEgMTYuNzUzOCAxOC4zMzMzIDE1LjgzMzMgMTguMzMzM0g0LjE2NjY3QzMuMjQ2MTkgMTguMzMzMyAyLjUgMTcuNTg3MSAyLjUgMTYuNjY2NlY0Ljk5OTk2QzIuNSA0LjA3OTQ4IDMuMjQ2MTkgMy4zMzMyOSA0LjE2NjY3IDMuMzMzMjlaXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxpbnB1dCBjbGFzcz1cImZ4LWRhdGUtcmFuZ2UgZm9ybS1jb250cm9sIHBzLTE0XCIgc3R5bGU9XCJtaW4td2lkdGg6IDI2MHB4ICFpbXBvcnRhbnQ7XCIgdHlwZT1cInRleHRcIiBtYXRJbnB1dFxyXG4gICAgICAgIG5neERhdGVyYW5nZXBpY2tlck1kIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiIFtyYW5nZXNdPVwicmFuZ2VzXCIgW3Nob3dDdXN0b21SYW5nZUxhYmVsXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIlxyXG4gICAgICAgIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCIgW2tlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2VdPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cInRydWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWREYXRlUmFuZ2VcIiAoc3RhcnREYXRlQ2hhbmdlZCk9XCJvblN0YXJ0RGF0ZUNoYW5nZSgkZXZlbnQpXCIgW2lzQ3VzdG9tRGF0ZV09XCJpc0N1c3RvbURhdGVcIlxyXG4gICAgICAgIFtsb2NhbGVdPVwieyBmb3JtYXQ6ICdERC1NTS1ZWVlZJywgZmlyc3REYXk6IDEsIG1vbnRoTmFtZXM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddIH1cIlxyXG4gICAgICAgIChkYXRlc1VwZGF0ZWQpPVwiZGF0ZWNoYW5nZSgkZXZlbnQpXCIgbmFtZT1cImRhdGVyYW5nZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgLz5cclxuPC9kaXY+IC0tPlxyXG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuZHJvcGRvd24oJGV2ZW50KVwiICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBteC0yIHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1lLTJcIj5GaWx0ZXI8L3NwYW4+IC0tPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwbC0zXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgMTBIMTVNMi41IDVIMTcuNU03LjUgMTVIMTIuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiT3BlbmRyb3Bkb3duXCIgY2xhc3M9XCJjYXJkIHAtNSBkcm9wZG93bjIgcG9zaXRpb24tYWJzb2x1dGUgei0xIGVuZC0wXCIgc3R5bGU9XCJ6LWluZGV4OiAxICFpbXBvcnRhbnQ7XCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duMSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXRpdGxlIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+RmlsdGVyIE9wdGlvbnNcclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTI1IG1zLTMgYnRuLXJlc2l6ZVwiIChjbGljayk9XCJSZXNldCgpXCI+IFJlc2V0IDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMjUgIGJ0bi1yZXNpemVcIiAoY2xpY2spPVwiQXBwbHkoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgPCEtLSBDb3VudHJ5IERyb3Bkb3duIC0tPlxyXG48ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2NvdW50cnknKVwiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZHJvcGRvd24taW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkQ291bnRyaWVzTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGNvdW50cnlcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdjb3VudHJ5J1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2hcIiBcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY291bnRyeVwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaENvdW50cnlUZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNvdW50cmllcygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsQ291bnRyaWVzXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbENvdW50cmllc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsQ291bnRyaWVzKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbENvdW50cmllc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGZpbHRlcmVkQ291bnRyaWVzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgIFtpZF09XCJjb3VudHJ5LmNvdW50cnlcIiBcclxuICAgICAgICBbKG5nTW9kZWwpXT1cImNvdW50cnkuY2hlY2tlZFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZENvdW50cmllcygpXCIgXHJcbiAgICAgIC8+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImNvdW50cnkuY291bnRyeVwiPlxyXG4gICAgICAgIHt7IGNvdW50cnkuY291bnRyeSB9fVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiAgICAgPCEtLSBMb2NhdGlvbiBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ2xvY2F0aW9uJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZExvY2F0aW9uc0xhYmVsKClcIlxyXG4gICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBSZWdpb25cIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdsb2NhdGlvbidcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgZHJvcGRvd24tc2VhcmNoXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFJlZ2lvblwiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaExvY2F0aW9uVGV4dFwiIFxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJMb2NhdGlvbnMoKVwiIFxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMiBkcm9wZG93bi1pdGVtIGN1c3RvbS1kcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbExvY2F0aW9uc1wiIFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxMb2NhdGlvbnNTZWxlY3RlZCgpXCIgXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbExvY2F0aW9ucygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxMb2NhdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiIFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgZmlsdGVyZWRMb2NhdGlvbnNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIFtpZF09XCJsb2NhdGlvbi5jaXR5XCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxvY2F0aW9uLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImxvY2F0aW9uLmNpdHlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGxvY2F0aW9uLmNpdHkgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gR3JvdXAgRHJvcGRvd24gLS0+XHJcbjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgbXQtM1wiIChjbGlja091dHNpZGUpPVwiY2xvc2VEcm9wZG93bigpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCdncm91cCcpXCI+XHJcbiAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBkcm9wZG93bi1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRHcm91cHNMYWJlbCgpXCIgcmVhZG9ubHlcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgY2x1c3RlcnNcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGN1c3RvbS1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJkcm9wZG93bk9wZW4gPT09ICdncm91cCdcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgZHJvcGRvd24tc2VhcmNoXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNsdXN0ZXJzXCIgXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoR3JvdXBUZXh0XCIgXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckdyb3VwcygpXCIgXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yIGRyb3Bkb3duLWl0ZW0gY3VzdG9tLWRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsR3JvdXBzXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbEdyb3Vwc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsR3JvdXBzKCRldmVudClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbEdyb3Vwc1wiPlxyXG4gICAgICAgICAgICAgICAgU2VsZWN0IEFsbFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBmb3JtLWNoZWNrIGN1c3RvbS1kcm9wZG93bi1pdGVtXCIgXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBmaWx0ZXJlZEdyb3Vwc1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImdyb3VwLmdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZEdyb3VwcygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cImdyb3VwLmdyb3VwTmFtZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZ3JvdXAuZ3JvdXBOYW1lIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBTdG9yZSBEcm9wZG93biAtLT5cclxuPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBtdC0zXCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJ3N0b3JlJylcIj5cclxuICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGRyb3Bkb3duLWlucHV0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkU3RvcmVzTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHN0b3Jlc1wiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY3VzdG9tLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImRyb3Bkb3duT3BlbiA9PT0gJ3N0b3JlJ1wiPlxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWItMiBkcm9wZG93bi1zZWFyY2ggXCIgXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3Jlc1wiIFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0b3JlVGV4dFwiIFxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJTdG9yZXMoKVwiIFxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMiBkcm9wZG93bi1pdGVtIGN1c3RvbS1kcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbFN0b3Jlc1wiIFxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTdG9yZXNTZWxlY3RlZCgpXCIgXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbFN0b3JlcygkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxTdG9yZXNcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gZm9ybS1jaGVjayBjdXN0b20tZHJvcGRvd24taXRlbVwiIFxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RvcmUgb2YgZmlsdGVyZWRTdG9yZXNcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgIFtpZF09XCJzdG9yZS5zdG9yZUlkXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcmUuY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkU3RvcmVzKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwic3RvcmUuc3RvcmVJZFwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3RvcmUuc3RvcmVOYW1lIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|