@ardium-ui/ui 1.0.0
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 +25 -0
- package/esm2022/ardium-ui-ui.mjs +5 -0
- package/esm2022/lib/_internal/boolean-component.mjs +108 -0
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +12 -0
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +18 -0
- package/esm2022/lib/_internal/disablable-component.mjs +44 -0
- package/esm2022/lib/_internal/focusable-component.mjs +91 -0
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +436 -0
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +349 -0
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +155 -0
- package/esm2022/lib/_internal/models/pagination.model.mjs +124 -0
- package/esm2022/lib/_internal/ngmodel-component.mjs +42 -0
- package/esm2022/lib/_internal/queue.mjs +59 -0
- package/esm2022/lib/_internal/selectable-list-component.mjs +304 -0
- package/esm2022/lib/badge/badge.directive.mjs +123 -0
- package/esm2022/lib/badge/badge.module.mjs +18 -0
- package/esm2022/lib/badge/badge.types.mjs +16 -0
- package/esm2022/lib/buttons/_button-base.mjs +45 -0
- package/esm2022/lib/buttons/button/button.component.mjs +49 -0
- package/esm2022/lib/buttons/button/button.module.mjs +18 -0
- package/esm2022/lib/buttons/fab/fab.component.mjs +40 -0
- package/esm2022/lib/buttons/fab/fab.module.mjs +18 -0
- package/esm2022/lib/buttons/general-button.types.mjs +55 -0
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +37 -0
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +18 -0
- package/esm2022/lib/calendar/calendar.component.mjs +982 -0
- package/esm2022/lib/calendar/calendar.directives.mjs +107 -0
- package/esm2022/lib/calendar/calendar.helpers.mjs +47 -0
- package/esm2022/lib/calendar/calendar.module.mjs +21 -0
- package/esm2022/lib/calendar/calendar.types.mjs +11 -0
- package/esm2022/lib/card/card.children.mjs +97 -0
- package/esm2022/lib/card/card.component.mjs +40 -0
- package/esm2022/lib/card/card.module.mjs +59 -0
- package/esm2022/lib/card/card.types.mjs +9 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +73 -0
- package/esm2022/lib/checkbox/checkbox.module.mjs +18 -0
- package/esm2022/lib/checkbox/checkbox.types.mjs +6 -0
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +139 -0
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +19 -0
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +7 -0
- package/esm2022/lib/chip/chip.component.mjs +55 -0
- package/esm2022/lib/chip/chip.module.mjs +21 -0
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +80 -0
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +77 -0
- package/esm2022/lib/color/color-display/color-display.component.mjs +48 -0
- package/esm2022/lib/color/color-display/color-display.module.mjs +18 -0
- package/esm2022/lib/color/color-display/color-display.types.mjs +9 -0
- package/esm2022/lib/color/color-picker/color-picker.component.mjs +484 -0
- package/esm2022/lib/color/color-picker/color-picker.directives.mjs +55 -0
- package/esm2022/lib/color/color-picker/color-picker.module.mjs +43 -0
- package/esm2022/lib/color/color-picker/color-picker.types.mjs +11 -0
- package/esm2022/lib/dialog/dialog.component.mjs +167 -0
- package/esm2022/lib/dialog/dialog.directives.mjs +14 -0
- package/esm2022/lib/dialog/dialog.module.mjs +21 -0
- package/esm2022/lib/dialog/dialog.types.mjs +6 -0
- package/esm2022/lib/divider/divider.component.mjs +26 -0
- package/esm2022/lib/divider/divider.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +130 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +10 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +82 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +42 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +58 -0
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +153 -0
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +73 -0
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +21 -0
- package/esm2022/lib/file-inputs/file-input-base.mjs +187 -0
- package/esm2022/lib/file-inputs/file-input-types.mjs +2 -0
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +74 -0
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +25 -0
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +19 -0
- package/esm2022/lib/icon/icon.component.mjs +85 -0
- package/esm2022/lib/icon/icon.module.mjs +19 -0
- package/esm2022/lib/icon/icon.pipe.mjs +18 -0
- package/esm2022/lib/inputs/color-input/color-input.component.mjs +421 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +101 -0
- package/esm2022/lib/inputs/color-input/color-input.module.mjs +85 -0
- package/esm2022/lib/inputs/color-input/color-input.types.mjs +2 -0
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +218 -0
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +217 -0
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +18 -0
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +15 -0
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +8 -0
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +234 -0
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +21 -0
- package/esm2022/lib/inputs/hex-input.model.mjs +106 -0
- package/esm2022/lib/inputs/input/input.component.mjs +344 -0
- package/esm2022/lib/inputs/input/input.directives.mjs +58 -0
- package/esm2022/lib/inputs/input/input.module.mjs +47 -0
- package/esm2022/lib/inputs/input-transformers.mjs +66 -0
- package/esm2022/lib/inputs/input-types.mjs +6 -0
- package/esm2022/lib/inputs/input-utils.mjs +205 -0
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +289 -0
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +14 -0
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +21 -0
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +222 -0
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +49 -0
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +41 -0
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +2 -0
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +219 -0
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +37 -0
- package/esm2022/lib/kbd/kbd.component.mjs +42 -0
- package/esm2022/lib/kbd/kbd.module.mjs +19 -0
- package/esm2022/lib/kbd/kbd.pipe.mjs +17 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +55 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +19 -0
- package/esm2022/lib/modal/modal.component.mjs +120 -0
- package/esm2022/lib/modal/modal.module.mjs +21 -0
- package/esm2022/lib/option/option.component.mjs +77 -0
- package/esm2022/lib/option/option.module.mjs +18 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +95 -0
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +14 -0
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +19 -0
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +94 -0
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +14 -0
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +10 -0
- package/esm2022/lib/radio/radio/radio.component.mjs +53 -0
- package/esm2022/lib/radio/radio-group.component.mjs +207 -0
- package/esm2022/lib/radio/radio.module.mjs +19 -0
- package/esm2022/lib/search-functions.mjs +64 -0
- package/esm2022/lib/segment/segment.component.mjs +168 -0
- package/esm2022/lib/segment/segment.directives.mjs +14 -0
- package/esm2022/lib/segment/segment.module.mjs +19 -0
- package/esm2022/lib/segment/segment.types.mjs +12 -0
- package/esm2022/lib/select/select.component.mjs +1160 -0
- package/esm2022/lib/select/select.directive.mjs +171 -0
- package/esm2022/lib/select/select.module.mjs +112 -0
- package/esm2022/lib/select/select.types.mjs +2 -0
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +46 -0
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +18 -0
- package/esm2022/lib/slider/abstract-slider.mjs +330 -0
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +143 -0
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +18 -0
- package/esm2022/lib/slider/slider.component.mjs +93 -0
- package/esm2022/lib/slider/slider.directive.mjs +16 -0
- package/esm2022/lib/slider/slider.module.mjs +20 -0
- package/esm2022/lib/slider/slider.types.mjs +10 -0
- package/esm2022/lib/snackbar/index.mjs +5 -0
- package/esm2022/lib/snackbar/snackbar-ref.mjs +51 -0
- package/esm2022/lib/snackbar/snackbar.component.mjs +48 -0
- package/esm2022/lib/snackbar/snackbar.service.mjs +227 -0
- package/esm2022/lib/snackbar/snackbar.token.mjs +20 -0
- package/esm2022/lib/snackbar/snackbar.types.mjs +25 -0
- package/esm2022/lib/spinner/spinner.component.mjs +22 -0
- package/esm2022/lib/spinner/spinner.module.mjs +18 -0
- package/esm2022/lib/star/star-button/star-button.component.mjs +53 -0
- package/esm2022/lib/star/star-button/star-button.module.mjs +19 -0
- package/esm2022/lib/star/star-display/star-display.component.mjs +66 -0
- package/esm2022/lib/star/star-display/star-display.module.mjs +19 -0
- package/esm2022/lib/star/star-input/star-input.component.mjs +221 -0
- package/esm2022/lib/star/star-input/star-input.module.mjs +19 -0
- package/esm2022/lib/star/star.component.mjs +28 -0
- package/esm2022/lib/star/star.module.mjs +18 -0
- package/esm2022/lib/star/star.types.mjs +23 -0
- package/esm2022/lib/statebox/statebox.component.mjs +158 -0
- package/esm2022/lib/statebox/statebox.module.mjs +18 -0
- package/esm2022/lib/statebox/statebox.types.mjs +2 -0
- package/esm2022/lib/table/table-item-storage.mjs +560 -0
- package/esm2022/lib/table/table.component.mjs +468 -0
- package/esm2022/lib/table/table.directives.mjs +64 -0
- package/esm2022/lib/table/table.module.mjs +46 -0
- package/esm2022/lib/table/table.types.mjs +30 -0
- package/esm2022/lib/table/utils.mjs +18 -0
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +64 -0
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +19 -0
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +172 -0
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +21 -0
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +7 -0
- package/esm2022/lib/types/alignment.types.mjs +10 -0
- package/esm2022/lib/types/colors.types.mjs +43 -0
- package/esm2022/lib/types/item-storage.types.mjs +6 -0
- package/esm2022/lib/types/theming.types.mjs +48 -0
- package/esm2022/lib/types/utility.types.mjs +5 -0
- package/esm2022/public-api.mjs +194 -0
- package/fesm2022/ardium-ui-ui.mjs +14316 -0
- package/fesm2022/ardium-ui-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_internal/boolean-component.d.ts +50 -0
- package/lib/_internal/clear-button/clear-button.component.d.ts +6 -0
- package/lib/_internal/clear-button/clear-button.module.d.ts +8 -0
- package/lib/_internal/disablable-component.d.ts +11 -0
- package/lib/_internal/focusable-component.d.ts +52 -0
- package/lib/_internal/item-storages/dropdown-item-storage.d.ts +87 -0
- package/lib/_internal/item-storages/simple-item-storage.d.ts +159 -0
- package/lib/_internal/item-storages/simplest-item-storage.d.ts +70 -0
- package/lib/_internal/models/pagination.model.d.ts +53 -0
- package/lib/_internal/ngmodel-component.d.ts +42 -0
- package/lib/_internal/queue.d.ts +21 -0
- package/lib/_internal/selectable-list-component.d.ts +71 -0
- package/lib/badge/badge.directive.d.ts +31 -0
- package/lib/badge/badge.module.d.ts +8 -0
- package/lib/badge/badge.types.d.ts +17 -0
- package/lib/buttons/_button-base.d.ts +18 -0
- package/lib/buttons/button/button.component.d.ts +15 -0
- package/lib/buttons/button/button.module.d.ts +8 -0
- package/lib/buttons/fab/fab.component.d.ts +12 -0
- package/lib/buttons/fab/fab.module.d.ts +8 -0
- package/lib/buttons/general-button.types.d.ts +57 -0
- package/lib/buttons/icon-button/icon-button.component.d.ts +13 -0
- package/lib/buttons/icon-button/icon-button.module.d.ts +8 -0
- package/lib/calendar/calendar.component.d.ts +155 -0
- package/lib/calendar/calendar.directives.d.ts +51 -0
- package/lib/calendar/calendar.helpers.d.ts +15 -0
- package/lib/calendar/calendar.module.d.ts +11 -0
- package/lib/calendar/calendar.types.d.ts +80 -0
- package/lib/card/card.children.d.ts +43 -0
- package/lib/card/card.component.d.ts +13 -0
- package/lib/card/card.module.d.ts +9 -0
- package/lib/card/card.types.d.ts +10 -0
- package/lib/checkbox/checkbox.component.d.ts +21 -0
- package/lib/checkbox/checkbox.module.d.ts +8 -0
- package/lib/checkbox/checkbox.types.d.ts +6 -0
- package/lib/checkbox-list/checkbox-list.component.d.ts +50 -0
- package/lib/checkbox-list/checkbox-list.module.d.ts +9 -0
- package/lib/checkbox-list/checkbox-list.types.d.ts +7 -0
- package/lib/chip/chip.component.d.ts +18 -0
- package/lib/chip/chip.module.d.ts +11 -0
- package/lib/chip/deletable-chip/deletable-chip.component.d.ts +24 -0
- package/lib/chip/selectable-chip/selectable-chip.component.d.ts +24 -0
- package/lib/color/color-display/color-display.component.d.ts +17 -0
- package/lib/color/color-display/color-display.module.d.ts +8 -0
- package/lib/color/color-display/color-display.types.d.ts +9 -0
- package/lib/color/color-picker/color-picker.component.d.ts +125 -0
- package/lib/color/color-picker/color-picker.directives.d.ts +27 -0
- package/lib/color/color-picker/color-picker.module.d.ts +13 -0
- package/lib/color/color-picker/color-picker.types.d.ts +21 -0
- package/lib/dialog/dialog.component.d.ts +44 -0
- package/lib/dialog/dialog.directives.d.ts +9 -0
- package/lib/dialog/dialog.module.d.ts +11 -0
- package/lib/dialog/dialog.types.d.ts +28 -0
- package/lib/divider/divider.component.d.ts +8 -0
- package/lib/divider/divider.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.component.d.ts +37 -0
- package/lib/dropdown-panel/dropdown-panel.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.types.d.ts +12 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +22 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.directives.d.ts +21 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.module.d.ts +12 -0
- package/lib/file-inputs/file-input/file-input.component.d.ts +41 -0
- package/lib/file-inputs/file-input/file-input.directives.d.ts +39 -0
- package/lib/file-inputs/file-input/file-input.module.d.ts +11 -0
- package/lib/file-inputs/file-input-base.d.ts +43 -0
- package/lib/file-inputs/file-input-types.d.ts +10 -0
- package/lib/form-field-frame/form-field-frame.component.d.ts +32 -0
- package/lib/form-field-frame/form-field-frame.directives.d.ts +14 -0
- package/lib/form-field-frame/form-field-frame.module.d.ts +9 -0
- package/lib/icon/icon.component.d.ts +32 -0
- package/lib/icon/icon.module.d.ts +9 -0
- package/lib/icon/icon.pipe.d.ts +7 -0
- package/lib/inputs/color-input/color-input.component.d.ts +147 -0
- package/lib/inputs/color-input/color-input.directives.d.ts +52 -0
- package/lib/inputs/color-input/color-input.module.d.ts +16 -0
- package/lib/inputs/color-input/color-input.types.d.ts +5 -0
- package/lib/inputs/digit-input/digit-input.component.d.ts +50 -0
- package/lib/inputs/digit-input/digit-input.model.d.ts +26 -0
- package/lib/inputs/digit-input/digit-input.module.d.ts +8 -0
- package/lib/inputs/digit-input/digit-input.types.d.ts +27 -0
- package/lib/inputs/digit-input/digit-input.utils.d.ts +17 -0
- package/lib/inputs/hex-input/hex-input.component.d.ts +60 -0
- package/lib/inputs/hex-input/hex-input.directives.d.ts +20 -0
- package/lib/inputs/hex-input/hex-input.module.d.ts +11 -0
- package/lib/inputs/hex-input.model.d.ts +27 -0
- package/lib/inputs/input/input.component.d.ts +79 -0
- package/lib/inputs/input/input.directives.d.ts +33 -0
- package/lib/inputs/input/input.module.d.ts +13 -0
- package/lib/inputs/input-transformers.d.ts +24 -0
- package/lib/inputs/input-types.d.ts +6 -0
- package/lib/inputs/input-utils.d.ts +58 -0
- package/lib/inputs/number-input/number-input.component.d.ts +70 -0
- package/lib/inputs/number-input/number-input.directives.d.ts +8 -0
- package/lib/inputs/number-input/number-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.component.d.ts +54 -0
- package/lib/inputs/password-input/password-input.directives.d.ts +27 -0
- package/lib/inputs/password-input/password-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.types.d.ts +3 -0
- package/lib/inputs/simple-input/simple-input.component.d.ts +58 -0
- package/lib/inputs/simple-input/simple-input.directives.d.ts +20 -0
- package/lib/inputs/simple-input/simple-input.module.d.ts +11 -0
- package/lib/kbd/kbd.component.d.ts +15 -0
- package/lib/kbd/kbd.module.d.ts +9 -0
- package/lib/kbd/kbd.pipe.d.ts +7 -0
- package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +18 -0
- package/lib/kbd-shortcut/kbd-shortcut.module.d.ts +9 -0
- package/lib/modal/modal.component.d.ts +36 -0
- package/lib/modal/modal.module.d.ts +11 -0
- package/lib/option/option.component.d.ts +29 -0
- package/lib/option/option.module.d.ts +8 -0
- package/lib/progress-bar/progress-bar.component.d.ts +26 -0
- package/lib/progress-bar/progress-bar.directive.d.ts +9 -0
- package/lib/progress-bar/progress-bar.module.d.ts +9 -0
- package/lib/progress-bar/progress-bar.types.d.ts +26 -0
- package/lib/progress-circle/progress-circle.component.d.ts +28 -0
- package/lib/progress-circle/progress-circle.directive.d.ts +9 -0
- package/lib/progress-circle/progress-circle.module.d.ts +9 -0
- package/lib/progress-circle/progress-circle.types.d.ts +17 -0
- package/lib/radio/radio/radio.component.d.ts +23 -0
- package/lib/radio/radio-group.component.d.ts +43 -0
- package/lib/radio/radio.module.d.ts +9 -0
- package/lib/search-functions.d.ts +10 -0
- package/lib/segment/segment.component.d.ts +48 -0
- package/lib/segment/segment.directives.d.ts +9 -0
- package/lib/segment/segment.module.d.ts +9 -0
- package/lib/segment/segment.types.d.ts +16 -0
- package/lib/select/select.component.d.ts +255 -0
- package/lib/select/select.directive.d.ts +94 -0
- package/lib/select/select.module.d.ts +14 -0
- package/lib/select/select.types.d.ts +109 -0
- package/lib/slide-toggle/slide-toggle.component.d.ts +14 -0
- package/lib/slide-toggle/slide-toggle.module.d.ts +8 -0
- package/lib/slider/abstract-slider.d.ts +88 -0
- package/lib/slider/range-slider/range-slider.component.d.ts +29 -0
- package/lib/slider/range-slider/range-slider.module.d.ts +8 -0
- package/lib/slider/slider.component.d.ts +18 -0
- package/lib/slider/slider.directive.d.ts +9 -0
- package/lib/slider/slider.module.d.ts +10 -0
- package/lib/slider/slider.types.d.ts +28 -0
- package/lib/snackbar/index.d.ts +4 -0
- package/lib/snackbar/snackbar-ref.d.ts +37 -0
- package/lib/snackbar/snackbar.component.d.ts +16 -0
- package/lib/snackbar/snackbar.service.d.ts +31 -0
- package/lib/snackbar/snackbar.token.d.ts +5 -0
- package/lib/snackbar/snackbar.types.d.ts +48 -0
- package/lib/spinner/spinner.component.d.ts +8 -0
- package/lib/spinner/spinner.module.d.ts +8 -0
- package/lib/star/star-button/star-button.component.d.ts +16 -0
- package/lib/star/star-button/star-button.module.d.ts +9 -0
- package/lib/star/star-display/star-display.component.d.ts +16 -0
- package/lib/star/star-display/star-display.module.d.ts +9 -0
- package/lib/star/star-input/star-input.component.d.ts +51 -0
- package/lib/star/star-input/star-input.module.d.ts +9 -0
- package/lib/star/star.component.d.ts +10 -0
- package/lib/star/star.module.d.ts +8 -0
- package/lib/star/star.types.d.ts +30 -0
- package/lib/statebox/statebox.component.d.ts +31 -0
- package/lib/statebox/statebox.module.d.ts +8 -0
- package/lib/statebox/statebox.types.d.ts +22 -0
- package/lib/table/table-item-storage.d.ts +266 -0
- package/lib/table/table.component.d.ts +127 -0
- package/lib/table/table.directives.d.ts +35 -0
- package/lib/table/table.module.d.ts +12 -0
- package/lib/table/table.types.d.ts +83 -0
- package/lib/table/utils.d.ts +4 -0
- package/lib/table-from-csv/table-from-csv.component.d.ts +16 -0
- package/lib/table-from-csv/table-from-csv.module.d.ts +9 -0
- package/lib/table-pagination/table-pagination.component.d.ts +48 -0
- package/lib/table-pagination/table-pagination.module.d.ts +11 -0
- package/lib/table-pagination/table-pagination.types.d.ts +9 -0
- package/lib/types/alignment.types.d.ts +11 -0
- package/lib/types/colors.types.d.ts +71 -0
- package/lib/types/item-storage.types.d.ts +98 -0
- package/lib/types/theming.types.d.ts +61 -0
- package/lib/types/utility.types.d.ts +11 -0
- package/package.json +36 -0
- package/prebuilt-themes/default/badge.css +208 -0
- package/prebuilt-themes/default/badge.css.map +1 -0
- package/prebuilt-themes/default/buttons/button.css +290 -0
- package/prebuilt-themes/default/buttons/button.css.map +1 -0
- package/prebuilt-themes/default/buttons/fab.css +307 -0
- package/prebuilt-themes/default/buttons/fab.css.map +1 -0
- package/prebuilt-themes/default/buttons/icon-button.css +288 -0
- package/prebuilt-themes/default/buttons/icon-button.css.map +1 -0
- package/prebuilt-themes/default/calendar.css +293 -0
- package/prebuilt-themes/default/calendar.css.map +1 -0
- package/prebuilt-themes/default/card.css +122 -0
- package/prebuilt-themes/default/card.css.map +1 -0
- package/prebuilt-themes/default/checkbox-list.css +65 -0
- package/prebuilt-themes/default/checkbox-list.css.map +1 -0
- package/prebuilt-themes/default/checkbox.css +365 -0
- package/prebuilt-themes/default/checkbox.css.map +1 -0
- package/prebuilt-themes/default/chips.css +367 -0
- package/prebuilt-themes/default/chips.css.map +1 -0
- package/prebuilt-themes/default/color-display.css +29 -0
- package/prebuilt-themes/default/color-display.css.map +1 -0
- package/prebuilt-themes/default/color-picker.css +106 -0
- package/prebuilt-themes/default/color-picker.css.map +1 -0
- package/prebuilt-themes/default/core.css +84 -0
- package/prebuilt-themes/default/core.css.map +1 -0
- package/prebuilt-themes/default/dialog.css +18 -0
- package/prebuilt-themes/default/dialog.css.map +1 -0
- package/prebuilt-themes/default/divider.css +11 -0
- package/prebuilt-themes/default/divider.css.map +1 -0
- package/prebuilt-themes/default/dropdown-panel.css +37 -0
- package/prebuilt-themes/default/dropdown-panel.css.map +1 -0
- package/prebuilt-themes/default/file-drop-area.css +279 -0
- package/prebuilt-themes/default/file-drop-area.css.map +1 -0
- package/prebuilt-themes/default/form-field-frame.css +84 -0
- package/prebuilt-themes/default/form-field-frame.css.map +1 -0
- package/prebuilt-themes/default/inputs/color-input.css +139 -0
- package/prebuilt-themes/default/inputs/color-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/digit-input.css +45 -0
- package/prebuilt-themes/default/inputs/digit-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/file-input.css +169 -0
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/hex-input.css +119 -0
- package/prebuilt-themes/default/inputs/hex-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/input.css +139 -0
- package/prebuilt-themes/default/inputs/input.css.map +1 -0
- package/prebuilt-themes/default/inputs/number-input.css +150 -0
- package/prebuilt-themes/default/inputs/number-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/password-input.css +73 -0
- package/prebuilt-themes/default/inputs/password-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/search-bar.css +114 -0
- package/prebuilt-themes/default/inputs/search-bar.css.map +1 -0
- package/prebuilt-themes/default/inputs/simple-input.css +114 -0
- package/prebuilt-themes/default/inputs/simple-input.css.map +1 -0
- package/prebuilt-themes/default/kbd-shortcut.css +12 -0
- package/prebuilt-themes/default/kbd-shortcut.css.map +1 -0
- package/prebuilt-themes/default/kbd.css +17 -0
- package/prebuilt-themes/default/kbd.css.map +1 -0
- package/prebuilt-themes/default/modal.css +73 -0
- package/prebuilt-themes/default/modal.css.map +1 -0
- package/prebuilt-themes/default/progress-bar.css +267 -0
- package/prebuilt-themes/default/progress-bar.css.map +1 -0
- package/prebuilt-themes/default/progress-circle.css +167 -0
- package/prebuilt-themes/default/progress-circle.css.map +1 -0
- package/prebuilt-themes/default/radio.css +226 -0
- package/prebuilt-themes/default/radio.css.map +1 -0
- package/prebuilt-themes/default/segment.css +391 -0
- package/prebuilt-themes/default/segment.css.map +1 -0
- package/prebuilt-themes/default/select.css +275 -0
- package/prebuilt-themes/default/select.css.map +1 -0
- package/prebuilt-themes/default/slide-toggle.css +264 -0
- package/prebuilt-themes/default/slide-toggle.css.map +1 -0
- package/prebuilt-themes/default/slider.css +354 -0
- package/prebuilt-themes/default/slider.css.map +1 -0
- package/prebuilt-themes/default/snackbar.css +183 -0
- package/prebuilt-themes/default/snackbar.css.map +1 -0
- package/prebuilt-themes/default/spinner.css +151 -0
- package/prebuilt-themes/default/spinner.css.map +1 -0
- package/prebuilt-themes/default/stars.css +291 -0
- package/prebuilt-themes/default/stars.css.map +1 -0
- package/prebuilt-themes/default/statebox.css +235 -0
- package/prebuilt-themes/default/statebox.css.map +1 -0
- package/prebuilt-themes/default/table-pagination.css +48 -0
- package/prebuilt-themes/default/table-pagination.css.map +1 -0
- package/prebuilt-themes/default/table.css +418 -0
- package/prebuilt-themes/default/table.css.map +1 -0
- package/public-api.d.ts +145 -0
- package/themes/_variables.scss +121 -0
- package/themes/default/_clear-button.scss +73 -0
- package/themes/default/_coloring.scss +137 -0
- package/themes/default/_dropdown-arrow.scss +12 -0
- package/themes/default/_mixins.scss +70 -0
- package/themes/default/badge.scss +94 -0
- package/themes/default/buttons/_button-mixins.scss +144 -0
- package/themes/default/buttons/button.scss +62 -0
- package/themes/default/buttons/fab.scss +72 -0
- package/themes/default/buttons/icon-button.scss +59 -0
- package/themes/default/calendar.scss +182 -0
- package/themes/default/card.scss +126 -0
- package/themes/default/checkbox-list.scss +83 -0
- package/themes/default/checkbox.scss +109 -0
- package/themes/default/chips.scss +206 -0
- package/themes/default/color-display.scss +41 -0
- package/themes/default/color-picker.scss +111 -0
- package/themes/default/core.scss +96 -0
- package/themes/default/dialog.scss +16 -0
- package/themes/default/divider.scss +13 -0
- package/themes/default/dropdown-panel.scss +45 -0
- package/themes/default/file-drop-area.scss +162 -0
- package/themes/default/form-field-frame.scss +78 -0
- package/themes/default/inputs/_shared.scss +46 -0
- package/themes/default/inputs/color-input.scss +46 -0
- package/themes/default/inputs/digit-input.scss +56 -0
- package/themes/default/inputs/file-input.scss +78 -0
- package/themes/default/inputs/hex-input.scss +27 -0
- package/themes/default/inputs/input.scss +52 -0
- package/themes/default/inputs/number-input.scss +121 -0
- package/themes/default/inputs/password-input.scss +43 -0
- package/themes/default/inputs/search-bar.scss +19 -0
- package/themes/default/inputs/simple-input.scss +19 -0
- package/themes/default/kbd-shortcut.scss +13 -0
- package/themes/default/kbd.scss +20 -0
- package/themes/default/modal.scss +93 -0
- package/themes/default/progress-bar.scss +166 -0
- package/themes/default/progress-circle.scss +56 -0
- package/themes/default/radio.scss +112 -0
- package/themes/default/segment.scss +339 -0
- package/themes/default/select.scss +253 -0
- package/themes/default/slide-toggle.scss +151 -0
- package/themes/default/slider.scss +224 -0
- package/themes/default/snackbar.scss +60 -0
- package/themes/default/spinner.scss +21 -0
- package/themes/default/stars.scss +122 -0
- package/themes/default/statebox.scss +109 -0
- package/themes/default/table-pagination.scss +56 -0
- package/themes/default/table.scss +403 -0
|
@@ -0,0 +1,982 @@
|
|
|
1
|
+
import { forwardRef } from '@angular/core';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
3
|
+
import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
|
|
4
|
+
import { roundToMultiple } from 'more-rounding';
|
|
5
|
+
import { isDefined, isNull } from 'simple-bool';
|
|
6
|
+
import { ComponentColor } from '../types/colors.types';
|
|
7
|
+
import { _NgModelComponentBase } from '../_internal/ngmodel-component';
|
|
8
|
+
import { ArdDaysViewHeaderTemplateDirective, ArdDayTemplateDirective, ArdFloatingMonthTemplateDirective, ArdMonthsViewHeaderTemplateDirective, ArdMonthTemplateDirective, ArdWeekdayTemplateDirective, ArdYearsViewHeaderTemplateDirective, ArdYearTemplateDirective, } from './calendar.directives';
|
|
9
|
+
import { getMonthLayout } from './calendar.helpers';
|
|
10
|
+
import { CalendarView, } from './calendar.types';
|
|
11
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/common";
|
|
14
|
+
import * as i2 from "../buttons/button/button.component";
|
|
15
|
+
import * as i3 from "../buttons/icon-button/icon-button.component";
|
|
16
|
+
import * as i4 from "../icon/icon.component";
|
|
17
|
+
function isLeapYear(year) {
|
|
18
|
+
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
|
|
19
|
+
}
|
|
20
|
+
export class ArdiumCalendarComponent extends _NgModelComponentBase {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this._wasSelectedChecked = false;
|
|
24
|
+
//! determining today state
|
|
25
|
+
this.todayDate = new Date();
|
|
26
|
+
//! color & wrapper classes
|
|
27
|
+
this.color = ComponentColor.Primary;
|
|
28
|
+
//! open year & month setters
|
|
29
|
+
//pick a year range start so that the today date is always in the 3rd row
|
|
30
|
+
this.todayYearRangeStart = this.todayDate.getFullYear() - (this.todayDate.getFullYear() % 4) - 8;
|
|
31
|
+
this.displayedYearRangeStart = this.todayYearRangeStart;
|
|
32
|
+
this.yearRangeArrayCache = null;
|
|
33
|
+
this._activeDate = new Date(this.todayDate.getFullYear(), this.todayDate.getMonth(), this.todayDate.getDate());
|
|
34
|
+
//! selection functions
|
|
35
|
+
this._selected = null;
|
|
36
|
+
//! output events
|
|
37
|
+
this.yearSelected = new EventEmitter();
|
|
38
|
+
this.monthSelected = new EventEmitter();
|
|
39
|
+
this.selectedChange = new EventEmitter();
|
|
40
|
+
this.activeYearChange = new EventEmitter();
|
|
41
|
+
this.activeMonthChange = new EventEmitter();
|
|
42
|
+
this.viewChange = new EventEmitter();
|
|
43
|
+
this.changeEvent = new EventEmitter();
|
|
44
|
+
//! calendar entry hover & click
|
|
45
|
+
this._highlightedDay = null;
|
|
46
|
+
this._highlightedMonth = null;
|
|
47
|
+
this._highlightedYear = null;
|
|
48
|
+
this._isUsingKeyboard = false;
|
|
49
|
+
//! settings
|
|
50
|
+
this._firstWeekday = 1;
|
|
51
|
+
this._nointeract = false;
|
|
52
|
+
this._staticHeight = false;
|
|
53
|
+
//months view array
|
|
54
|
+
this.monthsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
55
|
+
//years view array
|
|
56
|
+
this._yearsArrayCache = null;
|
|
57
|
+
this._yearsArrayCacheStartYear = null;
|
|
58
|
+
//! change view functions
|
|
59
|
+
this.activeView = CalendarView.Days;
|
|
60
|
+
}
|
|
61
|
+
ngOnInit() {
|
|
62
|
+
this._updateCalendarArray();
|
|
63
|
+
this._updateWeekdayArray();
|
|
64
|
+
this._updateDisplayedYearRangeStart();
|
|
65
|
+
}
|
|
66
|
+
ngOnChanges(changes) {
|
|
67
|
+
if (this._wasSelectedChecked)
|
|
68
|
+
return;
|
|
69
|
+
this._wasSelectedChecked = true;
|
|
70
|
+
if (changes['selected']) {
|
|
71
|
+
const v = this.selected;
|
|
72
|
+
if (isNull(v))
|
|
73
|
+
return;
|
|
74
|
+
this.activeDate = new Date(v.getFullYear(), v.getMonth(), 1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
isDayToday(day) {
|
|
78
|
+
return this.activeYear == this.todayDate.getFullYear() && this.activeMonth == this.todayDate.getMonth() && day == this.todayDate.getDate();
|
|
79
|
+
}
|
|
80
|
+
isMonthToday(month) {
|
|
81
|
+
return this.activeYear == this.todayDate.getFullYear() && month == this.todayDate.getMonth();
|
|
82
|
+
}
|
|
83
|
+
isYearToday(year) {
|
|
84
|
+
return year == this.todayDate.getFullYear();
|
|
85
|
+
}
|
|
86
|
+
//! determining if an entry is selected
|
|
87
|
+
isDaySelected(day) {
|
|
88
|
+
if (day instanceof Date)
|
|
89
|
+
day = day.getDate();
|
|
90
|
+
return (this.selected != null &&
|
|
91
|
+
this.activeYear == this.selected.getFullYear() &&
|
|
92
|
+
this.activeMonth == this.selected.getMonth() &&
|
|
93
|
+
day == this.selected.getDate());
|
|
94
|
+
}
|
|
95
|
+
isMonthSelected(month) {
|
|
96
|
+
if (month instanceof Date)
|
|
97
|
+
month = month.getMonth();
|
|
98
|
+
return this.selected != null && this.activeYear == this.selected.getFullYear() && month == this.selected.getMonth();
|
|
99
|
+
}
|
|
100
|
+
isYearSelected(year) {
|
|
101
|
+
if (year instanceof Date)
|
|
102
|
+
year = year.getFullYear();
|
|
103
|
+
return this.selected != null && year == this.selected.getFullYear();
|
|
104
|
+
}
|
|
105
|
+
get ngClasses() {
|
|
106
|
+
return [`ard-color-${this.color}`, this.nointeract ? 'ard-calendar-nointeract' : '', this.staticHeight ? 'ard-calendar-static-height' : ''].join(' ');
|
|
107
|
+
}
|
|
108
|
+
_updateDisplayedYearRangeStart(forcedYear) {
|
|
109
|
+
if (isDefined(forcedYear))
|
|
110
|
+
this.displayedYearRangeStart = forcedYear;
|
|
111
|
+
//add the difference between the active year and the start of the range for the current year
|
|
112
|
+
//rounded to a multiple of 24, towards the number zero
|
|
113
|
+
//the difference may be negative, if the active year is before todayYearRangeStart
|
|
114
|
+
this.displayedYearRangeStart = this.todayYearRangeStart + roundToMultiple(this.activeYear - this.todayYearRangeStart, 24, 'to_zero');
|
|
115
|
+
}
|
|
116
|
+
get yearRangeArray() {
|
|
117
|
+
if (!this.yearRangeArrayCache) {
|
|
118
|
+
let yearRangeStart = this.displayedYearRangeStart;
|
|
119
|
+
const newArray = new Array(24).map(() => yearRangeStart++);
|
|
120
|
+
this.yearRangeArrayCache = newArray;
|
|
121
|
+
}
|
|
122
|
+
return this.yearRangeArrayCache;
|
|
123
|
+
}
|
|
124
|
+
set activeDate(v) {
|
|
125
|
+
const newDate = new Date(v);
|
|
126
|
+
if (this.activeYear != newDate.getFullYear())
|
|
127
|
+
this.yearRangeArrayCache = null;
|
|
128
|
+
this._activeDate = newDate;
|
|
129
|
+
this._updateCalendarArray();
|
|
130
|
+
}
|
|
131
|
+
get activeDate() {
|
|
132
|
+
return this._activeDate;
|
|
133
|
+
}
|
|
134
|
+
get activeYear() {
|
|
135
|
+
return this._activeDate.getFullYear();
|
|
136
|
+
}
|
|
137
|
+
set activeYear(v) {
|
|
138
|
+
const year = coerceNumberProperty(v, new Date().getFullYear());
|
|
139
|
+
this._activeDate.setFullYear(year);
|
|
140
|
+
this.activeDate = new Date(year, this.activeMonth, 1);
|
|
141
|
+
this.yearRangeArrayCache = null;
|
|
142
|
+
this._updateCalendarArray();
|
|
143
|
+
}
|
|
144
|
+
get activeMonth() {
|
|
145
|
+
return this._activeDate.getMonth();
|
|
146
|
+
}
|
|
147
|
+
set activeMonth(v) {
|
|
148
|
+
const month = coerceNumberProperty(v, new Date().getMonth());
|
|
149
|
+
const oldDateYear = this.activeYear;
|
|
150
|
+
this.activeDate = new Date(this.activeYear, month, 1);
|
|
151
|
+
if (oldDateYear != this.activeYear)
|
|
152
|
+
this.yearRangeArrayCache = null;
|
|
153
|
+
this._updateCalendarArray();
|
|
154
|
+
}
|
|
155
|
+
set selected(v) {
|
|
156
|
+
this.writeValue(v);
|
|
157
|
+
}
|
|
158
|
+
get selected() {
|
|
159
|
+
return this._selected;
|
|
160
|
+
}
|
|
161
|
+
writeValue(v) {
|
|
162
|
+
if (typeof v == 'string') {
|
|
163
|
+
//try to see if it is an array of numbers separated by a comma
|
|
164
|
+
const vAsArray1 = v.split(',').map(v => Number(v));
|
|
165
|
+
if (vAsArray1.length >= 1 && vAsArray1.length <= 3 && vAsArray1.every(v => !isNaN(v))) {
|
|
166
|
+
v = new Date(vAsArray1[0], vAsArray1[1] ?? 0, vAsArray1[2] ?? 1);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
//try to see if it is an array of numbers separated by some whitespace
|
|
170
|
+
const vAsArray2 = v.split(/\s/).map(v => Number(v));
|
|
171
|
+
if (vAsArray2.length >= 1 && vAsArray2.length <= 3 && vAsArray2.every(v => !isNaN(v))) {
|
|
172
|
+
v = new Date(vAsArray2[0], vAsArray2[1] ?? 0, vAsArray2[2] ?? 1);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
v = new Date(v);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//is a Date object && does not contain an error
|
|
180
|
+
if (v instanceof Date && !isNaN(v.valueOf())) {
|
|
181
|
+
this._selected = v;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (v == null) {
|
|
185
|
+
this._selected = null;
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.warn(`Could not parse [selected] value on <ard-calendar>, as it is not a valid value. Provided value: "${v}"`);
|
|
189
|
+
this._selected = null;
|
|
190
|
+
}
|
|
191
|
+
_emitChange() {
|
|
192
|
+
const v = this.selected;
|
|
193
|
+
this._onChangeRegistered?.(v);
|
|
194
|
+
this.selectedChange.emit(v);
|
|
195
|
+
this.changeEvent.emit(v);
|
|
196
|
+
}
|
|
197
|
+
get highlightedDay() {
|
|
198
|
+
return this._highlightedDay;
|
|
199
|
+
}
|
|
200
|
+
set highlightedDay(v) {
|
|
201
|
+
if (isNull(v)) {
|
|
202
|
+
this._highlightedDay = v;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const date = new Date(this.activeYear, this.activeMonth, v);
|
|
206
|
+
this._highlightedDay = date.getDate();
|
|
207
|
+
}
|
|
208
|
+
setHighlightedDayAdjustDate(day) {
|
|
209
|
+
this.highlightedDay = day;
|
|
210
|
+
const date = new Date(this.activeYear, this.activeMonth, day);
|
|
211
|
+
if (this.activeYear != date.getFullYear())
|
|
212
|
+
this.activeYear = date.getFullYear();
|
|
213
|
+
if (this.activeMonth != date.getMonth())
|
|
214
|
+
this.activeMonth = date.getMonth();
|
|
215
|
+
}
|
|
216
|
+
get highlightedMonth() {
|
|
217
|
+
return this._highlightedMonth;
|
|
218
|
+
}
|
|
219
|
+
set highlightedMonth(v) {
|
|
220
|
+
if (isNull(v)) {
|
|
221
|
+
this._highlightedMonth = v;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const date = new Date(this.activeYear, v, 1);
|
|
225
|
+
this._highlightedMonth = date.getMonth();
|
|
226
|
+
}
|
|
227
|
+
setHighlightedMonthAdjustDate(month) {
|
|
228
|
+
this.highlightedMonth = month;
|
|
229
|
+
const date = new Date(this.activeYear, month, 1);
|
|
230
|
+
if (this.activeYear != date.getFullYear())
|
|
231
|
+
this.activeYear = date.getFullYear();
|
|
232
|
+
}
|
|
233
|
+
get highlightedYear() {
|
|
234
|
+
return this._highlightedYear;
|
|
235
|
+
}
|
|
236
|
+
set highlightedYear(v) {
|
|
237
|
+
this._highlightedYear = v;
|
|
238
|
+
}
|
|
239
|
+
setHighlightedYearAdjustPage(year) {
|
|
240
|
+
this.highlightedYear = year;
|
|
241
|
+
if (year < this.displayedYearRangeStart || year >= this.displayedYearRangeStart + 24) {
|
|
242
|
+
//add the difference between the highlighted year and the displayed range start year
|
|
243
|
+
//rounded to a multiple of 24, away from the number zero
|
|
244
|
+
//the difference may be negative, if the first if condition is met
|
|
245
|
+
this.displayedYearRangeStart += roundToMultiple(year - this.displayedYearRangeStart, 24, 'from_zero');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
get currentAriaLabel() {
|
|
249
|
+
return new Date(this.activeYear, this.activeMonth, this.highlightedDay ?? 1).toLocaleDateString(undefined, {
|
|
250
|
+
weekday: 'long',
|
|
251
|
+
year: 'numeric',
|
|
252
|
+
month: 'long',
|
|
253
|
+
day: 'numeric',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
onCalendarDayMouseover(day) {
|
|
257
|
+
if (day == null)
|
|
258
|
+
return;
|
|
259
|
+
if (this._isUsingKeyboard)
|
|
260
|
+
return;
|
|
261
|
+
this.highlightedDay = day;
|
|
262
|
+
}
|
|
263
|
+
onCalendarMonthMouseover(month) {
|
|
264
|
+
if (this._isUsingKeyboard)
|
|
265
|
+
return;
|
|
266
|
+
this.highlightedMonth = month;
|
|
267
|
+
}
|
|
268
|
+
onCalendarYearMouseover(year) {
|
|
269
|
+
if (this._isUsingKeyboard)
|
|
270
|
+
return;
|
|
271
|
+
this.highlightedYear = year;
|
|
272
|
+
}
|
|
273
|
+
onDocumentMousemove() {
|
|
274
|
+
if (!this._isUsingKeyboard)
|
|
275
|
+
this.highlightedDay = null;
|
|
276
|
+
this._isUsingKeyboard = false;
|
|
277
|
+
}
|
|
278
|
+
onDocumentKeydown() {
|
|
279
|
+
this._isUsingKeyboard = true;
|
|
280
|
+
}
|
|
281
|
+
onCalendarDayClick(day) {
|
|
282
|
+
if (day == null)
|
|
283
|
+
return;
|
|
284
|
+
this.selectDay(day);
|
|
285
|
+
this.focus();
|
|
286
|
+
this.highlightedDay = day;
|
|
287
|
+
}
|
|
288
|
+
onCalendarMonthClick(month) {
|
|
289
|
+
this.selectMonth(month);
|
|
290
|
+
}
|
|
291
|
+
onCalendarYearClick(year) {
|
|
292
|
+
this.selectYear(year);
|
|
293
|
+
}
|
|
294
|
+
onDayGridFocus() {
|
|
295
|
+
this.highlightedDay = 1;
|
|
296
|
+
}
|
|
297
|
+
onDayGridBlur() {
|
|
298
|
+
this.highlightedDay = null;
|
|
299
|
+
}
|
|
300
|
+
onDayGridClick() {
|
|
301
|
+
this.highlightedDay ??= 1;
|
|
302
|
+
}
|
|
303
|
+
onMonthGridFocus() {
|
|
304
|
+
this.highlightedMonth = 0;
|
|
305
|
+
}
|
|
306
|
+
onMonthGridBlur() {
|
|
307
|
+
this.highlightedMonth = null;
|
|
308
|
+
}
|
|
309
|
+
onMonthGridClick() {
|
|
310
|
+
this.highlightedMonth ??= 0;
|
|
311
|
+
}
|
|
312
|
+
onYearGridFocus() {
|
|
313
|
+
this.highlightedYear = this.displayedYearRangeStart;
|
|
314
|
+
}
|
|
315
|
+
onYearGridBlur() {
|
|
316
|
+
this.highlightedYear = null;
|
|
317
|
+
}
|
|
318
|
+
onYearGridClick() {
|
|
319
|
+
this.highlightedYear ??= this.displayedYearRangeStart;
|
|
320
|
+
}
|
|
321
|
+
//! main grid keyboard controls
|
|
322
|
+
onMainGridKeydown(event) {
|
|
323
|
+
switch (event.code) {
|
|
324
|
+
case 'Space':
|
|
325
|
+
case 'Enter':
|
|
326
|
+
this._onEnterPress(event);
|
|
327
|
+
break;
|
|
328
|
+
case 'ArrowUp':
|
|
329
|
+
this._onArrowUpPress(event);
|
|
330
|
+
break;
|
|
331
|
+
case 'ArrowDown':
|
|
332
|
+
this._onArrowDownPress(event);
|
|
333
|
+
break;
|
|
334
|
+
case 'ArrowLeft':
|
|
335
|
+
this._onArrowLeftPress(event);
|
|
336
|
+
break;
|
|
337
|
+
case 'ArrowRight':
|
|
338
|
+
this._onArrowRightPress(event);
|
|
339
|
+
break;
|
|
340
|
+
case 'Home':
|
|
341
|
+
this._onHomePress(event);
|
|
342
|
+
break;
|
|
343
|
+
case 'End':
|
|
344
|
+
this._onEndPress(event);
|
|
345
|
+
break;
|
|
346
|
+
case 'PageUp':
|
|
347
|
+
this._onPageUpPress(event);
|
|
348
|
+
break;
|
|
349
|
+
case 'PageDown':
|
|
350
|
+
this._onPageDownPress(event);
|
|
351
|
+
break;
|
|
352
|
+
default:
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//select currently selected entry
|
|
357
|
+
_onEnterPress(event) {
|
|
358
|
+
event.preventDefault();
|
|
359
|
+
this.selectCurrentlyHighlighted();
|
|
360
|
+
}
|
|
361
|
+
//highlight the entry one line above
|
|
362
|
+
_onArrowUpPress(event) {
|
|
363
|
+
event.preventDefault();
|
|
364
|
+
switch (this.activeView) {
|
|
365
|
+
case CalendarView.Days:
|
|
366
|
+
this.highlightPreviousDay(7);
|
|
367
|
+
break;
|
|
368
|
+
case CalendarView.Months:
|
|
369
|
+
this.highlightPreviousMonth(3); //3 months per line
|
|
370
|
+
break;
|
|
371
|
+
case CalendarView.Years:
|
|
372
|
+
this.highlightPreviousYear(4); //4 years per line
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//highlight the entry one line below
|
|
377
|
+
_onArrowDownPress(event) {
|
|
378
|
+
event.preventDefault();
|
|
379
|
+
switch (this.activeView) {
|
|
380
|
+
case CalendarView.Days:
|
|
381
|
+
this.highlightNextDay(7);
|
|
382
|
+
break;
|
|
383
|
+
case CalendarView.Months:
|
|
384
|
+
this.highlightNextMonth(3); //3 months per line
|
|
385
|
+
break;
|
|
386
|
+
case CalendarView.Years:
|
|
387
|
+
this.highlightNextYear(4); //4 years per line
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
//highlight previous entry
|
|
392
|
+
_onArrowLeftPress(event) {
|
|
393
|
+
event.preventDefault();
|
|
394
|
+
switch (this.activeView) {
|
|
395
|
+
case CalendarView.Days:
|
|
396
|
+
this.highlightPreviousDay();
|
|
397
|
+
break;
|
|
398
|
+
case CalendarView.Months:
|
|
399
|
+
this.highlightPreviousMonth();
|
|
400
|
+
break;
|
|
401
|
+
case CalendarView.Years:
|
|
402
|
+
this.highlightPreviousYear();
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//highlight next entry
|
|
407
|
+
_onArrowRightPress(event) {
|
|
408
|
+
event.preventDefault();
|
|
409
|
+
switch (this.activeView) {
|
|
410
|
+
case CalendarView.Days:
|
|
411
|
+
this.highlightNextDay();
|
|
412
|
+
break;
|
|
413
|
+
case CalendarView.Months:
|
|
414
|
+
this.highlightNextMonth();
|
|
415
|
+
break;
|
|
416
|
+
case CalendarView.Years:
|
|
417
|
+
this.highlightNextYear();
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//highlight first entry on the page
|
|
422
|
+
_onHomePress(event) {
|
|
423
|
+
event.preventDefault();
|
|
424
|
+
switch (this.activeView) {
|
|
425
|
+
case CalendarView.Days:
|
|
426
|
+
this.highlightFirstDay();
|
|
427
|
+
break;
|
|
428
|
+
case CalendarView.Months:
|
|
429
|
+
this.highlightFirstMonth();
|
|
430
|
+
break;
|
|
431
|
+
case CalendarView.Years:
|
|
432
|
+
this.highlightFirstYear();
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
//highlight last entry on the page
|
|
437
|
+
_onEndPress(event) {
|
|
438
|
+
event.preventDefault();
|
|
439
|
+
switch (this.activeView) {
|
|
440
|
+
case CalendarView.Days:
|
|
441
|
+
this.highlightLastDay();
|
|
442
|
+
break;
|
|
443
|
+
case CalendarView.Months:
|
|
444
|
+
this.highlightLastMonth();
|
|
445
|
+
break;
|
|
446
|
+
case CalendarView.Years:
|
|
447
|
+
this.highlightLastYear();
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//alone: highlight same entry on the previous page
|
|
452
|
+
//with alt: highlight same entry multiple pages before (days view: 12 pages, months view: 10 pages, years view: 5 pages)
|
|
453
|
+
_onPageUpPress(event) {
|
|
454
|
+
event.preventDefault();
|
|
455
|
+
switch (this.activeView) {
|
|
456
|
+
case CalendarView.Days:
|
|
457
|
+
if (event.altKey)
|
|
458
|
+
this.highlightSameDayPreviousYear();
|
|
459
|
+
else
|
|
460
|
+
this.highlightSameDayPreviousMonth();
|
|
461
|
+
break;
|
|
462
|
+
case CalendarView.Months:
|
|
463
|
+
this.highlightSameMonthPreviousYear(event.altKey);
|
|
464
|
+
break;
|
|
465
|
+
case CalendarView.Years:
|
|
466
|
+
this.highlightSameYearPreviousPage(event.altKey);
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
//alone: highlight same entry on the next page
|
|
471
|
+
//with alt: highlight same entry multiple pages after (days view: 12 pages, months view: 10 pages, years view: 5 pages)
|
|
472
|
+
_onPageDownPress(event) {
|
|
473
|
+
event.preventDefault();
|
|
474
|
+
switch (this.activeView) {
|
|
475
|
+
case CalendarView.Days:
|
|
476
|
+
if (event.altKey)
|
|
477
|
+
this.highlightSameDayNextYear();
|
|
478
|
+
else
|
|
479
|
+
this.highlightSameDayNextMonth();
|
|
480
|
+
break;
|
|
481
|
+
case CalendarView.Months:
|
|
482
|
+
this.highlightSameMonthNextYear(event.altKey);
|
|
483
|
+
break;
|
|
484
|
+
case CalendarView.Years:
|
|
485
|
+
this.highlightSameYearNextPage(event.altKey);
|
|
486
|
+
break;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//! manipulation methods
|
|
490
|
+
//selecting
|
|
491
|
+
selectDay(day) {
|
|
492
|
+
if (this.isDaySelected(day))
|
|
493
|
+
return;
|
|
494
|
+
if (isNull(day)) {
|
|
495
|
+
if (!isDefined(this.selected))
|
|
496
|
+
return;
|
|
497
|
+
this.selected = null;
|
|
498
|
+
this._emitChange();
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
if (day instanceof Date)
|
|
502
|
+
day = day.getDate();
|
|
503
|
+
this.selected = new Date(this.activeYear, this.activeMonth, day);
|
|
504
|
+
this._emitChange();
|
|
505
|
+
}
|
|
506
|
+
selectMonth(month) {
|
|
507
|
+
if (isNull(month)) {
|
|
508
|
+
this.activeMonth = null;
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
if (month instanceof Date)
|
|
512
|
+
month = month.getMonth();
|
|
513
|
+
this.activeMonth = month;
|
|
514
|
+
this.activeMonthChange.emit(month);
|
|
515
|
+
this.monthSelected.emit(month);
|
|
516
|
+
this.openDaysView();
|
|
517
|
+
}
|
|
518
|
+
selectYear(year) {
|
|
519
|
+
if (isNull(year)) {
|
|
520
|
+
this.activeYear = null;
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
if (year instanceof Date)
|
|
524
|
+
year = year.getFullYear();
|
|
525
|
+
this.activeYear = year;
|
|
526
|
+
this.activeYearChange.emit(year);
|
|
527
|
+
this.yearSelected.emit(year);
|
|
528
|
+
this.openMonthsView();
|
|
529
|
+
}
|
|
530
|
+
selectCurrentlyHighlighted() {
|
|
531
|
+
if (!isDefined(this.highlightedDay))
|
|
532
|
+
return;
|
|
533
|
+
switch (this.activeView) {
|
|
534
|
+
case CalendarView.Days:
|
|
535
|
+
this.selectDay(this.highlightedDay);
|
|
536
|
+
return;
|
|
537
|
+
case CalendarView.Months:
|
|
538
|
+
this.selectMonth(this.highlightedMonth);
|
|
539
|
+
return;
|
|
540
|
+
case CalendarView.Years:
|
|
541
|
+
this.selectYear(this.highlightedYear);
|
|
542
|
+
return;
|
|
543
|
+
default:
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
//active months/years
|
|
548
|
+
changeMonth(offset) {
|
|
549
|
+
const oldyear = this.activeYear;
|
|
550
|
+
this.activeMonth += offset;
|
|
551
|
+
if (this.activeYear != oldyear)
|
|
552
|
+
this.activeYearChange.emit(this.activeYear);
|
|
553
|
+
this.activeMonthChange.emit(this.activeMonth);
|
|
554
|
+
}
|
|
555
|
+
changeYear(offset) {
|
|
556
|
+
this.activeYear += offset;
|
|
557
|
+
this.activeYearChange.emit(this.activeYear);
|
|
558
|
+
}
|
|
559
|
+
//changing year page
|
|
560
|
+
changeYearsViewPage(pages) {
|
|
561
|
+
this.displayedYearRangeStart += 24 * pages;
|
|
562
|
+
}
|
|
563
|
+
//next/prev highlighting
|
|
564
|
+
highlightNextDay(offset = 1) {
|
|
565
|
+
const currentDay = this.highlightedDay;
|
|
566
|
+
if (!isDefined(currentDay)) {
|
|
567
|
+
this.highlightedDay = 1;
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
this.setHighlightedDayAdjustDate(currentDay + offset);
|
|
571
|
+
}
|
|
572
|
+
highlightPreviousDay(offset = 1) {
|
|
573
|
+
this.highlightNextDay(offset * -1);
|
|
574
|
+
}
|
|
575
|
+
highlightNextMonth(offset = 1) {
|
|
576
|
+
const currentMonth = this.highlightedMonth;
|
|
577
|
+
if (!isDefined(currentMonth)) {
|
|
578
|
+
this.highlightedMonth = 0;
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
this.setHighlightedMonthAdjustDate(currentMonth + offset);
|
|
582
|
+
}
|
|
583
|
+
highlightPreviousMonth(offset = 1) {
|
|
584
|
+
this.highlightNextMonth(offset * -1);
|
|
585
|
+
}
|
|
586
|
+
highlightNextYear(offset = 1) {
|
|
587
|
+
const currentYear = this.highlightedYear;
|
|
588
|
+
if (!isDefined(currentYear)) {
|
|
589
|
+
this.highlightedYear = 0;
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
this.setHighlightedYearAdjustPage(currentYear + offset);
|
|
593
|
+
}
|
|
594
|
+
highlightPreviousYear(offset = 1) {
|
|
595
|
+
this.highlightNextYear(offset * -1);
|
|
596
|
+
}
|
|
597
|
+
//first/last highlighting
|
|
598
|
+
highlightFirstDay() {
|
|
599
|
+
this.highlightedDay = 1;
|
|
600
|
+
}
|
|
601
|
+
highlightLastDay() {
|
|
602
|
+
switch (this.activeMonth + 1) {
|
|
603
|
+
case 1:
|
|
604
|
+
case 3:
|
|
605
|
+
case 5:
|
|
606
|
+
case 7:
|
|
607
|
+
case 8:
|
|
608
|
+
case 10:
|
|
609
|
+
case 12:
|
|
610
|
+
this.highlightedDay = 31;
|
|
611
|
+
break;
|
|
612
|
+
case 4:
|
|
613
|
+
case 6:
|
|
614
|
+
case 9:
|
|
615
|
+
case 11:
|
|
616
|
+
this.highlightedDay = 30;
|
|
617
|
+
break;
|
|
618
|
+
case 2:
|
|
619
|
+
if (isLeapYear(this.activeYear))
|
|
620
|
+
this.highlightedDay = 29;
|
|
621
|
+
else
|
|
622
|
+
this.highlightedDay = 28;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
highlightFirstMonth() {
|
|
626
|
+
this.highlightedMonth = 0;
|
|
627
|
+
}
|
|
628
|
+
highlightLastMonth() {
|
|
629
|
+
this.highlightedMonth = 11;
|
|
630
|
+
}
|
|
631
|
+
highlightFirstYear() {
|
|
632
|
+
this.highlightedYear = this.displayedYearRangeStart;
|
|
633
|
+
}
|
|
634
|
+
highlightLastYear() {
|
|
635
|
+
this.highlightedYear = this.displayedYearRangeStart + 23; //24 years per page
|
|
636
|
+
}
|
|
637
|
+
//same day next/prev month/year
|
|
638
|
+
highlightSameDayNextMonth() {
|
|
639
|
+
this.activeMonth++;
|
|
640
|
+
this._fixDateAfterMonthChange();
|
|
641
|
+
}
|
|
642
|
+
highlightSameDayPreviousMonth() {
|
|
643
|
+
this.activeMonth--;
|
|
644
|
+
this._fixDateAfterMonthChange();
|
|
645
|
+
}
|
|
646
|
+
_fixDateAfterMonthChange() {
|
|
647
|
+
switch (this.activeMonth + 1) {
|
|
648
|
+
case 1:
|
|
649
|
+
case 3:
|
|
650
|
+
case 5:
|
|
651
|
+
case 7:
|
|
652
|
+
case 8:
|
|
653
|
+
case 10:
|
|
654
|
+
case 12:
|
|
655
|
+
//do nothing
|
|
656
|
+
break;
|
|
657
|
+
case 4:
|
|
658
|
+
case 6:
|
|
659
|
+
case 9:
|
|
660
|
+
case 11:
|
|
661
|
+
//only do if day is 31
|
|
662
|
+
if (this.highlightedDay == 31)
|
|
663
|
+
this.highlightedDay = 30;
|
|
664
|
+
break;
|
|
665
|
+
case 2: {
|
|
666
|
+
//skip if below 29 or null
|
|
667
|
+
if (!this.highlightedDay || this.highlightedDay < 29)
|
|
668
|
+
break;
|
|
669
|
+
if (isLeapYear(this.activeYear))
|
|
670
|
+
this.highlightedDay = 29;
|
|
671
|
+
else
|
|
672
|
+
this.highlightedDay = 28;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
highlightSameDayNextYear() {
|
|
677
|
+
this.activeYear++;
|
|
678
|
+
this._fixDateAfterYearChange();
|
|
679
|
+
}
|
|
680
|
+
highlightSameDayPreviousYear() {
|
|
681
|
+
this.activeYear--;
|
|
682
|
+
this._fixDateAfterYearChange();
|
|
683
|
+
}
|
|
684
|
+
_fixDateAfterYearChange() {
|
|
685
|
+
if (this.highlightedDay != 29)
|
|
686
|
+
return; //skip if not 29th day is selected
|
|
687
|
+
if (isLeapYear(this.activeYear))
|
|
688
|
+
return; //skip if nea year is a leap year
|
|
689
|
+
if (this.activeMonth != 1)
|
|
690
|
+
return; //skip if not february
|
|
691
|
+
this.highlightedDay = 28;
|
|
692
|
+
}
|
|
693
|
+
//same month next/prev year
|
|
694
|
+
highlightSameMonthNextYear(multiple) {
|
|
695
|
+
this.activeYear += multiple ? 10 : 1;
|
|
696
|
+
}
|
|
697
|
+
highlightSameMonthPreviousYear(multiple) {
|
|
698
|
+
this.activeYear -= multiple ? 10 : 1;
|
|
699
|
+
}
|
|
700
|
+
//same year next/prev page(s)
|
|
701
|
+
highlightSameYearNextPage(multiple) {
|
|
702
|
+
if (!isDefined(this.highlightedYear)) {
|
|
703
|
+
this.highlightedYear = this.displayedYearRangeStart;
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
this.setHighlightedYearAdjustPage(this.highlightedYear + (multiple ? 60 : 24));
|
|
707
|
+
}
|
|
708
|
+
highlightSameYearPreviousPage(multiple) {
|
|
709
|
+
if (!isDefined(this.highlightedYear)) {
|
|
710
|
+
this.highlightedYear = this.displayedYearRangeStart;
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
this.setHighlightedYearAdjustPage(this.highlightedYear - (multiple ? 60 : 24));
|
|
714
|
+
}
|
|
715
|
+
get firstWeekday() {
|
|
716
|
+
return this._firstWeekday;
|
|
717
|
+
}
|
|
718
|
+
set firstWeekday(v) {
|
|
719
|
+
this._firstWeekday = coerceNumberProperty(v, 1) % 7;
|
|
720
|
+
this._updateCalendarArray();
|
|
721
|
+
this._updateWeekdayArray();
|
|
722
|
+
}
|
|
723
|
+
get nointeract() {
|
|
724
|
+
return this._nointeract || this.disabled;
|
|
725
|
+
}
|
|
726
|
+
set nointeract(v) {
|
|
727
|
+
this._nointeract = coerceBooleanProperty(v);
|
|
728
|
+
}
|
|
729
|
+
get staticHeight() {
|
|
730
|
+
return this._staticHeight;
|
|
731
|
+
}
|
|
732
|
+
set staticHeight(v) {
|
|
733
|
+
this._staticHeight = coerceBooleanProperty(v);
|
|
734
|
+
}
|
|
735
|
+
_updateCalendarArray() {
|
|
736
|
+
const resultObj = getMonthLayout(this._activeDate, this.firstWeekday);
|
|
737
|
+
this.reserveTopRow = resultObj.leadingSpaces < 3;
|
|
738
|
+
this.calendarArray = resultObj.array;
|
|
739
|
+
}
|
|
740
|
+
getYearsArray() {
|
|
741
|
+
const year = this.displayedYearRangeStart;
|
|
742
|
+
if (this._yearsArrayCacheStartYear == year && isDefined(this._yearsArrayCache))
|
|
743
|
+
return this._yearsArrayCache;
|
|
744
|
+
const newArray = [];
|
|
745
|
+
for (let i = year; i < year + 24; i++) {
|
|
746
|
+
newArray.push(i);
|
|
747
|
+
}
|
|
748
|
+
this._yearsArrayCache = newArray;
|
|
749
|
+
this._yearsArrayCacheStartYear = year;
|
|
750
|
+
return newArray;
|
|
751
|
+
}
|
|
752
|
+
_updateWeekdayArray() {
|
|
753
|
+
this.weekdayArray = [0, 1, 2, 3, 4, 5, 6].map(v => (v + this.firstWeekday) % 7);
|
|
754
|
+
}
|
|
755
|
+
set startView(v) {
|
|
756
|
+
this.activeView = v;
|
|
757
|
+
}
|
|
758
|
+
openYearsView() {
|
|
759
|
+
this.activeView = CalendarView.Years;
|
|
760
|
+
this._updateDisplayedYearRangeStart();
|
|
761
|
+
this.viewChange.emit(this.activeView);
|
|
762
|
+
}
|
|
763
|
+
openMonthsView() {
|
|
764
|
+
this.activeView = CalendarView.Months;
|
|
765
|
+
//bring back old value
|
|
766
|
+
const oldYear = this.activeYear;
|
|
767
|
+
this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
|
|
768
|
+
//emit events
|
|
769
|
+
this.viewChange.emit(this.activeView);
|
|
770
|
+
if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
|
|
771
|
+
this.activeYearChange.emit(this.activeYear);
|
|
772
|
+
}
|
|
773
|
+
openDaysView() {
|
|
774
|
+
this.activeView = CalendarView.Days;
|
|
775
|
+
//bring back old values
|
|
776
|
+
const oldYear = this.activeYear;
|
|
777
|
+
this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
|
|
778
|
+
const oldMonth = this.activeMonth;
|
|
779
|
+
this.activeMonth = this.activeMonth ?? this.todayDate.getMonth();
|
|
780
|
+
//emit events
|
|
781
|
+
this.viewChange.emit(this.activeView);
|
|
782
|
+
if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
|
|
783
|
+
this.activeYearChange.emit(this.activeYear);
|
|
784
|
+
if (oldMonth != this.activeMonth && this.activeMonth == this.todayDate.getMonth())
|
|
785
|
+
this.activeMonthChange.emit(this.activeMonth);
|
|
786
|
+
}
|
|
787
|
+
//! context getters
|
|
788
|
+
//headers
|
|
789
|
+
getYearsViewHeaderContext() {
|
|
790
|
+
const yearRangeStart = this.displayedYearRangeStart;
|
|
791
|
+
const yearRangeEnd = yearRangeStart + 23;
|
|
792
|
+
const dateRange = {
|
|
793
|
+
low: new Date(yearRangeStart, 0, 1),
|
|
794
|
+
high: new Date(yearRangeEnd, 0, 1),
|
|
795
|
+
};
|
|
796
|
+
return {
|
|
797
|
+
nextPage: () => {
|
|
798
|
+
this.changeYearsViewPage(+1);
|
|
799
|
+
},
|
|
800
|
+
prevPage: () => {
|
|
801
|
+
this.changeYearsViewPage(-1);
|
|
802
|
+
},
|
|
803
|
+
openDaysView: () => {
|
|
804
|
+
this.openDaysView();
|
|
805
|
+
},
|
|
806
|
+
yearRange: {
|
|
807
|
+
low: yearRangeStart,
|
|
808
|
+
high: yearRangeEnd,
|
|
809
|
+
},
|
|
810
|
+
dateRange,
|
|
811
|
+
$implicit: dateRange,
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
getMonthsViewHeaderContext() {
|
|
815
|
+
return {
|
|
816
|
+
openYearsView: () => {
|
|
817
|
+
this.openYearsView();
|
|
818
|
+
},
|
|
819
|
+
openDaysView: () => {
|
|
820
|
+
this.openDaysView();
|
|
821
|
+
},
|
|
822
|
+
year: this.activeYear,
|
|
823
|
+
date: this.activeDate,
|
|
824
|
+
$implicit: this.activeYear,
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
getDaysViewHeaderContext() {
|
|
828
|
+
return {
|
|
829
|
+
nextMonth: () => {
|
|
830
|
+
this.changeMonth(+1);
|
|
831
|
+
},
|
|
832
|
+
prevMonth: () => {
|
|
833
|
+
this.changeMonth(-1);
|
|
834
|
+
},
|
|
835
|
+
nextYear: () => {
|
|
836
|
+
this.changeYear(+1);
|
|
837
|
+
},
|
|
838
|
+
prevYear: () => {
|
|
839
|
+
this.changeYear(-1);
|
|
840
|
+
},
|
|
841
|
+
openYearsView: () => {
|
|
842
|
+
this.openYearsView();
|
|
843
|
+
},
|
|
844
|
+
openMonthsView: () => {
|
|
845
|
+
this.openMonthsView();
|
|
846
|
+
},
|
|
847
|
+
year: this.activeYear,
|
|
848
|
+
month: this.activeMonth,
|
|
849
|
+
date: this.activeDate,
|
|
850
|
+
$implicit: this.activeDate,
|
|
851
|
+
};
|
|
852
|
+
}
|
|
853
|
+
//weekday
|
|
854
|
+
getWeekdayContext(dayIndex) {
|
|
855
|
+
const date = new Date(1970, 0, 4 + dayIndex);
|
|
856
|
+
return {
|
|
857
|
+
dayIndex,
|
|
858
|
+
date,
|
|
859
|
+
$implicit: date,
|
|
860
|
+
};
|
|
861
|
+
}
|
|
862
|
+
//floating month
|
|
863
|
+
getFloatingMonthContext() {
|
|
864
|
+
return {
|
|
865
|
+
month: this.activeMonth,
|
|
866
|
+
date: this.activeDate,
|
|
867
|
+
$implicit: this.activeDate,
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
//grid elements (year, month, day)
|
|
871
|
+
getYearContext(year) {
|
|
872
|
+
return {
|
|
873
|
+
value: year,
|
|
874
|
+
date: new Date(this.activeYear, 0, 1),
|
|
875
|
+
$implicit: year,
|
|
876
|
+
select: (year) => {
|
|
877
|
+
this.selectYear(year);
|
|
878
|
+
},
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
getMonthContext(month) {
|
|
882
|
+
const date = new Date(this.activeYear, month, 1);
|
|
883
|
+
return {
|
|
884
|
+
month,
|
|
885
|
+
date,
|
|
886
|
+
$implicit: date,
|
|
887
|
+
select: (month) => {
|
|
888
|
+
this.selectMonth(month);
|
|
889
|
+
},
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
getDayContext(day) {
|
|
893
|
+
return {
|
|
894
|
+
value: day,
|
|
895
|
+
date: new Date(this.activeYear, this.activeMonth, day),
|
|
896
|
+
$implicit: day,
|
|
897
|
+
select: (day) => {
|
|
898
|
+
this.selectDay(day);
|
|
899
|
+
},
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
903
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: "color", activeYear: "activeYear", activeMonth: "activeMonth", selected: "selected", firstWeekday: "firstWeekday", nointeract: "nointeract", staticHeight: "staticHeight", startView: "startView" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", selectedChange: "selectedChange", activeYearChange: "activeYearChange", activeMonthChange: "activeMonthChange", viewChange: "viewChange", changeEvent: "change" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, providers: [
|
|
904
|
+
{
|
|
905
|
+
provide: NG_VALUE_ACCESSOR,
|
|
906
|
+
useExisting: forwardRef(() => ArdiumCalendarComponent),
|
|
907
|
+
multi: true,
|
|
908
|
+
},
|
|
909
|
+
], queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: ArdYearsViewHeaderTemplateDirective, descendants: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: ArdMonthsViewHeaderTemplateDirective, descendants: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: ArdDaysViewHeaderTemplateDirective, descendants: true }, { propertyName: "weekdayTemplate", first: true, predicate: ArdWeekdayTemplateDirective, descendants: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: ArdFloatingMonthTemplateDirective, descendants: true }, { propertyName: "yearTemplate", first: true, predicate: ArdYearTemplateDirective, descendants: true }, { propertyName: "monthTemplate", first: true, predicate: ArdMonthTemplateDirective, descendants: true }, { propertyName: "dayTemplate", first: true, predicate: ArdDayTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n —\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumButtonComponent, selector: "ard-button", inputs: ["variant", "alignIcon", "vertical", "icon"] }, { kind: "component", type: i3.ArdiumIconButtonComponent, selector: "ard-icon-button", inputs: ["wrapperClasses", "color", "compact"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
910
|
+
}
|
|
911
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
|
|
912
|
+
type: Component,
|
|
913
|
+
args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
914
|
+
{
|
|
915
|
+
provide: NG_VALUE_ACCESSOR,
|
|
916
|
+
useExisting: forwardRef(() => ArdiumCalendarComponent),
|
|
917
|
+
multi: true,
|
|
918
|
+
},
|
|
919
|
+
], template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n —\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"] }]
|
|
920
|
+
}], propDecorators: { color: [{
|
|
921
|
+
type: Input
|
|
922
|
+
}], activeYear: [{
|
|
923
|
+
type: Input
|
|
924
|
+
}], activeMonth: [{
|
|
925
|
+
type: Input
|
|
926
|
+
}], selected: [{
|
|
927
|
+
type: Input
|
|
928
|
+
}], yearSelected: [{
|
|
929
|
+
type: Output
|
|
930
|
+
}], monthSelected: [{
|
|
931
|
+
type: Output
|
|
932
|
+
}], selectedChange: [{
|
|
933
|
+
type: Output
|
|
934
|
+
}], activeYearChange: [{
|
|
935
|
+
type: Output
|
|
936
|
+
}], activeMonthChange: [{
|
|
937
|
+
type: Output
|
|
938
|
+
}], viewChange: [{
|
|
939
|
+
type: Output
|
|
940
|
+
}], changeEvent: [{
|
|
941
|
+
type: Output,
|
|
942
|
+
args: ['change']
|
|
943
|
+
}], onDocumentMousemove: [{
|
|
944
|
+
type: HostListener,
|
|
945
|
+
args: ['document:mousemove']
|
|
946
|
+
}], onDocumentKeydown: [{
|
|
947
|
+
type: HostListener,
|
|
948
|
+
args: ['document:keydown']
|
|
949
|
+
}], firstWeekday: [{
|
|
950
|
+
type: Input
|
|
951
|
+
}], nointeract: [{
|
|
952
|
+
type: Input
|
|
953
|
+
}], staticHeight: [{
|
|
954
|
+
type: Input
|
|
955
|
+
}], startView: [{
|
|
956
|
+
type: Input
|
|
957
|
+
}], yearsViewHeaderTemplate: [{
|
|
958
|
+
type: ContentChild,
|
|
959
|
+
args: [ArdYearsViewHeaderTemplateDirective]
|
|
960
|
+
}], monthsViewHeaderTemplate: [{
|
|
961
|
+
type: ContentChild,
|
|
962
|
+
args: [ArdMonthsViewHeaderTemplateDirective]
|
|
963
|
+
}], daysViewHeaderTemplate: [{
|
|
964
|
+
type: ContentChild,
|
|
965
|
+
args: [ArdDaysViewHeaderTemplateDirective]
|
|
966
|
+
}], weekdayTemplate: [{
|
|
967
|
+
type: ContentChild,
|
|
968
|
+
args: [ArdWeekdayTemplateDirective]
|
|
969
|
+
}], floatingMonthTemplate: [{
|
|
970
|
+
type: ContentChild,
|
|
971
|
+
args: [ArdFloatingMonthTemplateDirective]
|
|
972
|
+
}], yearTemplate: [{
|
|
973
|
+
type: ContentChild,
|
|
974
|
+
args: [ArdYearTemplateDirective]
|
|
975
|
+
}], monthTemplate: [{
|
|
976
|
+
type: ContentChild,
|
|
977
|
+
args: [ArdMonthTemplateDirective]
|
|
978
|
+
}], dayTemplate: [{
|
|
979
|
+
type: ContentChild,
|
|
980
|
+
args: [ArdDayTemplateDirective]
|
|
981
|
+
}] } });
|
|
982
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxrQ0FBa0MsRUFDbEMsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEdBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDSCxZQUFZLEdBVWYsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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QkFHbEQsc0JBQXNCO3NCQURyQixZQUFZO3VCQUFDLGtDQUFrQztnQkFJaEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLDJCQUEyQjtnQkFJekMscUJBQXFCO3NCQURwQixZQUFZO3VCQUFDLGlDQUFpQztnQkFJL0MsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLHdCQUF3QjtnQkFHdEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLHlCQUF5QjtnQkFHdkMsV0FBVztzQkFEVixZQUFZO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRoaXNSZWNlaXZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7IE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFyZGl1bS11aS9kZXZraXQnO1xuaW1wb3J0IHsgcm91bmRUb011bHRpcGxlIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTnVsbCB9IGZyb20gJ3NpbXBsZS1ib29sJztcbmltcG9ydCB7IENvbXBvbmVudENvbG9yIH0gZnJvbSAnLi4vdHlwZXMvY29sb3JzLnR5cGVzJztcbmltcG9ydCB7IF9OZ01vZGVsQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9uZ21vZGVsLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkRmxvYXRpbmdNb250aFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRNb250aFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRZZWFyVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vY2FsZW5kYXIuZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBnZXRNb250aExheW91dCB9IGZyb20gJy4vY2FsZW5kYXIuaGVscGVycyc7XG5pbXBvcnQge1xuICAgIENhbGVuZGFyVmlldyxcbiAgICBDYWxlbmRhckRheUNvbnRleHQsXG4gICAgQ2FsZW5kYXJEYXlzVmlld0hlYWRlckNvbnRleHQsXG4gICAgQ2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dCxcbiAgICBDYWxlbmRhck1vbnRoQ29udGV4dCxcbiAgICBDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0LFxuICAgIENhbGVuZGFyV2Vla2RheUNvbnRleHQsXG4gICAgQ2FsZW5kYXJZZWFyQ29udGV4dCxcbiAgICBDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQsXG4gICAgRGF0ZVJhbmdlLFxufSBmcm9tICcuL2NhbGVuZGFyLnR5cGVzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5mdW5jdGlvbiBpc0xlYXBZZWFyKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoeWVhciAlIDQgPT0gMCAmJiB5ZWFyICUgMTAwICE9IDApIHx8IHllYXIgJSA0MDAgPT0gMDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcmQtY2FsZW5kYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdlZWtkYXlBcnJheSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVEaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCgpO1xuICAgIH1cbiAgICBwcml2YXRlIF93YXNTZWxlY3RlZENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl93YXNTZWxlY3RlZENoZWNrZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5fd2FzU2VsZWN0ZWRDaGVja2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWQnXSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc2VsZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoaXNOdWxsKHYpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwgdi5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vISBkZXRlcm1pbmluZyB0b2RheSBzdGF0ZVxuICAgIHRvZGF5RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBpc0RheVRvZGF5KGRheTogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpICYmIGRheSA9PSB0aGlzLnRvZGF5RGF0ZS5nZXREYXRlKCk7XG4gICAgfVxuICAgIGlzTW9udGhUb2RheShtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpO1xuICAgIH1cbiAgICBpc1llYXJUb2RheSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICAvLyEgZGV0ZXJtaW5pbmcgaWYgYW4gZW50cnkgaXMgc2VsZWN0ZWRcbiAgICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheSBpbnN0YW5jZW9mIERhdGUpIGRheSA9IGRheS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9udGggPT0gdGhpcy5zZWxlY3RlZC5nZXRNb250aCgpICYmXG4gICAgICAgICAgICBkYXkgPT0gdGhpcy5zZWxlY3RlZC5nZXREYXRlKClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaXNNb250aFNlbGVjdGVkKG1vbnRoOiBudW1iZXIgfCBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQgIT0gbnVsbCAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy5zZWxlY3RlZC5nZXRGdWxsWWVhcigpICYmIG1vbnRoID09IHRoaXMuc2VsZWN0ZWQuZ2V0TW9udGgoKTtcbiAgICB9XG4gICAgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyIHwgRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoeWVhciBpbnN0YW5jZW9mIERhdGUpIHllYXIgPSB5ZWFyLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgeWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgLy8hIGNvbG9yICYgd3JhcHBlciBjbGFzc2VzXG4gICAgQElucHV0KCkgY29sb3I6IENvbXBvbmVudENvbG9yID0gQ29tcG9uZW50Q29sb3IuUHJpbWFyeTtcblxuICAgIGdldCBuZ0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFtgYXJkLWNvbG9yLSR7dGhpcy5jb2xvcn1gLCB0aGlzLm5vaW50ZXJhY3QgPyAnYXJkLWNhbGVuZGFyLW5vaW50ZXJhY3QnIDogJycsIHRoaXMuc3RhdGljSGVpZ2h0ID8gJ2FyZC1jYWxlbmRhci1zdGF0aWMtaGVpZ2h0JyA6ICcnXS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLy8hIG9wZW4geWVhciAmIG1vbnRoIHNldHRlcnNcbiAgICAvL3BpY2sgYSB5ZWFyIHJhbmdlIHN0YXJ0IHNvIHRoYXQgdGhlIHRvZGF5IGRhdGUgaXMgYWx3YXlzIGluIHRoZSAzcmQgcm93XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2RheVllYXJSYW5nZVN0YXJ0OiBudW1iZXIgPSB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpIC0gKHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJSA0KSAtIDg7XG5cbiAgICBkaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0O1xuXG4gICAgcHJpdmF0ZSBfdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoZm9yY2VkWWVhcj86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKGZvcmNlZFllYXIpKSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gZm9yY2VkWWVhcjtcblxuICAgICAgICAvL2FkZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3RpdmUgeWVhciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgeWVhclxuICAgICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgdG93YXJkcyB0aGUgbnVtYmVyIHplcm9cbiAgICAgICAgLy90aGUgZGlmZmVyZW5jZSBtYXkgYmUgbmVnYXRpdmUsIGlmIHRoZSBhY3RpdmUgeWVhciBpcyBiZWZvcmUgdG9kYXlZZWFyUmFuZ2VTdGFydFxuICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0ICsgcm91bmRUb011bHRpcGxlKHRoaXMuYWN0aXZlWWVhciAtIHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydCwgMjQsICd0b196ZXJvJyk7XG4gICAgfVxuXG4gICAgeWVhclJhbmdlQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcbiAgICBnZXQgeWVhclJhbmdlQXJyYXkoKTogbnVtYmVyW10ge1xuICAgICAgICBpZiAoIXRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSkge1xuICAgICAgICAgICAgbGV0IHllYXJSYW5nZVN0YXJ0ID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICAgICAgICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KDI0KS5tYXAoKCkgPT4geWVhclJhbmdlU3RhcnQrKyk7XG4gICAgICAgICAgICB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBuZXdBcnJheTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYWN0aXZlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCksIHRoaXMudG9kYXlEYXRlLmdldERhdGUoKSk7XG4gICAgc2V0IGFjdGl2ZURhdGUodjogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodik7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gbmV3RGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gbmV3RGF0ZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgfVxuICAgIGdldCBhY3RpdmVEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgYWN0aXZlWWVhcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH1cbiAgICBASW5wdXQoKVxuICAgIHNldCBhY3RpdmVZZWFyKHY6IGFueSkge1xuICAgICAgICBjb25zdCB5ZWFyID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5hY3RpdmVNb250aCwgMSk7XG4gICAgICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVNb250aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xuICAgIH1cbiAgICBASW5wdXQoKVxuICAgIHNldCBhY3RpdmVNb250aCh2OiBhbnkpIHtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBuZXcgRGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgICAgICBjb25zdCBvbGREYXRlWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGlmIChvbGREYXRlWWVhciAhPSB0aGlzLmFjdGl2ZVllYXIpIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgIH1cbiAgICAvLyEgc2VsZWN0aW9uIGZ1bmN0aW9uc1xuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHYpO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWQoKTogRGF0ZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvL3RyeSB0byBzZWUgaWYgaXQgaXMgYW4gYXJyYXkgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBjb21tYVxuICAgICAgICAgICAgY29uc3QgdkFzQXJyYXkxID0gdi5zcGxpdCgnLCcpLm1hcCh2ID0+IE51bWJlcih2KSk7XG4gICAgICAgICAgICBpZiAodkFzQXJyYXkxLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5MS5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTEuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XG4gICAgICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHZBc0FycmF5MVswXSwgdkFzQXJyYXkxWzFdID8/IDAsIHZBc0FycmF5MVsyXSA/PyAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy90cnkgdG8gc2VlIGlmIGl0IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHNvbWUgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZBc0FycmF5MiA9IHYuc3BsaXQoL1xccy8pLm1hcCh2ID0+IE51bWJlcih2KSk7XG4gICAgICAgICAgICAgICAgaWYgKHZBc0FycmF5Mi5sZW5ndGggPj0gMSAmJiB2QXNBcnJheTIubGVuZ3RoIDw9IDMgJiYgdkFzQXJyYXkyLmV2ZXJ5KHYgPT4gIWlzTmFOKHYpKSkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gbmV3IERhdGUodkFzQXJyYXkyWzBdLCB2QXNBcnJheTJbMV0gPz8gMCwgdkFzQXJyYXkyWzJdID8/IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgRGF0ZSh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9pcyBhIERhdGUgb2JqZWN0ICYmIGRvZXMgbm90IGNvbnRhaW4gYW4gZXJyb3JcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2LnZhbHVlT2YoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcGFyc2UgW3NlbGVjdGVkXSB2YWx1ZSBvbiA8YXJkLWNhbGVuZGFyPiwgYXMgaXQgaXMgbm90IGEgdmFsaWQgdmFsdWUuIFByb3ZpZGVkIHZhbHVlOiBcIiR7dn1cImApO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8hIG91dHB1dCBldmVudHNcbiAgICBAT3V0cHV0KCkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgQE91dHB1dCgpIG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG4gICAgQE91dHB1dCgpIGFjdGl2ZVllYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICBAT3V0cHV0KCkgYWN0aXZlTW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKSB2aWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclZpZXc+KCk7XG5cbiAgICBAT3V0cHV0KCdjaGFuZ2UnKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG5cbiAgICBwcm90ZWN0ZWQgX2VtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHYpO1xuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodik7XG4gICAgfVxuXG4gICAgLy8hIGNhbGVuZGFyIGVudHJ5IGhvdmVyICYgY2xpY2tcbiAgICBwcml2YXRlIF9oaWdobGlnaHRlZERheTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZ2V0IGhpZ2hsaWdodGVkRGF5KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWREYXk7XG4gICAgfVxuICAgIHNldCBoaWdobGlnaHRlZERheSh2OiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIGlmIChpc051bGwodikpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkRGF5ID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCB2KTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWREYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IGRheTtcblxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gZGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLmFjdGl2ZVllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTW9udGggIT0gZGF0ZS5nZXRNb250aCgpKSB0aGlzLmFjdGl2ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZ2hsaWdodGVkTW9udGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGdldCBoaWdobGlnaHRlZE1vbnRoKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWRNb250aDtcbiAgICB9XG4gICAgc2V0IGhpZ2hsaWdodGVkTW9udGgodjogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICBpZiAoaXNOdWxsKHYpKSB7XG4gICAgICAgICAgICB0aGlzLl9oaWdobGlnaHRlZE1vbnRoID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB2LCAxKTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHRlZE1vbnRoQWRqdXN0RGF0ZShtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG1vbnRoO1xuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIG1vbnRoLCAxKTtcblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVZZWFyICE9IGRhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZ2hsaWdodGVkWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZ2V0IGhpZ2hsaWdodGVkWWVhcigpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkWWVhcjtcbiAgICB9XG4gICAgc2V0IGhpZ2hsaWdodGVkWWVhcih2OiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkWWVhciA9IHY7XG4gICAgfVxuXG4gICAgc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB5ZWFyO1xuXG4gICAgICAgIGlmICh5ZWFyIDwgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCB8fCB5ZWFyID49IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQgKyAyNCkge1xuICAgICAgICAgICAgLy9hZGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGlnaGxpZ2h0ZWQgeWVhciBhbmQgdGhlIGRpc3BsYXllZCByYW5nZSBzdGFydCB5ZWFyXG4gICAgICAgICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgYXdheSBmcm9tIHRoZSBudW1iZXIgemVyb1xuICAgICAgICAgICAgLy90aGUgZGlmZmVyZW5jZSBtYXkgYmUgbmVnYXRpdmUsIGlmIHRoZSBmaXJzdCBpZiBjb25kaXRpb24gaXMgbWV0XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICs9IHJvdW5kVG9NdWx0aXBsZSh5ZWFyIC0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCwgMjQsICdmcm9tX3plcm8nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBjdXJyZW50QXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIHRoaXMuYWN0aXZlTW9udGgsIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPz8gMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNhbGVuZGFyRGF5TW91c2VvdmVyKGRheTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF5ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJNb250aE1vdXNlb3Zlcihtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSBtb250aDtcbiAgICB9XG4gICAgb25DYWxlbmRhclllYXJNb3VzZW92ZXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHllYXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVc2luZ0tleWJvYXJkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJylcbiAgICBvbkRvY3VtZW50TW91c2Vtb3ZlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2lzVXNpbmdLZXlib2FyZCkgdGhpcy5oaWdobGlnaHRlZERheSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5faXNVc2luZ0tleWJvYXJkID0gZmFsc2U7XG4gICAgfVxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nKVxuICAgIG9uRG9jdW1lbnRLZXlkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uQ2FsZW5kYXJEYXlDbGljayhkYXk6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheSA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcblxuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJNb250aENsaWNrKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RNb250aChtb250aCk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJZZWFyQ2xpY2soeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcbiAgICB9XG5cbiAgICBvbkRheUdyaWRGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgfVxuICAgIG9uRGF5R3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBudWxsO1xuICAgIH1cbiAgICBvbkRheUdyaWRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA/Pz0gMTtcbiAgICB9XG5cbiAgICBvbk1vbnRoR3JpZEZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICAgIH1cbiAgICBvbk1vbnRoR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7XG4gICAgfVxuICAgIG9uTW9udGhHcmlkQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA/Pz0gMDtcbiAgICB9XG5cbiAgICBvblllYXJHcmlkRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG4gICAgb25ZZWFyR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gbnVsbDtcbiAgICB9XG4gICAgb25ZZWFyR3JpZENsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA/Pz0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG5cbiAgICAvLyEgbWFpbiBncmlkIGtleWJvYXJkIGNvbnRyb2xzXG4gICAgb25NYWluR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdTcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FbnRlclByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuX29uQXJyb3dVcFByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BcnJvd0Rvd25QcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Ib21lUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25QYWdlVXBQcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25QYWdlRG93blByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9zZWxlY3QgY3VycmVudGx5IHNlbGVjdGVkIGVudHJ5XG4gICAgcHJpdmF0ZSBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZCgpO1xuICAgIH1cbiAgICAvL2hpZ2hsaWdodCB0aGUgZW50cnkgb25lIGxpbmUgYWJvdmVcbiAgICBwcml2YXRlIF9vbkFycm93VXBQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzRGF5KDcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNNb250aCgzKTsgLy8zIG1vbnRocyBwZXIgbGluZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoNCk7IC8vNCB5ZWFycyBwZXIgbGluZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vaGlnaGxpZ2h0IHRoZSBlbnRyeSBvbmUgbGluZSBiZWxvd1xuICAgIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KDcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKDMpOyAvLzMgbW9udGhzIHBlciBsaW5lXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRZZWFyKDQpOyAvLzQgeWVhcnMgcGVyIGxpbmVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBwcmV2aW91cyBlbnRyeVxuICAgIHByaXZhdGUgX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c0RheSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBuZXh0IGVudHJ5XG4gICAgcHJpdmF0ZSBfb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dFllYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBmaXJzdCBlbnRyeSBvbiB0aGUgcGFnZVxuICAgIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3REYXkoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEZpcnN0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3RZZWFyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9oaWdobGlnaHQgbGFzdCBlbnRyeSBvbiB0aGUgcGFnZVxuICAgIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0RGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TGFzdFllYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2Fsb25lOiBoaWdobGlnaHQgc2FtZSBlbnRyeSBvbiB0aGUgcHJldmlvdXMgcGFnZVxuICAgIC8vd2l0aCBhbHQ6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG11bHRpcGxlIHBhZ2VzIGJlZm9yZSAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxuICAgIHByaXZhdGUgX29uUGFnZVVwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c01vbnRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZVllYXJQcmV2aW91c1BhZ2UoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2Fsb25lOiBoaWdobGlnaHQgc2FtZSBlbnRyeSBvbiB0aGUgbmV4dCBwYWdlXG4gICAgLy93aXRoIGFsdDogaGlnaGxpZ2h0IHNhbWUgZW50cnkgbXVsdGlwbGUgcGFnZXMgYWZ0ZXIgKGRheXMgdmlldzogMTIgcGFnZXMsIG1vbnRocyB2aWV3OiAxMCBwYWdlcywgeWVhcnMgdmlldzogNSBwYWdlcylcbiAgICBwcml2YXRlIF9vblBhZ2VEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZShldmVudC5hbHRLZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vISBtYW5pcHVsYXRpb24gbWV0aG9kc1xuICAgIC8vc2VsZWN0aW5nXG4gICAgc2VsZWN0RGF5KGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXlTZWxlY3RlZChkYXkpKSByZXR1cm47XG4gICAgICAgIGlmIChpc051bGwoZGF5KSkge1xuICAgICAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkgZGF5ID0gZGF5LmdldERhdGUoKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xuICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICAgIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNOdWxsKG1vbnRoKSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb250aCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbnRoIGluc3RhbmNlb2YgRGF0ZSkgbW9udGggPSBtb250aC5nZXRNb250aCgpO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGggPSBtb250aDtcblxuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChtb250aCk7XG5cbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICB9XG4gICAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNOdWxsKHllYXIpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ZWFyIGluc3RhbmNlb2YgRGF0ZSkgeWVhciA9IHllYXIuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSB5ZWFyO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlWWVhckNoYW5nZS5lbWl0KHllYXIpO1xuICAgICAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KHllYXIpO1xuXG4gICAgICAgIHRoaXMub3Blbk1vbnRoc1ZpZXcoKTtcbiAgICB9XG4gICAgc2VsZWN0Q3VycmVudGx5SGlnaGxpZ2h0ZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWREYXkpKSByZXR1cm47XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REYXkodGhpcy5oaWdobGlnaHRlZERheSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9udGgodGhpcy5oaWdobGlnaHRlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFllYXIodGhpcy5oaWdobGlnaHRlZFllYXIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9hY3RpdmUgbW9udGhzL3llYXJzXG4gICAgY2hhbmdlTW9udGgob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkeWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aCArPSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBvbGR5ZWFyKSB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVNb250aCk7XG4gICAgfVxuICAgIGNoYW5nZVllYXIob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyICs9IG9mZnNldDtcblxuICAgICAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICAgIH1cbiAgICAvL2NoYW5naW5nIHllYXIgcGFnZVxuICAgIGNoYW5nZVllYXJzVmlld1BhZ2UocGFnZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICs9IDI0ICogcGFnZXM7XG4gICAgfVxuICAgIC8vbmV4dC9wcmV2IGhpZ2hsaWdodGluZ1xuICAgIGhpZ2hsaWdodE5leHREYXkob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXkgPSB0aGlzLmhpZ2hsaWdodGVkRGF5O1xuICAgICAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50RGF5KSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoY3VycmVudERheSArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzRGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHREYXkob2Zmc2V0ICogLTEpO1xuICAgIH1cbiAgICBoaWdobGlnaHROZXh0TW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aDtcbiAgICAgICAgaWYgKCFpc0RlZmluZWQoY3VycmVudE1vbnRoKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGhBZGp1c3REYXRlKGN1cnJlbnRNb250aCArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzTW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldCAqIC0xKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0TmV4dFllYXIob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5oaWdobGlnaHRlZFllYXI7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKGN1cnJlbnRZZWFyKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSAwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZShjdXJyZW50WWVhciArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzWWVhcihvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcihvZmZzZXQgKiAtMSk7XG4gICAgfVxuICAgIC8vZmlyc3QvbGFzdCBoaWdobGlnaHRpbmdcbiAgICBoaWdobGlnaHRGaXJzdERheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgfVxuICAgIGhpZ2hsaWdodExhc3REYXkoKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVNb250aCArIDEpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAzMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWdobGlnaHRGaXJzdE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICAgIH1cbiAgICBoaWdobGlnaHRMYXN0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDExO1xuICAgIH1cbiAgICBoaWdobGlnaHRGaXJzdFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG4gICAgaGlnaGxpZ2h0TGFzdFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArIDIzOyAvLzI0IHllYXJzIHBlciBwYWdlXG4gICAgfVxuICAgIC8vc2FtZSBkYXkgbmV4dC9wcmV2IG1vbnRoL3llYXJcbiAgICBoaWdobGlnaHRTYW1lRGF5TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoKys7XG5cbiAgICAgICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGgtLTtcblxuICAgICAgICB0aGlzLl9maXhEYXRlQWZ0ZXJNb250aENoYW5nZSgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJNb250aENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZU1vbnRoICsgMSkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgIC8vb25seSBkbyBpZiBkYXkgaXMgMzFcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSA9PSAzMSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgLy9za2lwIGlmIGJlbG93IDI5IG9yIG51bGxcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWREYXkgfHwgdGhpcy5oaWdobGlnaHRlZERheSA8IDI5KSBicmVhaztcblxuICAgICAgICAgICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlWWVhcisrO1xuXG4gICAgICAgIHRoaXMuX2ZpeERhdGVBZnRlclllYXJDaGFuZ2UoKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzWWVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyLS07XG5cbiAgICAgICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSAhPSAyOSkgcmV0dXJuOyAvL3NraXAgaWYgbm90IDI5dGggZGF5IGlzIHNlbGVjdGVkXG4gICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHJldHVybjsgLy9za2lwIGlmIG5lYSB5ZWFyIGlzIGEgbGVhcCB5ZWFyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vbnRoICE9IDEpIHJldHVybjsgLy9za2lwIGlmIG5vdCBmZWJydWFyeVxuXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICB9XG4gICAgLy9zYW1lIG1vbnRoIG5leHQvcHJldiB5ZWFyXG4gICAgaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyICs9IG11bHRpcGxlID8gMTAgOiAxO1xuICAgIH1cbiAgICBoaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyIC09IG11bHRpcGxlID8gMTAgOiAxO1xuICAgIH1cbiAgICAvL3NhbWUgeWVhciBuZXh0L3ByZXYgcGFnZShzKVxuICAgIGhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZFllYXIpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UodGhpcy5oaWdobGlnaHRlZFllYXIgKyAobXVsdGlwbGUgPyA2MCA6IDI0KSk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFNhbWVZZWFyUHJldmlvdXNQYWdlKG11bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZFllYXJBZGp1c3RQYWdlKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyIC0gKG11bHRpcGxlID8gNjAgOiAyNCkpO1xuICAgIH1cblxuICAgIC8vISBzZXR0aW5nc1xuICAgIHByb3RlY3RlZCBfZmlyc3RXZWVrZGF5OiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGZpcnN0V2Vla2RheSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlyc3RXZWVrZGF5O1xuICAgIH1cbiAgICBzZXQgZmlyc3RXZWVrZGF5KHY6IGFueSkge1xuICAgICAgICB0aGlzLl9maXJzdFdlZWtkYXkgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCAxKSAlIDc7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVXZWVrZGF5QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25vaW50ZXJhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBub2ludGVyYWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9pbnRlcmFjdCB8fCB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgbm9pbnRlcmFjdCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fbm9pbnRlcmFjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3N0YXRpY0hlaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHN0YXRpY0hlaWdodCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRpY0hlaWdodDtcbiAgICB9XG4gICAgc2V0IHN0YXRpY0hlaWdodCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIC8vISBjYWxlbmRhciBhcnJheVxuICAgIC8vZGF5cyB2aWV3IGFycmF5XG4gICAgY2FsZW5kYXJBcnJheSE6IChudW1iZXIgfCBudWxsKVtdW107XG5cbiAgICByZXNlcnZlVG9wUm93ITogYm9vbGVhbjtcblxuICAgIHByb3RlY3RlZCBfdXBkYXRlQ2FsZW5kYXJBcnJheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqID0gZ2V0TW9udGhMYXlvdXQodGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5maXJzdFdlZWtkYXkpO1xuXG4gICAgICAgIHRoaXMucmVzZXJ2ZVRvcFJvdyA9IHJlc3VsdE9iai5sZWFkaW5nU3BhY2VzIDwgMztcbiAgICAgICAgdGhpcy5jYWxlbmRhckFycmF5ID0gcmVzdWx0T2JqLmFycmF5O1xuICAgIH1cblxuICAgIC8vbW9udGhzIHZpZXcgYXJyYXlcbiAgICByZWFkb25seSBtb250aHNBcnJheTogbnVtYmVyW10gPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExXTtcblxuICAgIC8veWVhcnMgdmlldyBhcnJheVxuICAgIHByaXZhdGUgX3llYXJzQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGdldFllYXJzQXJyYXkoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcblxuICAgICAgICBpZiAodGhpcy5feWVhcnNBcnJheUNhY2hlU3RhcnRZZWFyID09IHllYXIgJiYgaXNEZWZpbmVkKHRoaXMuX3llYXJzQXJyYXlDYWNoZSkpIHJldHVybiB0aGlzLl95ZWFyc0FycmF5Q2FjaGU7XG5cbiAgICAgICAgY29uc3QgbmV3QXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHllYXI7IGkgPCB5ZWFyICsgMjQ7IGkrKykge1xuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3llYXJzQXJyYXlDYWNoZSA9IG5ld0FycmF5O1xuICAgICAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXIgPSB5ZWFyO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfVxuXG4gICAgLy8hIHdlZWtkYXkgYXJyYXlcbiAgICB3ZWVrZGF5QXJyYXkhOiBudW1iZXJbXTtcblxuICAgIHByb3RlY3RlZCBfdXBkYXRlV2Vla2RheUFycmF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLndlZWtkYXlBcnJheSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2XS5tYXAodiA9PiAodiArIHRoaXMuZmlyc3RXZWVrZGF5KSAlIDcpO1xuICAgIH1cblxuICAgIC8vISBjaGFuZ2UgdmlldyBmdW5jdGlvbnNcbiAgICBhY3RpdmVWaWV3OiBDYWxlbmRhclZpZXcgPSBDYWxlbmRhclZpZXcuRGF5cztcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHN0YXJ0Vmlldyh2OiBDYWxlbmRhclZpZXcpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gdjtcbiAgICB9XG5cbiAgICBvcGVuWWVhcnNWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuWWVhcnM7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcblxuICAgICAgICB0aGlzLnZpZXdDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVZpZXcpO1xuICAgIH1cbiAgICBvcGVuTW9udGhzVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3Lk1vbnRocztcbiAgICAgICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZVxuICAgICAgICBjb25zdCBvbGRZZWFyID0gdGhpcy5hY3RpdmVZZWFyO1xuICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXIgPz8gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICAvL2VtaXQgZXZlbnRzXG4gICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgICB9XG4gICAgb3BlbkRheXNWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuRGF5cztcbiAgICAgICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyID0gdGhpcy5hY3RpdmVZZWFyID8/IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5hY3RpdmVNb250aDtcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aCA9IHRoaXMuYWN0aXZlTW9udGggPz8gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKTtcblxuICAgICAgICAvL2VtaXQgZXZlbnRzXG4gICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgICAgICAgaWYgKG9sZE1vbnRoICE9IHRoaXMuYWN0aXZlTW9udGggJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpKSB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVNb250aCk7XG4gICAgfVxuXG4gICAgLy8hIHRlbXBsYXRlIGN1c3RvbWl6YXRpb25cbiAgICAvL2hlYWRlcnNcbiAgICBAQ29udGVudENoaWxkKEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHllYXJzVmlld0hlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICBAQ29udGVudENoaWxkKEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBtb250aHNWaWV3SGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICBAQ29udGVudENoaWxkKEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICAvL3dlZWtkYXlcbiAgICBAQ29udGVudENoaWxkKEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICB3ZWVrZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhcldlZWtkYXlDb250ZXh0PjtcbiAgICAvL2Zsb2F0aW5nIG1vbnRoXG4gICAgQENvbnRlbnRDaGlsZChBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZmxvYXRpbmdNb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dD47XG4gICAgLy9ncmlkIGVsZW1lbnRzICh5ZWFyLCBtb250aCwgZGF5KVxuICAgIEBDb250ZW50Q2hpbGQoQXJkWWVhclRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHllYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyWWVhckNvbnRleHQ+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkTW9udGhUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBtb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJNb250aENvbnRleHQ+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhckRheUNvbnRleHQ+O1xuXG4gICAgLy8hIGNvbnRleHQgZ2V0dGVyc1xuICAgIC8vaGVhZGVyc1xuICAgIGdldFllYXJzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0IHtcbiAgICAgICAgY29uc3QgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgICBjb25zdCB5ZWFyUmFuZ2VFbmQgPSB5ZWFyUmFuZ2VTdGFydCArIDIzO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgICAgICAgIGxvdzogbmV3IERhdGUoeWVhclJhbmdlU3RhcnQsIDAsIDEpLFxuICAgICAgICAgICAgaGlnaDogbmV3IERhdGUoeWVhclJhbmdlRW5kLCAwLCAxKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRQYWdlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VZZWFyc1ZpZXdQYWdlKCsxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2UGFnZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlWWVhcnNWaWV3UGFnZSgtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5ZWFyUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBsb3c6IHllYXJSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgICAgIGhpZ2g6IHllYXJSYW5nZUVuZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlUmFuZ2UsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGVSYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJNb250aHNWaWV3SGVhZGVyQ29udGV4dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVuWWVhcnNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuWWVhcnNWaWV3KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5ZWFyOiB0aGlzLmFjdGl2ZVllYXIsXG4gICAgICAgICAgICBkYXRlOiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuYWN0aXZlWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGF5c1ZpZXdIZWFkZXJDb250ZXh0KCk6IENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRNb250aDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoKzEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZXZNb250aDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRZZWFyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VZZWFyKCsxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2WWVhcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlWWVhcigtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlblllYXJzVmlldzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlblllYXJzVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZW5Nb250aHNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuTW9udGhzVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHllYXI6IHRoaXMuYWN0aXZlWWVhcixcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLmFjdGl2ZU1vbnRoLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vd2Vla2RheVxuICAgIGdldFdlZWtkYXlDb250ZXh0KGRheUluZGV4OiBudW1iZXIpOiBDYWxlbmRhcldlZWtkYXlDb250ZXh0IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDQgKyBkYXlJbmRleCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlJbmRleCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vZmxvYXRpbmcgbW9udGhcbiAgICBnZXRGbG9hdGluZ01vbnRoQ29udGV4dCgpOiBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLmFjdGl2ZU1vbnRoLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vZ3JpZCBlbGVtZW50cyAoeWVhciwgbW9udGgsIGRheSlcbiAgICBnZXRZZWFyQ29udGV4dCh5ZWFyOiBudW1iZXIpOiBDYWxlbmRhclllYXJDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB5ZWFyLFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCAwLCAxKSxcbiAgICAgICAgICAgICRpbXBsaWNpdDogeWVhcixcbiAgICAgICAgICAgIHNlbGVjdDogKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldE1vbnRoQ29udGV4dChtb250aDogbnVtYmVyKTogQ2FsZW5kYXJNb250aENvbnRleHQge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb250aCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGUsXG4gICAgICAgICAgICBzZWxlY3Q6IChtb250aDogbnVtYmVyIHwgRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9udGgobW9udGgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGF5Q29udGV4dChkYXk6IG51bWJlcik6IENhbGVuZGFyRGF5Q29udGV4dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogZGF5LFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpLFxuICAgICAgICAgICAgJGltcGxpY2l0OiBkYXksXG4gICAgICAgICAgICBzZWxlY3Q6IChkYXk6IG51bWJlciB8IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERheShkYXkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyXCIgW25nQ2xhc3NdPVwibmdDbGFzc2VzXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aXZlVmlldyA9PSAnZGF5cycgPyBkYXlzVmlldyA6IGFjdGl2ZVZpZXcgPT0gJ21vbnRocycgPyBtb250aHNWaWV3IDogeWVhcnNWaWV3XCIvPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjeWVhcnNWaWV3PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0WWVhcnNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LWN1cnJSYW5nZSBsZXQtbmV4dFBhZ2U9XCJuZXh0UGFnZVwiIGxldC1wcmV2UGFnZT1cInByZXZQYWdlXCIgbGV0LW9wZW5EYXlzVmlldz1cIm9wZW5EYXlzVmlld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWRheXMtdmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXlzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyUmFuZ2UubG93IHwgZGF0ZTogJ1lZWVknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgJm1kYXNoO1xyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJSYW5nZS5oaWdoIHwgZGF0ZTogJ1lZWVknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9hcmQtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1hcnJvd3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiIGNvbG9yPVwibm9uZVwiIChjbGljayk9XCJwcmV2UGFnZSgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX2xlZnQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cIm5leHRQYWdlKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fcmlnaHQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ5ZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0WWVhcnNWaWV3SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0WWVhcnNWaWV3SGVhZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1zaW1wbGUtZ3JpZFwiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiY3VycmVudEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25ZZWFyR3JpZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uWWVhckdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25ZZWFyR3JpZENsaWNrKClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1haW5HcmlkS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgeWVhciBvZiBnZXRZZWFyc0FycmF5KClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktaGlnaGxpZ2h0ZWRdPVwiaGlnaGxpZ2h0ZWRZZWFyID09IHllYXIgfHwgYWN0aXZlWWVhciA9PSB5ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LXNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLXRvZGF5XT1cImlzWWVhclRvZGF5KHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhclllYXJDbGljayh5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhclllYXJNb3VzZW92ZXIoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZm9jdXMtb3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWJ1dHRvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRZZWFyVGVtcGxhdGUgbGV0LXllYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInllYXJUZW1wbGF0ZSB8fCBkZWZhdWx0WWVhclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0WWVhckNvbnRleHQoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI21vbnRoc1ZpZXc+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LXllYXIgbGV0LW5leHRQYWdlPVwibmV4dFBhZ2VcIiBsZXQtcHJldlBhZ2U9XCJwcmV2UGFnZVwiIGxldC1vcGVuRGF5c1ZpZXc9XCJvcGVuRGF5c1ZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXlzLXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXJkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRGF5c1ZpZXcoKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3dcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYXJkLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0TW9udGhzVmlld0hlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0KClcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLXNpbXBsZS1ncmlkXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbk1vbnRoR3JpZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uTW9udGhHcmlkQmx1cigpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTW9udGhHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHNBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1oaWdobGlnaHRlZF09XCJoaWdobGlnaHRlZE1vbnRoID09IG1vbnRoIHx8IGFjdGl2ZU1vbnRoID09IG1vbnRoXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LXNlbGVjdGVkXT1cImlzTW9udGhTZWxlY3RlZChtb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItdG9kYXldPVwiaXNNb250aFRvZGF5KG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FsZW5kYXJNb250aENsaWNrKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhck1vbnRoTW91c2VvdmVyKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtYnV0dG9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1vbnRoVGVtcGxhdGUgbGV0LW1vbnRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIHwgZGF0ZTogXCJNTU1cIiB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vbnRoVGVtcGxhdGUgfHwgZGVmYXVsdE1vbnRoVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRNb250aENvbnRleHQobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkYXlzVmlldz5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERheXNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LWN1cnJEYXRlIGxldC1uZXh0TW9udGg9XCJuZXh0TW9udGhcIiBsZXQtcHJldk1vbnRoPVwicHJldk1vbnRoXCIgbGV0LW9wZW5ZZWFyc1ZpZXc9XCJvcGVuWWVhcnNWaWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5cy12aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblllYXJzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyRGF0ZSB8IGRhdGU6ICdNTU0gWVlZWScgfCB1cHBlcmNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2FyZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWFycm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cInByZXZNb250aCgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX2xlZnQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cIm5leHRNb250aCgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9hcmQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FyZC1pY29uLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0RGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXREYXlzVmlld0hlYWRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5LWxhYmVscyBhcmQtY2FsZW5kYXItZ3JpZFwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRXZWVrZGF5VGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLXdlZWtkYXlcIj57eyBkYXRlIHwgZGF0ZTogJ0VFRUVFJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3ZWVrZGF5SW5kZXggb2Ygd2Vla2RheUFycmF5XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ3ZWVrZGF5VGVtcGxhdGUgfHwgZGVmYXVsdFdlZWtkYXlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFdlZWtkYXlDb250ZXh0KHdlZWtkYXlJbmRleClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1ncmlkIGFyZC1jYWxlbmRhci1ncmlkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFyZC1yZXNlcnZlLXRvcC1yb3ddPVwicmVzZXJ2ZVRvcFJvd1wiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiY3VycmVudEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25EYXlHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25EYXlHcmlkQmx1cigpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGF5R3JpZENsaWNrKClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1haW5HcmlkS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1mbG9hdGluZy1tb250aFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RmxvYXRpbmdNb250aFRlbXBsYXRlIGxldC1kYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnTExMJyB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmbG9hdGluZ01vbnRoVGVtcGxhdGUgfHwgZGVmYXVsdEZsb2F0aW5nTW9udGhUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEZsb2F0aW5nTW9udGhDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3ZWVrIG9mIGNhbGVuZGFyQXJyYXlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktZW1wdHldPVwiZGF5ID09IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LWhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkRGF5ID09IGRheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNEYXlTZWxlY3RlZChkYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci10b2RheV09XCJpc0RheVRvZGF5KGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhckRheUNsaWNrKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhckRheU1vdXNlb3ZlcihkYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnktYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF5ICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZm9jdXMtb3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1idXR0b24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERheVRlbXBsYXRlIGxldC1kYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRheVRlbXBsYXRlIHx8IGRlZmF1bHREYXlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXREYXlDb250ZXh0KGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1NwaW5uZXJUZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZVwiPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy1jb250YWluZXI+IC0tPiJdfQ==
|