@seniorsistemas/angular-components 18.1.2 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +1 -1
- package/common/deprecated-selector/README.md +74 -0
- package/common/deprecated-selector/deprecated-selector.directive.d.ts +15 -0
- package/common/deprecated-selector/index.d.ts +5 -0
- package/common/deprecated-selector/public-api.d.ts +7 -0
- package/content-generator/index.d.ts +5 -0
- package/{text-area-ia/lib/text-area-ia/text-area-ia.component.d.ts → content-generator/lib/content-generator/content-generator.component.d.ts} +8 -4
- package/content-generator/lib/content-generator/content-generator.module.d.ts +16 -0
- package/content-generator/public-api.d.ts +2 -0
- package/custom-fields/lib/custom-fields/custom-fields.component.d.ts +9 -8
- package/custom-fields/lib/custom-fields/custom-fields.service.d.ts +4 -3
- package/custom-fields/lib/custom-fields/models/custom-field-type.d.ts +33 -0
- package/custom-fields/lib/custom-fields/models/index.d.ts +1 -0
- package/custom-fields/public-api.d.ts +2 -1
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/field-label/field-label.component.d.ts +3 -3
- package/dynamic-form/dynamic-form/components/grid/row/row.component.d.ts +19 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/lookup.component.d.ts +20 -35
- package/dynamic-form/dynamic-form/components/structure/base-structure-component.d.ts +10 -0
- package/dynamic-form/dynamic-form/components/structure/fieldset/fieldset.component.d.ts +12 -0
- package/dynamic-form/dynamic-form/components/structure/section/section.component.d.ts +14 -0
- package/dynamic-form/dynamic-form/configurations/registry.d.ts +8 -0
- package/dynamic-form/dynamic-form/configurations/structure/fieldset.d.ts +11 -0
- package/dynamic-form/dynamic-form/configurations/structure/row.d.ts +46 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/configurations/structure/section.d.ts +9 -8
- package/dynamic-form/dynamic-form/configurations/structure/structure.d.ts +11 -0
- package/dynamic-form/dynamic-form/dynamic-form.component.d.ts +30 -0
- package/dynamic-form/dynamic-form/dynamic-form.d.ts +35 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/dynamic-form.directive.d.ts +7 -13
- package/dynamic-form/dynamic-form/dynamic-form.module.d.ts +10 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/addon-config.d.ts +2 -1
- package/dynamic-form/dynamic-form/form-field/configurations/field-size.d.ts +14 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/autocomplete-field.d.ts +21 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.d.ts +28 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/blob-field.d.ts +28 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-field.d.ts +21 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-switch-field.d.ts +12 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/button-field.d.ts +16 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +32 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/checkbox-field.d.ts +11 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/chips-field.d.ts +18 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/content-generator-field.d.ts +28 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/country-phone-picker-field.d.ts +6 -7
- package/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.d.ts +15 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/field.d.ts +16 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +56 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/number-field.d.ts +9 -22
- package/dynamic-form/dynamic-form/form-field/configurations/fields/password-field.d.ts +30 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/profile-picture.d.ts +24 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/configurations/fields/radio-button-field.d.ts +7 -9
- package/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.d.ts +32 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/slider-field.d.ts +24 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/star-rating-field.d.ts +16 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.d.ts +18 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.d.ts +37 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/autocomplete/autocomplete-field.component.d.ts +9 -6
- package/dynamic-form/dynamic-form/form-field/fields/base-field-component.d.ts +7 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/bignumber/bignumber-field.component.d.ts +9 -8
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/boolean/boolean-radio-field/boolean-field.component.d.ts +4 -4
- package/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.d.ts +10 -0
- package/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.d.ts +11 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/calendar/calendar-field.component.d.ts +10 -10
- package/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.d.ts +10 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/chips/chips-field.component.d.ts +5 -5
- package/dynamic-form/dynamic-form/form-field/fields/content-generator/content-generator-field.component.d.ts +10 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/country-phone-picker/country-phone-picker-field.component.d.ts +4 -4
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/currency/currency-field.component.d.ts +10 -6
- package/dynamic-form/{lib/dynamic-form/form-field/fields/file-upload/file-upload-field.component.d.ts → dynamic-form/form-field/fields/file-picker/file-picker-field.component.d.ts} +7 -6
- package/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.d.ts +18 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/number/number-field.component.d.ts +8 -9
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/password/password-field.component.d.ts +8 -6
- package/dynamic-form/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.d.ts +10 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/radio-button/radio-button-field.component.d.ts +5 -5
- package/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.d.ts +12 -0
- package/dynamic-form/dynamic-form/form-field/fields/slider/slider-field.component.d.ts +23 -0
- package/dynamic-form/dynamic-form/form-field/fields/star-rating/star-rating-field.component.d.ts +11 -0
- package/dynamic-form/{lib/dynamic-form → dynamic-form}/form-field/fields/text/text-field.component.d.ts +8 -8
- package/dynamic-form/dynamic-form/form-field/fields/text-area/text-area-field.component.d.ts +18 -0
- package/dynamic-form/dynamic-form/services/form-field-utils.service.d.ts +15 -0
- package/dynamic-form/public-api.d.ts +35 -43
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +3 -3
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +8 -6
- package/esm2022/common/deprecated-selector/deprecated-selector.directive.mjs +28 -0
- package/esm2022/common/deprecated-selector/public-api.mjs +8 -0
- package/esm2022/common/deprecated-selector/seniorsistemas-angular-components-common-deprecated-selector.mjs +5 -0
- package/esm2022/common/lib/svg-factory/components/iassist-icon/iassist-icon.component.mjs +3 -3
- package/esm2022/content-generator/lib/content-generator/content-generator.component.mjs +170 -0
- package/esm2022/content-generator/lib/content-generator/content-generator.module.mjs +54 -0
- package/esm2022/content-generator/lib/services/IAssist/iassist.service.mjs +77 -0
- package/esm2022/content-generator/lib/services/IAssist/models/iassist-input-data.mjs +3 -0
- package/esm2022/content-generator/lib/services/IAssist/models/iassist-response.mjs +3 -0
- package/esm2022/content-generator/public-api.mjs +3 -0
- package/esm2022/content-generator/seniorsistemas-angular-components-content-generator.mjs +5 -0
- package/esm2022/control-errors/lib/control-errors/control-errors.component.mjs +2 -2
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +68 -69
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.service.mjs +5 -5
- package/esm2022/custom-fields/lib/custom-fields/models/custom-field-type.mjs +26 -1
- package/esm2022/custom-fields/lib/custom-fields/models/index.mjs +2 -0
- package/esm2022/custom-fields/public-api.mjs +3 -2
- package/esm2022/dynamic-form/dynamic-form/components/field-label/field-label.component.mjs +21 -0
- package/esm2022/dynamic-form/dynamic-form/components/grid/row/row.component.mjs +41 -0
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +689 -0
- package/esm2022/dynamic-form/dynamic-form/components/lookup/types/default-filter.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/components/lookup/types/label-options.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/components/structure/base-structure-component.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/components/structure/fieldset/fieldset.component.mjs +18 -0
- package/esm2022/dynamic-form/dynamic-form/components/structure/section/section.component.mjs +23 -0
- package/esm2022/dynamic-form/dynamic-form/configurations/registry.mjs +12 -0
- package/esm2022/dynamic-form/dynamic-form/configurations/structure/fieldset.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/configurations/structure/row.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/configurations/structure/section.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/configurations/structure/structure.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.component.mjs +48 -0
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.directive.mjs +76 -0
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.mjs +77 -0
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.module.mjs +20 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/addon-config.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/field-size.mjs +34 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/autocomplete-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/blob-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/boolean-switch-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/button-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/checkbox-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/chips-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/content-generator-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/country-phone-picker-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/field.mjs +3 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/password-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/profile-picture.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/radio-button-field.mjs +9 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/slider-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/star-rating-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-area-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +42 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/base-field-component.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +135 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +22 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +20 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/button-field/button-field.component.mjs +28 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +135 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +17 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/chips/chips-field.component.mjs +55 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/content-generator/content-generator-field.component.mjs +18 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/country-phone-picker/country-phone-picker-field.component.mjs +25 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +100 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/file-picker/file-picker-field.component.mjs +47 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +41 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +129 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +85 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.mjs +18 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +57 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +20 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/slider/slider-field.component.mjs +115 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/star-rating/star-rating-field.component.mjs +22 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +93 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text-area/text-area-field.component.mjs +36 -0
- package/esm2022/dynamic-form/dynamic-form/services/form-field-utils.service.mjs +39 -0
- package/esm2022/dynamic-form/public-api.mjs +62 -44
- package/esm2022/dynamic-form/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +318 -0
- package/esm2022/{file-upload/lib/file-upload/file-upload.module.mjs → file-picker/lib/file-picker/file-picker.module.mjs} +11 -11
- package/esm2022/{file-upload/lib/file-upload/file-upload.service.mjs → file-picker/lib/file-picker/file-picker.service.mjs} +5 -5
- package/esm2022/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/file-dto.mjs +1 -1
- package/esm2022/{file-upload/lib/file-upload/models/file-upload-permissions.mjs → file-picker/lib/file-picker/models/file-picker-permissions.mjs} +1 -1
- package/esm2022/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/list-blob-metadata.mjs +1 -1
- package/esm2022/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/uploadError.mjs +1 -1
- package/esm2022/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/validate-errors.mjs +1 -1
- package/esm2022/file-picker/public-api.mjs +4 -0
- package/esm2022/{slide-panel/seniorsistemas-angular-components-slide-panel.mjs → file-picker/seniorsistemas-angular-components-file-picker.mjs} +1 -1
- package/esm2022/file-upload/public-api.mjs +14 -3
- package/esm2022/ia-insight/public-api.mjs +23 -4
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-content-generator/inline-edit-content-generator.component.mjs +32 -0
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-lookup/inline-edit-lookup.component.mjs +3 -5
- package/esm2022/inline-edit/lib/inline-edit/components/index.mjs +2 -2
- package/esm2022/inline-edit/lib/inline-edit/fields/index.mjs +2 -2
- package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-content-generator-field.mjs +7 -0
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.component.mjs +4 -4
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +8 -8
- package/esm2022/inline-edit/public-api.mjs +2 -2
- package/esm2022/insights/lib/insights/components/insights-card/components/index.mjs +2 -0
- package/esm2022/insights/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.mjs +13 -0
- package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +94 -0
- package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +59 -0
- package/esm2022/insights/lib/insights/insights.component.mjs +89 -0
- package/esm2022/insights/lib/insights/insights.module.mjs +47 -0
- package/esm2022/insights/lib/insights/models/index.mjs +2 -0
- package/esm2022/insights/lib/insights/models/insights-item.mjs +2 -0
- package/esm2022/insights/lib/insights/models/insights-template-types.mjs +2 -0
- package/esm2022/insights/public-api.mjs +4 -0
- package/esm2022/insights/seniorsistemas-angular-components-insights.mjs +5 -0
- package/esm2022/optional-fields/editor/editor-field/editor-field.component.mjs +18 -0
- package/esm2022/optional-fields/editor/editor-field.mjs +17 -0
- package/esm2022/optional-fields/editor/public-api.mjs +2 -0
- package/esm2022/optional-fields/editor/seniorsistemas-angular-components-optional-fields-editor.mjs +5 -0
- package/esm2022/product-header/public-api.mjs +23 -3
- package/esm2022/select/lib/select/select.component.mjs +3 -3
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.component.mjs +158 -0
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.mjs +20 -0
- package/esm2022/slide-in-bar/lib/slide-in-bar/slide-in-bar.service.mjs +26 -0
- package/esm2022/slide-in-bar/public-api.mjs +4 -0
- package/esm2022/slide-in-bar/seniorsistemas-angular-components-slide-in-bar.mjs +5 -0
- package/esm2022/stepper/lib/stepper/models/index.mjs +2 -0
- package/esm2022/stepper/lib/stepper/models/step-selection-event.mjs +2 -0
- package/esm2022/stepper/lib/stepper/models/step-state.mjs +7 -0
- package/esm2022/stepper/lib/stepper/models/step.mjs +2 -0
- package/esm2022/stepper/lib/stepper/stepper.component.mjs +138 -0
- package/esm2022/stepper/lib/stepper/stepper.module.mjs +19 -0
- package/esm2022/stepper/public-api.mjs +4 -0
- package/esm2022/stepper/seniorsistemas-angular-components-stepper.mjs +5 -0
- package/esm2022/table/lib/table/table-column/models/dynamic-editable-grid.interface.mjs +1 -1
- package/esm2022/text-area-ia/public-api.mjs +23 -3
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +3 -3
- package/esm2022/topbar/lib/topbar/topbar.component.mjs +65 -0
- package/esm2022/topbar/lib/topbar/topbar.module.mjs +20 -0
- package/esm2022/topbar/public-api.mjs +3 -0
- package/esm2022/topbar/seniorsistemas-angular-components-topbar.mjs +5 -0
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +7 -5
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-common-deprecated-selector.mjs +42 -0
- package/fesm2022/seniorsistemas-angular-components-common-deprecated-selector.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-common.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-common.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs +299 -0
- package/fesm2022/seniorsistemas-angular-components-content-generator.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-control-errors.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +95 -71
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +882 -2554
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +361 -0
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-file-upload.mjs +14 -330
- package/fesm2022/seniorsistemas-angular-components-file-upload.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-ia-insight.mjs +23 -260
- package/fesm2022/seniorsistemas-angular-components-ia-insight.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +20 -21
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-insights.mjs +287 -0
- package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs +39 -0
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-product-header.mjs +23 -61
- package/fesm2022/seniorsistemas-angular-components-product-header.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs +202 -0
- package/fesm2022/seniorsistemas-angular-components-slide-in-bar.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs +166 -0
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-text-area-ia.mjs +23 -268
- package/fesm2022/seniorsistemas-angular-components-text-area-ia.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs +88 -0
- package/fesm2022/seniorsistemas-angular-components-topbar.mjs.map +1 -0
- package/{slide-panel → file-picker}/index.d.ts +1 -1
- package/file-picker/lib/file-picker/file-picker.component.d.ts +81 -0
- package/{file-upload/lib/file-upload/file-upload.module.d.ts → file-picker/lib/file-picker/file-picker.module.d.ts} +5 -5
- package/{file-upload/lib/file-upload/file-upload.service.d.ts → file-picker/lib/file-picker/file-picker.service.d.ts} +3 -3
- package/file-picker/lib/file-picker/models/file-picker-permissions.d.ts +2 -0
- package/file-picker/public-api.d.ts +7 -0
- package/file-upload/README.md +45 -0
- package/file-upload/public-api.d.ts +25 -6
- package/ia-insight/public-api.d.ts +32 -3
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-content-generator/inline-edit-content-generator.component.d.ts +13 -0
- package/inline-edit/lib/inline-edit/components/index.d.ts +1 -1
- package/inline-edit/lib/inline-edit/fields/index.d.ts +2 -2
- package/inline-edit/lib/inline-edit/fields/inline-edit-content-generator-field.d.ts +6 -0
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +3 -3
- package/inline-edit/public-api.d.ts +2 -2
- package/insights/index.d.ts +5 -0
- package/insights/lib/insights/components/insights-card/components/index.d.ts +1 -0
- package/insights/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.d.ts +5 -0
- package/{ia-insight/lib/ia-insight/components/ia-insight-card/ia-insight-card.component.d.ts → insights/lib/insights/components/insights-card/insights-card.component.d.ts} +5 -5
- package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +21 -0
- package/insights/lib/insights/insights.component.d.ts +30 -0
- package/insights/lib/insights/insights.module.d.ts +17 -0
- package/insights/lib/insights/models/index.d.ts +2 -0
- package/{ia-insight/lib/ia-insight/models/ia-insight-item.d.ts → insights/lib/insights/models/insights-item.d.ts} +1 -1
- package/insights/lib/insights/models/insights-template-types.d.ts +1 -0
- package/insights/public-api.d.ts +3 -0
- package/optional-fields/editor/editor-field/editor-field.component.d.ts +10 -0
- package/optional-fields/editor/editor-field.d.ts +17 -0
- package/optional-fields/editor/index.d.ts +5 -0
- package/optional-fields/editor/public-api.d.ts +1 -0
- package/package.json +62 -25
- package/product-header/public-api.d.ts +21 -2
- package/slide-in-bar/index.d.ts +5 -0
- package/slide-in-bar/lib/slide-in-bar/slide-in-bar.component.d.ts +33 -0
- package/slide-in-bar/lib/slide-in-bar/slide-in-bar.module.d.ts +8 -0
- package/{slide-panel/lib/slide-panel/slide-panel.service.d.ts → slide-in-bar/lib/slide-in-bar/slide-in-bar.service.d.ts} +3 -3
- package/slide-in-bar/public-api.d.ts +3 -0
- package/stepper/index.d.ts +5 -0
- package/stepper/lib/stepper/models/index.d.ts +3 -0
- package/stepper/lib/stepper/models/step-selection-event.d.ts +6 -0
- package/stepper/lib/stepper/models/step-state.d.ts +5 -0
- package/stepper/lib/stepper/models/step.d.ts +11 -0
- package/stepper/lib/stepper/stepper.component.d.ts +20 -0
- package/stepper/lib/stepper/stepper.module.d.ts +9 -0
- package/stepper/public-api.d.ts +3 -0
- package/styles.css +9 -1
- package/table/lib/table/table-column/models/dynamic-editable-grid.interface.d.ts +2 -2
- package/text-area-ia/public-api.d.ts +21 -2
- package/{steps → topbar}/index.d.ts +1 -1
- package/topbar/lib/topbar/topbar.component.d.ts +16 -0
- package/topbar/lib/topbar/topbar.module.d.ts +10 -0
- package/topbar/public-api.d.ts +2 -0
- package/dynamic-form/lib/dynamic-form/components/grid/row/row.component.d.ts +0 -15
- package/dynamic-form/lib/dynamic-form/components/structure/base-structure-component.d.ts +0 -8
- package/dynamic-form/lib/dynamic-form/components/structure/fieldset/fieldset.component.d.ts +0 -12
- package/dynamic-form/lib/dynamic-form/components/structure/section/section.component.d.ts +0 -14
- package/dynamic-form/lib/dynamic-form/configurations/dynamic-config.d.ts +0 -3
- package/dynamic-form/lib/dynamic-form/configurations/dynamic-type.d.ts +0 -24
- package/dynamic-form/lib/dynamic-form/configurations/grid/grid.d.ts +0 -14
- package/dynamic-form/lib/dynamic-form/configurations/grid/row.d.ts +0 -8
- package/dynamic-form/lib/dynamic-form/configurations/grid-type.d.ts +0 -3
- package/dynamic-form/lib/dynamic-form/configurations/structure/fieldset.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/configurations/structure/structure.d.ts +0 -14
- package/dynamic-form/lib/dynamic-form/configurations/structure-type.d.ts +0 -4
- package/dynamic-form/lib/dynamic-form/dynamic-form.component.d.ts +0 -19
- package/dynamic-form/lib/dynamic-form/dynamic-form.d.ts +0 -57
- package/dynamic-form/lib/dynamic-form/dynamic-form.module.d.ts +0 -83
- package/dynamic-form/lib/dynamic-form/form-field/configurations/field-size.d.ts +0 -7
- package/dynamic-form/lib/dynamic-form/form-field/configurations/field-type.d.ts +0 -32
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/autocomplete-field.d.ts +0 -30
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/bignumber-field.d.ts +0 -38
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/blob-field.d.ts +0 -43
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-field.d.ts +0 -29
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-switch-field.d.ts +0 -11
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/button-field.d.ts +0 -34
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +0 -45
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/checkbox-field.d.ts +0 -9
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/chips-field.d.ts +0 -24
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/currency-field.d.ts +0 -9
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/decimal-field.d.ts +0 -14
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/editor-field.d.ts +0 -18
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/field.d.ts +0 -96
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +0 -97
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/password-field.d.ts +0 -45
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/profile-picture.d.ts +0 -35
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/select-field.d.ts +0 -41
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/slider-field.d.ts +0 -32
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/star-rating-field.d.ts +0 -17
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-field.d.ts +0 -24
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-ia-field.d.ts +0 -26
- package/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-field.d.ts +0 -41
- package/dynamic-form/lib/dynamic-form/form-field/fields/base-field-component.d.ts +0 -32
- package/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/button-field/button-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/checkbox/checkbox-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/editor/editor-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/lookup/lookup-field.component.d.ts +0 -9
- package/dynamic-form/lib/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.d.ts +0 -9
- package/dynamic-form/lib/dynamic-form/form-field/fields/select/select-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/slider/slider-field.component.d.ts +0 -25
- package/dynamic-form/lib/dynamic-form/form-field/fields/star-rating/star-rating-field.component.d.ts +0 -10
- package/dynamic-form/lib/dynamic-form/form-field/fields/text-area/text-area-field.component.d.ts +0 -14
- package/dynamic-form/lib/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.d.ts +0 -9
- package/dynamic-form/lib/dynamic-form/form-field/form-field.d.ts +0 -192
- package/dynamic-form/lib/dynamic-form/services/dynamic-form-cache.d.ts +0 -12
- package/esm2022/dynamic-form/lib/dynamic-form/components/field-label/field-label.component.mjs +0 -20
- package/esm2022/dynamic-form/lib/dynamic-form/components/grid/row/row.component.mjs +0 -41
- package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/lookup.component.mjs +0 -643
- package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/types/default-filter.mjs +0 -2
- package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/types/label-options.mjs +0 -2
- package/esm2022/dynamic-form/lib/dynamic-form/components/structure/base-structure-component.mjs +0 -2
- package/esm2022/dynamic-form/lib/dynamic-form/components/structure/fieldset/fieldset.component.mjs +0 -27
- package/esm2022/dynamic-form/lib/dynamic-form/components/structure/section/section.component.mjs +0 -33
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/dynamic-config.mjs +0 -71
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/dynamic-type.mjs +0 -26
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid/grid.mjs +0 -14
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid/row.mjs +0 -10
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/grid-type.mjs +0 -5
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/fieldset.mjs +0 -10
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/section.mjs +0 -31
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure/structure.mjs +0 -9
- package/esm2022/dynamic-form/lib/dynamic-form/configurations/structure-type.mjs +0 -6
- package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.component.mjs +0 -41
- package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.directive.mjs +0 -107
- package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.mjs +0 -189
- package/esm2022/dynamic-form/lib/dynamic-form/dynamic-form.module.mjs +0 -293
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/addon-config.mjs +0 -2
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/field-size.mjs +0 -13
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/field-type.mjs +0 -34
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/autocomplete-field.mjs +0 -24
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/bignumber-field.mjs +0 -37
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/blob-field.mjs +0 -31
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-field.mjs +0 -30
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/boolean-switch-field.mjs +0 -15
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/button-field.mjs +0 -47
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/calendar-field.mjs +0 -56
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/checkbox-field.mjs +0 -9
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/chips-field.mjs +0 -25
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/country-phone-picker-field.mjs +0 -15
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/currency-field.mjs +0 -14
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/decimal-field.mjs +0 -16
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/editor-field.mjs +0 -15
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/field.mjs +0 -64
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/lookup-field.mjs +0 -66
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/number-field.mjs +0 -38
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/password-field.mjs +0 -33
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/profile-picture.mjs +0 -35
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/radio-button-field.mjs +0 -27
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/select-field.mjs +0 -43
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/slider-field.mjs +0 -30
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/star-rating-field.mjs +0 -17
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-field.mjs +0 -30
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-area-ia-field.mjs +0 -32
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/configurations/fields/text-field.mjs +0 -38
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +0 -37
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/base-field-component.mjs +0 -22
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +0 -124
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-radio-field/boolean-field.component.mjs +0 -27
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/boolean/boolean-switch-field/boolean-switch-field.component.mjs +0 -23
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/button-field/button-field.component.mjs +0 -31
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +0 -118
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/checkbox/checkbox-field.component.mjs +0 -21
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/chips/chips-field.component.mjs +0 -59
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/country-phone-picker/country-phone-picker-field.component.mjs +0 -29
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/currency/currency-field.component.mjs +0 -100
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/editor/editor-field.component.mjs +0 -23
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/file-upload/file-upload-field.component.mjs +0 -56
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +0 -23
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/number/number-field.component.mjs +0 -121
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/password/password-field.component.mjs +0 -75
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/profile-picture/profile-picture-field.component.mjs +0 -22
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/radio-button/radio-button-field.component.mjs +0 -52
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/select/select-field.component.mjs +0 -24
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/slider/slider-field.component.mjs +0 -103
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/star-rating/star-rating-field.component.mjs +0 -25
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text/text-field.component.mjs +0 -88
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text-area/text-area-field.component.mjs +0 -29
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/fields/text-area-ia/text-area-ia-field.component.mjs +0 -22
- package/esm2022/dynamic-form/lib/dynamic-form/form-field/form-field.mjs +0 -243
- package/esm2022/dynamic-form/lib/dynamic-form/services/dynamic-form-cache.mjs +0 -150
- package/esm2022/file-upload/lib/file-upload/file-upload.component.mjs +0 -293
- package/esm2022/ia-insight/lib/ia-insight/components/ia-insight-card/components/ia-insight-card-loader/ia-insight-card-loader.component.mjs +0 -13
- package/esm2022/ia-insight/lib/ia-insight/components/ia-insight-card/ia-insight-card.component.mjs +0 -94
- package/esm2022/ia-insight/lib/ia-insight/components/ia-insight-sidebar/ia-insight-sidebar.component.mjs +0 -59
- package/esm2022/ia-insight/lib/ia-insight/ia-insight.component.mjs +0 -68
- package/esm2022/ia-insight/lib/ia-insight/ia-insight.module.mjs +0 -47
- package/esm2022/ia-insight/lib/ia-insight/models/ia-insight-item.mjs +0 -2
- package/esm2022/ia-insight/lib/ia-insight/models/ia-insight-template-types.mjs +0 -2
- package/esm2022/ia-insight/lib/ia-insight/models/index.mjs +0 -2
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text-area-ia/inline-edit-text-area-ia.component.mjs +0 -32
- package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-text-area-ia-field.mjs +0 -7
- package/esm2022/product-header/lib/product-header/product-header.component.mjs +0 -44
- package/esm2022/product-header/lib/product-header/product-header.module.mjs +0 -20
- package/esm2022/slide-panel/lib/slide-panel/slide-panel.component.mjs +0 -137
- package/esm2022/slide-panel/lib/slide-panel/slide-panel.module.mjs +0 -20
- package/esm2022/slide-panel/lib/slide-panel/slide-panel.service.mjs +0 -26
- package/esm2022/slide-panel/public-api.mjs +0 -4
- package/esm2022/steps/lib/steps/steps.component.mjs +0 -122
- package/esm2022/steps/lib/steps/steps.module.mjs +0 -19
- package/esm2022/steps/public-api.mjs +0 -3
- package/esm2022/steps/seniorsistemas-angular-components-steps.mjs +0 -5
- package/esm2022/text-area-ia/lib/services/IAssist/iassist.service.mjs +0 -77
- package/esm2022/text-area-ia/lib/services/IAssist/models/iassist-input-data.mjs +0 -3
- package/esm2022/text-area-ia/lib/services/IAssist/models/iassist-response.mjs +0 -3
- package/esm2022/text-area-ia/lib/text-area-ia/text-area-ia.component.mjs +0 -150
- package/esm2022/text-area-ia/lib/text-area-ia/text-area-ia.module.mjs +0 -50
- package/fesm2022/seniorsistemas-angular-components-slide-panel.mjs +0 -182
- package/fesm2022/seniorsistemas-angular-components-slide-panel.mjs.map +0 -1
- package/fesm2022/seniorsistemas-angular-components-steps.mjs +0 -145
- package/fesm2022/seniorsistemas-angular-components-steps.mjs.map +0 -1
- package/file-upload/lib/file-upload/file-upload.component.d.ts +0 -80
- package/file-upload/lib/file-upload/models/file-upload-permissions.d.ts +0 -2
- package/ia-insight/lib/ia-insight/components/ia-insight-card/components/ia-insight-card-loader/ia-insight-card-loader.component.d.ts +0 -5
- package/ia-insight/lib/ia-insight/components/ia-insight-sidebar/ia-insight-sidebar.component.d.ts +0 -21
- package/ia-insight/lib/ia-insight/ia-insight.component.d.ts +0 -29
- package/ia-insight/lib/ia-insight/ia-insight.module.d.ts +0 -17
- package/ia-insight/lib/ia-insight/models/ia-insight-template-types.d.ts +0 -1
- package/ia-insight/lib/ia-insight/models/index.d.ts +0 -2
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-text-area-ia/inline-edit-text-area-ia.component.d.ts +0 -13
- package/inline-edit/lib/inline-edit/fields/inline-edit-text-area-ia-field.d.ts +0 -6
- package/product-header/lib/product-header/product-header.component.d.ts +0 -15
- package/product-header/lib/product-header/product-header.module.d.ts +0 -10
- package/slide-panel/lib/slide-panel/slide-panel.component.d.ts +0 -32
- package/slide-panel/lib/slide-panel/slide-panel.module.d.ts +0 -8
- package/slide-panel/public-api.d.ts +0 -3
- package/steps/lib/steps/steps.component.d.ts +0 -36
- package/steps/lib/steps/steps.module.d.ts +0 -9
- package/steps/public-api.d.ts +0 -2
- package/text-area-ia/lib/text-area-ia/text-area-ia.module.d.ts +0 -15
- /package/{text-area-ia → content-generator}/lib/services/IAssist/iassist.service.d.ts +0 -0
- /package/{text-area-ia → content-generator}/lib/services/IAssist/models/iassist-input-data.d.ts +0 -0
- /package/{text-area-ia → content-generator}/lib/services/IAssist/models/iassist-response.d.ts +0 -0
- /package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/types/default-filter.d.ts +0 -0
- /package/dynamic-form/{lib/dynamic-form → dynamic-form}/components/lookup/types/label-options.d.ts +0 -0
- /package/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/file-dto.d.ts +0 -0
- /package/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/list-blob-metadata.d.ts +0 -0
- /package/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/uploadError.d.ts +0 -0
- /package/{file-upload/lib/file-upload → file-picker/lib/file-picker}/models/validate-errors.d.ts +0 -0
|
@@ -578,7 +578,7 @@ export class SelectComponent {
|
|
|
578
578
|
useExisting: forwardRef(() => SelectComponent),
|
|
579
579
|
multi: true,
|
|
580
580
|
},
|
|
581
|
-
], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "isSelected"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
|
|
581
|
+
], viewQueries: [{ propertyName: "_containerDiv", first: true, predicate: ["containerDiv"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: SelectOptionComponent, selector: "s-select-option", inputs: ["id", "label", "multiple", "checkmark", "isGrouper", "isFocused", "isSelected"], outputs: ["isSelectedChange", "selected"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i5.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
|
|
582
582
|
}
|
|
583
583
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, decorators: [{
|
|
584
584
|
type: Component,
|
|
@@ -605,6 +605,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
605
605
|
useExisting: forwardRef(() => SelectComponent),
|
|
606
606
|
multi: true,
|
|
607
607
|
},
|
|
608
|
-
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
|
|
608
|
+
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
|
|
609
609
|
}], ctorParameters: () => [] });
|
|
610
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7QUFrRDNGLE1BQU0sT0FBTyxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRW5C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akIsZUFBZSwyRkFDZixhQUFhOzs0RkFnQ1IsZUFBZTtrQkEzQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0Msc0JBQXNCLEVBQUUsZUFBZTt3QkFDdkMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsaURBQWlEO3dCQUNyRSw4QkFBOEIsRUFBRSxvRUFBb0U7d0JBQ3BHLG1CQUFtQixFQUFFLGtDQUFrQzt3QkFDdkQsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CLGFBYVU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ3Nob3dPcHRpb25zKCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnXCJsaXN0Ym94XCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICdzaG93T3B0aW9ucygpID8gY29tcG9uZW50SWQgKyBcIi1saXN0Ym94XCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF0nOiAnZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkT3B0aW9ucygpW2ZvY3VzZWRJbmRleCgpXT8uaWQgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ3BsYWNlaG9sZGVyKCkgfHwgXCJTZWxlY3Qgb3B0aW9uXCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCB7XG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAuc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcbiAgICBwdWJsaWMgc2hvd09wdGlvbnMgPSBtb2RlbChmYWxzZSk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBzZWxlY3Qke1NlbGVjdENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcy5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgKGV4Y2x1aW5kbyBhZ3J1cGFkb3JlcykgZXN0aXZlcmVtIHByZXNlbnRlc1xuICAgICAqIG5hIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLCBlIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy52YWx1ZXMoKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmlkKTtcblxuICAgICAgICBjb25zdCByZXQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhvcHRpb24uaWQpKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmF0KHRoaXMuZm9jdXNlZEluZGV4KCkpPy5kYXRhID8/IG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmRzX3NlbGVjdGVkYCwge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2VsZWN0ZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkWzBdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQgPyB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWQuZGF0YSkgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzZSBvIHNlbGV0b3IgZXN0w6EgXCJsaW1wb1wiLCBvdSBzZWphLCBzZW0gbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZXNgIGVzdMOhIHZhemlvKS5cbiAgICAgKiAtIE5vIG1vZG8gc2ltcGxlcywgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZWAgw6kgZmFsc3kpLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBzZWxlw6fDo28sIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NsZWFuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSgpID8gIXRoaXMudmFsdWVzKCkubGVuZ3RoIDogIXRoaXMudmFsdWUoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIFwiU2VsZWNpb25hciBUb2Rvc1wiIGVzdMOhIGluZGV0ZXJtaW5hZG8uXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgcXVhbmRvIG5lbSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgZXN0w6NvIHNlbGVjaW9uYWRvcyBlIG5lbSB0b2RvcyBlc3TDo28gZGVzbWFyY2Fkb3MsXG4gICAgICogb3Ugc2VqYSwgcXVhbmRvIGjDoSB1bWEgc2VsZcOnw6NvIHBhcmNpYWwgZG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIGEgc2VsZcOnw6NvIGZvciBwYXJjaWFsLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpLnNvbWUoKG8pID0+IG8uaWQgPT09IG9wdGlvbi5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3QgYWxsID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG4gICAgICAgIGNvbnN0IG5vbmUgPSBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+ICFzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcblxuICAgICAgICByZXR1cm4gIWFsbCAmJiAhbm9uZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcyBjb20gYmFzZSBubyB2YWxvciBkZSBidXNjYSAoYGZpbHRlclZhbHVlYCkgZSBub3MgY3JpdMOpcmlvcyBkZWZpbmlkb3MuXG4gICAgICogLSBTZSBvIGZpbHRybyBlc3RpdmVyIGRlc2FiaWxpdGFkbyBvdSBvIHZhbG9yIGRlIGJ1c2NhIGVzdGl2ZXIgdmF6aW8sIHJldG9ybmEgdG9kYXMgYXMgb3DDp8O1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGZpbHRyYSBhcyBvcMOnw7VlcyB1dGlsaXphbmRvIG8ocykgY2FtcG8ocykgZXNwZWNpZmljYWRvKHMpIGVtIGBmaWx0ZXJCeWAuXG4gICAgICogLSBJZ25vcmEgb3DDp8O1ZXMgcXVlIHBvc3N1ZW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcmAgZGVmaW5pZGEuXG4gICAgICogQHJldHVybnMgQXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbmZvcm1lIG8gdmFsb3IgZGUgYnVzY2EgZSBjcml0w6lyaW9zIGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5maWx0ZXJWYWx1ZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIoKSB8fCAhc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5maWx0ZXJCeSgpO1xuICAgICAgICByZXR1cm4gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSAnJztcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbi5kYXRhW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckJ5KSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gZmlsdGVyQnkubWFwKChieSkgPT4gU3RyaW5nKG9wdGlvbi5kYXRhW2J5XSA/PyAnJykpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBTdHJpbmcob3B0aW9uLmRhdGFbZmlsdGVyQnldID8/ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXA8eyBmaWx0ZXI6IEZvcm1Db250cm9sPHN0cmluZz4gfT4oe1xuICAgICAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRGl2ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyRGl2Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gdmFsb3Igc2VsZWNpb25hZG8gZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogQHBhcmFtIHZhbHVlIE8gdmFsb3IgYSBzZXIgZGVmaW5pZG8uIFBvZGUgc2VyIHVtIG9iamV0byBkbyB0aXBvIGBUYCwgdW0gYXJyYXkgZGUgYFRgIChxdWFuZG8gbcO6bHRpcGxhIHNlbGXDp8OjbyBlc3TDoSBoYWJpbGl0YWRhKSwgb3UgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBvIHZhbG9yIG7Do28gZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBkZXNhdGl2YWRvIGUgbyB2YWxvciBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBtYXBlaWEgbyhzKSB2YWxvcihlcykgZm9ybmVjaWRvKHMpIHBhcmEgYXMgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gY29tcG9uZW50ZSxcbiAgICAgKiBnYXJhbnRpbmRvIHF1ZSBhcGVuYXMgb3DDp8O1ZXMgdsOhbGlkYXMgc2VqYW0gc2VsZWNpb25hZGFzIGNvbmZvcm1lIG8gbW9kbyBkZSBzZWxlw6fDo28gKMO6bmljbyBvdSBtw7psdGlwbG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKTogb3B0aW9uIGlzIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gPT4gISFvcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhbiBhcnJheSB3aGVuIFwibXVsdGlwbGVcIiBpcyB0cnVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBcIm11bHRpcGxlXCIgaXMgZmFsc2UuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uZGF0YVtvcHRpb25WYWx1ZV0gPT09IHZhbHVlW29wdGlvblZhbHVlXSkgPz8gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSA/P1xuICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChtYXBwZWQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSByZWNlYmUgbyBub3ZvIHZhbG9yIHNlbGVjaW9uYWRvIG91IG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogVCB8IFRbXSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvIChwZXJkZXIgbyBmb2NvKS5cbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGV4ZWN1dGFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciBtYXJjYWRvIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIHJlYWxpemEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBpbnZlcnRlIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3VsZE9wZW4gPSAhdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gZGlyZXRpdmFzICpuZ0ZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIFBhcmEgY2FkYSBpdGVtIG5vIGFycmF5IGRlIG9ww6fDtWVzLCBnZXJhIHVtIG9iamV0byBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbmAgY29udGVuZG8gbyBkYWRvIG9yaWdpbmFsXG4gICAgICogZSB1bSBjYW1wbyBgaWRgIMO6bmljbyBiYXNlYWRvIG5vIHRpbWVzdGFtcCBhdHVhbCBlIG5vIMOtbmRpY2UgZG8gaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwb1xuICAgICAqIChkZXRlY3RhZG8gcGVsYSBwcmVzZW7Dp2EgZGUgdW0gYXJyYXkgYGl0ZW1zYCksIGFkaWNpb25hIHRhbWLDqW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBvcMOnw7VlcyBkbyB0aXBvIGBUYCBhIHNlcmVtIHByb2Nlc3NhZGFzLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvT3B0aW9ucyhvcHRpb25zOiBUW10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAoKSAmJiBBcnJheS5pc0FycmF5KChvcHRpb24gYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgICAgICAgICBncm91cGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVszcHhdIGJvcmRlciBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5IGZvY3VzOm91dGxpbmVcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYm9yZGVyLWdyYXlzY2FsZS0yMCBiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1hdXRvIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICB9XCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtb3duc109XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImNvbXBvbmVudElkICsgJy1sYWJlbCdcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgKGNsaWNrKT1cIm9uQ29udGFpbmVyRGl2Q2xpY2soKVwiXG4gICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgIHRhYmluZGV4PVwiMFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC0zIHB5LVs3cHhdXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCkgJiYgIWlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCc6ICFkaXNhYmxlZCgpICYmIGlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1sIHB4LTMgZ3JvdXAtaG92ZXI6YmctZ3JheXNjYWxlLTEwIGdyb3VwLWZvY3VzOmJvcmRlci1wcmltYXJ5XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRpc2FibGVkKCksICdib3JkZXItZ3JheXNjYWxlLTMwJzogIWRpc2FibGVkKCkgfVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ2ZhLWNhcmV0LWRvd24nOiAhc2hvd09wdGlvbnMoKSxcbiAgICAgICAgICAgICAgICAnZmEtY2FyZXQtdXAnOiBzaG93T3B0aW9ucygpLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L2k+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2Ryb3Bkb3duVGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInNob3dPcHRpb25zKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgKGRldGFjaCk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgID5cbiAgICAgICAgQGlmIChmaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMyBweC0zIHB5LTEuNVwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdEFsbENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLVszNXB4XSBncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBhYnNvbHV0ZSByaWdodC0yLjUgdG9wLTIuNSB0ZXh0LWdyYXlzY2FsZS05MFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IC0tPlxuICAgICAgICBAaWYgKCF2aXJ0dWFsU2Nyb2xsKCkgfHwgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIDw9IDEwKSB7XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZSgpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubm9fcmVjb3Jkc19mb3VuZCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7QUFrRDNGLE1BQU0sT0FBTyxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRW5C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akIsZUFBZSwyRkFDZixhQUFhOzs0RkFnQ1IsZUFBZTtrQkEzQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0Msc0JBQXNCLEVBQUUsZUFBZTt3QkFDdkMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsaURBQWlEO3dCQUNyRSw4QkFBOEIsRUFBRSxvRUFBb0U7d0JBQ3BHLG1CQUFtQixFQUFFLGtDQUFrQzt3QkFDdkQsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CLGFBYVU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ3Nob3dPcHRpb25zKCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnXCJsaXN0Ym94XCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICdzaG93T3B0aW9ucygpID8gY29tcG9uZW50SWQgKyBcIi1saXN0Ym94XCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF0nOiAnZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkT3B0aW9ucygpW2ZvY3VzZWRJbmRleCgpXT8uaWQgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ3BsYWNlaG9sZGVyKCkgfHwgXCJTZWxlY3Qgb3B0aW9uXCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCB7XG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAuc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcbiAgICBwdWJsaWMgc2hvd09wdGlvbnMgPSBtb2RlbChmYWxzZSk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBzZWxlY3Qke1NlbGVjdENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcy5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgKGV4Y2x1aW5kbyBhZ3J1cGFkb3JlcykgZXN0aXZlcmVtIHByZXNlbnRlc1xuICAgICAqIG5hIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLCBlIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy52YWx1ZXMoKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmlkKTtcblxuICAgICAgICBjb25zdCByZXQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhvcHRpb24uaWQpKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmF0KHRoaXMuZm9jdXNlZEluZGV4KCkpPy5kYXRhID8/IG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmRzX3NlbGVjdGVkYCwge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2VsZWN0ZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkWzBdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQgPyB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWQuZGF0YSkgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzZSBvIHNlbGV0b3IgZXN0w6EgXCJsaW1wb1wiLCBvdSBzZWphLCBzZW0gbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZXNgIGVzdMOhIHZhemlvKS5cbiAgICAgKiAtIE5vIG1vZG8gc2ltcGxlcywgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZWAgw6kgZmFsc3kpLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBzZWxlw6fDo28sIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NsZWFuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSgpID8gIXRoaXMudmFsdWVzKCkubGVuZ3RoIDogIXRoaXMudmFsdWUoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIFwiU2VsZWNpb25hciBUb2Rvc1wiIGVzdMOhIGluZGV0ZXJtaW5hZG8uXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgcXVhbmRvIG5lbSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgZXN0w6NvIHNlbGVjaW9uYWRvcyBlIG5lbSB0b2RvcyBlc3TDo28gZGVzbWFyY2Fkb3MsXG4gICAgICogb3Ugc2VqYSwgcXVhbmRvIGjDoSB1bWEgc2VsZcOnw6NvIHBhcmNpYWwgZG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIGEgc2VsZcOnw6NvIGZvciBwYXJjaWFsLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpLnNvbWUoKG8pID0+IG8uaWQgPT09IG9wdGlvbi5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3QgYWxsID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG4gICAgICAgIGNvbnN0IG5vbmUgPSBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+ICFzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcblxuICAgICAgICByZXR1cm4gIWFsbCAmJiAhbm9uZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcyBjb20gYmFzZSBubyB2YWxvciBkZSBidXNjYSAoYGZpbHRlclZhbHVlYCkgZSBub3MgY3JpdMOpcmlvcyBkZWZpbmlkb3MuXG4gICAgICogLSBTZSBvIGZpbHRybyBlc3RpdmVyIGRlc2FiaWxpdGFkbyBvdSBvIHZhbG9yIGRlIGJ1c2NhIGVzdGl2ZXIgdmF6aW8sIHJldG9ybmEgdG9kYXMgYXMgb3DDp8O1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGZpbHRyYSBhcyBvcMOnw7VlcyB1dGlsaXphbmRvIG8ocykgY2FtcG8ocykgZXNwZWNpZmljYWRvKHMpIGVtIGBmaWx0ZXJCeWAuXG4gICAgICogLSBJZ25vcmEgb3DDp8O1ZXMgcXVlIHBvc3N1ZW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcmAgZGVmaW5pZGEuXG4gICAgICogQHJldHVybnMgQXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbmZvcm1lIG8gdmFsb3IgZGUgYnVzY2EgZSBjcml0w6lyaW9zIGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5maWx0ZXJWYWx1ZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIoKSB8fCAhc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5maWx0ZXJCeSgpO1xuICAgICAgICByZXR1cm4gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSAnJztcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbi5kYXRhW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckJ5KSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gZmlsdGVyQnkubWFwKChieSkgPT4gU3RyaW5nKG9wdGlvbi5kYXRhW2J5XSA/PyAnJykpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBTdHJpbmcob3B0aW9uLmRhdGFbZmlsdGVyQnldID8/ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXA8eyBmaWx0ZXI6IEZvcm1Db250cm9sPHN0cmluZz4gfT4oe1xuICAgICAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRGl2ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyRGl2Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gdmFsb3Igc2VsZWNpb25hZG8gZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogQHBhcmFtIHZhbHVlIE8gdmFsb3IgYSBzZXIgZGVmaW5pZG8uIFBvZGUgc2VyIHVtIG9iamV0byBkbyB0aXBvIGBUYCwgdW0gYXJyYXkgZGUgYFRgIChxdWFuZG8gbcO6bHRpcGxhIHNlbGXDp8OjbyBlc3TDoSBoYWJpbGl0YWRhKSwgb3UgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBvIHZhbG9yIG7Do28gZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBkZXNhdGl2YWRvIGUgbyB2YWxvciBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBtYXBlaWEgbyhzKSB2YWxvcihlcykgZm9ybmVjaWRvKHMpIHBhcmEgYXMgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gY29tcG9uZW50ZSxcbiAgICAgKiBnYXJhbnRpbmRvIHF1ZSBhcGVuYXMgb3DDp8O1ZXMgdsOhbGlkYXMgc2VqYW0gc2VsZWNpb25hZGFzIGNvbmZvcm1lIG8gbW9kbyBkZSBzZWxlw6fDo28gKMO6bmljbyBvdSBtw7psdGlwbG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKTogb3B0aW9uIGlzIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gPT4gISFvcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhbiBhcnJheSB3aGVuIFwibXVsdGlwbGVcIiBpcyB0cnVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBcIm11bHRpcGxlXCIgaXMgZmFsc2UuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uZGF0YVtvcHRpb25WYWx1ZV0gPT09IHZhbHVlW29wdGlvblZhbHVlXSkgPz8gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSA/P1xuICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChtYXBwZWQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSByZWNlYmUgbyBub3ZvIHZhbG9yIHNlbGVjaW9uYWRvIG91IG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogVCB8IFRbXSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvIChwZXJkZXIgbyBmb2NvKS5cbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGV4ZWN1dGFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciBtYXJjYWRvIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIHJlYWxpemEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBpbnZlcnRlIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3VsZE9wZW4gPSAhdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gZGlyZXRpdmFzICpuZ0ZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIFBhcmEgY2FkYSBpdGVtIG5vIGFycmF5IGRlIG9ww6fDtWVzLCBnZXJhIHVtIG9iamV0byBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbmAgY29udGVuZG8gbyBkYWRvIG9yaWdpbmFsXG4gICAgICogZSB1bSBjYW1wbyBgaWRgIMO6bmljbyBiYXNlYWRvIG5vIHRpbWVzdGFtcCBhdHVhbCBlIG5vIMOtbmRpY2UgZG8gaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwb1xuICAgICAqIChkZXRlY3RhZG8gcGVsYSBwcmVzZW7Dp2EgZGUgdW0gYXJyYXkgYGl0ZW1zYCksIGFkaWNpb25hIHRhbWLDqW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBvcMOnw7VlcyBkbyB0aXBvIGBUYCBhIHNlcmVtIHByb2Nlc3NhZGFzLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvT3B0aW9ucyhvcHRpb25zOiBUW10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAoKSAmJiBBcnJheS5pc0FycmF5KChvcHRpb24gYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgICAgICAgICBncm91cGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVszcHhdIGJvcmRlciBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5IGZvY3VzOm91dGxpbmVcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYm9yZGVyLWdyYXlzY2FsZS0yMCBiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1hdXRvIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICB9XCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtb3duc109XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImNvbXBvbmVudElkICsgJy1sYWJlbCdcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgKGNsaWNrKT1cIm9uQ29udGFpbmVyRGl2Q2xpY2soKVwiXG4gICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgIHRhYmluZGV4PVwiMFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC0zIHB5LVs3cHhdXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCkgJiYgIWlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCc6ICFkaXNhYmxlZCgpICYmIGlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1sIHB4LTMgZ3JvdXAtaG92ZXI6YmctZ3JheXNjYWxlLTEwIGdyb3VwLWZvY3VzOmJvcmRlci1wcmltYXJ5XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRpc2FibGVkKCksICdib3JkZXItZ3JheXNjYWxlLTMwJzogIWRpc2FibGVkKCkgfVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ2ZhLWNhcmV0LWRvd24nOiAhc2hvd09wdGlvbnMoKSxcbiAgICAgICAgICAgICAgICAnZmEtY2FyZXQtdXAnOiBzaG93T3B0aW9ucygpLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L2k+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2Ryb3Bkb3duVGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInNob3dPcHRpb25zKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgKGRldGFjaCk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgID5cbiAgICAgICAgQGlmIChmaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMyBweC0zIHB5LTEuNVwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdEFsbENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLVszNXB4XSBncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBhYnNvbHV0ZSByaWdodC0yLjUgdG9wLTIuNSB0ZXh0LWdyYXlzY2FsZS05MFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IC0tPlxuICAgICAgICBAaWYgKCF2aXJ0dWFsU2Nyb2xsKCkgfHwgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIDw9IDEwKSB7XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZSgpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubm9fcmVjb3Jkc19mb3VuZCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { animate, state, style, transition, trigger } from "@angular/animations";
|
|
2
|
+
import { Component, EventEmitter, HostListener, Input, Output } from "@angular/core";
|
|
3
|
+
import { DEPRECATED_CONFIG } from '@seniorsistemas/angular-components/common/deprecated-selector';
|
|
4
|
+
import { DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
import { takeUntil } from "rxjs/operators";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "./slide-in-bar.service";
|
|
9
|
+
import * as i2 from "@seniorsistemas/angular-components/common/deprecated-selector";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
const SMALL_DEVICE_BREAKPOINT = 420;
|
|
12
|
+
export class SlideInBarComponent {
|
|
13
|
+
slidePanelService;
|
|
14
|
+
static nextId = 0;
|
|
15
|
+
id = `slide-panel-${++SlideInBarComponent.nextId}`;
|
|
16
|
+
openIcon = "fas fa-chevron-right";
|
|
17
|
+
closeIcon = "fas fa-chevron-left";
|
|
18
|
+
cache = false;
|
|
19
|
+
createOpen = false;
|
|
20
|
+
noOverlap = false;
|
|
21
|
+
panelOpened = new EventEmitter();
|
|
22
|
+
panelClosed = new EventEmitter();
|
|
23
|
+
isOpen = false;
|
|
24
|
+
isSlideOver = false;
|
|
25
|
+
isAnimating = false;
|
|
26
|
+
isContentAnimationDisabled = true;
|
|
27
|
+
_unsubscribe$ = new Subject();
|
|
28
|
+
onResize() {
|
|
29
|
+
this._checkOverBehavior();
|
|
30
|
+
}
|
|
31
|
+
constructor(slidePanelService) {
|
|
32
|
+
this.slidePanelService = slidePanelService;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this._checkOverBehavior();
|
|
36
|
+
this.slidePanelService.createSlidePanel(this.id)
|
|
37
|
+
.pipe(takeUntil(this._unsubscribe$))
|
|
38
|
+
.subscribe(() => {
|
|
39
|
+
this.isOpen = false;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
ngAfterViewInit() {
|
|
43
|
+
queueMicrotask(() => {
|
|
44
|
+
if (this.createOpen) {
|
|
45
|
+
this.isOpen = true;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
ngAfterViewChecked() {
|
|
50
|
+
return;
|
|
51
|
+
// to executed at a safe time prior to control returning to the browser's event loop
|
|
52
|
+
// queueMicrotask(() => {
|
|
53
|
+
// this._calculateSlideHeight();
|
|
54
|
+
// this.isContentAnimationDisabled = false;
|
|
55
|
+
// });
|
|
56
|
+
}
|
|
57
|
+
ngOnDestroy() {
|
|
58
|
+
this._unsubscribe$.next();
|
|
59
|
+
this._unsubscribe$.complete();
|
|
60
|
+
}
|
|
61
|
+
onClickButton() {
|
|
62
|
+
if (this.isAnimating) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.isOpen = !this.isOpen;
|
|
66
|
+
if (this.isOpen) {
|
|
67
|
+
this.panelOpened.emit();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.panelClosed.emit();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
onContentAnimationStart() {
|
|
74
|
+
this.isAnimating = true;
|
|
75
|
+
}
|
|
76
|
+
onContentAnimationDone() {
|
|
77
|
+
this.isAnimating = false;
|
|
78
|
+
}
|
|
79
|
+
_checkOverBehavior() {
|
|
80
|
+
this.isSlideOver = window.innerWidth <= SMALL_DEVICE_BREAKPOINT;
|
|
81
|
+
}
|
|
82
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SlideInBarComponent, deps: [{ token: i1.SlideInBarService }], target: i0.ɵɵFactoryTarget.Component });
|
|
83
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SlideInBarComponent, selector: "s-slide-in-bar, s-slide-panel", inputs: { id: "id", openIcon: "openIcon", closeIcon: "closeIcon", cache: "cache", createOpen: "createOpen", noOverlap: "noOverlap" }, outputs: { panelOpened: "panelOpened", panelClosed: "panelClosed" }, host: { listeners: { "window:resize": "onResize()" } }, providers: [
|
|
84
|
+
{
|
|
85
|
+
provide: DEPRECATED_CONFIG,
|
|
86
|
+
useValue: {
|
|
87
|
+
oldSelector: 's-slide-panel',
|
|
88
|
+
newSelector: 's-slide-in-bar',
|
|
89
|
+
removalVersion: '20.0.0',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
], hostDirectives: [{ directive: i2.DeprecatedSelectorDirective }], ngImport: i0, template: "<div class=\"slide-in-bar\">\n <div\n class=\"slide-content\"\n [ngClass]=\"{\n 'slide-content--closed': !isOpen,\n 'slide-content--over': isSlideOver,\n 'slide-content--no-overlap': noOverlap,\n }\"\n >\n <div\n #mainContainer\n class=\"main-container\"\n >\n @if (cache) {\n <div\n class=\"content-container\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <ng-container [ngTemplateOutlet]=\"slideContentTemplate\"></ng-container>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content-container\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <ng-container [ngTemplateOutlet]=\"slideContentTemplate\"></ng-container>\n </div>\n }\n }\n </div>\n <button\n class=\"button\"\n [ngClass]=\"isOpen ? closeIcon : openIcon\"\n (click)=\"onClickButton()\"\n ></button>\n </div>\n <div\n class=\"side-content\"\n >\n <ng-content select=\"[side-content]\"></ng-content>\n </div>\n</div>\n\n<ng-template #slideContentTemplate>\n <ng-content select=\"[slide-content]\"></ng-content>\n</ng-template>\n", styles: [".slide-in-bar{display:flex;width:100%}.slide-in-bar .slide-content{display:flex;position:relative}.slide-in-bar .slide-content .main-container{background-color:#eeebf2;display:flex;border:1px solid #ccc;overflow:hidden;position:relative}.slide-in-bar .slide-content .main-container .content-container{overflow-y:auto;overflow-x:hidden;padding:16px}.slide-in-bar .slide-content .button{align-items:center;background-color:#eeebf2;border:1px solid #ccc;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;display:flex;font-family:\"Font Awesome 5 Pro\";font-size:16px;height:32px;justify-content:center;position:absolute;right:-32px;top:16px;width:32px;z-index:99}.slide-in-bar .slide-content--closed .main-container{border:none}.slide-in-bar .slide-content--over{position:absolute}.slide-in-bar .slide-content--no-overlap{margin-right:32px}.slide-in-bar .side-content{display:flex;height:max-content;overflow:auto;transition:width .1s linear}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
|
|
93
|
+
trigger("cachelessAnimation", [
|
|
94
|
+
transition(":enter", [
|
|
95
|
+
style({ width: "0" }),
|
|
96
|
+
animate("200ms linear", style({ width: "*" })),
|
|
97
|
+
]),
|
|
98
|
+
transition(":leave", [
|
|
99
|
+
style({ width: "*" }),
|
|
100
|
+
animate("200ms linear", style({ width: "0" })),
|
|
101
|
+
]),
|
|
102
|
+
]),
|
|
103
|
+
trigger("cacheAnimation", [
|
|
104
|
+
state("true", style({ width: "*", padding: '0 16px' })),
|
|
105
|
+
state("false", style({ width: '0px', padding: '0' })),
|
|
106
|
+
transition("* => *", animate("200ms")),
|
|
107
|
+
]),
|
|
108
|
+
] });
|
|
109
|
+
}
|
|
110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SlideInBarComponent, decorators: [{
|
|
111
|
+
type: Component,
|
|
112
|
+
args: [{ selector: "s-slide-in-bar, s-slide-panel", hostDirectives: [DeprecatedSelectorDirective], providers: [
|
|
113
|
+
{
|
|
114
|
+
provide: DEPRECATED_CONFIG,
|
|
115
|
+
useValue: {
|
|
116
|
+
oldSelector: 's-slide-panel',
|
|
117
|
+
newSelector: 's-slide-in-bar',
|
|
118
|
+
removalVersion: '20.0.0',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
], animations: [
|
|
122
|
+
trigger("cachelessAnimation", [
|
|
123
|
+
transition(":enter", [
|
|
124
|
+
style({ width: "0" }),
|
|
125
|
+
animate("200ms linear", style({ width: "*" })),
|
|
126
|
+
]),
|
|
127
|
+
transition(":leave", [
|
|
128
|
+
style({ width: "*" }),
|
|
129
|
+
animate("200ms linear", style({ width: "0" })),
|
|
130
|
+
]),
|
|
131
|
+
]),
|
|
132
|
+
trigger("cacheAnimation", [
|
|
133
|
+
state("true", style({ width: "*", padding: '0 16px' })),
|
|
134
|
+
state("false", style({ width: '0px', padding: '0' })),
|
|
135
|
+
transition("* => *", animate("200ms")),
|
|
136
|
+
]),
|
|
137
|
+
], template: "<div class=\"slide-in-bar\">\n <div\n class=\"slide-content\"\n [ngClass]=\"{\n 'slide-content--closed': !isOpen,\n 'slide-content--over': isSlideOver,\n 'slide-content--no-overlap': noOverlap,\n }\"\n >\n <div\n #mainContainer\n class=\"main-container\"\n >\n @if (cache) {\n <div\n class=\"content-container\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <ng-container [ngTemplateOutlet]=\"slideContentTemplate\"></ng-container>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content-container\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <ng-container [ngTemplateOutlet]=\"slideContentTemplate\"></ng-container>\n </div>\n }\n }\n </div>\n <button\n class=\"button\"\n [ngClass]=\"isOpen ? closeIcon : openIcon\"\n (click)=\"onClickButton()\"\n ></button>\n </div>\n <div\n class=\"side-content\"\n >\n <ng-content select=\"[side-content]\"></ng-content>\n </div>\n</div>\n\n<ng-template #slideContentTemplate>\n <ng-content select=\"[slide-content]\"></ng-content>\n</ng-template>\n", styles: [".slide-in-bar{display:flex;width:100%}.slide-in-bar .slide-content{display:flex;position:relative}.slide-in-bar .slide-content .main-container{background-color:#eeebf2;display:flex;border:1px solid #ccc;overflow:hidden;position:relative}.slide-in-bar .slide-content .main-container .content-container{overflow-y:auto;overflow-x:hidden;padding:16px}.slide-in-bar .slide-content .button{align-items:center;background-color:#eeebf2;border:1px solid #ccc;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;display:flex;font-family:\"Font Awesome 5 Pro\";font-size:16px;height:32px;justify-content:center;position:absolute;right:-32px;top:16px;width:32px;z-index:99}.slide-in-bar .slide-content--closed .main-container{border:none}.slide-in-bar .slide-content--over{position:absolute}.slide-in-bar .slide-content--no-overlap{margin-right:32px}.slide-in-bar .side-content{display:flex;height:max-content;overflow:auto;transition:width .1s linear}\n"] }]
|
|
138
|
+
}], ctorParameters: () => [{ type: i1.SlideInBarService }], propDecorators: { id: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], openIcon: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], closeIcon: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], cache: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], createOpen: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], noOverlap: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], panelOpened: [{
|
|
151
|
+
type: Output
|
|
152
|
+
}], panelClosed: [{
|
|
153
|
+
type: Output
|
|
154
|
+
}], onResize: [{
|
|
155
|
+
type: HostListener,
|
|
156
|
+
args: ["window:resize"]
|
|
157
|
+
}] } });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtaW4tYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zbGlkZS1pbi1iYXIvc3JjL2xpYi9zbGlkZS1pbi1iYXIvc2xpZGUtaW4tYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zbGlkZS1pbi1iYXIvc3JjL2xpYi9zbGlkZS1pbi1iYXIvc2xpZGUtaW4tYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdILFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDbEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDNUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSTNDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBbUNwQyxNQUFNLE9BQU8sbUJBQW1CO0lBd0NQO0lBdkNkLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBR2xCLEVBQUUsR0FBRyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7SUFHbkQsUUFBUSxHQUFHLHNCQUFzQixDQUFDO0lBR2xDLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztJQUdsQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBR2QsVUFBVSxHQUFH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RSxHQUFHLEVBQUUsQ0FBQztnQ0FDckIsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs2QkFDakQsQ0FBQzt5QkFDTCxDQUFDO3dCQUNGLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTs0QkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUN2RCxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7NEJBQ3JELFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUN6QyxDQUFDO3FCQUNMO3NGQU1NLEVBQUU7c0JBRFIsS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxXQUFXO3NCQURqQixNQUFNO2dCQUlBLFdBQVc7c0JBRGpCLE1BQU07Z0JBV0EsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgREVQUkVDQVRFRF9DT05GSUcgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NvbW1vbi9kZXByZWNhdGVkLXNlbGVjdG9yJztcbmltcG9ydCB7IERlcHJlY2F0ZWRTZWxlY3RvckRpcmVjdGl2ZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvY29tbW9uL2RlcHJlY2F0ZWQtc2VsZWN0b3InO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgU2xpZGVJbkJhclNlcnZpY2UgfSBmcm9tIFwiLi9zbGlkZS1pbi1iYXIuc2VydmljZVwiO1xuXG5jb25zdCBTTUFMTF9ERVZJQ0VfQlJFQUtQT0lOVCA9IDQyMDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwicy1zbGlkZS1pbi1iYXIsIHMtc2xpZGUtcGFuZWxcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3NsaWRlLWluLWJhci5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9zbGlkZS1pbi1iYXIuY29tcG9uZW50LnNjc3NcIl0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtEZXByZWNhdGVkU2VsZWN0b3JEaXJlY3RpdmVdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBERVBSRUNBVEVEX0NPTkZJRyxcbiAgICAgICAgICAgIHVzZVZhbHVlOiB7XG4gICAgICAgICAgICAgICAgb2xkU2VsZWN0b3I6ICdzLXNsaWRlLXBhbmVsJyxcbiAgICAgICAgICAgICAgICBuZXdTZWxlY3RvcjogJ3Mtc2xpZGUtaW4tYmFyJyxcbiAgICAgICAgICAgICAgICByZW1vdmFsVmVyc2lvbjogJzIwLjAuMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKFwiY2FjaGVsZXNzQW5pbWF0aW9uXCIsIFtcbiAgICAgICAgICAgIHRyYW5zaXRpb24oXCI6ZW50ZXJcIiwgW1xuICAgICAgICAgICAgICAgIHN0eWxlKHsgd2lkdGg6IFwiMFwiIH0pLFxuICAgICAgICAgICAgICAgIGFuaW1hdGUoXCIyMDBtcyBsaW5lYXJcIiwgc3R5bGUoeyB3aWR0aDogXCIqXCIgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKFwiOmxlYXZlXCIsIFtcbiAgICAgICAgICAgICAgICBzdHlsZSh7IHdpZHRoOiBcIipcIiB9KSxcbiAgICAgICAgICAgICAgICBhbmltYXRlKFwiMjAwbXMgbGluZWFyXCIsIHN0eWxlKHsgd2lkdGg6IFwiMFwiIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBdKSxcbiAgICAgICAgdHJpZ2dlcihcImNhY2hlQW5pbWF0aW9uXCIsIFtcbiAgICAgICAgICAgIHN0YXRlKFwidHJ1ZVwiLCBzdHlsZSh7IHdpZHRoOiBcIipcIiwgcGFkZGluZzogJzAgMTZweCcgfSkpLFxuICAgICAgICAgICAgc3RhdGUoXCJmYWxzZVwiLCBzdHlsZSh7IHdpZHRoOiAnMHB4JywgcGFkZGluZzogJzAnIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oXCIqID0+ICpcIiwgYW5pbWF0ZShcIjIwMG1zXCIpKSxcbiAgICAgICAgXSksXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVJbkJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwdWJsaWMgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBzbGlkZS1wYW5lbC0keysrU2xpZGVJbkJhckNvbXBvbmVudC5uZXh0SWR9YDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG9wZW5JY29uID0gXCJmYXMgZmEtY2hldnJvbi1yaWdodFwiO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xvc2VJY29uID0gXCJmYXMgZmEtY2hldnJvbi1sZWZ0XCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjYWNoZSA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3JlYXRlT3BlbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbm9PdmVybGFwID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFuZWxPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGlzU2xpZGVPdmVyID0gZmFsc2U7XG4gICAgcHVibGljIGlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgcHVibGljIGlzQ29udGVudEFuaW1hdGlvbkRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxuICAgIHB1YmxpYyBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2hlY2tPdmVyQmVoYXZpb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzbGlkZVBhbmVsU2VydmljZTogU2xpZGVJbkJhclNlcnZpY2VcbiAgICApIHsgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jaGVja092ZXJCZWhhdmlvcigpO1xuICAgICAgICB0aGlzLnNsaWRlUGFuZWxTZXJ2aWNlLmNyZWF0ZVNsaWRlUGFuZWwodGhpcy5pZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNyZWF0ZU9wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gdG8gZXhlY3V0ZWQgYXQgYSBzYWZlIHRpbWUgcHJpb3IgdG8gY29udHJvbCByZXR1cm5pbmcgdG8gdGhlIGJyb3dzZXIncyBldmVudCBsb29wXG4gICAgICAgIC8vIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMuX2NhbGN1bGF0ZVNsaWRlSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICB0aGlzLmlzQ29udGVudEFuaW1hdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2xpY2tCdXR0b24oKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuZWQuZW1pdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db250ZW50QW5pbWF0aW9uU3RhcnQoKSB7XG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbnRlbnRBbmltYXRpb25Eb25lKCkge1xuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tPdmVyQmVoYXZpb3IoKSB7XG4gICAgICAgIHRoaXMuaXNTbGlkZU92ZXIgPSB3aW5kb3cuaW5uZXJXaWR0aCA8PSBTTUFMTF9ERVZJQ0VfQlJFQUtQT0lOVDtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2xpZGUtaW4tYmFyXCI+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNsaWRlLWNvbnRlbnRcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnc2xpZGUtY29udGVudC0tY2xvc2VkJzogIWlzT3BlbixcbiAgICAgICAgICAgICdzbGlkZS1jb250ZW50LS1vdmVyJzogaXNTbGlkZU92ZXIsXG4gICAgICAgICAgICAnc2xpZGUtY29udGVudC0tbm8tb3ZlcmxhcCc6IG5vT3ZlcmxhcCxcbiAgICAgICAgfVwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjbWFpbkNvbnRhaW5lclxuICAgICAgICAgICAgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoY2FjaGUpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbQGNhY2hlQW5pbWF0aW9uXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtALmRpc2FibGVkXT1cImlzQ29udGVudEFuaW1hdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKEBjYWNoZUFuaW1hdGlvbi5zdGFydCk9XCJvbkNvbnRlbnRBbmltYXRpb25TdGFydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKEBjYWNoZUFuaW1hdGlvbi5kb25lKT1cIm9uQ29udGVudEFuaW1hdGlvbkRvbmUoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNsaWRlQ29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnQtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWNoZWxlc3NBbmltYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtALmRpc2FibGVkXT1cImlzQ29udGVudEFuaW1hdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChAY2FjaGVsZXNzQW5pbWF0aW9uLnN0YXJ0KT1cIm9uQ29udGVudEFuaW1hdGlvblN0YXJ0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKEBjYWNoZWxlc3NBbmltYXRpb24uZG9uZSk9XCJvbkNvbnRlbnRBbmltYXRpb25Eb25lKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNsaWRlQ29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlzT3BlbiA/IGNsb3NlSWNvbiA6IG9wZW5JY29uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrQnV0dG9uKClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInNpZGUtY29udGVudFwiXG4gICAgPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2lkZS1jb250ZW50XVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3NsaWRlQ29udGVudFRlbXBsYXRlPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbGlkZS1jb250ZW50XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|