ng-virtual-list 14.12.0 → 14.12.2
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/README.md +1 -11
- package/esm2020/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +309 -0
- package/{esm2022 → esm2020}/lib/components/ng-list-item/base/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-list-item/const/index.mjs +40 -40
- package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
- package/esm2020/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +200 -0
- package/{esm2022 → esm2020}/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/create-display-id.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/get-element-by-index.mjs +19 -19
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/index.mjs +4 -4
- package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/matrix-3d.mjs +12 -12
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +278 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.mjs +21 -21
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +94 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +20 -20
- package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +141 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/core/index.mjs +2 -2
- package/esm2020/lib/components/ng-prerender-container/core/prerender-track-box.mjs +201 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/events/index.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
- package/esm2020/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +90 -0
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/ng-prerender-container.module.mjs +20 -20
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/cache.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/const/index.mjs +8 -8
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/scrollbar-states.mjs +6 -6
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +27 -0
- package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +324 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.module.mjs +19 -19
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.service.mjs +38 -36
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/scrollbar-state.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +260 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/const/index.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-direction.mjs +11 -11
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-directions.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/index.mjs +3 -3
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
- package/esm2020/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +856 -0
- package/esm2020/lib/components/ng-scroll-view/utils/calculate-direction.mjs +17 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +11 -11
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/get-dir.mjs +9 -9
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/index.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/matrix-3d.mjs +9 -9
- package/esm2020/lib/components/ng-scroll-view/utils/scroll-box.mjs +45 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-direction.mjs +5 -5
- package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
- package/esm2020/lib/components/ng-scroller/ng-scroller.component.mjs +521 -0
- package/{esm2022 → esm2020}/lib/components/ng-scroller/ng-scroller.module.mjs +22 -22
- package/{esm2022 → esm2020}/lib/components/ng-scroller/utils/index.mjs +2 -2
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/interfaces/index.mjs +2 -0
- package/esm2020/lib/components/ng-scroller/utils/scroll-box.mjs +52 -0
- package/{esm2022 → esm2020}/lib/const/index.mjs +164 -164
- package/esm2020/lib/core/cache-map.mjs +100 -0
- package/{esm2022 → esm2020}/lib/core/const/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/enums/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/enums/item-display-methods.mjs +13 -13
- package/{esm2022 → esm2020}/lib/core/events/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/core/events/track-box-events.mjs +11 -11
- package/{esm2022 → esm2020}/lib/core/interfaces/get-item-position-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/get-metrics-returns.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/item.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/metrics.mjs +1 -1
- package/esm2020/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
- package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-returns.mjs +1 -1
- package/esm2020/lib/core/track-box.mjs +1352 -0
- package/esm2020/lib/core/tracker.mjs +209 -0
- package/{esm2022 → esm2020}/lib/core/types/cache-map-events.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/cache-map-listeners.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/cache.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/on-change-event-listener.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/types/on-tick-event-listener.mjs +1 -1
- package/{esm2022 → esm2020}/lib/core/utils/get-service-id-prop.mjs +9 -9
- package/{esm2022 → esm2020}/lib/core/utils/index.mjs +2 -2
- package/{esm2022 → esm2020}/lib/directives/index.mjs +3 -3
- package/esm2020/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +67 -0
- package/{esm2022 → esm2020}/lib/directives/locale-sensitive/locale-sensitive.module.mjs +19 -19
- package/esm2020/lib/directives/virtual-click/virtual-click.directive.mjs +66 -0
- package/{esm2022 → esm2020}/lib/directives/virtual-click/virtual-click.module.mjs +19 -19
- package/{esm2022 → esm2020}/lib/enums/alignments.mjs +11 -11
- package/{esm2022 → esm2020}/lib/enums/collapsing-modes.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/collection-modes.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/directions.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/focus-alignments.mjs +13 -13
- package/{esm2022 → esm2020}/lib/enums/index.mjs +11 -11
- package/{esm2022 → esm2020}/lib/enums/selecting-modes-types.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/selecting-modes.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/snap-to-item-aligns.mjs +21 -21
- package/{esm2022 → esm2020}/lib/enums/snapping-methods.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/spreading-modes.mjs +17 -17
- package/{esm2022 → esm2020}/lib/enums/text-directions.mjs +13 -13
- package/{esm2022 → esm2020}/lib/interfaces/animation-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/base-virtual-list-item-component.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/item-transformation.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/point.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/rect.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/render-stabilizer-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-event.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-options.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scroll-to-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/scrolling-settings.mjs +1 -1
- package/{esm2022 → esm2020}/lib/interfaces/size.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/collection.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/component.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/display-object-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/display-object-measures.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/item-config-map.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/item.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/render-collection.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/render-item-config.model.mjs +1 -1
- package/{esm2022 → esm2020}/lib/models/render-item-measures.model.mjs +2 -2
- package/{esm2022 → esm2020}/lib/models/render-item.model.mjs +2 -2
- package/esm2020/lib/ng-virtual-list-public.service.mjs +122 -0
- package/esm2020/lib/ng-virtual-list.component.mjs +3255 -0
- package/{esm2022 → esm2020}/lib/ng-virtual-list.module.mjs +23 -23
- package/esm2020/lib/ng-virtual-list.service.mjs +430 -0
- package/esm2020/lib/transformations/deck-of-cards-3d.mjs +57 -0
- package/esm2020/lib/transformations/deck-of-cards.mjs +54 -0
- package/esm2020/lib/transformations/event-horizon.mjs +47 -0
- package/{esm2022 → esm2020}/lib/transformations/index.mjs +12 -12
- package/esm2020/lib/transformations/linear.mjs +47 -0
- package/esm2020/lib/transformations/swipe-3d.mjs +51 -0
- package/{esm2022 → esm2020}/lib/types/alignment.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/arithmetic-expression.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/collapsing-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/collection-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/color.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/direction.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/float-or-persentage-value.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/focus-alignment.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/focus-item-params.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/gradient-color-position.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/gradient-color-positions.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/id.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/item-transform.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/scroll-direction.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/selecting-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snap-to-item-align.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snapping-distance.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/snapping-method.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/spreading-mode.mjs +1 -1
- package/{esm2022 → esm2020}/lib/types/text-direction.mjs +1 -1
- package/esm2020/lib/utils/animator/animator.mjs +80 -0
- package/{esm2022 → esm2020}/lib/utils/animator/const/index.mjs +1 -1
- package/{esm2022 → esm2020}/lib/utils/animator/ease.mjs +6 -6
- package/{esm2022 → esm2020}/lib/utils/animator/index.mjs +4 -4
- package/esm2020/lib/utils/animator/interfaces/animator-params.mjs +2 -0
- package/esm2020/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/animator/interfaces/index.mjs +1 -1
- package/esm2020/lib/utils/animator/types/easing.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/animator/types/index.mjs +1 -1
- package/esm2020/lib/utils/buffer-interpolation.mjs +29 -0
- package/esm2020/lib/utils/cmap.mjs +34 -0
- package/esm2020/lib/utils/debounce.mjs +61 -0
- package/esm2020/lib/utils/disposable-component.mjs +29 -0
- package/esm2020/lib/utils/event-emitter/event-emitter.mjs +106 -0
- package/{esm2022 → esm2020}/lib/utils/event-emitter/index.mjs +2 -2
- package/esm2020/lib/utils/event-emitter/interfaces/event-emitter.mjs +2 -0
- package/{esm2022 → esm2020}/lib/utils/event-emitter/interfaces/index.mjs +1 -1
- package/esm2020/lib/utils/get-scroll-state-version.mjs +12 -0
- package/{esm2022 → esm2020}/lib/utils/get-selector-by-item-id.mjs +4 -4
- package/{esm2022 → esm2020}/lib/utils/index.mjs +4 -4
- package/esm2020/lib/utils/is-collapse-mode.mjs +18 -0
- package/{esm2022 → esm2020}/lib/utils/is-collection-mode.mjs +15 -15
- package/esm2020/lib/utils/is-direction.mjs +15 -0
- package/esm2020/lib/utils/is-persentage-value.mjs +14 -0
- package/esm2020/lib/utils/is-select-mode.mjs +18 -0
- package/{esm2022 → esm2020}/lib/utils/is-spreading-mode.mjs +15 -15
- package/esm2020/lib/utils/list-validators.mjs +27 -0
- package/esm2020/lib/utils/normalize-collection.mjs +42 -0
- package/esm2020/lib/utils/object.mjs +28 -0
- package/esm2020/lib/utils/parse-arithmetic-expression.mjs +53 -0
- package/esm2020/lib/utils/parse-float-or-persentage-value.mjs +17 -0
- package/esm2020/lib/utils/screen-reader-formatter.mjs +43 -0
- package/esm2020/lib/utils/scroll-event.mjs +46 -0
- package/esm2020/lib/utils/scrolling-direction.mjs +28 -0
- package/{esm2022 → esm2020}/lib/utils/snapping-method.mjs +8 -8
- package/esm2020/lib/utils/toggle-class-name.mjs +15 -0
- package/{esm2022 → esm2020}/lib/utils/validation.mjs +55 -55
- package/{esm2022 → esm2020}/ng-virtual-list.mjs +4 -4
- package/{esm2022 → esm2020}/public-api.mjs +19 -19
- package/fesm2015/ng-virtual-list.mjs +10731 -0
- package/fesm2015/ng-virtual-list.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/ng-virtual-list.mjs +10451 -10455
- package/fesm2020/ng-virtual-list.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +83 -83
- package/lib/components/ng-list-item/base/index.d.ts +2 -2
- package/lib/components/ng-list-item/const/index.d.ts +3 -3
- package/lib/components/ng-list-item/interfaces/index.d.ts +2 -2
- package/lib/components/ng-list-item/interfaces/template-context.d.ts +42 -42
- package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +30 -30
- package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +9 -9
- package/lib/components/ng-list-item/utils/create-display-id.d.ts +7 -7
- package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -15
- package/lib/components/ng-list-item/utils/index.d.ts +4 -4
- package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -7
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +104 -104
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.d.ts +10 -10
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +17 -17
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +62 -62
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/core/index.d.ts +2 -2
- package/lib/components/ng-prerender-container/core/prerender-track-box.d.ts +35 -35
- package/lib/components/ng-prerender-container/events/index.d.ts +6 -6
- package/lib/components/ng-prerender-container/interfaces/index.d.ts +2 -2
- package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +17 -17
- package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +40 -40
- package/lib/components/ng-prerender-container/ng-prerender-container.module.d.ts +9 -9
- package/lib/components/ng-prerender-container/types/cache.d.ts +13 -13
- package/lib/components/ng-prerender-container/types/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/const/index.d.ts +3 -3
- package/lib/components/ng-scroll-bar/enums/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/enums/scrollbar-states.d.ts +5 -5
- package/lib/components/ng-scroll-bar/interfaces/index.d.ts +3 -3
- package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +26 -26
- package/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.d.ts +13 -13
- package/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.d.ts +16 -16
- package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +102 -102
- package/lib/components/ng-scroll-bar/ng-scroll-bar.module.d.ts +8 -8
- package/lib/components/ng-scroll-bar/ng-scroll-bar.service.d.ts +22 -22
- package/lib/components/ng-scroll-bar/types/index.d.ts +2 -2
- package/lib/components/ng-scroll-bar/types/scrollbar-state.d.ts +2 -2
- package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +89 -89
- package/lib/components/ng-scroll-view/const/index.d.ts +7 -7
- package/lib/components/ng-scroll-view/enums/index.d.ts +4 -4
- package/lib/components/ng-scroll-view/enums/scroller-direction.d.ts +10 -10
- package/lib/components/ng-scroll-view/enums/scroller-directions.d.ts +8 -8
- package/lib/components/ng-scroll-view/index.d.ts +5 -5
- package/lib/components/ng-scroll-view/interfaces/index.d.ts +2 -2
- package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +22 -22
- package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +124 -124
- package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +10 -7
- package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/index.d.ts +5 -5
- package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -7
- package/lib/components/ng-scroll-view/utils/scroll-box.d.ts +39 -39
- package/lib/components/ng-scroller/enums/index.d.ts +4 -4
- package/lib/components/ng-scroller/enums/scroller-direction.d.ts +4 -4
- package/lib/components/ng-scroller/enums/scroller-directions.d.ts +3 -3
- package/lib/components/ng-scroller/ng-scroller.component.d.ts +164 -164
- package/lib/components/ng-scroller/ng-scroller.module.d.ts +11 -11
- package/lib/components/ng-scroller/utils/index.d.ts +2 -2
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.d.ts +11 -0
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.d.ts +19 -0
- package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.d.ts +10 -0
- package/lib/components/ng-scroller/utils/interfaces/index.d.ts +4 -0
- package/lib/components/ng-scroller/utils/scroll-box.d.ts +23 -40
- package/lib/const/index.d.ts +153 -153
- package/lib/core/cache-map.d.ts +46 -46
- package/lib/core/const/index.d.ts +1 -1
- package/lib/core/enums/index.d.ts +2 -2
- package/lib/core/enums/item-display-methods.d.ts +12 -12
- package/lib/core/events/index.d.ts +2 -2
- package/lib/core/events/track-box-events.d.ts +10 -10
- package/lib/core/interfaces/get-item-position-options.d.ts +10 -10
- package/lib/core/interfaces/get-metrics-returns.d.ts +11 -11
- package/lib/core/interfaces/index.d.ts +8 -8
- package/lib/core/interfaces/item.d.ts +9 -9
- package/lib/core/interfaces/metrics.d.ts +51 -51
- package/lib/core/interfaces/recalculate-metrics-options.d.ts +33 -32
- package/lib/core/interfaces/update-collection-options.d.ts +10 -10
- package/lib/core/interfaces/update-collection-returns.d.ts +14 -14
- package/lib/core/track-box.d.ts +153 -153
- package/lib/core/tracker.d.ts +55 -55
- package/lib/core/types/cache-map-events.d.ts +8 -8
- package/lib/core/types/cache-map-listeners.d.ts +9 -9
- package/lib/core/types/cache.d.ts +12 -12
- package/lib/core/types/index.d.ts +6 -6
- package/lib/core/types/on-change-event-listener.d.ts +7 -7
- package/lib/core/types/on-tick-event-listener.d.ts +7 -7
- package/lib/core/utils/get-service-id-prop.d.ts +7 -7
- package/lib/core/utils/index.d.ts +2 -2
- package/lib/directives/index.d.ts +3 -3
- package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +29 -29
- package/lib/directives/locale-sensitive/locale-sensitive.module.d.ts +8 -8
- package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -22
- package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -8
- package/lib/enums/alignments.d.ts +10 -10
- package/lib/enums/collapsing-modes.d.ts +20 -20
- package/lib/enums/collection-modes.d.ts +16 -16
- package/lib/enums/directions.d.ts +16 -16
- package/lib/enums/focus-alignments.d.ts +12 -12
- package/lib/enums/index.d.ts +11 -11
- package/lib/enums/selecting-modes-types.d.ts +20 -20
- package/lib/enums/selecting-modes.d.ts +20 -20
- package/lib/enums/snap-to-item-aligns.d.ts +20 -20
- package/lib/enums/snapping-methods.d.ts +16 -16
- package/lib/enums/spreading-modes.d.ts +16 -16
- package/lib/enums/text-directions.d.ts +12 -12
- package/lib/interfaces/animation-params.d.ts +14 -14
- package/lib/interfaces/base-virtual-list-item-component.d.ts +23 -23
- package/lib/interfaces/index.d.ts +11 -11
- package/lib/interfaces/item-transformation.d.ts +22 -22
- package/lib/interfaces/point.d.ts +16 -16
- package/lib/interfaces/rect.d.ts +17 -17
- package/lib/interfaces/render-stabilizer-options.d.ts +12 -12
- package/lib/interfaces/scroll-event.d.ts +58 -58
- package/lib/interfaces/scroll-options.d.ts +28 -28
- package/lib/interfaces/scroll-params.d.ts +17 -17
- package/lib/interfaces/scroll-to-params.d.ts +7 -7
- package/lib/interfaces/scrolling-settings.d.ts +38 -38
- package/lib/interfaces/size.d.ts +16 -16
- package/lib/models/collection.model.d.ts +9 -9
- package/lib/models/component.model.d.ts +3 -3
- package/lib/models/display-object-config.model.d.ts +21 -21
- package/lib/models/display-object-measures.model.d.ts +45 -45
- package/lib/models/index.d.ts +9 -9
- package/lib/models/item-config-map.model.d.ts +35 -35
- package/lib/models/item.model.d.ts +17 -17
- package/lib/models/render-collection.model.d.ts +9 -9
- package/lib/models/render-item-config.model.d.ts +119 -119
- package/lib/models/render-item-measures.model.d.ts +116 -116
- package/lib/models/render-item.model.d.ts +40 -40
- package/lib/ng-virtual-list-public.service.d.ts +92 -92
- package/lib/ng-virtual-list.component.d.ts +771 -770
- package/lib/ng-virtual-list.module.d.ts +12 -12
- package/lib/ng-virtual-list.service.d.ts +153 -153
- package/lib/transformations/deck-of-cards-3d.d.ts +54 -54
- package/lib/transformations/deck-of-cards.d.ts +50 -50
- package/lib/transformations/event-horizon.d.ts +26 -26
- package/lib/transformations/index.d.ts +7 -7
- package/lib/transformations/linear.d.ts +26 -26
- package/lib/transformations/swipe-3d.d.ts +38 -38
- package/lib/types/alignment.d.ts +8 -8
- package/lib/types/arithmetic-expression.d.ts +10 -10
- package/lib/types/collapsing-mode.d.ts +8 -8
- package/lib/types/collection-mode.d.ts +8 -8
- package/lib/types/color.d.ts +4 -4
- package/lib/types/direction.d.ts +8 -8
- package/lib/types/float-or-persentage-value.d.ts +7 -7
- package/lib/types/focus-alignment.d.ts +8 -8
- package/lib/types/focus-item-params.d.ts +13 -13
- package/lib/types/gradient-color-position.d.ts +7 -7
- package/lib/types/gradient-color-positions.d.ts +8 -8
- package/lib/types/id.d.ts +7 -7
- package/lib/types/index.d.ts +20 -20
- package/lib/types/item-transform.d.ts +9 -9
- package/lib/types/scroll-direction.d.ts +8 -8
- package/lib/types/selecting-mode.d.ts +8 -8
- package/lib/types/snap-to-item-align.d.ts +8 -8
- package/lib/types/snapping-distance.d.ts +8 -8
- package/lib/types/snapping-method.d.ts +10 -10
- package/lib/types/spreading-mode.d.ts +8 -8
- package/lib/types/text-direction.d.ts +10 -10
- package/lib/utils/animator/animator.d.ts +16 -16
- package/lib/utils/animator/const/index.d.ts +1 -1
- package/lib/utils/animator/ease.d.ts +2 -2
- package/lib/utils/animator/index.d.ts +6 -6
- package/lib/utils/animator/interfaces/animator-params.d.ts +18 -18
- package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -13
- package/lib/utils/animator/interfaces/index.d.ts +3 -3
- package/lib/utils/animator/types/easing.d.ts +7 -7
- package/lib/utils/animator/types/index.d.ts +2 -2
- package/lib/utils/buffer-interpolation.d.ts +5 -5
- package/lib/utils/cmap.d.ts +16 -16
- package/lib/utils/debounce.d.ts +25 -25
- package/lib/utils/disposable-component.d.ts +15 -15
- package/lib/utils/event-emitter/event-emitter.d.ts +42 -42
- package/lib/utils/event-emitter/index.d.ts +4 -4
- package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +37 -37
- package/lib/utils/event-emitter/interfaces/index.d.ts +2 -2
- package/lib/utils/get-scroll-state-version.d.ts +1 -1
- package/lib/utils/get-selector-by-item-id.d.ts +2 -2
- package/lib/utils/index.d.ts +6 -6
- package/lib/utils/is-collapse-mode.d.ts +8 -8
- package/lib/utils/is-collection-mode.d.ts +8 -8
- package/lib/utils/is-direction.d.ts +8 -8
- package/lib/utils/is-persentage-value.d.ts +7 -7
- package/lib/utils/is-select-mode.d.ts +8 -8
- package/lib/utils/is-spreading-mode.d.ts +8 -8
- package/lib/utils/list-validators.d.ts +2 -2
- package/lib/utils/normalize-collection.d.ts +8 -8
- package/lib/utils/object.d.ts +4 -4
- package/lib/utils/parse-arithmetic-expression.d.ts +8 -8
- package/lib/utils/parse-float-or-persentage-value.d.ts +7 -7
- package/lib/utils/screen-reader-formatter.d.ts +7 -4
- package/lib/utils/scroll-event.d.ts +48 -48
- package/lib/utils/scrolling-direction.d.ts +17 -17
- package/lib/utils/snapping-method.d.ts +3 -3
- package/lib/utils/toggle-class-name.d.ts +7 -7
- package/lib/utils/validation.d.ts +35 -35
- package/package.json +11 -5
- package/public-api.d.ts +16 -16
- package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +0 -315
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +0 -200
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +0 -279
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +0 -94
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +0 -142
- package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +0 -198
- package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +0 -93
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +0 -25
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +0 -324
- package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +0 -262
- package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +0 -859
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +0 -17
- package/esm2022/lib/components/ng-scroll-view/utils/scroll-box.mjs +0 -45
- package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +0 -525
- package/esm2022/lib/components/ng-scroller/utils/scroll-box.mjs +0 -52
- package/esm2022/lib/core/cache-map.mjs +0 -101
- package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +0 -2
- package/esm2022/lib/core/track-box.mjs +0 -1353
- package/esm2022/lib/core/tracker.mjs +0 -207
- package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +0 -68
- package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +0 -67
- package/esm2022/lib/ng-virtual-list-public.service.mjs +0 -120
- package/esm2022/lib/ng-virtual-list.component.mjs +0 -3246
- package/esm2022/lib/ng-virtual-list.service.mjs +0 -431
- package/esm2022/lib/transformations/deck-of-cards-3d.mjs +0 -57
- package/esm2022/lib/transformations/deck-of-cards.mjs +0 -54
- package/esm2022/lib/transformations/event-horizon.mjs +0 -47
- package/esm2022/lib/transformations/linear.mjs +0 -47
- package/esm2022/lib/transformations/swipe-3d.mjs +0 -51
- package/esm2022/lib/utils/animator/animator.mjs +0 -78
- package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +0 -2
- package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +0 -2
- package/esm2022/lib/utils/animator/types/easing.mjs +0 -2
- package/esm2022/lib/utils/buffer-interpolation.mjs +0 -29
- package/esm2022/lib/utils/cmap.mjs +0 -34
- package/esm2022/lib/utils/debounce.mjs +0 -61
- package/esm2022/lib/utils/disposable-component.mjs +0 -27
- package/esm2022/lib/utils/event-emitter/event-emitter.mjs +0 -105
- package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +0 -2
- package/esm2022/lib/utils/get-scroll-state-version.mjs +0 -12
- package/esm2022/lib/utils/is-collapse-mode.mjs +0 -18
- package/esm2022/lib/utils/is-direction.mjs +0 -15
- package/esm2022/lib/utils/is-persentage-value.mjs +0 -14
- package/esm2022/lib/utils/is-select-mode.mjs +0 -18
- package/esm2022/lib/utils/list-validators.mjs +0 -27
- package/esm2022/lib/utils/normalize-collection.mjs +0 -42
- package/esm2022/lib/utils/object.mjs +0 -28
- package/esm2022/lib/utils/parse-arithmetic-expression.mjs +0 -53
- package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +0 -17
- package/esm2022/lib/utils/screen-reader-formatter.mjs +0 -43
- package/esm2022/lib/utils/scroll-event.mjs +0 -48
- package/esm2022/lib/utils/scrolling-direction.mjs +0 -29
- package/esm2022/lib/utils/toggle-class-name.mjs +0 -15
- package/fesm2022/ng-virtual-list.mjs.map +0 -1
|
@@ -0,0 +1,3255 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, inject, Input, Output, ViewChild, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest, debounceTime, delay, distinctUntilChanged, filter, fromEvent, map, of, skip, Subject, switchMap, take, takeUntil, tap, } from 'rxjs';
|
|
3
|
+
import { NgVirtualListItemComponent } from './components/ng-list-item/ng-virtual-list-item.component';
|
|
4
|
+
import { BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE, DEFAULT_ENABLED_BUFFER_OPTIMIZATION, DEFAULT_ITEM_SIZE, DEFAULT_BUFFER_SIZE, DEFAULT_LIST_SIZE, DEFAULT_STICKY_ENABLED, DEFAULT_SNAPPING_METHOD, HEIGHT_PROP_NAME, LEFT_PROP_NAME, MAX_SCROLL_TO_ITERATIONS, PX, FOCUS, TOP_PROP_NAME, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, DEFAULT_MAX_BUFFER_SIZE, DEFAULT_SELECTING_MODES, DEFAULT_SELECT_BY_CLICK, DEFAULT_COLLAPSE_BY_CLICK, DEFAULT_COLLECTION_MODE, DEFAULT_SCREEN_READER_MESSAGE, DEFAULT_SNAP_TO_END_TRANSITION_INSTANT_OFFSET, DEFAULT_SNAP_SCROLLTO_END, MIN_PIXELS_FOR_PREVENT_SNAPPING, MOUSE_DOWN, TOUCH_START, DEFAULT_LANG_TEXT_DIR, DEFAULT_CLICK_DISTANCE, DEFAULT_WAIT_FOR_PREPARATION, DEFAULT_SCROLLBAR_THICKNESS, DEFAULT_SCROLLBAR_MIN_SIZE, KEY_DOWN, BEHAVIOR_AUTO, DEFAULT_SCROLLBAR_ENABLED, DEFAULT_SCROLLBAR_INTERACTIVE, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_ANIMATION_PARAMS, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SNAP_SCROLLTO_START, EMPTY_SCROLL_STATE_VERSION, MAX_REGULAR_SNAPED_COMPONENTS, PREPARE_ITERATIONS, PREPARATION_REUPDATE_LENGTH, ROLE_LIST_BOX, ROLE_LIST, KEY_TAB, MAX_VELOCITY_FOR_SCROLL_QUALITY_OPTIMIZATION_LVL1, PREPARE_ITERATIONS_FOR_UPDATE_ITEMS, PREPARATION_REUPDATE_LENGTH_FOR_UPDATE_ITEMS, PREPARE_ITERATIONS_FOR_COLLAPSE_ITEMS, PREPARATION_REUPDATE_LENGTH_FOR_COLLAPSE_ITEMS, MAX_NUMBERS_OF_SKIPS_FOR_QUALITY_OPTIMIZATION_LVL1, DEFAULT_SCROLLING_SETTINGS, DEFAULT_SNAP_TO_ITEM, DEFAULT_SNAP_TO_ITEM_ALIGN, VIEWPORT, DEFAULT_MOTION_BLUR, DEFAULT_MAX_MOTION_BLUR, DEFAULT_SCROLLING_ONE_BY_ONE, DEFAULT_MOTION_BLUR_ENABLED, DEFAULT_DIVIDES, DEFAULT_SNAPPING_DISTANCE, DEFAULT_MAX_ITEM_SIZE, DEFAULT_MIN_ITEM_SIZE, DEFAULT_ALIGNMENT, DEFAULT_COLLAPSING_MODES, DEFAULT_SPREADING_MODE, DEFAULT_ZINDEX_WHEN_SELECTING, DEFAULT_OVERLAPPING_SCROLLBAR, } from './const';
|
|
5
|
+
import { Alignments, CollectionModes, Directions, FocusAlignments, SelectingModes, SnappingMethods, SnapToItemAligns, SpreadingModes, TextDirections, } from './enums';
|
|
6
|
+
import { debounce, ScrollEvent, toggleClassName } from './utils';
|
|
7
|
+
import { TrackBox } from './core/track-box';
|
|
8
|
+
import { isSnappingMethodAdvenced } from './utils/snapping-method';
|
|
9
|
+
import { isDirection } from './utils/is-direction';
|
|
10
|
+
import { NgVirtualListService } from './ng-virtual-list.service';
|
|
11
|
+
import { isSelectMode } from './utils/is-select-mode';
|
|
12
|
+
import { isCollapseMode } from './utils/is-collapse-mode';
|
|
13
|
+
import { SelectingModesTypes } from './enums/selecting-modes-types';
|
|
14
|
+
import { CMap } from './utils/cmap';
|
|
15
|
+
import { validateArray, validateBoolean, validateFloat, validateFunction, validateInt, validateObject, validateString, } from './utils/validation';
|
|
16
|
+
import { copyValueAsReadonly, objectAsReadonly } from './utils/object';
|
|
17
|
+
import { isCollectionMode } from './utils/is-collection-mode';
|
|
18
|
+
import { NgScrollerComponent } from './components/ng-scroller/ng-scroller.component';
|
|
19
|
+
import { NgPrerenderContainer } from './components/ng-prerender-container/ng-prerender-container.component';
|
|
20
|
+
import { formatActualDisplayItems, formatScreenReaderMessage } from './utils/screen-reader-formatter';
|
|
21
|
+
import { validateId, validateIteration, validateScrollBehavior, validateScrollIteration } from './utils/list-validators';
|
|
22
|
+
import { EVENT_KEY_DOWN, KEY_ARR_DOWN, KEY_ARR_LEFT, KEY_ARR_RIGHT, KEY_ARR_UP } from './components/ng-list-item/const';
|
|
23
|
+
import { NgVirtualListPublicService } from './ng-virtual-list-public.service';
|
|
24
|
+
import { isPercentageValue } from './utils/is-persentage-value';
|
|
25
|
+
import { parseArithmeticExpression } from './utils/parse-arithmetic-expression';
|
|
26
|
+
import { normalizeCollection } from './utils/normalize-collection';
|
|
27
|
+
import { CollapsingModes } from './enums';
|
|
28
|
+
import { isSpreadingMode } from './utils/is-spreading-mode';
|
|
29
|
+
import { getScrollStateVersion } from './utils/get-scroll-state-version';
|
|
30
|
+
import { DisposableComponent } from './utils/disposable-component';
|
|
31
|
+
import * as i0 from "@angular/core";
|
|
32
|
+
import * as i1 from "@angular/common";
|
|
33
|
+
import * as i2 from "./components/ng-scroller/ng-scroller.component";
|
|
34
|
+
import * as i3 from "./components/ng-prerender-container/ng-prerender-container.component";
|
|
35
|
+
import * as i4 from "./directives/locale-sensitive/locale-sensitive.directive";
|
|
36
|
+
/**
|
|
37
|
+
* Virtual list component.
|
|
38
|
+
* Maximum performance for extremely large lists.
|
|
39
|
+
* It is based on algorithms for virtualization of screen objects.
|
|
40
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/ng-virtual-list.component.ts
|
|
41
|
+
* @author Evgenii Alexandrovich Grebennikov
|
|
42
|
+
* @email djonnyx@gmail.com
|
|
43
|
+
*/
|
|
44
|
+
export class NgVirtualListComponent extends DisposableComponent {
|
|
45
|
+
constructor() {
|
|
46
|
+
super();
|
|
47
|
+
this._id = NgVirtualListComponent.__nextId;
|
|
48
|
+
this._service = inject(NgVirtualListService);
|
|
49
|
+
this._$scroller = new BehaviorSubject(undefined);
|
|
50
|
+
this.$scroller = this._$scroller.asObservable();
|
|
51
|
+
this._$list = new BehaviorSubject(undefined);
|
|
52
|
+
this.$list = this._$list.asObservable();
|
|
53
|
+
/**
|
|
54
|
+
* Fires when the list has been scrolled.
|
|
55
|
+
*/
|
|
56
|
+
this.onScroll = new EventEmitter();
|
|
57
|
+
/**
|
|
58
|
+
* Fires when the list has completed scrolling.
|
|
59
|
+
*/
|
|
60
|
+
this.onScrollEnd = new EventEmitter();
|
|
61
|
+
/**
|
|
62
|
+
* Fires when the viewport size is changed.
|
|
63
|
+
*/
|
|
64
|
+
this.onViewportChange = new EventEmitter();
|
|
65
|
+
/**
|
|
66
|
+
* Emit the component ID when an element crosses the alignment line specified by the snapToItemAlign property.
|
|
67
|
+
*/
|
|
68
|
+
this.onSnapItem = new EventEmitter();
|
|
69
|
+
/**
|
|
70
|
+
* Fires when an element is clicked.
|
|
71
|
+
*/
|
|
72
|
+
this.onItemClick = new EventEmitter();
|
|
73
|
+
/**
|
|
74
|
+
* Fires when elements are selected.
|
|
75
|
+
*/
|
|
76
|
+
this.onSelect = new EventEmitter();
|
|
77
|
+
/**
|
|
78
|
+
* Fires when elements are collapsed.
|
|
79
|
+
*/
|
|
80
|
+
this.onCollapse = new EventEmitter();
|
|
81
|
+
/**
|
|
82
|
+
* Fires when the scroll reaches the start.
|
|
83
|
+
*/
|
|
84
|
+
this.onScrollReachStart = new EventEmitter();
|
|
85
|
+
/**
|
|
86
|
+
* Fires when the scroll reaches the end.
|
|
87
|
+
*/
|
|
88
|
+
this.onScrollReachEnd = new EventEmitter();
|
|
89
|
+
this._$show = new BehaviorSubject(false);
|
|
90
|
+
this.$show = this._$show.asObservable();
|
|
91
|
+
this._$initialized = new BehaviorSubject(false);
|
|
92
|
+
this.$initialized = this._$initialized.asObservable();
|
|
93
|
+
this._$scrollbarThickness = new BehaviorSubject(DEFAULT_SCROLLBAR_THICKNESS);
|
|
94
|
+
this.$scrollbarThickness = this._$scrollbarThickness.asObservable();
|
|
95
|
+
this._scrollbarThicknessTransform = (v) => {
|
|
96
|
+
const valid = validateInt(v, true);
|
|
97
|
+
if (!valid) {
|
|
98
|
+
console.error('The "scrollbarThickness" parameter must be of type `number`.');
|
|
99
|
+
return DEFAULT_SCROLLBAR_THICKNESS;
|
|
100
|
+
}
|
|
101
|
+
return v;
|
|
102
|
+
};
|
|
103
|
+
this._$scrollbarMinSize = new BehaviorSubject(DEFAULT_SCROLLBAR_MIN_SIZE);
|
|
104
|
+
this.$scrollbarMinSize = this._$scrollbarMinSize.asObservable();
|
|
105
|
+
this._scrollbarMinSizeTransform = (v) => {
|
|
106
|
+
const valid = validateInt(v);
|
|
107
|
+
if (!valid) {
|
|
108
|
+
console.error('The "scrollbarMinSize" parameter must be of type `number`.');
|
|
109
|
+
return DEFAULT_SCROLLBAR_MIN_SIZE;
|
|
110
|
+
}
|
|
111
|
+
return v;
|
|
112
|
+
};
|
|
113
|
+
this._$scrollbarThumbRenderer = new BehaviorSubject(null);
|
|
114
|
+
this.$scrollbarThumbRenderer = this._$scrollbarThumbRenderer.asObservable();
|
|
115
|
+
this._scrollbarThumbRendererTransform = (v) => {
|
|
116
|
+
const valid = validateObject(v, true, true);
|
|
117
|
+
if (!valid) {
|
|
118
|
+
console.error('The "scrollbarThumbRenderer" parameter must be of type `object`.');
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return v;
|
|
122
|
+
};
|
|
123
|
+
this._$scrollbarThumbParams = new BehaviorSubject({});
|
|
124
|
+
this.$scrollbarThumbParams = this._$scrollbarThumbParams.asObservable();
|
|
125
|
+
this._scrollbarThumbParamsTransform = (v) => {
|
|
126
|
+
const valid = validateObject(v, true, true);
|
|
127
|
+
if (!valid) {
|
|
128
|
+
console.error('The "scrollbarThumbParams" parameter must be of type `object`.');
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return v;
|
|
132
|
+
};
|
|
133
|
+
this._loading = {
|
|
134
|
+
transform: (v) => {
|
|
135
|
+
const valid = validateBoolean(v);
|
|
136
|
+
if (!valid) {
|
|
137
|
+
console.error('The "loading" parameter must be of type `boolean`.');
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return v;
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
this._$loading = new BehaviorSubject(false);
|
|
144
|
+
this.$loading = this._$loading.asObservable();
|
|
145
|
+
this._loadingTransform = (v) => {
|
|
146
|
+
const valid = validateBoolean(v);
|
|
147
|
+
if (!valid) {
|
|
148
|
+
console.error('The "loading" parameter must be of type `boolean`.');
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return v;
|
|
152
|
+
};
|
|
153
|
+
this._$waitForPreparation = new BehaviorSubject(DEFAULT_WAIT_FOR_PREPARATION);
|
|
154
|
+
this.$waitForPreparation = this._$waitForPreparation.asObservable();
|
|
155
|
+
this._waitForPreparationTransform = (v) => {
|
|
156
|
+
const valid = validateObject(v);
|
|
157
|
+
if (!valid) {
|
|
158
|
+
console.error('The "waitForPreparation" parameter must be of type `boolean`.');
|
|
159
|
+
return DEFAULT_WAIT_FOR_PREPARATION;
|
|
160
|
+
}
|
|
161
|
+
return v;
|
|
162
|
+
};
|
|
163
|
+
this._$clickDistance = new BehaviorSubject(DEFAULT_CLICK_DISTANCE);
|
|
164
|
+
this.$clickDistance = this._$clickDistance.asObservable();
|
|
165
|
+
this._clickDistanceTransform = (v) => {
|
|
166
|
+
const valid = validateInt(v);
|
|
167
|
+
if (!valid) {
|
|
168
|
+
console.error('The "clickDistance" parameter must be of type `number`.');
|
|
169
|
+
return DEFAULT_CLICK_DISTANCE;
|
|
170
|
+
}
|
|
171
|
+
return v;
|
|
172
|
+
};
|
|
173
|
+
this._$items = new BehaviorSubject([]);
|
|
174
|
+
this.$items = this._$items.asObservable();
|
|
175
|
+
this._itemsTransform = (v) => {
|
|
176
|
+
let valid = validateArray(v, true, true);
|
|
177
|
+
if (valid) {
|
|
178
|
+
if (v) {
|
|
179
|
+
const trackBy = this.trackBy;
|
|
180
|
+
for (let i = 0, l = v.length; i < l; i++) {
|
|
181
|
+
const item = v[i];
|
|
182
|
+
valid = validateObject(item, true, true);
|
|
183
|
+
if (valid) {
|
|
184
|
+
if (item && !(validateFloat(item?.[trackBy], true) || validateString(item?.[trackBy], true, true))) {
|
|
185
|
+
valid = false;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!valid) {
|
|
193
|
+
console.error('The "items" parameter must be of type `IVirtualListCollection` or `null`.');
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
return v;
|
|
197
|
+
};
|
|
198
|
+
this._$selectedIds = new BehaviorSubject(null);
|
|
199
|
+
this.$selectedIds = this._$selectedIds.asObservable();
|
|
200
|
+
this._selectedIdsTransform = (v) => {
|
|
201
|
+
let valid = validateArray(v, true, true) || validateString(v, true, true) || validateFloat(v, true);
|
|
202
|
+
if (valid) {
|
|
203
|
+
if (v && Array.isArray(v)) {
|
|
204
|
+
for (let i = 0, l = v.length; i < l; i++) {
|
|
205
|
+
const item = v[i];
|
|
206
|
+
valid = validateString(item) || validateFloat(item);
|
|
207
|
+
if (!valid) {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!valid) {
|
|
214
|
+
console.error('The "selectedIds" parameter must be of type `Array<Id> | Id` or `null`.');
|
|
215
|
+
return this._isMultiSelection ? [] : null;
|
|
216
|
+
}
|
|
217
|
+
return v;
|
|
218
|
+
};
|
|
219
|
+
this._$defaultItemValue = new BehaviorSubject(null);
|
|
220
|
+
this.$defaultItemValue = this._$defaultItemValue.asObservable();
|
|
221
|
+
this._$collapsedIds = new BehaviorSubject([]);
|
|
222
|
+
this.$collapsedIds = this._$collapsedIds.asObservable();
|
|
223
|
+
this._collapsedIdsTransform = (v) => {
|
|
224
|
+
let valid = validateArray(v, true, true);
|
|
225
|
+
if (valid) {
|
|
226
|
+
if (v && Array.isArray(v)) {
|
|
227
|
+
for (let i = 0, l = v.length; i < l; i++) {
|
|
228
|
+
const item = v[i];
|
|
229
|
+
valid = validateString(item) || validateFloat(item);
|
|
230
|
+
if (!valid) {
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (!valid) {
|
|
237
|
+
console.error('The "collapsedIds" parameter must be of type `Array<Id>`.');
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
return v;
|
|
241
|
+
};
|
|
242
|
+
this._$selectByClick = new BehaviorSubject(DEFAULT_SELECT_BY_CLICK);
|
|
243
|
+
this.$selectByClick = this._$selectByClick.asObservable();
|
|
244
|
+
this._selectByClickTransform = (v) => {
|
|
245
|
+
const valid = validateBoolean(v);
|
|
246
|
+
if (!valid) {
|
|
247
|
+
console.error('The "selectByClick" parameter must be of type `boolean`.');
|
|
248
|
+
return DEFAULT_SELECT_BY_CLICK;
|
|
249
|
+
}
|
|
250
|
+
return v;
|
|
251
|
+
};
|
|
252
|
+
this._$collapseByClick = new BehaviorSubject(DEFAULT_COLLAPSE_BY_CLICK);
|
|
253
|
+
this.$collapseByClick = this._$collapseByClick.asObservable();
|
|
254
|
+
this._collapseByClickTransform = (v) => {
|
|
255
|
+
const valid = validateBoolean(v);
|
|
256
|
+
if (!valid) {
|
|
257
|
+
console.error('The "collapseByClick" parameter must be of type `boolean`.');
|
|
258
|
+
return DEFAULT_COLLAPSE_BY_CLICK;
|
|
259
|
+
}
|
|
260
|
+
return v;
|
|
261
|
+
};
|
|
262
|
+
this._$stickyEnabled = new BehaviorSubject(DEFAULT_STICKY_ENABLED);
|
|
263
|
+
this.$stickyEnabled = this._$stickyEnabled.asObservable();
|
|
264
|
+
this._stickyEnabledTransform = (v) => {
|
|
265
|
+
const valid = validateBoolean(v);
|
|
266
|
+
if (!valid) {
|
|
267
|
+
console.error('The "stickyEnabled" parameter must be of type `boolean`.');
|
|
268
|
+
return DEFAULT_STICKY_ENABLED;
|
|
269
|
+
}
|
|
270
|
+
return v;
|
|
271
|
+
};
|
|
272
|
+
this._$snapToEndTransitionInstantOffset = new BehaviorSubject(DEFAULT_SNAP_TO_END_TRANSITION_INSTANT_OFFSET);
|
|
273
|
+
this.$snapToEndTransitionInstantOffset = this._$snapToEndTransitionInstantOffset.asObservable();
|
|
274
|
+
this._snapToEndTransitionInstantOffsetTransform = (v) => {
|
|
275
|
+
const valid = validateFloat(v);
|
|
276
|
+
if (!valid) {
|
|
277
|
+
console.error('The "snapToEndTransitionInstantOffset" parameter must be of type `number`.');
|
|
278
|
+
return DEFAULT_SNAP_TO_END_TRANSITION_INSTANT_OFFSET;
|
|
279
|
+
}
|
|
280
|
+
return v;
|
|
281
|
+
};
|
|
282
|
+
this._$scrollStartOffset = new BehaviorSubject(0);
|
|
283
|
+
this.$scrollStartOffset = this._$scrollStartOffset.asObservable();
|
|
284
|
+
this._scrollStartOffsetTransform = (v) => {
|
|
285
|
+
const valid = validateFloat(v, true) || isPercentageValue(v);
|
|
286
|
+
if (!valid) {
|
|
287
|
+
console.error('The "scrollStartOffset" parameter must be one of type `number` or `string`.');
|
|
288
|
+
return 0;
|
|
289
|
+
}
|
|
290
|
+
return v;
|
|
291
|
+
};
|
|
292
|
+
this._$scrollEndOffset = new BehaviorSubject(0);
|
|
293
|
+
this.$scrollEndOffset = this._$scrollEndOffset.asObservable();
|
|
294
|
+
this._scrollEndOffsetTransform = (v) => {
|
|
295
|
+
const valid = validateFloat(v, true) || isPercentageValue(v);
|
|
296
|
+
if (!valid) {
|
|
297
|
+
console.error('The "scrollEndOffset" parameter must be one of type `number` or `string`.');
|
|
298
|
+
return 0;
|
|
299
|
+
}
|
|
300
|
+
return v;
|
|
301
|
+
};
|
|
302
|
+
this._$snapScrollToStart = new BehaviorSubject(DEFAULT_SNAP_SCROLLTO_START);
|
|
303
|
+
this.$snapScrollToStart = this._$snapScrollToStart.asObservable();
|
|
304
|
+
this._snapScrollToStartTransform = (v) => {
|
|
305
|
+
const valid = validateBoolean(v, true);
|
|
306
|
+
if (!valid) {
|
|
307
|
+
console.error('The "snapScrollToStart" parameter must be of type `boolean`.');
|
|
308
|
+
return DEFAULT_SNAP_SCROLLTO_START;
|
|
309
|
+
}
|
|
310
|
+
return v;
|
|
311
|
+
};
|
|
312
|
+
this._$snapScrollToEnd = new BehaviorSubject(DEFAULT_SNAP_SCROLLTO_END);
|
|
313
|
+
this.$snapScrollToEnd = this._$snapScrollToEnd.asObservable();
|
|
314
|
+
this._snapScrollToEndTransform = (v) => {
|
|
315
|
+
const valid = validateBoolean(v, true);
|
|
316
|
+
if (!valid) {
|
|
317
|
+
console.error('The "snapScrollToEnd" parameter must be of type `boolean`.');
|
|
318
|
+
return DEFAULT_SNAP_SCROLLTO_END;
|
|
319
|
+
}
|
|
320
|
+
return v;
|
|
321
|
+
};
|
|
322
|
+
this._$scrollbarEnabled = new BehaviorSubject(DEFAULT_SCROLLBAR_ENABLED);
|
|
323
|
+
this.$scrollbarEnabled = this._$scrollbarEnabled.asObservable();
|
|
324
|
+
this._scrollbarEnabledTransform = (v) => {
|
|
325
|
+
const valid = validateBoolean(v, true);
|
|
326
|
+
if (!valid) {
|
|
327
|
+
console.error('The "scrollbarEnabled" parameter must be of type `boolean`.');
|
|
328
|
+
return DEFAULT_SCROLLBAR_ENABLED;
|
|
329
|
+
}
|
|
330
|
+
return v;
|
|
331
|
+
};
|
|
332
|
+
this._$scrollbarInteractive = new BehaviorSubject(DEFAULT_SCROLLBAR_INTERACTIVE);
|
|
333
|
+
this.$scrollbarInteractive = this._$scrollbarInteractive.asObservable();
|
|
334
|
+
this._scrollbarInteractiveTransform = (v) => {
|
|
335
|
+
const valid = validateBoolean(v, true);
|
|
336
|
+
if (!valid) {
|
|
337
|
+
console.error('The "scrollbarInteractive" parameter must be of type `boolean`.');
|
|
338
|
+
return DEFAULT_SCROLLBAR_INTERACTIVE;
|
|
339
|
+
}
|
|
340
|
+
return v;
|
|
341
|
+
};
|
|
342
|
+
this._$overlappingScrollbar = new BehaviorSubject(DEFAULT_OVERLAPPING_SCROLLBAR);
|
|
343
|
+
this.$overlappingScrollbar = this._$overlappingScrollbar.asObservable();
|
|
344
|
+
this._overlappingScrollbarTransform = (v) => {
|
|
345
|
+
const valid = validateBoolean(v, true);
|
|
346
|
+
if (!valid) {
|
|
347
|
+
console.error('The "overlappingScrollbar" parameter must be of type `boolean`.');
|
|
348
|
+
return DEFAULT_OVERLAPPING_SCROLLBAR;
|
|
349
|
+
}
|
|
350
|
+
return v;
|
|
351
|
+
};
|
|
352
|
+
this._$scrollBehavior = new BehaviorSubject(DEFAULT_SCROLL_BEHAVIOR);
|
|
353
|
+
this.$scrollBehavior = this._$scrollBehavior.asObservable();
|
|
354
|
+
this._scrollBehaviorTransform = (v) => {
|
|
355
|
+
const valid = validateString(v, true, true);
|
|
356
|
+
if (!valid) {
|
|
357
|
+
console.error('The "scrollBehavior" parameter must be of type `boolean`.');
|
|
358
|
+
return DEFAULT_SCROLL_BEHAVIOR;
|
|
359
|
+
}
|
|
360
|
+
return v;
|
|
361
|
+
};
|
|
362
|
+
this._$scrollingSettings = new BehaviorSubject(DEFAULT_SCROLLING_SETTINGS);
|
|
363
|
+
this.$scrollingSettings = this._$scrollingSettings.asObservable();
|
|
364
|
+
this._scrollingSettingsTransform = (v) => {
|
|
365
|
+
let valid = validateObject(v, true, true);
|
|
366
|
+
if (valid && !!v) {
|
|
367
|
+
const { frictionalForce, mass, maxDistance, maxDuration, speedScale, optimization } = v;
|
|
368
|
+
valid = validateFloat(frictionalForce, true);
|
|
369
|
+
if (!valid) {
|
|
370
|
+
console.error('The "frictionalForce" parameter must be of type `number` or `undefined`.');
|
|
371
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
372
|
+
}
|
|
373
|
+
valid = validateFloat(mass, true);
|
|
374
|
+
if (!valid) {
|
|
375
|
+
console.error('The "mass" parameter must be of type `number` or `undefined`.');
|
|
376
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
377
|
+
}
|
|
378
|
+
valid = validateFloat(maxDistance, true);
|
|
379
|
+
if (!valid) {
|
|
380
|
+
console.error('The "maxDistance" parameter must be of type `number` or `undefined`.');
|
|
381
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
382
|
+
}
|
|
383
|
+
valid = validateFloat(maxDuration, true);
|
|
384
|
+
if (!valid) {
|
|
385
|
+
console.error('The "maxDuration" parameter must be of type `number` or `undefined`.');
|
|
386
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
387
|
+
}
|
|
388
|
+
valid = validateFloat(speedScale, true);
|
|
389
|
+
if (!valid) {
|
|
390
|
+
console.error('The "speedScale" parameter must be of type `number` or `undefined`.');
|
|
391
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
392
|
+
}
|
|
393
|
+
valid = validateBoolean(optimization, true);
|
|
394
|
+
if (!valid) {
|
|
395
|
+
console.error('The "optimization" parameter must be of type `boolean` or `undefined`.');
|
|
396
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (!valid) {
|
|
400
|
+
console.error('The "scrollingSettings" parameter must be of type `object` or null.');
|
|
401
|
+
return DEFAULT_SCROLLING_SETTINGS;
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
frictionalForce: v.frictionalForce !== undefined && v.frictionalForce > 0 ? v.frictionalForce : DEFAULT_SCROLLING_SETTINGS.frictionalForce,
|
|
405
|
+
mass: v.mass !== undefined && v.mass > 0 ? v.mass : DEFAULT_SCROLLING_SETTINGS.mass,
|
|
406
|
+
maxDistance: v.maxDistance !== undefined && v.maxDistance > 0 ? v.maxDistance : DEFAULT_SCROLLING_SETTINGS.maxDistance,
|
|
407
|
+
maxDuration: v.maxDuration !== undefined && v.maxDuration > 0 ? v.maxDuration : DEFAULT_SCROLLING_SETTINGS.maxDuration,
|
|
408
|
+
speedScale: v.speedScale !== undefined && v.speedScale > 0 ? v.speedScale : DEFAULT_SCROLLING_SETTINGS.speedScale,
|
|
409
|
+
optimization: v.optimization ?? DEFAULT_SCROLLING_SETTINGS.optimization,
|
|
410
|
+
};
|
|
411
|
+
};
|
|
412
|
+
this._$itemTransform = new BehaviorSubject(null);
|
|
413
|
+
this.$itemTransform = this._$itemTransform.asObservable();
|
|
414
|
+
this._itemTransformTransform = (v) => {
|
|
415
|
+
let valid = validateFunction(v, true, true);
|
|
416
|
+
if (!valid) {
|
|
417
|
+
console.error('The "itemTransform" parameter must be of type `ItemTransform` or `null`.');
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
return v;
|
|
421
|
+
};
|
|
422
|
+
this._$snapToItem = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM);
|
|
423
|
+
this.$snapToItem = this._$snapToItem.asObservable();
|
|
424
|
+
this._snapToItemTransform = (v) => {
|
|
425
|
+
const valid = validateBoolean(v);
|
|
426
|
+
if (!valid) {
|
|
427
|
+
console.error('The "snapToItem" parameter must be of type `boolean`.');
|
|
428
|
+
return DEFAULT_SNAP_TO_ITEM;
|
|
429
|
+
}
|
|
430
|
+
return v;
|
|
431
|
+
};
|
|
432
|
+
this._$snapToItemAlign = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM_ALIGN);
|
|
433
|
+
this.$snapToItemAlign = this._$snapToItemAlign.asObservable();
|
|
434
|
+
this._snapToItemAlignTransform = (v) => {
|
|
435
|
+
const valid = validateString(v) && (v === 'start' || v === 'center' || v === 'end');
|
|
436
|
+
if (!valid) {
|
|
437
|
+
console.error('The "snapToItemAlign" parameter must be one of `start`, `center` or `end`.');
|
|
438
|
+
return DEFAULT_SNAP_TO_ITEM_ALIGN;
|
|
439
|
+
}
|
|
440
|
+
return v;
|
|
441
|
+
};
|
|
442
|
+
this._$snappingDistance = new BehaviorSubject(DEFAULT_SNAPPING_DISTANCE);
|
|
443
|
+
this.$snappingDistance = this._$snappingDistance.asObservable();
|
|
444
|
+
this._snappingDistanceTransform = (v) => {
|
|
445
|
+
const valid = validateString(v) || validateFloat(v);
|
|
446
|
+
if (!valid) {
|
|
447
|
+
console.error('The "snappingDistance" parameter must be of type `number` or `string`.');
|
|
448
|
+
return DEFAULT_SNAPPING_DISTANCE;
|
|
449
|
+
}
|
|
450
|
+
return v;
|
|
451
|
+
};
|
|
452
|
+
this._$scrollingOneByOne = new BehaviorSubject(DEFAULT_SCROLLING_ONE_BY_ONE);
|
|
453
|
+
this.$scrollingOneByOne = this._$scrollingOneByOne.asObservable();
|
|
454
|
+
this._scrollingOneByOneTransform = (v) => {
|
|
455
|
+
const valid = validateBoolean(v);
|
|
456
|
+
if (!valid) {
|
|
457
|
+
console.error('The "scrollingOneByOne" parameter must be of type `boolean`.');
|
|
458
|
+
return DEFAULT_SCROLLING_ONE_BY_ONE;
|
|
459
|
+
}
|
|
460
|
+
return v;
|
|
461
|
+
};
|
|
462
|
+
this._$alignment = new BehaviorSubject(DEFAULT_ALIGNMENT);
|
|
463
|
+
this.$alignment = this._$alignment.asObservable();
|
|
464
|
+
this._alignmentTransform = (v) => {
|
|
465
|
+
const valid = validateString(v) && (v === 'none' || v === 'center');
|
|
466
|
+
if (!valid) {
|
|
467
|
+
console.error('The "alignment" parameter must be one of `none` or `centert`.');
|
|
468
|
+
return DEFAULT_ALIGNMENT;
|
|
469
|
+
}
|
|
470
|
+
return v;
|
|
471
|
+
};
|
|
472
|
+
this._$zIndexWhenSelecting = new BehaviorSubject(DEFAULT_ZINDEX_WHEN_SELECTING);
|
|
473
|
+
this.$zIndexWhenSelecting = this._$zIndexWhenSelecting.asObservable();
|
|
474
|
+
this._zIndexWhenSelectingTransform = (v) => {
|
|
475
|
+
const valid = validateString(v, true, true);
|
|
476
|
+
if (!valid) {
|
|
477
|
+
console.error('The "zIndexWhenSelecting" parameter must be of type `number` or `null`.');
|
|
478
|
+
return DEFAULT_ZINDEX_WHEN_SELECTING;
|
|
479
|
+
}
|
|
480
|
+
return v ?? null;
|
|
481
|
+
};
|
|
482
|
+
this._$spreadingMode = new BehaviorSubject(DEFAULT_SPREADING_MODE);
|
|
483
|
+
this.$spreadingMode = this._$spreadingMode.asObservable();
|
|
484
|
+
this._spreadingModeTransform = (v) => {
|
|
485
|
+
const valid = validateString(v) && (v === 'normal' || v === 'infinity');
|
|
486
|
+
if (!valid) {
|
|
487
|
+
console.error('The "spreadingMode" parameter must be one of `normal` or `infinity`.');
|
|
488
|
+
return DEFAULT_SPREADING_MODE;
|
|
489
|
+
}
|
|
490
|
+
return v;
|
|
491
|
+
};
|
|
492
|
+
this._$divides = new BehaviorSubject(DEFAULT_DIVIDES);
|
|
493
|
+
this.$divides = this._$divides.asObservable();
|
|
494
|
+
this._dividesTransform = (v) => {
|
|
495
|
+
const valid = validateFloat(v);
|
|
496
|
+
if (!valid) {
|
|
497
|
+
console.error('The "divides" parameter must be of type `number`.');
|
|
498
|
+
return DEFAULT_DIVIDES;
|
|
499
|
+
}
|
|
500
|
+
return v <= 0 ? DEFAULT_DIVIDES : v;
|
|
501
|
+
};
|
|
502
|
+
this._$motionBlur = new BehaviorSubject(DEFAULT_MOTION_BLUR);
|
|
503
|
+
this.$motionBlur = this._$motionBlur.asObservable();
|
|
504
|
+
this._motionBlurTransform = (v) => {
|
|
505
|
+
const valid = validateFloat(v);
|
|
506
|
+
if (!valid) {
|
|
507
|
+
console.error('The "motionBlur" parameter must be of type `number`.');
|
|
508
|
+
return DEFAULT_DIVIDES;
|
|
509
|
+
}
|
|
510
|
+
return v <= 0 ? DEFAULT_DIVIDES : v;
|
|
511
|
+
};
|
|
512
|
+
this._$maxMotionBlur = new BehaviorSubject(DEFAULT_MAX_MOTION_BLUR);
|
|
513
|
+
this.$maxMotionBlur = this._$maxMotionBlur.asObservable();
|
|
514
|
+
this._maxMotionBlurTransform = (v) => {
|
|
515
|
+
const valid = validateFloat(v);
|
|
516
|
+
if (!valid) {
|
|
517
|
+
console.error('The "maxMotionBlur" parameter must be of type `number`.');
|
|
518
|
+
return DEFAULT_MAX_MOTION_BLUR;
|
|
519
|
+
}
|
|
520
|
+
return v <= 0 ? DEFAULT_MAX_MOTION_BLUR : v;
|
|
521
|
+
};
|
|
522
|
+
this._$motionBlurEnabled = new BehaviorSubject(DEFAULT_MOTION_BLUR_ENABLED);
|
|
523
|
+
this.$motionBlurEnabled = this._$motionBlurEnabled.asObservable();
|
|
524
|
+
this._motionBlurEnabledTransform = (v) => {
|
|
525
|
+
const valid = validateBoolean(v);
|
|
526
|
+
if (!valid) {
|
|
527
|
+
console.error('The "motionBlurEnabled" parameter must be of type `boolean`.');
|
|
528
|
+
return DEFAULT_MOTION_BLUR_ENABLED;
|
|
529
|
+
}
|
|
530
|
+
return v;
|
|
531
|
+
};
|
|
532
|
+
this._$animationParams = new BehaviorSubject(DEFAULT_ANIMATION_PARAMS);
|
|
533
|
+
this.$animationParams = this._$animationParams.asObservable();
|
|
534
|
+
this._animationParamsTransform = (v) => {
|
|
535
|
+
const valid = validateObject(v, true, true);
|
|
536
|
+
if (!validateFloat(v.scrollToItem)) {
|
|
537
|
+
console.error('The "scrollToItem" parameter must be of type `number`.');
|
|
538
|
+
return DEFAULT_ANIMATION_PARAMS;
|
|
539
|
+
}
|
|
540
|
+
if (!validateFloat(v.snapToItem)) {
|
|
541
|
+
console.error('The "snapToItem" parameter must be of type `number`.');
|
|
542
|
+
return DEFAULT_ANIMATION_PARAMS;
|
|
543
|
+
}
|
|
544
|
+
if (!validateFloat(v.navigateByKeyboard)) {
|
|
545
|
+
console.error('The "navigateByKeyboard" parameter must be of type `number`.');
|
|
546
|
+
return DEFAULT_ANIMATION_PARAMS;
|
|
547
|
+
}
|
|
548
|
+
if (!validateFloat(v.navigateToItem)) {
|
|
549
|
+
console.error('The "navigateToItem" parameter must be of type `number`.');
|
|
550
|
+
return DEFAULT_ANIMATION_PARAMS;
|
|
551
|
+
}
|
|
552
|
+
if (!valid) {
|
|
553
|
+
console.error('The "animationParams" parameter must be of type `object`.');
|
|
554
|
+
return DEFAULT_ANIMATION_PARAMS;
|
|
555
|
+
}
|
|
556
|
+
return v;
|
|
557
|
+
};
|
|
558
|
+
this._$overscrollEnabled = new BehaviorSubject(DEFAULT_OVERSCROLL_ENABLED);
|
|
559
|
+
this.$overscrollEnabled = this._$overscrollEnabled.asObservable();
|
|
560
|
+
this._overscrollEnabledTransform = (v) => {
|
|
561
|
+
const valid = validateBoolean(v, true);
|
|
562
|
+
if (!valid) {
|
|
563
|
+
console.error('The "overscrollEnabled" parameter must be of type `boolean`.');
|
|
564
|
+
return DEFAULT_OVERSCROLL_ENABLED;
|
|
565
|
+
}
|
|
566
|
+
return v;
|
|
567
|
+
};
|
|
568
|
+
this._$enabledBufferOptimization = new BehaviorSubject(DEFAULT_ENABLED_BUFFER_OPTIMIZATION);
|
|
569
|
+
this.$enabledBufferOptimization = this._$enabledBufferOptimization.asObservable();
|
|
570
|
+
this._enabledBufferOptimizationTransform = (v) => {
|
|
571
|
+
const valid = validateBoolean(v);
|
|
572
|
+
if (!valid) {
|
|
573
|
+
console.error('The "enabledBufferOptimization" parameter must be of type `boolean`.');
|
|
574
|
+
return DEFAULT_ENABLED_BUFFER_OPTIMIZATION;
|
|
575
|
+
}
|
|
576
|
+
return v;
|
|
577
|
+
};
|
|
578
|
+
this._$itemRenderer = new BehaviorSubject(undefined);
|
|
579
|
+
this.$itemRenderer = this._$itemRenderer.asObservable();
|
|
580
|
+
this._itemRendererTransform = (v) => {
|
|
581
|
+
let valid = validateObject(v);
|
|
582
|
+
if (v && !(typeof v.elementRef === 'object' && typeof v.createEmbeddedView === 'function')) {
|
|
583
|
+
valid = false;
|
|
584
|
+
}
|
|
585
|
+
if (!valid) {
|
|
586
|
+
throw Error('The "itemRenderer" parameter must be of type `TemplateRef`.');
|
|
587
|
+
}
|
|
588
|
+
return v;
|
|
589
|
+
};
|
|
590
|
+
this._$itemConfigMap = new BehaviorSubject({});
|
|
591
|
+
this.$itemConfigMap = this._$itemConfigMap.asObservable();
|
|
592
|
+
this._itemConfigMapTransform = (v) => {
|
|
593
|
+
let valid = validateObject(v);
|
|
594
|
+
if (valid) {
|
|
595
|
+
if (v) {
|
|
596
|
+
for (let id in v) {
|
|
597
|
+
const item = v[id];
|
|
598
|
+
if (!item ||
|
|
599
|
+
!validateBoolean(item.collapsable, true) ||
|
|
600
|
+
!validateBoolean(item.selectable, true) ||
|
|
601
|
+
!(item.sticky === undefined || item.sticky === 0 || item.sticky === 1 || item.sticky === 2)) {
|
|
602
|
+
valid = false;
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
if (!valid) {
|
|
609
|
+
console.error('The "itemConfigMap" parameter must be of type `IVirtualListItemConfigMap`.');
|
|
610
|
+
return {};
|
|
611
|
+
}
|
|
612
|
+
return v;
|
|
613
|
+
};
|
|
614
|
+
this._$itemSize = new BehaviorSubject(DEFAULT_ITEM_SIZE);
|
|
615
|
+
this.$itemSize = this._$itemSize.asObservable();
|
|
616
|
+
this._itemSizeTransform = (v) => {
|
|
617
|
+
const valid = validateFloat(v) || v === VIEWPORT;
|
|
618
|
+
if (!valid) {
|
|
619
|
+
console.error('The "itemSize" parameter must be one of `number`, `viewport` or `undefined`.');
|
|
620
|
+
return DEFAULT_ITEM_SIZE;
|
|
621
|
+
}
|
|
622
|
+
return v;
|
|
623
|
+
};
|
|
624
|
+
this._$minItemSize = new BehaviorSubject(DEFAULT_ITEM_SIZE);
|
|
625
|
+
this.$minItemSize = this._$minItemSize.asObservable();
|
|
626
|
+
this._minItemSizeTransform = (v) => {
|
|
627
|
+
const valid = validateFloat(v) || v === VIEWPORT;
|
|
628
|
+
if (!valid) {
|
|
629
|
+
console.error('The "minItemSize" parameter must be one of `number`, `viewport` or `undefined`.');
|
|
630
|
+
return DEFAULT_ITEM_SIZE;
|
|
631
|
+
}
|
|
632
|
+
return v;
|
|
633
|
+
};
|
|
634
|
+
this._$maxItemSize = new BehaviorSubject(DEFAULT_MAX_ITEM_SIZE);
|
|
635
|
+
this.$maxItemSize = this._$maxItemSize.asObservable();
|
|
636
|
+
this._maxItemSizeTransform = (v) => {
|
|
637
|
+
const valid = validateFloat(v) || v === VIEWPORT;
|
|
638
|
+
if (!valid) {
|
|
639
|
+
console.error('The "maxItemSize" parameter must be one of `number`, `viewport` or `undefined`.');
|
|
640
|
+
return DEFAULT_ITEM_SIZE;
|
|
641
|
+
}
|
|
642
|
+
return v;
|
|
643
|
+
};
|
|
644
|
+
this._$dynamicSize = new BehaviorSubject(DEFAULT_DYNAMIC_SIZE);
|
|
645
|
+
this.$dynamicSize = this._$dynamicSize.asObservable();
|
|
646
|
+
this._dynamicSizeTransform = (v) => {
|
|
647
|
+
const valid = validateBoolean(v);
|
|
648
|
+
if (!valid) {
|
|
649
|
+
console.error('The "dynamicSize" parameter must be of type `boolean`.');
|
|
650
|
+
return DEFAULT_DYNAMIC_SIZE;
|
|
651
|
+
}
|
|
652
|
+
return v;
|
|
653
|
+
};
|
|
654
|
+
this._$direction = new BehaviorSubject(DEFAULT_DIRECTION);
|
|
655
|
+
this.$direction = this._$direction.asObservable();
|
|
656
|
+
this._directionTransform = (v) => {
|
|
657
|
+
const valid = validateString(v) && (v === 'horizontal' || v === 'vertical');
|
|
658
|
+
if (!valid) {
|
|
659
|
+
console.error('The "direction" parameter must be one of `horizontal` or `vertical`.');
|
|
660
|
+
return DEFAULT_DIRECTION;
|
|
661
|
+
}
|
|
662
|
+
return v;
|
|
663
|
+
};
|
|
664
|
+
this._$collectionMode = new BehaviorSubject(DEFAULT_COLLECTION_MODE);
|
|
665
|
+
this.$collectionMode = this._$collectionMode.asObservable();
|
|
666
|
+
this._collectionModeTransform = (v) => {
|
|
667
|
+
const valid = validateString(v) && (v === 'normal' || v === 'lazy');
|
|
668
|
+
if (!valid) {
|
|
669
|
+
console.error('The "direction" parameter must be one of `normal` or `lazy`.');
|
|
670
|
+
return DEFAULT_COLLECTION_MODE;
|
|
671
|
+
}
|
|
672
|
+
return v;
|
|
673
|
+
};
|
|
674
|
+
this._$bufferSize = new BehaviorSubject(DEFAULT_BUFFER_SIZE);
|
|
675
|
+
this.$bufferSize = this._$bufferSize.asObservable();
|
|
676
|
+
this._bufferSizeTransform = (v) => {
|
|
677
|
+
const valid = validateInt(v);
|
|
678
|
+
if (!valid) {
|
|
679
|
+
console.error('The "bufferSize" parameter must be of type `number`.');
|
|
680
|
+
return DEFAULT_BUFFER_SIZE;
|
|
681
|
+
}
|
|
682
|
+
return v;
|
|
683
|
+
};
|
|
684
|
+
this._$maxBufferSize = new BehaviorSubject(DEFAULT_MAX_BUFFER_SIZE);
|
|
685
|
+
this.$maxBufferSize = this._$maxBufferSize.asObservable();
|
|
686
|
+
this._maxBufferSizeTransform = (v) => {
|
|
687
|
+
let val = v;
|
|
688
|
+
const valid = validateInt(v, true);
|
|
689
|
+
if (!valid) {
|
|
690
|
+
console.error('The "maxBufferSize" parameter must be of type `number`.');
|
|
691
|
+
val = DEFAULT_MAX_BUFFER_SIZE;
|
|
692
|
+
}
|
|
693
|
+
const bufferSize = this.bufferSize;
|
|
694
|
+
if (val === undefined || val <= bufferSize) {
|
|
695
|
+
return bufferSize;
|
|
696
|
+
}
|
|
697
|
+
return val;
|
|
698
|
+
};
|
|
699
|
+
this._$snappingMethod = new BehaviorSubject(DEFAULT_SNAPPING_METHOD);
|
|
700
|
+
this.$snappingMethod = this._$snappingMethod.asObservable();
|
|
701
|
+
this._snappingMethodTransform = (v) => {
|
|
702
|
+
const valid = validateString(v) && (v === SnappingMethods.ADVANCED || v === SnappingMethods.STANDART);
|
|
703
|
+
if (!valid) {
|
|
704
|
+
console.error(`The "snappingMethod" parameter must have the value '${SnappingMethods.ADVANCED}' or '${SnappingMethods.STANDART}'.`);
|
|
705
|
+
return DEFAULT_SNAPPING_METHOD;
|
|
706
|
+
}
|
|
707
|
+
return v;
|
|
708
|
+
};
|
|
709
|
+
this._$collapsingMode = new BehaviorSubject(DEFAULT_COLLAPSING_MODES);
|
|
710
|
+
this.$collapsingMode = this._$collapsingMode.asObservable();
|
|
711
|
+
this._collapsingModeTransform = (v) => {
|
|
712
|
+
const valid = validateString(v) && (v === CollapsingModes.NONE || v === CollapsingModes.MULTI_COLLAPSE || v === CollapsingModes.ACCORDION);
|
|
713
|
+
if (!valid) {
|
|
714
|
+
console.error(`The "collapsingMode" parameter must have the value '${SnappingMethods.ADVANCED}' or '${SnappingMethods.STANDART}'.`);
|
|
715
|
+
return DEFAULT_COLLAPSING_MODES;
|
|
716
|
+
}
|
|
717
|
+
return v;
|
|
718
|
+
};
|
|
719
|
+
this._$selectingMode = new BehaviorSubject(DEFAULT_SELECTING_MODES);
|
|
720
|
+
this.$selectingMode = this._$selectingMode.asObservable();
|
|
721
|
+
this._selectingModeTransform = (v) => {
|
|
722
|
+
const valid = validateString(v) && (v === 'none' || v === 'select' || v === 'multi-select');
|
|
723
|
+
if (!valid) {
|
|
724
|
+
console.error('The "selectingMode" parameter must be one of `none`, `select` or `multi-select`.');
|
|
725
|
+
return DEFAULT_SELECTING_MODES;
|
|
726
|
+
}
|
|
727
|
+
return v;
|
|
728
|
+
};
|
|
729
|
+
this._$trackBy = new BehaviorSubject(TRACK_BY_PROPERTY_NAME);
|
|
730
|
+
this.$trackBy = this._$trackBy.asObservable();
|
|
731
|
+
this._trackByTransform = (v) => {
|
|
732
|
+
const valid = validateString(v);
|
|
733
|
+
if (!valid) {
|
|
734
|
+
console.error('The "trackBy" parameter must be of type `string`.');
|
|
735
|
+
return TRACK_BY_PROPERTY_NAME;
|
|
736
|
+
}
|
|
737
|
+
return v;
|
|
738
|
+
};
|
|
739
|
+
this._$screenReaderMessage = new BehaviorSubject(DEFAULT_SCREEN_READER_MESSAGE);
|
|
740
|
+
this.$screenReaderMessage = this._$screenReaderMessage.asObservable();
|
|
741
|
+
this._screenReaderMessageTransform = (v) => {
|
|
742
|
+
const valid = validateString(v);
|
|
743
|
+
if (!valid) {
|
|
744
|
+
console.error('The "screenReaderMessage" parameter must be of type `string`.');
|
|
745
|
+
return DEFAULT_SCREEN_READER_MESSAGE;
|
|
746
|
+
}
|
|
747
|
+
return v;
|
|
748
|
+
};
|
|
749
|
+
this._$screenReaderFormattedMessage = new BehaviorSubject(DEFAULT_SCREEN_READER_MESSAGE);
|
|
750
|
+
this.$screenReaderFormattedMessage = this._$screenReaderFormattedMessage.asObservable();
|
|
751
|
+
this._$langTextDir = new BehaviorSubject(DEFAULT_LANG_TEXT_DIR);
|
|
752
|
+
this.$langTextDir = this._$langTextDir.asObservable();
|
|
753
|
+
this._langTextDirTransform = (v) => {
|
|
754
|
+
const valid = validateString(v);
|
|
755
|
+
if (!valid) {
|
|
756
|
+
console.error('The "langTextDir" parameter must be of type `string`.');
|
|
757
|
+
return DEFAULT_LANG_TEXT_DIR;
|
|
758
|
+
}
|
|
759
|
+
return v;
|
|
760
|
+
};
|
|
761
|
+
this._isSingleSelection = this.getIsSingleSelection();
|
|
762
|
+
this._isMultiSelection = this.getIsMultiSelection();
|
|
763
|
+
this._isMultipleCollapse = this.getIsMultipleCollapse();
|
|
764
|
+
this._isAccordionCollapse = this.getIsAccordionCollapse();
|
|
765
|
+
this._isSnappingMethodAdvanced = this.getIsSnappingMethodAdvanced();
|
|
766
|
+
this._$isInfinity = new BehaviorSubject(false);
|
|
767
|
+
this.$isInfinity = this._$isInfinity.asObservable();
|
|
768
|
+
this._isVertical = this.getIsVertical();
|
|
769
|
+
this._$isVertical = new BehaviorSubject(this.isVertical);
|
|
770
|
+
this.$isVertical = this._$isVertical.asObservable();
|
|
771
|
+
this._$focusedElement = new BehaviorSubject(null);
|
|
772
|
+
this.$focusedElement = this._$focusedElement.asObservable();
|
|
773
|
+
this._$classes = new BehaviorSubject({});
|
|
774
|
+
this.$classes = this._$classes.asObservable();
|
|
775
|
+
this._$prerenderEnabled = new BehaviorSubject(false);
|
|
776
|
+
this.$prerenderEnabled = this._$prerenderEnabled.asObservable();
|
|
777
|
+
this._$actualItems = new BehaviorSubject([]);
|
|
778
|
+
this._$collapsedItemIds = new BehaviorSubject([]);
|
|
779
|
+
this._displayComponents = [];
|
|
780
|
+
this._snappedDisplayComponents = [];
|
|
781
|
+
this._$bounds = new BehaviorSubject(null);
|
|
782
|
+
this.$bounds = this._$bounds.asObservable();
|
|
783
|
+
this._$actualScrollbarEnabled = new BehaviorSubject(this.scrollbarEnabled);
|
|
784
|
+
this.$actualScrollbarEnabled = this._$actualScrollbarEnabled.asObservable();
|
|
785
|
+
this._$actualAlignment = new BehaviorSubject(this.alignment);
|
|
786
|
+
this.$actualAlignment = this._$actualAlignment.asObservable();
|
|
787
|
+
this._$actualItemSize = new BehaviorSubject(0);
|
|
788
|
+
this.$actualItemSize = this._$actualItemSize.asObservable();
|
|
789
|
+
this._$actualMinItemSize = new BehaviorSubject(0);
|
|
790
|
+
this.$actualMinItemSize = this._$actualMinItemSize.asObservable();
|
|
791
|
+
this._$actualMaxItemSize = new BehaviorSubject(0);
|
|
792
|
+
this.$actualMaxItemSize = this._$actualMaxItemSize.asObservable();
|
|
793
|
+
this._$totalSize = new BehaviorSubject(0);
|
|
794
|
+
this._$listBounds = new BehaviorSubject(null);
|
|
795
|
+
this._$scrollSize = new BehaviorSubject(0);
|
|
796
|
+
this.$scrollSize = this._$scrollSize.asObservable();
|
|
797
|
+
this._$isScrollStart = new BehaviorSubject(true);
|
|
798
|
+
this._$isScrollEnd = new BehaviorSubject(false);
|
|
799
|
+
this._$precalculatedScrollStartOffset = new BehaviorSubject(0);
|
|
800
|
+
this._$precalculatedScrollEndOffset = new BehaviorSubject(0);
|
|
801
|
+
this._$actualScrollStartOffset = new BehaviorSubject(0);
|
|
802
|
+
this.$actualScrollStartOffset = this._$actualScrollStartOffset.asObservable();
|
|
803
|
+
this._$actualScrollEndOffset = new BehaviorSubject(0);
|
|
804
|
+
this.$actualScrollEndOffset = this._$actualScrollEndOffset.asObservable();
|
|
805
|
+
this._$startOffset = new BehaviorSubject(0);
|
|
806
|
+
this.$startOffset = this._$startOffset.asObservable();
|
|
807
|
+
this._$endOffset = new BehaviorSubject(0);
|
|
808
|
+
this.$endOffset = this._$endOffset.asObservable();
|
|
809
|
+
this._$actualSnapScrollToStart = new BehaviorSubject(false);
|
|
810
|
+
this._$actualSnapScrollToEnd = new BehaviorSubject(false);
|
|
811
|
+
this._$alignmentScrollStartOffset = new BehaviorSubject(0);
|
|
812
|
+
this.$alignmentScrollStartOffset = this._$alignmentScrollStartOffset.asObservable();
|
|
813
|
+
this._$alignmentScrollEndOffset = new BehaviorSubject(0);
|
|
814
|
+
this.$alignmentScrollEndOffset = this._$alignmentScrollEndOffset.asObservable();
|
|
815
|
+
this._resizeSnappedComponentHandler = () => {
|
|
816
|
+
const list = this._$list.getValue(), scroller = this._$scroller.getValue(), bounds = this._$bounds.getValue(), snappedComponents = this._snappedDisplayComponents;
|
|
817
|
+
if (!!list && !!scroller && snappedComponents.length > 0) {
|
|
818
|
+
const isVertical = this._isVertical, listBounds = list.nativeElement.getBoundingClientRect();
|
|
819
|
+
for (const comp of snappedComponents) {
|
|
820
|
+
if (!!comp) {
|
|
821
|
+
comp.instance.regularLength = `${isVertical ? listBounds.width : listBounds.height}${PX}`;
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
const snappingMethod = this.snappingMethod;
|
|
825
|
+
if (snappingMethod === SnappingMethods.ADVANCED) {
|
|
826
|
+
const snappedComponent = snappedComponents?.[0]?.instance;
|
|
827
|
+
if (!!snappedComponent) {
|
|
828
|
+
const { width, height } = bounds ?? { width: 0, height: 0 }, langTextDir = this.langTextDir;
|
|
829
|
+
snappedComponent.element.style.clipPath = `path("M 0 0 L 0 ${snappedComponent.element.offsetHeight} L ${snappedComponent.element.offsetWidth} ${snappedComponent.element.offsetHeight} L ${snappedComponent.element.offsetWidth} 0 Z")`;
|
|
830
|
+
const { width: sWidth, height: sHeight } = snappedComponent.getBounds() ?? { width: 0, height: 0 }, scrollerElement = scroller.nativeElement, delta = snappedComponent.item?.measures.delta ?? 0, scrollBarSize = this.scrollbarThickness;
|
|
831
|
+
let right, top, bottom;
|
|
832
|
+
if (isVertical) {
|
|
833
|
+
right = width - scrollBarSize + 2;
|
|
834
|
+
top = sHeight;
|
|
835
|
+
bottom = height;
|
|
836
|
+
if (langTextDir === TextDirections.RTL) {
|
|
837
|
+
scrollerElement.style.clipPath = `path("M 0 0 L 0 ${height} L ${width} ${height} L ${width} ${top + delta} L ${scrollBarSize} ${top + delta} L ${scrollBarSize} 0 Z")`;
|
|
838
|
+
}
|
|
839
|
+
else {
|
|
840
|
+
scrollerElement.style.clipPath = `path("M 0 ${top + delta} L 0 ${height} L ${width} ${height} L ${width} 0 L ${right} 0 L ${right} ${top + delta} Z")`;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
right = width;
|
|
845
|
+
top = 0;
|
|
846
|
+
bottom = height - scrollBarSize;
|
|
847
|
+
scrollerElement.style.clipPath = `path("M ${width} 0 L ${width} ${bottom} L 0 ${bottom} L 0 0 L ${width} 0 Z")`;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
};
|
|
853
|
+
this._resizeSnappedObserver = null;
|
|
854
|
+
this.focusItem = (element, position, align = FocusAlignments.CENTER, behavior = BEHAVIOR_AUTO) => {
|
|
855
|
+
if (!this._readyForShow) {
|
|
856
|
+
return;
|
|
857
|
+
}
|
|
858
|
+
const scroller = this._scrollerComponent;
|
|
859
|
+
if (!!scroller) {
|
|
860
|
+
const { width, height } = this._$bounds.getValue(), { width: elementWidth, height: elementHeight } = element.getBoundingClientRect(), isVertical = this._isVertical, viewportSize = isVertical ? height : width, elementSize = isVertical ? elementHeight : elementWidth;
|
|
861
|
+
let pos = Number.NaN;
|
|
862
|
+
switch (align) {
|
|
863
|
+
case FocusAlignments.START: {
|
|
864
|
+
pos = position + scroller.startLayoutOffset;
|
|
865
|
+
break;
|
|
866
|
+
}
|
|
867
|
+
case FocusAlignments.CENTER: {
|
|
868
|
+
pos = position - (viewportSize - elementSize) * .5 + scroller.startLayoutOffset;
|
|
869
|
+
break;
|
|
870
|
+
}
|
|
871
|
+
case FocusAlignments.END: {
|
|
872
|
+
pos = position - (viewportSize - elementSize) + scroller.startLayoutOffset;
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
875
|
+
case FocusAlignments.NONE:
|
|
876
|
+
default: {
|
|
877
|
+
break;
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
if (!Number.isNaN(pos)) {
|
|
881
|
+
this._trackBox.preventScrollSnapping(true);
|
|
882
|
+
const params = {
|
|
883
|
+
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: pos, behavior, snap: false, normalize: true,
|
|
884
|
+
fireUpdate: false, blending: false, userAction: false,
|
|
885
|
+
duration: this.snapToItem ? Math.max(this.animationParams.scrollToItem, this.animationParams.navigateToItem) : this.animationParams.navigateToItem,
|
|
886
|
+
};
|
|
887
|
+
scroller.scrollTo(params);
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
};
|
|
891
|
+
this._elementRef = inject(ElementRef);
|
|
892
|
+
/**
|
|
893
|
+
* Base class of the element component
|
|
894
|
+
*/
|
|
895
|
+
this._itemComponentClass = NgVirtualListItemComponent;
|
|
896
|
+
/**
|
|
897
|
+
* Base class trackBox
|
|
898
|
+
*/
|
|
899
|
+
this._trackBoxClass = TrackBox;
|
|
900
|
+
/**
|
|
901
|
+
* Dictionary of element sizes by their id
|
|
902
|
+
*/
|
|
903
|
+
this._trackBox = new this._trackBoxClass(this.trackBy);
|
|
904
|
+
this._$update = new Subject();
|
|
905
|
+
this.$update = this._$update.asObservable();
|
|
906
|
+
this._$scrollTo = new Subject();
|
|
907
|
+
this.$scrollTo = this._$scrollTo.asObservable();
|
|
908
|
+
this._$scrollToExecutor = new Subject();
|
|
909
|
+
this.$scrollToExecutor = this._$scrollToExecutor.asObservable();
|
|
910
|
+
this._$scrollingTo = new BehaviorSubject(false);
|
|
911
|
+
this._$scroll = new Subject();
|
|
912
|
+
this.$scroll = this._$scroll.asObservable();
|
|
913
|
+
this._$tick = new Subject();
|
|
914
|
+
this.$tick = this._$tick.asObservable();
|
|
915
|
+
this._$fireUpdate = new Subject();
|
|
916
|
+
this.$fireUpdate = this._$fireUpdate.asObservable();
|
|
917
|
+
this._$fireUpdateNextFrame = new Subject();
|
|
918
|
+
this.$fireUpdateNextFrame = this._$fireUpdateNextFrame.asObservable();
|
|
919
|
+
this._$preventScrollSnapping = new BehaviorSubject(false);
|
|
920
|
+
this.$preventScrollSnapping = this._$preventScrollSnapping.asObservable();
|
|
921
|
+
this._readyForShow = false;
|
|
922
|
+
this._cached = false;
|
|
923
|
+
this._isLoading = false;
|
|
924
|
+
this._$viewInit = new BehaviorSubject(false);
|
|
925
|
+
this.$viewInit = this._$viewInit.asObservable();
|
|
926
|
+
this._$destroy = new Subject();
|
|
927
|
+
this.$destroy = this._$destroy.asObservable();
|
|
928
|
+
NgVirtualListComponent.__nextId = NgVirtualListComponent.__nextId + 1 === Number.MAX_SAFE_INTEGER
|
|
929
|
+
? 0 : NgVirtualListComponent.__nextId + 1;
|
|
930
|
+
this._id = NgVirtualListComponent.__nextId;
|
|
931
|
+
this._service.initialize(this._id, this._trackBox);
|
|
932
|
+
const $dynamicSize = this.$dynamicSize, $snapScrollToEnd = this.$snapScrollToEnd;
|
|
933
|
+
combineLatest([$dynamicSize, $snapScrollToEnd]).pipe(takeUntil(this._$unsubscribe), tap(([dynamicSize, snapScrollToEnd]) => {
|
|
934
|
+
this._$prerenderEnabled.next(dynamicSize && snapScrollToEnd);
|
|
935
|
+
})).subscribe();
|
|
936
|
+
this.$animationParams.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
937
|
+
this._service.animationParams = v;
|
|
938
|
+
})).subscribe();
|
|
939
|
+
this.$spreadingMode.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
940
|
+
this._$isInfinity.next(isSpreadingMode(v, SpreadingModes.INFINITY));
|
|
941
|
+
})).subscribe();
|
|
942
|
+
this.$actualScrollStartOffset.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
|
|
943
|
+
this._$startOffset.next(v);
|
|
944
|
+
})).subscribe();
|
|
945
|
+
this.$actualScrollEndOffset.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(v => {
|
|
946
|
+
this._$endOffset.next(v);
|
|
947
|
+
})).subscribe();
|
|
948
|
+
const $isInfinity = this.$isInfinity;
|
|
949
|
+
$isInfinity.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
950
|
+
this._trackBox.isInfinity = this._service.isInfinity = v;
|
|
951
|
+
})).subscribe();
|
|
952
|
+
const $zIndexWhenSelecting = this.$zIndexWhenSelecting;
|
|
953
|
+
$zIndexWhenSelecting.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
954
|
+
this._service.zIndexWhenSelecting = v;
|
|
955
|
+
})).subscribe();
|
|
956
|
+
const $bounds = this._$bounds.asObservable().pipe(filter(b => !!b)), $rawScrollStartOffset = this.$scrollStartOffset, $rawScrollEndOffset = this.$scrollEndOffset;
|
|
957
|
+
combineLatest([$bounds, $rawScrollStartOffset]).pipe(takeUntil(this._$unsubscribe), filter(([v]) => !!v), tap(([bounds, value]) => {
|
|
958
|
+
const val = parseArithmeticExpression(value, this.isVertical ? bounds.height : bounds.width);
|
|
959
|
+
this._$precalculatedScrollStartOffset.next(val);
|
|
960
|
+
})).subscribe();
|
|
961
|
+
combineLatest([$bounds, $rawScrollEndOffset]).pipe(takeUntil(this._$unsubscribe), filter(([v]) => !!v), tap(([bounds, value]) => {
|
|
962
|
+
const val = parseArithmeticExpression(value, this.isVertical ? bounds.height : bounds.width);
|
|
963
|
+
this._$precalculatedScrollEndOffset.next(val);
|
|
964
|
+
})).subscribe();
|
|
965
|
+
this._service.$intersectionElementBySnapToItemAlign.pipe(takeUntil(this._$unsubscribe), filter(v => v !== null), tap(id => {
|
|
966
|
+
this.onSnapItem.emit(id);
|
|
967
|
+
})).subscribe();
|
|
968
|
+
this._service.$tick.pipe(takeUntil(this._$unsubscribe), tap(() => {
|
|
969
|
+
this._scrollerComponent?.tick();
|
|
970
|
+
})).subscribe();
|
|
971
|
+
this._service.$tick.pipe(takeUntil(this._$unsubscribe), filter(() => this.dynamicSize === true), tap(() => {
|
|
972
|
+
this.checkBoundsOfElements();
|
|
973
|
+
this._scrollerComponent?.tick();
|
|
974
|
+
})).subscribe();
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Readonly. Returns the unique identifier of the component.
|
|
978
|
+
*/
|
|
979
|
+
get id() { return this._id; }
|
|
980
|
+
/**
|
|
981
|
+
* Scrollbar thickness.
|
|
982
|
+
*/
|
|
983
|
+
set scrollbarThickness(v) {
|
|
984
|
+
if (this._$scrollbarThickness.getValue() === v) {
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
const transformedValue = this._scrollbarThicknessTransform(v);
|
|
988
|
+
this._$scrollbarThickness.next(transformedValue);
|
|
989
|
+
}
|
|
990
|
+
;
|
|
991
|
+
get scrollbarThickness() { return this._$scrollbarThickness.getValue(); }
|
|
992
|
+
/**
|
|
993
|
+
* Minimum scrollbar size.
|
|
994
|
+
*/
|
|
995
|
+
set scrollbarMinSize(v) {
|
|
996
|
+
if (this._$scrollbarMinSize.getValue() === v) {
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
const transformedValue = this._scrollbarMinSizeTransform(v);
|
|
1000
|
+
this._$scrollbarMinSize.next(transformedValue);
|
|
1001
|
+
}
|
|
1002
|
+
;
|
|
1003
|
+
get scrollbarMinSize() { return this._$scrollbarMinSize.getValue(); }
|
|
1004
|
+
/**
|
|
1005
|
+
* Scrollbar customization template.
|
|
1006
|
+
*/
|
|
1007
|
+
set scrollbarThumbRenderer(v) {
|
|
1008
|
+
if (this._$scrollbarThumbRenderer.getValue() === v) {
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
const transformedValue = this._scrollbarThumbRendererTransform(v);
|
|
1012
|
+
this._$scrollbarThumbRenderer.next(transformedValue);
|
|
1013
|
+
}
|
|
1014
|
+
;
|
|
1015
|
+
get scrollbarThumbRenderer() { return this._$scrollbarThumbRenderer.getValue(); }
|
|
1016
|
+
/**
|
|
1017
|
+
* Additional options for the scrollbar.
|
|
1018
|
+
*/
|
|
1019
|
+
set scrollbarThumbParams(v) {
|
|
1020
|
+
if (this._$scrollbarThumbParams.getValue() === v) {
|
|
1021
|
+
return;
|
|
1022
|
+
}
|
|
1023
|
+
const transformedValue = this._scrollbarThumbParamsTransform(v);
|
|
1024
|
+
this._$scrollbarThumbParams.next(transformedValue);
|
|
1025
|
+
}
|
|
1026
|
+
;
|
|
1027
|
+
get scrollbarThumbParams() { return this._$scrollbarThumbParams.getValue(); }
|
|
1028
|
+
/**
|
|
1029
|
+
* If `true`, the scrollBar goes into loading state. The default value is `false`.
|
|
1030
|
+
*/
|
|
1031
|
+
set loading(v) {
|
|
1032
|
+
if (this._$loading.getValue() === v) {
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
const transformedValue = this._loadingTransform(v);
|
|
1036
|
+
this._$loading.next(transformedValue);
|
|
1037
|
+
}
|
|
1038
|
+
;
|
|
1039
|
+
get loading() { return this._$loading.getValue(); }
|
|
1040
|
+
/**
|
|
1041
|
+
* If true, it will wait until the list items are fully prepared before displaying them.. The default value is `true`.
|
|
1042
|
+
*/
|
|
1043
|
+
set waitForPreparation(v) {
|
|
1044
|
+
if (this._$waitForPreparation.getValue() === v) {
|
|
1045
|
+
return;
|
|
1046
|
+
}
|
|
1047
|
+
const transformedValue = this._waitForPreparationTransform(v);
|
|
1048
|
+
this._$waitForPreparation.next(transformedValue);
|
|
1049
|
+
}
|
|
1050
|
+
;
|
|
1051
|
+
get waitForPreparation() { return this._$waitForPreparation.getValue(); }
|
|
1052
|
+
/**
|
|
1053
|
+
* The maximum scroll distance at which a click event is triggered.
|
|
1054
|
+
*/
|
|
1055
|
+
set clickDistance(v) {
|
|
1056
|
+
if (this._$clickDistance.getValue() === v) {
|
|
1057
|
+
return;
|
|
1058
|
+
}
|
|
1059
|
+
const transformedValue = this._clickDistanceTransform(v);
|
|
1060
|
+
this._$clickDistance.next(transformedValue);
|
|
1061
|
+
}
|
|
1062
|
+
;
|
|
1063
|
+
get clickDistance() { return this._$clickDistance.getValue(); }
|
|
1064
|
+
/**
|
|
1065
|
+
* Collection of list items.
|
|
1066
|
+
*/
|
|
1067
|
+
set items(v) {
|
|
1068
|
+
if (this._$items.getValue() === v) {
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
const transformedValue = this._itemsTransform(v);
|
|
1072
|
+
this._$items.next(transformedValue);
|
|
1073
|
+
}
|
|
1074
|
+
;
|
|
1075
|
+
get items() { return this._$items.getValue(); }
|
|
1076
|
+
/**
|
|
1077
|
+
* Sets the selected items.
|
|
1078
|
+
*/
|
|
1079
|
+
set selectedIds(v) {
|
|
1080
|
+
if (this._$selectedIds.getValue() === v) {
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
const transformedValue = this._selectedIdsTransform(v);
|
|
1084
|
+
this._$selectedIds.next(transformedValue);
|
|
1085
|
+
}
|
|
1086
|
+
;
|
|
1087
|
+
get selectedIds() { return this._$selectedIds.getValue(); }
|
|
1088
|
+
set defaultItemValue(v) {
|
|
1089
|
+
if (this._$defaultItemValue.getValue() === v) {
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
this._$defaultItemValue.next(v);
|
|
1093
|
+
}
|
|
1094
|
+
;
|
|
1095
|
+
get defaultItemValue() { return this._$defaultItemValue.getValue(); }
|
|
1096
|
+
/**
|
|
1097
|
+
* Sets the collapsed items.
|
|
1098
|
+
*/
|
|
1099
|
+
set collapsedIds(v) {
|
|
1100
|
+
if (this._$collapsedIds.getValue() === v) {
|
|
1101
|
+
return;
|
|
1102
|
+
}
|
|
1103
|
+
const transformedValue = this._collapsedIdsTransform(v);
|
|
1104
|
+
this._$collapsedIds.next(transformedValue);
|
|
1105
|
+
}
|
|
1106
|
+
;
|
|
1107
|
+
get collapsedIds() { return this._$collapsedIds.getValue(); }
|
|
1108
|
+
/**
|
|
1109
|
+
* If `false`, the element is selected using the config.api method passed to the template;
|
|
1110
|
+
* if `true`, the element is selected by clicking on it. The default value is `true`.
|
|
1111
|
+
*/
|
|
1112
|
+
set selectByClick(v) {
|
|
1113
|
+
if (this._$selectByClick.getValue() === v) {
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
const transformedValue = this._selectByClickTransform(v);
|
|
1117
|
+
this._$selectByClick.next(transformedValue);
|
|
1118
|
+
}
|
|
1119
|
+
;
|
|
1120
|
+
get selectByClick() { return this._$selectByClick.getValue(); }
|
|
1121
|
+
/**
|
|
1122
|
+
* If `false`, the element is collapsed using the config.collapse method passed to the template;
|
|
1123
|
+
* if `true`, the element is collapsed by clicking on it. The default value is `true`.
|
|
1124
|
+
*/
|
|
1125
|
+
set collapseByClick(v) {
|
|
1126
|
+
if (this._$collapseByClick.getValue() === v) {
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
const transformedValue = this._collapseByClickTransform(v);
|
|
1130
|
+
this._$collapseByClick.next(transformedValue);
|
|
1131
|
+
}
|
|
1132
|
+
;
|
|
1133
|
+
get collapseByClick() { return this._$collapseByClick.getValue(); }
|
|
1134
|
+
/**
|
|
1135
|
+
* @deprecated
|
|
1136
|
+
* Use the `stickyEnabled` property instead.
|
|
1137
|
+
*/
|
|
1138
|
+
set snap(v) {
|
|
1139
|
+
throw Error(`Property snap is deprecated. Use the \`stickyEnabled\` property instead.`);
|
|
1140
|
+
}
|
|
1141
|
+
;
|
|
1142
|
+
/**
|
|
1143
|
+
* Determines whether items with the given `sticky` in `itemConfigMap` will stick to the edges. Default value is "true".
|
|
1144
|
+
*/
|
|
1145
|
+
set stickyEnabled(v) {
|
|
1146
|
+
if (this._$stickyEnabled.getValue() === v) {
|
|
1147
|
+
return;
|
|
1148
|
+
}
|
|
1149
|
+
const transformedValue = this._stickyEnabledTransform(v);
|
|
1150
|
+
this._$stickyEnabled.next(transformedValue);
|
|
1151
|
+
}
|
|
1152
|
+
;
|
|
1153
|
+
get stickyEnabled() { return this._$stickyEnabled.getValue(); }
|
|
1154
|
+
/**
|
|
1155
|
+
* Sets the offset value; if the scroll area value is exceeded, the scroll animation will be disabled. Default value is "0".
|
|
1156
|
+
*/
|
|
1157
|
+
set snapToEndTransitionInstantOffset(v) {
|
|
1158
|
+
if (this._$snapToEndTransitionInstantOffset.getValue() === v) {
|
|
1159
|
+
return;
|
|
1160
|
+
}
|
|
1161
|
+
const transformedValue = this._snapToEndTransitionInstantOffsetTransform(v);
|
|
1162
|
+
this._$snapToEndTransitionInstantOffset.next(transformedValue);
|
|
1163
|
+
}
|
|
1164
|
+
;
|
|
1165
|
+
get snapToEndTransitionInstantOffset() { return this._$snapToEndTransitionInstantOffset.getValue(); }
|
|
1166
|
+
/**
|
|
1167
|
+
* Sets the scroll start offset value. Can be specified in absolute or percentage values.
|
|
1168
|
+
* Supports arithmetic expressions of addition `50% + 25` or subtraction `50% - 25`. Default value is "0".
|
|
1169
|
+
*/
|
|
1170
|
+
set scrollStartOffset(v) {
|
|
1171
|
+
if (this._$scrollStartOffset.getValue() === v) {
|
|
1172
|
+
return;
|
|
1173
|
+
}
|
|
1174
|
+
const transformedValue = this._scrollStartOffsetTransform(v);
|
|
1175
|
+
this._$scrollStartOffset.next(transformedValue);
|
|
1176
|
+
}
|
|
1177
|
+
;
|
|
1178
|
+
get scrollStartOffset() { return this._$scrollStartOffset.getValue(); }
|
|
1179
|
+
/**
|
|
1180
|
+
* Sets the scroll end offset value. Can be specified in absolute or percentage values.
|
|
1181
|
+
* Supports arithmetic expressions of addition `50% + 25` or subtraction `50% - 25`. Default value is "0".
|
|
1182
|
+
*/
|
|
1183
|
+
set scrollEndOffset(v) {
|
|
1184
|
+
if (this._$scrollEndOffset.getValue() === v) {
|
|
1185
|
+
return;
|
|
1186
|
+
}
|
|
1187
|
+
const transformedValue = this._scrollEndOffsetTransform(v);
|
|
1188
|
+
this._$scrollEndOffset.next(transformedValue);
|
|
1189
|
+
}
|
|
1190
|
+
;
|
|
1191
|
+
get scrollEndOffset() { return this._$scrollEndOffset.getValue(); }
|
|
1192
|
+
/**
|
|
1193
|
+
* Determines whether the scroll will be anchored to the start of the list. Default value is "true".
|
|
1194
|
+
* This property takes precedence over the snapScrollToEnd property.
|
|
1195
|
+
* That is, if snapScrollToStart and snapScrollToEnd are enabled, the list will initially snap
|
|
1196
|
+
* to the beginning; if you move the scroll bar to the end, the list will snap to the end.
|
|
1197
|
+
* If snapScrollToStart is disabled and snapScrollToEnd is enabled, the list will snap to the end;
|
|
1198
|
+
* if you move the scroll bar to the beginning, the list will snap to the beginning.
|
|
1199
|
+
* If both snapScrollToStart and snapScrollToEnd are disabled, the list will never snap to the beginning or end.
|
|
1200
|
+
* In the `spreadingMode=SpreadingModes.INFINITY` mode, the `snapScrollToStart` property is automatically disabled, since the list has no beginning or end.
|
|
1201
|
+
*/
|
|
1202
|
+
set snapScrollToStart(v) {
|
|
1203
|
+
if (this._$snapScrollToStart.getValue() === v) {
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1206
|
+
const transformedValue = this._snapScrollToStartTransform(v);
|
|
1207
|
+
this._$snapScrollToStart.next(transformedValue);
|
|
1208
|
+
}
|
|
1209
|
+
;
|
|
1210
|
+
get snapScrollToStart() { return this._$snapScrollToStart.getValue(); }
|
|
1211
|
+
/**
|
|
1212
|
+
* Determines whether the scroll will be anchored to the утв of the list. Default value is "true".
|
|
1213
|
+
* That is, if snapScrollToStart and snapScrollToEnd are enabled, the list will initially snap
|
|
1214
|
+
* to the beginning; if you move the scroll bar to the end, the list will snap to the end.
|
|
1215
|
+
* If snapScrollToStart is disabled and snapScrollToEnd is enabled, the list will snap to the end;
|
|
1216
|
+
* if you move the scroll bar to the beginning, the list will snap to the beginning.
|
|
1217
|
+
* If both snapScrollToStart and snapScrollToEnd are disabled, the list will never snap to the beginning or end.
|
|
1218
|
+
* In the `spreadingMode=SpreadingModes.INFINITY` mode, the `snapScrollToEnd` property is automatically disabled, since the list has no beginning or end.
|
|
1219
|
+
*/
|
|
1220
|
+
set snapScrollToEnd(v) {
|
|
1221
|
+
if (this._$snapScrollToEnd.getValue() === v) {
|
|
1222
|
+
return;
|
|
1223
|
+
}
|
|
1224
|
+
const transformedValue = this._snapScrollToEndTransform(v);
|
|
1225
|
+
this._$snapScrollToEnd.next(transformedValue);
|
|
1226
|
+
}
|
|
1227
|
+
;
|
|
1228
|
+
get snapScrollToEnd() { return this._$snapScrollToEnd.getValue(); }
|
|
1229
|
+
/**
|
|
1230
|
+
* @deprecated
|
|
1231
|
+
* The stopSnappingScrollToEnd property is deprecated. Use the snapScrollToEnd property.
|
|
1232
|
+
*/
|
|
1233
|
+
set snapScrollToBottom(v) {
|
|
1234
|
+
throw Error('The stopSnappingScrollToEnd property is deprecated. Use the snapScrollToEnd property.');
|
|
1235
|
+
}
|
|
1236
|
+
/**
|
|
1237
|
+
* Determines whether the scrollbar is shown or not. The default value is "true".
|
|
1238
|
+
*/
|
|
1239
|
+
set scrollbarEnabled(v) {
|
|
1240
|
+
if (this._$scrollbarEnabled.getValue() === v) {
|
|
1241
|
+
return;
|
|
1242
|
+
}
|
|
1243
|
+
const transformedValue = this._scrollbarEnabledTransform(v);
|
|
1244
|
+
this._$scrollbarEnabled.next(transformedValue);
|
|
1245
|
+
}
|
|
1246
|
+
;
|
|
1247
|
+
get scrollbarEnabled() { return this._$scrollbarEnabled.getValue(); }
|
|
1248
|
+
/**
|
|
1249
|
+
* Determines whether scrolling using the scrollbar will be possible. The default value is "true".
|
|
1250
|
+
*/
|
|
1251
|
+
set scrollbarInteractive(v) {
|
|
1252
|
+
if (this._$scrollbarInteractive.getValue() === v) {
|
|
1253
|
+
return;
|
|
1254
|
+
}
|
|
1255
|
+
const transformedValue = this._scrollbarInteractiveTransform(v);
|
|
1256
|
+
this._$scrollbarInteractive.next(transformedValue);
|
|
1257
|
+
}
|
|
1258
|
+
;
|
|
1259
|
+
get scrollbarInteractive() { return this._$scrollbarInteractive.getValue(); }
|
|
1260
|
+
/**
|
|
1261
|
+
* Determines whether the scroll bar will overlap the list. The default value is "false".
|
|
1262
|
+
*/
|
|
1263
|
+
set overlappingScrollbar(v) {
|
|
1264
|
+
if (this._$overlappingScrollbar.getValue() === v) {
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
const transformedValue = this._overlappingScrollbarTransform(v);
|
|
1268
|
+
this._$overlappingScrollbar.next(transformedValue);
|
|
1269
|
+
}
|
|
1270
|
+
;
|
|
1271
|
+
get overlappingScrollbar() { return this._$overlappingScrollbar.getValue(); }
|
|
1272
|
+
/**
|
|
1273
|
+
* Defines the scrolling behavior for any element on the page. The default value is "smooth".
|
|
1274
|
+
*/
|
|
1275
|
+
set scrollBehavior(v) {
|
|
1276
|
+
if (this._$scrollBehavior.getValue() === v) {
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
const transformedValue = this._scrollBehaviorTransform(v);
|
|
1280
|
+
this._$scrollBehavior.next(transformedValue);
|
|
1281
|
+
}
|
|
1282
|
+
;
|
|
1283
|
+
get scrollBehavior() { return this._$scrollBehavior.getValue(); }
|
|
1284
|
+
/**
|
|
1285
|
+
* Scrolling settings.
|
|
1286
|
+
* - frictionalForce - Frictional force. Default value is 0.035.
|
|
1287
|
+
* - mass - Mass. Default value is 0.005.
|
|
1288
|
+
* - maxDistance - Maximum scrolling distance. Default value is 100000.
|
|
1289
|
+
* - maxDuration - Maximum animation duration. Default value is 4000.
|
|
1290
|
+
* - speedScale - Speed scale. Default value is 10.
|
|
1291
|
+
* - optimization - Enables scrolling performance optimization. Default value is `true`.
|
|
1292
|
+
*/
|
|
1293
|
+
set scrollingSettings(v) {
|
|
1294
|
+
if (this._$scrollingSettings.getValue() === v) {
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
const transformedValue = this._scrollingSettingsTransform(v);
|
|
1298
|
+
this._$scrollingSettings.next(transformedValue);
|
|
1299
|
+
}
|
|
1300
|
+
;
|
|
1301
|
+
get scrollingSettings() { return this._$scrollingSettings.getValue(); }
|
|
1302
|
+
/**
|
|
1303
|
+
* Custom transformation of element's position, rotation, scale, opacity and zIndex. The default value is `null`.
|
|
1304
|
+
*/
|
|
1305
|
+
set itemTransform(v) {
|
|
1306
|
+
if (this._$itemTransform.getValue() === v) {
|
|
1307
|
+
return;
|
|
1308
|
+
}
|
|
1309
|
+
const transformedValue = this._itemTransformTransform(v);
|
|
1310
|
+
this._$itemTransform.next(transformedValue);
|
|
1311
|
+
}
|
|
1312
|
+
;
|
|
1313
|
+
get itemTransform() { return this._$itemTransform.getValue(); }
|
|
1314
|
+
/**
|
|
1315
|
+
* Snap to an item. The default value is `false`.
|
|
1316
|
+
*/
|
|
1317
|
+
set snapToItem(v) {
|
|
1318
|
+
if (this._$snapToItem.getValue() === v) {
|
|
1319
|
+
return;
|
|
1320
|
+
}
|
|
1321
|
+
const transformedValue = this._snapToItemTransform(v);
|
|
1322
|
+
this._$snapToItem.next(transformedValue);
|
|
1323
|
+
}
|
|
1324
|
+
;
|
|
1325
|
+
get snapToItem() { return this._$snapToItem.getValue(); }
|
|
1326
|
+
/**
|
|
1327
|
+
* Alignment for snapToItem. Available values are `start`, `center`, and `end`. The default value is `center`.
|
|
1328
|
+
*/
|
|
1329
|
+
set snapToItemAlign(v) {
|
|
1330
|
+
if (this._$snapToItemAlign.getValue() === v) {
|
|
1331
|
+
return;
|
|
1332
|
+
}
|
|
1333
|
+
const transformedValue = this._snapToItemAlignTransform(v);
|
|
1334
|
+
this._$snapToItemAlign.next(transformedValue);
|
|
1335
|
+
}
|
|
1336
|
+
;
|
|
1337
|
+
get snapToItemAlign() { return this._$snapToItemAlign.getValue(); }
|
|
1338
|
+
/**
|
|
1339
|
+
* Snapping activation distance. Can be specified as a percentage of the element size or in absolute values.
|
|
1340
|
+
* The default value is `25%`.
|
|
1341
|
+
*/
|
|
1342
|
+
set snappingDistance(v) {
|
|
1343
|
+
if (this._$snappingDistance.getValue() === v) {
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
const transformedValue = this._snappingDistanceTransform(v);
|
|
1347
|
+
this._$snappingDistance.next(transformedValue);
|
|
1348
|
+
}
|
|
1349
|
+
;
|
|
1350
|
+
get snappingDistance() { return this._$snappingDistance.getValue(); }
|
|
1351
|
+
/**
|
|
1352
|
+
* Specifies whether to scroll one item at a time if true and the scrollToItem property is set. The default value is `false`.
|
|
1353
|
+
*/
|
|
1354
|
+
set scrollingOneByOne(v) {
|
|
1355
|
+
if (this._$scrollingOneByOne.getValue() === v) {
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1358
|
+
const transformedValue = this._scrollingOneByOneTransform(v);
|
|
1359
|
+
this._$scrollingOneByOne.next(transformedValue);
|
|
1360
|
+
}
|
|
1361
|
+
;
|
|
1362
|
+
get scrollingOneByOne() { return this._$scrollingOneByOne.getValue(); }
|
|
1363
|
+
/**
|
|
1364
|
+
* Determines the alignment of the list. Two modes are available: `none` and `center`. The `center` mode aligns the list items to the center of the viewport, ideal for use with the `itemTransform` property.
|
|
1365
|
+
* The `none` mode means no alignment. The default value is `none`.
|
|
1366
|
+
*/
|
|
1367
|
+
set alignment(v) {
|
|
1368
|
+
if (this._$alignment.getValue() === v) {
|
|
1369
|
+
return;
|
|
1370
|
+
}
|
|
1371
|
+
const transformedValue = this._alignmentTransform(v);
|
|
1372
|
+
this._$alignment.next(transformedValue);
|
|
1373
|
+
}
|
|
1374
|
+
;
|
|
1375
|
+
get alignment() { return this._$alignment.getValue(); }
|
|
1376
|
+
/**
|
|
1377
|
+
* Defines the zIndex when a list item is selected. The default value is `null`.
|
|
1378
|
+
*/
|
|
1379
|
+
set zIndexWhenSelecting(v) {
|
|
1380
|
+
if (this._$zIndexWhenSelecting.getValue() === v) {
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
const transformedValue = this._zIndexWhenSelectingTransform(v);
|
|
1384
|
+
this._$zIndexWhenSelecting.next(transformedValue);
|
|
1385
|
+
}
|
|
1386
|
+
;
|
|
1387
|
+
get zIndexWhenSelecting() { return this._$zIndexWhenSelecting.getValue(); }
|
|
1388
|
+
/**
|
|
1389
|
+
* The order of list elements. Available values are `standard` and `infinity`.
|
|
1390
|
+
* `normal` — list elements are ordered according to the collection sequence.
|
|
1391
|
+
* `infinity` — list elements are ordered cyclically, forming an infinite list.
|
|
1392
|
+
* When set to `infinity`, the `alignment` property is forced to the value `Alignments.CENTER`, the `scrollbarEnabled` property is forced to the `false`
|
|
1393
|
+
* The default value is `standard`.
|
|
1394
|
+
*/
|
|
1395
|
+
set spreadingMode(v) {
|
|
1396
|
+
if (this._$spreadingMode.getValue() === v) {
|
|
1397
|
+
return;
|
|
1398
|
+
}
|
|
1399
|
+
const transformedValue = this._spreadingModeTransform(v);
|
|
1400
|
+
this._$spreadingMode.next(transformedValue);
|
|
1401
|
+
}
|
|
1402
|
+
;
|
|
1403
|
+
get spreadingMode() { return this._$spreadingMode.getValue(); }
|
|
1404
|
+
/**
|
|
1405
|
+
* Column or row numbers. The default value is `1`.
|
|
1406
|
+
*/
|
|
1407
|
+
set divides(v) {
|
|
1408
|
+
if (this._$divides.getValue() === v) {
|
|
1409
|
+
return;
|
|
1410
|
+
}
|
|
1411
|
+
const transformedValue = this._dividesTransform(v);
|
|
1412
|
+
this._$divides.next(transformedValue);
|
|
1413
|
+
}
|
|
1414
|
+
;
|
|
1415
|
+
get divides() { return this._$divides.getValue(); }
|
|
1416
|
+
/**
|
|
1417
|
+
* Motion blur effect. The default value is `0.15`.
|
|
1418
|
+
*/
|
|
1419
|
+
set motionBlur(v) {
|
|
1420
|
+
if (this._$motionBlur.getValue() === v) {
|
|
1421
|
+
return;
|
|
1422
|
+
}
|
|
1423
|
+
const transformedValue = this._motionBlurTransform(v);
|
|
1424
|
+
this._$motionBlur.next(transformedValue);
|
|
1425
|
+
}
|
|
1426
|
+
;
|
|
1427
|
+
get motionBlur() { return this._$motionBlur.getValue(); }
|
|
1428
|
+
/**
|
|
1429
|
+
* Maximum motion blur effect. The default value is `0.5`.
|
|
1430
|
+
*/
|
|
1431
|
+
set maxMotionBlur(v) {
|
|
1432
|
+
if (this._$maxMotionBlur.getValue() === v) {
|
|
1433
|
+
return;
|
|
1434
|
+
}
|
|
1435
|
+
const transformedValue = this._maxMotionBlurTransform(v);
|
|
1436
|
+
this._$maxMotionBlur.next(transformedValue);
|
|
1437
|
+
}
|
|
1438
|
+
;
|
|
1439
|
+
get maxMotionBlur() { return this._$maxMotionBlur.getValue(); }
|
|
1440
|
+
/**
|
|
1441
|
+
* Determines whether to apply motion blur or not. The default value is `false`.
|
|
1442
|
+
*/
|
|
1443
|
+
set motionBlurEnabled(v) {
|
|
1444
|
+
if (this._$motionBlurEnabled.getValue() === v) {
|
|
1445
|
+
return;
|
|
1446
|
+
}
|
|
1447
|
+
const transformedValue = this._motionBlurEnabledTransform(v);
|
|
1448
|
+
this._$motionBlurEnabled.next(transformedValue);
|
|
1449
|
+
}
|
|
1450
|
+
;
|
|
1451
|
+
get motionBlurEnabled() { return this._$motionBlurEnabled.getValue(); }
|
|
1452
|
+
/**
|
|
1453
|
+
* Animation parameters. The default value is "{ scrollToItem: 50, snapToItem: 150, navigateToItem: 150, navigateByKeyboard: 50 }".
|
|
1454
|
+
*/
|
|
1455
|
+
set animationParams(v) {
|
|
1456
|
+
if (this._$animationParams.getValue() === v) {
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
const transformedValue = this._animationParamsTransform(v);
|
|
1460
|
+
this._$animationParams.next(transformedValue);
|
|
1461
|
+
}
|
|
1462
|
+
;
|
|
1463
|
+
get animationParams() { return this._$animationParams.getValue(); }
|
|
1464
|
+
/**
|
|
1465
|
+
* Determines whether the overscroll (re-scroll) feature will work. The default value is "true".
|
|
1466
|
+
*/
|
|
1467
|
+
set overscrollEnabled(v) {
|
|
1468
|
+
if (this._$overscrollEnabled.getValue() === v) {
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
const transformedValue = this._overscrollEnabledTransform(v);
|
|
1472
|
+
this._$overscrollEnabled.next(transformedValue);
|
|
1473
|
+
}
|
|
1474
|
+
;
|
|
1475
|
+
get overscrollEnabled() { return this._$overscrollEnabled.getValue(); }
|
|
1476
|
+
/**
|
|
1477
|
+
* Experimental!
|
|
1478
|
+
* Enables buffer optimization.
|
|
1479
|
+
* Can only be used if items in the collection are not added or updated. Otherwise, artifacts in the form of twitching of the scroll area are possible.
|
|
1480
|
+
* Works only if the property dynamic = true
|
|
1481
|
+
*/
|
|
1482
|
+
set enabledBufferOptimization(v) {
|
|
1483
|
+
if (this._$enabledBufferOptimization.getValue() === v) {
|
|
1484
|
+
return;
|
|
1485
|
+
}
|
|
1486
|
+
const transformedValue = this._enabledBufferOptimizationTransform(v);
|
|
1487
|
+
this._$enabledBufferOptimization.next(transformedValue);
|
|
1488
|
+
}
|
|
1489
|
+
;
|
|
1490
|
+
get enabledBufferOptimization() { return this._$enabledBufferOptimization.getValue(); }
|
|
1491
|
+
/**
|
|
1492
|
+
* Rendering element template.
|
|
1493
|
+
*/
|
|
1494
|
+
set itemRenderer(v) {
|
|
1495
|
+
if (this._$itemRenderer.getValue() === v) {
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
const transformedValue = this._itemRendererTransform(v);
|
|
1499
|
+
this._$itemRenderer.next(transformedValue);
|
|
1500
|
+
}
|
|
1501
|
+
;
|
|
1502
|
+
get itemRenderer() { return this._$itemRenderer.getValue(); }
|
|
1503
|
+
/**
|
|
1504
|
+
* Sets `sticky` position, `fullSize`, `collapsable` and `selectable` for the list item element. If `sticky` position is greater than `0`, then `sticky` position is applied.
|
|
1505
|
+
* If the `sticky` value is greater than `0`, then the `sticky` position mode is enabled for the element. `1` - position start, `2` - position end.
|
|
1506
|
+
* Default value is `0`.
|
|
1507
|
+
* `selectable` determines whether an element can be selected or not. Default value is `true`.
|
|
1508
|
+
* `collapsable` determines whether an element with a `sticky` property greater than zero can collapse and
|
|
1509
|
+
* collapse elements in front that do not have a `sticky` property.
|
|
1510
|
+
* `fullSize` determines the size of an element when rendering lists with cell divisions. If sticky is 1 or 2, fullSize automatically becomes true. The default value is false.
|
|
1511
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/models/item-config-map.model.ts
|
|
1512
|
+
* @author Evgenii Alexandrovich Grebennikov
|
|
1513
|
+
* @email djonnyx@gmail.com
|
|
1514
|
+
*/
|
|
1515
|
+
set itemConfigMap(v) {
|
|
1516
|
+
if (this._$itemConfigMap.getValue() === v) {
|
|
1517
|
+
return;
|
|
1518
|
+
}
|
|
1519
|
+
const transformedValue = this._itemConfigMapTransform(v);
|
|
1520
|
+
this._$itemConfigMap.next(transformedValue);
|
|
1521
|
+
}
|
|
1522
|
+
;
|
|
1523
|
+
get itemConfigMap() { return this._$itemConfigMap.getValue(); }
|
|
1524
|
+
/**
|
|
1525
|
+
* If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element.
|
|
1526
|
+
* If the `dynamicSize` property is true, the items in the list can have different sizes, and you must specify the `itemSize` property
|
|
1527
|
+
* to adjust the sizes of the items in the unallocated area.
|
|
1528
|
+
* If the value is 'viewport', the sizes of elements are automatically resized to fit the viewport size.
|
|
1529
|
+
*/
|
|
1530
|
+
set itemSize(v) {
|
|
1531
|
+
if (this._$itemSize.getValue() === v) {
|
|
1532
|
+
return;
|
|
1533
|
+
}
|
|
1534
|
+
const transformedValue = this._itemSizeTransform(v);
|
|
1535
|
+
this._$itemSize.next(transformedValue);
|
|
1536
|
+
}
|
|
1537
|
+
;
|
|
1538
|
+
get itemSize() { return this._$itemSize.getValue(); }
|
|
1539
|
+
/**
|
|
1540
|
+
* If the `dynamicSize` property is enabled, the minimum size of the element is set.
|
|
1541
|
+
* If the value is 'viewport', the sizes of elements are automatically resized to fit the viewport size.
|
|
1542
|
+
*/
|
|
1543
|
+
set minItemSize(v) {
|
|
1544
|
+
if (this._$minItemSize.getValue() === v) {
|
|
1545
|
+
return;
|
|
1546
|
+
}
|
|
1547
|
+
const transformedValue = this._minItemSizeTransform(v);
|
|
1548
|
+
this._$minItemSize.next(transformedValue);
|
|
1549
|
+
}
|
|
1550
|
+
;
|
|
1551
|
+
get minItemSize() { return this._$minItemSize.getValue(); }
|
|
1552
|
+
/**
|
|
1553
|
+
* If the `dynamicSize` property is enabled, the maximum size of the element is set.
|
|
1554
|
+
* If the value is 'viewport', the sizes of elements are automatically resized to fit the viewport size.
|
|
1555
|
+
*/
|
|
1556
|
+
set maxItemSize(v) {
|
|
1557
|
+
if (this._$maxItemSize.getValue() === v) {
|
|
1558
|
+
return;
|
|
1559
|
+
}
|
|
1560
|
+
const transformedValue = this._maxItemSizeTransform(v);
|
|
1561
|
+
this._$maxItemSize.next(transformedValue);
|
|
1562
|
+
}
|
|
1563
|
+
;
|
|
1564
|
+
get maxItemSize() { return this._$maxItemSize.getValue(); }
|
|
1565
|
+
/**
|
|
1566
|
+
* If true, items in the list may have different sizes, and the itemSize property must be specified to adjust
|
|
1567
|
+
* the sizes of items in the unallocated area.
|
|
1568
|
+
* If false then the items in the list have a fixed size specified by the itemSize property. The default value is true.
|
|
1569
|
+
*/
|
|
1570
|
+
set dynamicSize(v) {
|
|
1571
|
+
if (this._$dynamicSize.getValue() === v) {
|
|
1572
|
+
return;
|
|
1573
|
+
}
|
|
1574
|
+
const transformedValue = this._dynamicSizeTransform(v);
|
|
1575
|
+
this._$dynamicSize.next(transformedValue);
|
|
1576
|
+
}
|
|
1577
|
+
;
|
|
1578
|
+
get dynamicSize() { return this._$dynamicSize.getValue(); }
|
|
1579
|
+
/**
|
|
1580
|
+
* Determines the direction in which elements are placed. Default value is "vertical".
|
|
1581
|
+
*/
|
|
1582
|
+
set direction(v) {
|
|
1583
|
+
if (this._$direction.getValue() === v) {
|
|
1584
|
+
return;
|
|
1585
|
+
}
|
|
1586
|
+
const transformedValue = this._directionTransform(v);
|
|
1587
|
+
this._$direction.next(transformedValue);
|
|
1588
|
+
}
|
|
1589
|
+
;
|
|
1590
|
+
get direction() { return this._$direction.getValue(); }
|
|
1591
|
+
/**
|
|
1592
|
+
* Determines the action modes for collection elements. Default value is "normal".
|
|
1593
|
+
*/
|
|
1594
|
+
set collectionMode(v) {
|
|
1595
|
+
if (this._$collectionMode.getValue() === v) {
|
|
1596
|
+
return;
|
|
1597
|
+
}
|
|
1598
|
+
const transformedValue = this._collectionModeTransform(v);
|
|
1599
|
+
this._$collectionMode.next(transformedValue);
|
|
1600
|
+
}
|
|
1601
|
+
;
|
|
1602
|
+
get collectionMode() { return this._$collectionMode.getValue(); }
|
|
1603
|
+
/**
|
|
1604
|
+
* Number of elements outside the scope of visibility. Default value is 2.
|
|
1605
|
+
*/
|
|
1606
|
+
set bufferSize(v) {
|
|
1607
|
+
if (this._$bufferSize.getValue() === v) {
|
|
1608
|
+
return;
|
|
1609
|
+
}
|
|
1610
|
+
const transformedValue = this._bufferSizeTransform(v);
|
|
1611
|
+
this._$bufferSize.next(transformedValue);
|
|
1612
|
+
}
|
|
1613
|
+
;
|
|
1614
|
+
get bufferSize() { return this._$bufferSize.getValue(); }
|
|
1615
|
+
/**
|
|
1616
|
+
* Maximum number of elements outside the scope of visibility. Default value is 100.
|
|
1617
|
+
* If maxBufferSize is set to be greater than bufferSize, then adaptive buffer mode is enabled.
|
|
1618
|
+
* The greater the scroll size, the more elements are allocated for rendering.
|
|
1619
|
+
*/
|
|
1620
|
+
set maxBufferSize(v) {
|
|
1621
|
+
const val = this._maxBufferSizeTransform(v);
|
|
1622
|
+
if (this._$maxBufferSize.getValue() === val) {
|
|
1623
|
+
return;
|
|
1624
|
+
}
|
|
1625
|
+
this._$maxBufferSize.next(val);
|
|
1626
|
+
}
|
|
1627
|
+
;
|
|
1628
|
+
get maxBufferSize() { return this._$maxBufferSize.getValue(); }
|
|
1629
|
+
/**
|
|
1630
|
+
* Snapping method. Default value is 'standart'.
|
|
1631
|
+
* 'standart' - Classic group visualization.
|
|
1632
|
+
* 'advanced' - A mask is applied to the viewport area so that the background is displayed underneath the attached group.
|
|
1633
|
+
*/
|
|
1634
|
+
set snappingMethod(v) {
|
|
1635
|
+
if (this._$snappingMethod.getValue() === v) {
|
|
1636
|
+
return;
|
|
1637
|
+
}
|
|
1638
|
+
const transformedValue = this._snappingMethodTransform(v);
|
|
1639
|
+
this._$snappingMethod.next(transformedValue);
|
|
1640
|
+
}
|
|
1641
|
+
;
|
|
1642
|
+
get snappingMethod() { return this._$snappingMethod.getValue(); }
|
|
1643
|
+
/**
|
|
1644
|
+
* Mode for collapsing list items.
|
|
1645
|
+
* `none` - List items are not selectable.
|
|
1646
|
+
* `multi-collapse` - List items are collapsed one by one.
|
|
1647
|
+
* 'accordion' - Accordion collapsible list items.
|
|
1648
|
+
* Default value is `multi-collapse
|
|
1649
|
+
*/
|
|
1650
|
+
set collapsingMode(v) {
|
|
1651
|
+
if (this._$collapsingMode.getValue() === v) {
|
|
1652
|
+
return;
|
|
1653
|
+
}
|
|
1654
|
+
const transformedValue = this._collapsingModeTransform(v);
|
|
1655
|
+
this._$collapsingMode.next(transformedValue);
|
|
1656
|
+
}
|
|
1657
|
+
;
|
|
1658
|
+
get collapsingMode() { return this._$collapsingMode.getValue(); }
|
|
1659
|
+
/**
|
|
1660
|
+
* @deprecated
|
|
1661
|
+
* The "methodForSelecting" property is deprecated. Use the "selectMode" property.
|
|
1662
|
+
*/
|
|
1663
|
+
set methodForSelecting(v) {
|
|
1664
|
+
throw new Error('The "methodForSelecting" property is deprecated. Use the "selectMode" property instead.');
|
|
1665
|
+
}
|
|
1666
|
+
;
|
|
1667
|
+
/**
|
|
1668
|
+
* Method for selecting list items. Default value is 'none'.
|
|
1669
|
+
* 'select' - List items are selected one by one.
|
|
1670
|
+
* 'multi-select' - Multiple selection of list items.
|
|
1671
|
+
* 'none' - List items are not selectable.
|
|
1672
|
+
*/
|
|
1673
|
+
set selectingMode(v) {
|
|
1674
|
+
if (this._$selectingMode.getValue() === v) {
|
|
1675
|
+
return;
|
|
1676
|
+
}
|
|
1677
|
+
const transformedValue = this._selectingModeTransform(v);
|
|
1678
|
+
this._$selectingMode.next(transformedValue);
|
|
1679
|
+
}
|
|
1680
|
+
;
|
|
1681
|
+
get selectingMode() { return this._$selectingMode.getValue(); }
|
|
1682
|
+
/**
|
|
1683
|
+
* The name of the property by which tracking is performed
|
|
1684
|
+
*/
|
|
1685
|
+
set trackBy(v) {
|
|
1686
|
+
if (this._$trackBy.getValue() === v) {
|
|
1687
|
+
return;
|
|
1688
|
+
}
|
|
1689
|
+
const transformedValue = this._trackByTransform(v);
|
|
1690
|
+
this._$trackBy.next(transformedValue);
|
|
1691
|
+
}
|
|
1692
|
+
;
|
|
1693
|
+
get trackBy() { return this._$trackBy.getValue(); }
|
|
1694
|
+
/**
|
|
1695
|
+
* Message for screen reader.
|
|
1696
|
+
* The message format is: "some text $1 some text $2",
|
|
1697
|
+
* where $1 is the number of the first element of the screen collection,
|
|
1698
|
+
* $2 is the number of the last element of the screen collection.
|
|
1699
|
+
*/
|
|
1700
|
+
set screenReaderMessage(v) {
|
|
1701
|
+
if (this._$screenReaderMessage.getValue() === v) {
|
|
1702
|
+
return;
|
|
1703
|
+
}
|
|
1704
|
+
const transformedValue = this._screenReaderMessageTransform(v);
|
|
1705
|
+
this._$screenReaderMessage.next(transformedValue);
|
|
1706
|
+
}
|
|
1707
|
+
;
|
|
1708
|
+
get screenReaderMessage() { return this._$screenReaderMessage.getValue(); }
|
|
1709
|
+
/**
|
|
1710
|
+
* A string indicating the direction of text for the locale.
|
|
1711
|
+
* Can be either "ltr" (left-to-right) or "rtl" (right-to-left).
|
|
1712
|
+
*/
|
|
1713
|
+
set langTextDir(v) {
|
|
1714
|
+
if (this._$langTextDir.getValue() === v) {
|
|
1715
|
+
return;
|
|
1716
|
+
}
|
|
1717
|
+
const transformedValue = this._langTextDirTransform(v);
|
|
1718
|
+
this._$langTextDir.next(transformedValue);
|
|
1719
|
+
}
|
|
1720
|
+
;
|
|
1721
|
+
get langTextDir() { return this._$langTextDir.getValue(); }
|
|
1722
|
+
get isInfinity() {
|
|
1723
|
+
return this._$isInfinity.getValue();
|
|
1724
|
+
}
|
|
1725
|
+
get isVertical() {
|
|
1726
|
+
return this._isVertical;
|
|
1727
|
+
}
|
|
1728
|
+
get actualAlignment() { return this._$actualAlignment.getValue(); }
|
|
1729
|
+
get actualItemSize() { return this._$actualItemSize.getValue(); }
|
|
1730
|
+
get actualMinItemSize() { return this._$actualMinItemSize.getValue(); }
|
|
1731
|
+
get actualMaxItemSize() { return this._$actualMaxItemSize.getValue(); }
|
|
1732
|
+
get itemComponentClass() { return this._itemComponentClass; }
|
|
1733
|
+
get cachable() {
|
|
1734
|
+
return this._prerender?.active ?? false;
|
|
1735
|
+
}
|
|
1736
|
+
get prerenderable() {
|
|
1737
|
+
return this.dynamicSize && (this._trackBox?.isSnappedToEnd ?? false);
|
|
1738
|
+
}
|
|
1739
|
+
ngAfterViewInit() {
|
|
1740
|
+
const _$created = new BehaviorSubject(false), $created = _$created.asObservable();
|
|
1741
|
+
combineLatest([$created, this.$show]).pipe(takeUntil(this._$unsubscribe), filter(([created, shown]) => created && shown), debounceTime(1), tap(v => {
|
|
1742
|
+
this._$initialized.next(true);
|
|
1743
|
+
})).subscribe();
|
|
1744
|
+
this._$scroller.next(this._scrollerComponent?.scrollViewport);
|
|
1745
|
+
this._$list.next(this._scrollerComponent?.scrollContent);
|
|
1746
|
+
const $bounds = this._$bounds.asObservable().pipe(filter(b => !!b)), $scrollerComponent = of(this._scrollerComponent), $resizeViewport = $scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(scroller => scroller.$resizeViewport)), $resizeContent = $scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(scroller => scroller.$resizeContent));
|
|
1747
|
+
$scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(scroller => scroller.$scrollDirection), tap(v => {
|
|
1748
|
+
this._trackBox.scrollDirection = v;
|
|
1749
|
+
})).subscribe();
|
|
1750
|
+
$resizeViewport.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(v => {
|
|
1751
|
+
this._$bounds.next(v);
|
|
1752
|
+
this.onAfterResize(true);
|
|
1753
|
+
})).subscribe();
|
|
1754
|
+
$resizeContent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(v => {
|
|
1755
|
+
this._$listBounds.next(v);
|
|
1756
|
+
this.onAfterResize();
|
|
1757
|
+
})).subscribe();
|
|
1758
|
+
const $trackBy = this.$trackBy;
|
|
1759
|
+
$trackBy.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
1760
|
+
this._service.trackBy = this._trackBox.trackBy = v;
|
|
1761
|
+
})).subscribe();
|
|
1762
|
+
this._trackBox.displayComponents = this._displayComponents;
|
|
1763
|
+
let hasUserAction = false;
|
|
1764
|
+
const $itemSize = this.$itemSize.pipe(map(v => typeof v === 'number' && v <= 0 ? DEFAULT_ITEM_SIZE : v)), $minItemSize = this.$minItemSize.pipe(map(v => typeof v === 'number' && v <= 0 ? DEFAULT_MIN_ITEM_SIZE : v)), $maxItemSize = this.$maxItemSize.pipe(map(v => typeof v === 'number' && v <= 0 ? DEFAULT_MAX_ITEM_SIZE : v)), $scrollStartOffset = this.$actualScrollStartOffset.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged()), $scrollEndOffset = this.$actualScrollEndOffset.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged());
|
|
1765
|
+
combineLatest([$minItemSize, $bounds, $scrollStartOffset, $scrollEndOffset]).pipe(takeUntil(this._$unsubscribe), switchMap(([v, bounds, startOffset, endOffset]) => {
|
|
1766
|
+
if (v === VIEWPORT) {
|
|
1767
|
+
const isVertical = this.isVertical, viewportBounds = bounds, result = (isVertical ? (viewportBounds?.height ?? 0) : (viewportBounds?.width ?? 0)) - startOffset - endOffset;
|
|
1768
|
+
return of(result <= 0 ? 1 : result);
|
|
1769
|
+
}
|
|
1770
|
+
return of(v);
|
|
1771
|
+
}), tap(v => {
|
|
1772
|
+
this._$actualMinItemSize.next(v);
|
|
1773
|
+
})).subscribe();
|
|
1774
|
+
combineLatest([$maxItemSize, $bounds, $scrollStartOffset, $scrollEndOffset]).pipe(takeUntil(this._$unsubscribe), switchMap(([v, bounds, startOffset, endOffset]) => {
|
|
1775
|
+
if (v === VIEWPORT) {
|
|
1776
|
+
const isVertical = this.isVertical, viewportBounds = bounds, result = (isVertical ? (viewportBounds?.height ?? 0) : (viewportBounds?.width ?? 0)) - startOffset - endOffset;
|
|
1777
|
+
return of(result <= 0 ? 1 : result);
|
|
1778
|
+
}
|
|
1779
|
+
return of(v);
|
|
1780
|
+
}), tap(v => {
|
|
1781
|
+
this._$actualMaxItemSize.next(v);
|
|
1782
|
+
})).subscribe();
|
|
1783
|
+
const $actualMinItemSize = this.$actualMinItemSize, $actualMaxItemSize = this.$actualMaxItemSize;
|
|
1784
|
+
combineLatest([$itemSize, $bounds, $actualMinItemSize, $actualMaxItemSize, $scrollStartOffset, $scrollEndOffset]).pipe(takeUntil(this._$unsubscribe), switchMap(([v, bounds, min, max, startOffset, endOffset]) => {
|
|
1785
|
+
if (v === VIEWPORT) {
|
|
1786
|
+
const isVertical = this.isVertical, viewportBounds = bounds, result = (isVertical ? (viewportBounds?.height ?? 0) : (viewportBounds?.width ?? 0)) - startOffset - endOffset;
|
|
1787
|
+
return of(result < min ? min : (result > max ? max : result));
|
|
1788
|
+
}
|
|
1789
|
+
return of(v < min ? min : (v > max ? max : v));
|
|
1790
|
+
}), tap(v => {
|
|
1791
|
+
this._$actualItemSize.next(v);
|
|
1792
|
+
this._service.itemSize = v;
|
|
1793
|
+
})).subscribe();
|
|
1794
|
+
const $actualItemSize = this.$actualItemSize, $actualItems = this._$actualItems.asObservable().pipe(takeUntil(this._$unsubscribe), distinctUntilChanged());
|
|
1795
|
+
this._service.$focusItem.pipe(takeUntil(this._$unsubscribe), tap(params => {
|
|
1796
|
+
const { element, position, align, behavior } = params;
|
|
1797
|
+
this.focusItem(element, position, align, behavior);
|
|
1798
|
+
})).subscribe();
|
|
1799
|
+
const $list = this.$list.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement), take(1));
|
|
1800
|
+
const preventKeyboardEvent = (event, isVertical) => {
|
|
1801
|
+
const scroller = this._scrollerComponent;
|
|
1802
|
+
if (!!scroller) {
|
|
1803
|
+
const scrollStartOffset = this._$actualScrollStartOffset.getValue(), scrollable = scroller.scrollable ?? false, scrollSize = isVertical ? scroller.scrollTop : scroller.scrollLeft, scrollWeight = isVertical ? scroller.scrollHeight : scroller.scrollWidth;
|
|
1804
|
+
if (scrollable || scrollSize <= scrollStartOffset || scrollSize >= scrollWeight) {
|
|
1805
|
+
if (!!event && event.cancelable) {
|
|
1806
|
+
event.stopImmediatePropagation();
|
|
1807
|
+
event.preventDefault();
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
};
|
|
1812
|
+
$list.pipe(takeUntil(this._$unsubscribe), filter(element => !!element), switchMap(element => {
|
|
1813
|
+
return fromEvent(element, EVENT_KEY_DOWN).pipe(takeUntil(this._$unsubscribe), switchMap(e => {
|
|
1814
|
+
switch (e.key) {
|
|
1815
|
+
case KEY_ARR_LEFT:
|
|
1816
|
+
if (!this.isVertical) {
|
|
1817
|
+
preventKeyboardEvent(e, this.isVertical);
|
|
1818
|
+
}
|
|
1819
|
+
break;
|
|
1820
|
+
case KEY_ARR_UP:
|
|
1821
|
+
if (this.isVertical) {
|
|
1822
|
+
preventKeyboardEvent(e, this.isVertical);
|
|
1823
|
+
}
|
|
1824
|
+
break;
|
|
1825
|
+
case KEY_ARR_RIGHT:
|
|
1826
|
+
if (!this.isVertical) {
|
|
1827
|
+
preventKeyboardEvent(e, this.isVertical);
|
|
1828
|
+
}
|
|
1829
|
+
break;
|
|
1830
|
+
case KEY_ARR_DOWN:
|
|
1831
|
+
if (this.isVertical) {
|
|
1832
|
+
preventKeyboardEvent(e, this.isVertical);
|
|
1833
|
+
}
|
|
1834
|
+
break;
|
|
1835
|
+
}
|
|
1836
|
+
return of(null);
|
|
1837
|
+
}));
|
|
1838
|
+
})).subscribe();
|
|
1839
|
+
const $scrollbarThickness = this.$scrollbarThickness;
|
|
1840
|
+
$scrollbarThickness.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(scrollbarThickness => {
|
|
1841
|
+
this._service.scrollBarSize = scrollbarThickness;
|
|
1842
|
+
})).subscribe();
|
|
1843
|
+
this.$fireUpdateNextFrame.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(userAction => {
|
|
1844
|
+
this._$fireUpdate.next(userAction);
|
|
1845
|
+
})).subscribe();
|
|
1846
|
+
const $scrollToItem = this.$scrollTo.pipe(takeUntil(this._$unsubscribe)), $mouseDown = fromEvent(this._elementRef.nativeElement, MOUSE_DOWN).pipe(takeUntil(this._$unsubscribe)), $touchStart = fromEvent(this._elementRef.nativeElement, TOUCH_START).pipe(takeUntil(this._$unsubscribe));
|
|
1847
|
+
fromEvent(document, KEY_DOWN).pipe(takeUntil(this._$unsubscribe), filter(e => e.key === KEY_TAB), switchMap(e => {
|
|
1848
|
+
return fromEvent(this._elementRef.nativeElement, FOCUS).pipe(takeUntil(this._$unsubscribe), delay(0), takeUntil($scrollToItem), takeUntil($mouseDown), takeUntil($touchStart), tap(e => {
|
|
1849
|
+
this._service.focusFirstElement();
|
|
1850
|
+
}));
|
|
1851
|
+
})).subscribe();
|
|
1852
|
+
this._service.$scrollToStart.pipe(takeUntil(this._$unsubscribe), tap(options => {
|
|
1853
|
+
this.scrollToStart(null, options);
|
|
1854
|
+
})).subscribe();
|
|
1855
|
+
this._service.$scrollTo.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(params => {
|
|
1856
|
+
const { id, cb, options } = params;
|
|
1857
|
+
this.scrollTo(id, cb, options);
|
|
1858
|
+
})).subscribe();
|
|
1859
|
+
this._service.$scrollToEnd.pipe(takeUntil(this._$unsubscribe), tap(options => {
|
|
1860
|
+
this.scrollToEnd(null, options);
|
|
1861
|
+
})).subscribe();
|
|
1862
|
+
this.$langTextDir.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
1863
|
+
this._service.langTextDir = v;
|
|
1864
|
+
})).subscribe();
|
|
1865
|
+
this.$clickDistance.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
1866
|
+
this._service.clickDistance = v;
|
|
1867
|
+
})).subscribe();
|
|
1868
|
+
combineLatest([this.$snapScrollToStart, this.$isInfinity]).pipe(takeUntil(this._$unsubscribe), tap(([snapScrollToStart, isInfinity]) => {
|
|
1869
|
+
this._$actualSnapScrollToStart.next(isInfinity ? false : snapScrollToStart);
|
|
1870
|
+
})).subscribe();
|
|
1871
|
+
combineLatest([this.$snapScrollToEnd, this.$isInfinity]).pipe(takeUntil(this._$unsubscribe), tap(([snapScrollToEnd, isInfinity]) => {
|
|
1872
|
+
this._$actualSnapScrollToEnd.next(isInfinity ? false : snapScrollToEnd);
|
|
1873
|
+
})).subscribe();
|
|
1874
|
+
const $viewInit = this.$viewInit, $prerenderContainer = of(this._prerender);
|
|
1875
|
+
const $prerender = $viewInit.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(v => {
|
|
1876
|
+
return $prerenderContainer.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(v => v.$render));
|
|
1877
|
+
}));
|
|
1878
|
+
const $fireUpdate = this.$fireUpdate;
|
|
1879
|
+
$fireUpdate.pipe(takeUntil(this._$unsubscribe), tap(userAction => {
|
|
1880
|
+
hasUserAction = userAction;
|
|
1881
|
+
})).subscribe();
|
|
1882
|
+
const $update = this.$update, renderStabilizer = (options) => {
|
|
1883
|
+
let renderStabilizerPrevScrollStateVersion = EMPTY_SCROLL_STATE_VERSION, renderStabilizerUpdateIterations = 0;
|
|
1884
|
+
const prepareIterations = options?.prepareIterations ?? PREPARE_ITERATIONS, prepareReupdateLength = options?.prepareReupdateLength ?? PREPARATION_REUPDATE_LENGTH;
|
|
1885
|
+
return of(null).pipe(takeUntil(this._$unsubscribe), switchMap(() => {
|
|
1886
|
+
renderStabilizerPrevScrollStateVersion = EMPTY_SCROLL_STATE_VERSION;
|
|
1887
|
+
renderStabilizerUpdateIterations = 0;
|
|
1888
|
+
this._cached = false;
|
|
1889
|
+
return $update.pipe(takeUntil(this._$unsubscribe), debounceTime(0), switchMap(v => {
|
|
1890
|
+
if (((renderStabilizerPrevScrollStateVersion === EMPTY_SCROLL_STATE_VERSION) || (renderStabilizerPrevScrollStateVersion !== v)) &&
|
|
1891
|
+
(renderStabilizerUpdateIterations < prepareIterations)) {
|
|
1892
|
+
if (v !== EMPTY_SCROLL_STATE_VERSION) {
|
|
1893
|
+
renderStabilizerPrevScrollStateVersion = v;
|
|
1894
|
+
}
|
|
1895
|
+
this._$fireUpdate.next(false);
|
|
1896
|
+
return of(false);
|
|
1897
|
+
}
|
|
1898
|
+
if (renderStabilizerPrevScrollStateVersion === v) {
|
|
1899
|
+
if (renderStabilizerUpdateIterations < prepareReupdateLength) {
|
|
1900
|
+
renderStabilizerUpdateIterations++;
|
|
1901
|
+
this._$fireUpdate.next(false);
|
|
1902
|
+
return of(false);
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
renderStabilizerPrevScrollStateVersion = v;
|
|
1906
|
+
return of(true);
|
|
1907
|
+
}), filter(v => !!v), distinctUntilChanged());
|
|
1908
|
+
}));
|
|
1909
|
+
};
|
|
1910
|
+
const $initialRenderStabilizer = renderStabilizer({
|
|
1911
|
+
prepareIterations: PREPARE_ITERATIONS,
|
|
1912
|
+
prepareReupdateLength: PREPARATION_REUPDATE_LENGTH,
|
|
1913
|
+
}), $updateItemsRenderStabilizer = renderStabilizer({
|
|
1914
|
+
prepareIterations: PREPARE_ITERATIONS_FOR_UPDATE_ITEMS,
|
|
1915
|
+
prepareReupdateLength: PREPARATION_REUPDATE_LENGTH_FOR_UPDATE_ITEMS,
|
|
1916
|
+
}), $chunkLoadingRenderStabilizer = renderStabilizer({
|
|
1917
|
+
prepareIterations: PREPARE_ITERATIONS_FOR_UPDATE_ITEMS,
|
|
1918
|
+
prepareReupdateLength: PREPARATION_REUPDATE_LENGTH_FOR_UPDATE_ITEMS,
|
|
1919
|
+
}), $collapseItemsRenderStabilizer = renderStabilizer({
|
|
1920
|
+
prepareIterations: PREPARE_ITERATIONS_FOR_COLLAPSE_ITEMS,
|
|
1921
|
+
prepareReupdateLength: PREPARATION_REUPDATE_LENGTH_FOR_COLLAPSE_ITEMS,
|
|
1922
|
+
}), $itemConfigMap = this.$itemConfigMap.pipe(map(v => !v ? {} : v)), $divides = this.$divides, $dynamicSize = this.$dynamicSize, $snapScrollToStart = this._$actualSnapScrollToStart.asObservable(), $snapScrollToEnd = this._$actualSnapScrollToEnd.asObservable(), $waitForPreparation = this.$waitForPreparation, $items = this.$items;
|
|
1923
|
+
combineLatest([$viewInit, $prerenderContainer, $divides, $dynamicSize, $snapScrollToStart, $snapScrollToEnd, $waitForPreparation]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), filter(([init, prerenderContainer]) => !!init && !!prerenderContainer), debounceTime(0), switchMap(([, prerenderContainer, divides, dynamicSize, snapScrollToStart, snapScrollToEnd, waitForPreparation]) => {
|
|
1924
|
+
if (!!dynamicSize && !snapScrollToStart && !!snapScrollToEnd && !!waitForPreparation) {
|
|
1925
|
+
const $collection = (divides > 1 ? $actualItems : $items);
|
|
1926
|
+
return $collection.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged((p, c) => {
|
|
1927
|
+
const pLength = p?.length ?? 0, cLength = c?.length ?? 0;
|
|
1928
|
+
return !((cLength > 0) || (pLength !== cLength && (pLength === 0 || cLength === 0)));
|
|
1929
|
+
}), tap(items => {
|
|
1930
|
+
this._trackBox.resetCollection(items, this.actualItemSize);
|
|
1931
|
+
}), switchMap(i => of((i ?? []).length > 0)), distinctUntilChanged(), tap(v => {
|
|
1932
|
+
if (!v) {
|
|
1933
|
+
this.cacheClean();
|
|
1934
|
+
this.cleanup();
|
|
1935
|
+
this._readyForShow = false;
|
|
1936
|
+
if (!snapScrollToStart && snapScrollToEnd) {
|
|
1937
|
+
this._trackBox.isScrollEnd = true;
|
|
1938
|
+
}
|
|
1939
|
+
const scrollerComponent = this._scrollerComponent;
|
|
1940
|
+
if (!!scrollerComponent) {
|
|
1941
|
+
scrollerComponent.prepared = false;
|
|
1942
|
+
scrollerComponent.stopScrolling();
|
|
1943
|
+
scrollerComponent.refresh();
|
|
1944
|
+
}
|
|
1945
|
+
this._$classes.next({ prepared: true });
|
|
1946
|
+
this._$show.next(true);
|
|
1947
|
+
}
|
|
1948
|
+
else {
|
|
1949
|
+
this._trackBox.isScrollEnd = true;
|
|
1950
|
+
const waitForPreparation = this.waitForPreparation;
|
|
1951
|
+
if (waitForPreparation) {
|
|
1952
|
+
if (this.prerenderable) {
|
|
1953
|
+
this._cached = false;
|
|
1954
|
+
prerenderContainer.on(this.items);
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
this._$classes.next({ prepared: false });
|
|
1958
|
+
this._$show.next(false);
|
|
1959
|
+
}
|
|
1960
|
+
}), switchMap(v => {
|
|
1961
|
+
if (!v) {
|
|
1962
|
+
if (this.prerenderable) {
|
|
1963
|
+
prerenderContainer.off();
|
|
1964
|
+
}
|
|
1965
|
+
return of(false);
|
|
1966
|
+
}
|
|
1967
|
+
const waitForPreparation = this.waitForPreparation;
|
|
1968
|
+
if (waitForPreparation) {
|
|
1969
|
+
this._trackBox.isScrollEnd = true;
|
|
1970
|
+
if (this.prerenderable) {
|
|
1971
|
+
this._cached = false;
|
|
1972
|
+
prerenderContainer.on(this.items);
|
|
1973
|
+
}
|
|
1974
|
+
return $initialRenderStabilizer.pipe(takeUntil(this._$unsubscribe), take(1), tap(() => {
|
|
1975
|
+
this._trackBox.isScrollEnd = true;
|
|
1976
|
+
if (this.prerenderable) {
|
|
1977
|
+
prerenderContainer.off();
|
|
1978
|
+
}
|
|
1979
|
+
this._readyForShow = true;
|
|
1980
|
+
const scrollerComponent = this._scrollerComponent;
|
|
1981
|
+
if (!!scrollerComponent) {
|
|
1982
|
+
scrollerComponent.prepared = true;
|
|
1983
|
+
scrollerComponent.refresh();
|
|
1984
|
+
}
|
|
1985
|
+
this._$classes.next({ prepared: true });
|
|
1986
|
+
this._$show.next(true);
|
|
1987
|
+
}));
|
|
1988
|
+
}
|
|
1989
|
+
if (this.prerenderable) {
|
|
1990
|
+
prerenderContainer.off();
|
|
1991
|
+
}
|
|
1992
|
+
this._readyForShow = true;
|
|
1993
|
+
if (!snapScrollToStart && snapScrollToEnd) {
|
|
1994
|
+
this._trackBox.isScrollEnd = true;
|
|
1995
|
+
}
|
|
1996
|
+
const scrollerComponent = this._scrollerComponent;
|
|
1997
|
+
if (!!scrollerComponent) {
|
|
1998
|
+
scrollerComponent.prepared = true;
|
|
1999
|
+
scrollerComponent.refresh();
|
|
2000
|
+
}
|
|
2001
|
+
this._$classes.next({ prepared: true });
|
|
2002
|
+
this._$show.next(true);
|
|
2003
|
+
return of(false);
|
|
2004
|
+
}));
|
|
2005
|
+
}
|
|
2006
|
+
else {
|
|
2007
|
+
prerenderContainer.off();
|
|
2008
|
+
const $collection = (divides > 1 ? $actualItems : $items);
|
|
2009
|
+
return $collection.pipe(takeUntil(this._$unsubscribe), tap(items => {
|
|
2010
|
+
if (!items || items.length === 0) {
|
|
2011
|
+
this.cacheClean();
|
|
2012
|
+
const scrollerComponent = this._scrollerComponent;
|
|
2013
|
+
if (!!scrollerComponent) {
|
|
2014
|
+
scrollerComponent.prepared = false;
|
|
2015
|
+
}
|
|
2016
|
+
this._$classes.next({ prepared: false });
|
|
2017
|
+
this._$show.next(false);
|
|
2018
|
+
}
|
|
2019
|
+
this._trackBox.resetCollection(items, this.actualItemSize);
|
|
2020
|
+
}), switchMap(i => of((i ?? []).length > 0)), distinctUntilChanged(), filter(v => !!v), tap(() => {
|
|
2021
|
+
this._readyForShow = true;
|
|
2022
|
+
if (snapScrollToStart) {
|
|
2023
|
+
this._trackBox.isScrollStart = true;
|
|
2024
|
+
}
|
|
2025
|
+
else if (snapScrollToEnd) {
|
|
2026
|
+
this._trackBox.isScrollEnd = true;
|
|
2027
|
+
}
|
|
2028
|
+
const scrollerComponent = this._scrollerComponent;
|
|
2029
|
+
if (!!scrollerComponent) {
|
|
2030
|
+
scrollerComponent.prepared = true;
|
|
2031
|
+
scrollerComponent.refresh();
|
|
2032
|
+
}
|
|
2033
|
+
this._$classes.next({ prepared: true });
|
|
2034
|
+
this._$show.next(true);
|
|
2035
|
+
this._$fireUpdate.next(false);
|
|
2036
|
+
}));
|
|
2037
|
+
}
|
|
2038
|
+
})).subscribe();
|
|
2039
|
+
$items.pipe(map(v => v?.length > 0), distinctUntilChanged(), takeUntil(this._$unsubscribe), filter(v => !!v), tap(() => {
|
|
2040
|
+
this._cached = false;
|
|
2041
|
+
}), switchMap(() => {
|
|
2042
|
+
return $prerender.pipe(takeUntil(this._$unsubscribe), debounceTime(0), take(1), tap(cache => {
|
|
2043
|
+
if (!this._readyForShow) {
|
|
2044
|
+
this._trackBox.refreshCache(cache);
|
|
2045
|
+
this._cached = true;
|
|
2046
|
+
this._$fireUpdate.next(true);
|
|
2047
|
+
}
|
|
2048
|
+
}));
|
|
2049
|
+
})).subscribe();
|
|
2050
|
+
this._service.$focusedId.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2051
|
+
this._$focusedElement.next(v ?? null);
|
|
2052
|
+
})).subscribe();
|
|
2053
|
+
$list.pipe(takeUntil(this._$unsubscribe), filter(element => !!element), tap(element => {
|
|
2054
|
+
this._service.listElement = element;
|
|
2055
|
+
})).subscribe();
|
|
2056
|
+
const $defaultItemValue = this.$defaultItemValue, $selectByClick = this.$selectByClick, $collapseByClick = this.$collapseByClick, $isScrollStart = this._$isScrollStart.asObservable(), $isScrollFinished = this._$isScrollEnd.asObservable(), $isVertical = this.$direction.pipe(map(v => this.getIsVertical(v || DEFAULT_DIRECTION)));
|
|
2057
|
+
$snapScrollToStart.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2058
|
+
this._service.snapScrollToStart = v;
|
|
2059
|
+
})).subscribe();
|
|
2060
|
+
$snapScrollToEnd.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2061
|
+
this._service.snapScrollToEnd = v;
|
|
2062
|
+
})).subscribe();
|
|
2063
|
+
$isVertical.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2064
|
+
this._service.isVertical = v;
|
|
2065
|
+
})).subscribe();
|
|
2066
|
+
$dynamicSize.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2067
|
+
this._service.dynamic = v;
|
|
2068
|
+
})).subscribe();
|
|
2069
|
+
$defaultItemValue.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2070
|
+
this._service.defaultItemValue = v;
|
|
2071
|
+
})).subscribe();
|
|
2072
|
+
$scrollStartOffset.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2073
|
+
this._trackBox.scrollStartOffset = this._service.scrollStartOffset = v;
|
|
2074
|
+
})).subscribe();
|
|
2075
|
+
$scrollEndOffset.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2076
|
+
this._trackBox.scrollEndOffset = this._service.scrollEndOffset = v;
|
|
2077
|
+
})).subscribe();
|
|
2078
|
+
$isScrollStart.pipe(takeUntil(this._$unsubscribe), skip(1), distinctUntilChanged(), debounceTime(0), filter(v => !!v && this._readyForShow), tap(() => {
|
|
2079
|
+
if (this._scrollerComponent?.scrollable) {
|
|
2080
|
+
this.onScrollReachStart.emit();
|
|
2081
|
+
}
|
|
2082
|
+
})).subscribe();
|
|
2083
|
+
$isScrollFinished.pipe(takeUntil(this._$unsubscribe), skip(1), distinctUntilChanged(), debounceTime(0), filter(v => !!v && this._readyForShow), tap(v => {
|
|
2084
|
+
if (this._scrollerComponent?.scrollable) {
|
|
2085
|
+
this.onScrollReachEnd.emit();
|
|
2086
|
+
}
|
|
2087
|
+
})).subscribe();
|
|
2088
|
+
$selectByClick.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2089
|
+
this._service.selectByClick = v;
|
|
2090
|
+
})).subscribe();
|
|
2091
|
+
$collapseByClick.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2092
|
+
this._service.collapseByClick = v;
|
|
2093
|
+
})).subscribe();
|
|
2094
|
+
$trackBy.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2095
|
+
this._trackBox.trackingPropertyName = v;
|
|
2096
|
+
})).subscribe();
|
|
2097
|
+
$divides.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2098
|
+
this._trackBox.divides = v;
|
|
2099
|
+
})).subscribe();
|
|
2100
|
+
combineLatest([this.$alignment, this.$isInfinity]).pipe(takeUntil(this._$unsubscribe), tap(([alignment, isInfinity]) => {
|
|
2101
|
+
this._$actualAlignment.next(isInfinity ? Alignments.CENTER : alignment);
|
|
2102
|
+
})).subscribe();
|
|
2103
|
+
combineLatest([this.$scrollbarEnabled, this.$isInfinity]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(([scrollbarEnabled, isInfinity]) => {
|
|
2104
|
+
this._$actualScrollbarEnabled.next(isInfinity ? false : scrollbarEnabled);
|
|
2105
|
+
})).subscribe();
|
|
2106
|
+
const $alignment = this.$actualAlignment, $precalculatedScrollStartOffset = this._$precalculatedScrollStartOffset.asObservable(), $precalculatedScrollEndOffset = this._$precalculatedScrollEndOffset.asObservable(), $listBounds = this._$listBounds.asObservable().pipe(filter(b => !!b)), $scrollSize = this._$scrollSize.asObservable(), $bufferSize = this.$bufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $maxBufferSize = this.$maxBufferSize.pipe(map(v => v < 0 ? DEFAULT_BUFFER_SIZE : v)), $snapToItem = this.$snapToItem, $snapToItemAlign = this.$snapToItemAlign, $stickyEnabled = this.$stickyEnabled, $isLazy = this.$collectionMode.pipe(map(v => this.getIsLazy(v || DEFAULT_COLLECTION_MODE))), $enabledBufferOptimization = this.$enabledBufferOptimization, $snappingMethod = this.$snappingMethod.pipe(map(v => this.getIsSnappingMethodAdvanced(v || DEFAULT_SNAPPING_METHOD))), $collapsingMode = this.$collapsingMode, $selectingMode = this.$selectingMode, $selectedIds = this.$selectedIds, $collapsedIds = this.$collapsedIds.pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $collapsedItemIds = this._$collapsedItemIds.asObservable().pipe(distinctUntilChanged(), map(v => Array.isArray(v) ? v : [])), $itemTransform = this.$itemTransform, $screenReaderMessage = this.$screenReaderMessage, $displayItems = this._service.$displayItems, $cacheVersion = this._service.$cacheVersion;
|
|
2107
|
+
$snapToItem.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2108
|
+
this._service.snapToItem = v;
|
|
2109
|
+
})).subscribe();
|
|
2110
|
+
$actualItems.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2111
|
+
this._service.items = v;
|
|
2112
|
+
})).subscribe();
|
|
2113
|
+
combineLatest([$actualItems, $viewInit]).pipe(takeUntil(this._$unsubscribe), filter(([, init]) => init), debounceTime(0), tap(() => {
|
|
2114
|
+
this._scrollerComponent?.snapIfNeed();
|
|
2115
|
+
})).subscribe();
|
|
2116
|
+
$itemConfigMap.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2117
|
+
this._service.itemConfigMap = v;
|
|
2118
|
+
})).subscribe();
|
|
2119
|
+
$collapsedIds.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2120
|
+
this._service.collapsedIds = v;
|
|
2121
|
+
})).subscribe();
|
|
2122
|
+
combineLatest([$displayItems, $screenReaderMessage, $isVertical, $scrollSize, $bounds]).pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), debounceTime(100), takeUntil(this._$unsubscribe), tap(([items, screenReaderMessage, isVertical, scrollSize, bounds]) => {
|
|
2123
|
+
this._$screenReaderFormattedMessage.next(formatScreenReaderMessage(items, screenReaderMessage, scrollSize, isVertical, bounds));
|
|
2124
|
+
})).subscribe();
|
|
2125
|
+
$isLazy.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2126
|
+
this._trackBox.isLazy = v;
|
|
2127
|
+
})).subscribe();
|
|
2128
|
+
const $itemsComposition = $items.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), switchMap(items => {
|
|
2129
|
+
return combineLatest([$collapsedItemIds, $itemConfigMap, $trackBy, $divides]).pipe(takeUntil(this._$unsubscribe), debounceTime(0), switchMap(([collapsedIds, itemConfigMap, trackBy, divides]) => {
|
|
2130
|
+
return of({ items, collapsedIds, itemConfigMap, trackBy, divides });
|
|
2131
|
+
}));
|
|
2132
|
+
}));
|
|
2133
|
+
$itemsComposition.pipe(takeUntil(this._$unsubscribe), switchMap(({ items, collapsedIds, itemConfigMap, trackBy, divides }) => {
|
|
2134
|
+
if (items.length === 0 || !this._readyForShow || !(this.cachable && !this._cached &&
|
|
2135
|
+
!this._trackBox.isSnappedToStart && this._trackBox.isSnappedToEnd)) {
|
|
2136
|
+
return of({ items, collapsedIds, itemConfigMap, trackBy, divides });
|
|
2137
|
+
}
|
|
2138
|
+
return $updateItemsRenderStabilizer.pipe(takeUntil(this._$unsubscribe), take(1), debounceTime(0), switchMap(() => {
|
|
2139
|
+
return of({ items, collapsedIds, itemConfigMap, trackBy, divides });
|
|
2140
|
+
}));
|
|
2141
|
+
}), tap(({ items, collapsedIds, itemConfigMap, trackBy, divides }) => {
|
|
2142
|
+
const hiddenItems = new CMap();
|
|
2143
|
+
let isCollapsed = false;
|
|
2144
|
+
for (let i = 0, l = items.length; i < l; i++) {
|
|
2145
|
+
const item = items[i], id = item?.[trackBy];
|
|
2146
|
+
if (!!item) {
|
|
2147
|
+
const group = (itemConfigMap[id]?.sticky ?? 0) > 0, collapsed = collapsedIds.includes(id);
|
|
2148
|
+
if (!!group) {
|
|
2149
|
+
isCollapsed = collapsed;
|
|
2150
|
+
}
|
|
2151
|
+
else {
|
|
2152
|
+
if (isCollapsed) {
|
|
2153
|
+
hiddenItems.set(id, true);
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2158
|
+
const actualItems = [];
|
|
2159
|
+
for (let i = 0, l = items.length; i < l; i++) {
|
|
2160
|
+
const item = items[i], id = item?.[trackBy];
|
|
2161
|
+
if (!!item && hiddenItems.has(id)) {
|
|
2162
|
+
continue;
|
|
2163
|
+
}
|
|
2164
|
+
actualItems.push(item);
|
|
2165
|
+
}
|
|
2166
|
+
const normalizedCollection = normalizeCollection(actualItems, itemConfigMap, trackBy, divides);
|
|
2167
|
+
this._$actualItems.next(normalizedCollection);
|
|
2168
|
+
})).subscribe();
|
|
2169
|
+
$isVertical.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2170
|
+
this._isVertical = v;
|
|
2171
|
+
const el = this._elementRef.nativeElement;
|
|
2172
|
+
toggleClassName(el, v ? CLASS_LIST_VERTICAL : CLASS_LIST_HORIZONTAL, v ? CLASS_LIST_HORIZONTAL : CLASS_LIST_VERTICAL);
|
|
2173
|
+
})).subscribe();
|
|
2174
|
+
$snappingMethod.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2175
|
+
this._isSnappingMethodAdvanced = this._trackBox.isSnappingMethodAdvanced = v;
|
|
2176
|
+
})).subscribe();
|
|
2177
|
+
$selectingMode.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2178
|
+
const el = this._$list.getValue()?.nativeElement;
|
|
2179
|
+
if (this.getIsMultiSelection(v || DEFAULT_SNAPPING_METHOD)) {
|
|
2180
|
+
this._isMultiSelection = true;
|
|
2181
|
+
this._isSingleSelection = false;
|
|
2182
|
+
if (!!el) {
|
|
2183
|
+
el.role = ROLE_LIST_BOX;
|
|
2184
|
+
}
|
|
2185
|
+
this._service.selectingMode = SelectingModesTypes.MULTI_SELECT;
|
|
2186
|
+
}
|
|
2187
|
+
else if (this.getIsSingleSelection(v || DEFAULT_SNAPPING_METHOD)) {
|
|
2188
|
+
this._isSingleSelection = true;
|
|
2189
|
+
this._isMultiSelection = false;
|
|
2190
|
+
if (!!el) {
|
|
2191
|
+
el.role = ROLE_LIST_BOX;
|
|
2192
|
+
}
|
|
2193
|
+
this._service.selectingMode = SelectingModesTypes.SELECT;
|
|
2194
|
+
}
|
|
2195
|
+
else if (this.getIsNoneSelection(v || DEFAULT_SNAPPING_METHOD)) {
|
|
2196
|
+
this._isSingleSelection = this._isMultiSelection = false;
|
|
2197
|
+
if (!!el) {
|
|
2198
|
+
el.role = ROLE_LIST;
|
|
2199
|
+
}
|
|
2200
|
+
this._service.selectingMode = SelectingModesTypes.NONE;
|
|
2201
|
+
}
|
|
2202
|
+
})).subscribe();
|
|
2203
|
+
$collapsingMode.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2204
|
+
if (this.getIsNoneCollapse()) {
|
|
2205
|
+
this._service.isNoneCollapse = true;
|
|
2206
|
+
this._service.isAccordionCollapse = this._service.isMultipleCollapse = this._isAccordionCollapse = this._isMultipleCollapse = false;
|
|
2207
|
+
}
|
|
2208
|
+
else if (this.getIsMultipleCollapse()) {
|
|
2209
|
+
this._service.isMultipleCollapse = this._isMultipleCollapse = true;
|
|
2210
|
+
this._service.isAccordionCollapse = this._service.isNoneCollapse = this._isAccordionCollapse = false;
|
|
2211
|
+
}
|
|
2212
|
+
else if (this.getIsAccordionCollapse()) {
|
|
2213
|
+
this._service.isAccordionCollapse = this._isAccordionCollapse = true;
|
|
2214
|
+
this._service.isMultipleCollapse = this._service.isNoneCollapse = this._isMultipleCollapse = false;
|
|
2215
|
+
}
|
|
2216
|
+
})).subscribe();
|
|
2217
|
+
const $preventScrollSnapping = this.$preventScrollSnapping;
|
|
2218
|
+
$preventScrollSnapping.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), tap(() => {
|
|
2219
|
+
if (this._readyForShow) {
|
|
2220
|
+
this._trackBox.isScrollEnd;
|
|
2221
|
+
this._trackBox.isScrollStart = this._trackBox.isScrollEnd = false;
|
|
2222
|
+
this._$isScrollStart.next(false);
|
|
2223
|
+
this._$isScrollEnd.next(false);
|
|
2224
|
+
const scroller = this._scrollerComponent;
|
|
2225
|
+
if (!!scroller) {
|
|
2226
|
+
this._trackBox.preventScrollSnapping(true);
|
|
2227
|
+
}
|
|
2228
|
+
}
|
|
2229
|
+
}), tap(() => {
|
|
2230
|
+
if (this._readyForShow) {
|
|
2231
|
+
this._$preventScrollSnapping.next(false);
|
|
2232
|
+
}
|
|
2233
|
+
})).subscribe();
|
|
2234
|
+
$collapsedItemIds.pipe(takeUntil(this._$unsubscribe), filter(() => this._readyForShow), switchMap(() => {
|
|
2235
|
+
return $collapseItemsRenderStabilizer.pipe(takeUntil(this._$unsubscribe), take(1), tap(() => {
|
|
2236
|
+
this._$fireUpdate.next(true);
|
|
2237
|
+
}));
|
|
2238
|
+
})).subscribe();
|
|
2239
|
+
let isChunkLoading = false;
|
|
2240
|
+
const $loading = this.$loading;
|
|
2241
|
+
$loading.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), skip(1), filter(v => !v), switchMap(() => {
|
|
2242
|
+
isChunkLoading = true;
|
|
2243
|
+
const scrollbar = this._scrollerComponent;
|
|
2244
|
+
if (!!scrollbar) {
|
|
2245
|
+
scrollbar.stopScrollbar();
|
|
2246
|
+
scrollbar.refreshScrollbar();
|
|
2247
|
+
}
|
|
2248
|
+
return $actualItems.pipe(takeUntil(this._$unsubscribe), take(1), tap(() => {
|
|
2249
|
+
this._$fireUpdateNextFrame.next(true);
|
|
2250
|
+
}), switchMap(() => $chunkLoadingRenderStabilizer.pipe(takeUntil(this._$unsubscribe), take(1), tap(() => {
|
|
2251
|
+
isChunkLoading = false;
|
|
2252
|
+
this._trackBox.resetCacheChunkInfo();
|
|
2253
|
+
const scrollbar = this._scrollerComponent;
|
|
2254
|
+
if (!!scrollbar) {
|
|
2255
|
+
scrollbar.stopScrollbar();
|
|
2256
|
+
scrollbar.refreshScrollbar();
|
|
2257
|
+
}
|
|
2258
|
+
}))));
|
|
2259
|
+
})).subscribe();
|
|
2260
|
+
$loading.pipe(takeUntil(this._$unsubscribe), skip(1), distinctUntilChanged(), tap(v => {
|
|
2261
|
+
if (v) {
|
|
2262
|
+
this._isLoading = true;
|
|
2263
|
+
}
|
|
2264
|
+
}), filter(v => !v), tap(() => {
|
|
2265
|
+
if (this._readyForShow) {
|
|
2266
|
+
this._$preventScrollSnapping.next(true);
|
|
2267
|
+
}
|
|
2268
|
+
}), debounceTime(100), tap(() => {
|
|
2269
|
+
this._isLoading = false;
|
|
2270
|
+
})).subscribe();
|
|
2271
|
+
const update = (params) => {
|
|
2272
|
+
const { alignment, snapScrollToStart, snapScrollToEnd, bounds, items, itemConfigMap, scrollSize, itemSize, minItemSize, maxItemSize, bufferSize, maxBufferSize, stickyEnabled, isVertical, dynamicSize, enabledBufferOptimization, snapToItem, snapToItemAlign, userAction, collapsedIds, itemTransform, } = params;
|
|
2273
|
+
const scroller = this._scrollerComponent;
|
|
2274
|
+
let totalSize = 0;
|
|
2275
|
+
if (!!scroller) {
|
|
2276
|
+
const isInfinity = this.isInfinity, collapsable = collapsedIds.length > 0, cachable = this.cachable, cached = this._cached, waitingCache = cachable && !cached, emitUpdate = !this._readyForShow || waitingCache || collapsable || isChunkLoading, fireUpdate = !this._readyForShow || this._$scrollingTo.getValue(), fireUpdateAtEdges = fireUpdate || !isInfinity;
|
|
2277
|
+
if (this._readyForShow || (cachable && cached)) {
|
|
2278
|
+
const currentScrollSize = (isVertical ? scroller.scrollTop : scroller.scrollLeft);
|
|
2279
|
+
let actualScrollSize = !this._readyForShow && snapScrollToEnd ? (isVertical ? scroller.scrollHeight : scroller.scrollWidth) :
|
|
2280
|
+
(isVertical ? scroller.scrollTop : scroller.scrollLeft), leftLayoutOffset = 0, displayItems;
|
|
2281
|
+
const { width, height } = bounds, viewportSize = (isVertical ? height : width), opts = {
|
|
2282
|
+
alignment, bounds: { width, height }, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize, maxBufferSize,
|
|
2283
|
+
scrollSize: actualScrollSize, stickyEnabled, enabledBufferOptimization, snapToItem, snapToItemAlign, itemTransform,
|
|
2284
|
+
};
|
|
2285
|
+
if (snapScrollToEnd && !this._readyForShow) {
|
|
2286
|
+
const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize });
|
|
2287
|
+
displayItems = calculatedDisplayItems;
|
|
2288
|
+
totalSize = calculatedTotalSize1;
|
|
2289
|
+
leftLayoutOffset = leftLayoutOffset1;
|
|
2290
|
+
if (!!itemTransform && dynamicSize && this._trackBox.delta !== 0) {
|
|
2291
|
+
const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize1, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize + this._trackBox.delta });
|
|
2292
|
+
displayItems = calculatedDisplayItems;
|
|
2293
|
+
totalSize = calculatedTotalSize1;
|
|
2294
|
+
leftLayoutOffset = leftLayoutOffset1;
|
|
2295
|
+
}
|
|
2296
|
+
}
|
|
2297
|
+
else {
|
|
2298
|
+
const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, opts);
|
|
2299
|
+
displayItems = calculatedDisplayItems;
|
|
2300
|
+
totalSize = calculatedTotalSize;
|
|
2301
|
+
leftLayoutOffset = leftLayoutOffset1;
|
|
2302
|
+
if (!!itemTransform && dynamicSize && this._trackBox.delta !== 0) {
|
|
2303
|
+
const { displayItems: calculatedDisplayItems, totalSize: calculatedTotalSize, leftLayoutOffset: leftLayoutOffset1 } = this._trackBox.updateCollection(items, itemConfigMap, { ...opts, scrollSize: actualScrollSize + this._trackBox.delta });
|
|
2304
|
+
displayItems = calculatedDisplayItems;
|
|
2305
|
+
totalSize = calculatedTotalSize;
|
|
2306
|
+
leftLayoutOffset = leftLayoutOffset1;
|
|
2307
|
+
}
|
|
2308
|
+
}
|
|
2309
|
+
scroller.totalSize = totalSize;
|
|
2310
|
+
scroller.startLayoutOffset = leftLayoutOffset;
|
|
2311
|
+
this._$totalSize.next(totalSize);
|
|
2312
|
+
this._service.collection = displayItems;
|
|
2313
|
+
this.resetBoundsSize(isVertical, totalSize);
|
|
2314
|
+
this.createDisplayComponentsIfNeed(displayItems);
|
|
2315
|
+
this.tracking();
|
|
2316
|
+
this.snappingHandler();
|
|
2317
|
+
if (!_$created.getValue()) {
|
|
2318
|
+
_$created.next(true);
|
|
2319
|
+
}
|
|
2320
|
+
const delta = this._trackBox.delta, scrollPositionAfterUpdate = actualScrollSize + delta, roundedScrollPositionAfterUpdate = scrollPositionAfterUpdate, roundedMaxPositionAfterUpdate = isVertical ? scroller.scrollHeight : scroller.scrollWidth;
|
|
2321
|
+
if (this._isSnappingMethodAdvanced) {
|
|
2322
|
+
this.updateRegularRenderer();
|
|
2323
|
+
}
|
|
2324
|
+
this.updateOffsetsByAllignment();
|
|
2325
|
+
scroller.delta = delta;
|
|
2326
|
+
if ((snapScrollToStart && this._trackBox.isSnappedToStart && scroller.scrollable) ||
|
|
2327
|
+
(snapScrollToStart && currentScrollSize <= MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
|
|
2328
|
+
if (currentScrollSize !== roundedScrollPositionAfterUpdate) {
|
|
2329
|
+
this._trackBox.clearDelta();
|
|
2330
|
+
if (this._readyForShow) {
|
|
2331
|
+
this.emitScrollEvent(true, false, userAction);
|
|
2332
|
+
}
|
|
2333
|
+
this._trackBox.isScrollEnd;
|
|
2334
|
+
const params = {
|
|
2335
|
+
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: 0, userAction,
|
|
2336
|
+
fireUpdate: fireUpdateAtEdges, behavior: BEHAVIOR_INSTANT,
|
|
2337
|
+
blending: false, duration: this.animationParams.scrollToItem,
|
|
2338
|
+
};
|
|
2339
|
+
scroller?.scrollTo?.(params);
|
|
2340
|
+
if (emitUpdate) {
|
|
2341
|
+
this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
return;
|
|
2345
|
+
}
|
|
2346
|
+
if ((snapScrollToEnd && this._trackBox.isSnappedToEnd) || (snapScrollToEnd && !scroller.scrollable) ||
|
|
2347
|
+
(scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING >= roundedMaxPositionAfterUpdate) ||
|
|
2348
|
+
(roundedScrollPositionAfterUpdate >= scrollPositionAfterUpdate + MIN_PIXELS_FOR_PREVENT_SNAPPING)) {
|
|
2349
|
+
this._trackBox.clearDelta();
|
|
2350
|
+
if (!this._trackBox.isSnappedToEnd) {
|
|
2351
|
+
this._trackBox.isScrollEnd = true;
|
|
2352
|
+
this._trackBox.isScrollStart = false;
|
|
2353
|
+
}
|
|
2354
|
+
if (this._readyForShow) {
|
|
2355
|
+
this.emitScrollEvent(true, false, false);
|
|
2356
|
+
}
|
|
2357
|
+
const params = {
|
|
2358
|
+
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: roundedMaxPositionAfterUpdate,
|
|
2359
|
+
fireUpdate: fireUpdateAtEdges, behavior: BEHAVIOR_INSTANT, userAction: false,
|
|
2360
|
+
blending: false, duration: this.animationParams.scrollToItem,
|
|
2361
|
+
};
|
|
2362
|
+
scroller?.scrollTo?.(params);
|
|
2363
|
+
if (emitUpdate) {
|
|
2364
|
+
this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
|
|
2365
|
+
}
|
|
2366
|
+
return;
|
|
2367
|
+
}
|
|
2368
|
+
if (scrollSize !== scrollPositionAfterUpdate &&
|
|
2369
|
+
((scrollPositionAfterUpdate >= 0 && scrollPositionAfterUpdate < roundedMaxPositionAfterUpdate) ||
|
|
2370
|
+
(scrollSize !== roundedMaxPositionAfterUpdate || currentScrollSize !== scrollPositionAfterUpdate))) {
|
|
2371
|
+
this._trackBox.clearDelta();
|
|
2372
|
+
if (this._readyForShow) {
|
|
2373
|
+
this.emitScrollEvent(true, false, userAction);
|
|
2374
|
+
}
|
|
2375
|
+
const params = {
|
|
2376
|
+
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollPositionAfterUpdate, blending: true, userAction,
|
|
2377
|
+
fireUpdate, behavior: BEHAVIOR_INSTANT, duration: this.animationParams.scrollToItem,
|
|
2378
|
+
};
|
|
2379
|
+
scroller.scrollTo(params);
|
|
2380
|
+
if (emitUpdate) {
|
|
2381
|
+
this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
|
|
2382
|
+
}
|
|
2383
|
+
return;
|
|
2384
|
+
}
|
|
2385
|
+
}
|
|
2386
|
+
if (emitUpdate) {
|
|
2387
|
+
this._$update.next(getScrollStateVersion(totalSize, this._isVertical ? scroller.scrollTop : scroller.scrollLeft));
|
|
2388
|
+
}
|
|
2389
|
+
}
|
|
2390
|
+
};
|
|
2391
|
+
let prevItems = [];
|
|
2392
|
+
const debouncedUpdate = debounce(update, 0, MAX_NUMBERS_OF_SKIPS_FOR_QUALITY_OPTIMIZATION_LVL1);
|
|
2393
|
+
$viewInit.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(() => {
|
|
2394
|
+
return combineLatest([$trackBy, this.$isInfinity, $snapScrollToStart, $snapScrollToEnd, $bounds, $listBounds, $scrollEndOffset, $actualItems, $itemConfigMap, $scrollSize,
|
|
2395
|
+
$actualItemSize, $actualMinItemSize, $actualMaxItemSize, $collapsedItemIds, $bufferSize, $maxBufferSize, $stickyEnabled, $isVertical,
|
|
2396
|
+
$dynamicSize, $divides, $snapToItem, $snapToItemAlign, $enabledBufferOptimization, $itemTransform, $alignment,
|
|
2397
|
+
$precalculatedScrollStartOffset, $precalculatedScrollEndOffset, $cacheVersion, this.$fireUpdate,
|
|
2398
|
+
]).pipe(takeUntil(this._$unsubscribe), tap(([trackBy, isInfinity, snapScrollToStart, snapScrollToEnd, bounds, listBounds, scrollEndOffset, items, itemConfigMap, scrollSize, itemSize, minItemSize, maxItemSize, collapsedIds, bufferSize, maxBufferSize, stickyEnabled, isVertical, dynamicSize, divides, snapToItem, snapToItemAlign, enabledBufferOptimization, itemTransform, alignment, precalculatedScrollStartOffset, precalculatedScrollEndOffset, cacheVersion,]) => {
|
|
2399
|
+
let itemsChanged = false;
|
|
2400
|
+
if (prevItems !== items) {
|
|
2401
|
+
itemsChanged = true;
|
|
2402
|
+
prevItems = items;
|
|
2403
|
+
}
|
|
2404
|
+
const enabledOptimization = this.scrollingSettings?.optimization ?? DEFAULT_SCROLLING_SETTINGS.optimization, velocity = this._scrollerComponent?.averageVelocity ?? 0, isScrolling = this._$scrollingTo.getValue(), useDebouncedUpdate = (dynamicSize && !itemTransform) && !(snapScrollToEnd && this._trackBox.isSnappedToEnd) && !itemsChanged && hasUserAction && !isScrolling &&
|
|
2405
|
+
(velocity > 0 && velocity < MAX_VELOCITY_FOR_SCROLL_QUALITY_OPTIMIZATION_LVL1);
|
|
2406
|
+
if (enabledOptimization) {
|
|
2407
|
+
if (useDebouncedUpdate) {
|
|
2408
|
+
debouncedUpdate.execute({
|
|
2409
|
+
trackBy, isInfinity, snapScrollToStart, snapScrollToEnd, bounds: bounds, listBounds: listBounds, scrollEndOffset, items, itemConfigMap, scrollSize, itemSize, minItemSize,
|
|
2410
|
+
maxItemSize, collapsedIds, bufferSize, maxBufferSize, stickyEnabled, isVertical, dynamicSize, divides, enabledBufferOptimization, itemTransform,
|
|
2411
|
+
snapToItem, snapToItemAlign, alignment, precalculatedScrollStartOffset, precalculatedScrollEndOffset, cacheVersion, userAction: hasUserAction,
|
|
2412
|
+
});
|
|
2413
|
+
return;
|
|
2414
|
+
}
|
|
2415
|
+
debouncedUpdate.dispose();
|
|
2416
|
+
}
|
|
2417
|
+
if (!isScrolling) {
|
|
2418
|
+
update({
|
|
2419
|
+
trackBy, isInfinity, snapScrollToStart, snapScrollToEnd, bounds: bounds, listBounds: listBounds, scrollEndOffset, items, itemConfigMap, scrollSize, itemSize, minItemSize,
|
|
2420
|
+
maxItemSize, collapsedIds, bufferSize, maxBufferSize, stickyEnabled, isVertical, dynamicSize, divides, enabledBufferOptimization, itemTransform,
|
|
2421
|
+
snapToItem, snapToItemAlign, alignment, precalculatedScrollStartOffset, precalculatedScrollEndOffset, cacheVersion, userAction: hasUserAction,
|
|
2422
|
+
});
|
|
2423
|
+
}
|
|
2424
|
+
}));
|
|
2425
|
+
})).subscribe();
|
|
2426
|
+
const $scroller = this.$scroller.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement), take(1)), $scrollerScroll = $scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), take(1), switchMap(scroller => scroller.$scroll)), $scrollerScrollEnd = $scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), take(1), switchMap(scroller => scroller.$scrollEnd)), $scrollbarScroll = $scrollerComponent.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), take(1), switchMap(scroller => scroller.$scrollbarScroll));
|
|
2427
|
+
const scrollHandler = (userAction = false) => {
|
|
2428
|
+
const scroller = this._scrollerComponent;
|
|
2429
|
+
if (!!scroller) {
|
|
2430
|
+
const isVertical = this._isVertical, scrollSize = (isVertical ? scroller.scrollTop : scroller.scrollLeft), actualScrollSize = scrollSize;
|
|
2431
|
+
if (this._readyForShow) {
|
|
2432
|
+
if (userAction) {
|
|
2433
|
+
this._$preventScrollSnapping.next(true);
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
this._$scrollSize.next(actualScrollSize);
|
|
2437
|
+
}
|
|
2438
|
+
};
|
|
2439
|
+
$scroller.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), switchMap(scroller => {
|
|
2440
|
+
return $scrollbarScroll.pipe(takeUntil(this._$unsubscribe), tap(userAction => {
|
|
2441
|
+
const scrollerEl = this._$scroller.getValue()?.nativeElement, scrollerComponent = this._scrollerComponent;
|
|
2442
|
+
if (!!scrollerEl && !!scrollerComponent) {
|
|
2443
|
+
this.emitScrollEvent(false, this._readyForShow, hasUserAction);
|
|
2444
|
+
}
|
|
2445
|
+
if (this._readyForShow) {
|
|
2446
|
+
if (userAction) {
|
|
2447
|
+
if (this._trackBox.isSnappedToStart) {
|
|
2448
|
+
this._$preventScrollSnapping.next(true);
|
|
2449
|
+
}
|
|
2450
|
+
if (this._trackBox.isSnappedToEnd) {
|
|
2451
|
+
this._$preventScrollSnapping.next(true);
|
|
2452
|
+
}
|
|
2453
|
+
}
|
|
2454
|
+
}
|
|
2455
|
+
}));
|
|
2456
|
+
})).subscribe();
|
|
2457
|
+
$scroller.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), switchMap(scroller => {
|
|
2458
|
+
return $scrollerScroll.pipe(takeUntil(this._$unsubscribe));
|
|
2459
|
+
}), tap(userAction => {
|
|
2460
|
+
hasUserAction = userAction;
|
|
2461
|
+
const scrollerEl = this._$scroller.getValue()?.nativeElement, scrollerComponent = this._scrollerComponent;
|
|
2462
|
+
if (!!scrollerEl && !!scrollerComponent) {
|
|
2463
|
+
this.emitScrollEvent(false, this._readyForShow, userAction);
|
|
2464
|
+
}
|
|
2465
|
+
scrollHandler(userAction);
|
|
2466
|
+
})).subscribe();
|
|
2467
|
+
$scroller.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), switchMap(scroller => {
|
|
2468
|
+
return $scrollerScrollEnd.pipe(takeUntil(this._$unsubscribe));
|
|
2469
|
+
}), tap(userAction => {
|
|
2470
|
+
hasUserAction = userAction;
|
|
2471
|
+
const scrollerEl = this._$scroller.getValue()?.nativeElement, scrollerComponent = this._scrollerComponent;
|
|
2472
|
+
if (!!scrollerEl && !!scrollerComponent) {
|
|
2473
|
+
this.emitScrollEvent(true, this._readyForShow, userAction);
|
|
2474
|
+
}
|
|
2475
|
+
scrollHandler(userAction);
|
|
2476
|
+
})).subscribe();
|
|
2477
|
+
const $scrollTo = this.$scrollTo, $scrollToExecutor = this.$scrollToExecutor;
|
|
2478
|
+
combineLatest([$scroller, $trackBy, $scrollTo]).pipe(filter(([scroller, , event]) => !!scroller && !!event), map(([scroller, trackBy, event]) => ({ scroller: scroller, trackBy, event })), switchMap(({ event }) => {
|
|
2479
|
+
const d = event?.delay ?? 0;
|
|
2480
|
+
if (d > 0) {
|
|
2481
|
+
return of(event).pipe(takeUntil(this._$unsubscribe), delay(d));
|
|
2482
|
+
}
|
|
2483
|
+
return of(event);
|
|
2484
|
+
}), tap(event => {
|
|
2485
|
+
this._$scrollingTo.next(true);
|
|
2486
|
+
this._$scrollToExecutor.next(event);
|
|
2487
|
+
})).subscribe();
|
|
2488
|
+
$scrollToExecutor.pipe(takeUntil(this._$unsubscribe), switchMap(event => {
|
|
2489
|
+
const trackBy = this.trackBy, scrollerComponent = this._scrollerComponent, { id, iteration = 0, blending = false, isLastIteration = false, cb } = event;
|
|
2490
|
+
const nextIteration = iteration + 1, finished = nextIteration >= MAX_SCROLL_TO_ITERATIONS, fireUpdate = false;
|
|
2491
|
+
if (!this._readyForShow) {
|
|
2492
|
+
return of([finished, { id, iteration: nextIteration, blending, cb }]).pipe(delay(0));
|
|
2493
|
+
}
|
|
2494
|
+
debouncedUpdate.dispose();
|
|
2495
|
+
this._$preventScrollSnapping.next(true);
|
|
2496
|
+
if (!!scrollerComponent) {
|
|
2497
|
+
scrollerComponent.startScrollTo();
|
|
2498
|
+
const items = this._$actualItems.getValue();
|
|
2499
|
+
if (!!items && items.length) {
|
|
2500
|
+
const dynamicSize = this.dynamicSize, itemSize = this.actualItemSize, minItemSize = this.actualMinItemSize, maxItemSize = this.actualMaxItemSize, snapScrollToEnd = this.snapScrollToEnd;
|
|
2501
|
+
if (dynamicSize) {
|
|
2502
|
+
const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, isVertical = this._isVertical, currentScrollSize = isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft, opts = {
|
|
2503
|
+
alignment: this._$actualAlignment.getValue(),
|
|
2504
|
+
bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize, minItemSize, maxItemSize,
|
|
2505
|
+
bufferSize: this.bufferSize, maxBufferSize: this.maxBufferSize, itemTransform: this.itemTransform,
|
|
2506
|
+
scrollSize: (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft),
|
|
2507
|
+
snapToItem: this.snapToItem, snapToItemAlign: this.snapToItemAlign,
|
|
2508
|
+
stickyEnabled: this.stickyEnabled, fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization,
|
|
2509
|
+
};
|
|
2510
|
+
let scrollSize = snapScrollToEnd && this._trackBox.isSnappedToEnd ?
|
|
2511
|
+
(isVertical ? scrollerComponent.scrollHeight : scrollerComponent.scrollWidth) :
|
|
2512
|
+
this._trackBox.getItemPosition(id, itemConfigMap, opts);
|
|
2513
|
+
if (scrollSize === -1) {
|
|
2514
|
+
return of([finished, { id, blending, iteration: nextIteration, cb }]).pipe(delay(0));
|
|
2515
|
+
}
|
|
2516
|
+
this._trackBox.clearDelta();
|
|
2517
|
+
const viewportSize = (isVertical ? height : width), { displayItems, totalSize, leftLayoutOffset } = this._trackBox.updateCollection(items, itemConfigMap, {
|
|
2518
|
+
...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,
|
|
2519
|
+
}), delta1 = this._trackBox.delta;
|
|
2520
|
+
const normalizedTotalSize = totalSize < viewportSize ? viewportSize : totalSize;
|
|
2521
|
+
scrollerComponent.startLayoutOffset = leftLayoutOffset;
|
|
2522
|
+
scrollerComponent.totalSize = normalizedTotalSize;
|
|
2523
|
+
this._service.collection = displayItems;
|
|
2524
|
+
let actualScrollSize = scrollSize + delta1;
|
|
2525
|
+
this.resetBoundsSize(isVertical, normalizedTotalSize);
|
|
2526
|
+
this.createDisplayComponentsIfNeed(displayItems);
|
|
2527
|
+
this.tracking();
|
|
2528
|
+
this.snappingHandler();
|
|
2529
|
+
this.updateOffsetsByAllignment();
|
|
2530
|
+
scrollSize = this._trackBox.getItemPosition(id, itemConfigMap, { ...opts, scrollSize: actualScrollSize, fromItemId: id });
|
|
2531
|
+
if (scrollSize === -1) {
|
|
2532
|
+
return of([finished, { id, blending, iteration: nextIteration, cb }]).pipe(delay(0));
|
|
2533
|
+
}
|
|
2534
|
+
const notChanged = scrollSize === currentScrollSize;
|
|
2535
|
+
if (!notChanged && iteration < MAX_SCROLL_TO_ITERATIONS) {
|
|
2536
|
+
this._trackBox.clearDelta();
|
|
2537
|
+
const params = {
|
|
2538
|
+
[isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior: BEHAVIOR_INSTANT,
|
|
2539
|
+
fireUpdate, blending, force: true, snap: false, normalize: false,
|
|
2540
|
+
};
|
|
2541
|
+
scrollerComponent?.scrollTo?.(params);
|
|
2542
|
+
return of([finished, {
|
|
2543
|
+
id, iteration: nextIteration, blending,
|
|
2544
|
+
isLastIteration: nextIteration < MAX_SCROLL_TO_ITERATIONS, cb
|
|
2545
|
+
}]).pipe(delay(0));
|
|
2546
|
+
}
|
|
2547
|
+
else {
|
|
2548
|
+
this._$scrollSize.next(actualScrollSize);
|
|
2549
|
+
return of([true, { id, blending, iteration: nextIteration, cb }]).pipe(delay(0));
|
|
2550
|
+
}
|
|
2551
|
+
}
|
|
2552
|
+
else {
|
|
2553
|
+
const index = items.findIndex(item => item[trackBy] === id);
|
|
2554
|
+
if (index > -1) {
|
|
2555
|
+
const isVertical = this._isVertical, itemSize = this.actualItemSize;
|
|
2556
|
+
let scrollSize = index * itemSize;
|
|
2557
|
+
if (this.isInfinity) {
|
|
2558
|
+
if (this.snapToItem) {
|
|
2559
|
+
switch (this.snapToItemAlign) {
|
|
2560
|
+
case SnapToItemAligns.CENTER: {
|
|
2561
|
+
scrollSize += itemSize * .5;
|
|
2562
|
+
break;
|
|
2563
|
+
}
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
}
|
|
2567
|
+
const { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, itemConfigMap = this.itemConfigMap, items = this._$actualItems.getValue(), opts = {
|
|
2568
|
+
alignment: this._$actualAlignment.getValue(),
|
|
2569
|
+
bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize, minItemSize, maxItemSize,
|
|
2570
|
+
bufferSize: this.bufferSize, maxBufferSize: this.maxBufferSize, itemTransform: this.itemTransform,
|
|
2571
|
+
scrollSize: (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft),
|
|
2572
|
+
snapToItem: this.snapToItem, snapToItemAlign: this.snapToItemAlign,
|
|
2573
|
+
stickyEnabled: this.stickyEnabled, fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization,
|
|
2574
|
+
};
|
|
2575
|
+
this._trackBox.clearDelta();
|
|
2576
|
+
const viewportSize = (isVertical ? height : width), { displayItems, totalSize, leftLayoutOffset } = this._trackBox.updateCollection(items, itemConfigMap, {
|
|
2577
|
+
...opts, scrollSize, fromItemId: isLastIteration ? undefined : id,
|
|
2578
|
+
});
|
|
2579
|
+
const actualTotalSize = this.isInfinity ? (totalSize + viewportSize) : totalSize;
|
|
2580
|
+
const normalizedTotalSize = actualTotalSize < viewportSize ? viewportSize : actualTotalSize;
|
|
2581
|
+
scrollerComponent.startLayoutOffset = leftLayoutOffset;
|
|
2582
|
+
scrollerComponent.totalSize = normalizedTotalSize;
|
|
2583
|
+
this._service.collection = displayItems;
|
|
2584
|
+
this.resetBoundsSize(isVertical, normalizedTotalSize);
|
|
2585
|
+
this.createDisplayComponentsIfNeed(displayItems);
|
|
2586
|
+
this.tracking();
|
|
2587
|
+
this.snappingHandler();
|
|
2588
|
+
this.updateOffsetsByAllignment();
|
|
2589
|
+
this._$preventScrollSnapping.next(true);
|
|
2590
|
+
const params = {
|
|
2591
|
+
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, fireUpdate: false,
|
|
2592
|
+
behavior: BEHAVIOR_INSTANT, blending, force: true, snap: false, normalize: false,
|
|
2593
|
+
};
|
|
2594
|
+
scrollerComponent?.scrollTo?.(params);
|
|
2595
|
+
return of([true, { id, blending, iteration: nextIteration, cb }]);
|
|
2596
|
+
}
|
|
2597
|
+
}
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
return of([finished, { id, iteration: nextIteration, blending, cb }]);
|
|
2601
|
+
}), takeUntil(this._$unsubscribe), tap(([finished, params]) => {
|
|
2602
|
+
if (!finished) {
|
|
2603
|
+
this._$scrollToExecutor.next(params);
|
|
2604
|
+
return;
|
|
2605
|
+
}
|
|
2606
|
+
if (this._readyForShow) {
|
|
2607
|
+
this._trackBox.preventScrollSnapping(true);
|
|
2608
|
+
}
|
|
2609
|
+
this._$scrollingTo.next(false);
|
|
2610
|
+
this._scrollerComponent?.finishedScrollTo();
|
|
2611
|
+
this._$fireUpdate.next(true);
|
|
2612
|
+
this.emitScrollEvent(true, false, true);
|
|
2613
|
+
const scrollParams = params;
|
|
2614
|
+
scrollParams?.cb?.();
|
|
2615
|
+
}), delay(0), tap(([finished]) => {
|
|
2616
|
+
if (finished) {
|
|
2617
|
+
this._scrollerComponent?.snapIfNeed();
|
|
2618
|
+
}
|
|
2619
|
+
})).subscribe();
|
|
2620
|
+
const $itemRenderer = this.$itemRenderer;
|
|
2621
|
+
$itemRenderer.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), filter(v => !!v), tap(v => {
|
|
2622
|
+
this._$itemRenderer.next(v);
|
|
2623
|
+
})).subscribe();
|
|
2624
|
+
$bounds.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), filter(v => !!v), tap(value => {
|
|
2625
|
+
const size = { width: value.width, height: value.height };
|
|
2626
|
+
this.onViewportChange.emit(objectAsReadonly(size));
|
|
2627
|
+
})).subscribe();
|
|
2628
|
+
this._service.$virtualClick.pipe(takeUntil(this._$unsubscribe), tap(v => {
|
|
2629
|
+
this.onItemClick.emit(objectAsReadonly(v));
|
|
2630
|
+
})).subscribe();
|
|
2631
|
+
let isSelectedIdsFirstEmit = 0;
|
|
2632
|
+
this._service.$selectedIds.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2633
|
+
if (this._isSingleSelection || (this._isMultiSelection && isSelectedIdsFirstEmit >= 2)) {
|
|
2634
|
+
const curr = this.selectedIds;
|
|
2635
|
+
if ((this._isSingleSelection && JSON.stringify(v) !== JSON.stringify(curr)) ||
|
|
2636
|
+
(isSelectedIdsFirstEmit === 2 && JSON.stringify(v) !== JSON.stringify(curr)) || isSelectedIdsFirstEmit > 2) {
|
|
2637
|
+
this.onSelect.emit(copyValueAsReadonly(v));
|
|
2638
|
+
}
|
|
2639
|
+
}
|
|
2640
|
+
if (isSelectedIdsFirstEmit < 3) {
|
|
2641
|
+
isSelectedIdsFirstEmit++;
|
|
2642
|
+
}
|
|
2643
|
+
})).subscribe();
|
|
2644
|
+
$selectedIds.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2645
|
+
this._service.selectedIds = v;
|
|
2646
|
+
})).subscribe();
|
|
2647
|
+
$viewInit.pipe(takeUntil(this._$unsubscribe), filter(v => !!v), switchMap(() => {
|
|
2648
|
+
return this._service.$collapsedIds.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2649
|
+
const curr = this._$collapsedItemIds.getValue();
|
|
2650
|
+
if ((this._isAccordionCollapse || this._isMultipleCollapse) && (JSON.stringify(v) !== JSON.stringify(curr))) {
|
|
2651
|
+
this._$collapsedItemIds.next(v);
|
|
2652
|
+
this.onCollapse.emit(copyValueAsReadonly(v));
|
|
2653
|
+
}
|
|
2654
|
+
}));
|
|
2655
|
+
})).subscribe();
|
|
2656
|
+
combineLatest([$itemConfigMap, $dynamicSize, $divides]).pipe(takeUntil(this._$unsubscribe), filter(([itemConfigMap, dynamicSize, divides]) => !!itemConfigMap && !dynamicSize && divides > 1), tap(([itemConfigMap]) => {
|
|
2657
|
+
for (const id in itemConfigMap) {
|
|
2658
|
+
const metaData = itemConfigMap[id];
|
|
2659
|
+
if (metaData?.fullSize || metaData?.sticky === 1 || metaData?.sticky === 2) {
|
|
2660
|
+
throw Error('The accelerated rendering algorithm `[dynamicSize]="false"` cannot correctly handle non-uniform lists (the itemConfigMap specifies full-size elements). For correct rendering, specify `[dynamicSize]="true"`.');
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2663
|
+
})).subscribe();
|
|
2664
|
+
combineLatest([$collapsingMode, $items, $itemConfigMap, $trackBy]).pipe(takeUntil(this._$unsubscribe), tap(([collapsingMode, items, itemConfigMap, trackBy]) => {
|
|
2665
|
+
const isAccordion = isCollapseMode(collapsingMode, CollapsingModes.ACCORDION);
|
|
2666
|
+
if (isAccordion) {
|
|
2667
|
+
const allGroups = [];
|
|
2668
|
+
if (this._isAccordionCollapse) {
|
|
2669
|
+
for (let i = 0, l = items.length; i < l; i++) {
|
|
2670
|
+
const item = items[i], id = item[trackBy], collapsable = itemConfigMap?.[id]?.collapsable === true;
|
|
2671
|
+
if (!collapsable) {
|
|
2672
|
+
continue;
|
|
2673
|
+
}
|
|
2674
|
+
allGroups.push(id);
|
|
2675
|
+
}
|
|
2676
|
+
}
|
|
2677
|
+
if ((this._isAccordionCollapse || this._isMultipleCollapse) && (JSON.stringify(this._$collapsedItemIds.getValue()) !== JSON.stringify(allGroups))) {
|
|
2678
|
+
this._$collapsedItemIds.next(allGroups);
|
|
2679
|
+
this.onCollapse.emit(copyValueAsReadonly(allGroups));
|
|
2680
|
+
}
|
|
2681
|
+
}
|
|
2682
|
+
})).subscribe();
|
|
2683
|
+
$collapsedItemIds.pipe(takeUntil(this._$unsubscribe), distinctUntilChanged(), tap(v => {
|
|
2684
|
+
this._service.collapsedIds = v;
|
|
2685
|
+
})).subscribe();
|
|
2686
|
+
this.$destroy.pipe(takeUntil(this._$unsubscribe), tap(() => {
|
|
2687
|
+
debouncedUpdate.dispose();
|
|
2688
|
+
})).subscribe();
|
|
2689
|
+
this._$viewInit.next(true);
|
|
2690
|
+
this._$fireUpdate.next(false);
|
|
2691
|
+
}
|
|
2692
|
+
onAfterResize(update = false) {
|
|
2693
|
+
this.snappingHandler();
|
|
2694
|
+
if (this._isSnappingMethodAdvanced) {
|
|
2695
|
+
this.updateRegularRenderer();
|
|
2696
|
+
}
|
|
2697
|
+
if (this._readyForShow && update) {
|
|
2698
|
+
const scroller = this._scrollerComponent;
|
|
2699
|
+
if (!!scroller) {
|
|
2700
|
+
const updatebale = this._readyForShow;
|
|
2701
|
+
if (updatebale) {
|
|
2702
|
+
this._$fireUpdate.next(false);
|
|
2703
|
+
}
|
|
2704
|
+
scroller.refresh(updatebale, updatebale);
|
|
2705
|
+
}
|
|
2706
|
+
}
|
|
2707
|
+
}
|
|
2708
|
+
checkBoundsOfElements() {
|
|
2709
|
+
const changed = this._trackBox.checkBoundsOfElements();
|
|
2710
|
+
if (changed) {
|
|
2711
|
+
const readyForShow = this._readyForShow, isScrolling = this._$scrollingTo.getValue();
|
|
2712
|
+
this._trackBox.changes(true, readyForShow && !isScrolling);
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
snappingHandler() {
|
|
2716
|
+
const scroller = this._scrollerComponent;
|
|
2717
|
+
if (!!scroller) {
|
|
2718
|
+
const isVertical = this.isVertical, maxScrollSize = Math.round(isVertical ? scroller.scrollHeight ?? 0 : scroller.scrollWidth ?? 0), scrollSize = isVertical ? scroller.scrollTop ?? 0 : scroller.scrollLeft ?? 0, actualScrollSize = Math.round(scrollSize);
|
|
2719
|
+
if (this._readyForShow && !this._isLoading) {
|
|
2720
|
+
const isScrollEnd = (actualScrollSize >= (maxScrollSize - MIN_PIXELS_FOR_PREVENT_SNAPPING)) || !scroller.scrollable || this._trackBox.isScrollEnd;
|
|
2721
|
+
if (isScrollEnd) {
|
|
2722
|
+
this._$isScrollStart.next(false);
|
|
2723
|
+
this._$isScrollEnd.next(true);
|
|
2724
|
+
this._trackBox.isScrollStart = false;
|
|
2725
|
+
this._trackBox.isScrollEnd = true;
|
|
2726
|
+
}
|
|
2727
|
+
else {
|
|
2728
|
+
const isScrollStart = (actualScrollSize <= MIN_PIXELS_FOR_PREVENT_SNAPPING);
|
|
2729
|
+
this._$isScrollStart.next(isScrollStart);
|
|
2730
|
+
this._$isScrollEnd.next(false);
|
|
2731
|
+
this._trackBox.isScrollStart = isScrollStart;
|
|
2732
|
+
this._trackBox.isScrollEnd = false;
|
|
2733
|
+
}
|
|
2734
|
+
}
|
|
2735
|
+
else if (!this._readyForShow) {
|
|
2736
|
+
const snapScrollToStart = this._$actualSnapScrollToStart.getValue(), snapScrollToEnd = this._$actualSnapScrollToEnd.getValue();
|
|
2737
|
+
if (!snapScrollToStart && snapScrollToEnd) {
|
|
2738
|
+
this._$isScrollStart.next(false);
|
|
2739
|
+
this._$isScrollEnd.next(true);
|
|
2740
|
+
this._trackBox.isScrollStart = false;
|
|
2741
|
+
this._trackBox.isScrollEnd = true;
|
|
2742
|
+
}
|
|
2743
|
+
else if (snapScrollToStart && snapScrollToEnd) {
|
|
2744
|
+
this._$isScrollStart.next(true);
|
|
2745
|
+
this._$isScrollEnd.next(false);
|
|
2746
|
+
this._trackBox.isScrollStart = true;
|
|
2747
|
+
this._trackBox.isScrollEnd = false;
|
|
2748
|
+
}
|
|
2749
|
+
else {
|
|
2750
|
+
this._$isScrollStart.next(false);
|
|
2751
|
+
this._$isScrollEnd.next(false);
|
|
2752
|
+
this._trackBox.isScrollStart = false;
|
|
2753
|
+
this._trackBox.isScrollEnd = false;
|
|
2754
|
+
}
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
}
|
|
2758
|
+
;
|
|
2759
|
+
emitScrollEvent(isScrollEnd = false, update = true, userAction = false) {
|
|
2760
|
+
if (!this._readyForShow) {
|
|
2761
|
+
return;
|
|
2762
|
+
}
|
|
2763
|
+
const scrollerEl = this._$scroller.getValue()?.nativeElement, scrollerComponent = this._scrollerComponent;
|
|
2764
|
+
if (scrollerEl && scrollerComponent) {
|
|
2765
|
+
const isVertical = this._isVertical, scrollSize = (isVertical ? scrollerComponent.scrollTop : scrollerComponent.scrollLeft), maxScrollSize = (isVertical ? scrollerComponent.scrollHeight : scrollerComponent.scrollWidth), bounds = this._$bounds.getValue() || { x: 0, y: 0, width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE };
|
|
2766
|
+
const itemsRange = formatActualDisplayItems(this._service.displayItems, this._$actualScrollStartOffset.getValue(), this._$actualScrollEndOffset.getValue(), scrollSize, isVertical, bounds), event = new ScrollEvent({
|
|
2767
|
+
direction: this._scrollerComponent?.scrollDirection ?? 0, container: scrollerEl,
|
|
2768
|
+
list: this._$list.getValue().nativeElement, delta: this._trackBox.delta,
|
|
2769
|
+
deltaOfNewItems: this._trackBox.deltaOfNewItems, isVertical,
|
|
2770
|
+
scrollSize,
|
|
2771
|
+
itemsRange,
|
|
2772
|
+
isEnd: !scrollerComponent.scrollable || this._trackBox.isSnappedToEnd || (Math.round(scrollSize) === Math.round(maxScrollSize)),
|
|
2773
|
+
userAction,
|
|
2774
|
+
});
|
|
2775
|
+
if (update) {
|
|
2776
|
+
this._$scroll.next(event);
|
|
2777
|
+
}
|
|
2778
|
+
if (isScrollEnd) {
|
|
2779
|
+
this.onScrollEnd.emit(event);
|
|
2780
|
+
}
|
|
2781
|
+
else {
|
|
2782
|
+
this.onScroll.emit(event);
|
|
2783
|
+
}
|
|
2784
|
+
}
|
|
2785
|
+
}
|
|
2786
|
+
getIsSnappingMethodAdvanced(m) {
|
|
2787
|
+
const method = m || this.snappingMethod;
|
|
2788
|
+
return isSnappingMethodAdvenced(method);
|
|
2789
|
+
}
|
|
2790
|
+
getIsNoneSelection(m) {
|
|
2791
|
+
const mode = m || this.selectingMode;
|
|
2792
|
+
return isSelectMode(mode, SelectingModes.NONE);
|
|
2793
|
+
}
|
|
2794
|
+
getIsSingleSelection(m) {
|
|
2795
|
+
const mode = m || this.selectingMode;
|
|
2796
|
+
return isSelectMode(mode, SelectingModes.SELECT);
|
|
2797
|
+
}
|
|
2798
|
+
getIsMultiSelection(m) {
|
|
2799
|
+
const mode = m || this.selectingMode;
|
|
2800
|
+
return isSelectMode(mode, SelectingModes.MULTI_SELECT);
|
|
2801
|
+
}
|
|
2802
|
+
getIsNoneCollapse(m) {
|
|
2803
|
+
const mode = m || this.collapsingMode;
|
|
2804
|
+
return isCollapseMode(mode, CollapsingModes.NONE);
|
|
2805
|
+
}
|
|
2806
|
+
getIsMultipleCollapse(m) {
|
|
2807
|
+
const mode = m || this.collapsingMode;
|
|
2808
|
+
return isCollapseMode(mode, CollapsingModes.MULTI_COLLAPSE);
|
|
2809
|
+
}
|
|
2810
|
+
getIsAccordionCollapse(m) {
|
|
2811
|
+
const mode = m || this.collapsingMode;
|
|
2812
|
+
return isCollapseMode(mode, CollapsingModes.ACCORDION);
|
|
2813
|
+
}
|
|
2814
|
+
getIsVertical(d) {
|
|
2815
|
+
const dir = d || this.direction;
|
|
2816
|
+
return isDirection(dir, Directions.VERTICAL);
|
|
2817
|
+
}
|
|
2818
|
+
getIsLazy(m) {
|
|
2819
|
+
const mode = m || this.collectionMode;
|
|
2820
|
+
return isCollectionMode(mode, CollectionModes.LAZY);
|
|
2821
|
+
}
|
|
2822
|
+
createDisplayComponentsIfNeed(displayItems) {
|
|
2823
|
+
if (!displayItems || !this._listContainerRef) {
|
|
2824
|
+
this._trackBox.setDisplayObjectIndexMapById({});
|
|
2825
|
+
return;
|
|
2826
|
+
}
|
|
2827
|
+
if (this._isSnappingMethodAdvanced && this.stickyEnabled) {
|
|
2828
|
+
if (this._snappedDisplayComponents.length < MAX_REGULAR_SNAPED_COMPONENTS && !!this._snapContainerRef) {
|
|
2829
|
+
while (this._snappedDisplayComponents.length < MAX_REGULAR_SNAPED_COMPONENTS) {
|
|
2830
|
+
const comp = this._snapContainerRef.createComponent(this._itemComponentClass);
|
|
2831
|
+
comp.instance.renderer = this._$itemRenderer.getValue();
|
|
2832
|
+
comp.instance.regular = true;
|
|
2833
|
+
this._snappedDisplayComponents.push(comp);
|
|
2834
|
+
this._trackBox.snappedDisplayComponents = this._snappedDisplayComponents;
|
|
2835
|
+
this._resizeSnappedObserver = new ResizeObserver(this._resizeSnappedComponentHandler);
|
|
2836
|
+
this._resizeSnappedObserver.observe(comp.instance.element);
|
|
2837
|
+
}
|
|
2838
|
+
}
|
|
2839
|
+
}
|
|
2840
|
+
this._trackBox.items = displayItems;
|
|
2841
|
+
const listContainerRef = this._listContainerRef;
|
|
2842
|
+
const maxLength = displayItems.length, components = this._displayComponents;
|
|
2843
|
+
if (!!listContainerRef) {
|
|
2844
|
+
const doMap = {};
|
|
2845
|
+
let i = 0;
|
|
2846
|
+
for (let l = components.length; i < l; i++) {
|
|
2847
|
+
const item = components[i];
|
|
2848
|
+
if (!!item) {
|
|
2849
|
+
const id = item.instance.id;
|
|
2850
|
+
item.instance.renderer = this._$itemRenderer.getValue();
|
|
2851
|
+
doMap[id] = i;
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
while (components.length < maxLength) {
|
|
2855
|
+
const comp = listContainerRef.createComponent(this._itemComponentClass);
|
|
2856
|
+
const id = comp.instance.id;
|
|
2857
|
+
comp.instance.renderer = this._$itemRenderer.getValue();
|
|
2858
|
+
doMap[id] = i;
|
|
2859
|
+
components.push(comp);
|
|
2860
|
+
i++;
|
|
2861
|
+
}
|
|
2862
|
+
this._trackBox.setDisplayObjectIndexMapById(doMap);
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
updateOffsetsByAllignment() {
|
|
2866
|
+
const alignment = this._$actualAlignment.getValue(), items = this._$actualItems.getValue(), trackBy = this.trackBy, isInfinity = this.isInfinity, isVertical = this._isVertical, { width, height } = this._$bounds.getValue() || { width: DEFAULT_LIST_SIZE, height: DEFAULT_LIST_SIZE }, viewportSize = isVertical ? height : width, precalculatedScrollStartOffset = this._$precalculatedScrollStartOffset.getValue(), precalculatedScrollEndOffset = this._$precalculatedScrollEndOffset.getValue();
|
|
2867
|
+
switch (alignment) {
|
|
2868
|
+
case Alignments.NONE: {
|
|
2869
|
+
this._$actualScrollStartOffset.next(precalculatedScrollStartOffset);
|
|
2870
|
+
this._$actualScrollEndOffset.next(precalculatedScrollEndOffset);
|
|
2871
|
+
break;
|
|
2872
|
+
}
|
|
2873
|
+
case Alignments.CENTER: {
|
|
2874
|
+
const firstItemId = items.length > 0 ? (items[0]?.[trackBy] ?? null) : null, endItemId = items.length > 0 ? (items?.[items.length - 1]?.[trackBy] ?? null) : null, alignmentStartOffset = viewportSize * .5 - (firstItemId !== null ? (isVertical ? (this._service.getItemBounds(firstItemId)?.height ?? 0) :
|
|
2875
|
+
(this._service.getItemBounds(firstItemId)?.width ?? 0)) : 0) * (isInfinity ? 0 : .5), alignmentEndOffset = viewportSize * .5 - (endItemId !== null ? (isVertical ? (this._service.getItemBounds(endItemId)?.height ?? 0) :
|
|
2876
|
+
(this._service.getItemBounds(endItemId)?.width ?? 0)) : 0) * (isInfinity ? 0 : .5);
|
|
2877
|
+
this._$alignmentScrollStartOffset.next(alignmentStartOffset);
|
|
2878
|
+
this._$alignmentScrollEndOffset.next(alignmentEndOffset);
|
|
2879
|
+
this._$actualScrollStartOffset.next(precalculatedScrollStartOffset + alignmentStartOffset);
|
|
2880
|
+
this._$actualScrollEndOffset.next(precalculatedScrollEndOffset + alignmentEndOffset);
|
|
2881
|
+
break;
|
|
2882
|
+
}
|
|
2883
|
+
}
|
|
2884
|
+
}
|
|
2885
|
+
updateRegularRenderer() {
|
|
2886
|
+
this._resizeSnappedComponentHandler();
|
|
2887
|
+
}
|
|
2888
|
+
/**
|
|
2889
|
+
* Tracking by id
|
|
2890
|
+
*/
|
|
2891
|
+
tracking() {
|
|
2892
|
+
this._trackBox.track();
|
|
2893
|
+
}
|
|
2894
|
+
resetBoundsSize(isVertical, totalSize) {
|
|
2895
|
+
const l = this._$list.getValue(), prop = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = totalSize;
|
|
2896
|
+
if (!!l && parseInt(l.nativeElement.style[prop]) !== size) {
|
|
2897
|
+
l.nativeElement.style[prop] = `${size}${PX}`;
|
|
2898
|
+
}
|
|
2899
|
+
}
|
|
2900
|
+
/**
|
|
2901
|
+
* Returns the bounds of an element with a given id
|
|
2902
|
+
*/
|
|
2903
|
+
getItemBounds(id) {
|
|
2904
|
+
return this._service.getItemBounds(id);
|
|
2905
|
+
}
|
|
2906
|
+
/**
|
|
2907
|
+
* Focus an list item by a given id.
|
|
2908
|
+
*/
|
|
2909
|
+
focus(id, align = FocusAlignments.NONE) {
|
|
2910
|
+
this._elementRef.nativeElement.focus();
|
|
2911
|
+
this._service.focusById(id, align, this.scrollBehavior);
|
|
2912
|
+
}
|
|
2913
|
+
/**
|
|
2914
|
+
* The method scrolls the list to the element with the given `id` and returns the value of the scrolled area.
|
|
2915
|
+
*/
|
|
2916
|
+
scrollTo(id, cb = null, options = null) {
|
|
2917
|
+
const behavior = options?.behavior ?? BEHAVIOR_INSTANT, blending = options?.blending ?? false, focused = options?.focused ?? true, delay = options?.delay ?? 0, iteration = options?.iteration ?? 0;
|
|
2918
|
+
validateId(id);
|
|
2919
|
+
validateScrollBehavior(behavior);
|
|
2920
|
+
validateIteration(iteration);
|
|
2921
|
+
const actualIteration = validateScrollIteration(iteration);
|
|
2922
|
+
this._elementRef.nativeElement.focus();
|
|
2923
|
+
if (!this._scrollerComponent?.scrollable && !this.isInfinity) {
|
|
2924
|
+
this.scrollToFinalize(id, focused, cb);
|
|
2925
|
+
return;
|
|
2926
|
+
}
|
|
2927
|
+
this._$scrollTo.next({
|
|
2928
|
+
id, behavior, blending, delay, iteration: actualIteration, isLastIteration: actualIteration === MAX_SCROLL_TO_ITERATIONS, cb: () => {
|
|
2929
|
+
this.scrollToFinalize(id, focused, cb);
|
|
2930
|
+
}
|
|
2931
|
+
});
|
|
2932
|
+
}
|
|
2933
|
+
/**
|
|
2934
|
+
* Scrolls the scroll area to the first item in the collection.
|
|
2935
|
+
*/
|
|
2936
|
+
scrollToStart(cb = null, options = null) {
|
|
2937
|
+
const scroller = this._scrollerComponent;
|
|
2938
|
+
if (!!scroller) {
|
|
2939
|
+
const scrollSize = this.isVertical ? scroller.scrollTop : scroller.scrollLeft;
|
|
2940
|
+
if (scrollSize === 0) {
|
|
2941
|
+
return;
|
|
2942
|
+
}
|
|
2943
|
+
scroller.stopScrolling();
|
|
2944
|
+
}
|
|
2945
|
+
const behavior = options?.behavior ?? BEHAVIOR_INSTANT, blending = options?.blending ?? false, focused = options?.focused ?? true, delay = options?.delay ?? 0, iteration = options?.iteration ?? 0;
|
|
2946
|
+
validateScrollBehavior(behavior);
|
|
2947
|
+
validateIteration(iteration);
|
|
2948
|
+
const trackBy = this.trackBy, items = this._$actualItems.getValue(), firstItem = items.length > 0 ? items[0] ?? null : null, id = firstItem?.[trackBy] ?? null, actualIteration = validateScrollIteration(iteration);
|
|
2949
|
+
if (!!firstItem) {
|
|
2950
|
+
this._elementRef.nativeElement.focus();
|
|
2951
|
+
this._$scrollTo.next({
|
|
2952
|
+
id, behavior, blending, delay, iteration: actualIteration, isLastIteration: actualIteration === MAX_SCROLL_TO_ITERATIONS, cb: () => {
|
|
2953
|
+
this._$isScrollStart.next(true);
|
|
2954
|
+
this._trackBox.isScrollStart = true;
|
|
2955
|
+
this._trackBox.isScrollEnd = false;
|
|
2956
|
+
this._$fireUpdate.next(true);
|
|
2957
|
+
this.scrollToFinalize(id, focused, cb);
|
|
2958
|
+
}
|
|
2959
|
+
});
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
/**
|
|
2963
|
+
* @deprecated
|
|
2964
|
+
* The scrollToEndItem method is deprecated. Use the scrollToEnd method.
|
|
2965
|
+
*/
|
|
2966
|
+
scrollToEndItem(cb, options) {
|
|
2967
|
+
throw Error('The scrollToEndItem method is deprecated. Use the scrollToEnd method.');
|
|
2968
|
+
}
|
|
2969
|
+
/**
|
|
2970
|
+
* Scrolls the list to the end of the content size.
|
|
2971
|
+
*/
|
|
2972
|
+
scrollToEnd(cb = null, options = null) {
|
|
2973
|
+
const scroller = this._scrollerComponent;
|
|
2974
|
+
if (!!scroller) {
|
|
2975
|
+
const isVertical = this.isVertical, scrollSize = isVertical ? scroller.scrollTop : scroller.scrollLeft, maxScrollSize = isVertical ? scroller.scrollHeight : scroller.scrollTop;
|
|
2976
|
+
if (scrollSize === maxScrollSize) {
|
|
2977
|
+
return;
|
|
2978
|
+
}
|
|
2979
|
+
scroller.stopScrolling();
|
|
2980
|
+
}
|
|
2981
|
+
const behavior = options?.behavior ?? BEHAVIOR_INSTANT, blending = options?.blending ?? false, focused = options?.focused ?? true, delay = options?.delay ?? 0, iteration = options?.iteration ?? 0;
|
|
2982
|
+
validateScrollBehavior(behavior);
|
|
2983
|
+
validateIteration(iteration);
|
|
2984
|
+
const trackBy = this.trackBy, items = this._$actualItems.getValue(), latItem = items[items.length > 0 ? items.length - 1 : 0], id = latItem?.[trackBy] ?? null, actualIteration = validateScrollIteration(iteration);
|
|
2985
|
+
if (latItem === null) {
|
|
2986
|
+
return;
|
|
2987
|
+
}
|
|
2988
|
+
this._elementRef.nativeElement.focus();
|
|
2989
|
+
if (!this._scrollerComponent?.scrollable) {
|
|
2990
|
+
this.scrollToFinalize(id, focused, cb);
|
|
2991
|
+
return;
|
|
2992
|
+
}
|
|
2993
|
+
this._$scrollTo.next({
|
|
2994
|
+
id, behavior, blending, delay, iteration: actualIteration, isLastIteration: actualIteration === MAX_SCROLL_TO_ITERATIONS, cb: () => {
|
|
2995
|
+
this._$isScrollEnd.next(true);
|
|
2996
|
+
this._trackBox.isScrollStart = false;
|
|
2997
|
+
this._trackBox.isScrollEnd = true;
|
|
2998
|
+
this._$fireUpdate.next(true);
|
|
2999
|
+
this.scrollToFinalize(id, focused, cb);
|
|
3000
|
+
}
|
|
3001
|
+
});
|
|
3002
|
+
}
|
|
3003
|
+
scrollToFinalize(id, focused, cb) {
|
|
3004
|
+
if (focused) {
|
|
3005
|
+
const el = this._service.getFocusedElementById(id);
|
|
3006
|
+
if (!!el) {
|
|
3007
|
+
this._service.focus(el, FocusAlignments.NONE);
|
|
3008
|
+
}
|
|
3009
|
+
}
|
|
3010
|
+
if (typeof cb === 'function') {
|
|
3011
|
+
cb?.();
|
|
3012
|
+
}
|
|
3013
|
+
}
|
|
3014
|
+
cleanup() {
|
|
3015
|
+
const displayItems = [];
|
|
3016
|
+
this._service.collection = displayItems;
|
|
3017
|
+
this.createDisplayComponentsIfNeed(displayItems);
|
|
3018
|
+
this.tracking();
|
|
3019
|
+
this.emitScrollEvent(true, false, false);
|
|
3020
|
+
}
|
|
3021
|
+
/**
|
|
3022
|
+
* Force clearing the cache.
|
|
3023
|
+
*/
|
|
3024
|
+
cacheClean() {
|
|
3025
|
+
this._cached = false;
|
|
3026
|
+
if (this.dynamicSize) {
|
|
3027
|
+
this._trackBox.cacheClean();
|
|
3028
|
+
}
|
|
3029
|
+
const prerenderContainer = this._prerender;
|
|
3030
|
+
if (!!prerenderContainer) {
|
|
3031
|
+
prerenderContainer.clear();
|
|
3032
|
+
prerenderContainer.off();
|
|
3033
|
+
}
|
|
3034
|
+
this._$collapsedItemIds.next([]);
|
|
3035
|
+
this._$isScrollStart.next(true);
|
|
3036
|
+
this._$isScrollEnd.next(false);
|
|
3037
|
+
this._$totalSize.next(0);
|
|
3038
|
+
this._$scrollSize.next(0);
|
|
3039
|
+
const scroller = this._scrollerComponent;
|
|
3040
|
+
if (!!scroller) {
|
|
3041
|
+
scroller.reset();
|
|
3042
|
+
}
|
|
3043
|
+
}
|
|
3044
|
+
/**
|
|
3045
|
+
* @deprecated
|
|
3046
|
+
* The stopSnappingScrollToEnd method is deprecated. Use the preventSnapping method.
|
|
3047
|
+
*/
|
|
3048
|
+
stopSnappingScrollToEnd() {
|
|
3049
|
+
throw Error('The stopSnappingScrollToEnd method is deprecated. Use the preventSnapping method.');
|
|
3050
|
+
}
|
|
3051
|
+
/**
|
|
3052
|
+
* Prevents the list from snapping to its start or end edge.
|
|
3053
|
+
*/
|
|
3054
|
+
preventSnapping() {
|
|
3055
|
+
if (!this._readyForShow) {
|
|
3056
|
+
return;
|
|
3057
|
+
}
|
|
3058
|
+
const scroller = this._scrollerComponent;
|
|
3059
|
+
this._$isScrollStart.next(false);
|
|
3060
|
+
this._$isScrollEnd.next(false);
|
|
3061
|
+
this._trackBox.preventScrollSnapping(true);
|
|
3062
|
+
if (scroller) {
|
|
3063
|
+
scroller.stopScrolling();
|
|
3064
|
+
}
|
|
3065
|
+
}
|
|
3066
|
+
ngOnDestroy() {
|
|
3067
|
+
super.ngOnDestroy();
|
|
3068
|
+
this.dispose();
|
|
3069
|
+
}
|
|
3070
|
+
dispose() {
|
|
3071
|
+
this._$destroy.next();
|
|
3072
|
+
const updateId = this._updateId;
|
|
3073
|
+
if (updateId !== undefined) {
|
|
3074
|
+
cancelAnimationFrame(updateId);
|
|
3075
|
+
this._updateId = undefined;
|
|
3076
|
+
}
|
|
3077
|
+
if (this._service) {
|
|
3078
|
+
this._service.dispose();
|
|
3079
|
+
}
|
|
3080
|
+
if (!!this._trackBox) {
|
|
3081
|
+
this._trackBox.dispose();
|
|
3082
|
+
}
|
|
3083
|
+
if (!!this._resizeSnappedObserver) {
|
|
3084
|
+
this._resizeSnappedObserver.disconnect();
|
|
3085
|
+
}
|
|
3086
|
+
if (!!this._snappedDisplayComponents) {
|
|
3087
|
+
while (this._snappedDisplayComponents.length > 0) {
|
|
3088
|
+
const comp = this._snappedDisplayComponents.shift();
|
|
3089
|
+
comp?.destroy();
|
|
3090
|
+
}
|
|
3091
|
+
}
|
|
3092
|
+
if (this._displayComponents) {
|
|
3093
|
+
while (this._displayComponents.length > 0) {
|
|
3094
|
+
const comp = this._displayComponents.shift();
|
|
3095
|
+
comp?.destroy();
|
|
3096
|
+
}
|
|
3097
|
+
}
|
|
3098
|
+
}
|
|
3099
|
+
}
|
|
3100
|
+
NgVirtualListComponent.__nextId = 0;
|
|
3101
|
+
NgVirtualListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3102
|
+
NgVirtualListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { scrollbarThickness: "scrollbarThickness", scrollbarMinSize: "scrollbarMinSize", scrollbarThumbRenderer: "scrollbarThumbRenderer", scrollbarThumbParams: "scrollbarThumbParams", loading: "loading", waitForPreparation: "waitForPreparation", clickDistance: "clickDistance", items: "items", selectedIds: "selectedIds", defaultItemValue: "defaultItemValue", collapsedIds: "collapsedIds", selectByClick: "selectByClick", collapseByClick: "collapseByClick", snap: "snap", stickyEnabled: "stickyEnabled", snapToEndTransitionInstantOffset: "snapToEndTransitionInstantOffset", scrollStartOffset: "scrollStartOffset", scrollEndOffset: "scrollEndOffset", snapScrollToStart: "snapScrollToStart", snapScrollToEnd: "snapScrollToEnd", snapScrollToBottom: "snapScrollToBottom", scrollbarEnabled: "scrollbarEnabled", scrollbarInteractive: "scrollbarInteractive", overlappingScrollbar: "overlappingScrollbar", scrollBehavior: "scrollBehavior", scrollingSettings: "scrollingSettings", itemTransform: "itemTransform", snapToItem: "snapToItem", snapToItemAlign: "snapToItemAlign", snappingDistance: "snappingDistance", scrollingOneByOne: "scrollingOneByOne", alignment: "alignment", zIndexWhenSelecting: "zIndexWhenSelecting", spreadingMode: "spreadingMode", divides: "divides", motionBlur: "motionBlur", maxMotionBlur: "maxMotionBlur", motionBlurEnabled: "motionBlurEnabled", animationParams: "animationParams", overscrollEnabled: "overscrollEnabled", enabledBufferOptimization: "enabledBufferOptimization", itemRenderer: "itemRenderer", itemConfigMap: "itemConfigMap", itemSize: "itemSize", minItemSize: "minItemSize", maxItemSize: "maxItemSize", dynamicSize: "dynamicSize", direction: "direction", collectionMode: "collectionMode", bufferSize: "bufferSize", maxBufferSize: "maxBufferSize", snappingMethod: "snappingMethod", collapsingMode: "collapsingMode", methodForSelecting: "methodForSelecting", selectingMode: "selectingMode", trackBy: "trackBy", screenReaderMessage: "screenReaderMessage", langTextDir: "langTextDir" }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd", onViewportChange: "onViewportChange", onSnapItem: "onSnapItem", onItemClick: "onItemClick", onSelect: "onSelect", onCollapse: "onCollapse", onScrollReachStart: "onScrollReachStart", onScrollReachEnd: "onScrollReachEnd" }, host: { styleAttribute: "position: relative;" }, providers: [NgVirtualListService, NgVirtualListPublicService], viewQueries: [{ propertyName: "_prerender", first: true, predicate: ["prerender"], descendants: true, read: NgPrerenderContainer }, { propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_snapContainerRef", first: true, predicate: ["snapRendererContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollerComponent", first: true, predicate: ["scroller"], descendants: true, read: NgScrollerComponent }], usesInheritance: true, ngImport: i0, template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.NgScrollerComponent, selector: "ng-scroller", inputs: ["scrollbarEnabled", "scrollbarInteractive", "focusedElement", "overlappingScrollbar", "content", "loading", "classes", "scrollbarMinSize", "scrollbarThickness", "scrollbarThumbRenderer", "scrollbarThumbParams", "motionBlur", "maxMotionBlur", "motionBlurEnabled"], outputs: ["onScrollbarVisible"] }, { kind: "component", type: i3.NgPrerenderContainer, selector: "ng-prerender-container", inputs: ["enabled", "direction", "isVertical", "scrollbarEnabled", "startOffset", "endOffset", "bounds", "dynamic", "itemSize", "trackBy", "divides"] }, { kind: "directive", type: i4.LocaleSensitiveDirective, selector: "[localeSensitive]", inputs: ["langTextDir", "listDir"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
|
|
3103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgVirtualListComponent, decorators: [{
|
|
3104
|
+
type: Component,
|
|
3105
|
+
args: [{ selector: 'ng-virtual-list', host: {
|
|
3106
|
+
'style': 'position: relative;'
|
|
3107
|
+
}, standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, providers: [NgVirtualListService, NgVirtualListPublicService], template: "<div aria-live=\"polite\" aria-atomic=\"true\" class=\"ngvl__screen-reader\">\r\n {{ $screenReaderFormattedMessage | async }}\r\n</div>\r\n\r\n<ng-prerender-container #prerender [bounds]=\"($bounds | async)!\" [direction]=\"($direction | async)!\"\r\n [dynamic]=\"($dynamicSize | async)!\" [divides]=\"($divides | async)!\" [isVertical]=\"($isVertical | async)!\"\r\n [itemSize]=\"($actualItemSize | async)!\" [trackBy]=\"($trackBy | async)!\" [itemRenderer]=\"($itemRenderer | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [scrollbarEnabled]=\"(scroller.$scrollbarShow | async)!\"\r\n [enabled]=\"($prerenderEnabled | async)!\"></ng-prerender-container>\r\n\r\n<ng-container *ngIf=\"($stickyEnabled | async)!\">\r\n <div localeSensitive [langTextDir]=\"($langTextDir | async)!\" #snappedContainer class=\"ngvl__snapped-container\"\r\n [ngClass]=\"($classes | async)\">\r\n <div #snapped part=\"snapped-item\" class=\"ngvl__list-snapper\">\r\n <ng-container #snapRendererContainer></ng-container>\r\n </div>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-scroller #scroller class=\"ngvl__list-scroller\" [classes]=\"($classes | async)!\"\r\n [startOffset]=\"($startOffset | async)!\" [endOffset]=\"($endOffset | async)!\"\r\n [alignmentStartOffset]=\"($alignmentScrollStartOffset | async)!\"\r\n [alignmentEndOffset]=\"($alignmentScrollEndOffset | async)!\" [direction]=\"($direction | async)!\"\r\n [scrollbarThumbRenderer]=\"($scrollbarThumbRenderer | async)!\" [isInfinity]=\"($isInfinity | async)!\"\r\n [scrollbarThickness]=\"($scrollbarThickness | async)!\" [scrollbarThumbParams]=\"($scrollbarThumbParams | async)!\"\r\n [animationParams]=\"($animationParams | async)!\" [focusedElement]=\"($focusedElement | async)!\"\r\n [loading]=\"($loading | async)!\" [overscrollEnabled]=\"($overscrollEnabled | async)!\"\r\n [snappingDistance]=\"($snappingDistance | async)!\" [overlappingScrollbar]=\"($overlappingScrollbar | async)!\"\r\n [scrollbarEnabled]=\"($actualScrollbarEnabled | async)!\" [scrollbarInteractive]=\"($scrollbarInteractive | async)!\"\r\n [snapToItem]=\"($snapToItem | async)!\" [snapToItemAlign]=\"($snapToItemAlign | async)!\"\r\n [scrollbarMinSize]=\"($scrollbarMinSize | async)!\" [scrollBehavior]=\"($scrollBehavior | async)!\"\r\n [scrollingSettings]=\"($scrollingSettings | async)!\" [scrollingOneByOne]=\"($scrollingOneByOne | async)!\"\r\n [motionBlur]=\"($motionBlur | async)!\" [maxMotionBlur]=\"($maxMotionBlur | async)!\"\r\n [motionBlurEnabled]=\"($motionBlurEnabled | async)!\">\r\n <ng-container #renderersContainer></ng-container>\r\n</ng-scroller>", styles: [":host{position:relative;display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__snapped-container{position:relative;width:100%;opacity:0}.ngvl__snapped-container.prepared{opacity:1}.ngvl__list-snapper{-webkit-tap-highlight-color:transparent;position:absolute;list-style:none;left:0;top:0;z-index:1}.ngvl__list-scroller{-webkit-tap-highlight-color:transparent;position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.ngvl__screen-reader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
|
|
3108
|
+
}], ctorParameters: function () { return []; }, propDecorators: { _prerender: [{
|
|
3109
|
+
type: ViewChild,
|
|
3110
|
+
args: ['prerender', { read: NgPrerenderContainer }]
|
|
3111
|
+
}], _listContainerRef: [{
|
|
3112
|
+
type: ViewChild,
|
|
3113
|
+
args: ['renderersContainer', { read: ViewContainerRef }]
|
|
3114
|
+
}], _snapContainerRef: [{
|
|
3115
|
+
type: ViewChild,
|
|
3116
|
+
args: ['snapRendererContainer', { read: ViewContainerRef }]
|
|
3117
|
+
}], _scrollerComponent: [{
|
|
3118
|
+
type: ViewChild,
|
|
3119
|
+
args: ['scroller', { read: NgScrollerComponent }]
|
|
3120
|
+
}], onScroll: [{
|
|
3121
|
+
type: Output
|
|
3122
|
+
}], onScrollEnd: [{
|
|
3123
|
+
type: Output
|
|
3124
|
+
}], onViewportChange: [{
|
|
3125
|
+
type: Output
|
|
3126
|
+
}], onSnapItem: [{
|
|
3127
|
+
type: Output
|
|
3128
|
+
}], onItemClick: [{
|
|
3129
|
+
type: Output
|
|
3130
|
+
}], onSelect: [{
|
|
3131
|
+
type: Output
|
|
3132
|
+
}], onCollapse: [{
|
|
3133
|
+
type: Output
|
|
3134
|
+
}], onScrollReachStart: [{
|
|
3135
|
+
type: Output
|
|
3136
|
+
}], onScrollReachEnd: [{
|
|
3137
|
+
type: Output
|
|
3138
|
+
}], scrollbarThickness: [{
|
|
3139
|
+
type: Input
|
|
3140
|
+
}], scrollbarMinSize: [{
|
|
3141
|
+
type: Input
|
|
3142
|
+
}], scrollbarThumbRenderer: [{
|
|
3143
|
+
type: Input
|
|
3144
|
+
}], scrollbarThumbParams: [{
|
|
3145
|
+
type: Input
|
|
3146
|
+
}], loading: [{
|
|
3147
|
+
type: Input
|
|
3148
|
+
}], waitForPreparation: [{
|
|
3149
|
+
type: Input
|
|
3150
|
+
}], clickDistance: [{
|
|
3151
|
+
type: Input
|
|
3152
|
+
}], items: [{
|
|
3153
|
+
type: Input
|
|
3154
|
+
}], selectedIds: [{
|
|
3155
|
+
type: Input
|
|
3156
|
+
}], defaultItemValue: [{
|
|
3157
|
+
type: Input
|
|
3158
|
+
}], collapsedIds: [{
|
|
3159
|
+
type: Input
|
|
3160
|
+
}], selectByClick: [{
|
|
3161
|
+
type: Input
|
|
3162
|
+
}], collapseByClick: [{
|
|
3163
|
+
type: Input
|
|
3164
|
+
}], snap: [{
|
|
3165
|
+
type: Input
|
|
3166
|
+
}], stickyEnabled: [{
|
|
3167
|
+
type: Input
|
|
3168
|
+
}], snapToEndTransitionInstantOffset: [{
|
|
3169
|
+
type: Input
|
|
3170
|
+
}], scrollStartOffset: [{
|
|
3171
|
+
type: Input
|
|
3172
|
+
}], scrollEndOffset: [{
|
|
3173
|
+
type: Input
|
|
3174
|
+
}], snapScrollToStart: [{
|
|
3175
|
+
type: Input
|
|
3176
|
+
}], snapScrollToEnd: [{
|
|
3177
|
+
type: Input
|
|
3178
|
+
}], snapScrollToBottom: [{
|
|
3179
|
+
type: Input
|
|
3180
|
+
}], scrollbarEnabled: [{
|
|
3181
|
+
type: Input
|
|
3182
|
+
}], scrollbarInteractive: [{
|
|
3183
|
+
type: Input
|
|
3184
|
+
}], overlappingScrollbar: [{
|
|
3185
|
+
type: Input
|
|
3186
|
+
}], scrollBehavior: [{
|
|
3187
|
+
type: Input
|
|
3188
|
+
}], scrollingSettings: [{
|
|
3189
|
+
type: Input
|
|
3190
|
+
}], itemTransform: [{
|
|
3191
|
+
type: Input
|
|
3192
|
+
}], snapToItem: [{
|
|
3193
|
+
type: Input
|
|
3194
|
+
}], snapToItemAlign: [{
|
|
3195
|
+
type: Input
|
|
3196
|
+
}], snappingDistance: [{
|
|
3197
|
+
type: Input
|
|
3198
|
+
}], scrollingOneByOne: [{
|
|
3199
|
+
type: Input
|
|
3200
|
+
}], alignment: [{
|
|
3201
|
+
type: Input
|
|
3202
|
+
}], zIndexWhenSelecting: [{
|
|
3203
|
+
type: Input
|
|
3204
|
+
}], spreadingMode: [{
|
|
3205
|
+
type: Input
|
|
3206
|
+
}], divides: [{
|
|
3207
|
+
type: Input
|
|
3208
|
+
}], motionBlur: [{
|
|
3209
|
+
type: Input
|
|
3210
|
+
}], maxMotionBlur: [{
|
|
3211
|
+
type: Input
|
|
3212
|
+
}], motionBlurEnabled: [{
|
|
3213
|
+
type: Input
|
|
3214
|
+
}], animationParams: [{
|
|
3215
|
+
type: Input
|
|
3216
|
+
}], overscrollEnabled: [{
|
|
3217
|
+
type: Input
|
|
3218
|
+
}], enabledBufferOptimization: [{
|
|
3219
|
+
type: Input
|
|
3220
|
+
}], itemRenderer: [{
|
|
3221
|
+
type: Input
|
|
3222
|
+
}], itemConfigMap: [{
|
|
3223
|
+
type: Input
|
|
3224
|
+
}], itemSize: [{
|
|
3225
|
+
type: Input
|
|
3226
|
+
}], minItemSize: [{
|
|
3227
|
+
type: Input
|
|
3228
|
+
}], maxItemSize: [{
|
|
3229
|
+
type: Input
|
|
3230
|
+
}], dynamicSize: [{
|
|
3231
|
+
type: Input
|
|
3232
|
+
}], direction: [{
|
|
3233
|
+
type: Input
|
|
3234
|
+
}], collectionMode: [{
|
|
3235
|
+
type: Input
|
|
3236
|
+
}], bufferSize: [{
|
|
3237
|
+
type: Input
|
|
3238
|
+
}], maxBufferSize: [{
|
|
3239
|
+
type: Input
|
|
3240
|
+
}], snappingMethod: [{
|
|
3241
|
+
type: Input
|
|
3242
|
+
}], collapsingMode: [{
|
|
3243
|
+
type: Input
|
|
3244
|
+
}], methodForSelecting: [{
|
|
3245
|
+
type: Input
|
|
3246
|
+
}], selectingMode: [{
|
|
3247
|
+
type: Input
|
|
3248
|
+
}], trackBy: [{
|
|
3249
|
+
type: Input
|
|
3250
|
+
}], screenReaderMessage: [{
|
|
3251
|
+
type: Input
|
|
3252
|
+
}], langTextDir: [{
|
|
3253
|
+
type: Input
|
|
3254
|
+
}] } });
|
|
3255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUM5RSxNQUFNLEVBQWUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixHQUMvRSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUVqRyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQ25ELE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDdEcsT0FBTyxFQUNMLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUNyRyxtQ0FBbUMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFDL0ksZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGVBQWUsRUFDN0gsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUseUJB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aUNGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBNkJGLE9BQU87c0JBRFYsS0FBSztnQkE2QkYsVUFBVTtzQkFEYixLQUFLO2dCQTZCRixhQUFhO3NCQURoQixLQUFLO2dCQTZCRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBK0NGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBNkJGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFnQ0YseUJBQXlCO3NCQUQ1QixLQUFLO2dCQStCRixZQUFZO3NCQURmLEtBQUs7Z0JBb0RGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBK0JGLFFBQVE7c0JBRFgsS0FBSztnQkE2QkYsV0FBVztzQkFEZCxLQUFLO2dCQTZCRixXQUFXO3NCQURkLEtBQUs7Z0JBOEJGLFdBQVc7c0JBRGQsS0FBSztnQkE0QkYsU0FBUztzQkFEWixLQUFLO2dCQTRCRixjQUFjO3NCQURqQixLQUFLO2dCQTRCRixVQUFVO3NCQURiLEtBQUs7Z0JBb0NGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBNkJGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBZ0NGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBaUJGLGtCQUFrQjtzQkFEckIsS0FBSztnQkF3QkYsYUFBYTtzQkFEaEIsS0FBSztnQkE0QkYsT0FBTztzQkFEVixLQUFLO2dCQStCUSxtQkFBbUI7c0JBRGhDLEtBQUs7Z0JBZ0NGLFdBQVc7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsXHJcbiAgT25EZXN0cm95LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZnJvbUV2ZW50LCBtYXAsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBvZiwgc2tpcCwgU3ViamVjdCwgc3dpdGNoTWFwLCB0YWtlLCB0YWtlVW50aWwsIHRhcCxcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbmctbGlzdC1pdGVtL25nLXZpcnR1YWwtbGlzdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQkVIQVZJT1JfSU5TVEFOVCwgQ0xBU1NfTElTVF9IT1JJWk9OVEFMLCBDTEFTU19MSVNUX1ZFUlRJQ0FMLCBERUZBVUxUX0RJUkVDVElPTiwgREVGQVVMVF9EWU5BTUlDX1NJWkUsXHJcbiAgREVGQVVMVF9FTkFCTEVEX0JVRkZFUl9PUFRJTUlaQVRJT04sIERFRkFVTFRfSVRFTV9TSVpFLCBERUZBVUxUX0JVRkZFUl9TSVpFLCBERUZBVUxUX0xJU1RfU0laRSwgREVGQVVMVF9TVElDS1lfRU5BQkxFRCwgREVGQVVMVF9TTkFQUElOR19NRVRIT0QsXHJcbiAgSEVJR0hUX1BST1BfTkFNRSwgTEVGVF9QUk9QX05BTUUsIE1BWF9TQ1JPTExfVE9fSVRFUkFUSU9OUywgUFgsIEZPQ1VTLCBUT1BfUFJPUF9OQU1FLCBUUkFDS19CWV9QUk9QRVJUWV9OQU1FLCBXSURUSF9QUk9QX05BTUUsXHJcbiAgREVGQVVMVF9NQVhfQlVGRkVSX1NJWkUsIERFRkFVTFRfU0VMRUNUSU5HX01PREVTLCBERUZBVUxUX1NFTEVDVF9CWV9DTElDSywgREVGQVVMVF9DT0xMQVBTRV9CWV9DTElDSywgREVGQVVMVF9DT0xMRUNUSU9OX01PREUsXHJcbiAgREVGQVVMVF9TQ1JFRU5fUkVBREVSX01FU1NBR0UsIERFRkFVTFRfU05BUF9UT19FTkRfVFJBTlNJVElPTl9JTlNUQU5UX09GRlNFVCwgREVGQVVMVF9TTkFQX1NDUk9MTFRPX0VORCwgTUlOX1BJWEVMU19GT1JfUFJFVkVOVF9TTkFQUElORyxcclxuICBNT1VTRV9ET1dOLCBUT1VDSF9TVEFSVCwgREVGQVVMVF9MQU5HX1RFWFRfRElSLCBERUZBVUxUX0NMSUNLX0RJU1RBTkNFLCBERUZBVUxUX1dBSVRfRk9SX1BSRVBBUkFUSU9OLCBERUZBVUxUX1NDUk9MTEJBUl9USElDS05FU1MsXHJcbiAgREVGQVVMVF9TQ1JPTExCQVJfTUlOX1NJWkUsIEtFWV9ET1dOLCBCRUhBVklPUl9BVVRPLCBERUZBVUxUX1NDUk9MTEJBUl9FTkFCTEVELCBERUZBVUxUX1NDUk9MTEJBUl9JTlRFUkFDVElWRSwgREVGQVVMVF9PVkVSU0NST0xMX0VOQUJMRUQsXHJcbiAgREVGQVVMVF9BTklNQVRJT05fUEFSQU1TLCBERUZBVUxUX1NDUk9MTF9CRUhBVklPUiwgREVGQVVMVF9TTkFQX1NDUk9MTFRPX1NUQVJULCBFTVBUWV9TQ1JPTExfU1RBVEVfVkVSU0lPTiwgTUFYX1JFR1VMQVJfU05BUEVEX0NPTVBPTkVOVFMsXHJcbiAgUFJFUEFSRV9JVEVSQVRJT05TLCBQUkVQQVJBVElPTl9SRVVQREFURV9MRU5HVEgsIFJPTEVfTElTVF9CT1gsIFJPTEVfTElTVCwgS0VZX1RBQiwgTUFYX1ZFTE9DSVRZX0ZPUl9TQ1JPTExfUVVBTElUWV9PUFRJTUlaQVRJT05fTFZMMSxcclxuICBQUkVQQVJFX0lURVJBVElPTlNfRk9SX1VQREFURV9JVEVNUywgUFJFUEFSQVRJT05fUkVVUERBVEVfTEVOR1RIX0ZPUl9VUERBVEVfSVRFTVMsIFBSRVBBUkVfSVRFUkFUSU9OU19GT1JfQ09MTEFQU0VfSVRFTVMsXHJcbiAgUFJFUEFSQVRJT05fUkVVUERBVEVfTEVOR1RIX0ZPUl9DT0xMQVBTRV9JVEVNUywgTUFYX05VTUJFUlNfT0ZfU0tJUFNfRk9SX1FVQUxJVFlfT1BUSU1JWkFUSU9OX0xWTDEsIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLFxyXG4gIERFRkFVTFRfU05BUF9UT19JVEVNLCBERUZBVUxUX1NOQVBfVE9fSVRFTV9BTElHTiwgVklFV1BPUlQsIERFRkFVTFRfTU9USU9OX0JMVVIsIERFRkFVTFRfTUFYX01PVElPTl9CTFVSLCBERUZBVUxUX1NDUk9MTElOR19PTkVfQllfT05FLFxyXG4gIERFRkFVTFRfTU9USU9OX0JMVVJfRU5BQkxFRCwgREVGQVVMVF9ESVZJREVTLCBERUZBVUxUX1NOQVBQSU5HX0RJU1RBTkNFLCBERUZBVUxUX01BWF9JVEVNX1NJWkUsIERFRkFVTFRfTUlOX0lURU1fU0laRSxcclxuICBERUZBVUxUX0FMSUdOTUVOVCwgREVGQVVMVF9DT0xMQVBTSU5HX01PREVTLCBERUZBVUxUX1NQUkVBRElOR19NT0RFLCBERUZBVUxUX1pJTkRFWF9XSEVOX1NFTEVDVElORyxcclxuICBERUZBVUxUX09WRVJMQVBQSU5HX1NDUk9MTEJBUixcclxufSBmcm9tICcuL2NvbnN0JztcclxuaW1wb3J0IHtcclxuICBJUmVuZGVyVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uLCBJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG59IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBJU2Nyb2xsRXZlbnQsIElTY3JvbGxPcHRpb25zLCBJQW5pbWF0aW9uUGFyYW1zLCBJU2l6ZSwgSVJlbmRlclN0YWJpbGl6ZXJPcHRpb25zLCBJU2Nyb2xsaW5nU2V0dGluZ3MsXHJcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICBBbGlnbm1lbnQsIEFyaXRobWV0aWNFeHByZXNzaW9uLCBGb2N1c0FsaWdubWVudCwgSWQsIEl0ZW1UcmFuc2Zvcm0sIFNuYXBwaW5nRGlzdGFuY2UsIENvbGxlY3Rpb25Nb2RlLCBEaXJlY3Rpb24sIFNlbGVjdGluZ01vZGUsXHJcbiAgU25hcHBpbmdNZXRob2QsIFNuYXBUb0l0ZW1BbGlnbiwgVGV4dERpcmVjdGlvbiwgQ29sbGFwc2luZ01vZGUsXHJcbiAgU3ByZWFkaW5nTW9kZSxcclxufSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB9IGZyb20gJy4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBbGlnbm1lbnRzLCBDb2xsZWN0aW9uTW9kZXMsIERpcmVjdGlvbnMsIEZvY3VzQWxpZ25tZW50cywgU2VsZWN0aW5nTW9kZXMsIFNuYXBwaW5nTWV0aG9kcywgU25hcFRvSXRlbUFsaWducywgU3ByZWFkaW5nTW9kZXMsIFRleHREaXJlY3Rpb25zLFxyXG59IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZSwgU2Nyb2xsRXZlbnQsIHRvZ2dsZUNsYXNzTmFtZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBUcmFja0JveCB9IGZyb20gJy4vY29yZS90cmFjay1ib3gnO1xyXG5pbXBvcnQgeyBpc1NuYXBwaW5nTWV0aG9kQWR2ZW5jZWQgfSBmcm9tICcuL3V0aWxzL3NuYXBwaW5nLW1ldGhvZCc7XHJcbmltcG9ydCB7IEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbmctbGlzdC1pdGVtL2Jhc2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQkMSB9IGZyb20gJy4vbW9kZWxzL2NvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IGlzRGlyZWN0aW9uIH0gZnJvbSAnLi91dGlscy9pcy1kaXJlY3Rpb24nO1xyXG5pbXBvcnQgeyBOZ1ZpcnR1YWxMaXN0U2VydmljZSB9IGZyb20gJy4vbmctdmlydHVhbC1saXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpc1NlbGVjdE1vZGUgfSBmcm9tICcuL3V0aWxzL2lzLXNlbGVjdC1tb2RlJztcclxuaW1wb3J0IHsgaXNDb2xsYXBzZU1vZGUgfSBmcm9tICcuL3V0aWxzL2lzLWNvbGxhcHNlLW1vZGUnO1xyXG5pbXBvcnQgeyBTZWxlY3RpbmdNb2Rlc1R5cGVzIH0gZnJvbSAnLi9lbnVtcy9zZWxlY3RpbmctbW9kZXMtdHlwZXMnO1xyXG5pbXBvcnQgeyBDTWFwIH0gZnJvbSAnLi91dGlscy9jbWFwJztcclxuaW1wb3J0IHtcclxuICB2YWxpZGF0ZUFycmF5LCB2YWxpZGF0ZUJvb2xlYW4sIHZhbGlkYXRlRmxvYXQsIHZhbGlkYXRlRnVuY3Rpb24sIHZhbGlkYXRlSW50LCB2YWxpZGF0ZU9iamVjdCwgdmFsaWRhdGVTdHJpbmcsXHJcbn0gZnJvbSAnLi91dGlscy92YWxpZGF0aW9uJztcclxuaW1wb3J0IHsgY29weVZhbHVlQXNSZWFkb25seSwgb2JqZWN0QXNSZWFkb25seSB9IGZyb20gJy4vdXRpbHMvb2JqZWN0JztcclxuaW1wb3J0IHsgaXNDb2xsZWN0aW9uTW9kZSB9IGZyb20gJy4vdXRpbHMvaXMtY29sbGVjdGlvbi1tb2RlJztcclxuaW1wb3J0IHsgTmdTY3JvbGxlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9uZy1zY3JvbGxlci9uZy1zY3JvbGxlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJU2Nyb2xsVG9QYXJhbXMgfSBmcm9tICcuL2NvbXBvbmVudHMvbmctc2Nyb2xsLXZpZXcnO1xyXG5pbXBvcnQgeyBOZ1ByZXJlbmRlckNvbnRhaW5lciB9IGZyb20gJy4vY29tcG9uZW50cy9uZy1wcmVyZW5kZXItY29udGFpbmVyL25nLXByZXJlbmRlci1jb250YWluZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSVNjcm9sbFBhcmFtcyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IGZvcm1hdEFjdHVhbERpc3BsYXlJdGVtcywgZm9ybWF0U2NyZWVuUmVhZGVyTWVzc2FnZSB9IGZyb20gJy4vdXRpbHMvc2NyZWVuLXJlYWRlci1mb3JtYXR0ZXInO1xyXG5pbXBvcnQgeyB2YWxpZGF0ZUlkLCB2YWxpZGF0ZUl0ZXJhdGlvbiwgdmFsaWRhdGVTY3JvbGxCZWhhdmlvciwgdmFsaWRhdGVTY3JvbGxJdGVyYXRpb24gfSBmcm9tICcuL3V0aWxzL2xpc3QtdmFsaWRhdG9ycyc7XHJcbmltcG9ydCB7IEVWRU5UX0tFWV9ET1dOLCBLRVlfQVJSX0RPV04sIEtFWV9BUlJfTEVGVCwgS0VZX0FSUl9SSUdIVCwgS0VZX0FSUl9VUCB9IGZyb20gJy4vY29tcG9uZW50cy9uZy1saXN0LWl0ZW0vY29uc3QnO1xyXG5pbXBvcnQgeyBOZ1ZpcnR1YWxMaXN0UHVibGljU2VydmljZSB9IGZyb20gJy4vbmctdmlydHVhbC1saXN0LXB1YmxpYy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgaXNQZXJjZW50YWdlVmFsdWUgfSBmcm9tICcuL3V0aWxzL2lzLXBlcnNlbnRhZ2UtdmFsdWUnO1xyXG5pbXBvcnQgeyBwYXJzZUFyaXRobWV0aWNFeHByZXNzaW9uIH0gZnJvbSAnLi91dGlscy9wYXJzZS1hcml0aG1ldGljLWV4cHJlc3Npb24nO1xyXG5pbXBvcnQgeyBub3JtYWxpemVDb2xsZWN0aW9uIH0gZnJvbSAnLi91dGlscy9ub3JtYWxpemUtY29sbGVjdGlvbic7XHJcbmltcG9ydCB7IENvbGxhcHNpbmdNb2RlcyB9IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBpc1NwcmVhZGluZ01vZGUgfSBmcm9tICcuL3V0aWxzL2lzLXNwcmVhZGluZy1tb2RlJztcclxuaW1wb3J0IHsgSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnMsIElVcGRhdGVDb2xsZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgZ2V0U2Nyb2xsU3RhdGVWZXJzaW9uIH0gZnJvbSAnLi91dGlscy9nZXQtc2Nyb2xsLXN0YXRlLXZlcnNpb24nO1xyXG5pbXBvcnQgeyBEaXNwb3NhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9kaXNwb3NhYmxlLWNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogVmlydHVhbCBsaXN0IGNvbXBvbmVudC5cclxuICogTWF4aW11bSBwZXJmb3JtYW5jZSBmb3IgZXh0cmVtZWx5IGxhcmdlIGxpc3RzLlxyXG4gKiBJdCBpcyBiYXNlZCBvbiBhbGdvcml0aG1zIGZvciB2aXJ0dWFsaXphdGlvbiBvZiBzY3JlZW4gb2JqZWN0cy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTQueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50LnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBBbGV4YW5kcm92aWNoIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy12aXJ0dWFsLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHtcclxuICAgICdzdHlsZSc6ICdwb3NpdGlvbjogcmVsYXRpdmU7J1xyXG4gIH0sXHJcbiAgc3RhbmRhbG9uZTogZmFsc2UsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxyXG4gIHByb3ZpZGVyczogW05nVmlydHVhbExpc3RTZXJ2aWNlLCBOZ1ZpcnR1YWxMaXN0UHVibGljU2VydmljZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50IGV4dGVuZHMgRGlzcG9zYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX19uZXh0SWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG5cclxuICAvKipcclxuICAgKiBSZWFkb25seS4gUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG5cclxuICBwcml2YXRlIF9zZXJ2aWNlID0gaW5qZWN0KE5nVmlydHVhbExpc3RTZXJ2aWNlKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgncHJlcmVuZGVyJywgeyByZWFkOiBOZ1ByZXJlbmRlckNvbnRhaW5lciB9KVxyXG4gIHByaXZhdGUgX3ByZXJlbmRlcjogTmdQcmVyZW5kZXJDb250YWluZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3JlbmRlcmVyc0NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIHByaXZhdGUgX2xpc3RDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NuYXBSZW5kZXJlckNvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIHByaXZhdGUgX3NuYXBDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGVyJywgeyByZWFkOiBOZ1Njcm9sbGVyQ29tcG9uZW50IH0pXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsZXJDb21wb25lbnQ6IE5nU2Nyb2xsZXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxlciA9IHRoaXMuXyRzY3JvbGxlci5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGxpc3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkbGlzdCA9IHRoaXMuXyRsaXN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIHRoZSBsaXN0IGhhcyBiZWVuIHNjcm9sbGVkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxJU2Nyb2xsRXZlbnQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gdGhlIGxpc3QgaGFzIGNvbXBsZXRlZCBzY3JvbGxpbmcuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgb25TY3JvbGxFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElTY3JvbGxFdmVudD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiB0aGUgdmlld3BvcnQgc2l6ZSBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uVmlld3BvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTaXplPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0IHRoZSBjb21wb25lbnQgSUQgd2hlbiBhbiBlbGVtZW50IGNyb3NzZXMgdGhlIGFsaWdubWVudCBsaW5lIHNwZWNpZmllZCBieSB0aGUgc25hcFRvSXRlbUFsaWduIHByb3BlcnR5LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU25hcEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPElkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIGFuIGVsZW1lbnQgaXMgY2xpY2tlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBvbkl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SVJlbmRlclZpcnR1YWxMaXN0SXRlbTxhbnk+IHwgbnVsbD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiBlbGVtZW50cyBhcmUgc2VsZWN0ZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElkPiB8IElkIHwgbnVsbD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiBlbGVtZW50cyBhcmUgY29sbGFwc2VkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uQ29sbGFwc2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PElkPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiB0aGUgc2Nyb2xsIHJlYWNoZXMgdGhlIHN0YXJ0LlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU2Nyb2xsUmVhY2hTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiB0aGUgc2Nyb2xsIHJlYWNoZXMgdGhlIGVuZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBvblNjcm9sbFJlYWNoRW5kID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF8kc2hvdyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRzaG93ID0gdGhpcy5fJHNob3cuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRpbml0aWFsaXplZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHJlYWRvbmx5ICRpbml0aWFsaXplZCA9IHRoaXMuXyRpbml0aWFsaXplZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhclRoaWNrbmVzcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX1NDUk9MTEJBUl9USElDS05FU1MpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsYmFyVGhpY2tuZXNzID0gdGhpcy5fJHNjcm9sbGJhclRoaWNrbmVzcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsYmFyVGhpY2tuZXNzVHJhbnNmb3JtID0gKHY6IG51bWJlcikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUludCh2LCB0cnVlKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcm9sbGJhclRoaWNrbmVzc1wiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1NDUk9MTEJBUl9USElDS05FU1M7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBTY3JvbGxiYXIgdGhpY2tuZXNzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbGJhclRoaWNrbmVzcyh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFyVGhpY2tuZXNzLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zY3JvbGxiYXJUaGlja25lc3NUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbGJhclRoaWNrbmVzcy5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNjcm9sbGJhclRoaWNrbmVzcygpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxiYXJUaGlja25lc3MuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFyTWluU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX1NDUk9MTEJBUl9NSU5fU0laRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxiYXJNaW5TaXplID0gdGhpcy5fJHNjcm9sbGJhck1pblNpemUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbGJhck1pblNpemVUcmFuc2Zvcm0gPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlSW50KHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic2Nyb2xsYmFyTWluU2l6ZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1NDUk9MTEJBUl9NSU5fU0laRTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIE1pbmltdW0gc2Nyb2xsYmFyIHNpemUuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyTWluU2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc2Nyb2xsYmFyTWluU2l6ZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNjcm9sbGJhck1pblNpemUoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsYmFyTWluU2l6ZS5nZXRWYWx1ZSgpIGFzIG51bWJlcjsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFyVGh1bWJSZW5kZXJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+KG51bGwpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsYmFyVGh1bWJSZW5kZXJlciA9IHRoaXMuXyRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxiYXJUaHVtYlJlbmRlcmVyVHJhbnNmb3JtID0gKHY6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KHYsIHRydWUsIHRydWUpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic2Nyb2xsYmFyVGh1bWJSZW5kZXJlclwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG9iamVjdGAuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2Nyb2xsYmFyIGN1c3RvbWl6YXRpb24gdGVtcGxhdGUuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyVGh1bWJSZW5kZXJlcih2OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zY3JvbGxiYXJUaHVtYlJlbmRlcmVyVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2Nyb2xsYmFyVGh1bWJSZW5kZXJlcigpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxiYXJUaHVtYlJlbmRlcmVyLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhclRodW1iUGFyYW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtwcm9wTmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsPih7fSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxiYXJUaHVtYlBhcmFtcyA9IHRoaXMuXyRzY3JvbGxiYXJUaHVtYlBhcmFtcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsYmFyVGh1bWJQYXJhbXNUcmFuc2Zvcm0gPSAodjogeyBbcHJvcE5hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCkgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZU9iamVjdCh2LCB0cnVlLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcm9sbGJhclRodW1iUGFyYW1zXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgb2JqZWN0YC4nKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBzY3JvbGxiYXIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyVGh1bWJQYXJhbXModjogeyBbcHJvcE5hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxiYXJUaHVtYlBhcmFtcy5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc2Nyb2xsYmFyVGh1bWJQYXJhbXNUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbGJhclRodW1iUGFyYW1zLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2Nyb2xsYmFyVGh1bWJQYXJhbXMoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsYmFyVGh1bWJQYXJhbXMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkaW5nID0ge1xyXG4gICAgdHJhbnNmb3JtOiAodjogYm9vbGVhbikgPT4ge1xyXG4gICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2KTtcclxuXHJcbiAgICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJsb2FkaW5nXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAuJyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2O1xyXG4gICAgfSxcclxuICB9IGFzIGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfJGxvYWRpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGxvYWRpbmcgPSB0aGlzLl8kbG9hZGluZy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbG9hZGluZ1RyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2KTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcImxvYWRpbmdcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWYgYHRydWVgLCB0aGUgc2Nyb2xsQmFyIGdvZXMgaW50byBsb2FkaW5nIHN0YXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGxvYWRpbmcodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRsb2FkaW5nLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9sb2FkaW5nVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRsb2FkaW5nLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgbG9hZGluZygpIHsgcmV0dXJuIHRoaXMuXyRsb2FkaW5nLmdldFZhbHVlKCkgYXMgYm9vbGVhbjsgfVxyXG5cclxuICBwcml2YXRlIF8kd2FpdEZvclByZXBhcmF0aW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1dBSVRfRk9SX1BSRVBBUkFUSU9OKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHdhaXRGb3JQcmVwYXJhdGlvbiA9IHRoaXMuXyR3YWl0Rm9yUHJlcGFyYXRpb24uYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3dhaXRGb3JQcmVwYXJhdGlvblRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwid2FpdEZvclByZXBhcmF0aW9uXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1dBSVRfRk9SX1BSRVBBUkFUSU9OO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWYgdHJ1ZSwgaXQgd2lsbCB3YWl0IHVudGlsIHRoZSBsaXN0IGl0ZW1zIGFyZSBmdWxseSBwcmVwYXJlZCBiZWZvcmUgZGlzcGxheWluZyB0aGVtLi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHdhaXRGb3JQcmVwYXJhdGlvbih2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHdhaXRGb3JQcmVwYXJhdGlvbi5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fd2FpdEZvclByZXBhcmF0aW9uVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyR3YWl0Rm9yUHJlcGFyYXRpb24ubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCB3YWl0Rm9yUHJlcGFyYXRpb24oKSB7IHJldHVybiB0aGlzLl8kd2FpdEZvclByZXBhcmF0aW9uLmdldFZhbHVlKCkgYXMgYm9vbGVhbjsgfVxyXG5cclxuICBwcml2YXRlIF8kY2xpY2tEaXN0YW5jZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0NMSUNLX0RJU1RBTkNFKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGNsaWNrRGlzdGFuY2UgPSB0aGlzLl8kY2xpY2tEaXN0YW5jZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xpY2tEaXN0YW5jZVRyYW5zZm9ybSA9ICh2OiBudW1iZXIpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVJbnQodik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJjbGlja0Rpc3RhbmNlXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgbnVtYmVyYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfQ0xJQ0tfRElTVEFOQ0U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWF4aW11bSBzY3JvbGwgZGlzdGFuY2UgYXQgd2hpY2ggYSBjbGljayBldmVudCBpcyB0cmlnZ2VyZWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgY2xpY2tEaXN0YW5jZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kY2xpY2tEaXN0YW5jZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fY2xpY2tEaXN0YW5jZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kY2xpY2tEaXN0YW5jZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGNsaWNrRGlzdGFuY2UoKSB7IHJldHVybiB0aGlzLl8kY2xpY2tEaXN0YW5jZS5nZXRWYWx1ZSgpIGFzIG51bWJlcjsgfVxyXG5cclxuICBwcml2YXRlIF8kaXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElWaXJ0dWFsTGlzdENvbGxlY3Rpb24+KFtdKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGl0ZW1zID0gdGhpcy5fJGl0ZW1zLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9pdGVtc1RyYW5zZm9ybSA9ICh2OiBJVmlydHVhbExpc3RDb2xsZWN0aW9uKSA9PiB7XHJcbiAgICBsZXQgdmFsaWQgPSB2YWxpZGF0ZUFycmF5KHYsIHRydWUsIHRydWUpO1xyXG4gICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMudHJhY2tCeTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHYubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0gdltpXTtcclxuICAgICAgICAgIHZhbGlkID0gdmFsaWRhdGVPYmplY3QoaXRlbSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gJiYgISh2YWxpZGF0ZUZsb2F0KGl0ZW0/Llt0cmFja0J5XSBhcyBudW1iZXIsIHRydWUpIHx8IHZhbGlkYXRlU3RyaW5nKGl0ZW0/Llt0cmFja0J5XSBhcyBzdHJpbmcsIHRydWUsIHRydWUpKSkge1xyXG4gICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIml0ZW1zXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbmAgb3IgYG51bGxgLicpO1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0aW9uIG9mIGxpc3QgaXRlbXMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbXModjogSVZpcnR1YWxMaXN0Q29sbGVjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuXyRpdGVtcy5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5faXRlbXNUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1zLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgaXRlbXMoKSB7IHJldHVybiB0aGlzLl8kaXRlbXMuZ2V0VmFsdWUoKSBhcyBJVmlydHVhbExpc3RDb2xsZWN0aW9uOyB9XHJcblxyXG4gIHByaXZhdGUgXyRzZWxlY3RlZElkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8SWQ+IHwgSWQgfCBudWxsPihudWxsKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNlbGVjdGVkSWRzID0gdGhpcy5fJHNlbGVjdGVkSWRzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZElkc1RyYW5zZm9ybSA9ICh2OiBBcnJheTxJZD4gfCBJZCB8IG51bGwpID0+IHtcclxuICAgIGxldCB2YWxpZCA9IHZhbGlkYXRlQXJyYXkodiBhcyBhbnksIHRydWUsIHRydWUpIHx8IHZhbGlkYXRlU3RyaW5nKHYgYXMgYW55LCB0cnVlLCB0cnVlKSB8fCB2YWxpZGF0ZUZsb2F0KHYgYXMgYW55LCB0cnVlKTtcclxuICAgIGlmICh2YWxpZCkge1xyXG4gICAgICBpZiAodiAmJiBBcnJheS5pc0FycmF5KHYpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB2Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHZbaV07XHJcbiAgICAgICAgICB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKGl0ZW0gYXMgYW55KSB8fCB2YWxpZGF0ZUZsb2F0KGl0ZW0gYXMgYW55KTtcclxuICAgICAgICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzZWxlY3RlZElkc1wiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYEFycmF5PElkPiB8IElkYCBvciBgbnVsbGAuJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9pc011bHRpU2VsZWN0aW9uID8gW10gOiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgc2VsZWN0ZWQgaXRlbXMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2VsZWN0ZWRJZHModjogQXJyYXk8SWQ+IHwgSWQgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fJHNlbGVjdGVkSWRzLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zZWxlY3RlZElkc1RyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kc2VsZWN0ZWRJZHMubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzZWxlY3RlZElkcygpIHsgcmV0dXJuIHRoaXMuXyRzZWxlY3RlZElkcy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRkZWZhdWx0SXRlbVZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJVmlydHVhbExpc3RJdGVtIHwgbnVsbD4obnVsbCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRkZWZhdWx0SXRlbVZhbHVlID0gdGhpcy5fJGRlZmF1bHRJdGVtVmFsdWUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRlZmF1bHRJdGVtVmFsdWUodjogSVZpcnR1YWxMaXN0SXRlbSB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl8kZGVmYXVsdEl0ZW1WYWx1ZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kZGVmYXVsdEl0ZW1WYWx1ZS5uZXh0KHYpO1xyXG4gIH07XHJcbiAgZ2V0IGRlZmF1bHRJdGVtVmFsdWUoKSB7IHJldHVybiB0aGlzLl8kZGVmYXVsdEl0ZW1WYWx1ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRjb2xsYXBzZWRJZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PElkPj4oW10pO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkY29sbGFwc2VkSWRzID0gdGhpcy5fJGNvbGxhcHNlZElkcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY29sbGFwc2VkSWRzVHJhbnNmb3JtID0gKHY6IEFycmF5PElkPikgPT4ge1xyXG4gICAgbGV0IHZhbGlkID0gdmFsaWRhdGVBcnJheSh2IGFzIGFueSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBpZiAodmFsaWQpIHtcclxuICAgICAgaWYgKHYgJiYgQXJyYXkuaXNBcnJheSh2KSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2W2ldO1xyXG4gICAgICAgICAgdmFsaWQgPSB2YWxpZGF0ZVN0cmluZyhpdGVtIGFzIGFueSkgfHwgdmFsaWRhdGVGbG9hdChpdGVtIGFzIGFueSk7XHJcbiAgICAgICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwiY29sbGFwc2VkSWRzXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgQXJyYXk8SWQ+YC4nKTtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgY29sbGFwc2VkIGl0ZW1zLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbGxhcHNlZElkcyh2OiBBcnJheTxJZD4pIHtcclxuICAgIGlmICh0aGlzLl8kY29sbGFwc2VkSWRzLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9jb2xsYXBzZWRJZHNUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJGNvbGxhcHNlZElkcy5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGNvbGxhcHNlZElkcygpIHsgcmV0dXJuIHRoaXMuXyRjb2xsYXBzZWRJZHMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2VsZWN0QnlDbGljayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TRUxFQ1RfQllfQ0xJQ0spO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2VsZWN0QnlDbGljayA9IHRoaXMuXyRzZWxlY3RCeUNsaWNrLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RCeUNsaWNrVHJhbnNmb3JtID0gKHY6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVCb29sZWFuKHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic2VsZWN0QnlDbGlja1wiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TRUxFQ1RfQllfQ0xJQ0s7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBgZmFsc2VgLCB0aGUgZWxlbWVudCBpcyBzZWxlY3RlZCB1c2luZyB0aGUgY29uZmlnLmFwaSBtZXRob2QgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZTsgXHJcbiAgICogaWYgYHRydWVgLCB0aGUgZWxlbWVudCBpcyBzZWxlY3RlZCBieSBjbGlja2luZyBvbiBpdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNlbGVjdEJ5Q2xpY2sodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRzZWxlY3RCeUNsaWNrLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zZWxlY3RCeUNsaWNrVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzZWxlY3RCeUNsaWNrLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2VsZWN0QnlDbGljaygpIHsgcmV0dXJuIHRoaXMuXyRzZWxlY3RCeUNsaWNrLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGNvbGxhcHNlQnlDbGljayA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9DT0xMQVBTRV9CWV9DTElDSyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRjb2xsYXBzZUJ5Q2xpY2sgPSB0aGlzLl8kY29sbGFwc2VCeUNsaWNrLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jb2xsYXBzZUJ5Q2xpY2tUcmFuc2Zvcm0gPSAodjogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUJvb2xlYW4odik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJjb2xsYXBzZUJ5Q2xpY2tcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfQ09MTEFQU0VfQllfQ0xJQ0s7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBgZmFsc2VgLCB0aGUgZWxlbWVudCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIGNvbmZpZy5jb2xsYXBzZSBtZXRob2QgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZTsgXHJcbiAgICogaWYgYHRydWVgLCB0aGUgZWxlbWVudCBpcyBjb2xsYXBzZWQgYnkgY2xpY2tpbmcgb24gaXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2xsYXBzZUJ5Q2xpY2sodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRjb2xsYXBzZUJ5Q2xpY2suZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2NvbGxhcHNlQnlDbGlja1RyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kY29sbGFwc2VCeUNsaWNrLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgY29sbGFwc2VCeUNsaWNrKCkgeyByZXR1cm4gdGhpcy5fJGNvbGxhcHNlQnlDbGljay5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICogVXNlIHRoZSBgc3RpY2t5RW5hYmxlZGAgcHJvcGVydHkgaW5zdGVhZC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzbmFwKHY6IGJvb2xlYW4pIHtcclxuICAgIHRocm93IEVycm9yKGBQcm9wZXJ0eSBzbmFwIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgXFxgc3RpY2t5RW5hYmxlZFxcYCBwcm9wZXJ0eSBpbnN0ZWFkLmApO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgXyRzdGlja3lFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NUSUNLWV9FTkFCTEVEKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHN0aWNreUVuYWJsZWQgPSB0aGlzLl8kc3RpY2t5RW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RpY2t5RW5hYmxlZFRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2KTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInN0aWNreUVuYWJsZWRcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfU1RJQ0tZX0VOQUJMRUQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgaXRlbXMgd2l0aCB0aGUgZ2l2ZW4gYHN0aWNreWAgaW4gYGl0ZW1Db25maWdNYXBgIHdpbGwgc3RpY2sgdG8gdGhlIGVkZ2VzLiBEZWZhdWx0IHZhbHVlIGlzIFwidHJ1ZVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHN0aWNreUVuYWJsZWQodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRzdGlja3lFbmFibGVkLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zdGlja3lFbmFibGVkVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzdGlja3lFbmFibGVkLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc3RpY2t5RW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuXyRzdGlja3lFbmFibGVkLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNuYXBUb0VuZFRyYW5zaXRpb25JbnN0YW50T2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfU05BUF9UT19FTkRfVFJBTlNJVElPTl9JTlNUQU5UX09GRlNFVCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzbmFwVG9FbmRUcmFuc2l0aW9uSW5zdGFudE9mZnNldCA9IHRoaXMuXyRzbmFwVG9FbmRUcmFuc2l0aW9uSW5zdGFudE9mZnNldC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc25hcFRvRW5kVHJhbnNpdGlvbkluc3RhbnRPZmZzZXRUcmFuc2Zvcm0gPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzbmFwVG9FbmRUcmFuc2l0aW9uSW5zdGFudE9mZnNldFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1NOQVBfVE9fRU5EX1RSQU5TSVRJT05fSU5TVEFOVF9PRkZTRVQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBvZmZzZXQgdmFsdWU7IGlmIHRoZSBzY3JvbGwgYXJlYSB2YWx1ZSBpcyBleGNlZWRlZCwgdGhlIHNjcm9sbCBhbmltYXRpb24gd2lsbCBiZSBkaXNhYmxlZC4gRGVmYXVsdCB2YWx1ZSBpcyBcIjBcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzbmFwVG9FbmRUcmFuc2l0aW9uSW5zdGFudE9mZnNldCh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kc25hcFRvRW5kVHJhbnNpdGlvbkluc3RhbnRPZmZzZXQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3NuYXBUb0VuZFRyYW5zaXRpb25JbnN0YW50T2Zmc2V0VHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzbmFwVG9FbmRUcmFuc2l0aW9uSW5zdGFudE9mZnNldC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNuYXBUb0VuZFRyYW5zaXRpb25JbnN0YW50T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0VuZFRyYW5zaXRpb25JbnN0YW50T2Zmc2V0LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbFN0YXJ0T2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcml0aG1ldGljRXhwcmVzc2lvbj4oMCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxTdGFydE9mZnNldCA9IHRoaXMuXyRzY3JvbGxTdGFydE9mZnNldC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsU3RhcnRPZmZzZXRUcmFuc2Zvcm0gPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodiwgdHJ1ZSkgfHwgaXNQZXJjZW50YWdlVmFsdWUodik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzY3JvbGxTdGFydE9mZnNldFwiIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZiB0eXBlIGBudW1iZXJgIG9yIGBzdHJpbmdgLicpO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHNjcm9sbCBzdGFydCBvZmZzZXQgdmFsdWUuIENhbiBiZSBzcGVjaWZpZWQgaW4gYWJzb2x1dGUgb3IgcGVyY2VudGFnZSB2YWx1ZXMuXHJcbiAgICogU3VwcG9ydHMgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBvZiBhZGRpdGlvbiBgNTAlICsgMjVgIG9yIHN1YnRyYWN0aW9uIGA1MCUgLSAyNWAuIERlZmF1bHQgdmFsdWUgaXMgXCIwXCIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsU3RhcnRPZmZzZXQodjogQXJpdGhtZXRpY0V4cHJlc3Npb24pIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsU3RhcnRPZmZzZXQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0VHJhbnNmb3JtKHYgYXMgYW55KTtcclxuXHJcbiAgICB0aGlzLl8kc2Nyb2xsU3RhcnRPZmZzZXQubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzY3JvbGxTdGFydE9mZnNldCgpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxTdGFydE9mZnNldC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxFbmRPZmZzZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFyaXRobWV0aWNFeHByZXNzaW9uPigwKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNjcm9sbEVuZE9mZnNldCA9IHRoaXMuXyRzY3JvbGxFbmRPZmZzZXQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbEVuZE9mZnNldFRyYW5zZm9ybSA9ICh2OiBudW1iZXIpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVGbG9hdCh2LCB0cnVlKSB8fCBpc1BlcmNlbnRhZ2VWYWx1ZSh2KTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcm9sbEVuZE9mZnNldFwiIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZiB0eXBlIGBudW1iZXJgIG9yIGBzdHJpbmdgLicpO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHNjcm9sbCBlbmQgb2Zmc2V0IHZhbHVlLiBDYW4gYmUgc3BlY2lmaWVkIGluIGFic29sdXRlIG9yIHBlcmNlbnRhZ2UgdmFsdWVzLlxyXG4gICAqIFN1cHBvcnRzIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgb2YgYWRkaXRpb24gYDUwJSArIDI1YCBvciBzdWJ0cmFjdGlvbiBgNTAlIC0gMjVgLiBEZWZhdWx0IHZhbHVlIGlzIFwiMFwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbEVuZE9mZnNldCh2OiBBcml0aG1ldGljRXhwcmVzc2lvbikge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxFbmRPZmZzZXQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3Njcm9sbEVuZE9mZnNldFRyYW5zZm9ybSh2IGFzIGFueSk7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbEVuZE9mZnNldC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNjcm9sbEVuZE9mZnNldCgpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxFbmRPZmZzZXQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcFNjcm9sbFRvU3RhcnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU05BUF9TQ1JPTExUT19TVEFSVCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzbmFwU2Nyb2xsVG9TdGFydCA9IHRoaXMuXyRzbmFwU2Nyb2xsVG9TdGFydC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc25hcFNjcm9sbFRvU3RhcnRUcmFuc2Zvcm0gPSAodjogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUJvb2xlYW4odiwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzbmFwU2Nyb2xsVG9TdGFydFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TTkFQX1NDUk9MTFRPX1NUQVJUO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzY3JvbGwgd2lsbCBiZSBhbmNob3JlZCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3QuIERlZmF1bHQgdmFsdWUgaXMgXCJ0cnVlXCIuXHJcbiAgICogVGhpcyBwcm9wZXJ0eSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIHNuYXBTY3JvbGxUb0VuZCBwcm9wZXJ0eS5cclxuICAgKiBUaGF0IGlzLCBpZiBzbmFwU2Nyb2xsVG9TdGFydCBhbmQgc25hcFNjcm9sbFRvRW5kIGFyZSBlbmFibGVkLCB0aGUgbGlzdCB3aWxsIGluaXRpYWxseSBzbmFwIFxyXG4gICAqIHRvIHRoZSBiZWdpbm5pbmc7IGlmIHlvdSBtb3ZlIHRoZSBzY3JvbGwgYmFyIHRvIHRoZSBlbmQsIHRoZSBsaXN0IHdpbGwgc25hcCB0byB0aGUgZW5kLiBcclxuICAgKiBJZiBzbmFwU2Nyb2xsVG9TdGFydCBpcyBkaXNhYmxlZCBhbmQgc25hcFNjcm9sbFRvRW5kIGlzIGVuYWJsZWQsIHRoZSBsaXN0IHdpbGwgc25hcCB0byB0aGUgZW5kOyBcclxuICAgKiBpZiB5b3UgbW92ZSB0aGUgc2Nyb2xsIGJhciB0byB0aGUgYmVnaW5uaW5nLCB0aGUgbGlzdCB3aWxsIHNuYXAgdG8gdGhlIGJlZ2lubmluZy4gXHJcbiAgICogSWYgYm90aCBzbmFwU2Nyb2xsVG9TdGFydCBhbmQgc25hcFNjcm9sbFRvRW5kIGFyZSBkaXNhYmxlZCwgdGhlIGxpc3Qgd2lsbCBuZXZlciBzbmFwIHRvIHRoZSBiZWdpbm5pbmcgb3IgZW5kLlxyXG4gICAqIEluIHRoZSBgc3ByZWFkaW5nTW9kZT1TcHJlYWRpbmdNb2Rlcy5JTkZJTklUWWAgbW9kZSwgdGhlIGBzbmFwU2Nyb2xsVG9TdGFydGAgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCwgc2luY2UgdGhlIGxpc3QgaGFzIG5vIGJlZ2lubmluZyBvciBlbmQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcFNjcm9sbFRvU3RhcnQodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRzbmFwU2Nyb2xsVG9TdGFydC5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc25hcFNjcm9sbFRvU3RhcnRUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNuYXBTY3JvbGxUb1N0YXJ0Lm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc25hcFNjcm9sbFRvU3RhcnQoKSB7IHJldHVybiB0aGlzLl8kc25hcFNjcm9sbFRvU3RhcnQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcFNjcm9sbFRvRW5kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NOQVBfU0NST0xMVE9fRU5EKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNuYXBTY3JvbGxUb0VuZCA9IHRoaXMuXyRzbmFwU2Nyb2xsVG9FbmQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3NuYXBTY3JvbGxUb0VuZFRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2LCB0cnVlKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNuYXBTY3JvbGxUb0VuZFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TTkFQX1NDUk9MTFRPX0VORDtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc2Nyb2xsIHdpbGwgYmUgYW5jaG9yZWQgdG8gdGhlINGD0YLQsiBvZiB0aGUgbGlzdC4gRGVmYXVsdCB2YWx1ZSBpcyBcInRydWVcIi5cclxuICAgKiBUaGF0IGlzLCBpZiBzbmFwU2Nyb2xsVG9TdGFydCBhbmQgc25hcFNjcm9sbFRvRW5kIGFyZSBlbmFibGVkLCB0aGUgbGlzdCB3aWxsIGluaXRpYWxseSBzbmFwIFxyXG4gICAqIHRvIHRoZSBiZWdpbm5pbmc7IGlmIHlvdSBtb3ZlIHRoZSBzY3JvbGwgYmFyIHRvIHRoZSBlbmQsIHRoZSBsaXN0IHdpbGwgc25hcCB0byB0aGUgZW5kLiBcclxuICAgKiBJZiBzbmFwU2Nyb2xsVG9TdGFydCBpcyBkaXNhYmxlZCBhbmQgc25hcFNjcm9sbFRvRW5kIGlzIGVuYWJsZWQsIHRoZSBsaXN0IHdpbGwgc25hcCB0byB0aGUgZW5kOyBcclxuICAgKiBpZiB5b3UgbW92ZSB0aGUgc2Nyb2xsIGJhciB0byB0aGUgYmVnaW5uaW5nLCB0aGUgbGlzdCB3aWxsIHNuYXAgdG8gdGhlIGJlZ2lubmluZy4gXHJcbiAgICogSWYgYm90aCBzbmFwU2Nyb2xsVG9TdGFydCBhbmQgc25hcFNjcm9sbFRvRW5kIGFyZSBkaXNhYmxlZCwgdGhlIGxpc3Qgd2lsbCBuZXZlciBzbmFwIHRvIHRoZSBiZWdpbm5pbmcgb3IgZW5kLlxyXG4gICAqIEluIHRoZSBgc3ByZWFkaW5nTW9kZT1TcHJlYWRpbmdNb2Rlcy5JTkZJTklUWWAgbW9kZSwgdGhlIGBzbmFwU2Nyb2xsVG9FbmRgIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQsIHNpbmNlIHRoZSBsaXN0IGhhcyBubyBiZWdpbm5pbmcgb3IgZW5kLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNuYXBTY3JvbGxUb0VuZCh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHNuYXBTY3JvbGxUb0VuZC5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc25hcFNjcm9sbFRvRW5kVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzbmFwU2Nyb2xsVG9FbmQubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzbmFwU2Nyb2xsVG9FbmQoKSB7IHJldHVybiB0aGlzLl8kc25hcFNjcm9sbFRvRW5kLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKiBUaGUgc3RvcFNuYXBwaW5nU2Nyb2xsVG9FbmQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBzbmFwU2Nyb2xsVG9FbmQgcHJvcGVydHkuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcFNjcm9sbFRvQm90dG9tKHY6IGJvb2xlYW4pIHtcclxuICAgIHRocm93IEVycm9yKCdUaGUgc3RvcFNuYXBwaW5nU2Nyb2xsVG9FbmQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBzbmFwU2Nyb2xsVG9FbmQgcHJvcGVydHkuJyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbGJhckVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMQkFSX0VOQUJMRUQpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsYmFyRW5hYmxlZCA9IHRoaXMuXyRzY3JvbGxiYXJFbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxiYXJFbmFibGVkVHJhbnNmb3JtID0gKHY6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVCb29sZWFuKHYsIHRydWUpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic2Nyb2xsYmFyRW5hYmxlZFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TQ1JPTExCQVJfRU5BQkxFRDtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc2Nyb2xsYmFyIGlzIHNob3duIG9yIG5vdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJ0cnVlXCIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsYmFyRW5hYmxlZCh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHNjcm9sbGJhckVuYWJsZWQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3Njcm9sbGJhckVuYWJsZWRUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbGJhckVuYWJsZWQubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzY3JvbGxiYXJFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGJhckVuYWJsZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsYmFySW50ZXJhY3RpdmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMQkFSX0lOVEVSQUNUSVZFKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNjcm9sbGJhckludGVyYWN0aXZlID0gdGhpcy5fJHNjcm9sbGJhckludGVyYWN0aXZlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxiYXJJbnRlcmFjdGl2ZVRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2LCB0cnVlKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcm9sbGJhckludGVyYWN0aXZlXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1NDUk9MTEJBUl9JTlRFUkFDVElWRTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBzY3JvbGxpbmcgdXNpbmcgdGhlIHNjcm9sbGJhciB3aWxsIGJlIHBvc3NpYmxlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcInRydWVcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzY3JvbGxiYXJJbnRlcmFjdGl2ZSh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHNjcm9sbGJhckludGVyYWN0aXZlLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zY3JvbGxiYXJJbnRlcmFjdGl2ZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kc2Nyb2xsYmFySW50ZXJhY3RpdmUubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzY3JvbGxiYXJJbnRlcmFjdGl2ZSgpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxiYXJJbnRlcmFjdGl2ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRvdmVybGFwcGluZ1Njcm9sbGJhciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9PVkVSTEFQUElOR19TQ1JPTExCQVIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkb3ZlcmxhcHBpbmdTY3JvbGxiYXIgPSB0aGlzLl8kb3ZlcmxhcHBpbmdTY3JvbGxiYXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX292ZXJsYXBwaW5nU2Nyb2xsYmFyVHJhbnNmb3JtID0gKHY6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVCb29sZWFuKHYsIHRydWUpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwib3ZlcmxhcHBpbmdTY3JvbGxiYXJcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfT1ZFUkxBUFBJTkdfU0NST0xMQkFSO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzY3JvbGwgYmFyIHdpbGwgb3ZlcmxhcCB0aGUgbGlzdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJmYWxzZVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG92ZXJsYXBwaW5nU2Nyb2xsYmFyKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kb3ZlcmxhcHBpbmdTY3JvbGxiYXIuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX292ZXJsYXBwaW5nU2Nyb2xsYmFyVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRvdmVybGFwcGluZ1Njcm9sbGJhci5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG92ZXJsYXBwaW5nU2Nyb2xsYmFyKCkgeyByZXR1cm4gdGhpcy5fJG92ZXJsYXBwaW5nU2Nyb2xsYmFyLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbEJlaGF2aW9yID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTY3JvbGxCZWhhdmlvcj4oREVGQVVMVF9TQ1JPTExfQkVIQVZJT1IpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsQmVoYXZpb3IgPSB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbEJlaGF2aW9yVHJhbnNmb3JtID0gKHY6IFNjcm9sbEJlaGF2aW9yKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKHYsIHRydWUsIHRydWUpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic2Nyb2xsQmVoYXZpb3JcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfU0NST0xMX0JFSEFWSU9SO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lcyB0aGUgc2Nyb2xsaW5nIGJlaGF2aW9yIGZvciBhbnkgZWxlbWVudCBvbiB0aGUgcGFnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJzbW9vdGhcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzY3JvbGxCZWhhdmlvcih2OiBTY3JvbGxCZWhhdmlvcikge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc2Nyb2xsQmVoYXZpb3JUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbEJlaGF2aW9yLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2Nyb2xsQmVoYXZpb3IoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuZ2V0VmFsdWUoKTsgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxpbmdTZXR0aW5ncyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVNjcm9sbGluZ1NldHRpbmdzPihERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxpbmdTZXR0aW5ncyA9IHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsaW5nU2V0dGluZ3NUcmFuc2Zvcm0gPSAodjogSVNjcm9sbGluZ1NldHRpbmdzKTogSVNjcm9sbGluZ1NldHRpbmdzID0+IHtcclxuICAgIGxldCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KHYsIHRydWUsIHRydWUpO1xyXG4gICAgaWYgKHZhbGlkICYmICEhdikge1xyXG4gICAgICBjb25zdCB7IGZyaWN0aW9uYWxGb3JjZSwgbWFzcywgbWF4RGlzdGFuY2UsIG1heER1cmF0aW9uLCBzcGVlZFNjYWxlLCBvcHRpbWl6YXRpb24gfSA9IHY7XHJcbiAgICAgIHZhbGlkID0gdmFsaWRhdGVGbG9hdChmcmljdGlvbmFsRm9yY2UsIHRydWUpO1xyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVGhlIFwiZnJpY3Rpb25hbEZvcmNlXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgbnVtYmVyYCBvciBgdW5kZWZpbmVkYC4nKTtcclxuICAgICAgICByZXR1cm4gREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1M7XHJcbiAgICAgIH1cclxuICAgICAgdmFsaWQgPSB2YWxpZGF0ZUZsb2F0KG1hc3MsIHRydWUpO1xyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVGhlIFwibWFzc1wiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAgb3IgYHVuZGVmaW5lZGAuJyk7XHJcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbGlkID0gdmFsaWRhdGVGbG9hdChtYXhEaXN0YW5jZSwgdHJ1ZSk7XHJcbiAgICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJtYXhEaXN0YW5jZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAgb3IgYHVuZGVmaW5lZGAuJyk7XHJcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbGlkID0gdmFsaWRhdGVGbG9hdChtYXhEdXJhdGlvbiwgdHJ1ZSk7XHJcbiAgICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJtYXhEdXJhdGlvblwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAgb3IgYHVuZGVmaW5lZGAuJyk7XHJcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbGlkID0gdmFsaWRhdGVGbG9hdChzcGVlZFNjYWxlLCB0cnVlKTtcclxuICAgICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNwZWVkU2NhbGVcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBudW1iZXJgIG9yIGB1bmRlZmluZWRgLicpO1xyXG4gICAgICAgIHJldHVybiBERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUztcclxuICAgICAgfVxyXG4gICAgICB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbihvcHRpbWl6YXRpb24sIHRydWUpO1xyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignVGhlIFwib3B0aW1pemF0aW9uXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAgb3IgYHVuZGVmaW5lZGAuJyk7XHJcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcm9sbGluZ1NldHRpbmdzXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgb2JqZWN0YCBvciBudWxsLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1M7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmcmljdGlvbmFsRm9yY2U6IHYuZnJpY3Rpb25hbEZvcmNlICE9PSB1bmRlZmluZWQgJiYgdi5mcmljdGlvbmFsRm9yY2UgPiAwID8gdi5mcmljdGlvbmFsRm9yY2UgOiBERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUy5mcmljdGlvbmFsRm9yY2UsXHJcbiAgICAgIG1hc3M6IHYubWFzcyAhPT0gdW5kZWZpbmVkICYmIHYubWFzcyA+IDAgPyB2Lm1hc3MgOiBERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUy5tYXNzLFxyXG4gICAgICBtYXhEaXN0YW5jZTogdi5tYXhEaXN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIHYubWF4RGlzdGFuY2UgPiAwID8gdi5tYXhEaXN0YW5jZSA6IERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLm1heERpc3RhbmNlLFxyXG4gICAgICBtYXhEdXJhdGlvbjogdi5tYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHYubWF4RHVyYXRpb24gPiAwID8gdi5tYXhEdXJhdGlvbiA6IERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLm1heER1cmF0aW9uLFxyXG4gICAgICBzcGVlZFNjYWxlOiB2LnNwZWVkU2NhbGUgIT09IHVuZGVmaW5lZCAmJiB2LnNwZWVkU2NhbGUgPiAwID8gdi5zcGVlZFNjYWxlIDogREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1Muc3BlZWRTY2FsZSxcclxuICAgICAgb3B0aW1pemF0aW9uOiB2Lm9wdGltaXphdGlvbiA/PyBERUZBVUxUX1NDUk9MTElOR19TRVRUSU5HUy5vcHRpbWl6YXRpb24sXHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjcm9sbGluZyBzZXR0aW5ncy5cclxuICAgKiAtIGZyaWN0aW9uYWxGb3JjZSAtIEZyaWN0aW9uYWwgZm9yY2UuIERlZmF1bHQgdmFsdWUgaXMgMC4wMzUuXHJcbiAgICogLSBtYXNzIC0gTWFzcy4gRGVmYXVsdCB2YWx1ZSBpcyAwLjAwNS5cclxuICAgKiAtIG1heERpc3RhbmNlIC0gTWF4aW11bSBzY3JvbGxpbmcgZGlzdGFuY2UuIERlZmF1bHQgdmFsdWUgaXMgMTAwMDAwLlxyXG4gICAqIC0gbWF4RHVyYXRpb24gLSBNYXhpbXVtIGFuaW1hdGlvbiBkdXJhdGlvbi4gRGVmYXVsdCB2YWx1ZSBpcyA0MDAwLlxyXG4gICAqIC0gc3BlZWRTY2FsZSAtIFNwZWVkIHNjYWxlLiBEZWZhdWx0IHZhbHVlIGlzIDEwLlxyXG4gICAqIC0gb3B0aW1pemF0aW9uIC0gRW5hYmxlcyBzY3JvbGxpbmcgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzY3JvbGxpbmdTZXR0aW5ncyh2OiBJU2Nyb2xsaW5nU2V0dGluZ3MpIHtcclxuICAgIGlmICh0aGlzLl8kc2Nyb2xsaW5nU2V0dGluZ3MuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3Njcm9sbGluZ1NldHRpbmdzVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNjcm9sbGluZ1NldHRpbmdzKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGl0ZW1UcmFuc2Zvcm0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEl0ZW1UcmFuc2Zvcm0gfCBudWxsPihudWxsKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGl0ZW1UcmFuc2Zvcm0gPSB0aGlzLl8kaXRlbVRyYW5zZm9ybS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbVRyYW5zZm9ybVRyYW5zZm9ybSA9ICh2OiBhbnkpID0+IHtcclxuICAgIGxldCB2YWxpZCA9IHZhbGlkYXRlRnVuY3Rpb24odiwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIml0ZW1UcmFuc2Zvcm1cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBJdGVtVHJhbnNmb3JtYCBvciBgbnVsbGAuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uIG9mIGVsZW1lbnQncyBwb3NpdGlvbiwgcm90YXRpb24sIHNjYWxlLCBvcGFjaXR5IGFuZCB6SW5kZXguIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtVHJhbnNmb3JtKHY6IEl0ZW1UcmFuc2Zvcm0gfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fJGl0ZW1UcmFuc2Zvcm0uZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2l0ZW1UcmFuc2Zvcm1UcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1UcmFuc2Zvcm0ubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBpdGVtVHJhbnNmb3JtKCkgeyByZXR1cm4gdGhpcy5fJGl0ZW1UcmFuc2Zvcm0uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcFRvSXRlbSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TTkFQX1RPX0lURU0pO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc25hcFRvSXRlbSA9IHRoaXMuXyRzbmFwVG9JdGVtLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zbmFwVG9JdGVtVHJhbnNmb3JtID0gKHY6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVCb29sZWFuKHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic25hcFRvSXRlbVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TTkFQX1RPX0lURU07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBTbmFwIHRvIGFuIGl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcFRvSXRlbSh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3NuYXBUb0l0ZW1UcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNuYXBUb0l0ZW0ubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzbmFwVG9JdGVtKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcFRvSXRlbUFsaWduID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTbmFwVG9JdGVtQWxpZ24+KERFRkFVTFRfU05BUF9UT19JVEVNX0FMSUdOKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNuYXBUb0l0ZW1BbGlnbiA9IHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24uYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3NuYXBUb0l0ZW1BbGlnblRyYW5zZm9ybSA9ICh2OiBTbmFwVG9JdGVtQWxpZ24pID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVTdHJpbmcodikgJiYgKHYgPT09ICdzdGFydCcgfHwgdiA9PT0gJ2NlbnRlcicgfHwgdiA9PT0gJ2VuZCcpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic25hcFRvSXRlbUFsaWduXCIgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIGBzdGFydGAsIGBjZW50ZXJgIG9yIGBlbmRgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TTkFQX1RPX0lURU1fQUxJR047XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBBbGlnbm1lbnQgZm9yIHNuYXBUb0l0ZW0uIEF2YWlsYWJsZSB2YWx1ZXMg4oCL4oCLYXJlIGBzdGFydGAsIGBjZW50ZXJgLCBhbmQgYGVuZGAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBjZW50ZXJgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNuYXBUb0l0ZW1BbGlnbih2OiBTbmFwVG9JdGVtQWxpZ24pIHtcclxuICAgIGlmICh0aGlzLl8kc25hcFRvSXRlbUFsaWduLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zbmFwVG9JdGVtQWxpZ25UcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNuYXBUb0l0ZW1BbGlnbigpIHsgcmV0dXJuIHRoaXMuXyRzbmFwVG9JdGVtQWxpZ24uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcHBpbmdEaXN0YW5jZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U25hcHBpbmdEaXN0YW5jZT4oREVGQVVMVF9TTkFQUElOR19ESVNUQU5DRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzbmFwcGluZ0Rpc3RhbmNlID0gdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3NuYXBwaW5nRGlzdGFuY2VUcmFuc2Zvcm0gPSAodjogU25hcHBpbmdEaXN0YW5jZSB8IGFueSkgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZVN0cmluZyh2KSB8fCB2YWxpZGF0ZUZsb2F0KHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic25hcHBpbmdEaXN0YW5jZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAgb3IgYHN0cmluZ2AuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX1NOQVBQSU5HX0RJU1RBTkNFO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU25hcHBpbmcgYWN0aXZhdGlvbiBkaXN0YW5jZS4gQ2FuIGJlIHNwZWNpZmllZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGVsZW1lbnQgc2l6ZSBvciBpbiBhYnNvbHV0ZSB2YWx1ZXMuXHJcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDI1JWAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcHBpbmdEaXN0YW5jZSh2OiBTbmFwcGluZ0Rpc3RhbmNlKSB7XHJcbiAgICBpZiAodGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3NuYXBwaW5nRGlzdGFuY2VUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzbmFwcGluZ0Rpc3RhbmNlKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsaW5nT25lQnlPbmUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU0NST0xMSU5HX09ORV9CWV9PTkUpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsaW5nT25lQnlPbmUgPSB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbGluZ09uZUJ5T25lVHJhbnNmb3JtID0gKHY6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUJvb2xlYW4odik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzY3JvbGxpbmdPbmVCeU9uZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TQ1JPTExJTkdfT05FX0JZX09ORTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHNjcm9sbCBvbmUgaXRlbSBhdCBhIHRpbWUgaWYgdHJ1ZSBhbmQgdGhlIHNjcm9sbFRvSXRlbSBwcm9wZXJ0eSBpcyBzZXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Nyb2xsaW5nT25lQnlPbmUodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc2Nyb2xsaW5nT25lQnlPbmVUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbGluZ09uZUJ5T25lLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2Nyb2xsaW5nT25lQnlPbmUoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kYWxpZ25tZW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBbGlnbm1lbnQ+KERFRkFVTFRfQUxJR05NRU5UKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGFsaWdubWVudCA9IHRoaXMuXyRhbGlnbm1lbnQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2FsaWdubWVudFRyYW5zZm9ybSA9ICh2OiBBbGlnbm1lbnQpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVTdHJpbmcodikgJiYgKHYgPT09ICdub25lJyB8fCB2ID09PSAnY2VudGVyJyk7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJhbGlnbm1lbnRcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgYG5vbmVgIG9yIGBjZW50ZXJ0YC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfQUxJR05NRU5UO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBsaXN0LiBUd28gbW9kZXMgYXJlIGF2YWlsYWJsZTogYG5vbmVgIGFuZCBgY2VudGVyYC4gVGhlIGBjZW50ZXJgIG1vZGUgYWxpZ25zIHRoZSBsaXN0IGl0ZW1zIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LCBpZGVhbCBmb3IgdXNlIHdpdGggdGhlIGBpdGVtVHJhbnNmb3JtYCBwcm9wZXJ0eS5cclxuICAgKiBUaGUgYG5vbmVgIG1vZGUgbWVhbnMgbm8gYWxpZ25tZW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgbm9uZWAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgYWxpZ25tZW50KHY6IEFsaWdubWVudCkge1xyXG4gICAgaWYgKHRoaXMuXyRhbGlnbm1lbnQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2FsaWdubWVudFRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kYWxpZ25tZW50Lm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgYWxpZ25tZW50KCkgeyByZXR1cm4gdGhpcy5fJGFsaWdubWVudC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyR6SW5kZXhXaGVuU2VsZWN0aW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihERUZBVUxUX1pJTkRFWF9XSEVOX1NFTEVDVElORyk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICR6SW5kZXhXaGVuU2VsZWN0aW5nID0gdGhpcy5fJHpJbmRleFdoZW5TZWxlY3RpbmcuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3pJbmRleFdoZW5TZWxlY3RpbmdUcmFuc2Zvcm0gPSAodjogc3RyaW5nIHwgbnVsbCkgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZVN0cmluZyh2LCB0cnVlLCB0cnVlKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInpJbmRleFdoZW5TZWxlY3RpbmdcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBudW1iZXJgIG9yIGBudWxsYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfWklOREVYX1dIRU5fU0VMRUNUSU5HO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHYgPz8gbnVsbDtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmVzIHRoZSB6SW5kZXggd2hlbiBhIGxpc3QgaXRlbSBpcyBzZWxlY3RlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYG51bGxgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHpJbmRleFdoZW5TZWxlY3Rpbmcodjogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuXyR6SW5kZXhXaGVuU2VsZWN0aW5nLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl96SW5kZXhXaGVuU2VsZWN0aW5nVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyR6SW5kZXhXaGVuU2VsZWN0aW5nLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgekluZGV4V2hlblNlbGVjdGluZygpIHsgcmV0dXJuIHRoaXMuXyR6SW5kZXhXaGVuU2VsZWN0aW5nLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNwcmVhZGluZ01vZGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNwcmVhZGluZ01vZGU+KERFRkFVTFRfU1BSRUFESU5HX01PREUpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc3ByZWFkaW5nTW9kZSA9IHRoaXMuXyRzcHJlYWRpbmdNb2RlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zcHJlYWRpbmdNb2RlVHJhbnNmb3JtID0gKHY6IFNwcmVhZGluZ01vZGUpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVTdHJpbmcodikgJiYgKHYgPT09ICdub3JtYWwnIHx8IHYgPT09ICdpbmZpbml0eScpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic3ByZWFkaW5nTW9kZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9uZSBvZiBgbm9ybWFsYCBvciBgaW5maW5pdHlgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TUFJFQURJTkdfTU9ERTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBvcmRlciBvZiBsaXN0IGVsZW1lbnRzLiBBdmFpbGFibGUgdmFsdWVzIOKAi+KAi2FyZSBgc3RhbmRhcmRgIGFuZCBgaW5maW5pdHlgLlxyXG4gICAqIGBub3JtYWxgIOKAlCBsaXN0IGVsZW1lbnRzIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgY29sbGVjdGlvbiBzZXF1ZW5jZS5cclxuICAgKiBgaW5maW5pdHlgIOKAlCBsaXN0IGVsZW1lbnRzIGFyZSBvcmRlcmVkIGN5Y2xpY2FsbHksIGZvcm1pbmcgYW4gaW5maW5pdGUgbGlzdC5cclxuICAgKiBXaGVuIHNldCB0byBgaW5maW5pdHlgLCB0aGUgYGFsaWdubWVudGAgcHJvcGVydHkgaXMgZm9yY2VkIHRvIHRoZSB2YWx1ZSBgQWxpZ25tZW50cy5DRU5URVJgLCB0aGUgYHNjcm9sbGJhckVuYWJsZWRgIHByb3BlcnR5IGlzIGZvcmNlZCB0byB0aGUgYGZhbHNlYFxyXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBzdGFuZGFyZGAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3ByZWFkaW5nTW9kZSh2OiBTcHJlYWRpbmdNb2RlKSB7XHJcbiAgICBpZiAodGhpcy5fJHNwcmVhZGluZ01vZGUuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3NwcmVhZGluZ01vZGVUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJHNwcmVhZGluZ01vZGUubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBzcHJlYWRpbmdNb2RlKCkgeyByZXR1cm4gdGhpcy5fJHNwcmVhZGluZ01vZGUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kZGl2aWRlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0RJVklERVMpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkZGl2aWRlcyA9IHRoaXMuXyRkaXZpZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9kaXZpZGVzVHJhbnNmb3JtID0gKHY6IG51bWJlcikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUZsb2F0KHYpO1xyXG5cclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwiZGl2aWRlc1wiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0RJVklERVM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdiA8PSAwID8gREVGQVVMVF9ESVZJREVTIDogdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDb2x1bW4gb3Igcm93IG51bWJlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGAxYC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXZpZGVzKHY6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuXyRkaXZpZGVzLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9kaXZpZGVzVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRkaXZpZGVzLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgZGl2aWRlcygpIHsgcmV0dXJuIHRoaXMuXyRkaXZpZGVzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJG1vdGlvbkJsdXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oREVGQVVMVF9NT1RJT05fQkxVUik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRtb3Rpb25CbHVyID0gdGhpcy5fJG1vdGlvbkJsdXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX21vdGlvbkJsdXJUcmFuc2Zvcm0gPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJtb3Rpb25CbHVyXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgbnVtYmVyYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfRElWSURFUztcclxuICAgIH1cclxuICAgIHJldHVybiB2IDw9IDAgPyBERUZBVUxUX0RJVklERVMgOiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdGlvbiBibHVyIGVmZmVjdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDAuMTVgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG1vdGlvbkJsdXIodjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fJG1vdGlvbkJsdXIuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX21vdGlvbkJsdXJUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJG1vdGlvbkJsdXIubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBtb3Rpb25CbHVyKCkgeyByZXR1cm4gdGhpcy5fJG1vdGlvbkJsdXIuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kbWF4TW90aW9uQmx1ciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX01BWF9NT1RJT05fQkxVUik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRtYXhNb3Rpb25CbHVyID0gdGhpcy5fJG1heE1vdGlvbkJsdXIuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX21heE1vdGlvbkJsdXJUcmFuc2Zvcm0gPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodik7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJtYXhNb3Rpb25CbHVyXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgbnVtYmVyYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfTUFYX01PVElPTl9CTFVSO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHYgPD0gMCA/IERFRkFVTFRfTUFYX01PVElPTl9CTFVSIDogdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBNYXhpbXVtIG1vdGlvbiBibHVyIGVmZmVjdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDAuNWAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgbWF4TW90aW9uQmx1cih2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kbWF4TW90aW9uQmx1ci5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fbWF4TW90aW9uQmx1clRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kbWF4TW90aW9uQmx1ci5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG1heE1vdGlvbkJsdXIoKSB7IHJldHVybiB0aGlzLl8kbWF4TW90aW9uQmx1ci5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRtb3Rpb25CbHVyRW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9NT1RJT05fQkxVUl9FTkFCTEVEKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJG1vdGlvbkJsdXJFbmFibGVkID0gdGhpcy5fJG1vdGlvbkJsdXJFbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9tb3Rpb25CbHVyRW5hYmxlZFRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2KTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIm1vdGlvbkJsdXJFbmFibGVkXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX01PVElPTl9CTFVSX0VOQUJMRUQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXBwbHkgbW90aW9uIGJsdXIgb3Igbm90LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG1vdGlvbkJsdXJFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kbW90aW9uQmx1ckVuYWJsZWQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX21vdGlvbkJsdXJFbmFibGVkVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRtb3Rpb25CbHVyRW5hYmxlZC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG1vdGlvbkJsdXJFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fJG1vdGlvbkJsdXJFbmFibGVkLmdldFZhbHVlKCk7IH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIF8kYW5pbWF0aW9uUGFyYW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQW5pbWF0aW9uUGFyYW1zPihERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkYW5pbWF0aW9uUGFyYW1zID0gdGhpcy5fJGFuaW1hdGlvblBhcmFtcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfYW5pbWF0aW9uUGFyYW1zVHJhbnNmb3JtID0gKHY6IElBbmltYXRpb25QYXJhbXMpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVPYmplY3QodiwgdHJ1ZSwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0ZUZsb2F0KHYuc2Nyb2xsVG9JdGVtKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJzY3JvbGxUb0l0ZW1cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBudW1iZXJgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9BTklNQVRJT05fUEFSQU1TO1xyXG4gICAgfVxyXG4gICAgaWYgKCF2YWxpZGF0ZUZsb2F0KHYuc25hcFRvSXRlbSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwic25hcFRvSXRlbVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0FOSU1BVElPTl9QQVJBTVM7XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbGlkYXRlRmxvYXQodi5uYXZpZ2F0ZUJ5S2V5Ym9hcmQpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIm5hdmlnYXRlQnlLZXlib2FyZFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0FOSU1BVElPTl9QQVJBTVM7XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbGlkYXRlRmxvYXQodi5uYXZpZ2F0ZVRvSXRlbSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwibmF2aWdhdGVUb0l0ZW1cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBudW1iZXJgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9BTklNQVRJT05fUEFSQU1TO1xyXG4gICAgfVxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJhbmltYXRpb25QYXJhbXNcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBvYmplY3RgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9BTklNQVRJT05fUEFSQU1TO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQW5pbWF0aW9uIHBhcmFtZXRlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwieyBzY3JvbGxUb0l0ZW06IDUwLCBzbmFwVG9JdGVtOiAxNTAsIG5hdmlnYXRlVG9JdGVtOiAxNTAsIG5hdmlnYXRlQnlLZXlib2FyZDogNTAgfVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGFuaW1hdGlvblBhcmFtcyh2OiBJQW5pbWF0aW9uUGFyYW1zKSB7XHJcbiAgICBpZiAodGhpcy5fJGFuaW1hdGlvblBhcmFtcy5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fYW5pbWF0aW9uUGFyYW1zVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRhbmltYXRpb25QYXJhbXMubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBhbmltYXRpb25QYXJhbXMoKSB7IHJldHVybiB0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJG92ZXJzY3JvbGxFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX09WRVJTQ1JPTExfRU5BQkxFRCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRvdmVyc2Nyb2xsRW5hYmxlZCA9IHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfb3ZlcnNjcm9sbEVuYWJsZWRUcmFuc2Zvcm0gPSAodjogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUJvb2xlYW4odiwgdHJ1ZSk7XHJcblxyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJvdmVyc2Nyb2xsRW5hYmxlZFwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYGJvb2xlYW5gLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9PVkVSU0NST0xMX0VOQUJMRUQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG92ZXJzY3JvbGwgKHJlLXNjcm9sbCkgZmVhdHVyZSB3aWxsIHdvcmsuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwidHJ1ZVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG92ZXJzY3JvbGxFbmFibGVkKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX292ZXJzY3JvbGxFbmFibGVkVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG92ZXJzY3JvbGxFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24gPSB0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvblRyYW5zZm9ybSA9ICh2OiBib29sZWFuKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlQm9vbGVhbih2KTtcclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcImVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb25cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBib29sZWFuYC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXhwZXJpbWVudGFsIVxyXG4gICAqIEVuYWJsZXMgYnVmZmVyIG9wdGltaXphdGlvbi5cclxuICAgKiBDYW4gb25seSBiZSB1c2VkIGlmIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGFyZSBub3QgYWRkZWQgb3IgdXBkYXRlZC4gT3RoZXJ3aXNlLCBhcnRpZmFjdHMgaW4gdGhlIGZvcm0gb2YgdHdpdGNoaW5nIG9mIHRoZSBzY3JvbGwgYXJlYSBhcmUgcG9zc2libGUuXHJcbiAgICogV29ya3Mgb25seSBpZiB0aGUgcHJvcGVydHkgZHluYW1pYyA9IHRydWVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvblRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24oKSB7IHJldHVybiB0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRpdGVtUmVuZGVyZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRpdGVtUmVuZGVyZXIgPSB0aGlzLl8kaXRlbVJlbmRlcmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9pdGVtUmVuZGVyZXJUcmFuc2Zvcm0gPSAodjogVGVtcGxhdGVSZWY8YW55PikgPT4ge1xyXG4gICAgbGV0IHZhbGlkID0gdmFsaWRhdGVPYmplY3Qodik7XHJcbiAgICBpZiAodiAmJiAhKHR5cGVvZiB2LmVsZW1lbnRSZWYgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2LmNyZWF0ZUVtYmVkZGVkVmlldyA9PT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdUaGUgXCJpdGVtUmVuZGVyZXJcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBUZW1wbGF0ZVJlZmAuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBSZW5kZXJpbmcgZWxlbWVudCB0ZW1wbGF0ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtUmVuZGVyZXIodjogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgaWYgKHRoaXMuXyRpdGVtUmVuZGVyZXIuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2l0ZW1SZW5kZXJlclRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kaXRlbVJlbmRlcmVyLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgaXRlbVJlbmRlcmVyKCkgeyByZXR1cm4gdGhpcy5fJGl0ZW1SZW5kZXJlci5nZXRWYWx1ZSgpIGFzIFRlbXBsYXRlUmVmPGFueT47IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGl0ZW1Db25maWdNYXAgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXA+KHt9KTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGl0ZW1Db25maWdNYXAgPSB0aGlzLl8kaXRlbUNvbmZpZ01hcC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbUNvbmZpZ01hcFRyYW5zZm9ybSA9ICh2OiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwKSA9PiB7XHJcbiAgICBsZXQgdmFsaWQgPSB2YWxpZGF0ZU9iamVjdCh2KTtcclxuICAgIGlmICh2YWxpZCkge1xyXG4gICAgICBpZiAodikge1xyXG4gICAgICAgIGZvciAobGV0IGlkIGluIHYpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2W2lkXTtcclxuICAgICAgICAgIGlmICghaXRlbSB8fFxyXG4gICAgICAgICAgICAhdmFsaWRhdGVCb29sZWFuKGl0ZW0uY29sbGFwc2FibGUsIHRydWUpIHx8XHJcbiAgICAgICAgICAgICF2YWxpZGF0ZUJvb2xlYW4oaXRlbS5zZWxlY3RhYmxlLCB0cnVlKSB8fFxyXG4gICAgICAgICAgICAhKGl0ZW0uc3RpY2t5ID09PSB1bmRlZmluZWQgfHwgaXRlbS5zdGlja3kgPT09IDAgfHwgaXRlbS5zdGlja3kgPT09IDEgfHwgaXRlbS5zdGlja3kgPT09IDIpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIml0ZW1Db25maWdNYXBcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwYC4nKTtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyBgc3RpY2t5YCBwb3NpdGlvbiwgYGZ1bGxTaXplYCwgYGNvbGxhcHNhYmxlYCBhbmQgYHNlbGVjdGFibGVgIGZvciB0aGUgbGlzdCBpdGVtIGVsZW1lbnQuIElmIGBzdGlja3lgIHBvc2l0aW9uIGlzIGdyZWF0ZXIgdGhhbiBgMGAsIHRoZW4gYHN0aWNreWAgcG9zaXRpb24gaXMgYXBwbGllZC4gXHJcbiAgICogSWYgdGhlIGBzdGlja3lgIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBgMGAsIHRoZW4gdGhlIGBzdGlja3lgIHBvc2l0aW9uIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIGVsZW1lbnQuIGAxYCAtIHBvc2l0aW9uIHN0YXJ0LCBgMmAgLSBwb3NpdGlvbiBlbmQuXHJcbiAgICogIERlZmF1bHQgdmFsdWUgaXMgYDBgLlxyXG4gICAqIGBzZWxlY3RhYmxlYCBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gZWxlbWVudCBjYW4gYmUgc2VsZWN0ZWQgb3Igbm90LiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cclxuICAgKiBgY29sbGFwc2FibGVgIGRldGVybWluZXMgd2hldGhlciBhbiBlbGVtZW50IHdpdGggYSBgc3RpY2t5YCBwcm9wZXJ0eSBncmVhdGVyIHRoYW4gemVybyBjYW4gY29sbGFwc2UgYW5kXHJcbiAgICogIGNvbGxhcHNlIGVsZW1lbnRzIGluIGZyb250IHRoYXQgZG8gbm90IGhhdmUgYSBgc3RpY2t5YCBwcm9wZXJ0eS5cclxuICAgKiBgZnVsbFNpemVgIGRldGVybWluZXMgdGhlIHNpemUgb2YgYW4gZWxlbWVudCB3aGVuIHJlbmRlcmluZyBsaXN0cyB3aXRoIGNlbGwgZGl2aXNpb25zLiBJZiBzdGlja3kgaXMgMSBvciAyLCBmdWxsU2l6ZSBhdXRvbWF0aWNhbGx5IGJlY29tZXMgdHJ1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuXHJcbiAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTQueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9tb2RlbHMvaXRlbS1jb25maWctbWFwLm1vZGVsLnRzXHJcbiAgICogQGF1dGhvciBFdmdlbmlpIEFsZXhhbmRyb3ZpY2ggR3JlYmVubmlrb3ZcclxuICAgKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtQ29uZmlnTWFwKHY6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXApIHtcclxuICAgIGlmICh0aGlzLl8kaXRlbUNvbmZpZ01hcC5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5faXRlbUNvbmZpZ01hcFRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kaXRlbUNvbmZpZ01hcC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGl0ZW1Db25maWdNYXAoKSB7IHJldHVybiB0aGlzLl8kaXRlbUNvbmZpZ01hcC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRpdGVtU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0lURU1fU0laRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRpdGVtU2l6ZSA9IHRoaXMuXyRpdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbVNpemVUcmFuc2Zvcm0gPSAodjogYW55KSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodikgfHwgdiA9PT0gVklFV1BPUlQ7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIml0ZW1TaXplXCIgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIGBudW1iZXJgLCBgdmlld3BvcnRgIG9yIGB1bmRlZmluZWRgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9JVEVNX1NJWkU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBkaXJlY3Rpb24gPSAndmVydGljYWwnLCB0aGVuIHRoZSBoZWlnaHQgb2YgYSB0eXBpY2FsIGVsZW1lbnQuIElmIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywgdGhlbiB0aGUgd2lkdGggb2YgYSB0eXBpY2FsIGVsZW1lbnQuXHJcbiAgICogSWYgdGhlIGBkeW5hbWljU2l6ZWAgcHJvcGVydHkgaXMgdHJ1ZSwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0IGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcywgYW5kIHlvdSBtdXN0IHNwZWNpZnkgdGhlIGBpdGVtU2l6ZWAgcHJvcGVydHkgXHJcbiAgICogdG8gYWRqdXN0IHRoZSBzaXplcyBvZiB0aGUgaXRlbXMgaW4gdGhlIHVuYWxsb2NhdGVkIGFyZWEuXHJcbiAgICogSWYgdGhlIHZhbHVlIGlzICd2aWV3cG9ydCcsIHRoZSBzaXplcyBvZiBlbGVtZW50cyBhcmUgYXV0b21hdGljYWxseSByZXNpemVkIHRvIGZpdCB0aGUgdmlld3BvcnQgc2l6ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtU2l6ZSh2OiBudW1iZXIgfCAndmlld3BvcnQnKSB7XHJcbiAgICBpZiAodGhpcy5fJGl0ZW1TaXplLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9pdGVtU2l6ZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kaXRlbVNpemUubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBpdGVtU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRpdGVtU2l6ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRtaW5JdGVtU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0lURU1fU0laRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRtaW5JdGVtU2l6ZSA9IHRoaXMuXyRtaW5JdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbWluSXRlbVNpemVUcmFuc2Zvcm0gPSAodjogYW55KSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodikgfHwgdiA9PT0gVklFV1BPUlQ7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIm1pbkl0ZW1TaXplXCIgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIGBudW1iZXJgLCBgdmlld3BvcnRgIG9yIGB1bmRlZmluZWRgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9JVEVNX1NJWkU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgYGR5bmFtaWNTaXplYCBwcm9wZXJ0eSBpcyBlbmFibGVkLCB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBlbGVtZW50IGlzIHNldC5cclxuICAgKiBJZiB0aGUgdmFsdWUgaXMgJ3ZpZXdwb3J0JywgdGhlIHNpemVzIG9mIGVsZW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0IHRoZSB2aWV3cG9ydCBzaXplLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG1pbkl0ZW1TaXplKHY6IG51bWJlciB8ICd2aWV3cG9ydCcpIHtcclxuICAgIGlmICh0aGlzLl8kbWluSXRlbVNpemUuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX21pbkl0ZW1TaXplVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRtaW5JdGVtU2l6ZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG1pbkl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5fJG1pbkl0ZW1TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJG1heEl0ZW1TaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfTUFYX0lURU1fU0laRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRtYXhJdGVtU2l6ZSA9IHRoaXMuXyRtYXhJdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbWF4SXRlbVNpemVUcmFuc2Zvcm0gPSAodjogYW55KSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlRmxvYXQodikgfHwgdiA9PT0gVklFV1BPUlQ7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcIm1heEl0ZW1TaXplXCIgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIGBudW1iZXJgLCBgdmlld3BvcnRgIG9yIGB1bmRlZmluZWRgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9JVEVNX1NJWkU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgYGR5bmFtaWNTaXplYCBwcm9wZXJ0eSBpcyBlbmFibGVkLCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBlbGVtZW50IGlzIHNldC5cclxuICAgKiBJZiB0aGUgdmFsdWUgaXMgJ3ZpZXdwb3J0JywgdGhlIHNpemVzIG9mIGVsZW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0IHRoZSB2aWV3cG9ydCBzaXplLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG1heEl0ZW1TaXplKHY6IG51bWJlciB8ICd2aWV3cG9ydCcpIHtcclxuICAgIGlmICh0aGlzLl8kbWF4SXRlbVNpemUuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX21heEl0ZW1TaXplVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRtYXhJdGVtU2l6ZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IG1heEl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5fJG1heEl0ZW1TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGR5bmFtaWNTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX0RZTkFNSUNfU0laRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRkeW5hbWljU2l6ZSA9IHRoaXMuXyRkeW5hbWljU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfZHluYW1pY1NpemVUcmFuc2Zvcm0gPSAodjogYm9vbGVhbikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUJvb2xlYW4odik7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcImR5bmFtaWNTaXplXCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgYm9vbGVhbmAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0RZTkFNSUNfU0laRTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIGl0ZW1zIGluIHRoZSBsaXN0IG1heSBoYXZlIGRpZmZlcmVudCBzaXplcywgYW5kIHRoZSBpdGVtU2l6ZSBwcm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCB0byBhZGp1c3RcclxuICAgKiB0aGUgc2l6ZXMgb2YgaXRlbXMgaW4gdGhlIHVuYWxsb2NhdGVkIGFyZWEuXHJcbiAgICogSWYgZmFsc2UgdGhlbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgaGF2ZSBhIGZpeGVkIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBpdGVtU2l6ZSBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkeW5hbWljU2l6ZSh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJGR5bmFtaWNTaXplLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9keW5hbWljU2l6ZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kZHluYW1pY1NpemUubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBkeW5hbWljU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRkeW5hbWljU2l6ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRkaXJlY3Rpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERpcmVjdGlvbj4oREVGQVVMVF9ESVJFQ1RJT04pO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkZGlyZWN0aW9uID0gdGhpcy5fJGRpcmVjdGlvbi5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfZGlyZWN0aW9uVHJhbnNmb3JtID0gKHY6IERpcmVjdGlvbikgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZVN0cmluZyh2KSAmJiAodiA9PT0gJ2hvcml6b250YWwnIHx8IHYgPT09ICd2ZXJ0aWNhbCcpO1xyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJkaXJlY3Rpb25cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgYGhvcml6b250YWxgIG9yIGB2ZXJ0aWNhbGAuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0RJUkVDVElPTjtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCBlbGVtZW50cyBhcmUgcGxhY2VkLiBEZWZhdWx0IHZhbHVlIGlzIFwidmVydGljYWxcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXJlY3Rpb24odjogRGlyZWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5fJGRpcmVjdGlvbi5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fZGlyZWN0aW9uVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRkaXJlY3Rpb24ubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBkaXJlY3Rpb24oKSB7IHJldHVybiB0aGlzLl8kZGlyZWN0aW9uLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGNvbGxlY3Rpb25Nb2RlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb2xsZWN0aW9uTW9kZT4oREVGQVVMVF9DT0xMRUNUSU9OX01PREUpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkY29sbGVjdGlvbk1vZGUgPSB0aGlzLl8kY29sbGVjdGlvbk1vZGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2NvbGxlY3Rpb25Nb2RlVHJhbnNmb3JtID0gKHY6IENvbGxlY3Rpb25Nb2RlKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKHYpICYmICh2ID09PSAnbm9ybWFsJyB8fCB2ID09PSAnbGF6eScpO1xyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJkaXJlY3Rpb25cIiBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgYG5vcm1hbGAgb3IgYGxhenlgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9DT0xMRUNUSU9OX01PREU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBhY3Rpb24gbW9kZXMgZm9yIGNvbGxlY3Rpb24gZWxlbWVudHMuIERlZmF1bHQgdmFsdWUgaXMgXCJub3JtYWxcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBjb2xsZWN0aW9uTW9kZSh2OiBDb2xsZWN0aW9uTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuXyRjb2xsZWN0aW9uTW9kZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fY29sbGVjdGlvbk1vZGVUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJGNvbGxlY3Rpb25Nb2RlLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgY29sbGVjdGlvbk1vZGUoKSB7IHJldHVybiB0aGlzLl8kY29sbGVjdGlvbk1vZGUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kYnVmZmVyU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0JVRkZFUl9TSVpFKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGJ1ZmZlclNpemUgPSB0aGlzLl8kYnVmZmVyU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfYnVmZmVyU2l6ZVRyYW5zZm9ybSA9ICh2OiBudW1iZXIpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVJbnQodik7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcImJ1ZmZlclNpemVcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBudW1iZXJgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9CVUZGRVJfU0laRTtcclxuICAgIH1cclxuICAgIHJldHVybiB2O1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIE51bWJlciBvZiBlbGVtZW50cyBvdXRzaWRlIHRoZSBzY29wZSBvZiB2aXNpYmlsaXR5LiBEZWZhdWx0IHZhbHVlIGlzIDIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgYnVmZmVyU2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kYnVmZmVyU2l6ZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fYnVmZmVyU2l6ZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kYnVmZmVyU2l6ZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGJ1ZmZlclNpemUoKSB7IHJldHVybiB0aGlzLl8kYnVmZmVyU2l6ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRtYXhCdWZmZXJTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfTUFYX0JVRkZFUl9TSVpFKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJG1heEJ1ZmZlclNpemUgPSB0aGlzLl8kbWF4QnVmZmVyU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfbWF4QnVmZmVyU2l6ZVRyYW5zZm9ybSA9ICh2OiBudW1iZXIpID0+IHtcclxuICAgIGxldCB2YWwgPSB2O1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZUludCh2LCB0cnVlKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlIFwibWF4QnVmZmVyU2l6ZVwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYG51bWJlcmAuJyk7XHJcbiAgICAgIHZhbCA9IERFRkFVTFRfTUFYX0JVRkZFUl9TSVpFO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJ1ZmZlclNpemUgPSB0aGlzLmJ1ZmZlclNpemU7XHJcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsIDw9IGJ1ZmZlclNpemUpIHtcclxuICAgICAgcmV0dXJuIGJ1ZmZlclNpemU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHZpc2liaWxpdHkuIERlZmF1bHQgdmFsdWUgaXMgMTAwLlxyXG4gICAqIElmIG1heEJ1ZmZlclNpemUgaXMgc2V0IHRvIGJlIGdyZWF0ZXIgdGhhbiBidWZmZXJTaXplLCB0aGVuIGFkYXB0aXZlIGJ1ZmZlciBtb2RlIGlzIGVuYWJsZWQuXHJcbiAgICogVGhlIGdyZWF0ZXIgdGhlIHNjcm9sbCBzaXplLCB0aGUgbW9yZSBlbGVtZW50cyBhcmUgYWxsb2NhdGVkIGZvciByZW5kZXJpbmcuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgbWF4QnVmZmVyU2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHZhbCA9IHRoaXMuX21heEJ1ZmZlclNpemVUcmFuc2Zvcm0odik7XHJcbiAgICBpZiAodGhpcy5fJG1heEJ1ZmZlclNpemUuZ2V0VmFsdWUoKSA9PT0gdmFsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kbWF4QnVmZmVyU2l6ZS5uZXh0KHZhbCk7XHJcbiAgfTtcclxuICBnZXQgbWF4QnVmZmVyU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRtYXhCdWZmZXJTaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNuYXBwaW5nTWV0aG9kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTbmFwcGluZ01ldGhvZD4oREVGQVVMVF9TTkFQUElOR19NRVRIT0QpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc25hcHBpbmdNZXRob2QgPSB0aGlzLl8kc25hcHBpbmdNZXRob2QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3NuYXBwaW5nTWV0aG9kVHJhbnNmb3JtID0gKHY6IFNuYXBwaW5nTWV0aG9kKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKHYpICYmICh2ID09PSBTbmFwcGluZ01ldGhvZHMuQURWQU5DRUQgfHwgdiA9PT0gU25hcHBpbmdNZXRob2RzLlNUQU5EQVJUKTtcclxuICAgIGlmICghdmFsaWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgVGhlIFwic25hcHBpbmdNZXRob2RcIiBwYXJhbWV0ZXIgbXVzdCBoYXZlIHRoZSB2YWx1ZSAnJHtTbmFwcGluZ01ldGhvZHMuQURWQU5DRUR9JyBvciAnJHtTbmFwcGluZ01ldGhvZHMuU1RBTkRBUlR9Jy5gKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfU05BUFBJTkdfTUVUSE9EO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogU25hcHBpbmcgbWV0aG9kLiBEZWZhdWx0IHZhbHVlIGlzICdzdGFuZGFydCcuXHJcbiAgICogJ3N0YW5kYXJ0JyAtIENsYXNzaWMgZ3JvdXAgdmlzdWFsaXphdGlvbi5cclxuICAgKiAnYWR2YW5jZWQnIC0gQSBtYXNrIGlzIGFwcGxpZWQgdG8gdGhlIHZpZXdwb3J0IGFyZWEgc28gdGhhdCB0aGUgYmFja2dyb3VuZCBpcyBkaXNwbGF5ZWQgdW5kZXJuZWF0aCB0aGUgYXR0YWNoZWQgZ3JvdXAuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcHBpbmdNZXRob2QodjogU25hcHBpbmdNZXRob2QpIHtcclxuICAgIGlmICh0aGlzLl8kc25hcHBpbmdNZXRob2QuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX3NuYXBwaW5nTWV0aG9kVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzbmFwcGluZ01ldGhvZC5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHNuYXBwaW5nTWV0aG9kKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBwaW5nTWV0aG9kLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGNvbGxhcHNpbmdNb2RlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDb2xsYXBzaW5nTW9kZT4oREVGQVVMVF9DT0xMQVBTSU5HX01PREVTKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGNvbGxhcHNpbmdNb2RlID0gdGhpcy5fJGNvbGxhcHNpbmdNb2RlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jb2xsYXBzaW5nTW9kZVRyYW5zZm9ybSA9ICh2OiBDb2xsYXBzaW5nTW9kZSkgPT4ge1xyXG4gICAgY29uc3QgdmFsaWQgPSB2YWxpZGF0ZVN0cmluZyh2KSAmJiAodiA9PT0gQ29sbGFwc2luZ01vZGVzLk5PTkUgfHwgdiA9PT0gQ29sbGFwc2luZ01vZGVzLk1VTFRJX0NPTExBUFNFIHx8IHYgPT09IENvbGxhcHNpbmdNb2Rlcy5BQ0NPUkRJT04pO1xyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBUaGUgXCJjb2xsYXBzaW5nTW9kZVwiIHBhcmFtZXRlciBtdXN0IGhhdmUgdGhlIHZhbHVlICcke1NuYXBwaW5nTWV0aG9kcy5BRFZBTkNFRH0nIG9yICcke1NuYXBwaW5nTWV0aG9kcy5TVEFOREFSVH0nLmApO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9DT0xMQVBTSU5HX01PREVTO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogTW9kZSBmb3IgY29sbGFwc2luZyBsaXN0IGl0ZW1zLiBcclxuICAgKiBgbm9uZWAgLSBMaXN0IGl0ZW1zIGFyZSBub3Qgc2VsZWN0YWJsZS5cclxuICAgKiBgbXVsdGktY29sbGFwc2VgIC0gTGlzdCBpdGVtcyBhcmUgY29sbGFwc2VkIG9uZSBieSBvbmUuXHJcbiAgICogJ2FjY29yZGlvbicgLSBBY2NvcmRpb24gY29sbGFwc2libGUgbGlzdCBpdGVtcy5cclxuICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBtdWx0aS1jb2xsYXBzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNvbGxhcHNpbmdNb2RlKHY6IENvbGxhcHNpbmdNb2RlKSB7XHJcbiAgICBpZiAodGhpcy5fJGNvbGxhcHNpbmdNb2RlLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9jb2xsYXBzaW5nTW9kZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kY29sbGFwc2luZ01vZGUubmV4dCh0cmFuc2Zvcm1lZFZhbHVlKTtcclxuICB9O1xyXG4gIGdldCBjb2xsYXBzaW5nTW9kZSgpIHsgcmV0dXJuIHRoaXMuXyRjb2xsYXBzaW5nTW9kZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICogVGhlIFwibWV0aG9kRm9yU2VsZWN0aW5nXCIgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBcInNlbGVjdE1vZGVcIiBwcm9wZXJ0eS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBtZXRob2RGb3JTZWxlY3RpbmcodjogYW55KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm1ldGhvZEZvclNlbGVjdGluZ1wiIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgXCJzZWxlY3RNb2RlXCIgcHJvcGVydHkgaW5zdGVhZC4nKTtcclxuICB9O1xyXG5cclxuICBwcml2YXRlIF8kc2VsZWN0aW5nTW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW5nTW9kZT4oREVGQVVMVF9TRUxFQ1RJTkdfTU9ERVMpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2VsZWN0aW5nTW9kZSA9IHRoaXMuXyRzZWxlY3RpbmdNb2RlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RpbmdNb2RlVHJhbnNmb3JtID0gKHY6IFNlbGVjdGluZ01vZGUpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVTdHJpbmcodikgJiYgKHYgPT09ICdub25lJyB8fCB2ID09PSAnc2VsZWN0JyB8fCB2ID09PSAnbXVsdGktc2VsZWN0Jyk7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNlbGVjdGluZ01vZGVcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvbmUgb2YgYG5vbmVgLCBgc2VsZWN0YCBvciBgbXVsdGktc2VsZWN0YC4nKTtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfU0VMRUNUSU5HX01PREVTO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogIE1ldGhvZCBmb3Igc2VsZWN0aW5nIGxpc3QgaXRlbXMuIERlZmF1bHQgdmFsdWUgaXMgJ25vbmUnLlxyXG4gICAqICdzZWxlY3QnIC0gTGlzdCBpdGVtcyBhcmUgc2VsZWN0ZWQgb25lIGJ5IG9uZS5cclxuICAgKiAnbXVsdGktc2VsZWN0JyAtIE11bHRpcGxlIHNlbGVjdGlvbiBvZiBsaXN0IGl0ZW1zLlxyXG4gICAqICdub25lJyAtIExpc3QgaXRlbXMgYXJlIG5vdCBzZWxlY3RhYmxlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNlbGVjdGluZ01vZGUodjogU2VsZWN0aW5nTW9kZSkge1xyXG4gICAgaWYgKHRoaXMuXyRzZWxlY3RpbmdNb2RlLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9zZWxlY3RpbmdNb2RlVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRzZWxlY3RpbmdNb2RlLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcbiAgfTtcclxuICBnZXQgc2VsZWN0aW5nTW9kZSgpIHsgcmV0dXJuIHRoaXMuXyRzZWxlY3RpbmdNb2RlLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHRyYWNrQnkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oVFJBQ0tfQllfUFJPUEVSVFlfTkFNRSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICR0cmFja0J5ID0gdGhpcy5fJHRyYWNrQnkuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3RyYWNrQnlUcmFuc2Zvcm0gPSAodjogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKHYpO1xyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJ0cmFja0J5XCIgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBgc3RyaW5nYC4nKTtcclxuICAgICAgcmV0dXJuIFRSQUNLX0JZX1BST1BFUlRZX05BTUU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYnkgd2hpY2ggdHJhY2tpbmcgaXMgcGVyZm9ybWVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdHJhY2tCeSh2OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLl8kdHJhY2tCeS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fdHJhY2tCeVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kdHJhY2tCeS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IHRyYWNrQnkoKSB7IHJldHVybiB0aGlzLl8kdHJhY2tCeS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRzY3JlZW5SZWFkZXJNZXNzYWdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KERFRkFVTFRfU0NSRUVOX1JFQURFUl9NRVNTQUdFKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHNjcmVlblJlYWRlck1lc3NhZ2UgPSB0aGlzLl8kc2NyZWVuUmVhZGVyTWVzc2FnZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2NyZWVuUmVhZGVyTWVzc2FnZVRyYW5zZm9ybSA9ICh2OiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVTdHJpbmcodik7XHJcbiAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBcInNjcmVlblJlYWRlck1lc3NhZ2VcIiBwYXJhbWV0ZXIgbXVzdCBiZSBvZiB0eXBlIGBzdHJpbmdgLicpO1xyXG4gICAgICByZXR1cm4gREVGQVVMVF9TQ1JFRU5fUkVBREVSX01FU1NBR0U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBNZXNzYWdlIGZvciBzY3JlZW4gcmVhZGVyLlxyXG4gICAqIFRoZSBtZXNzYWdlIGZvcm1hdCBpczogXCJzb21lIHRleHQgJDEgc29tZSB0ZXh0ICQyXCIsXHJcbiAgICogd2hlcmUgJDEgaXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2NyZWVuIGNvbGxlY3Rpb24sXHJcbiAgICogJDIgaXMgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBzY3JlZW4gY29sbGVjdGlvbi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBzZXQgc2NyZWVuUmVhZGVyTWVzc2FnZSh2OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLl8kc2NyZWVuUmVhZGVyTWVzc2FnZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fc2NyZWVuUmVhZGVyTWVzc2FnZVRyYW5zZm9ybSh2KTtcclxuXHJcbiAgICB0aGlzLl8kc2NyZWVuUmVhZGVyTWVzc2FnZS5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgcHJvdGVjdGVkIGdldCBzY3JlZW5SZWFkZXJNZXNzYWdlKCkgeyByZXR1cm4gdGhpcy5fJHNjcmVlblJlYWRlck1lc3NhZ2UuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc2NyZWVuUmVhZGVyRm9ybWF0dGVkTWVzc2FnZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihERUZBVUxUX1NDUkVFTl9SRUFERVJfTUVTU0FHRSk7XHJcbiAgcHJvdGVjdGVkICRzY3JlZW5SZWFkZXJGb3JtYXR0ZWRNZXNzYWdlID0gdGhpcy5fJHNjcmVlblJlYWRlckZvcm1hdHRlZE1lc3NhZ2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRsYW5nVGV4dERpciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGV4dERpcmVjdGlvbj4oREVGQVVMVF9MQU5HX1RFWFRfRElSKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGxhbmdUZXh0RGlyID0gdGhpcy5fJGxhbmdUZXh0RGlyLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9sYW5nVGV4dERpclRyYW5zZm9ybSA9ICh2OiBUZXh0RGlyZWN0aW9uKSA9PiB7XHJcbiAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlU3RyaW5nKHYpO1xyXG4gICAgaWYgKCF2YWxpZCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgXCJsYW5nVGV4dERpclwiIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgYHN0cmluZ2AuJyk7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0xBTkdfVEVYVF9ESVI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24gb2YgdGV4dCBmb3IgdGhlIGxvY2FsZS5cclxuICAgKiBDYW4gYmUgZWl0aGVyIFwibHRyXCIgKGxlZnQtdG8tcmlnaHQpIG9yIFwicnRsXCIgKHJpZ2h0LXRvLWxlZnQpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGxhbmdUZXh0RGlyKHY6IFRleHREaXJlY3Rpb24pIHtcclxuICAgIGlmICh0aGlzLl8kbGFuZ1RleHREaXIuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2xhbmdUZXh0RGlyVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRsYW5nVGV4dERpci5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG4gIH07XHJcbiAgZ2V0IGxhbmdUZXh0RGlyKCkgeyByZXR1cm4gdGhpcy5fJGxhbmdUZXh0RGlyLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNTaW5nbGVTZWxlY3Rpb24gPSB0aGlzLmdldElzU2luZ2xlU2VsZWN0aW9uKCk7XHJcblxyXG4gIHByaXZhdGUgX2lzTXVsdGlTZWxlY3Rpb24gPSB0aGlzLmdldElzTXVsdGlTZWxlY3Rpb24oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNNdWx0aXBsZUNvbGxhcHNlID0gdGhpcy5nZXRJc011bHRpcGxlQ29sbGFwc2UoKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNBY2NvcmRpb25Db2xsYXBzZSA9IHRoaXMuZ2V0SXNBY2NvcmRpb25Db2xsYXBzZSgpO1xyXG5cclxuICBwcml2YXRlIF9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQ6IGJvb2xlYW4gPSB0aGlzLmdldElzU25hcHBpbmdNZXRob2RBZHZhbmNlZCgpO1xyXG5cclxuICBwcm90ZWN0ZWQgXyRpc0luZmluaXR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHJvdGVjdGVkICRpc0luZmluaXR5ID0gdGhpcy5fJGlzSW5maW5pdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJvdGVjdGVkIGdldCBpc0luZmluaXR5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuXyRpc0luZmluaXR5LmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZlcnRpY2FsID0gdGhpcy5nZXRJc1ZlcnRpY2FsKCk7XHJcbiAgcHJvdGVjdGVkIGdldCBpc1ZlcnRpY2FsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzVmVydGljYWw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF8kaXNWZXJ0aWNhbCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5pc1ZlcnRpY2FsKTtcclxuICBwcm90ZWN0ZWQgJGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGZvY3VzZWRFbGVtZW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJZCB8IG51bGw+KG51bGwpO1xyXG4gIHByb3RlY3RlZCAkZm9jdXNlZEVsZW1lbnQgPSB0aGlzLl8kZm9jdXNlZEVsZW1lbnQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRjbGFzc2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IFtjTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9Pih7fSk7XHJcbiAgcHJvdGVjdGVkICRjbGFzc2VzID0gdGhpcy5fJGNsYXNzZXMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRwcmVyZW5kZXJFbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHJvdGVjdGVkICRwcmVyZW5kZXJFbmFibGVkID0gdGhpcy5fJHByZXJlbmRlckVuYWJsZWQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRhY3R1YWxJdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVZpcnR1YWxMaXN0Q29sbGVjdGlvbj4oW10pO1xyXG5cclxuICBwcml2YXRlIF8kY29sbGFwc2VkSXRlbUlkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8SWQ+PihbXSk7XHJcblxyXG4gIHByaXZhdGUgX2Rpc3BsYXlDb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8QmFzZVZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudD4+ID0gW107XHJcblxyXG4gIHByaXZhdGUgX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+PiA9IFtdO1xyXG5cclxuICBwcml2YXRlIF8kYm91bmRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJU2l6ZSB8IG51bGw+KG51bGwpO1xyXG4gIHByb3RlY3RlZCAkYm91bmRzOiBPYnNlcnZhYmxlPElTaXplIHwgbnVsbD4gPSB0aGlzLl8kYm91bmRzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kYWN0dWFsU2Nyb2xsYmFyRW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5zY3JvbGxiYXJFbmFibGVkKTtcclxuICBwcm90ZWN0ZWQgJGFjdHVhbFNjcm9sbGJhckVuYWJsZWQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl8kYWN0dWFsU2Nyb2xsYmFyRW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbEFsaWdubWVudCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWxpZ25tZW50Pih0aGlzLmFsaWdubWVudCk7XHJcbiAgcHJvdGVjdGVkICRhY3R1YWxBbGlnbm1lbnQ6IE9ic2VydmFibGU8QWxpZ25tZW50PiA9IHRoaXMuXyRhY3R1YWxBbGlnbm1lbnQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJvdGVjdGVkIGdldCBhY3R1YWxBbGlnbm1lbnQoKSB7IHJldHVybiB0aGlzLl8kYWN0dWFsQWxpZ25tZW50LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbEl0ZW1TaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCAkYWN0dWFsSXRlbVNpemU6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMuXyRhY3R1YWxJdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuICBwcm90ZWN0ZWQgZ2V0IGFjdHVhbEl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5fJGFjdHVhbEl0ZW1TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbE1pbkl0ZW1TaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCAkYWN0dWFsTWluSXRlbVNpemU6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMuXyRhY3R1YWxNaW5JdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuICBwcm90ZWN0ZWQgZ2V0IGFjdHVhbE1pbkl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5fJGFjdHVhbE1pbkl0ZW1TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbE1heEl0ZW1TaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCAkYWN0dWFsTWF4SXRlbVNpemU6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMuXyRhY3R1YWxNYXhJdGVtU2l6ZS5hc09ic2VydmFibGUoKTtcclxuICBwcm90ZWN0ZWQgZ2V0IGFjdHVhbE1heEl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5fJGFjdHVhbE1heEl0ZW1TaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHRvdGFsU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGxpc3RCb3VuZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElTaXplIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkc2Nyb2xsU2l6ZSA9IHRoaXMuXyRzY3JvbGxTaXplLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kaXNTY3JvbGxTdGFydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcblxyXG4gIHByaXZhdGUgXyRpc1Njcm9sbEVuZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIF8kcHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG5cclxuICBwcml2YXRlIF8kcHJlY2FsY3VsYXRlZFNjcm9sbEVuZE9mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGFjdHVhbFNjcm9sbFN0YXJ0T2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCAkYWN0dWFsU2Nyb2xsU3RhcnRPZmZzZXQgPSB0aGlzLl8kYWN0dWFsU2Nyb2xsU3RhcnRPZmZzZXQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRhY3R1YWxTY3JvbGxFbmRPZmZzZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgcHJvdGVjdGVkICRhY3R1YWxTY3JvbGxFbmRPZmZzZXQgPSB0aGlzLl8kYWN0dWFsU2Nyb2xsRW5kT2Zmc2V0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kc3RhcnRPZmZzZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgcHJvdGVjdGVkICRzdGFydE9mZnNldCA9IHRoaXMuXyRzdGFydE9mZnNldC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGVuZE9mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICBwcm90ZWN0ZWQgJGVuZE9mZnNldCA9IHRoaXMuXyRlbmRPZmZzZXQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRhY3R1YWxTbmFwU2Nyb2xsVG9TdGFydCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIF8kYWN0dWFsU25hcFNjcm9sbFRvRW5kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHByaXZhdGUgXyRhbGlnbm1lbnRTY3JvbGxTdGFydE9mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICBwcm90ZWN0ZWQgJGFsaWdubWVudFNjcm9sbFN0YXJ0T2Zmc2V0ID0gdGhpcy5fJGFsaWdubWVudFNjcm9sbFN0YXJ0T2Zmc2V0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kYWxpZ25tZW50U2Nyb2xsRW5kT2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG4gIHByb3RlY3RlZCAkYWxpZ25tZW50U2Nyb2xsRW5kT2Zmc2V0ID0gdGhpcy5fJGFsaWdubWVudFNjcm9sbEVuZE9mZnNldC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplU25hcHBlZENvbXBvbmVudEhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5fJGxpc3QuZ2V0VmFsdWUoKSwgc2Nyb2xsZXIgPSB0aGlzLl8kc2Nyb2xsZXIuZ2V0VmFsdWUoKSwgYm91bmRzID0gdGhpcy5fJGJvdW5kcy5nZXRWYWx1ZSgpLCBzbmFwcGVkQ29tcG9uZW50cyA9IHRoaXMuX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50cztcclxuICAgIGlmICghIWxpc3QgJiYgISFzY3JvbGxlciAmJiBzbmFwcGVkQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl9pc1ZlcnRpY2FsLCBsaXN0Qm91bmRzID0gbGlzdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBjb21wIG9mIHNuYXBwZWRDb21wb25lbnRzKSB7XHJcbiAgICAgICAgaWYgKCEhY29tcCkge1xyXG4gICAgICAgICAgY29tcC5pbnN0YW5jZS5yZWd1bGFyTGVuZ3RoID0gYCR7aXNWZXJ0aWNhbCA/IGxpc3RCb3VuZHMud2lkdGggOiBsaXN0Qm91bmRzLmhlaWdodH0ke1BYfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzbmFwcGluZ01ldGhvZCA9IHRoaXMuc25hcHBpbmdNZXRob2Q7XHJcbiAgICAgIGlmIChzbmFwcGluZ01ldGhvZCA9PT0gU25hcHBpbmdNZXRob2RzLkFEVkFOQ0VEKSB7XHJcbiAgICAgICAgY29uc3Qgc25hcHBlZENvbXBvbmVudCA9IHNuYXBwZWRDb21wb25lbnRzPy5bMF0/Lmluc3RhbmNlO1xyXG4gICAgICAgIGlmICghIXNuYXBwZWRDb21wb25lbnQpIHtcclxuICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYm91bmRzID8/IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9LCBsYW5nVGV4dERpciA9IHRoaXMubGFuZ1RleHREaXI7XHJcblxyXG4gICAgICAgICAgc25hcHBlZENvbXBvbmVudC5lbGVtZW50LnN0eWxlLmNsaXBQYXRoID0gYHBhdGgoXCJNIDAgMCBMIDAgJHtzbmFwcGVkQ29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0fSBMICR7c25hcHBlZENvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRofSAke3NuYXBwZWRDb21wb25lbnQuZWxlbWVudC5vZmZzZXRIZWlnaHR9IEwgJHtzbmFwcGVkQ29tcG9uZW50LmVsZW1lbnQub2Zmc2V0V2lkdGh9IDAgWlwiKWA7XHJcblxyXG4gICAgICAgICAgY29uc3QgeyB3aWR0aDogc1dpZHRoLCBoZWlnaHQ6IHNIZWlnaHQgfSA9IHNuYXBwZWRDb21wb25lbnQuZ2V0Qm91bmRzKCkgPz8geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXHJcbiAgICAgICAgICAgIHNjcm9sbGVyRWxlbWVudCA9IHNjcm9sbGVyLm5hdGl2ZUVsZW1lbnQsIGRlbHRhID0gc25hcHBlZENvbXBvbmVudC5pdGVtPy5tZWFzdXJlcy5kZWx0YSA/PyAwLFxyXG4gICAgICAgICAgICBzY3JvbGxCYXJTaXplID0gdGhpcy5zY3JvbGxiYXJUaGlja25lc3M7XHJcblxyXG4gICAgICAgICAgbGV0IHJpZ2h0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlcjtcclxuICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0ID0gd2lkdGggLSBzY3JvbGxCYXJTaXplICsgMjtcclxuICAgICAgICAgICAgdG9wID0gc0hlaWdodDtcclxuICAgICAgICAgICAgYm90dG9tID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICBpZiAobGFuZ1RleHREaXIgPT09IFRleHREaXJlY3Rpb25zLlJUTCkge1xyXG4gICAgICAgICAgICAgIHNjcm9sbGVyRWxlbWVudC5zdHlsZS5jbGlwUGF0aCA9IGBwYXRoKFwiTSAwIDAgTCAwICR7aGVpZ2h0fSBMICR7d2lkdGh9ICR7aGVpZ2h0fSBMICR7d2lkdGh9ICR7dG9wICsgZGVsdGF9IEwgJHtzY3JvbGxCYXJTaXplfSAke3RvcCArIGRlbHRhfSBMICR7c2Nyb2xsQmFyU2l6ZX0gMCBaXCIpYDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBzY3JvbGxlckVsZW1lbnQuc3R5bGUuY2xpcFBhdGggPSBgcGF0aChcIk0gMCAke3RvcCArIGRlbHRhfSBMIDAgJHtoZWlnaHR9IEwgJHt3aWR0aH0gJHtoZWlnaHR9IEwgJHt3aWR0aH0gMCBMICR7cmlnaHR9IDAgTCAke3JpZ2h0fSAke3RvcCArIGRlbHRhfSBaXCIpYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmlnaHQgPSB3aWR0aDtcclxuICAgICAgICAgICAgdG9wID0gMDtcclxuICAgICAgICAgICAgYm90dG9tID0gaGVpZ2h0IC0gc2Nyb2xsQmFyU2l6ZTtcclxuICAgICAgICAgICAgc2Nyb2xsZXJFbGVtZW50LnN0eWxlLmNsaXBQYXRoID0gYHBhdGgoXCJNICR7d2lkdGh9IDAgTCAke3dpZHRofSAke2JvdHRvbX0gTCAwICR7Ym90dG9tfSBMIDAgMCBMICR7d2lkdGh9IDAgWlwiKWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplU25hcHBlZE9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGZvY3VzSXRlbSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IG51bWJlciwgYWxpZ246IEZvY3VzQWxpZ25tZW50ID0gRm9jdXNBbGlnbm1lbnRzLkNFTlRFUixcclxuICAgIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IEJFSEFWSU9SX0FVVE8pID0+IHtcclxuICAgIGlmICghdGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNjcm9sbGVyID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICBpZiAoISFzY3JvbGxlcikge1xyXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuXyRib3VuZHMuZ2V0VmFsdWUoKSEsIHsgd2lkdGg6IGVsZW1lbnRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50SGVpZ2h0IH0gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxyXG4gICAgICAgIGlzVmVydGljYWwgPSB0aGlzLl9pc1ZlcnRpY2FsLFxyXG4gICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCxcclxuICAgICAgICBlbGVtZW50U2l6ZSA9IGlzVmVydGljYWwgPyBlbGVtZW50SGVpZ2h0IDogZWxlbWVudFdpZHRoO1xyXG4gICAgICBsZXQgcG9zOiBudW1iZXIgPSBOdW1iZXIuTmFOO1xyXG4gICAgICBzd2l0Y2ggKGFsaWduKSB7XHJcbiAgICAgICAgY2FzZSBGb2N1c0FsaWdubWVudHMuU1RBUlQ6IHtcclxuICAgICAgICAgIHBvcyA9IHBvc2l0aW9uICsgc2Nyb2xsZXIuc3RhcnRMYXlvdXRPZmZzZXQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBGb2N1c0FsaWdubWVudHMuQ0VOVEVSOiB7XHJcbiAgICAgICAgICBwb3MgPSBwb3NpdGlvbiAtICh2aWV3cG9ydFNpemUgLSBlbGVtZW50U2l6ZSkgKiAuNSArIHNjcm9sbGVyLnN0YXJ0TGF5b3V0T2Zmc2V0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgRm9jdXNBbGlnbm1lbnRzLkVORDoge1xyXG4gICAgICAgICAgcG9zID0gcG9zaXRpb24gLSAodmlld3BvcnRTaXplIC0gZWxlbWVudFNpemUpICsgc2Nyb2xsZXIuc3RhcnRMYXlvdXRPZmZzZXQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBGb2N1c0FsaWdubWVudHMuTk9ORTpcclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocG9zKSkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LnByZXZlbnRTY3JvbGxTbmFwcGluZyh0cnVlKTtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IElTY3JvbGxUb1BhcmFtcyA9IHtcclxuICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogcG9zLCBiZWhhdmlvciwgc25hcDogZmFsc2UsIG5vcm1hbGl6ZTogdHJ1ZSxcclxuICAgICAgICAgIGZpcmVVcGRhdGU6IGZhbHNlLCBibGVuZGluZzogZmFsc2UsIHVzZXJBY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgZHVyYXRpb246IHRoaXMuc25hcFRvSXRlbSA/IE1hdGgubWF4KHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNjcm9sbFRvSXRlbSwgdGhpcy5hbmltYXRpb25QYXJhbXMubmF2aWdhdGVUb0l0ZW0pIDogdGhpcy5hbmltYXRpb25QYXJhbXMubmF2aWdhdGVUb0l0ZW0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzY3JvbGxlci5zY3JvbGxUbyhwYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyBvZiB0aGUgZWxlbWVudCBjb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9pdGVtQ29tcG9uZW50Q2xhc3M6IENvbXBvbmVudCQxPEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+ID0gTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ7XHJcbiAgcHJvdGVjdGVkIGdldCBpdGVtQ29tcG9uZW50Q2xhc3MoKSB7IHJldHVybiB0aGlzLl9pdGVtQ29tcG9uZW50Q2xhc3M7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFzZSBjbGFzcyB0cmFja0JveFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RyYWNrQm94Q2xhc3M6IENvbXBvbmVudCQxPFRyYWNrQm94PiA9IFRyYWNrQm94O1xyXG5cclxuICAvKipcclxuICAgKiBEaWN0aW9uYXJ5IG9mIGVsZW1lbnQgc2l6ZXMgYnkgdGhlaXIgaWRcclxuICAgKi9cclxuICBwcml2YXRlIF90cmFja0JveDogVHJhY2tCb3ggPSBuZXcgdGhpcy5fdHJhY2tCb3hDbGFzcyh0aGlzLnRyYWNrQnkpO1xyXG5cclxuICBwcml2YXRlIF8kdXBkYXRlID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkdXBkYXRlID0gdGhpcy5fJHVwZGF0ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJHNjcm9sbFRvID0gbmV3IFN1YmplY3Q8SVNjcm9sbFBhcmFtcz4oKTtcclxuICBwcm90ZWN0ZWQgJHNjcm9sbFRvID0gdGhpcy5fJHNjcm9sbFRvLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsVG9FeGVjdXRvciA9IG5ldyBTdWJqZWN0PElTY3JvbGxQYXJhbXM+KCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRzY3JvbGxUb0V4ZWN1dG9yID0gdGhpcy5fJHNjcm9sbFRvRXhlY3V0b3IuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRzY3JvbGxpbmdUbyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIF8kc2Nyb2xsID0gbmV3IFN1YmplY3Q8SVNjcm9sbEV2ZW50PigpO1xyXG4gIHJlYWRvbmx5ICRzY3JvbGwgPSB0aGlzLl8kc2Nyb2xsLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kdGljayA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcmVhZG9ubHkgJHRpY2sgPSB0aGlzLl8kdGljay5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfJGZpcmVVcGRhdGUgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSAkZmlyZVVwZGF0ZSA9IHRoaXMuXyRmaXJlVXBkYXRlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kZmlyZVVwZGF0ZU5leHRGcmFtZSA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5ICRmaXJlVXBkYXRlTmV4dEZyYW1lID0gdGhpcy5fJGZpcmVVcGRhdGVOZXh0RnJhbWUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgXyRwcmV2ZW50U2Nyb2xsU25hcHBpbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgJHByZXZlbnRTY3JvbGxTbmFwcGluZyA9IHRoaXMuXyRwcmV2ZW50U2Nyb2xsU25hcHBpbmcuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByaXZhdGUgX3JlYWR5Rm9yU2hvdyA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9jYWNoZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIHByb3RlY3RlZCBnZXQgY2FjaGFibGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlcmVuZGVyPy5hY3RpdmUgPz8gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IHByZXJlbmRlcmFibGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5keW5hbWljU2l6ZSAmJiAodGhpcy5fdHJhY2tCb3g/LmlzU25hcHBlZFRvRW5kID8/IGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgXyR2aWV3SW5pdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgJHZpZXdJbml0ID0gdGhpcy5fJHZpZXdJbml0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF8kZGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSAkZGVzdHJveSA9IHRoaXMuXyRkZXN0cm95LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkID0gTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZCArIDEgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICAgID8gMCA6IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQgKyAxO1xyXG4gICAgdGhpcy5faWQgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLl9pZCwgdGhpcy5fdHJhY2tCb3gpO1xyXG5cclxuICAgIGNvbnN0ICRkeW5hbWljU2l6ZSA9IHRoaXMuJGR5bmFtaWNTaXplLFxyXG4gICAgICAkc25hcFNjcm9sbFRvRW5kID0gdGhpcy4kc25hcFNjcm9sbFRvRW5kO1xyXG4gICAgY29tYmluZUxhdGVzdChbJGR5bmFtaWNTaXplLCAkc25hcFNjcm9sbFRvRW5kXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCgoW2R5bmFtaWNTaXplLCBzbmFwU2Nyb2xsVG9FbmRdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fJHByZXJlbmRlckVuYWJsZWQubmV4dChkeW5hbWljU2l6ZSAmJiBzbmFwU2Nyb2xsVG9FbmQpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy4kYW5pbWF0aW9uUGFyYW1zLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5hbmltYXRpb25QYXJhbXMgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy4kc3ByZWFkaW5nTW9kZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRpc0luZmluaXR5Lm5leHQoaXNTcHJlYWRpbmdNb2RlKHYsIFNwcmVhZGluZ01vZGVzLklORklOSVRZKSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRhY3R1YWxTY3JvbGxTdGFydE9mZnNldC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fJHN0YXJ0T2Zmc2V0Lm5leHQodik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRhY3R1YWxTY3JvbGxFbmRPZmZzZXQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRlbmRPZmZzZXQubmV4dCh2KTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRpc0luZmluaXR5ID0gdGhpcy4kaXNJbmZpbml0eTtcclxuICAgICRpc0luZmluaXR5LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNJbmZpbml0eSA9IHRoaXMuX3NlcnZpY2UuaXNJbmZpbml0eSA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkekluZGV4V2hlblNlbGVjdGluZyA9IHRoaXMuJHpJbmRleFdoZW5TZWxlY3Rpbmc7XHJcbiAgICAkekluZGV4V2hlblNlbGVjdGluZy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuekluZGV4V2hlblNlbGVjdGluZyA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkYm91bmRzID0gdGhpcy5fJGJvdW5kcy5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoYiA9PiAhIWIpLFxyXG4gICAgKSxcclxuICAgICAgJHJhd1Njcm9sbFN0YXJ0T2Zmc2V0ID0gdGhpcy4kc2Nyb2xsU3RhcnRPZmZzZXQsXHJcbiAgICAgICRyYXdTY3JvbGxFbmRPZmZzZXQgPSB0aGlzLiRzY3JvbGxFbmRPZmZzZXQ7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJGJvdW5kcywgJHJhd1Njcm9sbFN0YXJ0T2Zmc2V0XSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcigoW3ZdKSA9PiAhIXYpLFxyXG4gICAgICB0YXAoKFtib3VuZHMsIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlQXJpdGhtZXRpY0V4cHJlc3Npb24odmFsdWUsIHRoaXMuaXNWZXJ0aWNhbCA/IGJvdW5kcyEuaGVpZ2h0IDogYm91bmRzIS53aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fJHByZWNhbGN1bGF0ZWRTY3JvbGxTdGFydE9mZnNldC5uZXh0KHZhbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskYm91bmRzLCAkcmF3U2Nyb2xsRW5kT2Zmc2V0XSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcigoW3ZdKSA9PiAhIXYpLFxyXG4gICAgICB0YXAoKFtib3VuZHMsIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlQXJpdGhtZXRpY0V4cHJlc3Npb24odmFsdWUsIHRoaXMuaXNWZXJ0aWNhbCA/IGJvdW5kcyEuaGVpZ2h0IDogYm91bmRzIS53aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fJHByZWNhbGN1bGF0ZWRTY3JvbGxFbmRPZmZzZXQubmV4dCh2YWwpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fc2VydmljZS4kaW50ZXJzZWN0aW9uRWxlbWVudEJ5U25hcFRvSXRlbUFsaWduLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiB2ICE9PSBudWxsKSxcclxuICAgICAgdGFwKGlkID0+IHtcclxuICAgICAgICB0aGlzLm9uU25hcEl0ZW0uZW1pdChpZCEpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fc2VydmljZS4kdGljay5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9zY3JvbGxlckNvbXBvbmVudD8udGljaygpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fc2VydmljZS4kdGljay5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZHluYW1pY1NpemUgPT09IHRydWUpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tCb3VuZHNPZkVsZW1lbnRzKCk7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnRpY2soKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgXyRjcmVhdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXHJcbiAgICAgICRjcmVhdGVkID0gXyRjcmVhdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoWyRjcmVhdGVkLCB0aGlzLiRzaG93XSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcigoW2NyZWF0ZWQsIHNob3duXSkgPT4gY3JlYXRlZCAmJiBzaG93biksXHJcbiAgICAgIGRlYm91bmNlVGltZSgxKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRpbml0aWFsaXplZC5uZXh0KHRydWUpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fJHNjcm9sbGVyLm5leHQodGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnNjcm9sbFZpZXdwb3J0KTtcclxuICAgIHRoaXMuXyRsaXN0Lm5leHQodGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnNjcm9sbENvbnRlbnQpO1xyXG5cclxuICAgIGNvbnN0ICRib3VuZHMgPSB0aGlzLl8kYm91bmRzLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgIGZpbHRlcihiID0+ICEhYiksXHJcbiAgICApLFxyXG4gICAgICAkc2Nyb2xsZXJDb21wb25lbnQgPSBvZih0aGlzLl9zY3JvbGxlckNvbXBvbmVudCksXHJcbiAgICAgICRyZXNpemVWaWV3cG9ydCA9ICRzY3JvbGxlckNvbXBvbmVudC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgc3dpdGNoTWFwKHNjcm9sbGVyID0+IHNjcm9sbGVyIS4kcmVzaXplVmlld3BvcnQpLFxyXG4gICAgICApLFxyXG4gICAgICAkcmVzaXplQ29udGVudCA9ICRzY3JvbGxlckNvbXBvbmVudC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgc3dpdGNoTWFwKHNjcm9sbGVyID0+IHNjcm9sbGVyIS4kcmVzaXplQ29udGVudCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgJHNjcm9sbGVyQ29tcG9uZW50LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICBzd2l0Y2hNYXAoc2Nyb2xsZXIgPT4gc2Nyb2xsZXIhLiRzY3JvbGxEaXJlY3Rpb24pLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGlyZWN0aW9uID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRyZXNpemVWaWV3cG9ydC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRib3VuZHMubmV4dCh2KTtcclxuICAgICAgICB0aGlzLm9uQWZ0ZXJSZXNpemUodHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkcmVzaXplQ29udGVudC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRsaXN0Qm91bmRzLm5leHQodik7XHJcbiAgICAgICAgdGhpcy5vbkFmdGVyUmVzaXplKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkdHJhY2tCeSA9IHRoaXMuJHRyYWNrQnk7XHJcbiAgICAkdHJhY2tCeS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UudHJhY2tCeSA9IHRoaXMuX3RyYWNrQm94LnRyYWNrQnkgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fdHJhY2tCb3guZGlzcGxheUNvbXBvbmVudHMgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cztcclxuXHJcbiAgICBsZXQgaGFzVXNlckFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0ICRpdGVtU2l6ZSA9IHRoaXMuJGl0ZW1TaXplLnBpcGUoXHJcbiAgICAgIG1hcCh2ID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyAmJiB2IDw9IDAgPyBERUZBVUxUX0lURU1fU0laRSA6IHYpLFxyXG4gICAgKSxcclxuICAgICAgJG1pbkl0ZW1TaXplID0gdGhpcy4kbWluSXRlbVNpemUucGlwZShcclxuICAgICAgICBtYXAodiA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgdiA8PSAwID8gREVGQVVMVF9NSU5fSVRFTV9TSVpFIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRtYXhJdGVtU2l6ZSA9IHRoaXMuJG1heEl0ZW1TaXplLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInICYmIHYgPD0gMCA/IERFRkFVTFRfTUFYX0lURU1fU0laRSA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkc2Nyb2xsU3RhcnRPZmZzZXQgPSB0aGlzLiRhY3R1YWxTY3JvbGxTdGFydE9mZnNldC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICksXHJcbiAgICAgICRzY3JvbGxFbmRPZmZzZXQgPSB0aGlzLiRhY3R1YWxTY3JvbGxFbmRPZmZzZXQucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICApO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoWyRtaW5JdGVtU2l6ZSwgJGJvdW5kcywgJHNjcm9sbFN0YXJ0T2Zmc2V0LCAkc2Nyb2xsRW5kT2Zmc2V0XSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHN3aXRjaE1hcCgoW3YsIGJvdW5kcywgc3RhcnRPZmZzZXQsIGVuZE9mZnNldF0pID0+IHtcclxuICAgICAgICBpZiAoKHYgYXMgYW55KSA9PT0gVklFV1BPUlQpIHtcclxuICAgICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLmlzVmVydGljYWwsIHZpZXdwb3J0Qm91bmRzID0gYm91bmRzLFxyXG4gICAgICAgICAgICByZXN1bHQgPSAoaXNWZXJ0aWNhbCA/ICh2aWV3cG9ydEJvdW5kcz8uaGVpZ2h0ID8/IDApIDogKHZpZXdwb3J0Qm91bmRzPy53aWR0aCA/PyAwKSkgLSBzdGFydE9mZnNldCAtIGVuZE9mZnNldDtcclxuICAgICAgICAgIHJldHVybiBvZihyZXN1bHQgPD0gMCA/IDEgOiByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2Yodik7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fJGFjdHVhbE1pbkl0ZW1TaXplLm5leHQodik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskbWF4SXRlbVNpemUsICRib3VuZHMsICRzY3JvbGxTdGFydE9mZnNldCwgJHNjcm9sbEVuZE9mZnNldF0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBzd2l0Y2hNYXAoKFt2LCBib3VuZHMsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXRdKSA9PiB7XHJcbiAgICAgICAgaWYgKCh2IGFzIGFueSkgPT09IFZJRVdQT1JUKSB7XHJcbiAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5pc1ZlcnRpY2FsLCB2aWV3cG9ydEJvdW5kcyA9IGJvdW5kcyxcclxuICAgICAgICAgICAgcmVzdWx0ID0gKGlzVmVydGljYWwgPyAodmlld3BvcnRCb3VuZHM/LmhlaWdodCA/PyAwKSA6ICh2aWV3cG9ydEJvdW5kcz8ud2lkdGggPz8gMCkpIC0gc3RhcnRPZmZzZXQgLSBlbmRPZmZzZXQ7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzdWx0IDw9IDAgPyAxIDogcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHYpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRhY3R1YWxNYXhJdGVtU2l6ZS5uZXh0KHYpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGFjdHVhbE1pbkl0ZW1TaXplID0gdGhpcy4kYWN0dWFsTWluSXRlbVNpemUsXHJcbiAgICAgICRhY3R1YWxNYXhJdGVtU2l6ZSA9IHRoaXMuJGFjdHVhbE1heEl0ZW1TaXplO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoWyRpdGVtU2l6ZSwgJGJvdW5kcywgJGFjdHVhbE1pbkl0ZW1TaXplLCAkYWN0dWFsTWF4SXRlbVNpemUsICRzY3JvbGxTdGFydE9mZnNldCwgJHNjcm9sbEVuZE9mZnNldF0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBzd2l0Y2hNYXAoKFt2LCBib3VuZHMsIG1pbiwgbWF4LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0XSkgPT4ge1xyXG4gICAgICAgIGlmICgodiBhcyBhbnkpID09PSBWSUVXUE9SVCkge1xyXG4gICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuaXNWZXJ0aWNhbCwgdmlld3BvcnRCb3VuZHMgPSBib3VuZHMsXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IChpc1ZlcnRpY2FsID8gKHZpZXdwb3J0Qm91bmRzPy5oZWlnaHQgPz8gMCkgOiAodmlld3BvcnRCb3VuZHM/LndpZHRoID8/IDApKSAtIHN0YXJ0T2Zmc2V0IC0gZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHJlc3VsdCA8IG1pbiA/IG1pbiA6IChyZXN1bHQgPiBtYXggPyBtYXggOiByZXN1bHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHYgPCBtaW4gPyBtaW4gOiAodiA+IG1heCA/IG1heCA6IHYpKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl8kYWN0dWFsSXRlbVNpemUubmV4dCh2KTtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLml0ZW1TaXplID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRhY3R1YWxJdGVtU2l6ZSA9IHRoaXMuJGFjdHVhbEl0ZW1TaXplLFxyXG4gICAgICAkYWN0dWFsSXRlbXMgPSB0aGlzLl8kYWN0dWFsSXRlbXMuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuJGZvY3VzSXRlbS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHBhcmFtcyA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBlbGVtZW50LCBwb3NpdGlvbiwgYWxpZ24sIGJlaGF2aW9yIH0gPSBwYXJhbXM7XHJcbiAgICAgICAgdGhpcy5mb2N1c0l0ZW0oZWxlbWVudCwgcG9zaXRpb24sIGFsaWduLCBiZWhhdmlvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkbGlzdCA9IHRoaXMuJGxpc3QucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIG1hcCh2ID0+IHYhLm5hdGl2ZUVsZW1lbnQpLFxyXG4gICAgICB0YWtlKDEpLFxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBwcmV2ZW50S2V5Ym9hcmRFdmVudCA9IChldmVudDogS2V5Ym9hcmRFdmVudCwgaXNWZXJ0aWNhbDogYm9vbGVhbikgPT4ge1xyXG4gICAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICBpZiAoISFzY3JvbGxlcikge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbFN0YXJ0T2Zmc2V0ID0gdGhpcy5fJGFjdHVhbFNjcm9sbFN0YXJ0T2Zmc2V0LmdldFZhbHVlKCksIHNjcm9sbGFibGUgPSBzY3JvbGxlci5zY3JvbGxhYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyBzY3JvbGxlci5zY3JvbGxUb3AgOiBzY3JvbGxlci5zY3JvbGxMZWZ0LFxyXG4gICAgICAgICAgc2Nyb2xsV2VpZ2h0ID0gaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbEhlaWdodCA6IHNjcm9sbGVyLnNjcm9sbFdpZHRoO1xyXG4gICAgICAgIGlmIChzY3JvbGxhYmxlIHx8IHNjcm9sbFNpemUgPD0gc2Nyb2xsU3RhcnRPZmZzZXQgfHwgc2Nyb2xsU2l6ZSA+PSBzY3JvbGxXZWlnaHQpIHtcclxuICAgICAgICAgIGlmICghIWV2ZW50ICYmIGV2ZW50LmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgICRsaXN0LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIoZWxlbWVudCA9PiAhIWVsZW1lbnQpLFxyXG4gICAgICBzd2l0Y2hNYXAoZWxlbWVudCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb21FdmVudDxLZXlib2FyZEV2ZW50PihlbGVtZW50LCBFVkVOVF9LRVlfRE9XTikucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XHJcbiAgICAgICAgICAgICAgY2FzZSBLRVlfQVJSX0xFRlQ6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICBwcmV2ZW50S2V5Ym9hcmRFdmVudChlLCB0aGlzLmlzVmVydGljYWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBLRVlfQVJSX1VQOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICBwcmV2ZW50S2V5Ym9hcmRFdmVudChlLCB0aGlzLmlzVmVydGljYWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBLRVlfQVJSX1JJR0hUOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgICAgcHJldmVudEtleWJvYXJkRXZlbnQoZSwgdGhpcy5pc1ZlcnRpY2FsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgS0VZX0FSUl9ET1dOOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICBwcmV2ZW50S2V5Ym9hcmRFdmVudChlLCB0aGlzLmlzVmVydGljYWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRzY3JvbGxiYXJUaGlja25lc3MgPSB0aGlzLiRzY3JvbGxiYXJUaGlja25lc3M7XHJcbiAgICAkc2Nyb2xsYmFyVGhpY2tuZXNzLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAoc2Nyb2xsYmFyVGhpY2tuZXNzID0+IHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLnNjcm9sbEJhclNpemUgPSBzY3JvbGxiYXJUaGlja25lc3M7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRmaXJlVXBkYXRlTmV4dEZyYW1lLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHRhcCh1c2VyQWN0aW9uID0+IHtcclxuICAgICAgICB0aGlzLl8kZmlyZVVwZGF0ZS5uZXh0KHVzZXJBY3Rpb24pO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHNjcm9sbFRvSXRlbSA9IHRoaXMuJHNjcm9sbFRvLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgKSxcclxuICAgICAgJG1vdXNlRG93biA9IGZyb21FdmVudCh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIE1PVVNFX0RPV04pLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICksXHJcbiAgICAgICR0b3VjaFN0YXJ0ID0gZnJvbUV2ZW50KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgVE9VQ0hfU1RBUlQpLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCBLRVlfRE9XTikucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcihlID0+IGUua2V5ID09PSBLRVlfVEFCKSxcclxuICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBGT0NVUykucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgZGVsYXkoMCksXHJcbiAgICAgICAgICB0YWtlVW50aWwoJHNjcm9sbFRvSXRlbSksXHJcbiAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRG93biksXHJcbiAgICAgICAgICB0YWtlVW50aWwoJHRvdWNoU3RhcnQpLFxyXG4gICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLmZvY3VzRmlyc3RFbGVtZW50KCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5fc2VydmljZS4kc2Nyb2xsVG9TdGFydC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TdGFydChudWxsLCBvcHRpb25zKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuJHNjcm9sbFRvLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAocGFyYW1zID0+IHtcclxuICAgICAgICBjb25zdCB7IGlkLCBjYiwgb3B0aW9ucyB9ID0gcGFyYW1zITtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvKGlkLCBjYiwgb3B0aW9ucyk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLl9zZXJ2aWNlLiRzY3JvbGxUb0VuZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9FbmQobnVsbCwgb3B0aW9ucyk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLiRsYW5nVGV4dERpci5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UubGFuZ1RleHREaXIgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy4kY2xpY2tEaXN0YW5jZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuY2xpY2tEaXN0YW5jZSA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRzbmFwU2Nyb2xsVG9TdGFydCwgdGhpcy4kaXNJbmZpbml0eV0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKFtzbmFwU2Nyb2xsVG9TdGFydCwgaXNJbmZpbml0eV0pID0+IHtcclxuICAgICAgICB0aGlzLl8kYWN0dWFsU25hcFNjcm9sbFRvU3RhcnQubmV4dChpc0luZmluaXR5ID8gZmFsc2UgOiBzbmFwU2Nyb2xsVG9TdGFydCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRzbmFwU2Nyb2xsVG9FbmQsIHRoaXMuJGlzSW5maW5pdHldKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKChbc25hcFNjcm9sbFRvRW5kLCBpc0luZmluaXR5XSkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRhY3R1YWxTbmFwU2Nyb2xsVG9FbmQubmV4dChpc0luZmluaXR5ID8gZmFsc2UgOiBzbmFwU2Nyb2xsVG9FbmQpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHZpZXdJbml0ID0gdGhpcy4kdmlld0luaXQsXHJcbiAgICAgICRwcmVyZW5kZXJDb250YWluZXIgPSBvZih0aGlzLl9wcmVyZW5kZXIpO1xyXG5cclxuICAgIGNvbnN0ICRwcmVyZW5kZXIgPSAkdmlld0luaXQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIHN3aXRjaE1hcCh2ID0+IHtcclxuICAgICAgICByZXR1cm4gJHByZXJlbmRlckNvbnRhaW5lci5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKHYgPT4gdiEuJHJlbmRlciksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0ICRmaXJlVXBkYXRlID0gdGhpcy4kZmlyZVVwZGF0ZTtcclxuICAgICRmaXJlVXBkYXRlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodXNlckFjdGlvbiA9PiB7XHJcbiAgICAgICAgaGFzVXNlckFjdGlvbiA9IHVzZXJBY3Rpb247XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkdXBkYXRlID0gdGhpcy4kdXBkYXRlLFxyXG4gICAgICByZW5kZXJTdGFiaWxpemVyID0gKG9wdGlvbnM/OiBJUmVuZGVyU3RhYmlsaXplck9wdGlvbnMpID0+IHtcclxuICAgICAgICBsZXQgcmVuZGVyU3RhYmlsaXplclByZXZTY3JvbGxTdGF0ZVZlcnNpb24gPSBFTVBUWV9TQ1JPTExfU1RBVEVfVkVSU0lPTixcclxuICAgICAgICAgIHJlbmRlclN0YWJpbGl6ZXJVcGRhdGVJdGVyYXRpb25zID0gMDtcclxuICAgICAgICBjb25zdCBwcmVwYXJlSXRlcmF0aW9ucyA9IG9wdGlvbnM/LnByZXBhcmVJdGVyYXRpb25zID8/IFBSRVBBUkVfSVRFUkFUSU9OUyxcclxuICAgICAgICAgIHByZXBhcmVSZXVwZGF0ZUxlbmd0aCA9IG9wdGlvbnM/LnByZXBhcmVSZXVwZGF0ZUxlbmd0aCA/PyBQUkVQQVJBVElPTl9SRVVQREFURV9MRU5HVEg7XHJcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlbmRlclN0YWJpbGl6ZXJQcmV2U2Nyb2xsU3RhdGVWZXJzaW9uID0gRU1QVFlfU0NST0xMX1NUQVRFX1ZFUlNJT047XHJcbiAgICAgICAgICAgIHJlbmRlclN0YWJpbGl6ZXJVcGRhdGVJdGVyYXRpb25zID0gMDtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiAkdXBkYXRlLnBpcGUoXHJcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICAgICAgICAgIHN3aXRjaE1hcCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICgoKHJlbmRlclN0YWJpbGl6ZXJQcmV2U2Nyb2xsU3RhdGVWZXJzaW9uID09PSBFTVBUWV9TQ1JPTExfU1RBVEVfVkVSU0lPTikgfHwgKHJlbmRlclN0YWJpbGl6ZXJQcmV2U2Nyb2xsU3RhdGVWZXJzaW9uICE9PSB2KSkgJiZcclxuICAgICAgICAgICAgICAgICAgKHJlbmRlclN0YWJpbGl6ZXJVcGRhdGVJdGVyYXRpb25zIDwgcHJlcGFyZUl0ZXJhdGlvbnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBFTVBUWV9TQ1JPTExfU1RBVEVfVkVSU0lPTikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclN0YWJpbGl6ZXJQcmV2U2Nyb2xsU3RhdGVWZXJzaW9uID0gdjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl8kZmlyZVVwZGF0ZS5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZW5kZXJTdGFiaWxpemVyUHJldlNjcm9sbFN0YXRlVmVyc2lvbiA9PT0gdikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhYmlsaXplclVwZGF0ZUl0ZXJhdGlvbnMgPCBwcmVwYXJlUmV1cGRhdGVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJTdGFiaWxpemVyVXBkYXRlSXRlcmF0aW9ucysrO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRmaXJlVXBkYXRlLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlbmRlclN0YWJpbGl6ZXJQcmV2U2Nyb2xsU3RhdGVWZXJzaW9uID0gdjtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIClcclxuICAgICAgfTtcclxuICAgIGNvbnN0ICRpbml0aWFsUmVuZGVyU3RhYmlsaXplciA9IHJlbmRlclN0YWJpbGl6ZXIoe1xyXG4gICAgICBwcmVwYXJlSXRlcmF0aW9uczogUFJFUEFSRV9JVEVSQVRJT05TLFxyXG4gICAgICBwcmVwYXJlUmV1cGRhdGVMZW5ndGg6IFBSRVBBUkFUSU9OX1JFVVBEQVRFX0xFTkdUSCxcclxuICAgIH0pLFxyXG4gICAgICAkdXBkYXRlSXRlbXNSZW5kZXJTdGFiaWxpemVyID0gcmVuZGVyU3RhYmlsaXplcih7XHJcbiAgICAgICAgcHJlcGFyZUl0ZXJhdGlvbnM6IFBSRVBBUkVfSVRFUkFUSU9OU19GT1JfVVBEQVRFX0lURU1TLFxyXG4gICAgICAgIHByZXBhcmVSZXVwZGF0ZUxlbmd0aDogUFJFUEFSQVRJT05fUkVVUERBVEVfTEVOR1RIX0ZPUl9VUERBVEVfSVRFTVMsXHJcbiAgICAgIH0pLFxyXG4gICAgICAkY2h1bmtMb2FkaW5nUmVuZGVyU3RhYmlsaXplciA9IHJlbmRlclN0YWJpbGl6ZXIoe1xyXG4gICAgICAgIHByZXBhcmVJdGVyYXRpb25zOiBQUkVQQVJFX0lURVJBVElPTlNfRk9SX1VQREFURV9JVEVNUyxcclxuICAgICAgICBwcmVwYXJlUmV1cGRhdGVMZW5ndGg6IFBSRVBBUkFUSU9OX1JFVVBEQVRFX0xFTkdUSF9GT1JfVVBEQVRFX0lURU1TLFxyXG4gICAgICB9KSxcclxuICAgICAgJGNvbGxhcHNlSXRlbXNSZW5kZXJTdGFiaWxpemVyID0gcmVuZGVyU3RhYmlsaXplcih7XHJcbiAgICAgICAgcHJlcGFyZUl0ZXJhdGlvbnM6IFBSRVBBUkVfSVRFUkFUSU9OU19GT1JfQ09MTEFQU0VfSVRFTVMsXHJcbiAgICAgICAgcHJlcGFyZVJldXBkYXRlTGVuZ3RoOiBQUkVQQVJBVElPTl9SRVVQREFURV9MRU5HVEhfRk9SX0NPTExBUFNFX0lURU1TLFxyXG4gICAgICB9KSxcclxuICAgICAgJGl0ZW1Db25maWdNYXAgPSB0aGlzLiRpdGVtQ29uZmlnTWFwLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gIXYgPyB7fSA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkZGl2aWRlcyA9IHRoaXMuJGRpdmlkZXMsXHJcbiAgICAgICRkeW5hbWljU2l6ZSA9IHRoaXMuJGR5bmFtaWNTaXplLFxyXG4gICAgICAkc25hcFNjcm9sbFRvU3RhcnQgPSB0aGlzLl8kYWN0dWFsU25hcFNjcm9sbFRvU3RhcnQuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgICRzbmFwU2Nyb2xsVG9FbmQgPSB0aGlzLl8kYWN0dWFsU25hcFNjcm9sbFRvRW5kLmFzT2JzZXJ2YWJsZSgpLFxyXG4gICAgICAkd2FpdEZvclByZXBhcmF0aW9uID0gdGhpcy4kd2FpdEZvclByZXBhcmF0aW9uLFxyXG4gICAgICAkaXRlbXMgPSB0aGlzLiRpdGVtcztcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskdmlld0luaXQsICRwcmVyZW5kZXJDb250YWluZXIsICRkaXZpZGVzLCAkZHluYW1pY1NpemUsICRzbmFwU2Nyb2xsVG9TdGFydCwgJHNuYXBTY3JvbGxUb0VuZCwgJHdhaXRGb3JQcmVwYXJhdGlvbl0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBmaWx0ZXIoKFtpbml0LCBwcmVyZW5kZXJDb250YWluZXJdKSA9PiAhIWluaXQgJiYgISFwcmVyZW5kZXJDb250YWluZXIpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgIHN3aXRjaE1hcCgoWywgcHJlcmVuZGVyQ29udGFpbmVyLCBkaXZpZGVzLCBkeW5hbWljU2l6ZSwgc25hcFNjcm9sbFRvU3RhcnQsIHNuYXBTY3JvbGxUb0VuZCwgd2FpdEZvclByZXBhcmF0aW9uXSkgPT4ge1xyXG4gICAgICAgIGlmICghIWR5bmFtaWNTaXplICYmICFzbmFwU2Nyb2xsVG9TdGFydCAmJiAhIXNuYXBTY3JvbGxUb0VuZCAmJiAhIXdhaXRGb3JQcmVwYXJhdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgJGNvbGxlY3Rpb24gPSAoZGl2aWRlcyA+IDEgPyAkYWN0dWFsSXRlbXMgOiAkaXRlbXMpO1xyXG4gICAgICAgICAgcmV0dXJuICRjb2xsZWN0aW9uLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBMZW5ndGggPSBwPy5sZW5ndGggPz8gMCwgY0xlbmd0aCA9IGM/Lmxlbmd0aCA/PyAwO1xyXG4gICAgICAgICAgICAgIHJldHVybiAhKChjTGVuZ3RoID4gMCkgfHwgKHBMZW5ndGggIT09IGNMZW5ndGggJiYgKHBMZW5ndGggPT09IDAgfHwgY0xlbmd0aCA9PT0gMCkpKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRhcChpdGVtcyA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3gucmVzZXRDb2xsZWN0aW9uKGl0ZW1zLCB0aGlzLmFjdHVhbEl0ZW1TaXplKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChpID0+IG9mKChpID8/IFtdKS5sZW5ndGggPiAwKSksXHJcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXYpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDbGVhbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkeUZvclNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICghc25hcFNjcm9sbFRvU3RhcnQgJiYgc25hcFNjcm9sbFRvRW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ29tcG9uZW50ID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFzY3JvbGxlckNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC5wcmVwYXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuXyRjbGFzc2VzLm5leHQoeyBwcmVwYXJlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzaG93Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRGb3JQcmVwYXJhdGlvbiA9IHRoaXMud2FpdEZvclByZXBhcmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKHdhaXRGb3JQcmVwYXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVyZW5kZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJlcmVuZGVyQ29udGFpbmVyIS5vbih0aGlzLml0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fJGNsYXNzZXMubmV4dCh7IHByZXBhcmVkOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzaG93Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCh2ID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXYpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXJlbmRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgcHJlcmVuZGVyQ29udGFpbmVyIS5vZmYoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IHdhaXRGb3JQcmVwYXJhdGlvbiA9IHRoaXMud2FpdEZvclByZXBhcmF0aW9uO1xyXG4gICAgICAgICAgICAgIGlmICh3YWl0Rm9yUHJlcGFyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXJlbmRlcmFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIHByZXJlbmRlckNvbnRhaW5lciEub24odGhpcy5pdGVtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJGluaXRpYWxSZW5kZXJTdGFiaWxpemVyLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVyZW5kZXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBwcmVyZW5kZXJDb250YWluZXIhLm9mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkeUZvclNob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ29tcG9uZW50ID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhc2Nyb2xsZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnByZXBhcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGNsYXNzZXMubmV4dCh7IHByZXBhcmVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzaG93Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMucHJlcmVuZGVyYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcHJlcmVuZGVyQ29udGFpbmVyIS5vZmYoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHlGb3JTaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoIXNuYXBTY3JvbGxUb1N0YXJ0ICYmIHNuYXBTY3JvbGxUb0VuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxFbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgIGlmICghIXNjcm9sbGVyQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC5wcmVwYXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMuXyRjbGFzc2VzLm5leHQoeyBwcmVwYXJlZDogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLl8kc2hvdy5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJlcmVuZGVyQ29udGFpbmVyIS5vZmYoKTtcclxuICAgICAgICAgIGNvbnN0ICRjb2xsZWN0aW9uID0gKGRpdmlkZXMgPiAxID8gJGFjdHVhbEl0ZW1zIDogJGl0ZW1zKTtcclxuICAgICAgICAgIHJldHVybiAkY29sbGVjdGlvbi5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgdGFwKGl0ZW1zID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNsZWFuKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhc2Nyb2xsZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJDb21wb25lbnQucHJlcGFyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuXyRjbGFzc2VzLm5leHQoeyBwcmVwYXJlZDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2hvdy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3gucmVzZXRDb2xsZWN0aW9uKGl0ZW1zLCB0aGlzLmFjdHVhbEl0ZW1TaXplKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChpID0+IG9mKChpID8/IFtdKS5sZW5ndGggPiAwKSksXHJcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHlGb3JTaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoc25hcFNjcm9sbFRvU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc25hcFNjcm9sbFRvRW5kKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5pc1Njcm9sbEVuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ29tcG9uZW50ID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICAgICAgICAgICAgaWYgKCEhc2Nyb2xsZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnByZXBhcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fJGNsYXNzZXMubmV4dCh7IHByZXBhcmVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuXyRzaG93Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fJGZpcmVVcGRhdGUubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkaXRlbXMucGlwZShcclxuICAgICAgbWFwKHYgPT4gdj8ubGVuZ3RoID4gMCksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IGZhbHNlO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gJHByZXJlbmRlci5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMCksXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgdGFwKGNhY2hlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9yZWFkeUZvclNob3cpIHtcclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5yZWZyZXNoQ2FjaGUoY2FjaGUpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2NhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5fJGZpcmVVcGRhdGUubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuJGZvY3VzZWRJZC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRmb2N1c2VkRWxlbWVudC5uZXh0KHYgPz8gbnVsbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkbGlzdC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKGVsZW1lbnQgPT4gISFlbGVtZW50KSxcclxuICAgICAgdGFwKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UubGlzdEVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGRlZmF1bHRJdGVtVmFsdWUgPSB0aGlzLiRkZWZhdWx0SXRlbVZhbHVlLFxyXG4gICAgICAkc2VsZWN0QnlDbGljayA9IHRoaXMuJHNlbGVjdEJ5Q2xpY2ssXHJcbiAgICAgICRjb2xsYXBzZUJ5Q2xpY2sgPSB0aGlzLiRjb2xsYXBzZUJ5Q2xpY2ssXHJcbiAgICAgICRpc1Njcm9sbFN0YXJ0ID0gdGhpcy5fJGlzU2Nyb2xsU3RhcnQuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgICRpc1Njcm9sbEZpbmlzaGVkID0gdGhpcy5fJGlzU2Nyb2xsRW5kLmFzT2JzZXJ2YWJsZSgpLFxyXG4gICAgICAkaXNWZXJ0aWNhbCA9IHRoaXMuJGRpcmVjdGlvbi5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHRoaXMuZ2V0SXNWZXJ0aWNhbCh2IHx8IERFRkFVTFRfRElSRUNUSU9OKSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgJHNuYXBTY3JvbGxUb1N0YXJ0LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5zbmFwU2Nyb2xsVG9TdGFydCA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkc25hcFNjcm9sbFRvRW5kLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5zbmFwU2Nyb2xsVG9FbmQgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGlzVmVydGljYWwucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLmlzVmVydGljYWwgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGR5bmFtaWNTaXplLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5keW5hbWljID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRkZWZhdWx0SXRlbVZhbHVlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5kZWZhdWx0SXRlbVZhbHVlID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRzY3JvbGxTdGFydE9mZnNldC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LnNjcm9sbFN0YXJ0T2Zmc2V0ID0gdGhpcy5fc2VydmljZS5zY3JvbGxTdGFydE9mZnNldCA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkc2Nyb2xsRW5kT2Zmc2V0LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3guc2Nyb2xsRW5kT2Zmc2V0ID0gdGhpcy5fc2VydmljZS5zY3JvbGxFbmRPZmZzZXQgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGlzU2Nyb2xsU3RhcnQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHNraXAoMSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2ICYmIHRoaXMuX3JlYWR5Rm9yU2hvdyksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50Py5zY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICB0aGlzLm9uU2Nyb2xsUmVhY2hTdGFydC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGlzU2Nyb2xsRmluaXNoZWQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHNraXAoMSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2ICYmIHRoaXMuX3JlYWR5Rm9yU2hvdyksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnNjcm9sbGFibGUpIHtcclxuICAgICAgICAgIHRoaXMub25TY3JvbGxSZWFjaEVuZC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJHNlbGVjdEJ5Q2xpY2sucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLnNlbGVjdEJ5Q2xpY2sgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGNvbGxhcHNlQnlDbGljay5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuY29sbGFwc2VCeUNsaWNrID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICR0cmFja0J5LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gudHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGRpdmlkZXMucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl90cmFja0JveC5kaXZpZGVzID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuJGFsaWdubWVudCwgdGhpcy4kaXNJbmZpbml0eV0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKFthbGlnbm1lbnQsIGlzSW5maW5pdHldKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fJGFjdHVhbEFsaWdubWVudC5uZXh0KGlzSW5maW5pdHkgPyBBbGlnbm1lbnRzLkNFTlRFUiA6IGFsaWdubWVudCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRzY3JvbGxiYXJFbmFibGVkLCB0aGlzLiRpc0luZmluaXR5XSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKChbc2Nyb2xsYmFyRW5hYmxlZCwgaXNJbmZpbml0eV0pID0+IHtcclxuICAgICAgICB0aGlzLl8kYWN0dWFsU2Nyb2xsYmFyRW5hYmxlZC5uZXh0KGlzSW5maW5pdHkgPyBmYWxzZSA6IHNjcm9sbGJhckVuYWJsZWQpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGFsaWdubWVudCA9IHRoaXMuJGFjdHVhbEFsaWdubWVudCxcclxuICAgICAgJHByZWNhbGN1bGF0ZWRTY3JvbGxTdGFydE9mZnNldCA9IHRoaXMuXyRwcmVjYWxjdWxhdGVkU2Nyb2xsU3RhcnRPZmZzZXQuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgICRwcmVjYWxjdWxhdGVkU2Nyb2xsRW5kT2Zmc2V0ID0gdGhpcy5fJHByZWNhbGN1bGF0ZWRTY3JvbGxFbmRPZmZzZXQuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgICRsaXN0Qm91bmRzID0gdGhpcy5fJGxpc3RCb3VuZHMuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgICBmaWx0ZXIoYiA9PiAhIWIpLFxyXG4gICAgICApLCAkc2Nyb2xsU2l6ZSA9IHRoaXMuXyRzY3JvbGxTaXplLmFzT2JzZXJ2YWJsZSgpLFxyXG4gICAgICAkYnVmZmVyU2l6ZSA9IHRoaXMuJGJ1ZmZlclNpemUucGlwZShcclxuICAgICAgICBtYXAodiA9PiB2IDwgMCA/IERFRkFVTFRfQlVGRkVSX1NJWkUgOiB2KSxcclxuICAgICAgKSxcclxuICAgICAgJG1heEJ1ZmZlclNpemUgPSB0aGlzLiRtYXhCdWZmZXJTaXplLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gdiA8IDAgPyBERUZBVUxUX0JVRkZFUl9TSVpFIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRzbmFwVG9JdGVtID0gdGhpcy4kc25hcFRvSXRlbSxcclxuICAgICAgJHNuYXBUb0l0ZW1BbGlnbiA9IHRoaXMuJHNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgJHN0aWNreUVuYWJsZWQgPSB0aGlzLiRzdGlja3lFbmFibGVkLFxyXG4gICAgICAkaXNMYXp5ID0gdGhpcy4kY29sbGVjdGlvbk1vZGUucGlwZShcclxuICAgICAgICBtYXAodiA9PiB0aGlzLmdldElzTGF6eSh2IHx8IERFRkFVTFRfQ09MTEVDVElPTl9NT0RFKSksXHJcbiAgICAgICksXHJcbiAgICAgICRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gdGhpcy4kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbixcclxuICAgICAgJHNuYXBwaW5nTWV0aG9kID0gdGhpcy4kc25hcHBpbmdNZXRob2QucGlwZShcclxuICAgICAgICBtYXAodiA9PiB0aGlzLmdldElzU25hcHBpbmdNZXRob2RBZHZhbmNlZCh2IHx8IERFRkFVTFRfU05BUFBJTkdfTUVUSE9EKSksXHJcbiAgICAgICksXHJcbiAgICAgICRjb2xsYXBzaW5nTW9kZSA9IHRoaXMuJGNvbGxhcHNpbmdNb2RlLFxyXG4gICAgICAkc2VsZWN0aW5nTW9kZSA9IHRoaXMuJHNlbGVjdGluZ01vZGUsXHJcbiAgICAgICRzZWxlY3RlZElkcyA9IHRoaXMuJHNlbGVjdGVkSWRzLFxyXG4gICAgICAkY29sbGFwc2VkSWRzID0gdGhpcy4kY29sbGFwc2VkSWRzLnBpcGUoXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICBtYXAodiA9PiBBcnJheS5pc0FycmF5KHYpID8gdiA6IFtdKSxcclxuICAgICAgKSxcclxuICAgICAgJGNvbGxhcHNlZEl0ZW1JZHMgPSB0aGlzLl8kY29sbGFwc2VkSXRlbUlkcy5hc09ic2VydmFibGUoKS5waXBlKFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgbWFwKHYgPT4gQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbXSksXHJcbiAgICAgICksXHJcbiAgICAgICRpdGVtVHJhbnNmb3JtID0gdGhpcy4kaXRlbVRyYW5zZm9ybSxcclxuICAgICAgJHNjcmVlblJlYWRlck1lc3NhZ2UgPSB0aGlzLiRzY3JlZW5SZWFkZXJNZXNzYWdlLFxyXG4gICAgICAkZGlzcGxheUl0ZW1zID0gdGhpcy5fc2VydmljZS4kZGlzcGxheUl0ZW1zLFxyXG4gICAgICAkY2FjaGVWZXJzaW9uID0gdGhpcy5fc2VydmljZS4kY2FjaGVWZXJzaW9uO1xyXG5cclxuICAgICRzbmFwVG9JdGVtLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5zbmFwVG9JdGVtID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRhY3R1YWxJdGVtcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuaXRlbXMgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJGFjdHVhbEl0ZW1zLCAkdmlld0luaXRdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKChbLCBpbml0XSkgPT4gaW5pdCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9zY3JvbGxlckNvbXBvbmVudD8uc25hcElmTmVlZCgpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGl0ZW1Db25maWdNYXAucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLml0ZW1Db25maWdNYXAgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGNvbGxhcHNlZElkcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuY29sbGFwc2VkSWRzID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoWyRkaXNwbGF5SXRlbXMsICRzY3JlZW5SZWFkZXJNZXNzYWdlLCAkaXNWZXJ0aWNhbCwgJHNjcm9sbFNpemUsICRib3VuZHNdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKFtpdGVtcywgc2NyZWVuUmVhZGVyTWVzc2FnZSwgaXNWZXJ0aWNhbCwgc2Nyb2xsU2l6ZSwgYm91bmRzXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuXyRzY3JlZW5SZWFkZXJGb3JtYXR0ZWRNZXNzYWdlLm5leHQoXHJcbiAgICAgICAgICBmb3JtYXRTY3JlZW5SZWFkZXJNZXNzYWdlKGl0ZW1zLCBzY3JlZW5SZWFkZXJNZXNzYWdlLCBzY3JvbGxTaXplLCBpc1ZlcnRpY2FsLCBib3VuZHMhKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkaXNMYXp5LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNMYXp5ID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRpdGVtc0NvbXBvc2l0aW9uID0gJGl0ZW1zLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBzd2l0Y2hNYXAoaXRlbXMgPT4ge1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFskY29sbGFwc2VkSXRlbUlkcywgJGl0ZW1Db25maWdNYXAsICR0cmFja0J5LCAkZGl2aWRlc10pLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoW2NvbGxhcHNlZElkcywgaXRlbUNvbmZpZ01hcCwgdHJhY2tCeSwgZGl2aWRlc10pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHsgaXRlbXMsIGNvbGxhcHNlZElkcywgaXRlbUNvbmZpZ01hcCwgdHJhY2tCeSwgZGl2aWRlcyB9KTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuXHJcbiAgICAkaXRlbXNDb21wb3NpdGlvbi5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgc3dpdGNoTWFwKCh7IGl0ZW1zLCBjb2xsYXBzZWRJZHMsIGl0ZW1Db25maWdNYXAsIHRyYWNrQnksIGRpdmlkZXMgfSkgPT4ge1xyXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDAgfHwgIXRoaXMuX3JlYWR5Rm9yU2hvdyB8fCAhKHRoaXMuY2FjaGFibGUgJiYgIXRoaXMuX2NhY2hlZCAmJlxyXG4gICAgICAgICAgIXRoaXMuX3RyYWNrQm94LmlzU25hcHBlZFRvU3RhcnQgJiYgdGhpcy5fdHJhY2tCb3guaXNTbmFwcGVkVG9FbmQpKSB7XHJcbiAgICAgICAgICByZXR1cm4gb2YoeyBpdGVtcywgY29sbGFwc2VkSWRzLCBpdGVtQ29uZmlnTWFwLCB0cmFja0J5LCBkaXZpZGVzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJHVwZGF0ZUl0ZW1zUmVuZGVyU3RhYmlsaXplci5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHsgaXRlbXMsIGNvbGxhcHNlZElkcywgaXRlbUNvbmZpZ01hcCwgdHJhY2tCeSwgZGl2aWRlcyB9KTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHsgaXRlbXMsIGNvbGxhcHNlZElkcywgaXRlbUNvbmZpZ01hcCwgdHJhY2tCeSwgZGl2aWRlcyB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGlkZGVuSXRlbXMgPSBuZXcgQ01hcDxJZCwgYm9vbGVhbj4oKTtcclxuXHJcbiAgICAgICAgbGV0IGlzQ29sbGFwc2VkID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICBpZiAoISFpdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gKGl0ZW1Db25maWdNYXBbaWRdPy5zdGlja3kgPz8gMCkgPiAwLCBjb2xsYXBzZWQgPSBjb2xsYXBzZWRJZHMuaW5jbHVkZXMoaWQpO1xyXG4gICAgICAgICAgICBpZiAoISFncm91cCkge1xyXG4gICAgICAgICAgICAgIGlzQ29sbGFwc2VkID0gY29sbGFwc2VkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChpc0NvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgaGlkZGVuSXRlbXMuc2V0KGlkLCB0cnVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFjdHVhbEl0ZW1zOiBJVmlydHVhbExpc3RDb2xsZWN0aW9uID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICBpZiAoISFpdGVtICYmIGhpZGRlbkl0ZW1zLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhY3R1YWxJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZENvbGxlY3Rpb24gPSBub3JtYWxpemVDb2xsZWN0aW9uKGFjdHVhbEl0ZW1zLCBpdGVtQ29uZmlnTWFwLCB0cmFja0J5LCBkaXZpZGVzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fJGFjdHVhbEl0ZW1zLm5leHQobm9ybWFsaXplZENvbGxlY3Rpb24pO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGlzVmVydGljYWwucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9pc1ZlcnRpY2FsID0gdjtcclxuICAgICAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdG9nZ2xlQ2xhc3NOYW1lKGVsLCB2ID8gQ0xBU1NfTElTVF9WRVJUSUNBTCA6IENMQVNTX0xJU1RfSE9SSVpPTlRBTCwgdiA/IENMQVNTX0xJU1RfSE9SSVpPTlRBTCA6IENMQVNTX0xJU1RfVkVSVElDQUwpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJHNuYXBwaW5nTWV0aG9kLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5faXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID0gdGhpcy5fdHJhY2tCb3guaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRzZWxlY3RpbmdNb2RlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLl8kbGlzdC5nZXRWYWx1ZSgpPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGlmICh0aGlzLmdldElzTXVsdGlTZWxlY3Rpb24odiB8fCBERUZBVUxUX1NOQVBQSU5HX01FVEhPRCkpIHtcclxuICAgICAgICAgIHRoaXMuX2lzTXVsdGlTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5faXNTaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghIWVsKSB7XHJcbiAgICAgICAgICAgIChlbCBhcyBhbnkpLnJvbGUgPSBST0xFX0xJU1RfQk9YO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fc2VydmljZS5zZWxlY3RpbmdNb2RlID0gU2VsZWN0aW5nTW9kZXNUeXBlcy5NVUxUSV9TRUxFQ1Q7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzU2luZ2xlU2VsZWN0aW9uKHYgfHwgREVGQVVMVF9TTkFQUElOR19NRVRIT0QpKSB7XHJcbiAgICAgICAgICB0aGlzLl9pc1NpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLl9pc011bHRpU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoISFlbCkge1xyXG4gICAgICAgICAgICAoZWwgYXMgYW55KS5yb2xlID0gUk9MRV9MSVNUX0JPWDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX3NlcnZpY2Uuc2VsZWN0aW5nTW9kZSA9IFNlbGVjdGluZ01vZGVzVHlwZXMuU0VMRUNUO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc05vbmVTZWxlY3Rpb24odiB8fCBERUZBVUxUX1NOQVBQSU5HX01FVEhPRCkpIHtcclxuICAgICAgICAgIHRoaXMuX2lzU2luZ2xlU2VsZWN0aW9uID0gdGhpcy5faXNNdWx0aVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCEhZWwpIHtcclxuICAgICAgICAgICAgKGVsIGFzIGFueSkucm9sZSA9IFJPTEVfTElTVDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX3NlcnZpY2Uuc2VsZWN0aW5nTW9kZSA9IFNlbGVjdGluZ01vZGVzVHlwZXMuTk9ORTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkY29sbGFwc2luZ01vZGUucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICBpZiAodGhpcy5nZXRJc05vbmVDb2xsYXBzZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXJ2aWNlLmlzTm9uZUNvbGxhcHNlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3NlcnZpY2UuaXNBY2NvcmRpb25Db2xsYXBzZSA9IHRoaXMuX3NlcnZpY2UuaXNNdWx0aXBsZUNvbGxhcHNlID0gdGhpcy5faXNBY2NvcmRpb25Db2xsYXBzZSA9IHRoaXMuX2lzTXVsdGlwbGVDb2xsYXBzZSA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc011bHRpcGxlQ29sbGFwc2UoKSkge1xyXG4gICAgICAgICAgdGhpcy5fc2VydmljZS5pc011bHRpcGxlQ29sbGFwc2UgPSB0aGlzLl9pc011bHRpcGxlQ29sbGFwc2UgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fc2VydmljZS5pc0FjY29yZGlvbkNvbGxhcHNlID0gdGhpcy5fc2VydmljZS5pc05vbmVDb2xsYXBzZSA9IHRoaXMuX2lzQWNjb3JkaW9uQ29sbGFwc2UgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNBY2NvcmRpb25Db2xsYXBzZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZXJ2aWNlLmlzQWNjb3JkaW9uQ29sbGFwc2UgPSB0aGlzLl9pc0FjY29yZGlvbkNvbGxhcHNlID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3NlcnZpY2UuaXNNdWx0aXBsZUNvbGxhcHNlID0gdGhpcy5fc2VydmljZS5pc05vbmVDb2xsYXBzZSA9IHRoaXMuX2lzTXVsdGlwbGVDb2xsYXBzZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRwcmV2ZW50U2Nyb2xsU25hcHBpbmcgPSB0aGlzLiRwcmV2ZW50U2Nyb2xsU25hcHBpbmc7XHJcblxyXG4gICAgJHByZXZlbnRTY3JvbGxTbmFwcGluZy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5pc1Njcm9sbEVuZDtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSB0aGlzLl90cmFja0JveC5pc1Njcm9sbEVuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl8kaXNTY3JvbGxFbmQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgICAgaWYgKCEhc2Nyb2xsZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3gucHJldmVudFNjcm9sbFNuYXBwaW5nKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgICAgdGhpcy5fJHByZXZlbnRTY3JvbGxTbmFwcGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkY29sbGFwc2VkSXRlbUlkcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX3JlYWR5Rm9yU2hvdyksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICRjb2xsYXBzZUl0ZW1zUmVuZGVyU3RhYmlsaXplci5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fJGZpcmVVcGRhdGUubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBsZXQgaXNDaHVua0xvYWRpbmcgPSBmYWxzZTtcclxuICAgIGNvbnN0ICRsb2FkaW5nID0gdGhpcy4kbG9hZGluZztcclxuICAgICRsb2FkaW5nLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBza2lwKDEpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhdiksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgaXNDaHVua0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGJhciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgIGlmICghIXNjcm9sbGJhcikge1xyXG4gICAgICAgICAgc2Nyb2xsYmFyLnN0b3BTY3JvbGxiYXIoKTtcclxuICAgICAgICAgIHNjcm9sbGJhci5yZWZyZXNoU2Nyb2xsYmFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAkYWN0dWFsSXRlbXMucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRmaXJlVXBkYXRlTmV4dEZyYW1lLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiAkY2h1bmtMb2FkaW5nUmVuZGVyU3RhYmlsaXplci5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICBpc0NodW5rTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LnJlc2V0Q2FjaGVDaHVua0luZm8oKTtcclxuICAgICAgICAgICAgICBjb25zdCBzY3JvbGxiYXIgPSB0aGlzLl9zY3JvbGxlckNvbXBvbmVudDtcclxuICAgICAgICAgICAgICBpZiAoISFzY3JvbGxiYXIpIHtcclxuICAgICAgICAgICAgICAgIHNjcm9sbGJhci5zdG9wU2Nyb2xsYmFyKCk7XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxiYXIucmVmcmVzaFNjcm9sbGJhcigpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApKSxcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGxvYWRpbmcucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHNraXAoMSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICBpZiAodikge1xyXG4gICAgICAgICAgdGhpcy5faXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhdiksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgICAgdGhpcy5fJHByZXZlbnRTY3JvbGxTbmFwcGluZy5uZXh0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2lzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlID0gKHBhcmFtczoge1xyXG4gICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudDsgcHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0OiBudW1iZXI7IHByZWNhbGN1bGF0ZWRTY3JvbGxFbmRPZmZzZXQ6IG51bWJlcjsgdHJhY2tCeTogc3RyaW5nOyBpc0luZmluaXR5OiBib29sZWFuO1xyXG4gICAgICBzbmFwU2Nyb2xsVG9TdGFydDogYm9vbGVhbiwgc25hcFNjcm9sbFRvRW5kOiBib29sZWFuOyBib3VuZHM6IElTaXplOyBsaXN0Qm91bmRzOiBJU2l6ZTsgc2Nyb2xsRW5kT2Zmc2V0OiBudW1iZXI7XHJcbiAgICAgIGl0ZW1zOiBJVmlydHVhbExpc3RDb2xsZWN0aW9uPE9iamVjdD47IGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXA7IHNjcm9sbFNpemU6IG51bWJlcjsgaXRlbVNpemU6IG51bWJlcjtcclxuICAgICAgbWluSXRlbVNpemU6IG51bWJlcjsgbWF4SXRlbVNpemU6IG51bWJlcjsgYnVmZmVyU2l6ZTogbnVtYmVyOyBtYXhCdWZmZXJTaXplOiBudW1iZXI7IHN0aWNreUVuYWJsZWQ6IGJvb2xlYW47IGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICAgIGR5bmFtaWNTaXplOiBib29sZWFuOyBkaXZpZGVzOiBudW1iZXI7IGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb246IGJvb2xlYW47IGNhY2hlVmVyc2lvbjogbnVtYmVyOyB1c2VyQWN0aW9uOiBib29sZWFuO1xyXG4gICAgICBzbmFwVG9JdGVtOiBib29sZWFuLCBzbmFwVG9JdGVtQWxpZ246IFNuYXBUb0l0ZW1BbGlnbiwgY29sbGFwc2VkSWRzOiBBcnJheTxJZD47IGl0ZW1UcmFuc2Zvcm06IEl0ZW1UcmFuc2Zvcm0gfCBudWxsO1xyXG4gICAgfSkgPT4ge1xyXG4gICAgICBjb25zdCB7XHJcbiAgICAgICAgYWxpZ25tZW50LCBzbmFwU2Nyb2xsVG9TdGFydCwgc25hcFNjcm9sbFRvRW5kLCBib3VuZHMsIGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCBzY3JvbGxTaXplLCBpdGVtU2l6ZSwgbWluSXRlbVNpemUsXHJcbiAgICAgICAgbWF4SXRlbVNpemUsIGJ1ZmZlclNpemUsIG1heEJ1ZmZlclNpemUsIHN0aWNreUVuYWJsZWQsIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCBzbmFwVG9JdGVtLFxyXG4gICAgICAgIHNuYXBUb0l0ZW1BbGlnbiwgdXNlckFjdGlvbiwgY29sbGFwc2VkSWRzLCBpdGVtVHJhbnNmb3JtLFxyXG4gICAgICB9ID0gcGFyYW1zO1xyXG4gICAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICBsZXQgdG90YWxTaXplID0gMDtcclxuICAgICAgaWYgKCEhc2Nyb2xsZXIpIHtcclxuICAgICAgICBjb25zdCBpc0luZmluaXR5ID0gdGhpcy5pc0luZmluaXR5LCBjb2xsYXBzYWJsZSA9IGNvbGxhcHNlZElkcy5sZW5ndGggPiAwLCBjYWNoYWJsZSA9IHRoaXMuY2FjaGFibGUsIGNhY2hlZCA9IHRoaXMuX2NhY2hlZCwgd2FpdGluZ0NhY2hlID0gY2FjaGFibGUgJiYgIWNhY2hlZCxcclxuICAgICAgICAgIGVtaXRVcGRhdGUgPSAhdGhpcy5fcmVhZHlGb3JTaG93IHx8IHdhaXRpbmdDYWNoZSB8fCBjb2xsYXBzYWJsZSB8fCBpc0NodW5rTG9hZGluZyxcclxuICAgICAgICAgIGZpcmVVcGRhdGUgPSAhdGhpcy5fcmVhZHlGb3JTaG93IHx8IHRoaXMuXyRzY3JvbGxpbmdUby5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgZmlyZVVwZGF0ZUF0RWRnZXMgPSBmaXJlVXBkYXRlIHx8ICFpc0luZmluaXR5O1xyXG4gICAgICAgIGlmICh0aGlzLl9yZWFkeUZvclNob3cgfHwgKGNhY2hhYmxlICYmIGNhY2hlZCkpIHtcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxTaXplID0gKGlzVmVydGljYWwgPyBzY3JvbGxlci5zY3JvbGxUb3AgOiBzY3JvbGxlci5zY3JvbGxMZWZ0KTtcclxuICAgICAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gIXRoaXMuX3JlYWR5Rm9yU2hvdyAmJiBzbmFwU2Nyb2xsVG9FbmQgPyAoaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbEhlaWdodCA6IHNjcm9sbGVyLnNjcm9sbFdpZHRoKSA6XHJcbiAgICAgICAgICAgIChpc1ZlcnRpY2FsID8gc2Nyb2xsZXIuc2Nyb2xsVG9wIDogc2Nyb2xsZXIuc2Nyb2xsTGVmdCksXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRPZmZzZXQgPSAwLFxyXG4gICAgICAgICAgICBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb247XHJcblxyXG4gICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBib3VuZHMsIHZpZXdwb3J0U2l6ZSA9IChpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgpLFxyXG4gICAgICAgICAgICBvcHRzOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SVZpcnR1YWxMaXN0SXRlbSwgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbj4gPSB7XHJcbiAgICAgICAgICAgICAgYWxpZ25tZW50LCBib3VuZHM6IHsgd2lkdGgsIGhlaWdodCB9LCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsIG1pbkl0ZW1TaXplLCBtYXhJdGVtU2l6ZSwgYnVmZmVyU2l6ZSwgbWF4QnVmZmVyU2l6ZSxcclxuICAgICAgICAgICAgICBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLCBzdGlja3lFbmFibGVkLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCBzbmFwVG9JdGVtLCBzbmFwVG9JdGVtQWxpZ24sIGl0ZW1UcmFuc2Zvcm0sXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKHNuYXBTY3JvbGxUb0VuZCAmJiAhdGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zOiBjYWxjdWxhdGVkRGlzcGxheUl0ZW1zLCB0b3RhbFNpemU6IGNhbGN1bGF0ZWRUb3RhbFNpemUxLCBsZWZ0TGF5b3V0T2Zmc2V0OiBsZWZ0TGF5b3V0T2Zmc2V0MSB9ID1cclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCB7IC4uLm9wdHMsIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUgfSk7XHJcbiAgICAgICAgICAgIGRpc3BsYXlJdGVtcyA9IGNhbGN1bGF0ZWREaXNwbGF5SXRlbXM7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGNhbGN1bGF0ZWRUb3RhbFNpemUxO1xyXG4gICAgICAgICAgICBsZWZ0TGF5b3V0T2Zmc2V0ID0gbGVmdExheW91dE9mZnNldDE7XHJcblxyXG4gICAgICAgICAgICBpZiAoISFpdGVtVHJhbnNmb3JtICYmIGR5bmFtaWNTaXplICYmIHRoaXMuX3RyYWNrQm94LmRlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyBkaXNwbGF5SXRlbXM6IGNhbGN1bGF0ZWREaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZTogY2FsY3VsYXRlZFRvdGFsU2l6ZTEsIGxlZnRMYXlvdXRPZmZzZXQ6IGxlZnRMYXlvdXRPZmZzZXQxIH0gPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3gudXBkYXRlQ29sbGVjdGlvbihpdGVtcywgaXRlbUNvbmZpZ01hcCwgeyAuLi5vcHRzLCBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplICsgdGhpcy5fdHJhY2tCb3guZGVsdGEgfSk7XHJcbiAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zID0gY2FsY3VsYXRlZERpc3BsYXlJdGVtcztcclxuICAgICAgICAgICAgICB0b3RhbFNpemUgPSBjYWxjdWxhdGVkVG90YWxTaXplMTtcclxuICAgICAgICAgICAgICBsZWZ0TGF5b3V0T2Zmc2V0ID0gbGVmdExheW91dE9mZnNldDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zOiBjYWxjdWxhdGVkRGlzcGxheUl0ZW1zLCB0b3RhbFNpemU6IGNhbGN1bGF0ZWRUb3RhbFNpemUsIGxlZnRMYXlvdXRPZmZzZXQ6IGxlZnRMYXlvdXRPZmZzZXQxIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCBvcHRzKTtcclxuICAgICAgICAgICAgZGlzcGxheUl0ZW1zID0gY2FsY3VsYXRlZERpc3BsYXlJdGVtcztcclxuICAgICAgICAgICAgdG90YWxTaXplID0gY2FsY3VsYXRlZFRvdGFsU2l6ZTtcclxuICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IGxlZnRMYXlvdXRPZmZzZXQxO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEhaXRlbVRyYW5zZm9ybSAmJiBkeW5hbWljU2l6ZSAmJiB0aGlzLl90cmFja0JveC5kZWx0YSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zOiBjYWxjdWxhdGVkRGlzcGxheUl0ZW1zLCB0b3RhbFNpemU6IGNhbGN1bGF0ZWRUb3RhbFNpemUsIGxlZnRMYXlvdXRPZmZzZXQ6IGxlZnRMYXlvdXRPZmZzZXQxIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCB7IC4uLm9wdHMsIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUgKyB0aGlzLl90cmFja0JveC5kZWx0YSB9KTtcclxuICAgICAgICAgICAgICBkaXNwbGF5SXRlbXMgPSBjYWxjdWxhdGVkRGlzcGxheUl0ZW1zO1xyXG4gICAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGNhbGN1bGF0ZWRUb3RhbFNpemU7XHJcbiAgICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IGxlZnRMYXlvdXRPZmZzZXQxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2Nyb2xsZXIudG90YWxTaXplID0gdG90YWxTaXplO1xyXG5cclxuICAgICAgICAgIHNjcm9sbGVyLnN0YXJ0TGF5b3V0T2Zmc2V0ID0gbGVmdExheW91dE9mZnNldDtcclxuXHJcbiAgICAgICAgICB0aGlzLl8kdG90YWxTaXplLm5leHQodG90YWxTaXplKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9zZXJ2aWNlLmNvbGxlY3Rpb24gPSBkaXNwbGF5SXRlbXM7XHJcblxyXG4gICAgICAgICAgdGhpcy5yZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbCwgdG90YWxTaXplKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtcyk7XHJcblxyXG4gICAgICAgICAgdGhpcy50cmFja2luZygpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc25hcHBpbmdIYW5kbGVyKCk7XHJcblxyXG4gICAgICAgICAgaWYgKCFfJGNyZWF0ZWQuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICBfJGNyZWF0ZWQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuX3RyYWNrQm94LmRlbHRhLFxyXG4gICAgICAgICAgICBzY3JvbGxQb3NpdGlvbkFmdGVyVXBkYXRlID0gYWN0dWFsU2Nyb2xsU2l6ZSArIGRlbHRhLFxyXG4gICAgICAgICAgICByb3VuZGVkU2Nyb2xsUG9zaXRpb25BZnRlclVwZGF0ZSA9IHNjcm9sbFBvc2l0aW9uQWZ0ZXJVcGRhdGUsXHJcbiAgICAgICAgICAgIHJvdW5kZWRNYXhQb3NpdGlvbkFmdGVyVXBkYXRlID0gaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbEhlaWdodCA6IHNjcm9sbGVyLnNjcm9sbFdpZHRoO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZWd1bGFyUmVuZGVyZXIoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldHNCeUFsbGlnbm1lbnQoKTtcclxuXHJcbiAgICAgICAgICBzY3JvbGxlci5kZWx0YSA9IGRlbHRhO1xyXG5cclxuICAgICAgICAgIGlmICgoc25hcFNjcm9sbFRvU3RhcnQgJiYgdGhpcy5fdHJhY2tCb3guaXNTbmFwcGVkVG9TdGFydCAmJiBzY3JvbGxlci5zY3JvbGxhYmxlKSB8fFxyXG4gICAgICAgICAgICAoc25hcFNjcm9sbFRvU3RhcnQgJiYgY3VycmVudFNjcm9sbFNpemUgPD0gTUlOX1BJWEVMU19GT1JfUFJFVkVOVF9TTkFQUElORykpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTY3JvbGxTaXplICE9PSByb3VuZGVkU2Nyb2xsUG9zaXRpb25BZnRlclVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGEoKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsRXZlbnQodHJ1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5pc1Njcm9sbEVuZDtcclxuICAgICAgICAgICAgICBjb25zdCBwYXJhbXM6IElTY3JvbGxUb1BhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgIFtpc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogMCwgdXNlckFjdGlvbixcclxuICAgICAgICAgICAgICAgIGZpcmVVcGRhdGU6IGZpcmVVcGRhdGVBdEVkZ2VzLCBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCxcclxuICAgICAgICAgICAgICAgIGJsZW5kaW5nOiBmYWxzZSwgZHVyYXRpb246IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNjcm9sbFRvSXRlbSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHNjcm9sbGVyPy5zY3JvbGxUbz8uKHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgaWYgKGVtaXRVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyR1cGRhdGUubmV4dChnZXRTY3JvbGxTdGF0ZVZlcnNpb24odG90YWxTaXplLCB0aGlzLl9pc1ZlcnRpY2FsID8gc2Nyb2xsZXIuc2Nyb2xsVG9wIDogc2Nyb2xsZXIuc2Nyb2xsTGVmdCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKChzbmFwU2Nyb2xsVG9FbmQgJiYgdGhpcy5fdHJhY2tCb3guaXNTbmFwcGVkVG9FbmQpIHx8IChzbmFwU2Nyb2xsVG9FbmQgJiYgIXNjcm9sbGVyLnNjcm9sbGFibGUpIHx8XHJcbiAgICAgICAgICAgIChzY3JvbGxQb3NpdGlvbkFmdGVyVXBkYXRlICsgTUlOX1BJWEVMU19GT1JfUFJFVkVOVF9TTkFQUElORyA+PSByb3VuZGVkTWF4UG9zaXRpb25BZnRlclVwZGF0ZSkgfHxcclxuICAgICAgICAgICAgKHJvdW5kZWRTY3JvbGxQb3NpdGlvbkFmdGVyVXBkYXRlID49IHNjcm9sbFBvc2l0aW9uQWZ0ZXJVcGRhdGUgKyBNSU5fUElYRUxTX0ZPUl9QUkVWRU5UX1NOQVBQSU5HKSkge1xyXG4gICAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYWNrQm94LmlzU25hcHBlZFRvRW5kKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxFbmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbEV2ZW50KHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgW2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiByb3VuZGVkTWF4UG9zaXRpb25BZnRlclVwZGF0ZSxcclxuICAgICAgICAgICAgICBmaXJlVXBkYXRlOiBmaXJlVXBkYXRlQXRFZGdlcywgYmVoYXZpb3I6IEJFSEFWSU9SX0lOU1RBTlQsIHVzZXJBY3Rpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGJsZW5kaW5nOiBmYWxzZSwgZHVyYXRpb246IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNjcm9sbFRvSXRlbSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgc2Nyb2xsZXI/LnNjcm9sbFRvPy4ocGFyYW1zKTtcclxuICAgICAgICAgICAgaWYgKGVtaXRVcGRhdGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLl8kdXBkYXRlLm5leHQoZ2V0U2Nyb2xsU3RhdGVWZXJzaW9uKHRvdGFsU2l6ZSwgdGhpcy5faXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA6IHNjcm9sbGVyLnNjcm9sbExlZnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHNjcm9sbFNpemUgIT09IHNjcm9sbFBvc2l0aW9uQWZ0ZXJVcGRhdGUgJiZcclxuICAgICAgICAgICAgKChzY3JvbGxQb3NpdGlvbkFmdGVyVXBkYXRlID49IDAgJiYgc2Nyb2xsUG9zaXRpb25BZnRlclVwZGF0ZSA8IHJvdW5kZWRNYXhQb3NpdGlvbkFmdGVyVXBkYXRlKSB8fFxyXG4gICAgICAgICAgICAgIChzY3JvbGxTaXplICE9PSByb3VuZGVkTWF4UG9zaXRpb25BZnRlclVwZGF0ZSB8fCBjdXJyZW50U2Nyb2xsU2l6ZSAhPT0gc2Nyb2xsUG9zaXRpb25BZnRlclVwZGF0ZSkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGEoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWFkeUZvclNob3cpIHtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXRTY3JvbGxFdmVudCh0cnVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgW2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBzY3JvbGxQb3NpdGlvbkFmdGVyVXBkYXRlLCBibGVuZGluZzogdHJ1ZSwgdXNlckFjdGlvbixcclxuICAgICAgICAgICAgICBmaXJlVXBkYXRlLCBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCwgZHVyYXRpb246IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNjcm9sbFRvSXRlbSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8ocGFyYW1zKTtcclxuICAgICAgICAgICAgaWYgKGVtaXRVcGRhdGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLl8kdXBkYXRlLm5leHQoZ2V0U2Nyb2xsU3RhdGVWZXJzaW9uKHRvdGFsU2l6ZSwgdGhpcy5faXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA6IHNjcm9sbGVyLnNjcm9sbExlZnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbWl0VXBkYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLl8kdXBkYXRlLm5leHQoZ2V0U2Nyb2xsU3RhdGVWZXJzaW9uKHRvdGFsU2l6ZSwgdGhpcy5faXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA6IHNjcm9sbGVyLnNjcm9sbExlZnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgbGV0IHByZXZJdGVtczogSVZpcnR1YWxMaXN0Q29sbGVjdGlvbiA9IFtdO1xyXG4gICAgY29uc3QgZGVib3VuY2VkVXBkYXRlID0gZGVib3VuY2UodXBkYXRlLCAwLCBNQVhfTlVNQkVSU19PRl9TS0lQU19GT1JfUVVBTElUWV9PUFRJTUlaQVRJT05fTFZMMSk7XHJcbiAgICAkdmlld0luaXQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoWyR0cmFja0J5LCB0aGlzLiRpc0luZmluaXR5LCAkc25hcFNjcm9sbFRvU3RhcnQsICRzbmFwU2Nyb2xsVG9FbmQsICRib3VuZHMsICRsaXN0Qm91bmRzLCAkc2Nyb2xsRW5kT2Zmc2V0LCAkYWN0dWFsSXRlbXMsICRpdGVtQ29uZmlnTWFwLCAkc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICRhY3R1YWxJdGVtU2l6ZSwgJGFjdHVhbE1pbkl0ZW1TaXplLCAkYWN0dWFsTWF4SXRlbVNpemUsICRjb2xsYXBzZWRJdGVtSWRzLCAkYnVmZmVyU2l6ZSwgJG1heEJ1ZmZlclNpemUsICRzdGlja3lFbmFibGVkLCAkaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICRkeW5hbWljU2l6ZSwgJGRpdmlkZXMsICRzbmFwVG9JdGVtLCAkc25hcFRvSXRlbUFsaWduLCAkZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiwgJGl0ZW1UcmFuc2Zvcm0sICRhbGlnbm1lbnQsXHJcbiAgICAgICAgICAkcHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0LCAkcHJlY2FsY3VsYXRlZFNjcm9sbEVuZE9mZnNldCwgJGNhY2hlVmVyc2lvbiwgdGhpcy4kZmlyZVVwZGF0ZSxcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICB0YXAoKFtcclxuICAgICAgICAgICAgdHJhY2tCeSwgaXNJbmZpbml0eSwgc25hcFNjcm9sbFRvU3RhcnQsIHNuYXBTY3JvbGxUb0VuZCwgYm91bmRzLCBsaXN0Qm91bmRzLCBzY3JvbGxFbmRPZmZzZXQsIGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCBzY3JvbGxTaXplLCBpdGVtU2l6ZSwgbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgIG1heEl0ZW1TaXplLCBjb2xsYXBzZWRJZHMsIGJ1ZmZlclNpemUsIG1heEJ1ZmZlclNpemUsIHN0aWNreUVuYWJsZWQsIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBkaXZpZGVzLCBzbmFwVG9JdGVtLCBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sIGl0ZW1UcmFuc2Zvcm0sIGFsaWdubWVudCwgcHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0LCBwcmVjYWxjdWxhdGVkU2Nyb2xsRW5kT2Zmc2V0LCBjYWNoZVZlcnNpb24sXHJcbiAgICAgICAgICBdKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHByZXZJdGVtcyAhPT0gaXRlbXMpIHtcclxuICAgICAgICAgICAgICBpdGVtc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHByZXZJdGVtcyA9IGl0ZW1zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVuYWJsZWRPcHRpbWl6YXRpb24gPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5vcHRpbWl6YXRpb24gPz8gREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1Mub3B0aW1pemF0aW9uLFxyXG4gICAgICAgICAgICAgIHZlbG9jaXR5ID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LmF2ZXJhZ2VWZWxvY2l0eSA/PyAwLFxyXG4gICAgICAgICAgICAgIGlzU2Nyb2xsaW5nID0gdGhpcy5fJHNjcm9sbGluZ1RvLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgICAgdXNlRGVib3VuY2VkVXBkYXRlID0gKGR5bmFtaWNTaXplICYmICFpdGVtVHJhbnNmb3JtKSAmJiAhKHNuYXBTY3JvbGxUb0VuZCAmJiB0aGlzLl90cmFja0JveC5pc1NuYXBwZWRUb0VuZCkgJiYgIWl0ZW1zQ2hhbmdlZCAmJiBoYXNVc2VyQWN0aW9uICYmICFpc1Njcm9sbGluZyAmJlxyXG4gICAgICAgICAgICAgICAgKHZlbG9jaXR5ID4gMCAmJiB2ZWxvY2l0eSA8IE1BWF9WRUxPQ0lUWV9GT1JfU0NST0xMX1FVQUxJVFlfT1BUSU1JWkFUSU9OX0xWTDEpO1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZE9wdGltaXphdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmICh1c2VEZWJvdW5jZWRVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgIGRlYm91bmNlZFVwZGF0ZS5leGVjdXRlKHtcclxuICAgICAgICAgICAgICAgICAgdHJhY2tCeSwgaXNJbmZpbml0eSwgc25hcFNjcm9sbFRvU3RhcnQsIHNuYXBTY3JvbGxUb0VuZCwgYm91bmRzOiBib3VuZHMhLCBsaXN0Qm91bmRzOiBsaXN0Qm91bmRzISwgc2Nyb2xsRW5kT2Zmc2V0LCBpdGVtcywgaXRlbUNvbmZpZ01hcCwgc2Nyb2xsU2l6ZSwgaXRlbVNpemUsIG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICBtYXhJdGVtU2l6ZSwgY29sbGFwc2VkSWRzLCBidWZmZXJTaXplLCBtYXhCdWZmZXJTaXplLCBzdGlja3lFbmFibGVkLCBpc1ZlcnRpY2FsLCBkeW5hbWljU2l6ZSwgZGl2aWRlcywgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiwgaXRlbVRyYW5zZm9ybSxcclxuICAgICAgICAgICAgICAgICAgc25hcFRvSXRlbSwgc25hcFRvSXRlbUFsaWduLCBhbGlnbm1lbnQsIHByZWNhbGN1bGF0ZWRTY3JvbGxTdGFydE9mZnNldCwgcHJlY2FsY3VsYXRlZFNjcm9sbEVuZE9mZnNldCwgY2FjaGVWZXJzaW9uLCB1c2VyQWN0aW9uOiBoYXNVc2VyQWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBkZWJvdW5jZWRVcGRhdGUuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgICAgdXBkYXRlKHtcclxuICAgICAgICAgICAgICAgIHRyYWNrQnksIGlzSW5maW5pdHksIHNuYXBTY3JvbGxUb1N0YXJ0LCBzbmFwU2Nyb2xsVG9FbmQsIGJvdW5kczogYm91bmRzISwgbGlzdEJvdW5kczogbGlzdEJvdW5kcyEsIHNjcm9sbEVuZE9mZnNldCwgaXRlbXMsIGl0ZW1Db25maWdNYXAsIHNjcm9sbFNpemUsIGl0ZW1TaXplLCBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1heEl0ZW1TaXplLCBjb2xsYXBzZWRJZHMsIGJ1ZmZlclNpemUsIG1heEJ1ZmZlclNpemUsIHN0aWNreUVuYWJsZWQsIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBkaXZpZGVzLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCBpdGVtVHJhbnNmb3JtLFxyXG4gICAgICAgICAgICAgICAgc25hcFRvSXRlbSwgc25hcFRvSXRlbUFsaWduLCBhbGlnbm1lbnQsIHByZWNhbGN1bGF0ZWRTY3JvbGxTdGFydE9mZnNldCwgcHJlY2FsY3VsYXRlZFNjcm9sbEVuZE9mZnNldCwgY2FjaGVWZXJzaW9uLCB1c2VyQWN0aW9uOiBoYXNVc2VyQWN0aW9uLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHNjcm9sbGVyID0gdGhpcy4kc2Nyb2xsZXIucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIG1hcCh2ID0+IHYhLm5hdGl2ZUVsZW1lbnQpLFxyXG4gICAgICB0YWtlKDEpLFxyXG4gICAgKSxcclxuICAgICAgJHNjcm9sbGVyU2Nyb2xsID0gJHNjcm9sbGVyQ29tcG9uZW50LnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIHN3aXRjaE1hcChzY3JvbGxlciA9PiBzY3JvbGxlciEuJHNjcm9sbCksXHJcbiAgICAgICksXHJcbiAgICAgICRzY3JvbGxlclNjcm9sbEVuZCA9ICRzY3JvbGxlckNvbXBvbmVudC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBzd2l0Y2hNYXAoc2Nyb2xsZXIgPT4gc2Nyb2xsZXIhLiRzY3JvbGxFbmQpLFxyXG4gICAgICApLFxyXG4gICAgICAkc2Nyb2xsYmFyU2Nyb2xsID0gJHNjcm9sbGVyQ29tcG9uZW50LnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIHN3aXRjaE1hcChzY3JvbGxlciA9PiBzY3JvbGxlciEuJHNjcm9sbGJhclNjcm9sbCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9ICh1c2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2UpID0+IHtcclxuICAgICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLl9zY3JvbGxlckNvbXBvbmVudDtcclxuICAgICAgaWYgKCEhc2Nyb2xsZXIpIHtcclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgICAgIHNjcm9sbFNpemUgPSAoaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA6IHNjcm9sbGVyLnNjcm9sbExlZnQpLFxyXG4gICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWFkeUZvclNob3cpIHtcclxuICAgICAgICAgIGlmICh1c2VyQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRwcmV2ZW50U2Nyb2xsU25hcHBpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuXyRzY3JvbGxTaXplLm5leHQoYWN0dWFsU2Nyb2xsU2l6ZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgJHNjcm9sbGVyLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBzd2l0Y2hNYXAoc2Nyb2xsZXIgPT4ge1xyXG4gICAgICAgIHJldHVybiAkc2Nyb2xsYmFyU2Nyb2xsLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgIHRhcCh1c2VyQWN0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJFbCA9IHRoaXMuXyRzY3JvbGxlci5nZXRWYWx1ZSgpPy5uYXRpdmVFbGVtZW50LCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgICAgICBpZiAoISFzY3JvbGxlckVsICYmICEhc2Nyb2xsZXJDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXRTY3JvbGxFdmVudChmYWxzZSwgdGhpcy5fcmVhZHlGb3JTaG93LCBoYXNVc2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgICAgICAgICAgaWYgKHVzZXJBY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmFja0JveC5pc1NuYXBwZWRUb1N0YXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuXyRwcmV2ZW50U2Nyb2xsU25hcHBpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmFja0JveC5pc1NuYXBwZWRUb0VuZCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl8kcHJldmVudFNjcm9sbFNuYXBwaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJHNjcm9sbGVyLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBzd2l0Y2hNYXAoc2Nyb2xsZXIgPT4ge1xyXG4gICAgICAgIHJldHVybiAkc2Nyb2xsZXJTY3JvbGwucGlwZShcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAodXNlckFjdGlvbiA9PiB7XHJcbiAgICAgICAgaGFzVXNlckFjdGlvbiA9IHVzZXJBY3Rpb247XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsZXJFbCA9IHRoaXMuXyRzY3JvbGxlci5nZXRWYWx1ZSgpPy5uYXRpdmVFbGVtZW50LCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICAgIGlmICghIXNjcm9sbGVyRWwgJiYgISFzY3JvbGxlckNvbXBvbmVudCkge1xyXG4gICAgICAgICAgdGhpcy5lbWl0U2Nyb2xsRXZlbnQoZmFsc2UsIHRoaXMuX3JlYWR5Rm9yU2hvdywgdXNlckFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjcm9sbEhhbmRsZXIodXNlckFjdGlvbik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkc2Nyb2xsZXIucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHN3aXRjaE1hcChzY3JvbGxlciA9PiB7XHJcbiAgICAgICAgcmV0dXJuICRzY3JvbGxlclNjcm9sbEVuZC5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCh1c2VyQWN0aW9uID0+IHtcclxuICAgICAgICBoYXNVc2VyQWN0aW9uID0gdXNlckFjdGlvbjtcclxuICAgICAgICBjb25zdCBzY3JvbGxlckVsID0gdGhpcy5fJHNjcm9sbGVyLmdldFZhbHVlKCk/Lm5hdGl2ZUVsZW1lbnQsIHNjcm9sbGVyQ29tcG9uZW50ID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICAgICAgaWYgKCEhc2Nyb2xsZXJFbCAmJiAhIXNjcm9sbGVyQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXRTY3JvbGxFdmVudCh0cnVlLCB0aGlzLl9yZWFkeUZvclNob3csIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY3JvbGxIYW5kbGVyKHVzZXJBY3Rpb24pO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJHNjcm9sbFRvID0gdGhpcy4kc2Nyb2xsVG8sXHJcbiAgICAgICRzY3JvbGxUb0V4ZWN1dG9yID0gdGhpcy4kc2Nyb2xsVG9FeGVjdXRvcjtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFskc2Nyb2xsZXIsICR0cmFja0J5LCAkc2Nyb2xsVG9dKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKFtzY3JvbGxlciwgLCBldmVudF0pID0+ICEhc2Nyb2xsZXIgJiYgISFldmVudCksXHJcbiAgICAgIG1hcCgoW3Njcm9sbGVyLCB0cmFja0J5LCBldmVudF0pID0+ICh7IHNjcm9sbGVyOiBzY3JvbGxlciwgdHJhY2tCeSwgZXZlbnQgfSkpLFxyXG4gICAgICBzd2l0Y2hNYXAoKHsgZXZlbnQgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGQgPSBldmVudD8uZGVsYXkgPz8gMDtcclxuICAgICAgICBpZiAoZCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiBvZihldmVudCkucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIGRlbGF5KGQpLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKGV2ZW50KTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcChldmVudCA9PiB7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbGluZ1RvLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbFRvRXhlY3V0b3IubmV4dChldmVudCk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkc2Nyb2xsVG9FeGVjdXRvci5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgc3dpdGNoTWFwKGV2ZW50ID0+IHtcclxuICAgICAgICBjb25zdCB0cmFja0J5ID0gdGhpcy50cmFja0J5LCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50LFxyXG4gICAgICAgICAgeyBpZCwgaXRlcmF0aW9uID0gMCwgYmxlbmRpbmcgPSBmYWxzZSwgaXNMYXN0SXRlcmF0aW9uID0gZmFsc2UsIGNiIH0gPSBldmVudDtcclxuICAgICAgICBjb25zdCBuZXh0SXRlcmF0aW9uID0gaXRlcmF0aW9uICsgMSwgZmluaXNoZWQgPSBuZXh0SXRlcmF0aW9uID49IE1BWF9TQ1JPTExfVE9fSVRFUkFUSU9OUywgZmlyZVVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtmaW5pc2hlZCwgeyBpZCwgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBibGVuZGluZywgY2IgfV0pLnBpcGUoZGVsYXkoMCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVib3VuY2VkVXBkYXRlLmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl8kcHJldmVudFNjcm9sbFNuYXBwaW5nLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmICghIXNjcm9sbGVyQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC5zdGFydFNjcm9sbFRvKCk7XHJcblxyXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLl8kYWN0dWFsSXRlbXMuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgIGlmICghIWl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUsIGl0ZW1TaXplID0gdGhpcy5hY3R1YWxJdGVtU2l6ZSwgbWluSXRlbVNpemUgPSB0aGlzLmFjdHVhbE1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgIG1heEl0ZW1TaXplID0gdGhpcy5hY3R1YWxNYXhJdGVtU2l6ZSwgc25hcFNjcm9sbFRvRW5kID0gdGhpcy5zbmFwU2Nyb2xsVG9FbmQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuXyRib3VuZHMuZ2V0VmFsdWUoKSB8fCB7IHdpZHRoOiBERUZBVUxUX0xJU1RfU0laRSwgaGVpZ2h0OiBERUZBVUxUX0xJU1RfU0laRSB9LFxyXG4gICAgICAgICAgICAgICAgaXRlbUNvbmZpZ01hcCA9IHRoaXMuaXRlbUNvbmZpZ01hcCwgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyBzY3JvbGxlckNvbXBvbmVudC5zY3JvbGxUb3AgOiBzY3JvbGxlckNvbXBvbmVudC5zY3JvbGxMZWZ0LFxyXG4gICAgICAgICAgICAgICAgb3B0czogSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnM8SVZpcnR1YWxMaXN0SXRlbSwgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbj4gPSB7XHJcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogdGhpcy5fJGFjdHVhbEFsaWdubWVudC5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgICBib3VuZHM6IHsgd2lkdGgsIGhlaWdodCB9LCBjb2xsZWN0aW9uOiBpdGVtcywgZHluYW1pY1NpemUsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsIGl0ZW1TaXplLCBtaW5JdGVtU2l6ZSwgbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuYnVmZmVyU2l6ZSwgbWF4QnVmZmVyU2l6ZTogdGhpcy5tYXhCdWZmZXJTaXplLCBpdGVtVHJhbnNmb3JtOiB0aGlzLml0ZW1UcmFuc2Zvcm0sXHJcbiAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemU6IChpc1ZlcnRpY2FsID8gc2Nyb2xsZXJDb21wb25lbnQuc2Nyb2xsVG9wIDogc2Nyb2xsZXJDb21wb25lbnQuc2Nyb2xsTGVmdCksXHJcbiAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW06IHRoaXMuc25hcFRvSXRlbSwgc25hcFRvSXRlbUFsaWduOiB0aGlzLnNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgICAgICAgICAgICAgc3RpY2t5RW5hYmxlZDogdGhpcy5zdGlja3lFbmFibGVkLCBmcm9tSXRlbUlkOiBpZCwgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbjogdGhpcy5lbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IHNjcm9sbFNpemUgPSBzbmFwU2Nyb2xsVG9FbmQgJiYgdGhpcy5fdHJhY2tCb3guaXNTbmFwcGVkVG9FbmQgP1xyXG4gICAgICAgICAgICAgICAgKGlzVmVydGljYWwgPyBzY3JvbGxlckNvbXBvbmVudC5zY3JvbGxIZWlnaHQgOiBzY3JvbGxlckNvbXBvbmVudC5zY3JvbGxXaWR0aCkgOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3guZ2V0SXRlbVBvc2l0aW9uKGlkLCBpdGVtQ29uZmlnTWFwLCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW2ZpbmlzaGVkLCB7IGlkLCBibGVuZGluZywgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBjYiB9XSkucGlwZShkZWxheSgwKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IChpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgeyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZSwgbGVmdExheW91dE9mZnNldCB9ID0gdGhpcy5fdHJhY2tCb3gudXBkYXRlQ29sbGVjdGlvbihpdGVtcywgaXRlbUNvbmZpZ01hcCwge1xyXG4gICAgICAgICAgICAgICAgICAuLi5vcHRzLCBzY3JvbGxTaXplLCBmcm9tSXRlbUlkOiBpc0xhc3RJdGVyYXRpb24gPyB1bmRlZmluZWQgOiBpZCxcclxuICAgICAgICAgICAgICAgIH0pLCBkZWx0YTEgPSB0aGlzLl90cmFja0JveC5kZWx0YTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRvdGFsU2l6ZSA9IHRvdGFsU2l6ZSA8IHZpZXdwb3J0U2l6ZSA/IHZpZXdwb3J0U2l6ZSA6IHRvdGFsU2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgc2Nyb2xsZXJDb21wb25lbnQuc3RhcnRMYXlvdXRPZmZzZXQgPSBsZWZ0TGF5b3V0T2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudC50b3RhbFNpemUgPSBub3JtYWxpemVkVG90YWxTaXplO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLmNvbGxlY3Rpb24gPSBkaXNwbGF5SXRlbXM7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSArIGRlbHRhMTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5yZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbCwgbm9ybWFsaXplZFRvdGFsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy50cmFja2luZygpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnNuYXBwaW5nSGFuZGxlcigpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldHNCeUFsbGlnbm1lbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IHRoaXMuX3RyYWNrQm94LmdldEl0ZW1Qb3NpdGlvbihpZCwgaXRlbUNvbmZpZ01hcCwgeyAuLi5vcHRzLCBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLCBmcm9tSXRlbUlkOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW2ZpbmlzaGVkLCB7IGlkLCBibGVuZGluZywgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBjYiB9XSkucGlwZShkZWxheSgwKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IG5vdENoYW5nZWQgPSBzY3JvbGxTaXplID09PSBjdXJyZW50U2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICBpZiAoIW5vdENoYW5nZWQgJiYgaXRlcmF0aW9uIDwgTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXM6IElTY3JvbGxUb1BhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgICAgW2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBzY3JvbGxTaXplLCBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvcixcclxuICAgICAgICAgICAgICAgICAgZmlyZVVwZGF0ZSwgYmxlbmRpbmcsIGZvcmNlOiB0cnVlLCBzbmFwOiBmYWxzZSwgbm9ybWFsaXplOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNvbXBvbmVudD8uc2Nyb2xsVG8/LihwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtmaW5pc2hlZCwge1xyXG4gICAgICAgICAgICAgICAgICBpZCwgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBibGVuZGluZyxcclxuICAgICAgICAgICAgICAgICAgaXNMYXN0SXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uIDwgTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TLCBjYlxyXG4gICAgICAgICAgICAgICAgfV0pLnBpcGUoZGVsYXkoMCkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsU2l6ZS5uZXh0KGFjdHVhbFNjcm9sbFNpemUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFt0cnVlLCB7IGlkLCBibGVuZGluZywgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBjYiB9XSkucGlwZShkZWxheSgwKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbVt0cmFja0J5XSA9PT0gaWQpO1xyXG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5faXNWZXJ0aWNhbCwgaXRlbVNpemUgPSB0aGlzLmFjdHVhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFNpemUgPSBpbmRleCAqIGl0ZW1TaXplO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zbmFwVG9JdGVtQWxpZ24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSArPSBpdGVtU2l6ZSAqIC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuXyRib3VuZHMuZ2V0VmFsdWUoKSB8fCB7IHdpZHRoOiBERUZBVUxUX0xJU1RfU0laRSwgaGVpZ2h0OiBERUZBVUxUX0xJU1RfU0laRSB9LFxyXG4gICAgICAgICAgICAgICAgICBpdGVtQ29uZmlnTWFwID0gdGhpcy5pdGVtQ29uZmlnTWFwLCBpdGVtcyA9IHRoaXMuXyRhY3R1YWxJdGVtcy5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgICBvcHRzOiBJR2V0SXRlbVBvc2l0aW9uT3B0aW9uczxJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uPiA9IHtcclxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IHRoaXMuXyRhY3R1YWxBbGlnbm1lbnQuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHsgd2lkdGgsIGhlaWdodCB9LCBjb2xsZWN0aW9uOiBpdGVtcywgZHluYW1pY1NpemUsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsIGl0ZW1TaXplLCBtaW5JdGVtU2l6ZSwgbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZTogdGhpcy5idWZmZXJTaXplLCBtYXhCdWZmZXJTaXplOiB0aGlzLm1heEJ1ZmZlclNpemUsIGl0ZW1UcmFuc2Zvcm06IHRoaXMuaXRlbVRyYW5zZm9ybSxcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplOiAoaXNWZXJ0aWNhbCA/IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbFRvcCA6IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbExlZnQpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW06IHRoaXMuc25hcFRvSXRlbSwgc25hcFRvSXRlbUFsaWduOiB0aGlzLnNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lFbmFibGVkOiB0aGlzLnN0aWNreUVuYWJsZWQsIGZyb21JdGVtSWQ6IGlkLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uOiB0aGlzLmVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCb3guY2xlYXJEZWx0YSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IChpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgICB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplLCBsZWZ0TGF5b3V0T2Zmc2V0IH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBpdGVtQ29uZmlnTWFwLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0cywgc2Nyb2xsU2l6ZSwgZnJvbUl0ZW1JZDogaXNMYXN0SXRlcmF0aW9uID8gdW5kZWZpbmVkIDogaWQsXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRoaXMuaXNJbmZpbml0eSA/ICh0b3RhbFNpemUgKyB2aWV3cG9ydFNpemUpIDogdG90YWxTaXplO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUb3RhbFNpemUgPSBhY3R1YWxUb3RhbFNpemUgPCB2aWV3cG9ydFNpemUgPyB2aWV3cG9ydFNpemUgOiBhY3R1YWxUb3RhbFNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXJDb21wb25lbnQuc3RhcnRMYXlvdXRPZmZzZXQgPSBsZWZ0TGF5b3V0T2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50LnRvdGFsU2l6ZSA9IG5vcm1hbGl6ZWRUb3RhbFNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZS5jb2xsZWN0aW9uID0gZGlzcGxheUl0ZW1zO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRCb3VuZHNTaXplKGlzVmVydGljYWwsIG5vcm1hbGl6ZWRUb3RhbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNraW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zbmFwcGluZ0hhbmRsZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldHNCeUFsbGlnbm1lbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kcHJldmVudFNjcm9sbFNuYXBwaW5nLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogc2Nyb2xsU2l6ZSwgZmlyZVVwZGF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yLCBibGVuZGluZywgZm9yY2U6IHRydWUsIHNuYXA6IGZhbHNlLCBub3JtYWxpemU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ29tcG9uZW50Py5zY3JvbGxUbz8uKHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW3RydWUsIHsgaWQsIGJsZW5kaW5nLCBpdGVyYXRpb246IG5leHRJdGVyYXRpb24sIGNiIH1dKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKFtmaW5pc2hlZCwgeyBpZCwgaXRlcmF0aW9uOiBuZXh0SXRlcmF0aW9uLCBibGVuZGluZywgY2IgfV0pO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCgoW2ZpbmlzaGVkLCBwYXJhbXNdKSA9PiB7XHJcbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fJHNjcm9sbFRvRXhlY3V0b3IubmV4dChwYXJhbXMgYXMgSVNjcm9sbFBhcmFtcyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5wcmV2ZW50U2Nyb2xsU25hcHBpbmcodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl8kc2Nyb2xsaW5nVG8ubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LmZpbmlzaGVkU2Nyb2xsVG8oKTtcclxuICAgICAgICB0aGlzLl8kZmlyZVVwZGF0ZS5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZW1pdFNjcm9sbEV2ZW50KHRydWUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICBjb25zdCBzY3JvbGxQYXJhbXMgPSBwYXJhbXMgYXMgSVNjcm9sbFBhcmFtcyAmIHsgc2Nyb2xsQ2FsbGVkOiBib29sZWFuOyB9O1xyXG4gICAgICAgIHNjcm9sbFBhcmFtcz8uY2I/LigpO1xyXG4gICAgICB9KSxcclxuICAgICAgZGVsYXkoMCksXHJcbiAgICAgIHRhcCgoW2ZpbmlzaGVkXSkgPT4ge1xyXG4gICAgICAgIGlmIChmaW5pc2hlZCkge1xyXG4gICAgICAgICAgdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnNuYXBJZk5lZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zdCAkaXRlbVJlbmRlcmVyID0gdGhpcy4kaXRlbVJlbmRlcmVyO1xyXG5cclxuICAgICRpdGVtUmVuZGVyZXIucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl8kaXRlbVJlbmRlcmVyLm5leHQodik7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkYm91bmRzLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICB0YXAodmFsdWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNpemU6IElTaXplID0geyB3aWR0aDogdmFsdWUhLndpZHRoLCBoZWlnaHQ6IHZhbHVlIS5oZWlnaHQgfTtcclxuICAgICAgICB0aGlzLm9uVmlld3BvcnRDaGFuZ2UuZW1pdChvYmplY3RBc1JlYWRvbmx5KHNpemUpKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuX3NlcnZpY2UuJHZpcnR1YWxDbGljay5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMub25JdGVtQ2xpY2suZW1pdChvYmplY3RBc1JlYWRvbmx5KHYpKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGxldCBpc1NlbGVjdGVkSWRzRmlyc3RFbWl0ID0gMDtcclxuXHJcbiAgICB0aGlzLl9zZXJ2aWNlLiRzZWxlY3RlZElkcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1NpbmdsZVNlbGVjdGlvbiB8fCAodGhpcy5faXNNdWx0aVNlbGVjdGlvbiAmJiBpc1NlbGVjdGVkSWRzRmlyc3RFbWl0ID49IDIpKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXJyID0gdGhpcy5zZWxlY3RlZElkcztcclxuICAgICAgICAgIGlmICgodGhpcy5faXNTaW5nbGVTZWxlY3Rpb24gJiYgSlNPTi5zdHJpbmdpZnkodikgIT09IEpTT04uc3RyaW5naWZ5KGN1cnIpKSB8fFxyXG4gICAgICAgICAgICAoaXNTZWxlY3RlZElkc0ZpcnN0RW1pdCA9PT0gMiAmJiBKU09OLnN0cmluZ2lmeSh2KSAhPT0gSlNPTi5zdHJpbmdpZnkoY3VycikpIHx8IGlzU2VsZWN0ZWRJZHNGaXJzdEVtaXQgPiAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3QuZW1pdChjb3B5VmFsdWVBc1JlYWRvbmx5KHYpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWRJZHNGaXJzdEVtaXQgPCAzKSB7XHJcbiAgICAgICAgICBpc1NlbGVjdGVkSWRzRmlyc3RFbWl0Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJHNlbGVjdGVkSWRzLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2VydmljZS5zZWxlY3RlZElkcyA9IHY7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkdmlld0luaXQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGZpbHRlcih2ID0+ICEhdiksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UuJGNvbGxhcHNlZElkcy5waXBlKFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyID0gdGhpcy5fJGNvbGxhcHNlZEl0ZW1JZHMuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgaWYgKCh0aGlzLl9pc0FjY29yZGlvbkNvbGxhcHNlIHx8IHRoaXMuX2lzTXVsdGlwbGVDb2xsYXBzZSkgJiYgKEpTT04uc3RyaW5naWZ5KHYpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyKSkpIHtcclxuICAgICAgICAgICAgICB0aGlzLl8kY29sbGFwc2VkSXRlbUlkcy5uZXh0KHYpO1xyXG4gICAgICAgICAgICAgIHRoaXMub25Db2xsYXBzZS5lbWl0KGNvcHlWYWx1ZUFzUmVhZG9ubHkodikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJGl0ZW1Db25maWdNYXAsICRkeW5hbWljU2l6ZSwgJGRpdmlkZXNdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZmlsdGVyKChbaXRlbUNvbmZpZ01hcCwgZHluYW1pY1NpemUsIGRpdmlkZXNdKSA9PiAhIWl0ZW1Db25maWdNYXAgJiYgIWR5bmFtaWNTaXplICYmIGRpdmlkZXMgPiAxKSxcclxuICAgICAgdGFwKChbaXRlbUNvbmZpZ01hcF0pID0+IHtcclxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGl0ZW1Db25maWdNYXApIHtcclxuICAgICAgICAgIGNvbnN0IG1ldGFEYXRhID0gaXRlbUNvbmZpZ01hcFtpZF07XHJcbiAgICAgICAgICBpZiAobWV0YURhdGE/LmZ1bGxTaXplIHx8IG1ldGFEYXRhPy5zdGlja3kgPT09IDEgfHwgbWV0YURhdGE/LnN0aWNreSA9PT0gMikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIGFjY2VsZXJhdGVkIHJlbmRlcmluZyBhbGdvcml0aG0gYFtkeW5hbWljU2l6ZV09XCJmYWxzZVwiYCBjYW5ub3QgY29ycmVjdGx5IGhhbmRsZSBub24tdW5pZm9ybSBsaXN0cyAodGhlIGl0ZW1Db25maWdNYXAgc3BlY2lmaWVzIGZ1bGwtc2l6ZSBlbGVtZW50cykuIEZvciBjb3JyZWN0IHJlbmRlcmluZywgc3BlY2lmeSBgW2R5bmFtaWNTaXplXT1cInRydWVcImAuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbJGNvbGxhcHNpbmdNb2RlLCAkaXRlbXMsICRpdGVtQ29uZmlnTWFwLCAkdHJhY2tCeV0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoKFtjb2xsYXBzaW5nTW9kZSwgaXRlbXMsIGl0ZW1Db25maWdNYXAsIHRyYWNrQnldKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXNBY2NvcmRpb24gPSBpc0NvbGxhcHNlTW9kZShjb2xsYXBzaW5nTW9kZSwgQ29sbGFwc2luZ01vZGVzLkFDQ09SRElPTik7XHJcbiAgICAgICAgaWYgKGlzQWNjb3JkaW9uKSB7XHJcbiAgICAgICAgICBjb25zdCBhbGxHcm91cHM6IEFycmF5PElkPiA9IFtdO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2lzQWNjb3JkaW9uQ29sbGFwc2UpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV0sIGlkID0gaXRlbVt0cmFja0J5XSwgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwPy5baWRdPy5jb2xsYXBzYWJsZSA9PT0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoIWNvbGxhcHNhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYWxsR3JvdXBzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoKHRoaXMuX2lzQWNjb3JkaW9uQ29sbGFwc2UgfHwgdGhpcy5faXNNdWx0aXBsZUNvbGxhcHNlKSAmJiAoSlNPTi5zdHJpbmdpZnkodGhpcy5fJGNvbGxhcHNlZEl0ZW1JZHMuZ2V0VmFsdWUoKSkgIT09IEpTT04uc3RyaW5naWZ5KGFsbEdyb3VwcykpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRjb2xsYXBzZWRJdGVtSWRzLm5leHQoYWxsR3JvdXBzKTtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbGxhcHNlLmVtaXQoY29weVZhbHVlQXNSZWFkb25seShhbGxHcm91cHMpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkY29sbGFwc2VkSXRlbUlkcy5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3NlcnZpY2UuY29sbGFwc2VkSWRzID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuJGRlc3Ryb3kucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgZGVib3VuY2VkVXBkYXRlLmRpc3Bvc2UoKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuXyR2aWV3SW5pdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuXyRmaXJlVXBkYXRlLm5leHQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkFmdGVyUmVzaXplKHVwZGF0ZSA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLnNuYXBwaW5nSGFuZGxlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVSZWd1bGFyUmVuZGVyZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fcmVhZHlGb3JTaG93ICYmIHVwZGF0ZSkge1xyXG4gICAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgICBpZiAoISFzY3JvbGxlcikge1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWJhbGUgPSB0aGlzLl9yZWFkeUZvclNob3c7XHJcbiAgICAgICAgaWYgKHVwZGF0ZWJhbGUpIHtcclxuICAgICAgICAgIHRoaXMuXyRmaXJlVXBkYXRlLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzY3JvbGxlci5yZWZyZXNoKHVwZGF0ZWJhbGUsIHVwZGF0ZWJhbGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoZWNrQm91bmRzT2ZFbGVtZW50cygpIHtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl90cmFja0JveC5jaGVja0JvdW5kc09mRWxlbWVudHMoKTtcclxuICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgIGNvbnN0IHJlYWR5Rm9yU2hvdyA9IHRoaXMuX3JlYWR5Rm9yU2hvdyxcclxuICAgICAgICBpc1Njcm9sbGluZyA9IHRoaXMuXyRzY3JvbGxpbmdUby5nZXRWYWx1ZSgpO1xyXG4gICAgICB0aGlzLl90cmFja0JveC5jaGFuZ2VzKHRydWUsIHJlYWR5Rm9yU2hvdyAmJiAhaXNTY3JvbGxpbmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzbmFwcGluZ0hhbmRsZXIoKSB7XHJcbiAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgaWYgKCEhc2Nyb2xsZXIpIHtcclxuICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuaXNWZXJ0aWNhbCxcclxuICAgICAgICBtYXhTY3JvbGxTaXplID0gTWF0aC5yb3VuZChpc1ZlcnRpY2FsID8gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0ID8/IDAgOiBzY3JvbGxlci5zY3JvbGxXaWR0aCA/PyAwKSxcclxuICAgICAgICBzY3JvbGxTaXplID0gaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA/PyAwIDogc2Nyb2xsZXIuc2Nyb2xsTGVmdCA/PyAwLFxyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBNYXRoLnJvdW5kKHNjcm9sbFNpemUpO1xyXG4gICAgICBpZiAodGhpcy5fcmVhZHlGb3JTaG93ICYmICF0aGlzLl9pc0xvYWRpbmcpIHtcclxuICAgICAgICBjb25zdCBpc1Njcm9sbEVuZCA9IChhY3R1YWxTY3JvbGxTaXplID49IChtYXhTY3JvbGxTaXplIC0gTUlOX1BJWEVMU19GT1JfUFJFVkVOVF9TTkFQUElORykpIHx8ICFzY3JvbGxlci5zY3JvbGxhYmxlIHx8IHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kO1xyXG4gICAgICAgIGlmIChpc1Njcm9sbEVuZCkge1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl8kaXNTY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaXNTY3JvbGxTdGFydCA9IChhY3R1YWxTY3JvbGxTaXplIDw9IE1JTl9QSVhFTFNfRk9SX1BSRVZFTlRfU05BUFBJTkcpO1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dChpc1Njcm9sbFN0YXJ0KTtcclxuICAgICAgICAgIHRoaXMuXyRpc1Njcm9sbEVuZC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSBpc1Njcm9sbFN0YXJ0O1xyXG4gICAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxFbmQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3JlYWR5Rm9yU2hvdykge1xyXG4gICAgICAgIGNvbnN0IHNuYXBTY3JvbGxUb1N0YXJ0ID0gdGhpcy5fJGFjdHVhbFNuYXBTY3JvbGxUb1N0YXJ0LmdldFZhbHVlKCksIHNuYXBTY3JvbGxUb0VuZCA9IHRoaXMuXyRhY3R1YWxTbmFwU2Nyb2xsVG9FbmQuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoIXNuYXBTY3JvbGxUb1N0YXJ0ICYmIHNuYXBTY3JvbGxUb0VuZCkge1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl8kaXNTY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNuYXBTY3JvbGxUb1N0YXJ0ICYmIHNuYXBTY3JvbGxUb0VuZCkge1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuXyRpc1Njcm9sbEVuZC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxFbmQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl8kaXNTY3JvbGxFbmQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5pc1Njcm9sbFN0YXJ0ID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5pc1Njcm9sbEVuZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgZW1pdFNjcm9sbEV2ZW50KGlzU2Nyb2xsRW5kOiBib29sZWFuID0gZmFsc2UsIHVwZGF0ZTogYm9vbGVhbiA9IHRydWUsIHVzZXJBY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKCF0aGlzLl9yZWFkeUZvclNob3cpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2Nyb2xsZXJFbCA9IHRoaXMuXyRzY3JvbGxlci5nZXRWYWx1ZSgpPy5uYXRpdmVFbGVtZW50LCBzY3JvbGxlckNvbXBvbmVudCA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgaWYgKHNjcm9sbGVyRWwgJiYgc2Nyb2xsZXJDb21wb25lbnQpIHtcclxuICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsIHNjcm9sbFNpemUgPSAoaXNWZXJ0aWNhbCA/IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbFRvcCA6IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbExlZnQpLFxyXG4gICAgICAgIG1heFNjcm9sbFNpemUgPSAoaXNWZXJ0aWNhbCA/IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbEhlaWdodCA6IHNjcm9sbGVyQ29tcG9uZW50LnNjcm9sbFdpZHRoKSxcclxuICAgICAgICBib3VuZHMgPSB0aGlzLl8kYm91bmRzLmdldFZhbHVlKCkgfHwgeyB4OiAwLCB5OiAwLCB3aWR0aDogREVGQVVMVF9MSVNUX1NJWkUsIGhlaWdodDogREVGQVVMVF9MSVNUX1NJWkUgfTtcclxuICAgICAgY29uc3QgaXRlbXNSYW5nZSA9IGZvcm1hdEFjdHVhbERpc3BsYXlJdGVtcyh0aGlzLl9zZXJ2aWNlLmRpc3BsYXlJdGVtcywgdGhpcy5fJGFjdHVhbFNjcm9sbFN0YXJ0T2Zmc2V0LmdldFZhbHVlKCksIHRoaXMuXyRhY3R1YWxTY3JvbGxFbmRPZmZzZXQuZ2V0VmFsdWUoKSxcclxuICAgICAgICBzY3JvbGxTaXplLCBpc1ZlcnRpY2FsLCBib3VuZHMpLFxyXG4gICAgICAgIGV2ZW50ID0gbmV3IFNjcm9sbEV2ZW50KHtcclxuICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ/LnNjcm9sbERpcmVjdGlvbiA/PyAwLCBjb250YWluZXI6IHNjcm9sbGVyRWwsXHJcbiAgICAgICAgICBsaXN0OiB0aGlzLl8kbGlzdC5nZXRWYWx1ZSgpIS5uYXRpdmVFbGVtZW50LCBkZWx0YTogdGhpcy5fdHJhY2tCb3guZGVsdGEsXHJcbiAgICAgICAgICBkZWx0YU9mTmV3SXRlbXM6IHRoaXMuX3RyYWNrQm94LmRlbHRhT2ZOZXdJdGVtcywgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgIHNjcm9sbFNpemUsXHJcbiAgICAgICAgICBpdGVtc1JhbmdlLFxyXG4gICAgICAgICAgaXNFbmQ6ICFzY3JvbGxlckNvbXBvbmVudC5zY3JvbGxhYmxlIHx8IHRoaXMuX3RyYWNrQm94LmlzU25hcHBlZFRvRW5kIHx8IChNYXRoLnJvdW5kKHNjcm9sbFNpemUpID09PSBNYXRoLnJvdW5kKG1heFNjcm9sbFNpemUpKSxcclxuICAgICAgICAgIHVzZXJBY3Rpb24sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIGlmICh1cGRhdGUpIHtcclxuICAgICAgICB0aGlzLl8kc2Nyb2xsLm5leHQoZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaXNTY3JvbGxFbmQpIHtcclxuICAgICAgICB0aGlzLm9uU2Nyb2xsRW5kLmVtaXQoZXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub25TY3JvbGwuZW1pdChldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkKG0/OiBTbmFwcGluZ01ldGhvZCkge1xyXG4gICAgY29uc3QgbWV0aG9kID0gbSB8fCB0aGlzLnNuYXBwaW5nTWV0aG9kO1xyXG4gICAgcmV0dXJuIGlzU25hcHBpbmdNZXRob2RBZHZlbmNlZChtZXRob2QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc05vbmVTZWxlY3Rpb24obT86IFNlbGVjdGluZ01vZGUpIHtcclxuICAgIGNvbnN0IG1vZGUgPSBtIHx8IHRoaXMuc2VsZWN0aW5nTW9kZTtcclxuICAgIHJldHVybiBpc1NlbGVjdE1vZGUobW9kZSwgU2VsZWN0aW5nTW9kZXMuTk9ORSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldElzU2luZ2xlU2VsZWN0aW9uKG0/OiBTZWxlY3RpbmdNb2RlKSB7XHJcbiAgICBjb25zdCBtb2RlID0gbSB8fCB0aGlzLnNlbGVjdGluZ01vZGU7XHJcbiAgICByZXR1cm4gaXNTZWxlY3RNb2RlKG1vZGUsIFNlbGVjdGluZ01vZGVzLlNFTEVDVCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldElzTXVsdGlTZWxlY3Rpb24obT86IFNlbGVjdGluZ01vZGUpIHtcclxuICAgIGNvbnN0IG1vZGUgPSBtIHx8IHRoaXMuc2VsZWN0aW5nTW9kZTtcclxuICAgIHJldHVybiBpc1NlbGVjdE1vZGUobW9kZSwgU2VsZWN0aW5nTW9kZXMuTVVMVElfU0VMRUNUKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNOb25lQ29sbGFwc2UobT86IENvbGxhcHNpbmdNb2RlKSB7XHJcbiAgICBjb25zdCBtb2RlID0gbSB8fCB0aGlzLmNvbGxhcHNpbmdNb2RlO1xyXG4gICAgcmV0dXJuIGlzQ29sbGFwc2VNb2RlKG1vZGUsIENvbGxhcHNpbmdNb2Rlcy5OT05FKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNNdWx0aXBsZUNvbGxhcHNlKG0/OiBDb2xsYXBzaW5nTW9kZSkge1xyXG4gICAgY29uc3QgbW9kZSA9IG0gfHwgdGhpcy5jb2xsYXBzaW5nTW9kZTtcclxuICAgIHJldHVybiBpc0NvbGxhcHNlTW9kZShtb2RlLCBDb2xsYXBzaW5nTW9kZXMuTVVMVElfQ09MTEFQU0UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc0FjY29yZGlvbkNvbGxhcHNlKG0/OiBDb2xsYXBzaW5nTW9kZSkge1xyXG4gICAgY29uc3QgbW9kZSA9IG0gfHwgdGhpcy5jb2xsYXBzaW5nTW9kZTtcclxuICAgIHJldHVybiBpc0NvbGxhcHNlTW9kZShtb2RlLCBDb2xsYXBzaW5nTW9kZXMuQUNDT1JESU9OKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNWZXJ0aWNhbChkPzogRGlyZWN0aW9uKSB7XHJcbiAgICBjb25zdCBkaXIgPSBkIHx8IHRoaXMuZGlyZWN0aW9uO1xyXG4gICAgcmV0dXJuIGlzRGlyZWN0aW9uKGRpciwgRGlyZWN0aW9ucy5WRVJUSUNBTCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldElzTGF6eShtPzogQ29sbGVjdGlvbk1vZGUpIHtcclxuICAgIGNvbnN0IG1vZGUgPSBtIHx8IHRoaXMuY29sbGVjdGlvbk1vZGU7XHJcbiAgICByZXR1cm4gaXNDb2xsZWN0aW9uTW9kZShtb2RlLCBDb2xsZWN0aW9uTW9kZXMuTEFaWSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IG51bGwpIHtcclxuICAgIGlmICghZGlzcGxheUl0ZW1zIHx8ICF0aGlzLl9saXN0Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LnNldERpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQoe30pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZCAmJiB0aGlzLnN0aWNreUVuYWJsZWQpIHtcclxuICAgICAgaWYgKHRoaXMuX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50cy5sZW5ndGggPCBNQVhfUkVHVUxBUl9TTkFQRURfQ09NUE9ORU5UUyAmJiAhIXRoaXMuX3NuYXBDb250YWluZXJSZWYpIHtcclxuICAgICAgICB3aGlsZSAodGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA8IE1BWF9SRUdVTEFSX1NOQVBFRF9DT01QT05FTlRTKSB7XHJcbiAgICAgICAgICBjb25zdCBjb21wID0gdGhpcy5fc25hcENvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQodGhpcy5faXRlbUNvbXBvbmVudENsYXNzKTtcclxuICAgICAgICAgIGNvbXAuaW5zdGFuY2UucmVuZGVyZXIgPSB0aGlzLl8kaXRlbVJlbmRlcmVyLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICBjb21wLmluc3RhbmNlLnJlZ3VsYXIgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzLnB1c2goY29tcCk7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5zbmFwcGVkRGlzcGxheUNvbXBvbmVudHMgPSB0aGlzLl9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHM7XHJcbiAgICAgICAgICB0aGlzLl9yZXNpemVTbmFwcGVkT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5fcmVzaXplU25hcHBlZENvbXBvbmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgdGhpcy5fcmVzaXplU25hcHBlZE9ic2VydmVyLm9ic2VydmUoY29tcC5pbnN0YW5jZS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl90cmFja0JveC5pdGVtcyA9IGRpc3BsYXlJdGVtcztcclxuXHJcbiAgICBjb25zdCBsaXN0Q29udGFpbmVyUmVmID0gdGhpcy5fbGlzdENvbnRhaW5lclJlZjtcclxuXHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSBkaXNwbGF5SXRlbXMubGVuZ3RoLCBjb21wb25lbnRzID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHM7XHJcblxyXG4gICAgaWYgKCEhbGlzdENvbnRhaW5lclJlZikge1xyXG4gICAgICBjb25zdCBkb01hcDogeyBbaWQ6IG51bWJlcl06IG51bWJlciB9ID0ge307XHJcbiAgICAgIGxldCBpID0gMDtcclxuICAgICAgZm9yIChsZXQgbCA9IGNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGNvbXBvbmVudHNbaV07XHJcbiAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgY29uc3QgaWQgPSBpdGVtLmluc3RhbmNlLmlkO1xyXG4gICAgICAgICAgaXRlbS5pbnN0YW5jZS5yZW5kZXJlciA9IHRoaXMuXyRpdGVtUmVuZGVyZXIuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgIGRvTWFwW2lkXSA9IGk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChjb21wb25lbnRzLmxlbmd0aCA8IG1heExlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSBsaXN0Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudCh0aGlzLl9pdGVtQ29tcG9uZW50Q2xhc3MpO1xyXG4gICAgICAgIGNvbnN0IGlkID0gY29tcC5pbnN0YW5jZS5pZDtcclxuICAgICAgICBjb21wLmluc3RhbmNlLnJlbmRlcmVyID0gdGhpcy5fJGl0ZW1SZW5kZXJlci5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGRvTWFwW2lkXSA9IGk7XHJcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXApO1xyXG4gICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl90cmFja0JveC5zZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKGRvTWFwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlT2Zmc2V0c0J5QWxsaWdubWVudCgpIHtcclxuICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuXyRhY3R1YWxBbGlnbm1lbnQuZ2V0VmFsdWUoKSwgaXRlbXMgPSB0aGlzLl8kYWN0dWFsSXRlbXMuZ2V0VmFsdWUoKSwgdHJhY2tCeSA9IHRoaXMudHJhY2tCeSxcclxuICAgICAgaXNJbmZpbml0eSA9IHRoaXMuaXNJbmZpbml0eSwgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgIHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5fJGJvdW5kcy5nZXRWYWx1ZSgpIHx8IHsgd2lkdGg6IERFRkFVTFRfTElTVF9TSVpFLCBoZWlnaHQ6IERFRkFVTFRfTElTVF9TSVpFIH0sXHJcbiAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCxcclxuICAgICAgcHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0ID0gdGhpcy5fJHByZWNhbGN1bGF0ZWRTY3JvbGxTdGFydE9mZnNldC5nZXRWYWx1ZSgpLFxyXG4gICAgICBwcmVjYWxjdWxhdGVkU2Nyb2xsRW5kT2Zmc2V0ID0gdGhpcy5fJHByZWNhbGN1bGF0ZWRTY3JvbGxFbmRPZmZzZXQuZ2V0VmFsdWUoKTtcclxuICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XHJcbiAgICAgIGNhc2UgQWxpZ25tZW50cy5OT05FOiB7XHJcbiAgICAgICAgdGhpcy5fJGFjdHVhbFNjcm9sbFN0YXJ0T2Zmc2V0Lm5leHQocHJlY2FsY3VsYXRlZFNjcm9sbFN0YXJ0T2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl8kYWN0dWFsU2Nyb2xsRW5kT2Zmc2V0Lm5leHQocHJlY2FsY3VsYXRlZFNjcm9sbEVuZE9mZnNldCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBBbGlnbm1lbnRzLkNFTlRFUjoge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbUlkOiBJZCB8IG51bGwgPSBpdGVtcy5sZW5ndGggPiAwID8gKGl0ZW1zWzBdPy5bdHJhY2tCeV0gPz8gbnVsbCkgOiBudWxsLFxyXG4gICAgICAgICAgZW5kSXRlbUlkOiBJZCB8IG51bGwgPSBpdGVtcy5sZW5ndGggPiAwID8gKGl0ZW1zPy5baXRlbXMubGVuZ3RoIC0gMV0/Llt0cmFja0J5XSA/PyBudWxsKSA6IG51bGwsXHJcbiAgICAgICAgICBhbGlnbm1lbnRTdGFydE9mZnNldCA9IHZpZXdwb3J0U2l6ZSAqIC41IC0gKGZpcnN0SXRlbUlkICE9PSBudWxsID8gKGlzVmVydGljYWwgPyAodGhpcy5fc2VydmljZS5nZXRJdGVtQm91bmRzKGZpcnN0SXRlbUlkKT8uaGVpZ2h0ID8/IDApIDpcclxuICAgICAgICAgICAgKHRoaXMuX3NlcnZpY2UuZ2V0SXRlbUJvdW5kcyhmaXJzdEl0ZW1JZCk/LndpZHRoID8/IDApKSA6IDApICogKGlzSW5maW5pdHkgPyAwIDogLjUpLFxyXG4gICAgICAgICAgYWxpZ25tZW50RW5kT2Zmc2V0ID0gdmlld3BvcnRTaXplICogLjUgLSAoZW5kSXRlbUlkICE9PSBudWxsID8gKGlzVmVydGljYWwgPyAodGhpcy5fc2VydmljZS5nZXRJdGVtQm91bmRzKGVuZEl0ZW1JZCk/LmhlaWdodCA/PyAwKSA6XHJcbiAgICAgICAgICAgICh0aGlzLl9zZXJ2aWNlLmdldEl0ZW1Cb3VuZHMoZW5kSXRlbUlkKT8ud2lkdGggPz8gMCkpIDogMCkgKiAoaXNJbmZpbml0eSA/IDAgOiAuNSk7XHJcblxyXG4gICAgICAgIHRoaXMuXyRhbGlnbm1lbnRTY3JvbGxTdGFydE9mZnNldC5uZXh0KGFsaWdubWVudFN0YXJ0T2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl8kYWxpZ25tZW50U2Nyb2xsRW5kT2Zmc2V0Lm5leHQoYWxpZ25tZW50RW5kT2Zmc2V0KTtcclxuICAgICAgICB0aGlzLl8kYWN0dWFsU2Nyb2xsU3RhcnRPZmZzZXQubmV4dChwcmVjYWxjdWxhdGVkU2Nyb2xsU3RhcnRPZmZzZXQgKyBhbGlnbm1lbnRTdGFydE9mZnNldCk7XHJcbiAgICAgICAgdGhpcy5fJGFjdHVhbFNjcm9sbEVuZE9mZnNldC5uZXh0KHByZWNhbGN1bGF0ZWRTY3JvbGxFbmRPZmZzZXQgKyBhbGlnbm1lbnRFbmRPZmZzZXQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVJlZ3VsYXJSZW5kZXJlcigpIHtcclxuICAgIHRoaXMuX3Jlc2l6ZVNuYXBwZWRDb21wb25lbnRIYW5kbGVyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja2luZyBieSBpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJhY2tpbmcoKSB7XHJcbiAgICB0aGlzLl90cmFja0JveC50cmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgdG90YWxTaXplOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGwgPSB0aGlzLl8kbGlzdC5nZXRWYWx1ZSgpLCBwcm9wID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUUsXHJcbiAgICAgIHNpemUgPSB0b3RhbFNpemU7XHJcbiAgICBpZiAoISFsICYmIHBhcnNlSW50KGwubmF0aXZlRWxlbWVudC5zdHlsZVtwcm9wXSkgIT09IHNpemUpIHtcclxuICAgICAgbC5uYXRpdmVFbGVtZW50LnN0eWxlW3Byb3BdID0gYCR7c2l6ZX0ke1BYfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgYW4gZWxlbWVudCB3aXRoIGEgZ2l2ZW4gaWRcclxuICAgKi9cclxuICBnZXRJdGVtQm91bmRzKGlkOiBJZCk6IElTaXplIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VydmljZS5nZXRJdGVtQm91bmRzKGlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIGFuIGxpc3QgaXRlbSBieSBhIGdpdmVuIGlkLlxyXG4gICAqL1xyXG4gIGZvY3VzKGlkOiBJZCwgYWxpZ246IEZvY3VzQWxpZ25tZW50ID0gRm9jdXNBbGlnbm1lbnRzLk5PTkUpIHtcclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5fc2VydmljZS5mb2N1c0J5SWQoaWQsIGFsaWduLCB0aGlzLnNjcm9sbEJlaGF2aW9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZXRob2Qgc2Nyb2xscyB0aGUgbGlzdCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBgaWRgIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc2Nyb2xsZWQgYXJlYS5cclxuICAgKi9cclxuICBzY3JvbGxUbyhpZDogSWQsIGNiOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbCwgb3B0aW9uczogSVNjcm9sbE9wdGlvbnMgfCBudWxsID0gbnVsbCkge1xyXG4gICAgY29uc3QgYmVoYXZpb3IgPSBvcHRpb25zPy5iZWhhdmlvciA/PyBCRUhBVklPUl9JTlNUQU5ULFxyXG4gICAgICBibGVuZGluZyA9IG9wdGlvbnM/LmJsZW5kaW5nID8/IGZhbHNlLFxyXG4gICAgICBmb2N1c2VkID0gb3B0aW9ucz8uZm9jdXNlZCA/PyB0cnVlLFxyXG4gICAgICBkZWxheSA9IG9wdGlvbnM/LmRlbGF5ID8/IDAsXHJcbiAgICAgIGl0ZXJhdGlvbiA9IG9wdGlvbnM/Lml0ZXJhdGlvbiA/PyAwO1xyXG4gICAgdmFsaWRhdGVJZChpZCk7XHJcbiAgICB2YWxpZGF0ZVNjcm9sbEJlaGF2aW9yKGJlaGF2aW9yKTtcclxuICAgIHZhbGlkYXRlSXRlcmF0aW9uKGl0ZXJhdGlvbik7XHJcbiAgICBjb25zdCBhY3R1YWxJdGVyYXRpb24gPSB2YWxpZGF0ZVNjcm9sbEl0ZXJhdGlvbihpdGVyYXRpb24pO1xyXG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICBpZiAoIXRoaXMuX3Njcm9sbGVyQ29tcG9uZW50Py5zY3JvbGxhYmxlICYmICF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgdGhpcy5zY3JvbGxUb0ZpbmFsaXplKGlkLCBmb2N1c2VkLCBjYik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuXyRzY3JvbGxUby5uZXh0KHtcclxuICAgICAgaWQsIGJlaGF2aW9yLCBibGVuZGluZywgZGVsYXksIGl0ZXJhdGlvbjogYWN0dWFsSXRlcmF0aW9uLCBpc0xhc3RJdGVyYXRpb246IGFjdHVhbEl0ZXJhdGlvbiA9PT0gTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TLCBjYjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9GaW5hbGl6ZShpZCwgZm9jdXNlZCwgY2IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjcm9sbHMgdGhlIHNjcm9sbCBhcmVhIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uLlxyXG4gICAqL1xyXG4gIHNjcm9sbFRvU3RhcnQoY2I6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsLCBvcHRpb25zOiBJU2Nyb2xsT3B0aW9ucyB8IG51bGwgPSBudWxsKSB7XHJcbiAgICBjb25zdCBzY3JvbGxlciA9IHRoaXMuX3Njcm9sbGVyQ29tcG9uZW50O1xyXG4gICAgaWYgKCEhc2Nyb2xsZXIpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IHRoaXMuaXNWZXJ0aWNhbCA/IHNjcm9sbGVyLnNjcm9sbFRvcCA6IHNjcm9sbGVyLnNjcm9sbExlZnQ7XHJcbiAgICAgIGlmIChzY3JvbGxTaXplID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHNjcm9sbGVyLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJlaGF2aW9yID0gb3B0aW9ucz8uYmVoYXZpb3IgPz8gQkVIQVZJT1JfSU5TVEFOVCxcclxuICAgICAgYmxlbmRpbmcgPSBvcHRpb25zPy5ibGVuZGluZyA/PyBmYWxzZSxcclxuICAgICAgZm9jdXNlZCA9IG9wdGlvbnM/LmZvY3VzZWQgPz8gdHJ1ZSxcclxuICAgICAgZGVsYXkgPSBvcHRpb25zPy5kZWxheSA/PyAwLFxyXG4gICAgICBpdGVyYXRpb24gPSBvcHRpb25zPy5pdGVyYXRpb24gPz8gMDtcclxuICAgIHZhbGlkYXRlU2Nyb2xsQmVoYXZpb3IoYmVoYXZpb3IpO1xyXG4gICAgdmFsaWRhdGVJdGVyYXRpb24oaXRlcmF0aW9uKTtcclxuICAgIGNvbnN0IHRyYWNrQnkgPSB0aGlzLnRyYWNrQnksIGl0ZW1zID0gdGhpcy5fJGFjdHVhbEl0ZW1zLmdldFZhbHVlKCksIGZpcnN0SXRlbSA9IGl0ZW1zLmxlbmd0aCA+IDAgPyBpdGVtc1swXSA/PyBudWxsIDogbnVsbCwgaWQgPSBmaXJzdEl0ZW0/Llt0cmFja0J5XSA/PyBudWxsLFxyXG4gICAgICBhY3R1YWxJdGVyYXRpb24gPSB2YWxpZGF0ZVNjcm9sbEl0ZXJhdGlvbihpdGVyYXRpb24pO1xyXG4gICAgaWYgKCEhZmlyc3RJdGVtKSB7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB0aGlzLl8kc2Nyb2xsVG8ubmV4dCh7XHJcbiAgICAgICAgaWQsIGJlaGF2aW9yLCBibGVuZGluZywgZGVsYXksIGl0ZXJhdGlvbjogYWN0dWFsSXRlcmF0aW9uLCBpc0xhc3RJdGVyYXRpb246IGFjdHVhbEl0ZXJhdGlvbiA9PT0gTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TLCBjYjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fJGlzU2Nyb2xsU3RhcnQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxFbmQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuXyRmaXJlVXBkYXRlLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvRmluYWxpemUoaWQsIGZvY3VzZWQsIGNiKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKiBUaGUgc2Nyb2xsVG9FbmRJdGVtIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHNjcm9sbFRvRW5kIG1ldGhvZC5cclxuICAgKi9cclxuICBzY3JvbGxUb0VuZEl0ZW0oY2I/OiAoKSA9PiB2b2lkLCBvcHRpb25zPzogSVNjcm9sbE9wdGlvbnMpIHtcclxuICAgIHRocm93IEVycm9yKCdUaGUgc2Nyb2xsVG9FbmRJdGVtIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHNjcm9sbFRvRW5kIG1ldGhvZC4nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjcm9sbHMgdGhlIGxpc3QgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBzaXplLlxyXG4gICAqL1xyXG4gIHNjcm9sbFRvRW5kKGNiOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbCwgb3B0aW9uczogSVNjcm9sbE9wdGlvbnMgfCBudWxsID0gbnVsbCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLl9zY3JvbGxlckNvbXBvbmVudDtcclxuICAgIGlmICghIXNjcm9sbGVyKSB7XHJcbiAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLmlzVmVydGljYWwsXHJcbiAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyBzY3JvbGxlci5zY3JvbGxUb3AgOiBzY3JvbGxlci5zY3JvbGxMZWZ0LFxyXG4gICAgICAgIG1heFNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IDogc2Nyb2xsZXIuc2Nyb2xsVG9wO1xyXG4gICAgICBpZiAoc2Nyb2xsU2l6ZSA9PT0gbWF4U2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzY3JvbGxlci5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiZWhhdmlvciA9IG9wdGlvbnM/LmJlaGF2aW9yID8/IEJFSEFWSU9SX0lOU1RBTlQsXHJcbiAgICAgIGJsZW5kaW5nID0gb3B0aW9ucz8uYmxlbmRpbmcgPz8gZmFsc2UsXHJcbiAgICAgIGZvY3VzZWQgPSBvcHRpb25zPy5mb2N1c2VkID8/IHRydWUsXHJcbiAgICAgIGRlbGF5ID0gb3B0aW9ucz8uZGVsYXkgPz8gMCxcclxuICAgICAgaXRlcmF0aW9uID0gb3B0aW9ucz8uaXRlcmF0aW9uID8/IDA7XHJcbiAgICB2YWxpZGF0ZVNjcm9sbEJlaGF2aW9yKGJlaGF2aW9yKTtcclxuICAgIHZhbGlkYXRlSXRlcmF0aW9uKGl0ZXJhdGlvbik7XHJcbiAgICBjb25zdCB0cmFja0J5ID0gdGhpcy50cmFja0J5LCBpdGVtcyA9IHRoaXMuXyRhY3R1YWxJdGVtcy5nZXRWYWx1ZSgpLCBsYXRJdGVtID0gaXRlbXNbaXRlbXMubGVuZ3RoID4gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiAwXSwgaWQgPSBsYXRJdGVtPy5bdHJhY2tCeV0gPz8gbnVsbCxcclxuICAgICAgYWN0dWFsSXRlcmF0aW9uID0gdmFsaWRhdGVTY3JvbGxJdGVyYXRpb24oaXRlcmF0aW9uKTtcclxuICAgIGlmIChsYXRJdGVtID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgaWYgKCF0aGlzLl9zY3JvbGxlckNvbXBvbmVudD8uc2Nyb2xsYWJsZSkge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvRmluYWxpemUoaWQsIGZvY3VzZWQsIGNiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fJHNjcm9sbFRvLm5leHQoe1xyXG4gICAgICBpZCwgYmVoYXZpb3IsIGJsZW5kaW5nLCBkZWxheSwgaXRlcmF0aW9uOiBhY3R1YWxJdGVyYXRpb24sIGlzTGFzdEl0ZXJhdGlvbjogYWN0dWFsSXRlcmF0aW9uID09PSBNQVhfU0NST0xMX1RPX0lURVJBVElPTlMsIGNiOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fJGlzU2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3guaXNTY3JvbGxTdGFydCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LmlzU2Nyb2xsRW5kID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl8kZmlyZVVwZGF0ZS5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9GaW5hbGl6ZShpZCwgZm9jdXNlZCwgY2IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVG9GaW5hbGl6ZShpZDogSWQsIGZvY3VzZWQ6IGJvb2xlYW4sIGNiOiAoKCkgPT4gdm9pZCkgfCBudWxsKSB7XHJcbiAgICBpZiAoZm9jdXNlZCkge1xyXG4gICAgICBjb25zdCBlbCA9IHRoaXMuX3NlcnZpY2UuZ2V0Rm9jdXNlZEVsZW1lbnRCeUlkKGlkKTtcclxuICAgICAgaWYgKCEhZWwpIHtcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlLmZvY3VzKGVsLCBGb2N1c0FsaWdubWVudHMuTk9ORSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY2I/LigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNsZWFudXAoKSB7XHJcbiAgICBjb25zdCBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gPSBbXTtcclxuICAgIHRoaXMuX3NlcnZpY2UuY29sbGVjdGlvbiA9IGRpc3BsYXlJdGVtcztcclxuICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuICAgIHRoaXMudHJhY2tpbmcoKTtcclxuICAgIHRoaXMuZW1pdFNjcm9sbEV2ZW50KHRydWUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JjZSBjbGVhcmluZyB0aGUgY2FjaGUuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNhY2hlQ2xlYW4oKSB7XHJcbiAgICB0aGlzLl9jYWNoZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmR5bmFtaWNTaXplKSB7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmNhY2hlQ2xlYW4oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHByZXJlbmRlckNvbnRhaW5lciA9IHRoaXMuX3ByZXJlbmRlcjtcclxuICAgIGlmICghIXByZXJlbmRlckNvbnRhaW5lcikge1xyXG4gICAgICBwcmVyZW5kZXJDb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgcHJlcmVuZGVyQ29udGFpbmVyLm9mZigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fJGNvbGxhcHNlZEl0ZW1JZHMubmV4dChbXSk7XHJcbiAgICB0aGlzLl8kaXNTY3JvbGxTdGFydC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5fJGlzU2Nyb2xsRW5kLm5leHQoZmFsc2UpO1xyXG4gICAgdGhpcy5fJHRvdGFsU2l6ZS5uZXh0KDApO1xyXG4gICAgdGhpcy5fJHNjcm9sbFNpemUubmV4dCgwKTtcclxuICAgIGNvbnN0IHNjcm9sbGVyID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICBpZiAoISFzY3JvbGxlcikge1xyXG4gICAgICBzY3JvbGxlci5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKiBUaGUgc3RvcFNuYXBwaW5nU2Nyb2xsVG9FbmQgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcHJldmVudFNuYXBwaW5nIG1ldGhvZC5cclxuICAgKi9cclxuICBzdG9wU25hcHBpbmdTY3JvbGxUb0VuZCgpIHtcclxuICAgIHRocm93IEVycm9yKCdUaGUgc3RvcFNuYXBwaW5nU2Nyb2xsVG9FbmQgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcHJldmVudFNuYXBwaW5nIG1ldGhvZC4nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXZlbnRzIHRoZSBsaXN0IGZyb20gc25hcHBpbmcgdG8gaXRzIHN0YXJ0IG9yIGVuZCBlZGdlLlxyXG4gICAqL1xyXG4gIHByZXZlbnRTbmFwcGluZygpIHtcclxuICAgIGlmICghdGhpcy5fcmVhZHlGb3JTaG93KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNjcm9sbGVyID0gdGhpcy5fc2Nyb2xsZXJDb21wb25lbnQ7XHJcbiAgICB0aGlzLl8kaXNTY3JvbGxTdGFydC5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMuXyRpc1Njcm9sbEVuZC5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMuX3RyYWNrQm94LnByZXZlbnRTY3JvbGxTbmFwcGluZyh0cnVlKTtcclxuICAgIGlmIChzY3JvbGxlcikge1xyXG4gICAgICBzY3JvbGxlci5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgICB0aGlzLmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuXyRkZXN0cm95Lm5leHQoKTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVJZCA9IHRoaXMuX3VwZGF0ZUlkO1xyXG4gICAgaWYgKHVwZGF0ZUlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodXBkYXRlSWQpO1xyXG4gICAgICB0aGlzLl91cGRhdGVJZCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fc2VydmljZSkge1xyXG4gICAgICB0aGlzLl9zZXJ2aWNlLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoISF0aGlzLl90cmFja0JveCkge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5fcmVzaXplU25hcHBlZE9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMuX3Jlc2l6ZVNuYXBwZWRPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLl9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLl9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHMuc2hpZnQoKTtcclxuICAgICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgd2hpbGUgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMuc2hpZnQoKTtcclxuICAgICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIiBjbGFzcz1cIm5ndmxfX3NjcmVlbi1yZWFkZXJcIj5cclxuICB7eyAkc2NyZWVuUmVhZGVyRm9ybWF0dGVkTWVzc2FnZSB8IGFzeW5jIH19XHJcbjwvZGl2PlxyXG5cclxuPG5nLXByZXJlbmRlci1jb250YWluZXIgI3ByZXJlbmRlciBbYm91bmRzXT1cIigkYm91bmRzIHwgYXN5bmMpIVwiIFtkaXJlY3Rpb25dPVwiKCRkaXJlY3Rpb24gfCBhc3luYykhXCJcclxuICBbZHluYW1pY109XCIoJGR5bmFtaWNTaXplIHwgYXN5bmMpIVwiIFtkaXZpZGVzXT1cIigkZGl2aWRlcyB8IGFzeW5jKSFcIiBbaXNWZXJ0aWNhbF09XCIoJGlzVmVydGljYWwgfCBhc3luYykhXCJcclxuICBbaXRlbVNpemVdPVwiKCRhY3R1YWxJdGVtU2l6ZSB8IGFzeW5jKSFcIiBbdHJhY2tCeV09XCIoJHRyYWNrQnkgfCBhc3luYykhXCIgW2l0ZW1SZW5kZXJlcl09XCIoJGl0ZW1SZW5kZXJlciB8IGFzeW5jKSFcIlxyXG4gIFtzdGFydE9mZnNldF09XCIoJHN0YXJ0T2Zmc2V0IHwgYXN5bmMpIVwiIFtlbmRPZmZzZXRdPVwiKCRlbmRPZmZzZXQgfCBhc3luYykhXCJcclxuICBbc2Nyb2xsYmFyRW5hYmxlZF09XCIoc2Nyb2xsZXIuJHNjcm9sbGJhclNob3cgfCBhc3luYykhXCJcclxuICBbZW5hYmxlZF09XCIoJHByZXJlbmRlckVuYWJsZWQgfCBhc3luYykhXCI+PC9uZy1wcmVyZW5kZXItY29udGFpbmVyPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIigkc3RpY2t5RW5hYmxlZCB8IGFzeW5jKSFcIj5cclxuICA8ZGl2IGxvY2FsZVNlbnNpdGl2ZSBbbGFuZ1RleHREaXJdPVwiKCRsYW5nVGV4dERpciB8IGFzeW5jKSFcIiAjc25hcHBlZENvbnRhaW5lciBjbGFzcz1cIm5ndmxfX3NuYXBwZWQtY29udGFpbmVyXCJcclxuICAgIFtuZ0NsYXNzXT1cIigkY2xhc3NlcyB8IGFzeW5jKVwiPlxyXG4gICAgPGRpdiAjc25hcHBlZCBwYXJ0PVwic25hcHBlZC1pdGVtXCIgY2xhc3M9XCJuZ3ZsX19saXN0LXNuYXBwZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAjc25hcFJlbmRlcmVyQ29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLXNjcm9sbGVyICNzY3JvbGxlciBjbGFzcz1cIm5ndmxfX2xpc3Qtc2Nyb2xsZXJcIiBbY2xhc3Nlc109XCIoJGNsYXNzZXMgfCBhc3luYykhXCJcclxuICBbc3RhcnRPZmZzZXRdPVwiKCRzdGFydE9mZnNldCB8IGFzeW5jKSFcIiBbZW5kT2Zmc2V0XT1cIigkZW5kT2Zmc2V0IHwgYXN5bmMpIVwiXHJcbiAgW2FsaWdubWVudFN0YXJ0T2Zmc2V0XT1cIigkYWxpZ25tZW50U2Nyb2xsU3RhcnRPZmZzZXQgfCBhc3luYykhXCJcclxuICBbYWxpZ25tZW50RW5kT2Zmc2V0XT1cIigkYWxpZ25tZW50U2Nyb2xsRW5kT2Zmc2V0IHwgYXN5bmMpIVwiIFtkaXJlY3Rpb25dPVwiKCRkaXJlY3Rpb24gfCBhc3luYykhXCJcclxuICBbc2Nyb2xsYmFyVGh1bWJSZW5kZXJlcl09XCIoJHNjcm9sbGJhclRodW1iUmVuZGVyZXIgfCBhc3luYykhXCIgW2lzSW5maW5pdHldPVwiKCRpc0luZmluaXR5IHwgYXN5bmMpIVwiXHJcbiAgW3Njcm9sbGJhclRoaWNrbmVzc109XCIoJHNjcm9sbGJhclRoaWNrbmVzcyB8IGFzeW5jKSFcIiBbc2Nyb2xsYmFyVGh1bWJQYXJhbXNdPVwiKCRzY3JvbGxiYXJUaHVtYlBhcmFtcyB8IGFzeW5jKSFcIlxyXG4gIFthbmltYXRpb25QYXJhbXNdPVwiKCRhbmltYXRpb25QYXJhbXMgfCBhc3luYykhXCIgW2ZvY3VzZWRFbGVtZW50XT1cIigkZm9jdXNlZEVsZW1lbnQgfCBhc3luYykhXCJcclxuICBbbG9hZGluZ109XCIoJGxvYWRpbmcgfCBhc3luYykhXCIgW292ZXJzY3JvbGxFbmFibGVkXT1cIigkb3ZlcnNjcm9sbEVuYWJsZWQgfCBhc3luYykhXCJcclxuICBbc25hcHBpbmdEaXN0YW5jZV09XCIoJHNuYXBwaW5nRGlzdGFuY2UgfCBhc3luYykhXCIgW292ZXJsYXBwaW5nU2Nyb2xsYmFyXT1cIigkb3ZlcmxhcHBpbmdTY3JvbGxiYXIgfCBhc3luYykhXCJcclxuICBbc2Nyb2xsYmFyRW5hYmxlZF09XCIoJGFjdHVhbFNjcm9sbGJhckVuYWJsZWQgfCBhc3luYykhXCIgW3Njcm9sbGJhckludGVyYWN0aXZlXT1cIigkc2Nyb2xsYmFySW50ZXJhY3RpdmUgfCBhc3luYykhXCJcclxuICBbc25hcFRvSXRlbV09XCIoJHNuYXBUb0l0ZW0gfCBhc3luYykhXCIgW3NuYXBUb0l0ZW1BbGlnbl09XCIoJHNuYXBUb0l0ZW1BbGlnbiB8IGFzeW5jKSFcIlxyXG4gIFtzY3JvbGxiYXJNaW5TaXplXT1cIigkc2Nyb2xsYmFyTWluU2l6ZSB8IGFzeW5jKSFcIiBbc2Nyb2xsQmVoYXZpb3JdPVwiKCRzY3JvbGxCZWhhdmlvciB8IGFzeW5jKSFcIlxyXG4gIFtzY3JvbGxpbmdTZXR0aW5nc109XCIoJHNjcm9sbGluZ1NldHRpbmdzIHwgYXN5bmMpIVwiIFtzY3JvbGxpbmdPbmVCeU9uZV09XCIoJHNjcm9sbGluZ09uZUJ5T25lIHwgYXN5bmMpIVwiXHJcbiAgW21vdGlvbkJsdXJdPVwiKCRtb3Rpb25CbHVyIHwgYXN5bmMpIVwiIFttYXhNb3Rpb25CbHVyXT1cIigkbWF4TW90aW9uQmx1ciB8IGFzeW5jKSFcIlxyXG4gIFttb3Rpb25CbHVyRW5hYmxlZF09XCIoJG1vdGlvbkJsdXJFbmFibGVkIHwgYXN5bmMpIVwiPlxyXG4gIDxuZy1jb250YWluZXIgI3JlbmRlcmVyc0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuPC9uZy1zY3JvbGxlcj4iXX0=
|