@seniorsistemas/angular-components 19.7.3 → 19.7.4-fix-sds-577-afa523ed
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/accordion/README.md +1 -0
- package/accordion/lib/accordion/accordion.component.d.ts +1 -1
- package/accordion/lib/accordion/accordion.module.d.ts +1 -6
- package/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.d.ts +1 -1
- package/alert/README.md +1 -1
- package/alert/lib/alert/alert.component.d.ts +1 -1
- package/alert/lib/alert/alert.module.d.ts +1 -2
- package/autocomplete/README.md +1 -1
- package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +1 -1
- package/badge/lib/badge/badge.component.d.ts +1 -1
- package/badge/lib/badge/badge.module.d.ts +3 -7
- package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +1 -1
- package/bignumber-input/lib/bignumber-input/bignumber-input.module.d.ts +1 -2
- package/breadcrumb/README.md +9 -5
- package/button/README.md +1 -0
- package/calendar-mask/README.md +4 -2
- package/calendar-mask/lib/calendar-mask/calendar-mask.directive.d.ts +1 -1
- package/calendar-mask/lib/calendar-mask/calendar-mask.module.d.ts +1 -2
- package/card/lib/card/card.component.d.ts +1 -1
- package/card/lib/card/card.module.d.ts +1 -3
- package/chat/lib/chat/chat.component.d.ts +2 -1
- package/chat/lib/chat/chat.module.d.ts +3 -6
- package/chat/lib/chat/components/chat-message/chat-message.component.d.ts +1 -1
- package/checkbox-list/lib/checkbox-list/checkbox-list.component.d.ts +1 -1
- package/checkbox-list/lib/checkbox-list/checkbox-list.module.d.ts +1 -3
- package/chips/lib/chips/chip-item/chip-item.component.d.ts +1 -1
- package/chips/lib/chips/chips/chips.component.d.ts +1 -1
- package/chips/lib/chips/chips.module.d.ts +1 -6
- package/code-editor/README.md +1 -1
- package/code-editor/lib/code-editor/code-editor.component.d.ts +1 -1
- package/code-editor/lib/code-editor/code-editor.module.d.ts +1 -3
- package/collapse-link/lib/collapse-link/collapse-link.component.d.ts +1 -1
- package/collapse-link/lib/collapse-link/collapse-link.module.d.ts +1 -2
- package/common/deprecated-selector/README.md +120 -47
- package/common/lib/svg-factory/components/iassist-icon/iassist-icon.component.d.ts +1 -1
- package/common/lib/svg-factory/components/senior-icon/senior-icon.component.d.ts +1 -1
- package/common/lib/svg-factory/svg-factory.directive.d.ts +1 -1
- package/common/lib/svg-factory/svg-factory.module.d.ts +1 -4
- package/confirm-dialog/README.md +3 -1
- package/content-generator/README.md +2 -2
- package/content-generator/lib/content-generator/content-generator.component.d.ts +2 -1
- package/content-generator/lib/content-generator/content-generator.module.d.ts +1 -10
- package/control-errors/lib/control-errors/control-errors.component.d.ts +2 -2
- package/control-errors/lib/control-errors/control-errors.module.d.ts +1 -3
- package/country-phone-picker/README.md +1 -1
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +2 -1
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.d.ts +1 -5
- package/currency/README.md +1 -1
- package/custom-fields/lib/custom-fields/custom-fields.component.d.ts +1 -1
- package/custom-fields/lib/custom-fields/custom-fields.module.d.ts +1 -7
- package/datepicker/README.md +44 -11
- package/datepicker/lib/datepicker/datepicker.component.d.ts +1 -0
- package/dynamic-form/dynamic-form/dynamic-form.module.d.ts +3 -5
- package/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.d.ts +1 -0
- package/editable-overlay/lib/editable-overlay/editable-overlay.directive.d.ts +1 -1
- package/editable-overlay/lib/editable-overlay/editable-overlay.module.d.ts +1 -2
- package/editor/README.md +8 -0
- package/empty-state/lib/empty-state/empty-state.component.d.ts +1 -1
- package/empty-state/lib/empty-state/empty-state.module.d.ts +1 -3
- package/empty-state/lib/empty-state/go-back/go-back.component.d.ts +1 -1
- package/esm2022/accordion/lib/accordion/accordion.component.mjs +3 -3
- package/esm2022/accordion/lib/accordion/accordion.module.mjs +4 -10
- package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +17 -8
- package/esm2022/alert/lib/alert/alert.component.mjs +4 -4
- package/esm2022/alert/lib/alert/alert.module.mjs +4 -6
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +4 -4
- package/esm2022/badge/lib/badge/badge.component.mjs +7 -6
- package/esm2022/badge/lib/badge/badge.module.mjs +4 -9
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +3 -2
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.module.mjs +4 -7
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +6 -7
- package/esm2022/button/lib/button/button.component.mjs +3 -3
- package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.directive.mjs +3 -2
- package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.module.mjs +4 -6
- package/esm2022/card/lib/card/card.component.mjs +4 -4
- package/esm2022/card/lib/card/card.module.mjs +4 -7
- package/esm2022/chat/lib/chat/chat.component.mjs +8 -7
- package/esm2022/chat/lib/chat/chat.module.mjs +7 -11
- package/esm2022/chat/lib/chat/components/chat-message/chat-message.component.mjs +6 -6
- package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +4 -5
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +6 -7
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.module.mjs +4 -7
- package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +5 -5
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +7 -7
- package/esm2022/chips/lib/chips/chips.module.mjs +4 -10
- package/esm2022/code-editor/lib/code-editor/code-editor.component.mjs +4 -4
- package/esm2022/code-editor/lib/code-editor/code-editor.module.mjs +8 -11
- package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +4 -4
- package/esm2022/collapse-link/lib/collapse-link/collapse-link.module.mjs +4 -6
- package/esm2022/common/lib/svg-factory/components/iassist-icon/iassist-icon.component.mjs +3 -3
- package/esm2022/common/lib/svg-factory/components/senior-icon/senior-icon.component.mjs +3 -3
- package/esm2022/common/lib/svg-factory/svg-factory.directive.mjs +4 -3
- package/esm2022/common/lib/svg-factory/svg-factory.module.mjs +4 -14
- package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +28 -16
- package/esm2022/content-generator/lib/content-generator/content-generator.module.mjs +4 -42
- package/esm2022/control-errors/lib/control-errors/control-errors.component.mjs +3 -3
- package/esm2022/control-errors/lib/control-errors/control-errors.module.mjs +6 -9
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -14
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.module.mjs +6 -28
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +6 -6
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.module.mjs +9 -35
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +6 -3
- package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.module.mjs +4 -6
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +5 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +3 -3
- package/esm2022/editable-overlay/lib/editable-overlay/editable-overlay.directive.mjs +3 -2
- package/esm2022/editable-overlay/lib/editable-overlay/editable-overlay.module.mjs +4 -6
- package/esm2022/editor/lib/editor/editor.component.mjs +4 -4
- package/esm2022/empty-state/lib/empty-state/empty-state.component.mjs +4 -4
- package/esm2022/empty-state/lib/empty-state/empty-state.module.mjs +4 -7
- package/esm2022/empty-state/lib/empty-state/go-back/go-back.component.mjs +4 -4
- package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +5 -5
- package/esm2022/fieldset/lib/fieldset/fieldset.module.mjs +4 -7
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +10 -11
- package/esm2022/file-picker/lib/file-picker/file-picker.module.mjs +4 -11
- package/esm2022/gantt/lib/gantt/components/side-table/side-table.component.mjs +5 -5
- package/esm2022/gantt/lib/gantt/gantt.component.mjs +4 -4
- package/esm2022/gantt/lib/gantt/gantt.module.mjs +4 -12
- package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +6 -7
- package/esm2022/global-search/lib/global-search/global-search.component.mjs +17 -10
- package/esm2022/global-search/lib/global-search/global-search.module.mjs +15 -33
- package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +5 -4
- package/esm2022/grid-menu/lib/grid-menu/grid-menu.component.mjs +4 -4
- package/esm2022/grid-menu/lib/grid-menu/grid-menu.module.mjs +4 -7
- package/esm2022/help-popover/lib/help-popover/help-popover/help-popover.component.mjs +5 -5
- package/esm2022/help-popover/lib/help-popover/help-popover.directive.mjs +3 -2
- package/esm2022/help-popover/lib/help-popover/help-popover.module.mjs +5 -14
- package/esm2022/image-cropper/lib/image-cropper/image-cropper.component.mjs +7 -8
- package/esm2022/image-cropper/lib/image-cropper/image-cropper.module.mjs +4 -10
- package/esm2022/infinite-scroll/lib/infinite-scroll/infinite-scroll.directive.mjs +4 -3
- package/esm2022/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.mjs +4 -6
- package/esm2022/info-sign/lib/info-sign/components/info-sign/info-sign.component.mjs +6 -6
- package/esm2022/info-sign/lib/info-sign/info-sign.directive.mjs +4 -3
- package/esm2022/info-sign/lib/info-sign/info-sign.module.mjs +4 -8
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.mjs +14 -10
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-content-generator/inline-edit-content-generator.component.mjs +7 -6
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-lookup/inline-edit-lookup.component.mjs +6 -6
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +34 -20
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +6 -6
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text-area/inline-edit-text-area.component.mjs +7 -7
- package/esm2022/inline-edit/lib/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +16 -15
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.component.mjs +3 -3
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +4 -89
- package/esm2022/insights/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.mjs +6 -6
- package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +11 -10
- package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +7 -7
- package/esm2022/insights/lib/insights/insights.component.mjs +4 -5
- package/esm2022/insights/lib/insights/insights.module.mjs +4 -34
- package/esm2022/kanban/lib/kanban/components/kanban-column/kanban-column.component.mjs +18 -22
- package/esm2022/kanban/lib/kanban/components/kanban-item/kanban-item.component.mjs +9 -8
- package/esm2022/kanban/lib/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +6 -6
- package/esm2022/kanban/lib/kanban/kanban.component.mjs +20 -11
- package/esm2022/kanban/lib/kanban/kanban.module.mjs +4 -41
- package/esm2022/label-value/lib/label-value/label-value.component.mjs +8 -8
- package/esm2022/label-value/lib/label-value/label-value.module.mjs +4 -10
- package/esm2022/lib/locale/fallback.mjs +3 -2
- package/esm2022/loading-state/lib/loading-state/components/dots-indicator/dots-indicator.components.mjs +3 -3
- package/esm2022/loading-state/lib/loading-state/components/logo-indicator/logo-indicator.component.mjs +4 -4
- package/esm2022/loading-state/lib/loading-state/components/progress-bar-indicator/progress-bar-indicator.component.mjs +4 -4
- package/esm2022/loading-state/lib/loading-state/loading-state.component.mjs +13 -7
- package/esm2022/loading-state/lib/loading-state/loading-state.directive.mjs +3 -2
- package/esm2022/loading-state/lib/loading-state/loading-state.module.mjs +4 -20
- package/esm2022/locale/lib/locale/locale.module.mjs +6 -8
- package/esm2022/locale/lib/locale/pipes/localized-bignumber-impure.pipe.mjs +6 -5
- package/esm2022/locale/lib/locale/pipes/localized-bignumber.pipe.mjs +16 -15
- package/esm2022/locale/lib/locale/pipes/localized-currency-impure.pipe.mjs +6 -5
- package/esm2022/locale/lib/locale/pipes/localized-currency.pipe.mjs +11 -10
- package/esm2022/locale/lib/locale/pipes/localized-date-impure.pipe.mjs +6 -5
- package/esm2022/locale/lib/locale/pipes/localized-date.pipe.mjs +3 -2
- package/esm2022/locale/lib/locale/pipes/localized-number.pipe.mjs +10 -7
- package/esm2022/locale/lib/locale/pipes/localized-time-impure.pipe.mjs +6 -5
- package/esm2022/locale/lib/locale/pipes/localized-time.pipe.mjs +3 -2
- package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.directive.mjs +7 -4
- package/esm2022/localized-number-input/lib/localized-number-input/localized-number-input.module.mjs +4 -6
- package/esm2022/mask/lib/mask/mask-formatter.module.mjs +3 -3
- package/esm2022/mask/lib/mask/mask-formatter.pipe.mjs +3 -2
- package/esm2022/mouse-events/lib/mouse-events/long-press.directive.mjs +3 -2
- package/esm2022/mouse-events/lib/mouse-events/mouse-events.module.mjs +5 -7
- package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +8 -8
- package/esm2022/navigation-button/lib/navigation-button/navigation-button.module.mjs +4 -8
- package/esm2022/number-input/lib/number-input/number-input.directive.mjs +3 -2
- package/esm2022/number-input/lib/number-input/number-input.module.mjs +4 -6
- package/esm2022/numeric/lib/numeric.module.mjs +4 -6
- package/esm2022/numeric/lib/numeric.pipe.mjs +6 -3
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +8 -3
- package/esm2022/object-card/lib/object-card/elements/field/object-card-field.component.mjs +7 -8
- package/esm2022/object-card/lib/object-card/elements/main/object-card-main.component.mjs +6 -8
- package/esm2022/object-card/lib/object-card/object-card.component.mjs +6 -6
- package/esm2022/object-card/lib/object-card/object-card.module.mjs +4 -10
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
- package/esm2022/panel/lib/panel/panel.component.mjs +15 -7
- package/esm2022/panel/lib/panel/panel.module.mjs +7 -10
- package/esm2022/password-strength/lib/password-strength/password-strength.component.mjs +4 -4
- package/esm2022/password-strength/lib/password-strength/password-strength.directive.mjs +4 -3
- package/esm2022/password-strength/lib/password-strength/password-strength.module.mjs +4 -7
- package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +5 -6
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +9 -10
- package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +5 -11
- package/esm2022/progressbar/lib/progressbar/components/progressbar-determinate/progressbar-determinate.component.mjs +8 -6
- package/esm2022/progressbar/lib/progressbar/components/progressbar-indeterminate/progressbar-indeterminate.component.mjs +4 -4
- package/esm2022/progressbar/lib/progressbar/progressbar.component.mjs +5 -5
- package/esm2022/progressbar/lib/progressbar/progressbar.module.mjs +4 -9
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +5 -5
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.module.mjs +6 -14
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +3 -4
- package/esm2022/select/lib/select/select.component.mjs +3 -5
- package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +5 -5
- package/esm2022/select-button/lib/select-button/select-button.component.mjs +6 -6
- package/esm2022/select-button/lib/select-button/select-button.module.mjs +6 -13
- package/esm2022/shared/lib/shared/border-button/border-button.component.mjs +5 -5
- package/esm2022/shared/lib/shared/border-button/border-button.module.mjs +7 -10
- package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +5 -5
- package/esm2022/sidebar/lib/sidebar/sidebar.module.mjs +4 -7
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.component.mjs +6 -6
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.mjs +7 -9
- package/esm2022/slider/lib/slider/slider.component.mjs +6 -6
- package/esm2022/slider/lib/slider/slider.module.mjs +6 -9
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +4 -5
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition.module.mjs +5 -13
- package/esm2022/split-button/lib/split-button/split-button.component.mjs +5 -5
- package/esm2022/split-button/lib/split-button/split-button.module.mjs +4 -6
- package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
- package/esm2022/stats-card/lib/stats-card/stats-card.component.mjs +6 -6
- package/esm2022/stats-card/lib/stats-card/stats-card.module.mjs +4 -8
- package/esm2022/stepper/lib/stepper/stepper.component.mjs +6 -6
- package/esm2022/stepper/lib/stepper/stepper.module.mjs +4 -7
- package/esm2022/structure/lib/structure/footer.component.mjs +3 -2
- package/esm2022/structure/lib/structure/header.component.mjs +5 -4
- package/esm2022/structure/lib/structure/structure.module.mjs +5 -7
- package/esm2022/switch/lib/switch/switch.component.mjs +4 -5
- package/esm2022/switch/lib/switch/switch.module.mjs +4 -6
- package/esm2022/table/lib/table/row-toggler/row-toggler.directive.mjs +6 -3
- package/esm2022/table/lib/table/table-column/table-columns.component.mjs +17 -9
- package/esm2022/table/lib/table/table-paging/table-paging.component.mjs +4 -4
- package/esm2022/table/lib/table/table.module.mjs +4 -34
- package/esm2022/table-header/lib/table-header/table-header-checkbox.component.mjs +19 -16
- package/esm2022/table-header/lib/table-header/table-header-checkox.module.mjs +4 -8
- package/esm2022/template/lib/template/template.module.mjs +4 -5
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +9 -9
- package/esm2022/text-area/lib/text-area.module.mjs +5 -24
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +5 -5
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.module.mjs +7 -9
- package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/components/thumbnail-item-image/thumbnail-item-image.component.mjs +6 -6
- package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/components/thumbnail-item-video/thumbnail-item-video.component.mjs +9 -9
- package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +25 -14
- package/esm2022/thumbnails/lib/thumbnails/thumbnails.component.mjs +4 -4
- package/esm2022/thumbnails/lib/thumbnails/thumbnails.module.mjs +6 -14
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +7 -7
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +4 -4
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +6 -6
- package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.directive.mjs +4 -3
- package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.module.mjs +4 -20
- package/esm2022/tile/lib/tile/tile.component.mjs +6 -6
- package/esm2022/tile/lib/tile/tile.module.mjs +4 -7
- package/esm2022/timeline/lib/timeline/components/horizontal-timeline/horizontal-timeline.component.mjs +6 -6
- package/esm2022/timeline/lib/timeline/components/timeline-icon-item/timeline-icon-item.component.mjs +5 -5
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/components/collapse-option/collapse-option.component.mjs +4 -4
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/components/collapsed-items/collapsed-items.component.mjs +5 -5
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/components/range-line/range-line.component.mjs +3 -3
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/components/vertical-items/vertical-items.component.mjs +5 -5
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/vertical-timeline.component.mjs +7 -7
- package/esm2022/timeline/lib/timeline/timeline.component.mjs +5 -6
- package/esm2022/timeline/lib/timeline/timeline.module.mjs +4 -20
- package/esm2022/toast/lib/toast/toast.component.mjs +4 -4
- package/esm2022/toast/lib/toast/toast.module.mjs +6 -7
- package/esm2022/token-list/lib/token-list/token-list.component.mjs +4 -4
- package/esm2022/token-list/lib/token-list/token-list.module.mjs +4 -6
- package/esm2022/tooltip/lib/tooltip/tooltip.module.mjs +3 -4
- package/esm2022/topbar/lib/topbar/topbar.component.mjs +3 -3
- package/esm2022/topbar/lib/topbar/topbar.module.mjs +7 -10
- package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +6 -5
- package/esm2022/tree/lib/tree/tree.component.mjs +5 -5
- package/esm2022/tree/lib/tree/tree.module.mjs +4 -10
- package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +5 -5
- package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.module.mjs +4 -6
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs +20 -17
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-alert.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-alert.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-badge.mjs +8 -12
- package/fesm2022/seniorsistemas-angular-components-badge.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +5 -7
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -6
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +5 -6
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-card.mjs +7 -9
- package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chat.mjs +15 -16
- package/fesm2022/seniorsistemas-angular-components-chat.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +7 -10
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +3 -4
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +14 -18
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +5 -7
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-common.mjs +9 -16
- package/fesm2022/seniorsistemas-angular-components-common.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +28 -52
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +5 -8
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +17 -37
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +12 -35
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +5 -2
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +12 -11
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs +5 -6
- package/fesm2022/seniorsistemas-angular-components-editable-overlay.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs +8 -11
- package/fesm2022/seniorsistemas-angular-components-empty-state.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +6 -9
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +11 -18
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs +9 -16
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +31 -47
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +8 -10
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs +10 -17
- package/fesm2022/seniorsistemas-angular-components-help-popover.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs +8 -14
- package/fesm2022/seniorsistemas-angular-components-image-cropper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs +5 -6
- package/fesm2022/seniorsistemas-angular-components-infinite-scroll.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-info-sign.mjs +9 -11
- package/fesm2022/seniorsistemas-angular-components-info-sign.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +64 -121
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-insights.mjs +22 -47
- package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs +86 -113
- package/fesm2022/seniorsistemas-angular-components-kanban.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-label-value.mjs +10 -16
- package/fesm2022/seniorsistemas-angular-components-label-value.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs +40 -46
- package/fesm2022/seniorsistemas-angular-components-loading-state.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-locale.mjs +40 -31
- package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs +9 -8
- package/fesm2022/seniorsistemas-angular-components-localized-number-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-mask.mjs +4 -3
- package/fesm2022/seniorsistemas-angular-components-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs +55 -56
- package/fesm2022/seniorsistemas-angular-components-mouse-events.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +9 -13
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-number-input.mjs +6 -6
- package/fesm2022/seniorsistemas-angular-components-number-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +7 -2
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric.mjs +8 -7
- package/fesm2022/seniorsistemas-angular-components-numeric.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs +14 -21
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +17 -11
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-password-strength.mjs +8 -9
- package/fesm2022/seniorsistemas-angular-components-password-strength.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +4 -5
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +11 -17
- package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-progressbar.mjs +15 -15
- package/fesm2022/seniorsistemas-angular-components-progressbar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +8 -15
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs +9 -15
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +4 -6
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +8 -11
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +7 -10
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs +7 -9
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slider.mjs +8 -11
- package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +7 -15
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stats-card.mjs +8 -12
- package/fesm2022/seniorsistemas-angular-components-stats-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs +8 -11
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-structure.mjs +18 -18
- package/fesm2022/seniorsistemas-angular-components-structure.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-switch.mjs +6 -9
- package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs +20 -21
- package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs +27 -45
- package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-template.mjs +3 -4
- package/fesm2022/seniorsistemas-angular-components-template.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +12 -30
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +45 -37
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +14 -25
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tile.mjs +8 -12
- package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-timeline.mjs +58 -124
- package/fesm2022/seniorsistemas-angular-components-timeline.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-toast.mjs +4 -5
- package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs +5 -8
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tree.mjs +10 -13
- package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +6 -8
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +2 -1
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/fieldset/lib/fieldset/fieldset.component.d.ts +1 -1
- package/fieldset/lib/fieldset/fieldset.module.d.ts +1 -3
- package/file-picker/lib/file-picker/file-picker.component.d.ts +1 -1
- package/file-picker/lib/file-picker/file-picker.module.d.ts +1 -7
- package/gantt/lib/gantt/components/side-table/side-table.component.d.ts +1 -1
- package/gantt/lib/gantt/gantt.component.d.ts +1 -1
- package/gantt/lib/gantt/gantt.module.d.ts +1 -4
- package/global-search/README.md +12 -1
- package/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.d.ts +1 -1
- package/global-search/lib/global-search/global-search.component.d.ts +1 -1
- package/global-search/lib/global-search/global-search.module.d.ts +8 -12
- package/grid-menu/README.md +27 -2
- package/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.d.ts +1 -1
- package/grid-menu/lib/grid-menu/grid-menu.component.d.ts +1 -1
- package/grid-menu/lib/grid-menu/grid-menu.module.d.ts +1 -3
- package/help-popover/README.md +2 -2
- package/help-popover/lib/help-popover/help-popover/help-popover.component.d.ts +1 -1
- package/help-popover/lib/help-popover/help-popover.directive.d.ts +1 -1
- package/help-popover/lib/help-popover/help-popover.module.d.ts +2 -5
- package/ia-insight/README.md +1 -1
- package/image-cropper/README.md +2 -2
- package/image-cropper/lib/image-cropper/image-cropper.component.d.ts +1 -1
- package/image-cropper/lib/image-cropper/image-cropper.module.d.ts +3 -8
- package/infinite-scroll/lib/infinite-scroll/infinite-scroll.directive.d.ts +1 -1
- package/infinite-scroll/lib/infinite-scroll/infinite-scroll.module.d.ts +1 -2
- package/info-sign/README.md +1 -1
- package/info-sign/lib/info-sign/components/info-sign/info-sign.component.d.ts +2 -2
- package/info-sign/lib/info-sign/info-sign.directive.d.ts +1 -1
- package/info-sign/lib/info-sign/info-sign.module.d.ts +1 -4
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.d.ts +7 -6
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-content-generator/inline-edit-content-generator.component.d.ts +4 -4
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-lookup/inline-edit-lookup.component.d.ts +4 -4
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +5 -4
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +4 -4
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-text-area/inline-edit-text-area.component.d.ts +4 -4
- package/inline-edit/lib/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +5 -4
- package/inline-edit/lib/inline-edit/inline-edit.component.d.ts +1 -1
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +1 -23
- package/insights/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.d.ts +1 -1
- package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +2 -1
- package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +1 -1
- package/insights/lib/insights/insights.component.d.ts +1 -1
- package/insights/lib/insights/insights.module.d.ts +3 -12
- package/kanban/lib/kanban/components/kanban-column/kanban-column.component.d.ts +5 -5
- package/kanban/lib/kanban/components/kanban-item/kanban-item.component.d.ts +4 -4
- package/kanban/lib/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +1 -1
- package/kanban/lib/kanban/kanban.component.d.ts +1 -1
- package/kanban/lib/kanban/kanban.module.d.ts +3 -13
- package/label-value/lib/label-value/label-value.component.d.ts +1 -1
- package/label-value/lib/label-value/label-value.module.d.ts +1 -6
- package/loading-state/lib/loading-state/components/dots-indicator/dots-indicator.components.d.ts +1 -1
- package/loading-state/lib/loading-state/components/logo-indicator/logo-indicator.component.d.ts +1 -1
- package/loading-state/lib/loading-state/components/progress-bar-indicator/progress-bar-indicator.component.d.ts +1 -1
- package/loading-state/lib/loading-state/loading-state.component.d.ts +1 -1
- package/loading-state/lib/loading-state/loading-state.directive.d.ts +1 -1
- package/loading-state/lib/loading-state/loading-state.module.d.ts +1 -6
- package/locale/lib/locale/locale.module.d.ts +1 -2
- package/locale/lib/locale/pipes/localized-bignumber-impure.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-bignumber.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-currency-impure.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-currency.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-date-impure.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-date.pipe.d.ts +1 -1
- package/locale/lib/locale/pipes/localized-number.pipe.d.ts +2 -2
- package/locale/lib/locale/pipes/localized-time-impure.pipe.d.ts +3 -3
- package/locale/lib/locale/pipes/localized-time.pipe.d.ts +1 -1
- package/localized-number-input/lib/localized-number-input/localized-number-input.directive.d.ts +2 -1
- package/localized-number-input/lib/localized-number-input/localized-number-input.module.d.ts +1 -2
- package/mask/lib/mask/mask-formatter.module.d.ts +1 -1
- package/mask/lib/mask/mask-formatter.pipe.d.ts +1 -1
- package/mouse-events/lib/mouse-events/long-press.directive.d.ts +1 -1
- package/mouse-events/lib/mouse-events/mouse-events.module.d.ts +3 -4
- package/navigation-button/lib/navigation-button/navigation-button.component.d.ts +1 -1
- package/navigation-button/lib/navigation-button/navigation-button.module.d.ts +1 -4
- package/number-input/lib/number-input/number-input.directive.d.ts +1 -1
- package/number-input/lib/number-input/number-input.module.d.ts +1 -2
- package/numeric/lib/numeric.module.d.ts +1 -2
- package/numeric/lib/numeric.pipe.d.ts +1 -1
- package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +1 -0
- package/object-card/README.md +13 -1
- package/object-card/lib/object-card/elements/field/object-card-field.component.d.ts +1 -1
- package/object-card/lib/object-card/elements/main/object-card-main.component.d.ts +1 -1
- package/object-card/lib/object-card/object-card.component.d.ts +1 -1
- package/object-card/lib/object-card/object-card.module.d.ts +5 -10
- package/package.json +1 -1
- package/panel/lib/panel/panel.component.d.ts +6 -1
- package/panel/lib/panel/panel.module.d.ts +2 -4
- package/password-strength/lib/password-strength/password-strength.component.d.ts +1 -1
- package/password-strength/lib/password-strength/password-strength.directive.d.ts +1 -1
- package/password-strength/lib/password-strength/password-strength.module.d.ts +2 -4
- package/picklist/README.md +74 -2
- package/product-header/README.md +1 -1
- package/profile-picture-picker/README.md +1 -1
- package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.d.ts +1 -1
- package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.d.ts +1 -7
- package/progressbar/README.md +0 -1
- package/progressbar/lib/progressbar/components/progressbar-determinate/progressbar-determinate.component.d.ts +2 -1
- package/progressbar/lib/progressbar/components/progressbar-indeterminate/progressbar-indeterminate.component.d.ts +1 -1
- package/progressbar/lib/progressbar/progressbar.component.d.ts +1 -1
- package/progressbar/lib/progressbar/progressbar.module.d.ts +1 -5
- package/radio-button/README.md +0 -1
- package/rating-scale/README.md +1 -1
- package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +2 -2
- package/rating-scale/lib/rating-scale/rating-scale.module.d.ts +1 -3
- package/schematics/migrations/migrate-steps-to-stepper/index.d.ts +2 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js +104 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.test.d.ts +1 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.test.js +206 -0
- package/schematics/migrations/migrate-steps-to-stepper/index.test.js.map +1 -0
- package/schematics/migrations.json +5 -0
- package/schematics/utils/ast-utils.d.ts +13 -0
- package/schematics/utils/ast-utils.js +76 -0
- package/schematics/utils/ast-utils.js.map +1 -1
- package/select/lib/select/select.component.d.ts +1 -1
- package/select-button/README.md +1 -1
- package/select-button/lib/select-button/components/select-button-item/select-button-item.component.d.ts +1 -1
- package/select-button/lib/select-button/select-button.component.d.ts +1 -1
- package/select-button/lib/select-button/select-button.module.d.ts +1 -3
- package/shared/lib/shared/border-button/border-button.component.d.ts +1 -1
- package/shared/lib/shared/border-button/border-button.module.d.ts +1 -3
- package/sidebar/lib/sidebar/sidebar.component.d.ts +1 -1
- package/sidebar/lib/sidebar/sidebar.module.d.ts +2 -4
- package/slide-in-bar/README.md +1 -1
- package/slide-in-bar/lib/slide-in-bar/slide-in-bar.component.d.ts +1 -1
- package/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.d.ts +1 -2
- package/slider/README.md +1 -1
- package/slider/lib/slider/slider.component.d.ts +1 -1
- package/slider/lib/slider/slider.module.d.ts +1 -3
- package/speech-recognition/README.md +1 -1
- package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +1 -1
- package/speech-recognition/lib/speech-recognition/speech-recognition.module.d.ts +1 -3
- package/split-button/README.md +1 -1
- package/split-button/lib/split-button/split-button.component.d.ts +1 -1
- package/split-button/lib/split-button/split-button.module.d.ts +1 -2
- package/spotlight/README.md +1 -1
- package/star-rating/README.md +1 -1
- package/stats-card/README.md +1 -1
- package/stats-card/lib/stats-card/stats-card.component.d.ts +1 -1
- package/stats-card/lib/stats-card/stats-card.module.d.ts +1 -4
- package/stepper/lib/stepper/stepper.component.d.ts +1 -1
- package/stepper/lib/stepper/stepper.module.d.ts +1 -3
- package/structure/lib/structure/footer.component.d.ts +1 -1
- package/structure/lib/structure/header.component.d.ts +1 -1
- package/structure/lib/structure/structure.module.d.ts +1 -2
- package/switch/lib/switch/switch.component.d.ts +1 -1
- package/switch/lib/switch/switch.module.d.ts +1 -2
- package/table/README.md +9 -8
- package/table/lib/table/row-toggler/row-toggler.directive.d.ts +1 -1
- package/table/lib/table/table-column/table-columns.component.d.ts +1 -1
- package/table/lib/table/table-paging/table-paging.component.d.ts +1 -1
- package/table/lib/table/table.module.d.ts +5 -12
- package/table-header/lib/table-header/table-header-checkbox.component.d.ts +1 -1
- package/table-header/lib/table-header/table-header-checkox.module.d.ts +1 -4
- package/template/README.md +177 -0
- package/template/lib/template/template.module.d.ts +2 -3
- package/text-area/lib/text-area/text-area.component.d.ts +1 -1
- package/text-area/lib/text-area.module.d.ts +1 -5
- package/text-area-ia/README.md +1 -1
- package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -1
- package/thumbnail/lib/thumbnail/thumbnail.module.d.ts +1 -2
- package/thumbnails/lib/thumbnails/components/thumbnail-item/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +1 -1
- package/thumbnails/lib/thumbnails/components/thumbnail-item/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +2 -2
- package/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +5 -4
- package/thumbnails/lib/thumbnails/thumbnails.component.d.ts +1 -1
- package/thumbnails/lib/thumbnails/thumbnails.module.d.ts +1 -8
- package/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +1 -1
- package/tiered-menu/lib/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +1 -1
- package/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +1 -1
- package/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +1 -1
- package/tiered-menu/lib/tiered-menu/tiered-menu.directive.d.ts +1 -1
- package/tiered-menu/lib/tiered-menu/tiered-menu.module.d.ts +1 -6
- package/tile/lib/tile/tile.component.d.ts +1 -1
- package/tile/lib/tile/tile.module.d.ts +3 -5
- package/timeline/lib/timeline/components/horizontal-timeline/horizontal-timeline.component.d.ts +1 -1
- package/timeline/lib/timeline/components/timeline-icon-item/timeline-icon-item.component.d.ts +1 -1
- package/timeline/lib/timeline/components/vertical-timeline/components/collapse-option/collapse-option.component.d.ts +1 -1
- package/timeline/lib/timeline/components/vertical-timeline/components/collapsed-items/collapsed-items.component.d.ts +1 -1
- package/timeline/lib/timeline/components/vertical-timeline/components/range-line/range-line.component.d.ts +1 -1
- package/timeline/lib/timeline/components/vertical-timeline/components/vertical-items/vertical-items.component.d.ts +1 -1
- package/timeline/lib/timeline/components/vertical-timeline/vertical-timeline.component.d.ts +1 -1
- package/timeline/lib/timeline/timeline.component.d.ts +1 -1
- package/timeline/lib/timeline/timeline.module.d.ts +1 -5
- package/toast/lib/toast/toast.component.d.ts +1 -1
- package/toast/lib/toast/toast.module.d.ts +3 -3
- package/token-list/lib/token-list/token-list.component.d.ts +1 -1
- package/token-list/lib/token-list/token-list.module.d.ts +1 -2
- package/tooltip/lib/tooltip/tooltip.module.d.ts +1 -2
- package/topbar/lib/topbar/topbar.component.d.ts +1 -1
- package/topbar/lib/topbar/topbar.module.d.ts +3 -5
- package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +1 -1
- package/tree/lib/tree/tree.component.d.ts +1 -1
- package/tree/lib/tree/tree.module.d.ts +1 -6
- package/workspace-switch/lib/workspace-switch/workspace-switch.component.d.ts +1 -1
- package/workspace-switch/lib/workspace-switch/workspace-switch.module.d.ts +1 -2
- package/esm2022/insights/lib/insights/components/insights-card/components/index.mjs +0 -2
- package/esm2022/timeline/lib/timeline/components/horizontal-timeline/horizontal-timeline.module.mjs +0 -20
- package/esm2022/timeline/lib/timeline/components/timeline-icon-item/timeline-icon-item.module.mjs +0 -19
- package/esm2022/timeline/lib/timeline/components/vertical-timeline/vertical-timeline.module.mjs +0 -33
- package/insights/lib/insights/components/insights-card/components/index.d.ts +0 -1
- package/timeline/lib/timeline/components/horizontal-timeline/horizontal-timeline.module.d.ts +0 -10
- package/timeline/lib/timeline/components/timeline-icon-item/timeline-icon-item.module.d.ts +0 -9
- package/timeline/lib/timeline/components/vertical-timeline/vertical-timeline.module.d.ts +0 -13
|
@@ -146,6 +146,7 @@ export class DatepickerComponent {
|
|
|
146
146
|
ngControl = null;
|
|
147
147
|
value = signal(null);
|
|
148
148
|
isOpen = signal(false);
|
|
149
|
+
isFocused = signal(false);
|
|
149
150
|
viewDate = signal(new Date());
|
|
150
151
|
pickerView = signal('calendar');
|
|
151
152
|
hours = signal(0);
|
|
@@ -481,6 +482,7 @@ export class DatepickerComponent {
|
|
|
481
482
|
}
|
|
482
483
|
handleInputClick() { }
|
|
483
484
|
handleInputFocus(event) {
|
|
485
|
+
this.isFocused.set(true);
|
|
484
486
|
this.focused.emit(event);
|
|
485
487
|
if (this.showOnFocus()) {
|
|
486
488
|
this.openOnFocus();
|
|
@@ -490,6 +492,7 @@ export class DatepickerComponent {
|
|
|
490
492
|
this.valueInput.emit(event);
|
|
491
493
|
}
|
|
492
494
|
handleInputBlur(event) {
|
|
495
|
+
this.isFocused.set(false);
|
|
493
496
|
this.blurred.emit(event);
|
|
494
497
|
const input = event.target;
|
|
495
498
|
this._isBadInput = input.validity?.badInput ?? false;
|
|
@@ -1023,7 +1026,7 @@ export class DatepickerComponent {
|
|
|
1023
1026
|
useExisting: DatepickerComponent,
|
|
1024
1027
|
multi: true,
|
|
1025
1028
|
},
|
|
1026
|
-
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n class=\"hide-native-icon h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary focus:outline-1 focus:outline-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n [type]=\"inputType()\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonlyInput() || mode() === 'range' || mode() === 'year' || isMultipleMode()\"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (click)=\"handleInputClick()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i [class]=\"resolvedIcon()\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"closePanel()\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i class=\"fas fa-chevron-down text-[10px]\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div class=\"grid grid-cols-7 px-3 pt-2\" role=\"row\">\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_calendar_label' | translate: { month: (currentMonthKey() | translate), year: currentYear() }\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div role=\"row\" class=\"contents\">\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-full text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"day.isSelected || day.isRangeStart || day.isRangeEnd ? 'selected' : day.isToday ? 'today' : null\"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday &&\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary': isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10': !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year)\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index)\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}input.hide-native-icon::-webkit-calendar-picker-indicator{display:none}button[type=button]:focus-visible{outline:2px solid #428BCA;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1029
|
+
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n class=\"hide-native-icon h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n [type]=\"inputType()\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonlyInput() || mode() === 'range' || mode() === 'year' || isMultipleMode()\"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (click)=\"handleInputClick()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i [class]=\"resolvedIcon()\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"closePanel()\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i class=\"fas fa-chevron-down text-[10px]\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div class=\"grid grid-cols-7 px-3 pt-2\" role=\"row\">\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_calendar_label' | translate: { month: (currentMonthKey() | translate), year: currentYear() }\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div role=\"row\" class=\"contents\">\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"day.isSelected || day.isRangeStart || day.isRangeEnd ? 'selected' : day.isToday ? 'today' : null\"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday &&\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary': isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10': !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year)\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index)\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}input.hide-native-icon::-webkit-calendar-picker-indicator{display:none}button[type=button]:focus-visible{outline:2px solid #428BCA;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1027
1030
|
}
|
|
1028
1031
|
__decorate([
|
|
1029
1032
|
numericKeysOnly()
|
|
@@ -1057,6 +1060,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1057
1060
|
useExisting: DatepickerComponent,
|
|
1058
1061
|
multi: true,
|
|
1059
1062
|
},
|
|
1060
|
-
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n class=\"hide-native-icon h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary focus:outline-1 focus:outline-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n [type]=\"inputType()\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonlyInput() || mode() === 'range' || mode() === 'year' || isMultipleMode()\"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (click)=\"handleInputClick()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i [class]=\"resolvedIcon()\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"closePanel()\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i class=\"fas fa-chevron-down text-[10px]\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div class=\"grid grid-cols-7 px-3 pt-2\" role=\"row\">\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_calendar_label' | translate: { month: (currentMonthKey() | translate), year: currentYear() }\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div role=\"row\" class=\"contents\">\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-full text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"day.isSelected || day.isRangeStart || day.isRangeEnd ? 'selected' : day.isToday ? 'today' : null\"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday &&\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary': isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10': !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year)\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index)\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}input.hide-native-icon::-webkit-calendar-picker-indicator{display:none}button[type=button]:focus-visible{outline:2px solid #428BCA;outline-offset:1px;border-radius:inherit}\n"] }]
|
|
1063
|
+
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n class=\"hide-native-icon h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n [type]=\"inputType()\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonlyInput() || mode() === 'range' || mode() === 'year' || isMultipleMode()\"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (click)=\"handleInputClick()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i class=\"fas fa-times text-xs\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i [class]=\"resolvedIcon()\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"closePanel()\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i class=\"fas fa-chevron-down text-[10px]\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div class=\"grid grid-cols-7 px-3 pt-2\" role=\"row\">\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_calendar_label' | translate: { month: (currentMonthKey() | translate), year: currentYear() }\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div role=\"row\" class=\"contents\">\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"day.isSelected || day.isRangeStart || day.isRangeEnd ? 'selected' : day.isToday ? 'today' : null\"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday &&\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary': isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10': !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year)\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i class=\"fas fa-chevron-left text-xs\" aria-hidden=\"true\"></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i class=\"fas fa-chevron-right text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index)\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span class=\"text-xl font-bold text-grayscale-60\" aria-hidden=\"true\">:</span>\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i class=\"fas fa-chevron-up text-xs\" aria-hidden=\"true\"></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i class=\"fas fa-chevron-down text-xs\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}input.hide-native-icon::-webkit-calendar-picker-indicator{display:none}button[type=button]:focus-visible{outline:2px solid #428BCA;outline-offset:1px;border-radius:inherit}\n"] }]
|
|
1061
1064
|
}], propDecorators: { handleHoursKeydown: [], handleMinutesKeydown: [], handleSecondsKeydown: [] } });
|
|
1062
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxtQkFBbUIsRUFHbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQU1yRixTQUFTLGVBQWU7SUFDcEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBOEIsRUFBRSxFQUFFO1FBQ3JELE1BQU0sUUFBUSxHQUFtQyxVQUFVLENBQUMs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ZSxFQUFFOytEQVNqQjs0RkExN0JRLG1CQUFtQjtrQkE5Qi9CLFNBQVM7K0JBQ0ksY0FBYyxjQUNaLElBQUksV0FDUDt3QkFDTCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxtQkFBbUI7cUJBQ3RCLFFBR0s7d0JBQ0YsaUJBQWlCLEVBQUUsYUFBYTtxQkFDbkMsYUFDVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLHFCQUFxQjs0QkFDaEMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcscUJBQXFCOzRCQUNoQyxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjs4QkE4NUJTLGtCQUFrQixNQVdsQixvQkFBb0IsTUFXcEIsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBOZ0NvbnRyb2wsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2RhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5uby1pY29uXSc6ICchc2hvd0ljb24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBWVNfSU5fV0VFSyA9IDc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX0lOX1lFQVIgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX0dSSUQgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01JTlVURV9TVEVQID0gNTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfSE9VUlMgPSAyNDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTUlOVVRFUyA9IDYwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhPVVJTX1BFUl9NRVJJRElFTSA9IDEyO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkKCk6IHN0cmluZyB7XG4gICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyKys7XG4gICAgICAgIHJldHVybiBgcy1kYXRlcGlja2VyLSR7RGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEhUTUwgYGlkYCBhcGxpY2FkbyBhbyBlbGVtZW50byBgPGlucHV0PmAuIEF1dG8tZ2VyYWRvIHF1YW5kbyBvbWl0aWRvLiAqL1xuICAgIHJlYWRvbmx5IGlucHV0SWQgPSBpbnB1dDxzdHJpbmc+KERhdGVwaWNrZXJDb21wb25lbnQubmV4dElkKCkpO1xuXG4gICAgLyoqIEF0cmlidXRvIGBuYW1lYCBkbyBgPGlucHV0PmAgbmF0aXZvLiAqL1xuICAgIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKiogVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtIHZhbG9yIGVzdMOhIHNlbGVjaW9uYWRvLiAqL1xuICAgIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIGAnZGF0ZSdgIOKAlCBzZWxlw6fDo28gZGUgZGF0YSDDum5pY2EgKHBhZHLDo28pXG4gICAgICogLSBgJ21vbnRoJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw6pzL2Fub1xuICAgICAqIC0gYCdkYXRldGltZSdgIOKAlCBkYXRhIGNvbSBob3JhIChyZXF1ZXIgY29uZmlybWHDp8OjbylcbiAgICAgKiAtIGAndGltZSdgIOKAlCBhcGVuYXMgc2VsZcOnw6NvIGRlIGhvcmFcbiAgICAgKiAtIGAncmFuZ2UnYCDigJQgaW50ZXJ2YWxvIGVudHJlIGR1YXMgZGF0YXNcbiAgICAgKi9cbiAgICByZWFkb25seSBtb2RlID0gaW5wdXQ8RGF0ZVBpY2tlck1vZGU+KCdkYXRlJyk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBxdWFuZG8gYG1vZGVgIMOpIGAnZGF0ZSdgLlxuICAgICAqIC0gYCdzaW5nbGUnYCDigJQgc2VsZcOnw6NvIGRlIHVtYSDDum5pY2EgZGF0YSAocGFkcsOjbylcbiAgICAgKiAtIGAnbXVsdGlwbGUnYCDigJQgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgZGF0YXMgYXZ1bHNhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUgPSBpbnB1dDwnc2luZ2xlJyB8ICdtdWx0aXBsZSc+KCdzaW5nbGUnKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcmVhZG9ubHkgbXVsdGlwbGVTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcsICcpO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIMOtY29uZSBhbyBsYWRvIGRvIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dJY29uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gbm8gYm90w6NvIGRvIGNhbXBvLlxuICAgICAqIFF1YW5kbyBgbW9kZWAgw6kgYCd0aW1lJ2AsIG8gcGFkcsOjbyBtdWRhIGF1dG9tYXRpY2FtZW50ZSBwYXJhIGAnZmFzIGZhLWNsb2NrJ2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWNvbiA9IGlucHV0PHN0cmluZz4oJ2ZhcyBmYS1jYWxlbmRhcicpO1xuXG4gICAgLyoqIERhdGEgbcOtbmltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIGFudGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtaW4gPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBtw6F4aW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgcG9zdGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtYXggPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBleGliaWRhIGFvIGFicmlyIG8gY2FsZW5kw6FyaW8gcXVhbmRvIG5lbmh1bWEgZGF0YSBlc3TDoSBzZWxlY2lvbmFkYS4gKi9cbiAgICByZWFkb25seSBkZWZhdWx0RGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGEgZGF0YSBubyBjYW1wbyAodXNhZG8gYXBlbmFzIHBhcmEgZGlzcGxheSkuICovXG4gICAgcmVhZG9ubHkgZGF0ZUZvcm1hdCA9IGlucHV0PHN0cmluZz4oJ2RkL01NL3l5eXknKTtcblxuICAgIC8qKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGFzIGhvcmFzOiBgJzEyJ2Agb3UgYCcyNCdgLiAqL1xuICAgIHJlYWRvbmx5IGhvdXJGb3JtYXQgPSBpbnB1dDwnMTInIHwgJzI0Jz4oJzI0Jyk7XG5cbiAgICAvKiogSW5jcmVtZW50byBlbSBtaW51dG9zIGFvIHVzYXIgYXMgc2V0YXMgZG8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgbWludXRlU3RlcCA9IGlucHV0PG51bWJlcj4oRGF0ZXBpY2tlckNvbXBvbmVudC5ERUZBVUxUX01JTlVURV9TVEVQKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGNhbXBvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHNob3dTZWNvbmRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYCdyYW5nZSdgLiAqL1xuICAgIHJlYWRvbmx5IHJhbmdlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignIOKAlCAnKTtcblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIGFvIGZvY2FyIG8gaW5wdXQ7IGZvY28gcGVybWFuZWNlIG5vIGlucHV0LCBuw6NvIHB1bGEgcGFyYSBvIGRyb3Bkb3duLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPbkZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogSW1wZWRlIGRpZ2l0YcOnw6NvIG1hbnVhbDsgdmFsb3Igc8OzIHBvZGUgc2VyIHNlbGVjaW9uYWRvIHBlbG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgcmVhZG9ubHlJbnB1dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBQcmltZWlybyBkaWEgZGEgc2VtYW5hICgwID0gZG9taW5nbywgMSA9IHNlZ3VuZGEtZmVpcmEsIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGZpcnN0RGF5T2ZXZWVrID0gaW5wdXQ8bnVtYmVyPigwKTtcblxuICAgIC8qKiBFeGliZS9vY3VsdGEgYSBiYXJyYSBkZSBib3TDtWVzIEhvamUgZSBMaW1wYXIgbm8gcm9kYXDDqS4gKi9cbiAgICByZWFkb25seSBzaG93QnV0dG9uQmFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogRXhpYmUgw61jb25lIGRlIGxpbXBhciBpbmxpbmUgbm8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgc2hvd0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEV4aWJlIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzaG93T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBQZXJtaXRlIHNlbGVjaW9uYXIgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdE90aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEZlY2hhIG8gcGFpbmVsIGFww7NzIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gbW9kbyBgZGF0ZXRpbWVgLiAqL1xuICAgIHJlYWRvbmx5IGhpZGVPbkRhdGVUaW1lU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgaG9yYXMgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcEhvdXIgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcFNlY29uZCA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogw41uZGljZSBkZSB0YWIgZG8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgICAvKiogRm9jYSBhdXRvbWF0aWNhbWVudGUgbyBjYW1wbyBhbyBjYXJyZWdhciBvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgYXV0b2ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIERhdGFzIGVzcGVjw61maWNhcyBkZXNhYmlsaXRhZGFzIG5vIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXMgPSBpbnB1dDxEYXRlW10+KFtdKTtcblxuICAgIC8qKiBEaWFzIGRhIHNlbWFuYSBkZXNhYmlsaXRhZG9zICgwID0gZG9taW5nbywgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXlzID0gaW5wdXQ8bnVtYmVyW10+KFtdKTtcblxuICAgIC8vIOKUgOKUgCBUd28td2F5IG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBtb2RlbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgT3V0cHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcmVjZWJlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBmb2N1c2VkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gc2VsZWNpb25hciB1bWEgZGF0YSwgbcOqcywgaG9yw6FyaW8gb3UgaW50ZXJ2YWxvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkID0gb3V0cHV0PERhdGVwaWNrZXJWYWx1ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBmZWNoYS4gRW1pdGUgbyBlbGVtZW50byBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkhvamVcIi4gKi9cbiAgICByZWFkb25seSB0b2RheUNsaWNrID0gb3V0cHV0PERhdGU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiTGltcGFyXCIgb3Ugbm8gw61jb25lIGRlIGxpbXBhciBpbmxpbmUuICovXG4gICAgcmVhZG9ubHkgY2xlYXJDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gbcOqcyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IG1vbnRoQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBhbm8gdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSB5ZWFyQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gYWJyZS4gKi9cbiAgICByZWFkb25seSBzaG93ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgbWFudWFsbWVudGUgbm8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgdmFsdWVJbnB1dCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8vIOKUgOKUgCBJbnRlcm5hbCBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhIb3VycyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX0hPVVJTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhNaW51dGVzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfTUlOVVRFUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUlucHV0TWF4TGVuZ3RoID0gMjtcblxuICAgIHByb3RlY3RlZCBpbnB1dERhdGUgPSAnJztcblxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0RhdGUgPSBzaWduYWwobmV3IERhdGUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBpY2tlclZpZXcgPSBzaWduYWw8UGlja2VyVmlldz4oJ2NhbGVuZGFyJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVZhbHVlID0gc2lnbmFsPERhdGVSYW5nZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsZVZhbHVlcyA9IHNpZ25hbDxEYXRlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGVuZGluZ1JhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNCYWRJbnB1dCA9IGZhbHNlO1xuICAgIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9wdXBQYW5lbCA9IHZpZXdDaGlsZCgncG9wdXBQYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluY3JlYXNlSG91ckJ1dHRvbiA9IHZpZXdDaGlsZCgnaW5jcmVhc2VIb3VyQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbkJ1dHRvbiA9IHZpZXdDaGlsZCgnaWNvbkJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gICAgLy8g4pSA4pSAIENvbXB1dGVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSWNvbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnID8gJ2ZhcyBmYS1jbG9jaycgOiB0aGlzLmljb24oKSkpO1xuXG4gICAgLyoqIEluZGljYSBzZSBvIHRpbWUgcGlja2VyIGRldmUgdXNhciBvIGZvcm1hdG8gZGUgMTIgaG9yYXMgY29tIHNlbGV0b3IgQU0vUE0uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzMTJIb3VyRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ob3VyRm9ybWF0KCkgPT09ICcxMicpO1xuXG4gICAgLyoqIEhvcmEgZXhpYmlkYSBubyB0aW1lIHBpY2tlcjogMeKAkzEyIG5vIGZvcm1hdG8gMTJoLCAw4oCTMjMgbm8gZm9ybWF0byAyNGguICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3BsYXlIb3VycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICAgIGNvbnN0IGgxMiA9IHRoaXMuaG91cnMoKSAlIERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICByZXR1cm4gaDEyID09PSAwID8gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gOiBoMTI7XG4gICAgfSk7XG5cbiAgICAvKiogTWVyaWRpYW5vIGF0dWFsIGRlcml2YWRvIGRhIGhvcmEgaW50ZXJuYSAoMOKAkzIzKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYW1QbSA9IGNvbXB1dGVkPCdBTScgfCAnUE0nPigoKSA9PlxuICAgICAgICB0aGlzLmhvdXJzKCkgPCBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA/ICdBTScgOiAnUE0nLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnLCBvZmZzZXRZOiA0IH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC00IH0sXG4gICAgXTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwb3B1cElkID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pbnB1dElkKCl9LXBvcHVwYCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoSW5kZXggPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdEYXRlKCkuZ2V0TW9udGgoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRZZWFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldEZ1bGxZZWFyKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50TW9udGhLZXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vbnRoS2V5c1t0aGlzLmN1cnJlbnRNb250aEluZGV4KCldKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93Q2FsZW5kYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSAhPT0gJ3RpbWUnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1RpbWVQaWNrZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKTtcblxuICAgIC8qKiBTZWxlw6fDo28gbcO6bHRpcGxhIGF0aXZhOiBhcGVuYXMgbm8gbW9kbyBgZGF0ZWAgY29tIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTXVsdGlwbGVNb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScgJiYgdGhpcy5tb2RlKCkgPT09ICdkYXRlJyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3JkZXJlZFdlZWtEYXlLZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3REYXlPZldlZWsoKTtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLndlZWtEYXlLZXlzLnNsaWNlKHN0YXJ0KSwgLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZSgwLCBzdGFydCldO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0VHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuICd0ZXh0JztcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICBpZiAobW9kZSA9PT0gJ2RhdGV0aW1lJykgcmV0dXJuICdkYXRldGltZS1sb2NhbCc7XG4gICAgICAgIGlmIChtb2RlID09PSAncmFuZ2UnIHx8IG1vZGUgPT09ICd5ZWFyJykgcmV0dXJuICd0ZXh0JztcbiAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsS2V5ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5tb2RlKCkgPT09ICdyYW5nZSdcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9yYW5nZSdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9kYXRlJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcGxhY2Vob2xkZXJfJHttb2RlfWA7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWZmZWN0aXZlUmFuZ2UgPSBjb21wdXRlZCgoKTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlbmRpbmcuZ2V0VGltZSgpIDw9IGhvdmVyLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBob3Zlcl0gOiBbaG92ZXIsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBwZW5kaW5nLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVZhbHVlKCkgPz8geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJXZWVrcyA9IGNvbXB1dGVkKCgpOiBDYWxlbmRhckRheVtdW10gPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoSW5kZXgoKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmVmZmVjdGl2ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnRUaW1lID0gcmFuZ2Uuc3RhcnQgPyBzdHJpcFRpbWUocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmRUaW1lID0gcmFuZ2UuZW5kID8gc3RyaXBUaW1lKHJhbmdlLmVuZCkgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN0YXJ0RGF5ID0gKHN0YXJ0V2Vla0RheSAtIHRoaXMuZmlyc3REYXlPZldlZWsoKSArIDcpICUgNztcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCBhbGxEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFkanVzdGVkU3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5c0luUHJldk1vbnRoIC0gaSk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkYXlzSW5Nb250aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGQpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCB0cnVlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID1cbiAgICAgICAgICAgIE1hdGguY2VpbChhbGxEYXlzLmxlbmd0aCAvIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSAqIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBsZXQgbmV4dERheSA9IDE7XG4gICAgICAgIHdoaWxlIChhbGxEYXlzLmxlbmd0aCA8IHRvdGFsQ2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIG5leHREYXkpO1xuICAgICAgICAgICAgbmV4dERheSsrO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbERheXMubGVuZ3RoOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSwgaSArIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19JTl9ZRUFSOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX1BFUl9ST1cpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2ldLCBpbmRleDogaSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMV0sIGluZGV4OiBpICsgMSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMl0sIGluZGV4OiBpICsgMiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudERlY2FkZVN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRZZWFyKCkgLyAxMCkgKiAxMCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeWVhcnNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlcltdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtzdGFydCArIGksIHN0YXJ0ICsgaSArIDEsIHN0YXJ0ICsgaSArIDJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmICghbWluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgPD0gbWluLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0RnVsbFllYXIoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdmlldy5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgICAgICAgICh2aWV3LmdldEZ1bGxZZWFyKCkgPT09IG1pbi5nZXRGdWxsWWVhcigpICYmIHZpZXcuZ2V0TW9udGgoKSA8PSBtaW4uZ2V0TW9udGgoKSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEIC0gMSA+PSBtYXguZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPiBtYXguZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpID49IG1heC5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSAIFRyYW5zbGF0aW9uIGtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2Vla0RheUtleXMgPSBbXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc3VuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9tb24nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3R1ZScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfd2VkJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV90aHUnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X2ZyaScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc2F0JyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoS2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2phbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9mZWInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfbWFyJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2FwcicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXknLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2p1bCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9hdWcnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfc2VwJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX29jdCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9ub3YnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfZGVjJyxcbiAgICBdO1xuXG4gICAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwsIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KGQpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9ICcnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnZhbHVlXS5zb3J0KChhLCBiKSA9PiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KHNvcnRlZCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShzb3J0ZWQpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBzb3J0ZWRbMF07XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShmaXJzdC5nZXRGdWxsWWVhcigpLCBmaXJzdC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZhbHVlLnN0YXJ0LmdldEZ1bGxZZWFyKCksIHZhbHVlLnN0YXJ0LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlLnNldCh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldChkLmdldEhvdXJzKCkpO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkLmdldFNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGxldCB2YWx1ZTogRGF0ZXBpY2tlclZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFB1YmxpYyBhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIHNlbSB0cmFuc2ZlcmlyIG8gZm9jbyBwYXJhIG8gZHJvcGRvd24gKHVzYWRvIHBlbG8gc2hvd09uRm9jdXMpLiAqL1xuICAgIHByaXZhdGUgb3Blbk9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIC8vIEZvY28gcGVybWFuZWNlIG5vIGlucHV0IOKAlCBuw6NvIGNoYW1hIGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSB2aWV3IGluaWNpYWwgZG8gcGFpbmVsIGUgcG9zaWNpb25hIG8gY2FsZW5kw6FyaW8gbm8gYGRlZmF1bHREYXRlYFxuICAgICAqIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlT3BlblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREYXRlID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICBpZiAoZGVmYXVsdERhdGUgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRlZmF1bHREYXRlLmdldEZ1bGxZZWFyKCksIGRlZmF1bHREYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ3llYXJzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwidG9kYXlcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gKHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50ID8/IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmhvdmVyRGF0ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHBhbmVsKTtcblxuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlT3ZlcmxheUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2xpY2soKTogdm9pZCB7fVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09uRm9jdXMoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuT25Gb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLl9pc0JhZElucHV0ID0gaW5wdXQudmFsaWRpdHk/LmJhZElucHV0ID8/IGZhbHNlO1xuICAgICAgICBpZiAoIWlucHV0LnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IChldmVudCBhcyBGb2N1c0V2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIXJlbGF0ZWRUYXJnZXQgfHwgIXBhbmVsPy5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXJhdz8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnB1dCh0aGlzLm1vZGUoKSwgcmF3LCB0aGlzLnZhbHVlKCksIHRoaXMubWF4SG91cnMsIHRoaXMubWF4TWludXRlcywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzQmFkSW5wdXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHBhcnNlZCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShwYXJzZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZCA9IHBhcnNlZCBhcyBEYXRlO1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlVHJpZ2dlcktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVQcmV2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpIC0gMTAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpIC0gMSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVOZXh0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpICsgMTAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpICsgMSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2FsZW5kYXJHcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBBUlJPV1MgPSBbJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJ107XG4gICAgICAgIGlmICghQVJST1dTLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IGdyaWQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBidXR0b25zID0gQXJyYXkuZnJvbShncmlkLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykpO1xuICAgICAgICBjb25zdCBjdXJyZW50SWR4ID0gYnV0dG9ucy5pbmRleE9mKGV2ZW50LnRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXJyZW50SWR4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBkZWx0YSA9IDA7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JykgZGVsdGEgPSAxO1xuICAgICAgICBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnKSBkZWx0YSA9IC0xO1xuICAgICAgICBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSBkZWx0YSA9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykgZGVsdGEgPSAtRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG5cbiAgICAgICAgY29uc3QgbmV4dElkeCA9IGN1cnJlbnRJZHggKyBkZWx0YTtcblxuICAgICAgICBpZiAobmV4dElkeCA8IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZEaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlUHJldigpO1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRucyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gTWF0aC5tYXgoMCwgYnRucy5sZW5ndGggKyBuZXh0SWR4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SWR4ID49IGJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWluKG5leHRJZHggLSBidXR0b25zLmxlbmd0aCwgYnRucy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAxKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYnV0dG9uc1tuZXh0SWR4XT8uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGJ1dHRvbnNbbmV4dElkeF0uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGZpbmRFbmFibGVkKFxuICAgICAgICBidXR0b25zOiBIVE1MQnV0dG9uRWxlbWVudFtdLFxuICAgICAgICBzdGFydElkeDogbnVtYmVyLFxuICAgICAgICBkaXJlY3Rpb246IDEgfCAtMSxcbiAgICApOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJZHg7IGkgPj0gMCAmJiBpIDwgYnV0dG9ucy5sZW5ndGg7IGkgKz0gZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbnNbaV0uZGlzYWJsZWQpIHJldHVybiBidXR0b25zW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzd2l0Y2hUb01vbnRocygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmFja1RvQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgU2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdERhdGUoZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xuICAgICAgICBpZiAoZGF5LmlzRGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNdWx0aXBsZURhdGUoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID1cbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5nZXRUaW1lKCkgPD0gZGF5LmRhdGUuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGRheS5kYXRlXSA6IFtkYXkuZGF0ZSwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RUb2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNEYXRlRGlzYWJsZWQodG9kYXkpKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxEYXk6IENhbGVuZGFyRGF5ID0ge1xuICAgICAgICAgICAgICAgIGRhdGU6IHRvZGF5LFxuICAgICAgICAgICAgICAgIGRheU9mTW9udGg6IHRvZGF5LmdldERhdGUoKSxcbiAgICAgICAgICAgICAgICBpc0N1cnJlbnRNb250aDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1RvZGF5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VTdGFydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSYW5nZUVuZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNJblJhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoY2FsRGF5KTtcbiAgICAgICAgICAgIHRoaXMudG9kYXlDbGljay5lbWl0KHRvZGF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbGVhclZhbHVlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgwKTtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgwKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgwKTtcbiAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMuY2xlYXJDbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShjb25maXJtZWQpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFRpbWUgcGlja2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSAtIHRoaXMuc3RlcEhvdXIoKSArIHRoaXMubWF4SG91cnMpICUgdGhpcy5tYXhIb3Vycyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRTZWNvbmRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgLSB0aGlzLnN0ZXBTZWNvbmQoKSArIDYwKSAlIDYwKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50SG91cnMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudFNlY29uZHMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSG91cnNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbGYgPSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgICAgIGNvbnN0IGgxMiA9IE1hdGgubWluKGhhbGYsIE1hdGgubWF4KDEsIHBhcnNlZCkpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGgxMiAlIGhhbGY7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmFtUG0oKSA9PT0gJ1BNJyA/IGJhc2UgKyBoYWxmIDogYmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChNYXRoLm1pbih0aGlzLm1heEhvdXJzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmEgZW50cmUgQU0gZSBQTSBzb21hbmRvL3N1YnRyYWluZG8gMTIgaG9yYXMgZGEgaG9yYSBpbnRlcm5hLiAqL1xuICAgIHByb3RlY3RlZCB0b2dnbGVBbVBtKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KHRoaXMuaG91cnMoKSA8IGhhbGYgPyB0aGlzLmhvdXJzKCkgKyBoYWxmIDogdGhpcy5ob3VycygpIC0gaGFsZik7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU1pbnV0ZXNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChNYXRoLm1pbih0aGlzLm1heE1pbnV0ZXMgLSAxLCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVNlY29uZHNJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmF3ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChNYXRoLm1pbig1OSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRheUhvdmVyKGRhdGU6IERhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KGRhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbigpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkYXRlKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZGF0ZSkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF5cyA9IHRoaXMuZGlzYWJsZWREYXlzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERheXMubGVuZ3RoICYmIGRpc2FibGVkRGF5cy5pbmNsdWRlcyhkYXRlLmdldERheSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICAgICAgaWYgKGRpc2FibGVkRGF0ZXMubGVuZ3RoICYmIGRpc2FibGVkRGF0ZXMuc29tZShkID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5kYXRlRm9ybWF0KCksXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlU2VwYXJhdG9yKCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW5jVGltZVRvVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KG5ld0RhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ2FsZW5kYXJEYXkoXG4gICAgICAgIGRhdGU6IERhdGUsXG4gICAgICAgIGlzQ3VycmVudE1vbnRoOiBib29sZWFuLFxuICAgICAgICB0b2RheTogRGF0ZSxcbiAgICAgICAgc2VsZWN0ZWQ6IERhdGUgfCBudWxsLFxuICAgICAgICByYW5nZTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSxcbiAgICAgICAgcmFuZ2VTdGFydFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgICAgIHJhbmdlRW5kVGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICApOiBDYWxlbmRhckRheSB7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VTdGFydCA9IHJhbmdlLnN0YXJ0ID8gaXNTYW1lRGF5KGRhdGUsIHJhbmdlLnN0YXJ0KSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBpc1JhbmdlRW5kID0gcmFuZ2UuZW5kID8gaXNTYW1lRGF5KGRhdGUsIHJhbmdlLmVuZCkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBzdHJpcFRpbWUoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGlzSW5SYW5nZSA9XG4gICAgICAgICAgICByYW5nZVN0YXJ0VGltZSAhPT0gbnVsbCAmJiByYW5nZUVuZFRpbWUgIT09IG51bGxcbiAgICAgICAgICAgICAgICA/IGRhdGVUaW1lID4gcmFuZ2VTdGFydFRpbWUgJiYgZGF0ZVRpbWUgPCByYW5nZUVuZFRpbWVcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5pc011bHRpcGxlTW9kZSgpXG4gICAgICAgICAgICA/IHRoaXMubXVsdGlwbGVWYWx1ZXMoKS5zb21lKChkKSA9PiBpc1NhbWVEYXkoZCwgZGF0ZSkpXG4gICAgICAgICAgICA6IHNlbGVjdGVkXG4gICAgICAgICAgICAgID8gaXNTYW1lRGF5KGRhdGUsIHNlbGVjdGVkKVxuICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5T2ZNb250aDogZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICBpc1RvZGF5OiBpc1NhbWVEYXkoZGF0ZSwgdG9kYXkpLFxuICAgICAgICAgICAgaXNTZWxlY3RlZCxcbiAgICAgICAgICAgIGlzRGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkgfHwgKCFpc0N1cnJlbnRNb250aCAmJiAhdGhpcy5zZWxlY3RPdGhlck1vbnRocygpKSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgIGlzUmFuZ2VTdGFydCxcbiAgICAgICAgICAgIGlzUmFuZ2VFbmQsXG4gICAgICAgICAgICBpc0luUmFuZ2UsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wdXRlVmFsaWRhdGlvbkVycm9ycyh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNGb3JtYXRFcnJvcikgcmV0dXJuIHsgaW52YWxpZEZvcm1hdDogdHJ1ZSB9O1xuICAgICAgICBpZiAodGhpcy5faXNCYWRJbnB1dCkgcmV0dXJuIHsgYmFkSW5wdXQ6IHRydWUgfTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGQgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0ICYmIG1pbiAmJiBzdHJpcFRpbWUodmFsdWUuc3RhcnQpIDwgc3RyaXBUaW1lKG1pbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IHZhbHVlLnN0YXJ0IH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5lbmQgJiYgbWF4ICYmIHN0cmlwVGltZSh2YWx1ZS5lbmQpID4gc3RyaXBUaW1lKG1heCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IHZhbHVlLmVuZCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgaWYgKG1pbiAmJiBkLmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIGlmIChtYXggJiYgZC5nZXRGdWxsWWVhcigpID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGQpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGQpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogZCB9IH07XG4gICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RhdGVSYW5nZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGVSYW5nZSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdzdGFydCcgaW4gdmFsdWUgJiYgJ2VuZCcgaW4gdmFsdWU7XG4gICAgfVxufVxuXG4iLCI8ZGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXJcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgYXJpYS1oYXNwb3B1cD1cImdyaWRcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKClcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwicG9wdXBJZCgpXCJcbj5cbiAgICA8aW5wdXRcbiAgICAgICAgY2xhc3M9XCJoaWRlLW5hdGl2ZS1pY29uIGgtWzM1cHhdIHctZnVsbCByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBwbC0zIHRleHQtc20gb3V0bGluZS1ub25lIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzOmJvcmRlci1wcmltYXJ5IGZvY3VzOm91dGxpbmUtMSBmb2N1czpvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICBbY2xhc3MucHItMTBdPVwic2hvd0ljb24oKSAmJiAhc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItMTZdPVwic2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci02XT1cIiFzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtNV09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuY3Vyc29yLW5vdC1hbGxvd2VkXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbaWRdPVwiaW5wdXRJZCgpXCJcbiAgICAgICAgW25hbWVdPVwibmFtZSgpID8/IGlucHV0SWQoKVwiXG4gICAgICAgIFt0eXBlXT1cImlucHV0VHlwZSgpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgPz8gKHBsYWNlaG9sZGVyS2V5KCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlJbnB1dCgpIHx8IG1vZGUoKSA9PT0gJ3JhbmdlJyB8fCBtb2RlKCkgPT09ICd5ZWFyJyB8fCBpc011bHRpcGxlTW9kZSgpXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlSW5wdXRDbGljaygpXCJcbiAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIChpbnB1dCk9XCJoYW5kbGVOYXRpdmVJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIm5nQ29udHJvbD8uY29udHJvbD8uaW52YWxpZCB8fCBudWxsXCJcbiAgICAvPlxuXG4gICAgQGlmIChzaG93Q2xlYXIoKSAmJiBpbnB1dERhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGZsZXggaC1bMzVweF0gdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXlzY2FsZS02MCB0cmFuc2l0aW9uLWNvbG9ycyBob3Zlcjp0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtOV09XCJzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC0wXT1cIiFzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXMgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93SWNvbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBmbGV4IGgtWzM1cHhdIHctOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgYm9yZGVyLXNvbGlkIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuaG92ZXI6YmctZ3JheXNjYWxlLTEwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX29wZW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGkgW2NsYXNzXT1cInJlc29sdmVkSWNvbigpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW4oKVwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0cnVlXCJcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJwb3NpdGlvbnNcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cImNsb3NlUGFuZWwoKVwiXG4gICAgKG92ZXJsYXlLZXlkb3duKT1cImhhbmRsZU92ZXJsYXlLZXlkb3duKCRldmVudClcIlxuICAgIChkZXRhY2gpPVwiaXNPcGVuLnNldChmYWxzZSlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgI3BvcHVwUGFuZWxcbiAgICAgICAgY2xhc3M9XCJ6LTUwIHctNzIgcm91bmRlZC1tZWRpdW0gYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wIHNoYWRvdy1tZFwiXG4gICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICAgW2lkXT1cInBvcHVwSWQoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGlhbG9nQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgICAgQGlmIChzaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gbWVuc2FsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGhfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSB9fSZuYnNwO3t7IGN1cnJlbnRZZWFyKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LVsxMHB4XVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X21vbnRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvcyBkb3MgZGlhcyBkYSBzZW1hbmEgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwdC0yXCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXlLZXkgb2Ygb3JkZXJlZFdlZWtEYXlLZXlzKCk7IHRyYWNrIGRheUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGF5S2V5IHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXlLZXkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRvIGNhbGVuZMOhcmlvIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcGItMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiAoY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUpLCB5ZWFyOiBjdXJyZW50WWVhcigpIH1cIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiByb2xlPVwicm93XCIgY2xhc3M9XCJjb250ZW50c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS50b0lTT1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZm9ybWF0RGF5QXJpYUxhYmVsKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiZGF5LmlzVG9kYXkgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cImRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgPyAnc2VsZWN0ZWQnIDogZGF5LmlzVG9kYXkgPyAndG9kYXknIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS0xMCBob3ZlcjpiZy1ncmF5c2NhbGUtMjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNJblJhbmdlICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBkYXkuaXNEaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUhvdmVyKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkuZGF5T2ZNb250aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBwb3IgZMOpY2FkYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfZGVjYWRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudERlY2FkZVN0YXJ0KCkgfX0g4oCTIHt7IGN1cnJlbnREZWNhZGVTdGFydCgpICsgMTEgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X2RlY2FkZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgYW5vcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgeWVhcnNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoeWVhciBvZiByb3c7IHRyYWNrIHllYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJpc0N1cnJlbnRZZWFyKHllYXIpID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgPyAnc2VsZWN0ZWQnIDogaXNDdXJyZW50WWVhcih5ZWFyKSA/ICd0b2RheScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzogaXNZZWFyU2VsZWN0ZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzogaXNDdXJyZW50WWVhcih5ZWFyKSAmJiAhaXNZZWFyU2VsZWN0ZWQoeWVhcikgJiYgIWlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6ICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gYW51YWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBjdXJyZW50WWVhcigpIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBtZXNlcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIG1vbnRoc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChtb250aCBvZiByb3c7IHRyYWNrIG1vbnRoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpID8gJ3NlbGVjdGVkJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSAmJiAhaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLmtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSAhPT0gJ21vbnRoJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2JhY2tfdG9fY2FsZW5kYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUaW1lIHBpY2tlciAtLT5cbiAgICAgICAgQGlmIChzaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMyBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zb2xpZF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF90aW1lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBIb3JhcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgI2luY3JlYXNlSG91ckJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1wcmltYXJ5IGZvY3VzOm91dGxpbmUtMSBmb2N1czpvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoZGlzcGxheUhvdXJzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUhvdXJzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlSG91cnNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1pbnV0b3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Ojwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlZ3VuZG9zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoc2Vjb25kcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWNvbmRzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlY29uZHNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChpczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZXRvciBBTS9QTSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IHctMTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9nZ2xlX21lcmlkaWVtJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFtUG0oKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFtUG0oKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gUm9kYXDDqSBkZSBhw6fDtWVzIC0tPlxuICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZScgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VG9kYXkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9kYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
1065
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxtQkFBbUIsRUFHbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQU1yRixTQUFTLGVBQWU7SUFDcEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBOEIsRUFBRSxFQUFFO1FBQ3JELE1BQU0sUUFBUSxHQUFtQyxVQUFVLENBQUMs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Q1AsZUFBZSw0RkFDZixZQUFZLDRJQUNaLGdCQUFnQix1SUFDaEIsbUJBQW1CLDIrQkFDbkIsV0FBVyw4bUJBQ1gsbUJBQW1COztBQWk5QmI7SUFEVCxlQUFlLEVBQUU7NkRBU2pCO0FBR1M7SUFEVCxlQUFlLEVBQUU7K0RBU2pCO0FBR1M7SUFEVCxlQUFlLEVBQUU7K0RBU2pCOzRGQTc3QlEsbUJBQW1CO2tCQTVEL0IsU0FBUzsrQkFDSSxjQUFjLGNBQ1osSUFBSSxXQUNQO3dCQUNMLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLG1CQUFtQjtxQkFDdEIsUUFpQ0s7d0JBQ0YsaUJBQWlCLEVBQUUsYUFBYTtxQkFDbkMsYUFDVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLHFCQUFxQjs0QkFDaEMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7d0JBQ0Q7NEJBQ0ksT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcscUJBQXFCOzRCQUNoQyxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjs4QkFpNkJTLGtCQUFrQixNQVdsQixvQkFBb0IsTUFXcEIsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdENvbnRyb2wsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBOZ0NvbnRyb2wsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbiAgICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQge1xuICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzEzMDE4O1xuICAgICAgICB9XG4gICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQ6Zm9jdXMge1xuICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjQzEzMDE4O1xuICAgICAgICAgICAgb3V0bGluZS1jb2xvcjogI0MxMzAxODtcbiAgICAgICAgfVxuICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICBib3JkZXItY29sb3I6ICNDMTMwMTg7XG4gICAgICAgIH1cbiAgICAgICAgOmhvc3Qubm8taWNvbiBidXR0b25bdHlwZT0nYnV0dG9uJ10ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICA6aG9zdC5uby1pY29uIGlucHV0IHtcbiAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQuaGlkZS1uYXRpdmUtaWNvbjo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgYnV0dG9uW3R5cGU9J2J1dHRvbiddOmZvY3VzLXZpc2libGUge1xuICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhCQ0E7XG4gICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgICAgICAgfVxuICAgIGBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5uby1pY29uXSc6ICchc2hvd0ljb24oKScsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXIgPSAwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERBWVNfSU5fV0VFSyA9IDc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX0lOX1lFQVIgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX0dSSUQgPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01JTlVURV9TVEVQID0gNTtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfSE9VUlMgPSAyNDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfTUlOVVRFUyA9IDYwO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEhPVVJTX1BFUl9NRVJJRElFTSA9IDEyO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkKCk6IHN0cmluZyB7XG4gICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyKys7XG4gICAgICAgIHJldHVybiBgcy1kYXRlcGlja2VyLSR7RGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEhUTUwgYGlkYCBhcGxpY2FkbyBhbyBlbGVtZW50byBgPGlucHV0PmAuIEF1dG8tZ2VyYWRvIHF1YW5kbyBvbWl0aWRvLiAqL1xuICAgIHJlYWRvbmx5IGlucHV0SWQgPSBpbnB1dDxzdHJpbmc+KERhdGVwaWNrZXJDb21wb25lbnQubmV4dElkKCkpO1xuXG4gICAgLyoqIEF0cmlidXRvIGBuYW1lYCBkbyBgPGlucHV0PmAgbmF0aXZvLiAqL1xuICAgIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKiogVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtIHZhbG9yIGVzdMOhIHNlbGVjaW9uYWRvLiAqL1xuICAgIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIGAnZGF0ZSdgIOKAlCBzZWxlw6fDo28gZGUgZGF0YSDDum5pY2EgKHBhZHLDo28pXG4gICAgICogLSBgJ21vbnRoJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw6pzL2Fub1xuICAgICAqIC0gYCdkYXRldGltZSdgIOKAlCBkYXRhIGNvbSBob3JhIChyZXF1ZXIgY29uZmlybWHDp8OjbylcbiAgICAgKiAtIGAndGltZSdgIOKAlCBhcGVuYXMgc2VsZcOnw6NvIGRlIGhvcmFcbiAgICAgKiAtIGAncmFuZ2UnYCDigJQgaW50ZXJ2YWxvIGVudHJlIGR1YXMgZGF0YXNcbiAgICAgKi9cbiAgICByZWFkb25seSBtb2RlID0gaW5wdXQ8RGF0ZVBpY2tlck1vZGU+KCdkYXRlJyk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBxdWFuZG8gYG1vZGVgIMOpIGAnZGF0ZSdgLlxuICAgICAqIC0gYCdzaW5nbGUnYCDigJQgc2VsZcOnw6NvIGRlIHVtYSDDum5pY2EgZGF0YSAocGFkcsOjbylcbiAgICAgKiAtIGAnbXVsdGlwbGUnYCDigJQgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgZGF0YXMgYXZ1bHNhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUgPSBpbnB1dDwnc2luZ2xlJyB8ICdtdWx0aXBsZSc+KCdzaW5nbGUnKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcmVhZG9ubHkgbXVsdGlwbGVTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcsICcpO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIMOtY29uZSBhbyBsYWRvIGRvIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dJY29uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gbm8gYm90w6NvIGRvIGNhbXBvLlxuICAgICAqIFF1YW5kbyBgbW9kZWAgw6kgYCd0aW1lJ2AsIG8gcGFkcsOjbyBtdWRhIGF1dG9tYXRpY2FtZW50ZSBwYXJhIGAnZmFzIGZhLWNsb2NrJ2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWNvbiA9IGlucHV0PHN0cmluZz4oJ2ZhcyBmYS1jYWxlbmRhcicpO1xuXG4gICAgLyoqIERhdGEgbcOtbmltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIGFudGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtaW4gPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBtw6F4aW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgcG9zdGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtYXggPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBleGliaWRhIGFvIGFicmlyIG8gY2FsZW5kw6FyaW8gcXVhbmRvIG5lbmh1bWEgZGF0YSBlc3TDoSBzZWxlY2lvbmFkYS4gKi9cbiAgICByZWFkb25seSBkZWZhdWx0RGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGEgZGF0YSBubyBjYW1wbyAodXNhZG8gYXBlbmFzIHBhcmEgZGlzcGxheSkuICovXG4gICAgcmVhZG9ubHkgZGF0ZUZvcm1hdCA9IGlucHV0PHN0cmluZz4oJ2RkL01NL3l5eXknKTtcblxuICAgIC8qKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGFzIGhvcmFzOiBgJzEyJ2Agb3UgYCcyNCdgLiAqL1xuICAgIHJlYWRvbmx5IGhvdXJGb3JtYXQgPSBpbnB1dDwnMTInIHwgJzI0Jz4oJzI0Jyk7XG5cbiAgICAvKiogSW5jcmVtZW50byBlbSBtaW51dG9zIGFvIHVzYXIgYXMgc2V0YXMgZG8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgbWludXRlU3RlcCA9IGlucHV0PG51bWJlcj4oRGF0ZXBpY2tlckNvbXBvbmVudC5ERUZBVUxUX01JTlVURV9TVEVQKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGNhbXBvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHNob3dTZWNvbmRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFNlcGFyYWRvciBleGliaWRvIGVudHJlIGFzIGRhdGFzIG5vIG1vZG8gYCdyYW5nZSdgLiAqL1xuICAgIHJlYWRvbmx5IHJhbmdlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignIOKAlCAnKTtcblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIGFvIGZvY2FyIG8gaW5wdXQ7IGZvY28gcGVybWFuZWNlIG5vIGlucHV0LCBuw6NvIHB1bGEgcGFyYSBvIGRyb3Bkb3duLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPbkZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogSW1wZWRlIGRpZ2l0YcOnw6NvIG1hbnVhbDsgdmFsb3Igc8OzIHBvZGUgc2VyIHNlbGVjaW9uYWRvIHBlbG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgcmVhZG9ubHlJbnB1dCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBQcmltZWlybyBkaWEgZGEgc2VtYW5hICgwID0gZG9taW5nbywgMSA9IHNlZ3VuZGEtZmVpcmEsIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGZpcnN0RGF5T2ZXZWVrID0gaW5wdXQ8bnVtYmVyPigwKTtcblxuICAgIC8qKiBFeGliZS9vY3VsdGEgYSBiYXJyYSBkZSBib3TDtWVzIEhvamUgZSBMaW1wYXIgbm8gcm9kYXDDqS4gKi9cbiAgICByZWFkb25seSBzaG93QnV0dG9uQmFyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogRXhpYmUgw61jb25lIGRlIGxpbXBhciBpbmxpbmUgbm8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgc2hvd0NsZWFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEV4aWJlIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzaG93T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBQZXJtaXRlIHNlbGVjaW9uYXIgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdE90aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEZlY2hhIG8gcGFpbmVsIGFww7NzIHNlbGVjaW9uYXIgdW1hIGRhdGEgbm8gbW9kbyBgZGF0ZXRpbWVgLiAqL1xuICAgIHJlYWRvbmx5IGhpZGVPbkRhdGVUaW1lU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgaG9yYXMgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcEhvdXIgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc3RlcFNlY29uZCA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogw41uZGljZSBkZSB0YWIgZG8gY2FtcG8gZGUgaW5wdXQuICovXG4gICAgcmVhZG9ubHkgdGFiaW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG5cbiAgICAvKiogRm9jYSBhdXRvbWF0aWNhbWVudGUgbyBjYW1wbyBhbyBjYXJyZWdhciBvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgYXV0b2ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIERhdGFzIGVzcGVjw61maWNhcyBkZXNhYmlsaXRhZGFzIG5vIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF0ZXMgPSBpbnB1dDxEYXRlW10+KFtdKTtcblxuICAgIC8qKiBEaWFzIGRhIHNlbWFuYSBkZXNhYmlsaXRhZG9zICgwID0gZG9taW5nbywgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXlzID0gaW5wdXQ8bnVtYmVyW10+KFtdKTtcblxuICAgIC8vIOKUgOKUgCBUd28td2F5IG1vZGVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBtb2RlbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgT3V0cHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHBlcmRlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBibHVycmVkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcmVjZWJlIG8gZm9jby4gKi9cbiAgICByZWFkb25seSBmb2N1c2VkID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gc2VsZWNpb25hciB1bWEgZGF0YSwgbcOqcywgaG9yw6FyaW8gb3UgaW50ZXJ2YWxvLiAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGVkID0gb3V0cHV0PERhdGVwaWNrZXJWYWx1ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBmZWNoYS4gRW1pdGUgbyBlbGVtZW50byBkbyBwYWluZWwuICovXG4gICAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PEhUTUxFbGVtZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkhvamVcIi4gKi9cbiAgICByZWFkb25seSB0b2RheUNsaWNrID0gb3V0cHV0PERhdGU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiTGltcGFyXCIgb3Ugbm8gw61jb25lIGRlIGxpbXBhciBpbmxpbmUuICovXG4gICAgcmVhZG9ubHkgY2xlYXJDbGljayA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gbcOqcyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IG1vbnRoQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBhbm8gdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSB5ZWFyQ2hhbmdlID0gb3V0cHV0PHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyIH0+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gYWJyZS4gKi9cbiAgICByZWFkb25seSBzaG93ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyB1c3XDoXJpbyBkaWdpdGEgbWFudWFsbWVudGUgbm8gY2FtcG8uICovXG4gICAgcmVhZG9ubHkgdmFsdWVJbnB1dCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8vIOKUgOKUgCBJbnRlcm5hbCBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhIb3VycyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX0hPVVJTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhNaW51dGVzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfTUlOVVRFUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZUlucHV0TWF4TGVuZ3RoID0gMjtcblxuICAgIHByb3RlY3RlZCBpbnB1dERhdGUgPSAnJztcblxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbHVlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0RhdGUgPSBzaWduYWwobmV3IERhdGUoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBpY2tlclZpZXcgPSBzaWduYWw8UGlja2VyVmlldz4oJ2NhbGVuZGFyJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdXJzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtaW51dGVzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWNvbmRzID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVZhbHVlID0gc2lnbmFsPERhdGVSYW5nZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtdWx0aXBsZVZhbHVlcyA9IHNpZ25hbDxEYXRlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGVuZGluZ1JhbmdlU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3ZlckRhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNCYWRJbnB1dCA9IGZhbHNlO1xuICAgIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9wdXBQYW5lbCA9IHZpZXdDaGlsZCgncG9wdXBQYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluY3JlYXNlSG91ckJ1dHRvbiA9IHZpZXdDaGlsZCgnaW5jcmVhc2VIb3VyQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbkJ1dHRvbiA9IHZpZXdDaGlsZCgnaWNvbkJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gICAgLy8g4pSA4pSAIENvbXB1dGVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSWNvbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnID8gJ2ZhcyBmYS1jbG9jaycgOiB0aGlzLmljb24oKSkpO1xuXG4gICAgLyoqIEluZGljYSBzZSBvIHRpbWUgcGlja2VyIGRldmUgdXNhciBvIGZvcm1hdG8gZGUgMTIgaG9yYXMgY29tIHNlbGV0b3IgQU0vUE0uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzMTJIb3VyRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ob3VyRm9ybWF0KCkgPT09ICcxMicpO1xuXG4gICAgLyoqIEhvcmEgZXhpYmlkYSBubyB0aW1lIHBpY2tlcjogMeKAkzEyIG5vIGZvcm1hdG8gMTJoLCAw4oCTMjMgbm8gZm9ybWF0byAyNGguICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3BsYXlIb3VycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzMTJIb3VyRm9ybWF0KCkpIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICAgIGNvbnN0IGgxMiA9IHRoaXMuaG91cnMoKSAlIERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICByZXR1cm4gaDEyID09PSAwID8gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gOiBoMTI7XG4gICAgfSk7XG5cbiAgICAvKiogTWVyaWRpYW5vIGF0dWFsIGRlcml2YWRvIGRhIGhvcmEgaW50ZXJuYSAoMOKAkzIzKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYW1QbSA9IGNvbXB1dGVkPCdBTScgfCAnUE0nPigoKSA9PlxuICAgICAgICB0aGlzLmhvdXJzKCkgPCBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTSA/ICdBTScgOiAnUE0nLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnLCBvZmZzZXRZOiA0IH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScsIG9mZnNldFk6IC00IH0sXG4gICAgXTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwb3B1cElkID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pbnB1dElkKCl9LXBvcHVwYCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoSW5kZXggPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdEYXRlKCkuZ2V0TW9udGgoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRZZWFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldEZ1bGxZZWFyKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50TW9udGhLZXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vbnRoS2V5c1t0aGlzLmN1cnJlbnRNb250aEluZGV4KCldKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBzaG93Q2FsZW5kYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSAhPT0gJ3RpbWUnKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1RpbWVQaWNrZXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCB0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKTtcblxuICAgIC8qKiBTZWxlw6fDo28gbcO6bHRpcGxhIGF0aXZhOiBhcGVuYXMgbm8gbW9kbyBgZGF0ZWAgY29tIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTXVsdGlwbGVNb2RlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3Rpb25Nb2RlKCkgPT09ICdtdWx0aXBsZScgJiYgdGhpcy5tb2RlKCkgPT09ICdkYXRlJyk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3JkZXJlZFdlZWtEYXlLZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3REYXlPZldlZWsoKTtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLndlZWtEYXlLZXlzLnNsaWNlKHN0YXJ0KSwgLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZSgwLCBzdGFydCldO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0VHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuICd0ZXh0JztcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICBpZiAobW9kZSA9PT0gJ2RhdGV0aW1lJykgcmV0dXJuICdkYXRldGltZS1sb2NhbCc7XG4gICAgICAgIGlmIChtb2RlID09PSAncmFuZ2UnIHx8IG1vZGUgPT09ICd5ZWFyJykgcmV0dXJuICd0ZXh0JztcbiAgICAgICAgcmV0dXJuIG1vZGU7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsS2V5ID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5tb2RlKCkgPT09ICdyYW5nZSdcbiAgICAgICAgICAgID8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9yYW5nZSdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9kYXRlJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYWNlaG9sZGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcGxhY2Vob2xkZXJfJHttb2RlfWA7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWZmZWN0aXZlUmFuZ2UgPSBjb21wdXRlZCgoKTogeyBzdGFydDogRGF0ZSB8IG51bGw7IGVuZDogRGF0ZSB8IG51bGwgfSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChob3Zlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlbmRpbmcuZ2V0VGltZSgpIDw9IGhvdmVyLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBob3Zlcl0gOiBbaG92ZXIsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBwZW5kaW5nLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVZhbHVlKCkgPz8geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsZW5kYXJXZWVrcyA9IGNvbXB1dGVkKCgpOiBDYWxlbmRhckRheVtdW10gPT4ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoSW5kZXgoKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmVmZmVjdGl2ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlU3RhcnRUaW1lID0gcmFuZ2Uuc3RhcnQgPyBzdHJpcFRpbWUocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmFuZ2VFbmRUaW1lID0gcmFuZ2UuZW5kID8gc3RyaXBUaW1lKHJhbmdlLmVuZCkgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgICAgICAgY29uc3Qgc3RhcnRXZWVrRGF5ID0gZmlyc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgICAgICBjb25zdCBhZGp1c3RlZFN0YXJ0RGF5ID0gKHN0YXJ0V2Vla0RheSAtIHRoaXMuZmlyc3REYXlPZldlZWsoKSArIDcpICUgNztcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTtcblxuICAgICAgICBjb25zdCBhbGxEYXlzOiBDYWxlbmRhckRheVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGFkanVzdGVkU3RhcnREYXkgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5c0luUHJldk1vbnRoIC0gaSk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBkYXlzSW5Nb250aDsgZCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGQpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCB0cnVlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbENlbGxzID1cbiAgICAgICAgICAgIE1hdGguY2VpbChhbGxEYXlzLmxlbmd0aCAvIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSAqIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuICAgICAgICBsZXQgbmV4dERheSA9IDE7XG4gICAgICAgIHdoaWxlIChhbGxEYXlzLmxlbmd0aCA8IHRvdGFsQ2VsbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIG5leHREYXkpO1xuICAgICAgICAgICAgbmV4dERheSsrO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd2Vla3M6IENhbGVuZGFyRGF5W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbERheXMubGVuZ3RoOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSB7XG4gICAgICAgICAgICB3ZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSwgaSArIERhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3M6IHsga2V5OiBzdHJpbmc7IGluZGV4OiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19JTl9ZRUFSOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX1BFUl9ST1cpIHtcbiAgICAgICAgICAgIHJvd3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2ldLCBpbmRleDogaSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMV0sIGluZGV4OiBpICsgMSB9LFxuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpICsgMl0sIGluZGV4OiBpICsgMiB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudERlY2FkZVN0YXJ0ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRZZWFyKCkgLyAxMCkgKiAxMCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeWVhcnNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlcltdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtzdGFydCArIGksIHN0YXJ0ICsgaSArIDEsIHN0YXJ0ICsgaSArIDJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmICghbWluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgPD0gbWluLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0RnVsbFllYXIoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdmlldy5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgICAgICAgICh2aWV3LmdldEZ1bGxZZWFyKCkgPT09IG1pbi5nZXRGdWxsWWVhcigpICYmIHZpZXcuZ2V0TW9udGgoKSA8PSBtaW4uZ2V0TW9udGgoKSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEIC0gMSA+PSBtYXguZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPiBtYXguZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpID49IG1heC5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSAIFRyYW5zbGF0aW9uIGtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2Vla0RheUtleXMgPSBbXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc3VuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9tb24nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3R1ZScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfd2VkJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV90aHUnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X2ZyaScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc2F0JyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoS2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2phbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9mZWInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfbWFyJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2FwcicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXknLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2p1bCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9hdWcnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfc2VwJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX29jdCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9ub3YnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfZGVjJyxcbiAgICBdO1xuXG4gICAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwsIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KGQpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9ICcnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnZhbHVlXS5zb3J0KChhLCBiKSA9PiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KHNvcnRlZCk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShzb3J0ZWQpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBzb3J0ZWRbMF07XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShmaXJzdC5nZXRGdWxsWWVhcigpLCBmaXJzdC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZhbHVlLnN0YXJ0LmdldEZ1bGxZZWFyKCksIHZhbHVlLnN0YXJ0LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlLnNldCh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldChkLmdldEhvdXJzKCkpO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkLmdldFNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGxldCB2YWx1ZTogRGF0ZXBpY2tlclZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFB1YmxpYyBhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBYnJlIG8gcGFpbmVsIHNlbSB0cmFuc2ZlcmlyIG8gZm9jbyBwYXJhIG8gZHJvcGRvd24gKHVzYWRvIHBlbG8gc2hvd09uRm9jdXMpLiAqL1xuICAgIHByaXZhdGUgb3Blbk9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5pc09wZW4oKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIC8vIEZvY28gcGVybWFuZWNlIG5vIGlucHV0IOKAlCBuw6NvIGNoYW1hIGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSB2aWV3IGluaWNpYWwgZG8gcGFpbmVsIGUgcG9zaWNpb25hIG8gY2FsZW5kw6FyaW8gbm8gYGRlZmF1bHREYXRlYFxuICAgICAqIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlT3BlblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHREYXRlID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICBpZiAoZGVmYXVsdERhdGUgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRlZmF1bHREYXRlLmdldEZ1bGxZZWFyKCksIGRlZmF1bHREYXRlLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ3llYXJzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpOiB2b2lkIHtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwidG9kYXlcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gKHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50ID8/IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmhvdmVyRGF0ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHBhbmVsKTtcblxuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pY29uQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlT3ZlcmxheUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2xpY2soKTogdm9pZCB7fVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cygpKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5PbkZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlTmF0aXZlSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWVJbnB1dC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmJsdXJyZWQuZW1pdChldmVudCk7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2lzQmFkSW5wdXQgPSBpbnB1dC52YWxpZGl0eT8uYmFkSW5wdXQgPz8gZmFsc2U7XG4gICAgICAgIGlmICghaW5wdXQudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gKGV2ZW50IGFzIEZvY3VzRXZlbnQpLnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInRvZGF5XCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2hhbmdlKHJhdzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghcmF3Py50cmltKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUlucHV0KHRoaXMubW9kZSgpLCByYXcsIHRoaXMudmFsdWUoKSwgdGhpcy5tYXhIb3VycywgdGhpcy5tYXhNaW51dGVzLCB0aGlzLnJhbmdlU2VwYXJhdG9yKCkpO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9oYXNGb3JtYXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNCYWRJbnB1dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQocGFyc2VkKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHBhcnNlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkID0gcGFyc2VkIGFzIERhdGU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnNldChkLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnNldChkLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVUcmlnZ2VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZVByZXYoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgLSAxIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpIC0gMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBuYXZpZ2F0ZU5leHQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMTAsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSArIDEsIHZpZXcuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiB2aWV3LmdldEZ1bGxZZWFyKCkgKyAxIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMubW9udGhDaGFuZ2UuZW1pdCh7IG1vbnRoOiBuZXdEYXRlLmdldE1vbnRoKCksIHllYXI6IG5ld0RhdGUuZ2V0RnVsbFllYXIoKSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IEFSUk9XUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXTtcbiAgICAgICAgaWYgKCFBUlJPV1MuaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBBcnJheS5mcm9tKGdyaWQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJZHggPSBidXR0b25zLmluZGV4T2YoZXZlbnQudGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50KTtcbiAgICAgICAgaWYgKGN1cnJlbnRJZHggPT09IC0xKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGRlbHRhID0gMDtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSBkZWx0YSA9IDE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIGRlbHRhID0gLTE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIGRlbHRhID0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSBkZWx0YSA9IC1EYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcblxuICAgICAgICBjb25zdCBuZXh0SWR4ID0gY3VycmVudElkeCArIGRlbHRhO1xuXG4gICAgICAgIGlmIChuZXh0SWR4IDwgMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldkRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBidG5zLmxlbmd0aCArIG5leHRJZHgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIC0xKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJZHggPj0gYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHREaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgpO1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRucyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gTWF0aC5taW4obmV4dElkeCAtIGJ1dHRvbnMubGVuZ3RoLCBidG5zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFidXR0b25zW25leHRJZHhdPy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgYnV0dG9uc1tuZXh0SWR4XS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEVuYWJsZWQoXG4gICAgICAgIGJ1dHRvbnM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgICAgIHN0YXJ0SWR4OiBudW1iZXIsXG4gICAgICAgIGRpcmVjdGlvbjogMSB8IC0xLFxuICAgICk6IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA+PSAwICYmIGkgPCBidXR0b25zLmxlbmd0aDsgaSArPSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1tpXS5kaXNhYmxlZCkgcmV0dXJuIGJ1dHRvbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN3aXRjaFRvTW9udGhzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiYWNrVG9DYWxlbmRhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXkuaXNEaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU11bHRpcGxlRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPVxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLmdldFRpbWUoKSA8PSBkYXkuZGF0ZS5nZXRUaW1lKCkgPyBbcGVuZGluZywgZGF5LmRhdGVdIDogW2RheS5kYXRlLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRheS5kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KG5ld0RhdGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGlkZU9uRGF0ZVRpbWVTZWxlY3QoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFkaWNpb25hL3JlbW92ZSB1bWEgZGF0YSBkYSBzZWxlw6fDo28gbcO6bHRpcGxhLiBPIHBhaW5lbCBwZXJtYW5lY2UgYWJlcnRvLiAqL1xuICAgIHByaXZhdGUgdG9nZ2xlTXVsdGlwbGVEYXRlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGV4aXN0aW5nLmZpbmRJbmRleCgoZCkgPT4gaXNTYW1lRGF5KGQsIG5vcm1hbGl6ZWQpKTtcbiAgICAgICAgY29uc3QgbmV4dCA9XG4gICAgICAgICAgICBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyBleGlzdGluZy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KVxuICAgICAgICAgICAgICAgIDogWy4uLmV4aXN0aW5nLCBub3JtYWxpemVkXS5zb3J0KChhLCBiKSA9PiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpKTtcbiAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQobmV4dCk7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KG5leHQpO1xuICAgICAgICBjb25zdCBlbWl0VmFsdWUgPSBuZXh0Lmxlbmd0aCA/IG5leHQgOiBudWxsO1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGVtaXRWYWx1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChlbWl0VmFsdWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RZZWFyKHllYXI6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1llYXJEaXNhYmxlZCh5ZWFyKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoeWVhciwgMCwgMSk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc01vbnRoRGlzYWJsZWQobW9udGhJbmRleCkpIHJldHVybjtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbmV3Vmlld0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aEluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RhdGVEaXNhYmxlZCh0b2RheSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbERheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgICAgICAgICAgZGF0ZTogdG9kYXksXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aDogdG9kYXkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlRW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjYWxEYXkpO1xuICAgICAgICAgICAgdGhpcy50b2RheUNsaWNrLmVtaXQodG9kYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsZWFyVmFsdWUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KDApO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KDApO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KDApO1xuICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9ICcnO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5jbGVhckNsaWNrLmVtaXQoZXZlbnQpO1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29uZmlybSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMudmFsdWUoKSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGN1cnJlbnQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVGltZSBwaWNrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgKyB0aGlzLnN0ZXBIb3VyKCkpICUgdGhpcy5tYXhIb3Vycyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudEhvdXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgodGhpcy5ob3VycygpIC0gdGhpcy5zdGVwSG91cigpICsgdGhpcy5tYXhIb3VycykgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50TWludXRlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgodGhpcy5taW51dGVzKCkgKyB0aGlzLm1pbnV0ZVN0ZXAoKSkgJSB0aGlzLm1heE1pbnV0ZXMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSAtIHRoaXMubWludXRlU3RlcCgpICsgdGhpcy5tYXhNaW51dGVzKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpICsgdGhpcy5zdGVwU2Vjb25kKCkpICUgNjApO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBkZWNyZW1lbnRTZWNvbmRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KCh0aGlzLnNlY29uZHMoKSAtIHRoaXMuc3RlcFNlY29uZCgpICsgNjApICUgNjApO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVIb3Vyc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VycygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlTWludXRlc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50TWludXRlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZVNlY29uZHNLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudFNlY29uZHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVIb3Vyc0lucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCByYXcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChyYXcsIDEwKTtcbiAgICAgICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXMxMkhvdXJGb3JtYXQoKSkge1xuICAgICAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICAgICAgY29uc3QgaDEyID0gTWF0aC5taW4oaGFsZiwgTWF0aC5tYXgoMSwgcGFyc2VkKSk7XG4gICAgICAgICAgICBjb25zdCBiYXNlID0gaDEyICUgaGFsZjtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KHRoaXMuYW1QbSgpID09PSAnUE0nID8gYmFzZSArIGhhbGYgOiBiYXNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KE1hdGgubWluKHRoaXMubWF4SG91cnMgLSAxLCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJuYSBlbnRyZSBBTSBlIFBNIHNvbWFuZG8vc3VidHJhaW5kbyAxMiBob3JhcyBkYSBob3JhIGludGVybmEuICovXG4gICAgcHJvdGVjdGVkIHRvZ2dsZUFtUG0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5ob3VycygpIDwgaGFsZiA/IHRoaXMuaG91cnMoKSArIGhhbGYgOiB0aGlzLmhvdXJzKCkgLSBoYWxmKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlTWludXRlc0lucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCByYXcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChyYXcsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KE1hdGgubWluKHRoaXMubWF4TWludXRlcyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0lucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCByYXcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUludChyYXcsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aGlzLnNlY29uZHMuc2V0KE1hdGgubWluKDU5LCBNYXRoLm1heCgwLCBwYXJzZWQpKSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGF5SG92ZXIoZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyRGF0ZS5zZXQoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGRhdGUpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkYXRlKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWREYXlzID0gdGhpcy5kaXNhYmxlZERheXMoKTtcbiAgICAgICAgaWYgKGRpc2FibGVkRGF5cy5sZW5ndGggJiYgZGlzYWJsZWREYXlzLmluY2x1ZGVzKGRhdGUuZ2V0RGF5KCkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWREYXRlcyA9IHRoaXMuZGlzYWJsZWREYXRlcygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXRlcy5sZW5ndGggJiYgZGlzYWJsZWREYXRlcy5zb21lKGQgPT4gaXNTYW1lRGF5KGQsIGRhdGUpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICByZXR1cm4gISFzZWxlY3RlZCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB5ZWFyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc1llYXJEaXNhYmxlZCh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiB5ZWFyIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobWF4ICYmIHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNDdXJyZW50WWVhcih5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNNb250aFNlbGVjdGVkKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0TW9udGgoKSA9PT0gbW9udGhJbmRleCAmJiBzZWxlY3RlZC5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhEaXNhYmxlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiAoeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtaW4uZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4IDwgbWluLmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAmJiAoeWVhciA+IG1heC5nZXRGdWxsWWVhcigpIHx8ICh5ZWFyID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiBtb250aEluZGV4ID4gbWF4LmdldE1vbnRoKCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYWRUaW1lKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmb3JtYXREYXlBcmlhTGFiZWwoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZvcm1hdGEgbyB2YWxvciBwYXJhIGV4aWJpw6fDo28gbm8gaW5wdXQsIGFwbGljYW5kbyByYW5nZVNlcGFyYXRvciwgZGF0ZUZvcm1hdCBlIG11bHRpcGxlU2VwYXJhdG9yLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZTogRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWVGb3JJbnB1dChcbiAgICAgICAgICAgIHRoaXMubW9kZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VwYXJhdG9yKCksXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNUaW1lVG9WYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMudmFsdWUoKSA/PyBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoXG4gICAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICh0aGlzLl9pc0JhZElucHV0KSByZXR1cm4geyBiYWRJbnB1dDogdHJ1ZSB9O1xuICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbigpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLm1heCgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gJiYgc3RyaXBUaW1lKGQpIDwgc3RyaXBUaW1lKG1pbikpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZCkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQgJiYgbWluICYmIHN0cmlwVGltZSh2YWx1ZS5zdGFydCkgPCBzdHJpcFRpbWUobWluKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogdmFsdWUuc3RhcnQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlLmVuZCAmJiBtYXggJiYgc3RyaXBUaW1lKHZhbHVlLmVuZCkgPiBzdHJpcFRpbWUobWF4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG1heDogeyBtYXgsIGFjdHVhbDogdmFsdWUuZW5kIH0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZCA9IHZhbHVlIGFzIERhdGU7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICBpZiAobWluICYmIGQuZ2V0RnVsbFllYXIoKSA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgaWYgKG1heCAmJiBkLmdldEZ1bGxZZWFyKCkgPiBtYXguZ2V0RnVsbFllYXIoKSkgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgaWYgKG1heCAmJiBzdHJpcFRpbWUoZCkgPiBzdHJpcFRpbWUobWF4KSkgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVJhbmdlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZVJhbmdlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ3N0YXJ0JyBpbiB2YWx1ZSAmJiAnZW5kJyBpbiB2YWx1ZTtcbiAgICB9XG59XG5cbiIsIjxkaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBhcmlhLWhhc3BvcHVwPVwiZ3JpZFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW4oKVwiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJwb3B1cElkKClcIlxuPlxuICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImhpZGUtbmF0aXZlLWljb24gaC1bMzVweF0gdy1mdWxsIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHBsLTMgdGV4dC1zbSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXM6Ym9yZGVyLXByaW1hcnlcIlxuICAgICAgICBbY2xhc3MucHItMTBdPVwic2hvd0ljb24oKSAmJiAhc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItMTZdPVwic2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci02XT1cIiFzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtNV09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuY3Vyc29yLW5vdC1hbGxvd2VkXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbaWRdPVwiaW5wdXRJZCgpXCJcbiAgICAgICAgW25hbWVdPVwibmFtZSgpID8/IGlucHV0SWQoKVwiXG4gICAgICAgIFt0eXBlXT1cImlucHV0VHlwZSgpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKCkgPz8gKHBsYWNlaG9sZGVyS2V5KCkgfCB0cmFuc2xhdGUpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlJbnB1dCgpIHx8IG1vZGUoKSA9PT0gJ3JhbmdlJyB8fCBtb2RlKCkgPT09ICd5ZWFyJyB8fCBpc011bHRpcGxlTW9kZSgpXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlSW5wdXRDbGljaygpXCJcbiAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIChpbnB1dCk9XCJoYW5kbGVOYXRpdmVJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIm5nQ29udHJvbD8uY29udHJvbD8uaW52YWxpZCB8fCBudWxsXCJcbiAgICAvPlxuXG4gICAgQGlmIChzaG93Q2xlYXIoKSAmJiBpbnB1dERhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGZsZXggaC1bMzVweF0gdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXlzY2FsZS02MCB0cmFuc2l0aW9uLWNvbG9ycyBob3Zlcjp0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtOV09XCJzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC0wXT1cIiFzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXMgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93SWNvbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBmbGV4IGgtWzM1cHhdIHctOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgYm9yZGVyLXNvbGlkIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpICYmICFpc0ZvY3VzZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXByaW1hcnldPVwiaXNGb2N1c2VkKCkgJiYgIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ob3ZlcjpiZy1ncmF5c2NhbGUtMTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfb3BlbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aSBbY2xhc3NdPVwicmVzb2x2ZWRJY29uKClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwiY2xvc2VQYW5lbCgpXCJcbiAgICAob3ZlcmxheUtleWRvd24pPVwiaGFuZGxlT3ZlcmxheUtleWRvd24oJGV2ZW50KVwiXG4gICAgKGRldGFjaCk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICAjcG9wdXBQYW5lbFxuICAgICAgICBjbGFzcz1cInotNTAgdy03MiByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAgc2hhZG93LW1kXCJcbiAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgIGNka1RyYXBGb2N1c1xuICAgICAgICBbaWRdPVwicG9wdXBJZCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaWFsb2dBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAgICBAaWYgKHNob3dDYWxlbmRhcigpKSB7XG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ2NhbGVuZGFyJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBtZW5zYWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X21vbnRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9Nb250aHMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlIH19Jm5ic3A7e3sgY3VycmVudFllYXIoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQtWzEwcHhdXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG9zIGRvcyBkaWFzIGRhIHNlbWFuYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHB0LTJcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheUtleSBvZiBvcmRlcmVkV2Vla0RheUtleXMoKTsgdHJhY2sgZGF5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXlLZXkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheUtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZG8gY2FsZW5kw6FyaW8gLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgcHgtMyBwYi0yXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbCcgfCB0cmFuc2xhdGU6IHsgbW9udGg6IChjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSksIHllYXI6IGN1cnJlbnRZZWFyKCkgfVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yICh3ZWVrIG9mIGNhbGVuZGFyV2Vla3MoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHJvbGU9XCJyb3dcIiBjbGFzcz1cImNvbnRlbnRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5IG9mIHdlZWs7IHRyYWNrIGRheS5kYXRlLnRvSVNPU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOCB3LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzUwJV0gdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaW52aXNpYmxlXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZm9ybWF0RGF5QXJpYUxhYmVsKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiZGF5LmlzVG9kYXkgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzaG93T3RoZXJNb250aHMoKSAmJiAhZGF5LmlzQ3VycmVudE1vbnRoID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cImRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgPyAnc2VsZWN0ZWQnIDogZGF5LmlzVG9kYXkgPyAndG9kYXknIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS0xMCBob3ZlcjpiZy1ncmF5c2NhbGUtMjAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNJblJhbmdlICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzU2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlU3RhcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBkYXkuaXNEaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheS5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkRheUhvdmVyKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkuZGF5T2ZNb250aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBwb3IgZMOpY2FkYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfZGVjYWRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudERlY2FkZVN0YXJ0KCkgfX0g4oCTIHt7IGN1cnJlbnREZWNhZGVTdGFydCgpICsgMTEgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9uZXh0X2RlY2FkZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgYW5vcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgeWVhcnNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoeWVhciBvZiByb3c7IHRyYWNrIHllYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJpc0N1cnJlbnRZZWFyKHllYXIpID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgPyAnc2VsZWN0ZWQnIDogaXNDdXJyZW50WWVhcih5ZWFyKSA/ICd0b2RheScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzogaXNZZWFyU2VsZWN0ZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzogaXNDdXJyZW50WWVhcih5ZWFyKSAmJiAhaXNZZWFyU2VsZWN0ZWQoeWVhcikgJiYgIWlzWWVhckRpc2FibGVkKHllYXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6ICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gYW51YWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIj57eyBjdXJyZW50WWVhcigpIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBtZXNlcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMyBnYXAtMiBweC0zIHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIG1vbnRoc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChtb250aCBvZiByb3c7IHRyYWNrIG1vbnRoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpID8gJ3NlbGVjdGVkJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSAmJiAhaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLmtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSAhPT0gJ21vbnRoJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2JhY2tfdG9fY2FsZW5kYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUaW1lIHBpY2tlciAtLT5cbiAgICAgICAgQGlmIChzaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMyBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zb2xpZF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF90aW1lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBIb3JhcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgI2luY3JlYXNlSG91ckJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi11cCB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1wcmltYXJ5IGZvY3VzOm91dGxpbmUtMSBmb2N1czpvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoZGlzcGxheUhvdXJzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUhvdXJzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlSG91cnNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjo8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1pbnV0b3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Ojwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlZ3VuZG9zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoc2Vjb25kcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWNvbmRzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlY29uZHNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFNlY29uZHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmIChpczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VsZXRvciBBTS9QTSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IHctMTIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9nZ2xlX21lcmlkaWVtJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFtUG0oKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFtUG0oKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gUm9kYXDDqSBkZSBhw6fDtWVzIC0tPlxuICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZScgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VG9kYXkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfdG9kYXknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|