@gravitee/ui-particles-angular 15.13.0-angular-20-4a9d88b → 15.13.0-fix-cron-e0271bb
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/esm2022/gio-asciidoctor/gio-asciidoctor.component.mjs +104 -0
- package/esm2022/gio-asciidoctor/gio-asciidoctor.module.mjs +33 -0
- package/esm2022/gio-asciidoctor/gio-asciidoctor.service.mjs +48 -0
- package/esm2022/gio-asciidoctor/gravitee-ui-particles-angular-gio-asciidoctor.mjs +5 -0
- package/esm2022/gio-asciidoctor/public-api.mjs +19 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.component.mjs +127 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.harness.mjs +158 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-editor.component.mjs +131 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-editor.harness.mjs +28 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-field/gio-el-field.component.mjs +271 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-field/gio-el-field.harness.mjs +53 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.component.mjs +57 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.harness.mjs +31 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.component.mjs +74 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.harness.mjs +29 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.component.mjs +70 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.harness.mjs +29 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.component.mjs +73 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.harness.mjs +29 -0
- package/esm2022/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type.harness.mjs +38 -0
- package/esm2022/gio-el/gravitee-ui-particles-angular-gio-el.mjs +5 -0
- package/esm2022/gio-el/models/Condition.mjs +9 -0
- package/esm2022/gio-el/models/ConditionGroup.mjs +7 -0
- package/esm2022/gio-el/models/ConditionModel.mjs +17 -0
- package/esm2022/gio-el/models/ConditionsModel.mjs +4 -0
- package/esm2022/gio-el/models/ExpressionLanguageBuilder.mjs +97 -0
- package/esm2022/gio-el/models/Operator.mjs +2 -0
- package/esm2022/gio-el/models/public-api.mjs +21 -0
- package/esm2022/gio-el/public-api.mjs +19 -0
- package/esm2022/gravitee-ui-particles-angular.mjs +5 -0
- package/esm2022/lib/gio-avatar/gio-avatar.component.mjs +74 -0
- package/esm2022/lib/gio-avatar/gio-avatar.module.mjs +33 -0
- package/esm2022/lib/gio-avatar/index.mjs +18 -0
- package/esm2022/lib/gio-banner/gio-banner.component.mjs +120 -0
- package/esm2022/lib/gio-banner/gio-banner.module.mjs +64 -0
- package/esm2022/lib/gio-breadcrumb/gio-breadcrumb-item.directive.mjs +32 -0
- package/esm2022/lib/gio-breadcrumb/gio-breadcrumb.component.mjs +32 -0
- package/esm2022/lib/gio-breadcrumb/gio-breadcrumb.module.mjs +35 -0
- package/esm2022/lib/gio-breadcrumb/index.mjs +19 -0
- package/esm2022/lib/gio-card-empty-state/gio-card-empty-state.component.mjs +35 -0
- package/esm2022/lib/gio-card-empty-state/gio-card-empty-state.module.mjs +36 -0
- package/esm2022/lib/gio-card-empty-state/index.mjs +18 -0
- package/esm2022/lib/gio-clipboard/gio-clipboard-copy-icon.component.mjs +67 -0
- package/esm2022/lib/gio-clipboard/gio-clipboard-copy-wrapper.component.mjs +71 -0
- package/esm2022/lib/gio-clipboard/gio-clipboard.base.component.mjs +64 -0
- package/esm2022/lib/gio-clipboard/gio-clipboard.module.mjs +39 -0
- package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.component.mjs +61 -0
- package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.harness.mjs +40 -0
- package/esm2022/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.module.mjs +40 -0
- package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.component.mjs +54 -0
- package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.harness.mjs +34 -0
- package/esm2022/lib/gio-confirm-dialog/gio-confirm-dialog.module.mjs +36 -0
- package/esm2022/lib/gio-dialog/gio-dialog.constant.mjs +21 -0
- package/esm2022/lib/gio-el/gio-el-assistant/gio-el-assistant.component.mjs +62 -0
- package/esm2022/lib/gio-el/gio-el-prompt/gio-el-prompt.component.mjs +112 -0
- package/esm2022/lib/gio-el/gio-el.service.mjs +60 -0
- package/esm2022/lib/gio-el/index.mjs +20 -0
- package/esm2022/lib/gio-el/models/ElAiPromptState.mjs +23 -0
- package/esm2022/lib/gio-el/public-api.mjs +20 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron-hint.component.mjs +30 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron-label.component.mjs +30 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron.adapter.mjs +249 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron.component.mjs +211 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron.harness.mjs +77 -0
- package/esm2022/lib/gio-form-cron/gio-form-cron.module.mjs +69 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-add-button/gio-form-file-picker-add-button.component.mjs +29 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-empty/gio-form-file-picker-empty.component.mjs +27 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker-label/gio-form-file-picker-label.component.mjs +26 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.component.harness.mjs +95 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.component.mjs +167 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.model.mjs +23 -0
- package/esm2022/lib/gio-form-file-picker/gio-form-file-picker.module.mjs +57 -0
- package/esm2022/lib/gio-form-file-picker/index.mjs +23 -0
- package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid-ignore.directive.mjs +31 -0
- package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.directive.mjs +96 -0
- package/esm2022/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.module.mjs +32 -0
- package/esm2022/lib/gio-form-headers/gio-form-headers-label.component.mjs +30 -0
- package/esm2022/lib/gio-form-headers/gio-form-headers.component.mjs +284 -0
- package/esm2022/lib/gio-form-headers/gio-form-headers.harness.mjs +73 -0
- package/esm2022/lib/gio-form-headers/gio-form-headers.module.mjs +77 -0
- package/esm2022/lib/gio-form-json-schema/gio-form-json-schema.component.mjs +209 -0
- package/esm2022/lib/gio-form-json-schema/gio-form-json-schema.module.mjs +244 -0
- package/esm2022/lib/gio-form-json-schema/gio-formly-json-schema.service.mjs +261 -0
- package/esm2022/lib/gio-form-json-schema/model/GioJsonSchema.mjs +17 -0
- package/esm2022/lib/gio-form-json-schema/model/GioJsonSchemaContext.mjs +2 -0
- package/esm2022/lib/gio-form-json-schema/type-component/array-type.component.mjs +109 -0
- package/esm2022/lib/gio-form-json-schema/type-component/code-editor-type.component.mjs +47 -0
- package/esm2022/lib/gio-form-json-schema/type-component/cron-type.component.mjs +42 -0
- package/esm2022/lib/gio-form-json-schema/type-component/headers-type.component.mjs +108 -0
- package/esm2022/lib/gio-form-json-schema/type-component/multischema-type.component.mjs +66 -0
- package/esm2022/lib/gio-form-json-schema/type-component/null-type.component.mjs +31 -0
- package/esm2022/lib/gio-form-json-schema/type-component/object-type.component.mjs +62 -0
- package/esm2022/lib/gio-form-json-schema/type-component/toggle-type.component.mjs +60 -0
- package/esm2022/lib/gio-form-json-schema/util/validation-message.util.mjs +38 -0
- package/esm2022/lib/gio-form-json-schema/wrappers/gio-banner-extension.mjs +10 -0
- package/esm2022/lib/gio-form-json-schema/wrappers/gio-banner-wrapper.component.mjs +28 -0
- package/esm2022/lib/gio-form-json-schema/wrappers/gio-el-helper-wrapper.component.mjs +61 -0
- package/esm2022/lib/gio-form-json-schema/wrappers/gio-password-eye.component.mjs +74 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card-content/gio-form-selection-inline-card-content.component.mjs +79 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card.component.mjs +86 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline-card.harness.mjs +44 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.component.mjs +103 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.harness.mjs +65 -0
- package/esm2022/lib/gio-form-selection-inline/gio-form-selection-inline.module.mjs +59 -0
- package/esm2022/lib/gio-form-selection-inline/public-api.mjs +22 -0
- package/esm2022/lib/gio-form-slide-toggle/gio-form-label.directive.mjs +52 -0
- package/esm2022/lib/gio-form-slide-toggle/gio-form-slide-toggle.component.mjs +69 -0
- package/esm2022/lib/gio-form-slide-toggle/gio-form-slide-toggle.module.mjs +34 -0
- package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.component.mjs +316 -0
- package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.harness.mjs +82 -0
- package/esm2022/lib/gio-form-tags-input/gio-form-tags-input.module.mjs +67 -0
- package/esm2022/lib/gio-icons/gio-icons.module.mjs +37 -0
- package/esm2022/lib/gio-license/gio-license-dialog/gio-license-dialog.component.mjs +43 -0
- package/esm2022/lib/gio-license/gio-license-dialog/gio-license-dialog.module.mjs +37 -0
- package/esm2022/lib/gio-license/gio-license.directive.mjs +92 -0
- package/esm2022/lib/gio-license/gio-license.module.mjs +35 -0
- package/esm2022/lib/gio-license/gio-license.service.mjs +101 -0
- package/esm2022/lib/gio-license/gio-license.testing.module.mjs +107 -0
- package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.component.mjs +77 -0
- package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.harness.mjs +44 -0
- package/esm2022/lib/gio-license-expiration-notification/gio-license-expiration-notification.module.mjs +36 -0
- package/esm2022/lib/gio-loader/gio-loader.component.mjs +27 -0
- package/esm2022/lib/gio-loader/gio-loader.module.mjs +34 -0
- package/esm2022/lib/gio-mat-config/gio-mat-config.module.mjs +30 -0
- package/esm2022/lib/gio-mat-config/index.mjs +17 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-clipboard-copy.component.mjs +44 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-editor-form-field.directive.mjs +150 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.component.mjs +314 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.harness.mjs +70 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.module.mjs +60 -0
- package/esm2022/lib/gio-monaco-editor/gio-monaco-editor.testing.component.mjs +42 -0
- package/esm2022/lib/gio-monaco-editor/models/GioMonacoEditorConfig.mjs +18 -0
- package/esm2022/lib/gio-monaco-editor/models/JSONSchemaAutoComplete.mjs +115 -0
- package/esm2022/lib/gio-monaco-editor/models/MonacoEditorTheme.mjs +2 -0
- package/esm2022/lib/gio-monaco-editor/services/gio-language-el.service.mjs +226 -0
- package/esm2022/lib/gio-monaco-editor/services/gio-language-json.service.mjs +72 -0
- package/esm2022/lib/gio-monaco-editor/services/gio-monaco-editor.service.mjs +72 -0
- package/esm2022/lib/gio-pipe/gio.pipe.module.mjs +32 -0
- package/esm2022/lib/gio-pipe/safe.pipe.mjs +53 -0
- package/esm2022/lib/gio-popover/gio-popover-trigger.directive.mjs +46 -0
- package/esm2022/lib/gio-popover/gio-popover.component.mjs +83 -0
- package/esm2022/lib/gio-popover/index.mjs +18 -0
- package/esm2022/lib/gio-popover/public-api.mjs +18 -0
- package/esm2022/lib/gio-prismjs/gio-prismjs.service.mjs +80 -0
- package/esm2022/lib/gio-save-bar/gio-save-bar.component.mjs +142 -0
- package/esm2022/lib/gio-save-bar/gio-save-bar.harness.mjs +54 -0
- package/esm2022/lib/gio-save-bar/gio-save-bar.module.mjs +35 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-footer/gio-menu-footer.component.mjs +26 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-header/gio-menu-header.component.mjs +26 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-item/gio-menu-item.component.mjs +85 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-license-expiration-notification/gio-menu-license-expiration-notification.component.mjs +26 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-list/gio-menu-list.component.mjs +26 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.component.mjs +62 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.harness.mjs +41 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.service.mjs +41 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.component.mjs +49 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.harness.mjs +41 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu.component.mjs +50 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu.module.mjs +78 -0
- package/esm2022/lib/oem-theme/gio-menu/gio-menu.service.mjs +45 -0
- package/esm2022/lib/oem-theme/gio-menu/index.mjs +29 -0
- package/esm2022/lib/oem-theme/gio-submenu/gio-submenu-group/gio-submenu-group.component.mjs +34 -0
- package/esm2022/lib/oem-theme/gio-submenu/gio-submenu-item/gio-submenu-item.component.mjs +46 -0
- package/esm2022/lib/oem-theme/gio-submenu/gio-submenu.component.mjs +112 -0
- package/esm2022/lib/oem-theme/gio-submenu/gio-submenu.module.mjs +37 -0
- package/esm2022/lib/oem-theme/gio-submenu/index.mjs +20 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-content/gio-top-bar-content.component.mjs +35 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.component.mjs +35 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.module.mjs +35 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.component.mjs +26 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.module.mjs +33 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar.component.mjs +34 -0
- package/esm2022/lib/oem-theme/gio-top-bar/gio-top-bar.module.mjs +36 -0
- package/esm2022/lib/oem-theme/gio-top-bar/index.mjs +23 -0
- package/esm2022/lib/oem-theme/oem-theme.service.mjs +83 -0
- package/esm2022/lib/oem-theme/public-api.mjs +20 -0
- package/esm2022/lib/public-api.mjs +85 -0
- package/esm2022/public-api.mjs +20 -0
- package/esm2022/testing/gravitee-ui-particles-angular-testing.mjs +5 -0
- package/esm2022/testing/harnesses/div.harness.mjs +42 -0
- package/esm2022/testing/harnesses/index.mjs +18 -0
- package/esm2022/testing/harnesses/span.harness.mjs +42 -0
- package/esm2022/testing/public-api.mjs +17 -0
- package/fesm2022/gravitee-ui-particles-angular-gio-asciidoctor.mjs +11 -11
- package/fesm2022/gravitee-ui-particles-angular-gio-asciidoctor.mjs.map +1 -1
- package/fesm2022/gravitee-ui-particles-angular-gio-el.mjs +80 -74
- package/fesm2022/gravitee-ui-particles-angular-gio-el.mjs.map +1 -1
- package/fesm2022/gravitee-ui-particles-angular-testing.mjs.map +1 -1
- package/fesm2022/gravitee-ui-particles-angular.mjs +568 -637
- package/fesm2022/gravitee-ui-particles-angular.mjs.map +1 -1
- package/gio-asciidoctor/gio-asciidoctor.component.d.ts +26 -0
- package/gio-asciidoctor/gio-asciidoctor.module.d.ts +8 -0
- package/gio-asciidoctor/gio-asciidoctor.service.d.ts +14 -0
- package/gio-asciidoctor/index.d.ts +5 -49
- package/gio-asciidoctor/public-api.d.ts +3 -0
- package/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.component.d.ts +25 -0
- package/gio-el/gio-el-editor/gio-el-editor-condition-group/gio-el-editor-condition-group.harness.d.ts +36 -0
- package/gio-el/gio-el-editor/gio-el-editor.component.d.ts +25 -0
- package/gio-el/gio-el-editor/gio-el-editor.harness.d.ts +7 -0
- package/gio-el/gio-el-editor/gio-el-field/gio-el-field.component.d.ts +70 -0
- package/gio-el/gio-el-editor/gio-el-field/gio-el-field.harness.d.ts +14 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.component.d.ts +15 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-boolean/gio-el-editor-type-boolean.harness.d.ts +6 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.component.d.ts +17 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-date/gio-el-editor-type-date.harness.d.ts +6 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.component.d.ts +17 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-number/gio-el-editor-type-number.harness.d.ts +6 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.component.d.ts +23 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type-string/gio-el-editor-type-string.harness.d.ts +6 -0
- package/gio-el/gio-el-editor/gio-el-type/gio-el-editor-type.harness.d.ts +10 -0
- package/gio-el/index.d.ts +5 -146
- package/gio-el/models/Condition.d.ts +19 -0
- package/gio-el/models/ConditionGroup.d.ts +7 -0
- package/gio-el/models/ConditionModel.d.ts +32 -0
- package/gio-el/models/ConditionsModel.d.ts +8 -0
- package/gio-el/models/ExpressionLanguageBuilder.d.ts +12 -0
- package/gio-el/models/Operator.d.ts +1 -0
- package/gio-el/models/public-api.d.ts +5 -0
- package/gio-el/public-api.d.ts +3 -0
- package/index.d.ts +3 -1822
- package/lib/gio-avatar/gio-avatar.component.d.ts +21 -0
- package/lib/gio-avatar/gio-avatar.module.d.ts +8 -0
- package/lib/gio-avatar/index.d.ts +2 -0
- package/lib/gio-banner/gio-banner.component.d.ts +43 -0
- package/lib/gio-banner/gio-banner.module.d.ts +11 -0
- package/lib/gio-breadcrumb/gio-breadcrumb-item.directive.d.ts +8 -0
- package/lib/gio-breadcrumb/gio-breadcrumb.component.d.ts +8 -0
- package/lib/gio-breadcrumb/gio-breadcrumb.module.d.ts +10 -0
- package/lib/gio-breadcrumb/index.d.ts +3 -0
- package/lib/gio-card-empty-state/gio-card-empty-state.component.d.ts +8 -0
- package/lib/gio-card-empty-state/gio-card-empty-state.module.d.ts +11 -0
- package/lib/gio-card-empty-state/index.d.ts +2 -0
- package/lib/gio-clipboard/gio-clipboard-copy-icon.component.d.ts +6 -0
- package/lib/gio-clipboard/gio-clipboard-copy-wrapper.component.d.ts +6 -0
- package/lib/gio-clipboard/gio-clipboard.base.component.d.ts +18 -0
- package/lib/gio-clipboard/gio-clipboard.module.d.ts +14 -0
- package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.component.d.ts +33 -0
- package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.harness.d.ts +9 -0
- package/lib/gio-confirm-and-validate-dialog/gio-confirm-and-validate-dialog.module.d.ts +15 -0
- package/lib/gio-confirm-dialog/gio-confirm-dialog.component.d.ts +29 -0
- package/lib/gio-confirm-dialog/gio-confirm-dialog.harness.d.ts +8 -0
- package/lib/gio-confirm-dialog/gio-confirm-dialog.module.d.ts +11 -0
- package/lib/gio-dialog/gio-dialog.constant.d.ts +5 -0
- package/lib/gio-el/gio-el-assistant/gio-el-assistant.component.d.ts +7 -0
- package/lib/gio-el/gio-el-prompt/gio-el-prompt.component.d.ts +28 -0
- package/lib/gio-el/gio-el.service.d.ts +19 -0
- package/lib/gio-el/index.d.ts +4 -0
- package/lib/gio-el/models/ElAiPromptState.d.ts +15 -0
- package/lib/gio-el/public-api.d.ts +4 -0
- package/lib/gio-form-cron/gio-form-cron-hint.component.d.ts +5 -0
- package/lib/gio-form-cron/gio-form-cron-label.component.d.ts +5 -0
- package/lib/gio-form-cron/gio-form-cron.adapter.d.ts +18 -0
- package/lib/gio-form-cron/gio-form-cron.component.d.ts +42 -0
- package/lib/gio-form-cron/gio-form-cron.harness.d.ts +23 -0
- package/lib/gio-form-cron/gio-form-cron.module.d.ts +18 -0
- package/lib/gio-form-file-picker/gio-form-file-picker-add-button/gio-form-file-picker-add-button.component.d.ts +5 -0
- package/lib/gio-form-file-picker/gio-form-file-picker-empty/gio-form-file-picker-empty.component.d.ts +5 -0
- package/lib/gio-form-file-picker/gio-form-file-picker-label/gio-form-file-picker-label.component.d.ts +5 -0
- package/lib/gio-form-file-picker/gio-form-file-picker.component.d.ts +43 -0
- package/lib/gio-form-file-picker/gio-form-file-picker.component.harness.d.ts +30 -0
- package/lib/gio-form-file-picker/gio-form-file-picker.model.d.ts +6 -0
- package/lib/gio-form-file-picker/gio-form-file-picker.module.d.ts +16 -0
- package/lib/gio-form-file-picker/index.d.ts +7 -0
- package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid-ignore.directive.d.ts +6 -0
- package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.directive.d.ts +22 -0
- package/lib/gio-form-focus-first-invalid/gio-form-focus-first-invalid.module.d.ts +8 -0
- package/lib/gio-form-headers/gio-form-headers-label.component.d.ts +5 -0
- package/lib/gio-form-headers/gio-form-headers.component.d.ts +46 -0
- package/lib/gio-form-headers/gio-form-headers.harness.d.ts +39 -0
- package/lib/gio-form-headers/gio-form-headers.module.d.ts +20 -0
- package/lib/gio-form-json-schema/gio-form-json-schema.component.d.ts +43 -0
- package/lib/gio-form-json-schema/gio-form-json-schema.module.d.ts +35 -0
- package/lib/gio-form-json-schema/gio-formly-json-schema.service.d.ts +26 -0
- package/lib/gio-form-json-schema/model/GioJsonSchema.d.ts +47 -0
- package/lib/gio-form-json-schema/model/GioJsonSchemaContext.d.ts +1 -0
- package/lib/gio-form-json-schema/type-component/array-type.component.d.ts +10 -0
- package/lib/gio-form-json-schema/type-component/code-editor-type.component.d.ts +16 -0
- package/lib/gio-form-json-schema/type-component/cron-type.component.d.ts +9 -0
- package/lib/gio-form-json-schema/type-component/headers-type.component.d.ts +18 -0
- package/lib/gio-form-json-schema/type-component/multischema-type.component.d.ts +13 -0
- package/lib/gio-form-json-schema/type-component/null-type.component.d.ts +6 -0
- package/lib/gio-form-json-schema/type-component/object-type.component.d.ts +9 -0
- package/lib/gio-form-json-schema/type-component/toggle-type.component.d.ts +8 -0
- package/lib/gio-form-json-schema/util/validation-message.util.d.ts +15 -0
- package/lib/gio-form-json-schema/wrappers/gio-banner-extension.d.ts +2 -0
- package/lib/gio-form-json-schema/wrappers/gio-banner-wrapper.component.d.ts +6 -0
- package/lib/gio-form-json-schema/wrappers/gio-el-helper-wrapper.component.d.ts +11 -0
- package/lib/gio-form-json-schema/wrappers/gio-password-eye.component.d.ts +12 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline-card-content/gio-form-selection-inline-card-content.component.d.ts +15 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline-card.component.d.ts +17 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline-card.harness.d.ts +19 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline.component.d.ts +20 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline.harness.d.ts +26 -0
- package/lib/gio-form-selection-inline/gio-form-selection-inline.module.d.ts +14 -0
- package/lib/gio-form-selection-inline/public-api.d.ts +6 -0
- package/lib/gio-form-slide-toggle/gio-form-label.directive.d.ts +13 -0
- package/lib/gio-form-slide-toggle/gio-form-slide-toggle.component.d.ts +15 -0
- package/lib/gio-form-slide-toggle/gio-form-slide-toggle.module.d.ts +9 -0
- package/lib/gio-form-tags-input/gio-form-tags-input.component.d.ts +95 -0
- package/lib/gio-form-tags-input/gio-form-tags-input.harness.d.ts +23 -0
- package/lib/gio-form-tags-input/gio-form-tags-input.module.d.ts +16 -0
- package/lib/gio-icons/gio-icons.module.d.ts +11 -0
- package/lib/gio-license/gio-license-dialog/gio-license-dialog.component.d.ts +16 -0
- package/lib/gio-license/gio-license-dialog/gio-license-dialog.module.d.ts +12 -0
- package/lib/gio-license/gio-license.directive.d.ts +24 -0
- package/lib/gio-license/gio-license.module.d.ts +10 -0
- package/lib/gio-license/gio-license.service.d.ts +58 -0
- package/lib/gio-license/gio-license.testing.module.d.ts +24 -0
- package/lib/gio-license-expiration-notification/gio-license-expiration-notification.component.d.ts +17 -0
- package/lib/gio-license-expiration-notification/gio-license-expiration-notification.harness.d.ts +13 -0
- package/lib/gio-license-expiration-notification/gio-license-expiration-notification.module.d.ts +11 -0
- package/lib/gio-loader/gio-loader.component.d.ts +5 -0
- package/lib/gio-loader/gio-loader.module.d.ts +9 -0
- package/lib/gio-mat-config/gio-mat-config.module.d.ts +6 -0
- package/lib/gio-mat-config/index.d.ts +1 -0
- package/lib/gio-monaco-editor/gio-monaco-clipboard-copy.component.d.ts +7 -0
- package/lib/gio-monaco-editor/gio-monaco-editor-form-field.directive.d.ts +45 -0
- package/lib/gio-monaco-editor/gio-monaco-editor.component.d.ts +67 -0
- package/lib/gio-monaco-editor/gio-monaco-editor.harness.d.ts +19 -0
- package/lib/gio-monaco-editor/gio-monaco-editor.module.d.ts +20 -0
- package/lib/gio-monaco-editor/gio-monaco-editor.testing.component.d.ts +12 -0
- package/lib/gio-monaco-editor/models/GioMonacoEditorConfig.d.ts +7 -0
- package/lib/gio-monaco-editor/models/JSONSchemaAutoComplete.d.ts +39 -0
- package/lib/gio-monaco-editor/models/MonacoEditorTheme.d.ts +1 -0
- package/lib/gio-monaco-editor/services/gio-language-el.service.d.ts +18 -0
- package/lib/gio-monaco-editor/services/gio-language-json.service.d.ts +18 -0
- package/lib/gio-monaco-editor/services/gio-monaco-editor.service.d.ts +19 -0
- package/lib/gio-pipe/gio.pipe.module.d.ts +7 -0
- package/lib/gio-pipe/safe.pipe.d.ts +10 -0
- package/lib/gio-popover/gio-popover-trigger.directive.d.ts +12 -0
- package/lib/gio-popover/gio-popover.component.d.ts +15 -0
- package/lib/gio-popover/index.d.ts +2 -0
- package/lib/gio-popover/public-api.d.ts +2 -0
- package/lib/gio-prismjs/gio-prismjs.service.d.ts +14 -0
- package/lib/gio-save-bar/gio-save-bar.component.d.ts +30 -0
- package/lib/gio-save-bar/gio-save-bar.harness.d.ts +15 -0
- package/lib/gio-save-bar/gio-save-bar.module.d.ts +10 -0
- package/lib/oem-theme/gio-menu/gio-menu-footer/gio-menu-footer.component.d.ts +5 -0
- package/lib/oem-theme/gio-menu/gio-menu-header/gio-menu-header.component.d.ts +5 -0
- package/lib/oem-theme/gio-menu/gio-menu-item/gio-menu-item.component.d.ts +19 -0
- package/lib/oem-theme/gio-menu/gio-menu-license-expiration-notification/gio-menu-license-expiration-notification.component.d.ts +5 -0
- package/lib/oem-theme/gio-menu/gio-menu-list/gio-menu-list.component.d.ts +5 -0
- package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.component.d.ts +25 -0
- package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.harness.d.ts +10 -0
- package/lib/oem-theme/gio-menu/gio-menu-search/gio-menu-search.service.d.ts +9 -0
- package/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.component.d.ts +17 -0
- package/lib/oem-theme/gio-menu/gio-menu-selector/gio-menu-selector.harness.d.ts +8 -0
- package/lib/oem-theme/gio-menu/gio-menu.component.d.ts +14 -0
- package/lib/oem-theme/gio-menu/gio-menu.module.d.ts +21 -0
- package/lib/oem-theme/gio-menu/gio-menu.service.d.ts +18 -0
- package/lib/oem-theme/gio-menu/index.d.ts +13 -0
- package/lib/oem-theme/gio-submenu/gio-submenu-group/gio-submenu-group.component.d.ts +8 -0
- package/lib/oem-theme/gio-submenu/gio-submenu-item/gio-submenu-item.component.d.ts +9 -0
- package/lib/oem-theme/gio-submenu/gio-submenu.component.d.ts +28 -0
- package/lib/oem-theme/gio-submenu/gio-submenu.module.d.ts +12 -0
- package/lib/oem-theme/gio-submenu/index.d.ts +4 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar-content/gio-top-bar-content.component.d.ts +8 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.component.d.ts +7 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar-link/gio-top-bar-link.module.d.ts +10 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.component.d.ts +5 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar-menu/gio-top-bar-menu.module.d.ts +8 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar.component.d.ts +8 -0
- package/lib/oem-theme/gio-top-bar/gio-top-bar.module.d.ts +11 -0
- package/lib/oem-theme/gio-top-bar/index.d.ts +7 -0
- package/lib/oem-theme/oem-theme.service.d.ts +22 -0
- package/lib/oem-theme/public-api.d.ts +4 -0
- package/lib/public-api.d.ts +66 -0
- package/package.json +15 -7
- package/public-api.d.ts +1 -0
- package/src/scss/gio-mat-theme.scss +1 -2
- package/testing/harnesses/div.harness.d.ts +21 -0
- package/testing/harnesses/index.d.ts +2 -0
- package/testing/harnesses/span.harness.d.ts +21 -0
- package/testing/index.d.ts +5 -47
- package/testing/public-api.d.ts +1 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2023 The Gravitee team (http://gravitee.io)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import Cronstrue from 'cronstrue/i18n';
|
|
17
|
+
import { isEmpty } from 'lodash';
|
|
18
|
+
export const CRON_DISPLAY_MODES = ['secondly', 'minutely', 'hourly', 'daily', 'weekly', 'monthly', 'custom'];
|
|
19
|
+
const DISPLAY_MODE_LIST = [
|
|
20
|
+
{
|
|
21
|
+
mode: 'secondly',
|
|
22
|
+
default: '*/1 * * * * *',
|
|
23
|
+
regex: /^(\*\/\d+\s)(\*\s){4}\*/,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
mode: 'minutely',
|
|
27
|
+
default: '0 */1 * * * *',
|
|
28
|
+
regex: /^0\s\*\/\d+\s(\*\s){3}\*$/,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
mode: 'hourly',
|
|
32
|
+
default: '0 0 */1 * * *',
|
|
33
|
+
regex: /^0\s\d+\s\*\/\d+\s(\*\s){2}\*$/,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
mode: 'daily',
|
|
37
|
+
default: '0 0 0 */1 * *',
|
|
38
|
+
regex: /^0\s\d+\s\d+\s\*\/\d+\s\*\s\*$/,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
mode: 'weekly',
|
|
42
|
+
default: '0 0 0 * * 0',
|
|
43
|
+
regex: /^(\d{1,2}\s){2,3}(\*\s){2}\d{1,2}$/,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
mode: 'monthly',
|
|
47
|
+
default: '0 0 0 1 * *',
|
|
48
|
+
regex: /^(\d+\s){3,4}\*\s\*$/,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
mode: 'custom',
|
|
52
|
+
default: '* * * * * *',
|
|
53
|
+
regex: /^.*$/,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
export const getDefaultCronDisplay = (mode) => {
|
|
57
|
+
const modeFound = DISPLAY_MODE_LIST.find(mf => mf.mode === mode);
|
|
58
|
+
if (!modeFound) {
|
|
59
|
+
throw new Error('Invalid cron mode.');
|
|
60
|
+
}
|
|
61
|
+
return parseCronExpression(modeFound.default);
|
|
62
|
+
};
|
|
63
|
+
export const parseCronExpression = (cronExpression) => {
|
|
64
|
+
throwIfInvalid(cronExpression);
|
|
65
|
+
const parts = cronExpression.split(' ');
|
|
66
|
+
// Normalize cron so that second segment is included.
|
|
67
|
+
if (cronExpression && cronExpression.split(' ').length === 6) {
|
|
68
|
+
parts.push('');
|
|
69
|
+
}
|
|
70
|
+
const hourInterval = getHourInterval(parts);
|
|
71
|
+
const minuteInterval = getMinuteInterval(parts);
|
|
72
|
+
const secondInterval = getSecondInterval(parts);
|
|
73
|
+
const dayInterval = getDayInterval(parts);
|
|
74
|
+
const dayOfWeek = getDayOfWeek(parts);
|
|
75
|
+
const dayOfMonth = getDayOfMonth(parts);
|
|
76
|
+
const hours = getHours(parts);
|
|
77
|
+
const minutes = getMinutes(parts);
|
|
78
|
+
const displayMode = getDisplayMode(cronExpression);
|
|
79
|
+
switch (displayMode.mode) {
|
|
80
|
+
case 'secondly':
|
|
81
|
+
return {
|
|
82
|
+
mode: 'secondly',
|
|
83
|
+
secondInterval,
|
|
84
|
+
};
|
|
85
|
+
case 'minutely':
|
|
86
|
+
return {
|
|
87
|
+
mode: 'minutely',
|
|
88
|
+
minuteInterval,
|
|
89
|
+
};
|
|
90
|
+
case 'hourly':
|
|
91
|
+
return {
|
|
92
|
+
mode: 'hourly',
|
|
93
|
+
hourInterval,
|
|
94
|
+
minutes,
|
|
95
|
+
};
|
|
96
|
+
case 'daily':
|
|
97
|
+
return {
|
|
98
|
+
mode: 'daily',
|
|
99
|
+
dayInterval,
|
|
100
|
+
hours,
|
|
101
|
+
minutes,
|
|
102
|
+
};
|
|
103
|
+
case 'weekly':
|
|
104
|
+
return {
|
|
105
|
+
mode: 'weekly',
|
|
106
|
+
dayOfWeek,
|
|
107
|
+
hours,
|
|
108
|
+
minutes,
|
|
109
|
+
};
|
|
110
|
+
case 'monthly':
|
|
111
|
+
return {
|
|
112
|
+
mode: 'monthly',
|
|
113
|
+
dayOfMonth,
|
|
114
|
+
hours,
|
|
115
|
+
minutes,
|
|
116
|
+
};
|
|
117
|
+
case 'custom':
|
|
118
|
+
return {
|
|
119
|
+
mode: 'custom',
|
|
120
|
+
customExpression: cronExpression,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
export const toCronExpression = (cronDisplay) => {
|
|
125
|
+
switch (cronDisplay.mode) {
|
|
126
|
+
case 'secondly':
|
|
127
|
+
return `*/${cronDisplay.secondInterval} * * * * *`;
|
|
128
|
+
case 'minutely':
|
|
129
|
+
return `0 */${cronDisplay.minuteInterval} * * * *`;
|
|
130
|
+
case 'hourly':
|
|
131
|
+
return `0 ${cronDisplay.minutes} */${cronDisplay.hourInterval} * * *`;
|
|
132
|
+
case 'daily':
|
|
133
|
+
return `0 ${cronDisplay.minutes} ${cronDisplay.hours} */${cronDisplay.dayInterval} * *`;
|
|
134
|
+
case 'weekly':
|
|
135
|
+
return `0 ${cronDisplay.minutes} ${cronDisplay.hours} * * ${cronDisplay.dayOfWeek}`;
|
|
136
|
+
case 'monthly':
|
|
137
|
+
return `0 ${cronDisplay.minutes} ${cronDisplay.hours} ${cronDisplay.dayOfMonth} * *`;
|
|
138
|
+
case 'custom':
|
|
139
|
+
return `${cronDisplay.customExpression}`;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
export const toCronDescription = (cronExpression) => {
|
|
143
|
+
throwIfInvalid(cronExpression);
|
|
144
|
+
if (!isEmpty(cronExpression)) {
|
|
145
|
+
return Cronstrue.toString(expandMisleadingSteps(cronExpression));
|
|
146
|
+
}
|
|
147
|
+
return '';
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Expand step values (like *\/50) that don't evenly divide the field range
|
|
151
|
+
* into explicit value lists (like 0,50) so that cronstrue generates an accurate description.
|
|
152
|
+
*
|
|
153
|
+
* For example, *\/50 in the minutes field means "at every minute divisible by 50" (i.e. 0 and 50),
|
|
154
|
+
* NOT "every 50 minutes". Without this fix, cronstrue would display "Every 50 minutes" which is misleading.
|
|
155
|
+
*
|
|
156
|
+
* See: https://github.com/bradymholt/cRonstrue/issues/360
|
|
157
|
+
*/
|
|
158
|
+
const expandMisleadingSteps = (cronExpression) => {
|
|
159
|
+
const parts = cronExpression.trim().split(/\s+/);
|
|
160
|
+
// Field ranges: [seconds, minutes, hours, day-of-month, month, day-of-week]
|
|
161
|
+
const fieldRanges = [60, 60, 24, undefined, undefined, undefined];
|
|
162
|
+
const expandedParts = parts.map((part, index) => {
|
|
163
|
+
const range = fieldRanges[index];
|
|
164
|
+
if (range === undefined)
|
|
165
|
+
return part;
|
|
166
|
+
const match = part.match(/^\*\/(\d+)$/);
|
|
167
|
+
if (!match)
|
|
168
|
+
return part;
|
|
169
|
+
const step = parseInt(match[1], 10);
|
|
170
|
+
if (step <= 0 || range % step === 0)
|
|
171
|
+
return part;
|
|
172
|
+
const values = [];
|
|
173
|
+
for (let v = 0; v < range; v += step) {
|
|
174
|
+
values.push(v);
|
|
175
|
+
}
|
|
176
|
+
return values.join(',');
|
|
177
|
+
});
|
|
178
|
+
return expandedParts.join(' ');
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Simple validation to ensure that the cron expression has 6 parts.
|
|
182
|
+
* Note : The full cron expression validation is done by the backend.
|
|
183
|
+
*/
|
|
184
|
+
const throwIfInvalid = (cronExpression) => {
|
|
185
|
+
const parts = cronExpression.trim().split(/\s+/);
|
|
186
|
+
if (parts.length != 6) {
|
|
187
|
+
throw new Error('Cron expression must have 6 parts.');
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const getDisplayMode = (cronExpression) => {
|
|
191
|
+
const modeFound = DISPLAY_MODE_LIST.find(mf => {
|
|
192
|
+
const regex = mf.regex;
|
|
193
|
+
return regex.test(cronExpression);
|
|
194
|
+
});
|
|
195
|
+
if (!modeFound) {
|
|
196
|
+
throw new Error('Invalid cron expression.');
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
mode: modeFound.mode,
|
|
200
|
+
default: modeFound.default,
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
const getSecondInterval = (expressionParts) => {
|
|
204
|
+
const v = getSegment(expressionParts[0])[0][1];
|
|
205
|
+
return typeof v === 'number' ? v : undefined;
|
|
206
|
+
};
|
|
207
|
+
const getMinuteInterval = (expressionParts) => {
|
|
208
|
+
const v = getSegment(expressionParts[1])[0][1];
|
|
209
|
+
return typeof v === 'number' ? v : undefined;
|
|
210
|
+
};
|
|
211
|
+
const getHourInterval = (expressionParts) => {
|
|
212
|
+
const v = getSegment(expressionParts[2])[0][1];
|
|
213
|
+
return typeof v === 'number' ? v : undefined;
|
|
214
|
+
};
|
|
215
|
+
const getDayInterval = (expressionParts) => {
|
|
216
|
+
const v = getSegment(expressionParts[3])[0][1];
|
|
217
|
+
return typeof v === 'number' ? v : undefined;
|
|
218
|
+
};
|
|
219
|
+
const getDayOfWeek = (expressionParts) => {
|
|
220
|
+
const v = getSegment(expressionParts[5])[0][0];
|
|
221
|
+
return typeof v === 'number' ? v : undefined;
|
|
222
|
+
};
|
|
223
|
+
const getDayOfMonth = (expressionParts) => {
|
|
224
|
+
const v = getSegment(expressionParts[3])[0][0];
|
|
225
|
+
return typeof v === 'number' ? v : undefined;
|
|
226
|
+
};
|
|
227
|
+
const getMinutes = (expressionParts) => {
|
|
228
|
+
const v = getSegment(expressionParts[1])[0][0];
|
|
229
|
+
return typeof v === 'number' ? v : undefined;
|
|
230
|
+
};
|
|
231
|
+
const getHours = (expressionParts) => {
|
|
232
|
+
const v = getSegment(expressionParts[2])[0][0];
|
|
233
|
+
return typeof v === 'number' ? v : undefined;
|
|
234
|
+
};
|
|
235
|
+
const getSegment = (value) => {
|
|
236
|
+
if (value === undefined) {
|
|
237
|
+
value = '*';
|
|
238
|
+
}
|
|
239
|
+
return value.split(',').map(s => {
|
|
240
|
+
if (s === undefined) {
|
|
241
|
+
s = '*';
|
|
242
|
+
}
|
|
243
|
+
return s.split('/').map(p => {
|
|
244
|
+
const v = parseInt(p, 10);
|
|
245
|
+
return isNaN(v) ? p : v;
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWZvcm0tY3Jvbi5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZm9ybS1jcm9uL2dpby1mb3JtLWNyb24uYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFnQmpDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFHdEgsTUFBTSxpQkFBaUIsR0FJakI7SUFDSjtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSx5QkFBeUI7S0FDakM7SUFDRDtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSwyQkFBMkI7S0FDbkM7SUFDRDtRQUNFLElBQUksRUFBRSxRQUFRO1FBQ2QsT0FBTyxFQUFFLGVBQWU7UUFDeEIsS0FBSyxFQUFFLGdDQUFnQztLQUN4QztJQUNEO1FBQ0UsSUFBSSxFQUFFLE9BQU87UUFDYixPQUFPLEVBQUUsZUFBZTtRQUN4QixLQUFLLEVBQUUsZ0NBQWdDO0tBQ3hDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLEtBQUssRUFBRSxvQ0FBb0M7S0FDNUM7SUFDRDtRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsT0FBTyxFQUFFLGFBQWE7UUFDdEIsS0FBSyxFQUFFLHNCQUFzQjtLQUM5QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsYUFBYTtRQUN0QixLQUFLLEVBQUUsTUFBTTtLQUNkO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBcUIsRUFBZSxFQUFFO0lBQzFFLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxPQUFPLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLGNBQXNCLEVBQWUsRUFBRTtJQUN6RSxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFL0IsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV4QyxxREFBcUQ7SUFDckQsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0QsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVDLE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRW5ELFFBQVEsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLEtBQUssVUFBVTtZQUNiLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLGNBQWM7YUFDZixDQUFDO1FBQ0osS0FBSyxVQUFVO1lBQ2IsT0FBTztnQkFDTCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsY0FBYzthQUNmLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLElBQUksRUFBRSxRQUFRO2dCQUNkLFlBQVk7Z0JBQ1osT0FBTzthQUNSLENBQUM7UUFDSixLQUFLLE9BQU87WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxPQUFPO2dCQUNiLFdBQVc7Z0JBQ1gsS0FBSztnQkFDTCxPQUFPO2FBQ1IsQ0FBQztRQUNKLEtBQUssUUFBUTtZQUNYLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsU0FBUztnQkFDVCxLQUFLO2dCQUNMLE9BQU87YUFDUixDQUFDO1FBQ0osS0FBSyxTQUFTO1lBQ1osT0FBTztnQkFDTCxJQUFJLEVBQUUsU0FBUztnQkFDZixVQUFVO2dCQUNWLEtBQUs7Z0JBQ0wsT0FBTzthQUNSLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLElBQUksRUFBRSxRQUFRO2dCQUNkLGdCQUFnQixFQUFFLGNBQWM7YUFDakMsQ0FBQztJQUNOLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFdBQWlELEVBQVUsRUFBRTtJQUM1RixRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixLQUFLLFVBQVU7WUFDYixPQUFPLEtBQUssV0FBVyxDQUFDLGNBQWMsWUFBWSxDQUFDO1FBQ3JELEtBQUssVUFBVTtZQUNiLE9BQU8sT0FBTyxXQUFXLENBQUMsY0FBYyxVQUFVLENBQUM7UUFDckQsS0FBSyxRQUFRO1lBQ1gsT0FBTyxLQUFLLFdBQVcsQ0FBQyxPQUFPLE1BQU0sV0FBVyxDQUFDLFlBQVksUUFBUSxDQUFDO1FBQ3hFLEtBQUssT0FBTztZQUNWLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLE1BQU0sV0FBVyxDQUFDLFdBQVcsTUFBTSxDQUFDO1FBQzFGLEtBQUssUUFBUTtZQUNYLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLFFBQVEsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RGLEtBQUssU0FBUztZQUNaLE9BQU8sS0FBSyxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLFVBQVUsTUFBTSxDQUFDO1FBQ3ZGLEtBQUssUUFBUTtZQUNYLE9BQU8sR0FBRyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxjQUFzQixFQUFVLEVBQUU7SUFDbEUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxjQUFzQixFQUFVLEVBQUU7SUFDL0QsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCw0RUFBNEU7SUFDNUUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFakQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLGNBQXNCLEVBQVEsRUFBRTtJQUN0RCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQ3JCLGNBQXNCLEVBSXRCLEVBQUU7SUFDRixNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDNUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7UUFDcEIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO0tBQzNCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUFHLENBQUMsZUFBeUIsRUFBc0IsRUFBRTtJQUMxRSxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQzFFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3hFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3JFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ3RFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ25FLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUF5QixFQUFzQixFQUFFO0lBQ2pFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQWlDLEVBQUU7SUFDbEUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzlCLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDVixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBDcm9uc3RydWUgZnJvbSAnY3JvbnN0cnVlL2kxOG4nO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvbkRpc3BsYXkge1xuICBtb2RlOiBDcm9uRGlzcGxheU1vZGU7XG5cbiAgc2Vjb25kSW50ZXJ2YWw/OiBudW1iZXI7XG4gIG1pbnV0ZUludGVydmFsPzogbnVtYmVyO1xuICBob3VySW50ZXJ2YWw/OiBudW1iZXI7XG4gIGRheUludGVydmFsPzogbnVtYmVyO1xuICBkYXlPZldlZWs/OiBudW1iZXI7XG4gIGRheU9mTW9udGg/OiBudW1iZXI7XG4gIGN1c3RvbUV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgaG91cnM/OiBudW1iZXI7XG4gIG1pbnV0ZXM/OiBudW1iZXI7XG59XG5leHBvcnQgY29uc3QgQ1JPTl9ESVNQTEFZX01PREVTID0gWydzZWNvbmRseScsICdtaW51dGVseScsICdob3VybHknLCAnZGFpbHknLCAnd2Vla2x5JywgJ21vbnRobHknLCAnY3VzdG9tJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDcm9uRGlzcGxheU1vZGUgPSAodHlwZW9mIENST05fRElTUExBWV9NT0RFUylbbnVtYmVyXTtcblxuY29uc3QgRElTUExBWV9NT0RFX0xJU1Q6IHtcbiAgbW9kZTogQ3JvbkRpc3BsYXlNb2RlO1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIHJlZ2V4OiBSZWdFeHA7XG59W10gPSBbXG4gIHtcbiAgICBtb2RlOiAnc2Vjb25kbHknLFxuICAgIGRlZmF1bHQ6ICcqLzEgKiAqICogKiAqJyxcbiAgICByZWdleDogL14oXFwqXFwvXFxkK1xccykoXFwqXFxzKXs0fVxcKi8sXG4gIH0sXG4gIHtcbiAgICBtb2RlOiAnbWludXRlbHknLFxuICAgIGRlZmF1bHQ6ICcwICovMSAqICogKiAqJyxcbiAgICByZWdleDogL14wXFxzXFwqXFwvXFxkK1xccyhcXCpcXHMpezN9XFwqJC8sXG4gIH0sXG4gIHtcbiAgICBtb2RlOiAnaG91cmx5JyxcbiAgICBkZWZhdWx0OiAnMCAwICovMSAqICogKicsXG4gICAgcmVnZXg6IC9eMFxcc1xcZCtcXHNcXCpcXC9cXGQrXFxzKFxcKlxccyl7Mn1cXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICdkYWlseScsXG4gICAgZGVmYXVsdDogJzAgMCAwICovMSAqIConLFxuICAgIHJlZ2V4OiAvXjBcXHNcXGQrXFxzXFxkK1xcc1xcKlxcL1xcZCtcXHNcXCpcXHNcXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICd3ZWVrbHknLFxuICAgIGRlZmF1bHQ6ICcwIDAgMCAqICogMCcsXG4gICAgcmVnZXg6IC9eKFxcZHsxLDJ9XFxzKXsyLDN9KFxcKlxccyl7Mn1cXGR7MSwyfSQvLFxuICB9LFxuICB7XG4gICAgbW9kZTogJ21vbnRobHknLFxuICAgIGRlZmF1bHQ6ICcwIDAgMCAxICogKicsXG4gICAgcmVnZXg6IC9eKFxcZCtcXHMpezMsNH1cXCpcXHNcXCokLyxcbiAgfSxcbiAge1xuICAgIG1vZGU6ICdjdXN0b20nLFxuICAgIGRlZmF1bHQ6ICcqICogKiAqICogKicsXG4gICAgcmVnZXg6IC9eLiokLyxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0Q3JvbkRpc3BsYXkgPSAobW9kZTogQ3JvbkRpc3BsYXlNb2RlKTogQ3JvbkRpc3BsYXkgPT4ge1xuICBjb25zdCBtb2RlRm91bmQgPSBESVNQTEFZX01PREVfTElTVC5maW5kKG1mID0+IG1mLm1vZGUgPT09IG1vZGUpO1xuICBpZiAoIW1vZGVGb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIG1vZGUuJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VDcm9uRXhwcmVzc2lvbihtb2RlRm91bmQuZGVmYXVsdCk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VDcm9uRXhwcmVzc2lvbiA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogQ3JvbkRpc3BsYXkgPT4ge1xuICB0aHJvd0lmSW52YWxpZChjcm9uRXhwcmVzc2lvbik7XG5cbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi5zcGxpdCgnICcpO1xuXG4gIC8vIE5vcm1hbGl6ZSBjcm9uIHNvIHRoYXQgc2Vjb25kIHNlZ21lbnQgaXMgaW5jbHVkZWQuXG4gIGlmIChjcm9uRXhwcmVzc2lvbiAmJiBjcm9uRXhwcmVzc2lvbi5zcGxpdCgnICcpLmxlbmd0aCA9PT0gNikge1xuICAgIHBhcnRzLnB1c2goJycpO1xuICB9XG5cbiAgY29uc3QgaG91ckludGVydmFsID0gZ2V0SG91ckludGVydmFsKHBhcnRzKTtcbiAgY29uc3QgbWludXRlSW50ZXJ2YWwgPSBnZXRNaW51dGVJbnRlcnZhbChwYXJ0cyk7XG4gIGNvbnN0IHNlY29uZEludGVydmFsID0gZ2V0U2Vjb25kSW50ZXJ2YWwocGFydHMpO1xuICBjb25zdCBkYXlJbnRlcnZhbCA9IGdldERheUludGVydmFsKHBhcnRzKTtcbiAgY29uc3QgZGF5T2ZXZWVrID0gZ2V0RGF5T2ZXZWVrKHBhcnRzKTtcbiAgY29uc3QgZGF5T2ZNb250aCA9IGdldERheU9mTW9udGgocGFydHMpO1xuXG4gIGNvbnN0IGhvdXJzID0gZ2V0SG91cnMocGFydHMpO1xuICBjb25zdCBtaW51dGVzID0gZ2V0TWludXRlcyhwYXJ0cyk7XG5cbiAgY29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShjcm9uRXhwcmVzc2lvbik7XG5cbiAgc3dpdGNoIChkaXNwbGF5TW9kZS5tb2RlKSB7XG4gICAgY2FzZSAnc2Vjb25kbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ3NlY29uZGx5JyxcbiAgICAgICAgc2Vjb25kSW50ZXJ2YWwsXG4gICAgICB9O1xuICAgIGNhc2UgJ21pbnV0ZWx5JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6ICdtaW51dGVseScsXG4gICAgICAgIG1pbnV0ZUludGVydmFsLFxuICAgICAgfTtcbiAgICBjYXNlICdob3VybHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ2hvdXJseScsXG4gICAgICAgIGhvdXJJbnRlcnZhbCxcbiAgICAgICAgbWludXRlcyxcbiAgICAgIH07XG4gICAgY2FzZSAnZGFpbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ2RhaWx5JyxcbiAgICAgICAgZGF5SW50ZXJ2YWwsXG4gICAgICAgIGhvdXJzLFxuICAgICAgICBtaW51dGVzLFxuICAgICAgfTtcbiAgICBjYXNlICd3ZWVrbHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ3dlZWtseScsXG4gICAgICAgIGRheU9mV2VlayxcbiAgICAgICAgaG91cnMsXG4gICAgICAgIG1pbnV0ZXMsXG4gICAgICB9O1xuICAgIGNhc2UgJ21vbnRobHknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZTogJ21vbnRobHknLFxuICAgICAgICBkYXlPZk1vbnRoLFxuICAgICAgICBob3VycyxcbiAgICAgICAgbWludXRlcyxcbiAgICAgIH07XG4gICAgY2FzZSAnY3VzdG9tJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGU6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21FeHByZXNzaW9uOiBjcm9uRXhwcmVzc2lvbixcbiAgICAgIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b0Nyb25FeHByZXNzaW9uID0gKGNyb25EaXNwbGF5OiBPbWl0PENyb25EaXNwbGF5LCAnY3JvbkRlc2NyaXB0aW9uJz4pOiBzdHJpbmcgPT4ge1xuICBzd2l0Y2ggKGNyb25EaXNwbGF5Lm1vZGUpIHtcbiAgICBjYXNlICdzZWNvbmRseSc6XG4gICAgICByZXR1cm4gYCovJHtjcm9uRGlzcGxheS5zZWNvbmRJbnRlcnZhbH0gKiAqICogKiAqYDtcbiAgICBjYXNlICdtaW51dGVseSc6XG4gICAgICByZXR1cm4gYDAgKi8ke2Nyb25EaXNwbGF5Lm1pbnV0ZUludGVydmFsfSAqICogKiAqYDtcbiAgICBjYXNlICdob3VybHknOlxuICAgICAgcmV0dXJuIGAwICR7Y3JvbkRpc3BsYXkubWludXRlc30gKi8ke2Nyb25EaXNwbGF5LmhvdXJJbnRlcnZhbH0gKiAqICpgO1xuICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgIHJldHVybiBgMCAke2Nyb25EaXNwbGF5Lm1pbnV0ZXN9ICR7Y3JvbkRpc3BsYXkuaG91cnN9ICovJHtjcm9uRGlzcGxheS5kYXlJbnRlcnZhbH0gKiAqYDtcbiAgICBjYXNlICd3ZWVrbHknOlxuICAgICAgcmV0dXJuIGAwICR7Y3JvbkRpc3BsYXkubWludXRlc30gJHtjcm9uRGlzcGxheS5ob3Vyc30gKiAqICR7Y3JvbkRpc3BsYXkuZGF5T2ZXZWVrfWA7XG4gICAgY2FzZSAnbW9udGhseSc6XG4gICAgICByZXR1cm4gYDAgJHtjcm9uRGlzcGxheS5taW51dGVzfSAke2Nyb25EaXNwbGF5LmhvdXJzfSAke2Nyb25EaXNwbGF5LmRheU9mTW9udGh9ICogKmA7XG4gICAgY2FzZSAnY3VzdG9tJzpcbiAgICAgIHJldHVybiBgJHtjcm9uRGlzcGxheS5jdXN0b21FeHByZXNzaW9ufWA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b0Nyb25EZXNjcmlwdGlvbiA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdGhyb3dJZkludmFsaWQoY3JvbkV4cHJlc3Npb24pO1xuXG4gIGlmICghaXNFbXB0eShjcm9uRXhwcmVzc2lvbikpIHtcbiAgICByZXR1cm4gQ3JvbnN0cnVlLnRvU3RyaW5nKGV4cGFuZE1pc2xlYWRpbmdTdGVwcyhjcm9uRXhwcmVzc2lvbikpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBFeHBhbmQgc3RlcCB2YWx1ZXMgKGxpa2UgKlxcLzUwKSB0aGF0IGRvbid0IGV2ZW5seSBkaXZpZGUgdGhlIGZpZWxkIHJhbmdlXG4gKiBpbnRvIGV4cGxpY2l0IHZhbHVlIGxpc3RzIChsaWtlIDAsNTApIHNvIHRoYXQgY3JvbnN0cnVlIGdlbmVyYXRlcyBhbiBhY2N1cmF0ZSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgKlxcLzUwIGluIHRoZSBtaW51dGVzIGZpZWxkIG1lYW5zIFwiYXQgZXZlcnkgbWludXRlIGRpdmlzaWJsZSBieSA1MFwiIChpLmUuIDAgYW5kIDUwKSxcbiAqIE5PVCBcImV2ZXJ5IDUwIG1pbnV0ZXNcIi4gV2l0aG91dCB0aGlzIGZpeCwgY3JvbnN0cnVlIHdvdWxkIGRpc3BsYXkgXCJFdmVyeSA1MCBtaW51dGVzXCIgd2hpY2ggaXMgbWlzbGVhZGluZy5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9icmFkeW1ob2x0L2NSb25zdHJ1ZS9pc3N1ZXMvMzYwXG4gKi9cbmNvbnN0IGV4cGFuZE1pc2xlYWRpbmdTdGVwcyA9IChjcm9uRXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgLy8gRmllbGQgcmFuZ2VzOiBbc2Vjb25kcywgbWludXRlcywgaG91cnMsIGRheS1vZi1tb250aCwgbW9udGgsIGRheS1vZi13ZWVrXVxuICBjb25zdCBmaWVsZFJhbmdlcyA9IFs2MCwgNjAsIDI0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXTtcblxuICBjb25zdCBleHBhbmRlZFBhcnRzID0gcGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHJhbmdlID0gZmllbGRSYW5nZXNbaW5kZXhdO1xuICAgIGlmIChyYW5nZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IG1hdGNoID0gcGFydC5tYXRjaCgvXlxcKlxcLyhcXGQrKSQvKTtcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IHN0ZXAgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgIGlmIChzdGVwIDw9IDAgfHwgcmFuZ2UgJSBzdGVwID09PSAwKSByZXR1cm4gcGFydDtcblxuICAgIGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCB2ID0gMDsgdiA8IHJhbmdlOyB2ICs9IHN0ZXApIHtcbiAgICAgIHZhbHVlcy5wdXNoKHYpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oJywnKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGV4cGFuZGVkUGFydHMuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBTaW1wbGUgdmFsaWRhdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgY3JvbiBleHByZXNzaW9uIGhhcyA2IHBhcnRzLlxuICogTm90ZSA6IFRoZSBmdWxsIGNyb24gZXhwcmVzc2lvbiB2YWxpZGF0aW9uIGlzIGRvbmUgYnkgdGhlIGJhY2tlbmQuXG4gKi9cbmNvbnN0IHRocm93SWZJbnZhbGlkID0gKGNyb25FeHByZXNzaW9uOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBjcm9uRXhwcmVzc2lvbi50cmltKCkuc3BsaXQoL1xccysvKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9IDYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nyb24gZXhwcmVzc2lvbiBtdXN0IGhhdmUgNiBwYXJ0cy4nKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0RGlzcGxheU1vZGUgPSAoXG4gIGNyb25FeHByZXNzaW9uOiBzdHJpbmcsXG4pOiB7XG4gIG1vZGU6IENyb25EaXNwbGF5TW9kZTtcbiAgZGVmYXVsdDogc3RyaW5nO1xufSA9PiB7XG4gIGNvbnN0IG1vZGVGb3VuZCA9IERJU1BMQVlfTU9ERV9MSVNULmZpbmQobWYgPT4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gbWYucmVnZXg7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoY3JvbkV4cHJlc3Npb24pO1xuICB9KTtcblxuICBpZiAoIW1vZGVGb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIGV4cHJlc3Npb24uJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZGU6IG1vZGVGb3VuZC5tb2RlLFxuICAgIGRlZmF1bHQ6IG1vZGVGb3VuZC5kZWZhdWx0LFxuICB9O1xufTtcblxuY29uc3QgZ2V0U2Vjb25kSW50ZXJ2YWwgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1swXSlbMF1bMV07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0TWludXRlSW50ZXJ2YWwgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1sxXSlbMF1bMV07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0SG91ckludGVydmFsID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbMl0pWzBdWzFdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldERheUludGVydmFsID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbM10pWzBdWzFdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldERheU9mV2VlayA9IChleHByZXNzaW9uUGFydHM6IHN0cmluZ1tdKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgdiA9IGdldFNlZ21lbnQoZXhwcmVzc2lvblBhcnRzWzVdKVswXVswXTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/IHYgOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBnZXREYXlPZk1vbnRoID0gKGV4cHJlc3Npb25QYXJ0czogc3RyaW5nW10pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB2ID0gZ2V0U2VnbWVudChleHByZXNzaW9uUGFydHNbM10pWzBdWzBdO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldE1pbnV0ZXMgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1sxXSlbMF1bMF07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0SG91cnMgPSAoZXhwcmVzc2lvblBhcnRzOiBzdHJpbmdbXSk6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHYgPSBnZXRTZWdtZW50KGV4cHJlc3Npb25QYXJ0c1syXSlbMF1bMF07XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZ2V0U2VnbWVudCA9ICh2YWx1ZTogc3RyaW5nKTogQXJyYXk8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj4gPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gJyonO1xuICB9XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHtcbiAgICBpZiAocyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzID0gJyonO1xuICAgIH1cbiAgICByZXR1cm4gcy5zcGxpdCgnLycpLm1hcChwID0+IHtcbiAgICAgIGNvbnN0IHYgPSBwYXJzZUludChwLCAxMCk7XG4gICAgICByZXR1cm4gaXNOYU4odikgPyBwIDogdjtcbiAgICB9KTtcbiAgfSk7XG59O1xuIl19
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Component, HostBinding, forwardRef } from '@angular/core';
|
|
2
|
+
import { UntypedFormControl, UntypedFormGroup, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
|
|
3
|
+
import { isEmpty, range } from 'lodash';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { filter, takeUntil, tap } from 'rxjs/operators';
|
|
6
|
+
import { getDefaultCronDisplay, parseCronExpression, toCronDescription, toCronExpression } from './gio-form-cron.adapter';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/cdk/a11y";
|
|
9
|
+
import * as i2 from "@angular/common";
|
|
10
|
+
import * as i3 from "@angular/forms";
|
|
11
|
+
import * as i4 from "@angular/material/button-toggle";
|
|
12
|
+
import * as i5 from "@angular/material/input";
|
|
13
|
+
import * as i6 from "@angular/material/select";
|
|
14
|
+
import * as i7 from "@angular/material/autocomplete";
|
|
15
|
+
import * as i8 from "@angular/material/button";
|
|
16
|
+
import * as i9 from "@angular/material/tooltip";
|
|
17
|
+
import * as i10 from "@angular/material/icon";
|
|
18
|
+
export class GioFormCronComponent {
|
|
19
|
+
constructor(elRef, fm, ngZone, cdr) {
|
|
20
|
+
this.elRef = elRef;
|
|
21
|
+
this.fm = fm;
|
|
22
|
+
this.ngZone = ngZone;
|
|
23
|
+
this.cdr = cdr;
|
|
24
|
+
this._onChange = () => ({});
|
|
25
|
+
this._onTouched = () => ({});
|
|
26
|
+
this.seconds = [...range(0, 60)];
|
|
27
|
+
this.minutes = [...range(0, 60)];
|
|
28
|
+
this.hours = [...range(0, 24)];
|
|
29
|
+
this.daysOfMonth = [...range(1, 32)];
|
|
30
|
+
this.daysOfWeek = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
|
31
|
+
this.isDisabled = false;
|
|
32
|
+
this.smallDisplay = false;
|
|
33
|
+
this.touched = false;
|
|
34
|
+
this.focused = false;
|
|
35
|
+
this.hasError = false;
|
|
36
|
+
this.unsubscribe$ = new Subject();
|
|
37
|
+
fm.monitor(elRef.nativeElement, true)
|
|
38
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
39
|
+
.subscribe(origin => {
|
|
40
|
+
this.focused = !!origin;
|
|
41
|
+
this._onTouched();
|
|
42
|
+
this.touched = true;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
if (window.ResizeObserver) {
|
|
47
|
+
this.resizeObserver = new ResizeObserver(entries => {
|
|
48
|
+
this.ngZone.run(() => {
|
|
49
|
+
const width = entries[0].contentRect.width;
|
|
50
|
+
this.smallDisplay = width < 580;
|
|
51
|
+
this.cdr.markForCheck();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
this.resizeObserver.observe(this.elRef.nativeElement);
|
|
55
|
+
}
|
|
56
|
+
this.internalFormGroup = new UntypedFormGroup({
|
|
57
|
+
mode: new UntypedFormControl(),
|
|
58
|
+
secondInterval: new UntypedFormControl(),
|
|
59
|
+
minuteInterval: new UntypedFormControl(),
|
|
60
|
+
hourInterval: new UntypedFormControl(),
|
|
61
|
+
dayInterval: new UntypedFormControl(),
|
|
62
|
+
dayOfWeek: new UntypedFormControl(),
|
|
63
|
+
dayOfMonth: new UntypedFormControl(),
|
|
64
|
+
hours: new UntypedFormControl(),
|
|
65
|
+
minutes: new UntypedFormControl(),
|
|
66
|
+
customExpression: new UntypedFormControl(),
|
|
67
|
+
});
|
|
68
|
+
this.isDisabled ? this.internalFormGroup.disable({ emitEvent: false }) : this.internalFormGroup.enable({ emitEvent: false });
|
|
69
|
+
this.internalFormGroup
|
|
70
|
+
.get('mode')
|
|
71
|
+
?.valueChanges.pipe(filter(mode => !!mode), tap(mode => {
|
|
72
|
+
this.cronDisplay = getDefaultCronDisplay(mode);
|
|
73
|
+
this.refreshInternalForm();
|
|
74
|
+
}), takeUntil(this.unsubscribe$))
|
|
75
|
+
.subscribe();
|
|
76
|
+
this.internalFormGroup.valueChanges
|
|
77
|
+
?.pipe(tap(value => {
|
|
78
|
+
this.hasError = false;
|
|
79
|
+
if (!value?.mode) {
|
|
80
|
+
this._onChange(null);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
this.value = toCronExpression({
|
|
85
|
+
mode: value.mode,
|
|
86
|
+
secondInterval: value.secondInterval,
|
|
87
|
+
minuteInterval: value.minuteInterval,
|
|
88
|
+
hourInterval: value.hourInterval,
|
|
89
|
+
dayInterval: value.dayInterval,
|
|
90
|
+
dayOfWeek: value.dayOfWeek,
|
|
91
|
+
dayOfMonth: value.dayOfMonth,
|
|
92
|
+
customExpression: value.customExpression,
|
|
93
|
+
hours: value.hours,
|
|
94
|
+
minutes: value.minutes,
|
|
95
|
+
});
|
|
96
|
+
this.expressionDescription = toCronDescription(this.value);
|
|
97
|
+
this._onChange(this.value);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.hasError = true;
|
|
101
|
+
this.expressionDescription = `${error}` ?? 'Invalid cron expression.';
|
|
102
|
+
this._onChange(null);
|
|
103
|
+
}
|
|
104
|
+
}), takeUntil(this.unsubscribe$))
|
|
105
|
+
.subscribe();
|
|
106
|
+
this.refreshInternalForm();
|
|
107
|
+
}
|
|
108
|
+
ngOnDestroy() {
|
|
109
|
+
this.fm.stopMonitoring(this.elRef.nativeElement);
|
|
110
|
+
this.resizeObserver?.unobserve(this.elRef.nativeElement);
|
|
111
|
+
this.unsubscribe$.next();
|
|
112
|
+
this.unsubscribe$.complete();
|
|
113
|
+
}
|
|
114
|
+
// From ControlValueAccessor interface
|
|
115
|
+
writeValue(value) {
|
|
116
|
+
if (isEmpty(value)) {
|
|
117
|
+
this.onClear();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
this.value = value;
|
|
122
|
+
this.cronDisplay = parseCronExpression(value);
|
|
123
|
+
this.expressionDescription = toCronDescription(this.value);
|
|
124
|
+
this.refreshInternalForm();
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
this.hasError = true;
|
|
128
|
+
this.expressionDescription = `${error}` ?? 'Invalid cron expression.';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// From ControlValueAccessor interface
|
|
132
|
+
registerOnChange(fn) {
|
|
133
|
+
this._onChange = fn;
|
|
134
|
+
}
|
|
135
|
+
// From ControlValueAccessor interface
|
|
136
|
+
registerOnTouched(fn) {
|
|
137
|
+
this._onTouched = fn;
|
|
138
|
+
}
|
|
139
|
+
// From ControlValueAccessor interface
|
|
140
|
+
setDisabledState(isDisabled) {
|
|
141
|
+
this.isDisabled = isDisabled;
|
|
142
|
+
this.refreshInternalForm();
|
|
143
|
+
}
|
|
144
|
+
validate(_) {
|
|
145
|
+
return this.hasError ? { invalid: true } : null;
|
|
146
|
+
}
|
|
147
|
+
onClear({ touched } = {}) {
|
|
148
|
+
this.value = undefined;
|
|
149
|
+
this.cronDisplay = undefined;
|
|
150
|
+
this.internalFormGroup?.reset({}, { emitEvent: true });
|
|
151
|
+
if (touched) {
|
|
152
|
+
this.touched = true;
|
|
153
|
+
this._onTouched();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
refreshInternalForm() {
|
|
157
|
+
if (!this.internalFormGroup)
|
|
158
|
+
return;
|
|
159
|
+
this.isDisabled ? this.internalFormGroup.disable({ emitEvent: false }) : this.internalFormGroup.enable({ emitEvent: false });
|
|
160
|
+
const d = this.cronDisplay;
|
|
161
|
+
if (d) {
|
|
162
|
+
this.internalFormGroup.patchValue({
|
|
163
|
+
mode: d.mode,
|
|
164
|
+
customExpression: d.customExpression,
|
|
165
|
+
secondInterval: d.secondInterval,
|
|
166
|
+
minuteInterval: d.minuteInterval,
|
|
167
|
+
hourInterval: d.hourInterval,
|
|
168
|
+
dayInterval: d.dayInterval,
|
|
169
|
+
dayOfWeek: d.dayOfWeek,
|
|
170
|
+
dayOfMonth: d.dayOfMonth,
|
|
171
|
+
hours: d.hours,
|
|
172
|
+
minutes: d.minutes,
|
|
173
|
+
}, { emitEvent: false });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFormCronComponent, deps: [{ token: i0.ElementRef }, { token: i1.FocusMonitor }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
177
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: GioFormCronComponent, isStandalone: false, selector: "gio-form-cron", host: { properties: { "class.disabled": "this.isDisabled", "class.smallDisplay": "this.smallDisplay" } }, providers: [
|
|
178
|
+
{
|
|
179
|
+
provide: NG_VALUE_ACCESSOR,
|
|
180
|
+
useExisting: forwardRef(() => GioFormCronComponent),
|
|
181
|
+
multi: true,
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
provide: NG_VALIDATORS,
|
|
185
|
+
useExisting: forwardRef(() => GioFormCronComponent),
|
|
186
|
+
multi: true,
|
|
187
|
+
},
|
|
188
|
+
], ngImport: i0, template: "<!--\n\n Copyright (C) 2015 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div class=\"label\"><ng-content select=\"gio-form-cron-label\"></ng-content></div>\n<div class=\"wrapper\" [class.smallDisplay]=\"smallDisplay\" [class.disabled]=\"isDisabled\">\n <ng-container *ngIf=\"internalFormGroup\" [formGroup]=\"internalFormGroup\">\n <div class=\"menu\">\n <mat-button-toggle-group\n class=\"gio-button-toggle-group menu__mode\"\n name=\"mode\"\n aria-label=\"Cron mode\"\n formControlName=\"mode\"\n [hideSingleSelectionIndicator]=\"true\"\n >\n <mat-button-toggle value=\"secondly\" matTooltip=\"Secondly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 's' : 'Secondly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"minutely\" matTooltip=\"Minutely\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'm' : 'Minutely'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"hourly\" matTooltip=\"Hourly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'h' : 'Hourly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"daily\" matTooltip=\"Daily\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'D' : 'Daily'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"weekly\" matTooltip=\"Weekly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'W' : 'Weekly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"monthly\" matTooltip=\"Monthly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'M' : 'Monthly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"custom\" matTooltip=\"Custom\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'C' : 'Custom'\n }}</mat-button-toggle>\n </mat-button-toggle-group>\n <button\n *ngIf=\"value && !isDisabled\"\n mat-button\n aria-label=\"Clear\"\n matTooltip=\"Clear\"\n type=\"button\"\n (click)=\"onClear({ touched: true })\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <ng-container [ngSwitch]=\"internalFormGroup.get('mode')?.value\">\n <ng-container *ngSwitchCase=\"'secondly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Second</mat-label>\n <mat-select formControlName=\"secondInterval\">\n <mat-option *ngFor=\"let second of seconds\" [value]=\"second\">{{ second }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'minutely'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minuteInterval\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hourly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hourInterval\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'daily'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayInterval\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'weekly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-medium\">\n <mat-label>Day of the week</mat-label>\n <mat-select formControlName=\"dayOfWeek\">\n <mat-option *ngFor=\"let day of daysOfWeek; let index = index\" [value]=\"index\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'monthly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">On the </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayOfMonth\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> of every month at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'custom'\">\n <div class=\"modeForm\">\n <mat-form-field class=\"modeForm__field-custom\">\n <mat-label>Cron expression</mat-label>\n <input matInput formControlName=\"customExpression\" placeholder=\"* * * * * *\" />\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"value; else placeholder\" class=\"preview\">\n <span *ngIf=\"internalFormGroup.get('mode')?.value !== 'custom'\" class=\"preview__value\">\n {{ value }}\n </span>\n <span class=\"preview__hint\">{{ expressionDescription }}</span>\n </div>\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"placeholder\">No cron expression defined.</div>\n </ng-template>\n</div>\n<div class=\"hint\"><ng-content select=\"gio-form-cron-hint\"></ng-content></div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;min-width:342px;flex-direction:column}::ng-deep gio-form-cron{--mat-form-field-container-height: 48px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 12px;--mat-form-field-filled-with-label-container-padding-top: 12px;--mat-form-field-filled-with-label-container-padding-bottom: 12px}.label{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-left:10px;color:var(--mdc-outlined-text-field-label-text-color)}.label:empty{display:none}.wrapper{display:inline-flex;flex-direction:column;padding:8px;border:1px solid var(--mdc-outlined-text-field-outline-color);border-radius:4px}.wrapper:hover:not(.disabled){padding:8px;border:1px solid var(--mdc-outlined-text-field-hover-outline-color)}.wrapper .menu{display:inline-flex;align-items:center;justify-content:space-between;margin-bottom:4px}.wrapper .menu__mode{border:none;margin-bottom:0}.wrapper .modeForm{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:8px;column-gap:4px}.wrapper .modeForm__field-small,.wrapper .modeForm__field-medium,.wrapper .modeForm__field-custom{display:inline-block;height:52px}.wrapper .modeForm__field-small{width:124px}.wrapper .modeForm__field-medium{width:158px}.wrapper .modeForm__field-custom{width:100%}.wrapper .preview,.wrapper .placeholder{display:flex;flex-direction:column;align-items:center;padding:8px;border-radius:4px;background-color:#f7f7f8;color:#000}.wrapper .preview__hint,.wrapper .placeholder{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal}.wrapper.disabled .preview,.wrapper.disabled .placeholder{opacity:.4}.hint{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-top:2px;padding-left:10px}.hint:empty{display:none}:host(.ng-invalid.ng-touched) .wrapper{padding:8px;border-width:1px;border-color:var(--mdc-outlined-text-field-error-outline-color)}:host(.ng-invalid.ng-touched) .wrapper .preview,:host(.ng-invalid.ng-touched) .wrapper .placeholder{color:#dd1d1f}:host(.ng-invalid.ng-touched) .label,:host(.ng-invalid.ng-touched) .hint{color:var(--mdc-outlined-text-field-error-outline-color)}:host(.disabled) .wrapper{border-color:#f7f7f8}:host(.disabled) .wrapper,:host(.disabled) .hint,:host(.disabled) .label{color:#d2cecd}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
189
|
+
}
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioFormCronComponent, decorators: [{
|
|
191
|
+
type: Component,
|
|
192
|
+
args: [{ selector: 'gio-form-cron', providers: [
|
|
193
|
+
{
|
|
194
|
+
provide: NG_VALUE_ACCESSOR,
|
|
195
|
+
useExisting: forwardRef(() => GioFormCronComponent),
|
|
196
|
+
multi: true,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
provide: NG_VALIDATORS,
|
|
200
|
+
useExisting: forwardRef(() => GioFormCronComponent),
|
|
201
|
+
multi: true,
|
|
202
|
+
},
|
|
203
|
+
], standalone: false, template: "<!--\n\n Copyright (C) 2015 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<div class=\"label\"><ng-content select=\"gio-form-cron-label\"></ng-content></div>\n<div class=\"wrapper\" [class.smallDisplay]=\"smallDisplay\" [class.disabled]=\"isDisabled\">\n <ng-container *ngIf=\"internalFormGroup\" [formGroup]=\"internalFormGroup\">\n <div class=\"menu\">\n <mat-button-toggle-group\n class=\"gio-button-toggle-group menu__mode\"\n name=\"mode\"\n aria-label=\"Cron mode\"\n formControlName=\"mode\"\n [hideSingleSelectionIndicator]=\"true\"\n >\n <mat-button-toggle value=\"secondly\" matTooltip=\"Secondly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 's' : 'Secondly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"minutely\" matTooltip=\"Minutely\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'm' : 'Minutely'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"hourly\" matTooltip=\"Hourly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'h' : 'Hourly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"daily\" matTooltip=\"Daily\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'D' : 'Daily'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"weekly\" matTooltip=\"Weekly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'W' : 'Weekly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"monthly\" matTooltip=\"Monthly\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'M' : 'Monthly'\n }}</mat-button-toggle>\n <mat-button-toggle value=\"custom\" matTooltip=\"Custom\" [matTooltipDisabled]=\"!smallDisplay\">{{\n smallDisplay ? 'C' : 'Custom'\n }}</mat-button-toggle>\n </mat-button-toggle-group>\n <button\n *ngIf=\"value && !isDisabled\"\n mat-button\n aria-label=\"Clear\"\n matTooltip=\"Clear\"\n type=\"button\"\n (click)=\"onClear({ touched: true })\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <ng-container [ngSwitch]=\"internalFormGroup.get('mode')?.value\">\n <ng-container *ngSwitchCase=\"'secondly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Second</mat-label>\n <mat-select formControlName=\"secondInterval\">\n <mat-option *ngFor=\"let second of seconds\" [value]=\"second\">{{ second }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'minutely'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minuteInterval\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hourly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hourInterval\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'daily'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayInterval\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hour(s)</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minute(s)</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'weekly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">Every </span>\n <mat-form-field class=\"modeForm__field-medium\">\n <mat-label>Day of the week</mat-label>\n <mat-select formControlName=\"dayOfWeek\">\n <mat-option *ngFor=\"let day of daysOfWeek; let index = index\" [value]=\"index\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'monthly'\">\n <div class=\"modeForm\">\n <span class=\"cron-form-label\">On the </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Day(s)</mat-label>\n <mat-select formControlName=\"dayOfMonth\">\n <mat-option *ngFor=\"let day of daysOfMonth\" [value]=\"day\">{{ day }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\"> of every month at </span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Hours</mat-label>\n <mat-select formControlName=\"hours\">\n <mat-option *ngFor=\"let hour of hours\" [value]=\"hour\">{{ hour }}</mat-option>\n </mat-select>\n </mat-form-field>\n <span class=\"cron-form-label\">:</span>\n <mat-form-field class=\"modeForm__field-small\">\n <mat-label>Minutes</mat-label>\n <mat-select formControlName=\"minutes\">\n <mat-option *ngFor=\"let minute of minutes\" [value]=\"minute\">{{ minute }}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'custom'\">\n <div class=\"modeForm\">\n <mat-form-field class=\"modeForm__field-custom\">\n <mat-label>Cron expression</mat-label>\n <input matInput formControlName=\"customExpression\" placeholder=\"* * * * * *\" />\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"value; else placeholder\" class=\"preview\">\n <span *ngIf=\"internalFormGroup.get('mode')?.value !== 'custom'\" class=\"preview__value\">\n {{ value }}\n </span>\n <span class=\"preview__hint\">{{ expressionDescription }}</span>\n </div>\n </ng-container>\n\n <ng-template #placeholder>\n <div class=\"placeholder\">No cron expression defined.</div>\n </ng-template>\n</div>\n<div class=\"hint\"><ng-content select=\"gio-form-cron-hint\"></ng-content></div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;min-width:342px;flex-direction:column}::ng-deep gio-form-cron{--mat-form-field-container-height: 48px;--mat-form-field-filled-label-display: none;--mat-form-field-container-vertical-padding: 12px;--mat-form-field-filled-with-label-container-padding-top: 12px;--mat-form-field-filled-with-label-container-padding-bottom: 12px}.label{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-left:10px;color:var(--mdc-outlined-text-field-label-text-color)}.label:empty{display:none}.wrapper{display:inline-flex;flex-direction:column;padding:8px;border:1px solid var(--mdc-outlined-text-field-outline-color);border-radius:4px}.wrapper:hover:not(.disabled){padding:8px;border:1px solid var(--mdc-outlined-text-field-hover-outline-color)}.wrapper .menu{display:inline-flex;align-items:center;justify-content:space-between;margin-bottom:4px}.wrapper .menu__mode{border:none;margin-bottom:0}.wrapper .modeForm{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:8px;column-gap:4px}.wrapper .modeForm__field-small,.wrapper .modeForm__field-medium,.wrapper .modeForm__field-custom{display:inline-block;height:52px}.wrapper .modeForm__field-small{width:124px}.wrapper .modeForm__field-medium{width:158px}.wrapper .modeForm__field-custom{width:100%}.wrapper .preview,.wrapper .placeholder{display:flex;flex-direction:column;align-items:center;padding:8px;border-radius:4px;background-color:#f7f7f8;color:#000}.wrapper .preview__hint,.wrapper .placeholder{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal}.wrapper.disabled .preview,.wrapper.disabled .placeholder{opacity:.4}.hint{font-size:12px;font-weight:400;line-height:16px;font-family:Manrope,sans-serif;letter-spacing:normal;padding-top:2px;padding-left:10px}.hint:empty{display:none}:host(.ng-invalid.ng-touched) .wrapper{padding:8px;border-width:1px;border-color:var(--mdc-outlined-text-field-error-outline-color)}:host(.ng-invalid.ng-touched) .wrapper .preview,:host(.ng-invalid.ng-touched) .wrapper .placeholder{color:#dd1d1f}:host(.ng-invalid.ng-touched) .label,:host(.ng-invalid.ng-touched) .hint{color:var(--mdc-outlined-text-field-error-outline-color)}:host(.disabled) .wrapper{border-color:#f7f7f8}:host(.disabled) .wrapper,:host(.disabled) .hint,:host(.disabled) .label{color:#d2cecd}\n"] }]
|
|
204
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FocusMonitor }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { isDisabled: [{
|
|
205
|
+
type: HostBinding,
|
|
206
|
+
args: ['class.disabled']
|
|
207
|
+
}], smallDisplay: [{
|
|
208
|
+
type: HostBinding,
|
|
209
|
+
args: ['class.smallDisplay']
|
|
210
|
+
}] } });
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1mb3JtLWNyb24vZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1mb3JtLWNyb24vZ2lvLWZvcm0tY3Jvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFFLFNBQVMsRUFBYyxXQUFXLEVBQTZCLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFlLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQW9CdkksTUFBTSxPQUFPLG9CQUFvQjtJQTJCL0IsWUFDbUIsS0FBaUIsRUFDakIsRUFBZ0IsRUFDaEIsTUFBYyxFQUNkLEdBQXNCO1FBSHRCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE5QmxDLGNBQVMsR0FBbUMsR0FBRyxFQUFFLENBQUMs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TVUsb0JBQW9CO2tHQUFwQixvQkFBb0IsdUtBZHBCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDbkQsS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDakRILG1xU0ErTUE7OzJGRDNKYSxvQkFBb0I7a0JBbEJoQyxTQUFTOytCQUNFLGVBQWUsYUFHZDt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixjQUNXLEtBQUs7K0pBZ0JWLFVBQVU7c0JBRGhCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUd0QixZQUFZO3NCQURsQixXQUFXO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZvY3VzTW9uaXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIGZvcndhcmRSZWYsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGlzRW1wdHksIHJhbmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENyb25EaXNwbGF5LCBnZXREZWZhdWx0Q3JvbkRpc3BsYXksIHBhcnNlQ3JvbkV4cHJlc3Npb24sIHRvQ3JvbkRlc2NyaXB0aW9uLCB0b0Nyb25FeHByZXNzaW9uIH0gZnJvbSAnLi9naW8tZm9ybS1jcm9uLmFkYXB0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnaW8tZm9ybS1jcm9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dpby1mb3JtLWNyb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9naW8tZm9ybS1jcm9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2lvRm9ybUNyb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2lvRm9ybUNyb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEdpb0Zvcm1Dcm9uQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBWYWxpZGF0b3Ige1xuICBwdWJsaWMgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiAoe30pO1xuXG4gIHB1YmxpYyBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gKHt9KTtcblxuICBwdWJsaWMgc2Vjb25kcyA9IFsuLi5yYW5nZSgwLCA2MCldO1xuICBwdWJsaWMgbWludXRlcyA9IFsuLi5yYW5nZSgwLCA2MCldO1xuICBwdWJsaWMgaG91cnMgPSBbLi4ucmFuZ2UoMCwgMjQpXTtcbiAgcHVibGljIGRheXNPZk1vbnRoID0gWy4uLnJhbmdlKDEsIDMyKV07XG4gIHB1YmxpYyBkYXlzT2ZXZWVrID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xuICBwdWJsaWMgaW50ZXJuYWxGb3JtR3JvdXA/OiBVbnR5cGVkRm9ybUdyb3VwO1xuICBwdWJsaWMgdmFsdWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBleHByZXNzaW9uRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQnKVxuICBwdWJsaWMgaXNEaXNhYmxlZCA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNtYWxsRGlzcGxheScpXG4gIHB1YmxpYyBzbWFsbERpc3BsYXkgPSBmYWxzZTtcblxuICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmb2N1c2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaGFzRXJyb3IgPSBmYWxzZTtcblxuICBwcml2YXRlIGNyb25EaXNwbGF5PzogQ3JvbkRpc3BsYXk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZtOiBGb2N1c01vbml0b3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIGZtLm1vbml0b3IoZWxSZWYubmF0aXZlRWxlbWVudCwgdHJ1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpXG4gICAgICAuc3Vic2NyaWJlKG9yaWdpbiA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9ICEhb3JpZ2luO1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LndpZHRoO1xuICAgICAgICAgIHRoaXMuc21hbGxEaXNwbGF5ID0gd2lkdGggPCA1ODA7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgbW9kZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpLFxuICAgICAgc2Vjb25kSW50ZXJ2YWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIG1pbnV0ZUludGVydmFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgICBob3VySW50ZXJ2YWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGRheUludGVydmFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgICBkYXlPZldlZWs6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGRheU9mTW9udGg6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcblxuICAgICAgaG91cnM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIG1pbnV0ZXM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGN1c3RvbUV4cHJlc3Npb246IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICB9KTtcblxuICAgIHRoaXMuaXNEaXNhYmxlZCA/IHRoaXMuaW50ZXJuYWxGb3JtR3JvdXAuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiB0aGlzLmludGVybmFsRm9ybUdyb3VwLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwXG4gICAgICAuZ2V0KCdtb2RlJylcbiAgICAgID8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgIGZpbHRlcihtb2RlID0+ICEhbW9kZSksXG4gICAgICAgIHRhcChtb2RlID0+IHtcbiAgICAgICAgICB0aGlzLmNyb25EaXNwbGF5ID0gZ2V0RGVmYXVsdENyb25EaXNwbGF5KG1vZGUpO1xuXG4gICAgICAgICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5pbnRlcm5hbEZvcm1Hcm91cC52YWx1ZUNoYW5nZXNcbiAgICAgID8ucGlwZShcbiAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCF2YWx1ZT8ubW9kZSkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdG9Dcm9uRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgIG1vZGU6IHZhbHVlLm1vZGUsXG4gICAgICAgICAgICAgIHNlY29uZEludGVydmFsOiB2YWx1ZS5zZWNvbmRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgbWludXRlSW50ZXJ2YWw6IHZhbHVlLm1pbnV0ZUludGVydmFsLFxuICAgICAgICAgICAgICBob3VySW50ZXJ2YWw6IHZhbHVlLmhvdXJJbnRlcnZhbCxcbiAgICAgICAgICAgICAgZGF5SW50ZXJ2YWw6IHZhbHVlLmRheUludGVydmFsLFxuICAgICAgICAgICAgICBkYXlPZldlZWs6IHZhbHVlLmRheU9mV2VlayxcbiAgICAgICAgICAgICAgZGF5T2ZNb250aDogdmFsdWUuZGF5T2ZNb250aCxcbiAgICAgICAgICAgICAgY3VzdG9tRXhwcmVzc2lvbjogdmFsdWUuY3VzdG9tRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgaG91cnM6IHZhbHVlLmhvdXJzLFxuICAgICAgICAgICAgICBtaW51dGVzOiB2YWx1ZS5taW51dGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbkRlc2NyaXB0aW9uID0gdG9Dcm9uRGVzY3JpcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25EZXNjcmlwdGlvbiA9IGAke2Vycm9yfWAgPz8gJ0ludmFsaWQgY3JvbiBleHByZXNzaW9uLic7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mbS5zdG9wTW9uaXRvcmluZyh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LnVub2JzZXJ2ZSh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgdGhpcy5vbkNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmNyb25EaXNwbGF5ID0gcGFyc2VDcm9uRXhwcmVzc2lvbih2YWx1ZSk7XG5cbiAgICAgIHRoaXMuZXhwcmVzc2lvbkRlc2NyaXB0aW9uID0gdG9Dcm9uRGVzY3JpcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICB0aGlzLnJlZnJlc2hJbnRlcm5hbEZvcm0oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICB0aGlzLmV4cHJlc3Npb25EZXNjcmlwdGlvbiA9IGAke2Vycm9yfWAgPz8gJ0ludmFsaWQgY3JvbiBleHByZXNzaW9uLic7XG4gICAgfVxuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvLyBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuXG4gICAgdGhpcy5yZWZyZXNoSW50ZXJuYWxGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoXzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmhhc0Vycm9yID8geyBpbnZhbGlkOiB0cnVlIH0gOiBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uQ2xlYXIoeyB0b3VjaGVkIH06IHsgdG91Y2hlZD86IGJvb2xlYW4gfSA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNyb25EaXNwbGF5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW50ZXJuYWxGb3JtR3JvdXA/LnJlc2V0KHt9LCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcblxuICAgIGlmICh0b3VjaGVkKSB7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoSW50ZXJuYWxGb3JtKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnRlcm5hbEZvcm1Hcm91cCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc0Rpc2FibGVkID8gdGhpcy5pbnRlcm5hbEZvcm1Hcm91cC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IHRoaXMuaW50ZXJuYWxGb3JtR3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IGQgPSB0aGlzLmNyb25EaXNwbGF5O1xuICAgIGlmIChkKSB7XG4gICAgICB0aGlzLmludGVybmFsRm9ybUdyb3VwLnBhdGNoVmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlOiBkLm1vZGUsXG4gICAgICAgICAgY3VzdG9tRXhwcmVzc2lvbjogZC5jdXN0b21FeHByZXNzaW9uLFxuICAgICAgICAgIHNlY29uZEludGVydmFsOiBkLnNlY29uZEludGVydmFsLFxuICAgICAgICAgIG1pbnV0ZUludGVydmFsOiBkLm1pbnV0ZUludGVydmFsLFxuICAgICAgICAgIGhvdXJJbnRlcnZhbDogZC5ob3VySW50ZXJ2YWwsXG4gICAgICAgICAgZGF5SW50ZXJ2YWw6IGQuZGF5SW50ZXJ2YWwsXG4gICAgICAgICAgZGF5T2ZXZWVrOiBkLmRheU9mV2VlayxcbiAgICAgICAgICBkYXlPZk1vbnRoOiBkLmRheU9mTW9udGgsXG5cbiAgICAgICAgICBob3VyczogZC5ob3VycyxcbiAgICAgICAgICBtaW51dGVzOiBkLm1pbnV0ZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS1cblxuICAgIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbi0tPlxuPGRpdiBjbGFzcz1cImxhYmVsXCI+PG5nLWNvbnRlbnQgc2VsZWN0PVwiZ2lvLWZvcm0tY3Jvbi1sYWJlbFwiPjwvbmctY29udGVudD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCIgW2NsYXNzLnNtYWxsRGlzcGxheV09XCJzbWFsbERpc3BsYXlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW50ZXJuYWxGb3JtR3JvdXBcIiBbZm9ybUdyb3VwXT1cImludGVybmFsRm9ybUdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lbnVcIj5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxuICAgICAgICBjbGFzcz1cImdpby1idXR0b24tdG9nZ2xlLWdyb3VwIG1lbnVfX21vZGVcIlxuICAgICAgICBuYW1lPVwibW9kZVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDcm9uIG1vZGVcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtb2RlXCJcbiAgICAgICAgW2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3JdPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cInNlY29uZGx5XCIgbWF0VG9vbHRpcD1cIlNlY29uZGx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAncycgOiAnU2Vjb25kbHknXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwibWludXRlbHlcIiBtYXRUb29sdGlwPVwiTWludXRlbHlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdtJyA6ICdNaW51dGVseSdcbiAgICAgICAgfX08L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJob3VybHlcIiBtYXRUb29sdGlwPVwiSG91cmx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAnaCcgOiAnSG91cmx5J1xuICAgICAgICB9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImRhaWx5XCIgbWF0VG9vbHRpcD1cIkRhaWx5XCIgW21hdFRvb2x0aXBEaXNhYmxlZF09XCIhc21hbGxEaXNwbGF5XCI+e3tcbiAgICAgICAgICBzbWFsbERpc3BsYXkgPyAnRCcgOiAnRGFpbHknXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIHZhbHVlPVwid2Vla2x5XCIgbWF0VG9vbHRpcD1cIldlZWtseVwiIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIXNtYWxsRGlzcGxheVwiPnt7XG4gICAgICAgICAgc21hbGxEaXNwbGF5ID8gJ1cnIDogJ1dlZWtseSdcbiAgICAgICAgfX08L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgdmFsdWU9XCJtb250aGx5XCIgbWF0VG9vbHRpcD1cIk1vbnRobHlcIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdNJyA6ICdNb250aGx5J1xuICAgICAgICB9fTwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSB2YWx1ZT1cImN1c3RvbVwiIG1hdFRvb2x0aXA9XCJDdXN0b21cIiBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFzbWFsbERpc3BsYXlcIj57e1xuICAgICAgICAgIHNtYWxsRGlzcGxheSA/ICdDJyA6ICdDdXN0b20nXG4gICAgICAgIH19PC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwidmFsdWUgJiYgIWlzRGlzYWJsZWRcIlxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhclwiXG4gICAgICAgIG1hdFRvb2x0aXA9XCJDbGVhclwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhcih7IHRvdWNoZWQ6IHRydWUgfSlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpbnRlcm5hbEZvcm1Hcm91cC5nZXQoJ21vZGUnKT8udmFsdWVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWNvbmRseSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVGb3JtXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj5FdmVyeSA8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPlNlY29uZDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwic2Vjb25kSW50ZXJ2YWxcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHNlY29uZCBvZiBzZWNvbmRzXCIgW3ZhbHVlXT1cInNlY29uZFwiPnt7IHNlY29uZCB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWludXRlbHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+RXZlcnkgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5NaW51dGUocyk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1pbnV0ZUludGVydmFsXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXJseSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGVGb3JtXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj5FdmVyeSA8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkhvdXIocyk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImhvdXJJbnRlcnZhbFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3Vyc1wiIFt2YWx1ZV09XCJob3VyXCI+e3sgaG91ciB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+Ojwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+TWludXRlKHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtaW51dGVzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhaWx5J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZUZvcm1cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPkV2ZXJ5IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5KHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlJbnRlcnZhbFwiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNPZk1vbnRoXCIgW3ZhbHVlXT1cImRheVwiPnt7IGRheSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+IGF0IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+SG91cihzKTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaG91cnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7IGhvdXIgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPjo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk1pbnV0ZShzKTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwibWludXRlc1wiPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWludXRlIG9mIG1pbnV0ZXNcIiBbdmFsdWVdPVwibWludXRlXCI+e3sgbWludXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid3ZWVrbHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+RXZlcnkgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1tZWRpdW1cIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5IG9mIHRoZSB3ZWVrPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlPZldlZWtcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzT2ZXZWVrOyBsZXQgaW5kZXggPSBpbmRleFwiIFt2YWx1ZV09XCJpbmRleFwiPnt7IGRheSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+IGF0IDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+SG91cnM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImhvdXJzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGhvdXJzXCIgW3ZhbHVlXT1cImhvdXJcIj57eyBob3VyIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj46PC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5NaW51dGVzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtaW51dGVzXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiIFt2YWx1ZV09XCJtaW51dGVcIj57eyBtaW51dGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21vbnRobHknXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RlRm9ybVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvbi1mb3JtLWxhYmVsXCI+T24gdGhlIDwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtc21hbGxcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+RGF5KHMpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXlPZk1vbnRoXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c09mTW9udGhcIiBbdmFsdWVdPVwiZGF5XCI+e3sgZGF5IH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9uLWZvcm0tbGFiZWxcIj4gb2YgZXZlcnkgbW9udGggYXQgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1vZGVGb3JtX19maWVsZC1zbWFsbFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Ib3VyczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiaG91cnNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91cnNcIiBbdmFsdWVdPVwiaG91clwiPnt7IGhvdXIgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb24tZm9ybS1sYWJlbFwiPjo8L3NwYW4+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibW9kZUZvcm1fX2ZpZWxkLXNtYWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk1pbnV0ZXM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1pbnV0ZXNcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1pbnV0ZSBvZiBtaW51dGVzXCIgW3ZhbHVlXT1cIm1pbnV0ZVwiPnt7IG1pbnV0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VzdG9tJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZUZvcm1cIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtb2RlRm9ybV9fZmllbGQtY3VzdG9tXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkNyb24gZXhwcmVzc2lvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImN1c3RvbUV4cHJlc3Npb25cIiBwbGFjZWhvbGRlcj1cIiogKiAqICogKiAqXCIgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiAqbmdJZj1cInZhbHVlOyBlbHNlIHBsYWNlaG9sZGVyXCIgY2xhc3M9XCJwcmV2aWV3XCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImludGVybmFsRm9ybUdyb3VwLmdldCgnbW9kZScpPy52YWx1ZSAhPT0gJ2N1c3RvbSdcIiBjbGFzcz1cInByZXZpZXdfX3ZhbHVlXCI+XG4gICAgICAgIHt7IHZhbHVlIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXdfX2hpbnRcIj57eyBleHByZXNzaW9uRGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXI+XG4gICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyXCI+Tm8gY3JvbiBleHByZXNzaW9uIGRlZmluZWQuPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJoaW50XCI+PG5nLWNvbnRlbnQgc2VsZWN0PVwiZ2lvLWZvcm0tY3Jvbi1oaW50XCI+PC9uZy1jb250ZW50PjwvZGl2PlxuIl19
|